CMAKE_MINIMUM_REQUIRED(VERSION 3.19) FILE(STRINGS VERSION JFJOCH_VERSION) PROJECT(jfjoch VERSION 1.0.0 LANGUAGES C CXX) SET(CMAKE_POLICY_DEFAULT_CMP0077 NEW) SET(CMAKE_CXX_STANDARD 20) SET(CMAKE_CXX_STANDARD_REQUIRED True) SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wno-deprecated-enum-enum-conversion") SET(CMAKE_C_FLAGS_RELEASE "-O3") SET(JFJOCH_WRITER_ONLY OFF CACHE BOOL "Compile HDF5 writer only") SET(JFJOCH_INSTALL_DRIVER_SOURCE OFF CACHE BOOL "Install kernel driver source (ignored if building writer only; necessary for RPM building)") SET(JFJOCH_USE_CUDA ON CACHE BOOL "Compile Jungfraujoch with CUDA") SET(JFJOCH_VIEWER_BUILD OFF CACHE BOOL "Compile Jungfraujoch viewer") OPTION(SLS9 "Build with sls_detector_package v9.2.0" OFF) SET(BUILD_SHARED_LIBS OFF) SET(BUILD_TESTING OFF) SET(ZSTD_LEGACY_SUPPORT OFF) SET(ZSTD_MULTITHREAD_SUPPORT OFF) SET(ZSTD_BUILD_PROGRAMS OFF) SET(ZSTD_BUILD_SHARED OFF) SET(SLS_USE_RECEIVER OFF) SET(SLS_USE_RECEIVER_BINARIES OFF) SET(SLS_BUILD_SHARED_LIBRARIES OFF) SET(BUILD_FAST_INDEXER OFF) SET(BUILD_FAST_INDEXER_STATIC ON) SET(HDF5_ENABLE_SZIP_SUPPORT OFF) SET(HDF5_ENABLE_SZIP_ENCODING OFF) SET(HDF5_BUILD_EXAMPLES OFF) SET(HDF5_BUILD_CPP_LIB OFF) SET(HDF5_ENABLE_Z_LIB_SUPPORT OFF) SET(HDF5_EXTERNALLY_CONFIGURED 1) # TIFF SET(jbig OFF) SET(zstd OFF) SET(lzma OFF) SET(jpeg OFF) SET(old-jpeg OFF) # PNG set(PNG_SHARED OFF) set(PNG_STATIC ON) set(PNG_EXECUTABLES OFF) set(PNG_TESTS OFF) INCLUDE(CheckLanguage) INCLUDE(CheckIncludeFile) CHECK_LANGUAGE(CUDA) SET(CMAKE_CUDA_ARCHITECTURES 75 80 86 89) # T4, A100, RTX A4000, L4 SET(CMAKE_CUDA_STANDARD 17) SET(CMAKE_CUDA_FLAGS_RELEASE "-O3") SET(JFJOCH_CUDA_AVAILABLE OFF) IF (CMAKE_CUDA_COMPILER) IF (JFJOCH_USE_CUDA) ENABLE_LANGUAGE(CUDA) FIND_PACKAGE(CUDAToolkit REQUIRED) SET(CMAKE_CUDA_RUNTIME_LIBRARY Static) MESSAGE(STATUS "CUDA VERSION: ${CMAKE_CUDA_COMPILER_VERSION}") ADD_COMPILE_DEFINITIONS(JFJOCH_USE_CUDA) FIND_LIBRARY(CUDART_LIBRARY cudart_static PATHS ${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES} REQUIRED) SET(JFJOCH_CUDA_AVAILABLE ON) ELSE() MESSAGE(WARNING "CUDA Available, but disabled by user") ENDIF() ENDIF() FIND_LIBRARY(FFTWF_LIBRARY NAMES libfftw3f.a libfftw3f.so fftw3f DOC "FFTW single-precision library" PATHS /usr/lib /usr/lib64 /usr/lib/x86_64-linux-gnu/) CHECK_INCLUDE_FILE(fftw3.h HAS_FFTW3_H) IF(HAS_FFTW3_H AND FFTWF_LIBRARY) ADD_COMPILE_DEFINITIONS(JFJOCH_USE_FFTW) ENDIF() INCLUDE_DIRECTORIES(include) INCLUDE(CheckIncludeFile) FIND_LIBRARY(NUMA_LIBRARY NAMES numa DOC "NUMA Library") CHECK_INCLUDE_FILE(numaif.h HAS_NUMAIF) CHECK_INCLUDE_FILE(numa.h HAS_NUMA_H) include(FetchContent) FetchContent_Declare(tiff GIT_REPOSITORY https://github.com/fleon-psi/libtiff GIT_TAG v4.6.0 EXCLUDE_FROM_ALL) FetchContent_Declare( png GIT_REPOSITORY https://github.com/pnggroup/libpng GIT_TAG v1.6.49 EXCLUDE_FROM_ALL ) FetchContent_Declare(hdf5 GIT_REPOSITORY https://github.com/HDFGroup/hdf5/ GIT_TAG hdf5_1.14.5 GIT_SHALLOW 1 EXCLUDE_FROM_ALL) SET(PISTACHE_USE_CONTENT_ENCODING_DEFLATE ON) SET(PISTACHE_BUILD_TESTS OFF) SET(PISTACHE_USE_SSL ON) FetchContent_Declare( pistache_http GIT_REPOSITORY https://github.com/fleon-psi/pistache GIT_TAG 280b0f6f28f81745870bccb31f4a3a59958807f6 EXCLUDE_FROM_ALL ) FetchContent_Declare( zstd GIT_REPOSITORY https://github.com/facebook/zstd GIT_TAG 794ea1b0afca0f020f4e57b6732332231fb23c70 SOURCE_SUBDIR build/cmake EXCLUDE_FROM_ALL ) SET(SLS_DETECTOR_GIT_TAG "8.0.2") IF(SLS9) SET(SLS_DETECTOR_GIT_TAG "9.2.0") ENDIF() FetchContent_Declare( sls_detector_package GIT_REPOSITORY https://github.com/slsdetectorgroup/slsDetectorPackage GIT_TAG ${SLS_DETECTOR_GIT_TAG} ) FetchContent_Declare( catch2 GIT_REPOSITORY https://github.com/catchorg/Catch2 GIT_TAG 4e8d92b EXCLUDE_FROM_ALL ) FetchContent_MakeAvailable(pistache_http zstd sls_detector_package catch2 hdf5 tiff png) ADD_SUBDIRECTORY(jungfrau) ADD_SUBDIRECTORY(compression) ADD_SUBDIRECTORY(common) ADD_SUBDIRECTORY(writer) ADD_SUBDIRECTORY(frame_serialize) ADD_SUBDIRECTORY(reader) ADD_SUBDIRECTORY(detector_control) ADD_SUBDIRECTORY(image_puller) ADD_SUBDIRECTORY(preview) ADD_SUBDIRECTORY(symmetry) IF (JFJOCH_WRITER_ONLY) MESSAGE(STATUS "Compiling HDF5 writer only") ELSE() ADD_SUBDIRECTORY(image_pusher) ADD_SUBDIRECTORY(broker) ADD_SUBDIRECTORY(fpga) ADD_SUBDIRECTORY(acquisition_device) ADD_SUBDIRECTORY(receiver) ADD_SUBDIRECTORY(image_analysis) ADD_SUBDIRECTORY(tests) ADD_SUBDIRECTORY(tools) ENDIF() IF (JFJOCH_VIEWER_BUILD) ADD_SUBDIRECTORY(viewer) ENDIF() IF (NOT JFJOCH_WRITER_ONLY) ADD_CUSTOM_COMMAND(OUTPUT frontend/dist/index.html COMMAND npm install COMMAND npm run build COMMAND npm run redocly WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/frontend) ADD_CUSTOM_TARGET(frontend DEPENDS frontend/dist/index.html) ADD_CUSTOM_TARGET(update_version COMMAND bash update_version.sh WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) IF (JFJOCH_INSTALL_DRIVER_SOURCE) INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/fpga/pcie_driver/ DESTINATION /usr/src/jfjoch-${JFJOCH_VERSION} COMPONENT driver-dkms FILES_MATCHING PATTERN "dkms.conf") INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/fpga/pcie_driver/ DESTINATION /usr/src/jfjoch-${JFJOCH_VERSION}/src COMPONENT driver-dkms FILES_MATCHING PATTERN "*.c" PATTERN "*.h" PATTERN "Makefile") ENDIF() FILE(MAKE_DIRECTORY ${CMAKE_SOURCE_DIR}/frontend/dist/) INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/frontend/dist/ DESTINATION share/jfjoch/frontend COMPONENT jfjoch ) ENDIF() IF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) 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() # 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() # Common metadata set(CPACK_PACKAGE_CONTACT "Filip Leonarski ") set(CPACK_PACKAGE_VENDOR "Paul Scherrer Institut") set(CPACK_PACKAGE_VERSION ${JFJOCH_VERSION}) # 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 broker) 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() INCLUDE(CPack)