From 331948b95a1f3e9f900dd366d314d473e430cc72 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Tue, 16 Sep 2025 20:21:47 +0200 Subject: [PATCH] CMake: Build both .deb and .rpm packages (depending on host OS) --- CMakeLists.txt | 119 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 85 insertions(+), 34 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 79012ce8..7f05f59c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -198,48 +198,99 @@ IF (NOT JFJOCH_WRITER_ONLY) ENDIF() IF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - SET(CMAKE_INSTALL_PREFIX /opt/jfjoch CACHE PATH "Default directory" FORCE) + SET(CMAKE_INSTALL_PREFIX /opt/jfjoch CACHE PATH "Default directory" FORCE) ENDIF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) # Set Package Name # Initialize CPACK_COMPONENTS_ALL with common components -SET(CPACK_COMPONENTS_ALL jfjoch writer) -IF (SLS9) - SET(CPACK_PACKAGE_NAME "jfjoch-slsdet9") -ELSE() - SET(CPACK_PACKAGE_NAME "jfjoch") -ENDIF() -SET(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION /usr/src /usr/share /usr/share/dbus-1 /usr/share/dbus-1/services) +set(CPACK_COMPONENTS_ALL jfjoch writer) +if (SLS9) + set(CPACK_PACKAGE_NAME "jfjoch-slsdet9") +else() + set(CPACK_PACKAGE_NAME "jfjoch") +endif() -IF (JFJOCH_INSTALL_DRIVER_SOURCE) - LIST(APPEND CPACK_COMPONENTS_ALL driver-dkms) - SET(CPACK_RPM_DRIVER-DKMS_PACKAGE_REQUIRES "dkms, gcc, bash, sed") - SET(CPACK_RPM_DRIVER-DKMS_PACKAGE_ARCHITECTURE "noarch") - SET(CPACK_RPM_DRIVER-DKMS_POST_INSTALL_SCRIPT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/fpga/pcie_driver/postinstall.sh) - SET(CPACK_RPM_DRIVER-DKMS_PRE_UNINSTALL_SCRIPT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/fpga/pcie_driver/preuninstall.sh) -ELSE() - SET(CPACK_COMPONENTS_ALL jfjoch writer) -ENDIF() +# Add optional components +if (JFJOCH_INSTALL_DRIVER_SOURCE) + list(APPEND CPACK_COMPONENTS_ALL driver-dkms) +else() + set(CPACK_COMPONENTS_ALL jfjoch writer) +endif() -IF (JFJOCH_VIEWER_BUILD) - LIST(APPEND CPACK_COMPONENTS_ALL viewer) -ENDIF() +if (JFJOCH_VIEWER_BUILD) + list(APPEND CPACK_COMPONENTS_ALL viewer) +endif() -SET(CPACK_GENERATOR RPM) -SET(CPACK_RPM_COMPONENT_INSTALL ON) -SET(CPACK_RPM_MAIN_COMPONENT jfjoch) -SET(CPACK_RPM_PACKAGE_RELEASE_DIST ON) -SET(CPACK_RPM_FILE_NAME "RPM-DEFAULT") -SET(CPACK_RPM_PACKAGE_VERSION ${JFJOCH_VERSION}) -SET(CPACK_RPM_PACKAGE_RELEASE 1) -SET(CPACK_RPM_PACKAGE_SUMMARY "Jungfraujoch data acquisition system") -SET(CPACK_RPM_PACKAGE_DESCRIPTION "Jungfraujoch") +# Common metadata +set(CPACK_PACKAGE_CONTACT "Filip Leonarski ") +set(CPACK_PACKAGE_VENDOR "Paul Scherrer Institut") +set(CPACK_PACKAGE_VERSION ${JFJOCH_VERSION}) -SET(CPACK_PACKAGE_CONTACT "Filip Leonarski ") -# Set The Vendor Name -SET(CPACK_PACKAGE_VENDOR "Paul Scherrer Institut") +# OS-aware packaging: DEB on Debian/Ubuntu, RPM on RHEL/Rocky +if (EXISTS "/etc/debian_version") + set(CPACK_PACKAGE_LICENSE "GPL-3.0-only") + set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE") + + # Debian/Ubuntu: .deb with components + set(CPACK_GENERATOR "DEB") + set(CPACK_DEB_COMPONENT_INSTALL ON) + set(CPACK_DEBIAN_MAIN_COMPONENT jfjoch) + set(CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT") + + # Enable automatic shlib dependency discovery + set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) + + # Optional DEB metadata (tune as needed) + set(CPACK_DEBIAN_PACKAGE_SECTION "science") + # set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://example.org/jfjoch") + + # DKMS component (maps from RPM settings) + if (JFJOCH_INSTALL_DRIVER_SOURCE) + # Dependencies and arch for the DKMS component + # Note: component name "driver-dkms" maps to variable suffix "DRIVER_DKMS" + set(CPACK_DEBIAN_DRIVER_DKMS_PACKAGE_DEPENDS "dkms, gcc, bash, sed") + set(CPACK_DEBIAN_DRIVER_DKMS_PACKAGE_ARCHITECTURE "all") + + # Provide Debian control scripts (postinst/prerm). + # We rename existing scripts to Debian control names at configure time. + set(_dkms_ctrl_dir "${CMAKE_CURRENT_BINARY_DIR}/cpack-debian-driver-dkms") + file(MAKE_DIRECTORY "${_dkms_ctrl_dir}") + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/fpga/pcie_driver/postinstall.sh + ${_dkms_ctrl_dir}/postinst COPYONLY) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/fpga/pcie_driver/preuninstall.sh + ${_dkms_ctrl_dir}/prerm COPYONLY) + set(CPACK_DEBIAN_DRIVER_DKMS_PACKAGE_CONTROL_EXTRA + "${_dkms_ctrl_dir}/postinst;${_dkms_ctrl_dir}/prerm") + endif() + +elseif (EXISTS "/etc/redhat-release") + # RHEL/Rocky: .rpm with components (original behavior) + set(CPACK_GENERATOR "RPM") + set(CPACK_RPM_COMPONENT_INSTALL ON) + set(CPACK_RPM_MAIN_COMPONENT jfjoch) + set(CPACK_RPM_PACKAGE_RELEASE_DIST ON) + set(CPACK_RPM_FILE_NAME "RPM-DEFAULT") + set(CPACK_RPM_PACKAGE_VERSION ${JFJOCH_VERSION}) + set(CPACK_RPM_PACKAGE_RELEASE 1) + set(CPACK_RPM_PACKAGE_SUMMARY "Jungfraujoch data acquisition system") + set(CPACK_RPM_PACKAGE_DESCRIPTION "Jungfraujoch") + set(CPACK_RPM_PACKAGE_LICENSE "GPLv3") + set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION + /usr/src /usr/share /usr/share/dbus-1 /usr/share/dbus-1/services) + + # DKMS component scripts and requirements for RPM + if (JFJOCH_INSTALL_DRIVER_SOURCE) + set(CPACK_RPM_DRIVER-DKMS_PACKAGE_REQUIRES "dkms, gcc, bash, sed") + set(CPACK_RPM_DRIVER-DKMS_PACKAGE_ARCHITECTURE "noarch") + set(CPACK_RPM_DRIVER-DKMS_POST_INSTALL_SCRIPT_FILE + ${CMAKE_CURRENT_SOURCE_DIR}/fpga/pcie_driver/postinstall.sh) + set(CPACK_RPM_DRIVER-DKMS_PRE_UNINSTALL_SCRIPT_FILE + ${CMAKE_CURRENT_SOURCE_DIR}/fpga/pcie_driver/preuninstall.sh) + endif() +else() + # Fallback if OS is unknown + set(CPACK_GENERATOR "TGZ") +endif() -# Set The License Information -SET(CPACK_RPM_PACKAGE_LICENSE "GPLv3") INCLUDE(CPack)