# Always make sure EpicsVersion.Version-Release matches the git tag! %define EpicsVersion 7.0.10 Name: epics-base-%{EpicsVersion} Summary: EPICS Base %{EpicsVersion} Version: 1 Release: 1%{?dist} License: EPICS Open License Group: Development/Languages URL: https://git.psi.ch/epics_base/base-7.0 Obsoletes: caRepeater = 1 %define module_name %{name} %define prog_folder /usr/local/epics/base-%{EpicsVersion} %define debug_package %{nil} %define _build_id_links none # do not strip libraries %global __strip /bin/true %undefine __brp_strip %undefine __brp_mangle_shebangs %undefine __brp_ldconfig %define _binaries_in_noarch_packages_terminate_build 0 %if %{defined rhel} %global epics_host_arch RHEL%{rhel}-%{_host_cpu} %endif # else define epics_host_arch as suitable %description EPICS is a set of Open Source software tools, libraries and applications developed collaboratively and used worldwide to create distributed soft real-time control systems for scientific instruments such as a particle accelerators, telescopes and other large scientific experiments. This RPM is a binary-only package. ########################################### %package host-devel Requires: make >= 3.80 BuildRequires: make >= 3.80 Summary: Minimal stuff needed to build EPICS host apps Requires: %{name} = %{version}-%{release} # This EPICS installation uses the toolset 15 compiler %if 0%{?rhel} >= 8 Requires: gcc-toolset-15-gcc-c++ BuildRequires: gcc-toolset-15-gcc-c++ %endif # The perl stuff we need Requires: perl-interpreter >= 5.10.1 BuildRequires: perl-interpreter >= 5.10.1 Requires: perl-File-Path perl-Getopt-Long perl-Pod-Usage perl-Time-HiRes perl-Data-Dumper perl-Scalar-List-Utils BuildRequires: perl-File-Path perl-Getopt-Long perl-Pod-Usage perl-Time-HiRes perl-Data-Dumper perl-Scalar-List-Utils %if 0%{?rhel} >= 8 Requires: perl-Text-Tabs+Wrap BuildRequires: perl-Text-Tabs+Wrap %endif %if 0%{?rhel} >= 9 Requires: perl-File-Find perl-File-Basename perl-File-Copy perl-FindBin perl-Getopt-Std perl-POSIX BuildRequires: perl-File-Find perl-File-Basename perl-File-Copy perl-FindBin perl-Getopt-Std perl-POSIX %endif # Perl auto-detection is broken # It does not find all EPICS internal packages %global __requires_exclude_from ^%{prog_folder}/bin/.*\\.pl$ %description host-devel Contains headers etc to build EPICS host applications. ########################################### %if 0%{?rhel} > 8 %package compat Summary: EPICS base %{EpicsVersion} for older RHEL versions Requires: %{name} = %{version}-%{release} AutoReqProv: no %description compat Contains EPICS binaries that run on older RHEL versions. %endif ########################################### %package wine Summary: EPICS base %{EpicsVersion} for wine Requires: %{name} = %{version}-%{release} %if 0%{?rhel} >= 9 Requires: gfa-wine %else Requires: wine %endif %description wine Allows to run EPICS in wine. ########################################### %package boot Summary: EPICS base %{EpicsVersion} for boot servers BuildArch: noarch AutoReqProv: no Prefix: /usr/local/epics %description boot Contains files needed on NFS server to boot EPICS targets from. This package can be relocated. ########################################### %package devel Summary: EPICS base %{EpicsVersion} for development environments Requires: %{name} = %{version}-%{release} Requires: %{name}-host-devel = %{version}-%{release} Requires: gfa-cross-compiler-links BuildRequires: gfa-cross-compiler-links Requires: mingw64-gcc-c++ BuildRequires: mingw64-gcc-c++ BuildArch: noarch AutoReqProv: no # For Windows cross build with wine: BuildRequires: gfa-cross-compiler-links %if 0%{?rhel} >= 9 BuildRequires: gfa-wine Requires: gfa-wine %else BuildRequires: wine Requires: wine %endif # For some 32 bit cross compilers BuildRequires: /lib/libc.so.6 Requires: /lib/libc.so.6 %description devel All what is needed to develop EPICS for different target architectures. ########################################### %package devel-static Summary: EPICS base %{EpicsVersion} for development environments including static libraries Requires: %{name}-devel = %{version}-%{release} BuildArch: noarch AutoReqProv: no %description devel-static Contains the static libraries (*.a) for EPICS development systems. Only needed to build statically linked applications. ########################################### %package src Summary: Sources code of EPICS base %{EpicsVersion} BuildArch: noarch AutoReqProv: no Prefix: /usr/local/epics %description src The source code of EPICS base %{EpicsVersion}. May help when debugging ########################################### %package doc Summary: EPICS base %{EpicsVersion} documentation BuildArch: noarch AutoReqProv: no Prefix: /usr/local/epics %description doc The documentation of EPICS base %{EpicsVersion}. ########################################### # Our sources are locally in this directory # and here we also build # RPMS will be stored here, too %define _topdir %(pwd) %define _sourcedir %{_topdir} %define _builddir %{_topdir} %prep %{__rm} -rf %{buildroot}/usr/lib %{__rm} -f modules/RELEASE.*.local git submodule update --init --recursive modules %{__mkdir_p} RPMS %build %if %{defined epics_host_arch} export EPICS_HOST_ARCH=%{epics_host_arch} %endif %make_build -s INSTALL_LOCATION=%{buildroot}%{prog_folder} FINAL_LOCATION=%{prog_folder} \ TESTS= TESTPROD= TESTLIBRARY= TESTFILES= PROD_RTEMS=-nil- PROD_vxWorks=-nil- %{__make} INSTALL_LOCATION=%{buildroot}%{prog_folder} copysrc # remove files we do not need shopt -s extglob %{__rm} -f %{buildroot}%{prog_folder}/bin/{V,RTEMS}*/{*Harness,softIoc,softIocPVA} %{__rm} -f %{buildroot}%{prog_folder}/bin/RTEMS*/TEMP.* # fix permissions of caRepeater.service %{__chmod} 644 %{buildroot}%{prog_folder}/bin/*/caRepeater.service # install the profile script /bin/sed 's!\$EPICS_BASE!%{prog_folder}!' epics-base.sh > %{buildroot}%{prog_folder}/bin/epics-base.sh # copy over old libraries for compatibility %if 0%{?rhel} > 8 %{__cp} /opt/RHEL8/lib64/libreadline.so.7 %{buildroot}%{prog_folder}/lib/RHEL8-x86_64 %endif # Do not use install section because build already installed # and install will delete our buildroot! %clean %make_build INSTALL_LOCATION=%{buildroot}%{prog_folder} realclean %{__rm} -f modules/RELEASE.*.local %{__rm} -rf %{buildroot} %{__cp} %{_rpmdir}/*/%{name}*%{version}-%{release}.*.rpm %{_sourcedir} # Link caRepeater and profile script to highest installed EPICS version after install and uninstall %post shopt -s extglob %{__rm} -f /etc/profile.d/epics-base.sh %{__ln_s} "$(/usr/bin/ls -dvr1 /usr/local/epics/base-+([0-9]).+([0-9]).+([0-9])/bin/epics-base.sh | /usr/bin/head -n1)" /etc/profile.d/ SYSTEMD_DIR=$(pkg-config systemd --variable=systemdsystemunitdir) if [ -n "$SYSTEMD_DIR" ] then %{__rm} -f $SYSTEMD_DIR/caRepeater.service LATEST_REPEATER=$(/usr/bin/ls -dvr1 /usr/local/epics/base-+([0-9]).+([0-9]).+([0-9])/bin/%{epics_host_arch}/caRepeater.service | /usr/bin/head -n1) %{__ln_s} $LATEST_REPEATER $SYSTEMD_DIR/ systemctl daemon-reload systemctl reenable caRepeater.service systemctl start caRepeater.service fi %postun shopt -s extglob %{__rm} -f /etc/profile.d/epics-base.sh %{__ln_s} "$(/usr/bin/ls -dvr1 /usr/local/epics/base-+([0-9]).+([0-9]).+([0-9])/bin/epics-base.sh 2>/dev/null | /usr/bin/head -n1)" /etc/profile.d/ 2>/dev/null SYSTEMD_DIR=$(pkg-config systemd --variable=systemdsystemunitdir) if [ -n "$SYSTEMD_DIR" ] then LATEST_REPEATER=$(/usr/bin/ls -dvr1 /usr/local/epics/base-+([0-9]).+([0-9]).+([0-9])/bin/%{epics_host_arch}/caRepeater.service 2>/dev/null | /usr/bin/head -n1) if [ -z "$LATEST_REPEATER" ] then systemctl disable caRepeater.service # Do not stop or restart caRepeater.service # because EPICS clients cannot handle that. # Next reboot will take care of this. fi %{__rm} -f $SYSTEMD_DIR/caRepeater.service if [ -n "$LATEST_REPEATER" ] then %{__ln_s} $LATEST_REPEATER $SYSTEMD_DIR/ 2>/dev/null systemctl reenable caRepeater.service fi systemctl daemon-reload fi ########################################### %files %defattr(-,root,root,-) %dir %{prog_folder} %dir %{prog_folder}/configure %{prog_folder}/configure/CONFIG_BASE_VERSION %dir %{prog_folder}/dbd %{prog_folder}/dbd/softIoc*.dbd %dir %{prog_folder}/bin %dir %{prog_folder}/lib %{prog_folder}/db %{prog_folder}/bin/epics-base.sh %{prog_folder}/lib/perl/EpicsHostArch.pl %{prog_folder}/lib/perl/CA.pm %dir %{prog_folder}/lib/perl %dir %{prog_folder}/lib/perl/[0-9]* %dir %{prog_folder}/lib/perl/[0-9]*/*-linux-thread-multi %{prog_folder}/lib/perl/*/*-linux-thread-multi/libCap5.so # Install host binaries but avoid installing *.pl scripts # and other development tools %dir %{prog_folder}/bin/%{epics_host_arch}* %{prog_folder}/bin/%{epics_host_arch}*/[Scips]*[^.]?? %{prog_folder}/bin/%{epics_host_arch}*/p2p %{prog_folder}/bin/%{epics_host_arch}*/msi %dir %{prog_folder}/lib/%{epics_host_arch}* %{prog_folder}/lib/%{epics_host_arch}*/*.so* ########################################### %if 0%{?rhel} > 8 %files compat %dir %{prog_folder}/bin/RHEL8* %{prog_folder}/bin/RHEL8*/[Scips]*[^.]?? %{prog_folder}/bin/RHEL8*/p2p %{prog_folder}/bin/RHEL8*/msi %dir %{prog_folder}/lib/RHEL8* %{prog_folder}/lib/RHEL8*/*.so* %if 0%{?rhel} > 9 %dir %{prog_folder}/bin/RHEL9* %{prog_folder}/bin/RHEL9*/[Scips]*[^.]?? %{prog_folder}/bin/RHEL9*/p2p %{prog_folder}/bin/RHEL9*/msi %dir %{prog_folder}/lib/RHEL9* %{prog_folder}/lib/RHEL9*/*.so* %endif %endif ########################################### %files wine %{prog_folder}/bin/win* ########################################### %files boot # including files to build on some Linux cross archs # hence some configure/* and lib/perl/* listed twice %defattr(-,root,root,-) %dir %{prog_folder} %dir %{prog_folder}/configure %{prog_folder}/configure/RELEASE %{prog_folder}/configure/CONFIG* %{prog_folder}/configure/RULES* %dir %{prog_folder}/configure/os %{prog_folder}/configure/os/CONFIG.Common.UnixCommon %{prog_folder}/configure/os/CONFIG.Common.linuxCommon %{prog_folder}/configure/os/CONFIG.Common.linux-clang %{prog_folder}/configure/os/CONFIG.Common.linux-%{_host_cpu}* %{prog_folder}/configure/os/CONFIG.Common.[a-z]*-* %{prog_folder}/configure/os/CONFIG.UnixCommon.Common %{prog_folder}/configure/os/CONFIG.[a-z]*-*.Common %{prog_folder}/configure/os/CONFIG.[a-z]*-*.[a-z]*-* %{prog_folder}/configure/os/CONFIG.linux-*.Common %{prog_folder}/configure/os/CONFIG.linux-*.linux-* %{prog_folder}/configure/os/CONFIG_SITE.Common.linuxCommon %{prog_folder}/configure/os/CONFIG_SITE.Common.linux-* %{prog_folder}/configure/os/CONFIG_SITE.[a-z]*-*.Common %{prog_folder}/configure/os/CONFIG_SITE.linux-*.Common %{prog_folder}/configure/os/CONFIG_SITE.linux-*.UnixCommon %{prog_folder}/configure/os/CONFIG_SITE.linux-*.linux-* %dir %{prog_folder}/include %{prog_folder}/include/*.h %{prog_folder}/include/compiler %dir %{prog_folder}/include/os %{prog_folder}/include/os/Linux/ %{prog_folder}/include/pv/ %{prog_folder}/include/pva/ %{prog_folder}/include/valgrind/ %{prog_folder}/include/flex.skel.static %dir %{prog_folder}/dbd %{prog_folder}/dbd/softIoc*.dbd %{prog_folder}/db %dir %{prog_folder}/lib %dir %{prog_folder}/lib/[a-z]*-* %{prog_folder}/lib/[a-z]*-*/*.so* %dir %{prog_folder}/lib/perl %{prog_folder}/lib/perl/[A-Z]*/ %{prog_folder}/lib/perl/DBD.pm %dir %{prog_folder}/bin # avoid pulling in host files again # but get all cross architectures (mostly lower case) # including all Windows dlls (hence listed twice: here and in wine) %dir %{prog_folder}/bin/[a-z]* %{prog_folder}/bin/[a-z]*/[Scips]*[^.]?? %{prog_folder}/bin/[a-z]*/p2p %{prog_folder}/bin/[a-z]*/msi* %{prog_folder}/bin/[a-z]*/acctst* %{prog_folder}/bin/[a-z]*/*.dll %{prog_folder}/bin/[a-z]*/registerRecordDeviceDriver* # vxWorks and RTEMS %dir %{prog_folder}/bin/V* %{prog_folder}/bin/V*/*.munch %{prog_folder}/bin/V*/*.o %dir %{prog_folder}/bin/RTEMS* %{prog_folder}/bin/RTEMS*/*.boot ########################################### %files host-devel %defattr(-,root,root,-) %dir %{prog_folder}/include %{prog_folder}/include/*.h %{prog_folder}/include/compiler %dir %{prog_folder}/include/os %{prog_folder}/include/os/Linux/ %{prog_folder}/include/os/WIN32/ %{prog_folder}/include/pv/ %{prog_folder}/include/pva/ %{prog_folder}/include/valgrind/ %{prog_folder}/include/flex.skel.static %{prog_folder}/templates %dir %{prog_folder}/cfg %{prog_folder}/cfg/CONFIG* %{prog_folder}/cfg/TOOLCHAIN.%{epics_host_arch}*.%{epics_host_arch}* %{prog_folder}/cfg/TOOLCHAIN.%{epics_host_arch}*.win* %dir %{prog_folder}/configure %{prog_folder}/configure/RELEASE %{prog_folder}/configure/CONFIG* %{prog_folder}/configure/RULES* %dir %{prog_folder}/configure/os %{prog_folder}/configure/os/CONFIG.Common.UnixCommon %{prog_folder}/configure/os/CONFIG.Common.linuxCommon %{prog_folder}/configure/os/CONFIG.Common.linux-clang %{prog_folder}/configure/os/CONFIG.Common.linux-%{_host_cpu}* %{prog_folder}/configure/os/CONFIG.Common.%{epics_host_arch}* %{prog_folder}/configure/os/CONFIG.UnixCommon.Common %{prog_folder}/configure/os/CONFIG.%{epics_host_arch}*.Common %{prog_folder}/configure/os/CONFIG.%{epics_host_arch}*.%{epics_host_arch}* %{prog_folder}/configure/os/CONFIG.linux-%{__isa_name}*.Common %{prog_folder}/configure/os/CONFIG.linux-%{__isa_name}*.linux-%{__isa_name}* %{prog_folder}/configure/os/CONFIG.linux-%{__isa_name}*.win* %{prog_folder}/configure/os/CONFIG.Linux.win* %{prog_folder}/configure/os/CONFIG.win*.win* %{prog_folder}/configure/os/CONFIG_SITE.Common.linuxCommon %{prog_folder}/configure/os/CONFIG_SITE.Common.linux-%{__isa_name}* %{prog_folder}/configure/os/CONFIG_SITE.%{epics_host_arch}*.Common %{prog_folder}/configure/os/CONFIG_SITE.linux-%{__isa_name}*.Common %{prog_folder}/configure/os/CONFIG_SITE.linux-%{__isa_name}*.UnixCommon %{prog_folder}/configure/os/CONFIG_SITE.linux-%{__isa_name}*.linux-%{__isa_name}* %{prog_folder}/bin/%{epics_host_arch}*/[^Scips]*[^.]?? %{prog_folder}/bin/%{epics_host_arch}*/*.?? %dir %{prog_folder}/lib/pkgconfig %{prog_folder}/lib/pkgconfig/epics-base.pc %{prog_folder}/lib/pkgconfig/epics-base-%{epics_host_arch}*.pc %{prog_folder}/lib/perl/[A-Z]*/ %{prog_folder}/lib/perl/DBD.pm %{prog_folder}/dbd ########################################### %files devel %defattr(-,root,root,-) %{prog_folder}/include/os/vxWorks/ %{prog_folder}/include/os/RTEMS/ %exclude %{prog_folder}/cfg/TOOLCHAIN.%{epics_host_arch}*.%{epics_host_arch}* %exclude %{prog_folder}/cfg/TOOLCHAIN.%{epics_host_arch}*.win* %{prog_folder}/cfg/TOOLCHAIN.* %exclude %{prog_folder}/configure/os/CONFIG.Common.%{epics_host_arch}* %exclude %{prog_folder}/configure/os/CONFIG.Common.UnixCommon %exclude %{prog_folder}/configure/os/CONFIG.Common.linuxCommon %exclude %{prog_folder}/configure/os/CONFIG.Common.linux-clang %exclude %{prog_folder}/configure/os/CONFIG.Common.linux-%{_host_cpu}* %exclude %{prog_folder}/configure/os/CONFIG.UnixCommon.Common %exclude %{prog_folder}/configure/os/CONFIG.%{epics_host_arch}*.Common %exclude %{prog_folder}/configure/os/CONFIG.%{epics_host_arch}*.%{epics_host_arch}* %exclude %{prog_folder}/configure/os/CONFIG.linux-%{__isa_name}*.Common %exclude %{prog_folder}/configure/os/CONFIG.linux-%{__isa_name}*.linux-%{__isa_name}* %exclude %{prog_folder}/configure/os/CONFIG.linux-%{__isa_name}*.win* %exclude %{prog_folder}/configure/os/CONFIG.Linux.win* %exclude %{prog_folder}/configure/os/CONFIG.win*.win* %exclude %{prog_folder}/configure/os/CONFIG_SITE.Common.linuxCommon %exclude %{prog_folder}/configure/os/CONFIG_SITE.Common.linux-%{__isa_name}* %exclude %{prog_folder}/configure/os/CONFIG_SITE.%{epics_host_arch}*.Common %exclude %{prog_folder}/configure/os/CONFIG_SITE.linux-%{__isa_name}*.Common %exclude %{prog_folder}/configure/os/CONFIG_SITE.linux-%{__isa_name}*.UnixCommon %exclude %{prog_folder}/configure/os/CONFIG_SITE.linux-%{__isa_name}*.linux-%{__isa_name}* %{prog_folder}/configure/os/ %exclude %{prog_folder}/lib/pkgconfig/epics-base.pc %exclude %{prog_folder}/lib/pkgconfig/epics-base-%{epics_host_arch}*.pc %{prog_folder}/lib/pkgconfig/ %exclude %{prog_folder}/bin/%{epics_host_arch}*/[^Scips]*[^.]?? %exclude %{prog_folder}/bin/%{epics_host_arch}*/*.?? %exclude %{prog_folder}/bin/*/[^Scips]*[^.]?? %exclude %{prog_folder}/bin/*/*.?? # VxWorks and RTEMS need static libs %{prog_folder}/lib/V* %{prog_folder}/lib/RTEMS* # Windows needs *.lib %{prog_folder}/lib/win* # Basic libraries to build stand-alone clients %exclude %{prog_folder}/lib/pkgconfig %dir %{prog_folder}/lib/[a-z]* %{prog_folder}/lib/[a-z]*/libCom.so* %{prog_folder}/lib/[a-z]*/libca.so* ########################################### %files devel-static %defattr(-,root,root,-) # Install bulky static libs for Linux targets only on request %dir %{prog_folder}/lib/RHEL* %{prog_folder}/lib/RHEL*/*.a %dir %{prog_folder}/lib/[a-z]* %{prog_folder}/lib/[a-z]*/*.a ########################################### %files src %defattr(-,root,root,-) %dir %{prog_folder} %{prog_folder}/modules ########################################### %files doc %defattr(-,root,root,-) %dir %{prog_folder} %docdir %{prog_folder}/html %docdir %{prog_folder}/doc %{prog_folder}/html %{prog_folder}/doc