# - musrfit cmake_minimum_required(VERSION 3.17) project(musrfit VERSION 1.8.2 LANGUAGES C CXX) #--- musrfit specific options ------------------------------------------------- option(nexus "build optional NeXus support. Needed for ISIS" OFF) option(ASlibs "build optional ASlibs" OFF) option(BMWlibs "build optional BMWlibs" OFF) option(BNMRlibs "build optional beta-NMR libs" OFF) option(DummyUserFcn "build optional dummy user function" OFF) option(qt_based_tools "try to install Qt based tools (musredit, musrWiz, musrStep, mupp)" ON) option(try_OpenMP "try to use OpenMP if available" ON) # define qt_version with possible values 'auto' or version '3', '4', '5', '6' set(qt_version AUTO CACHE STRING "provide a specific Qt version to be used.") set_property(CACHE qt_version PROPERTY STRINGS AUTO 3 4 5 6) #--- set a default build type if none was specified --------------------------- set(default_build_type "Release") if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) message(STATUS "Setting build type to '${default_build_type}' as none was specified.") set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING "Choose the type of build." FORCE) # Set the possible values of build type for cmake-gui set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") endif () #--- perform some checks and generate the config.h ---------------------------- #--- the next two lines are needed that the math functions are found ---------- set(CMAKE_REQUIRED_INCLUDES math.h) set(CMAKE_REQUIRED_LIBRARIES m) include(CheckTypeSize) include(CheckIncludeFiles) include(CheckFunctionExists) check_include_files(alloca.h HAVE_ALLOCA_H) check_include_files("sys/ipc.h;sys/shm.h" HAVE_SHMGET) check_include_files(dlfcn.h HAVE_DLFCN_H) check_function_exists(erf HAVE_ERF) check_function_exists(getloadavg HAVE_GETLOADAVG) check_include_files(inttypes.h HAVE_INTTYPES_H) check_include_files(memory.h HAVE_MEMORY_H) check_function_exists(powl HAVE_POWL) check_include_files(memory.h HAVE_MEMORY_H) check_include_files(stdint.h HAVE_STDINT_H) check_include_files(stdlib.h HAVE_STDLIB_H) check_include_files(string.h HAVE_STRING_H) check_include_files(strings.h HAVE_STRINGS_H) check_include_files(sys/stat.h HAVE_SYS_STAT_H) check_include_files(sys/types.h HAVE_SYS_TYPES_H) check_include_files(sys/unistd.h HAVE_UNISTD_H) check_type_size("long double" LONG_DOUBLE) check_type_size("double" DOUBLE) if (${LONG_DOUBLE} GREATER ${DOUBLE}) set(HAVE_LONG_DOUBLE 1) set(HAVE_LONG_DOUBLE_WIDER 1) endif (${LONG_DOUBLE} GREATER ${DOUBLE}) #--- check for all the needed packages ---------------------------------------- #--- add path to my own find modules and other stuff set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) #--- check for pkg-config ----------------------------------------------------- find_package(PkgConfig REQUIRED) #--- check for git ------------------------------------------------------------ find_package(Git REQUIRED) #--- check for ROOT ----------------------------------------------------------- find_package(ROOT 6.18 REQUIRED COMPONENTS Gui MathMore Minuit2 XMLParser) if (ROOT_mathmore_FOUND) execute_process(COMMAND root-config --bindir OUTPUT_VARIABLE ROOT_BINDIR) string(STRIP ${ROOT_BINDIR} ROOT_BINDIR) execute_process(COMMAND root-config --version OUTPUT_VARIABLE ROOT_VERSION) string(STRIP ${ROOT_VERSION} ROOT_VERSION) message("-- Found ROOT: ${ROOT_BINDIR} (found version: ${ROOT_VERSION})") #---Define useful ROOT functions and macros (e.g. ROOT_GENERATE_DICTIONARY) include(${ROOT_USE_FILE}) endif (ROOT_mathmore_FOUND) #--- the next check is need to set a flag, since root 6.24 (minuit2) breaks #--- the backwards compatibility. --------------------------------------------- if (ROOT_VERSION VERSION_LESS "6.23") set(ROOT_GRTEQ_24 0) else () set(ROOT_GRTEQ_24 1) endif () set(ROOT_GRTEQ_24 ${ROOT_GRTEQ_24} CACHE INTERNAL "ROOT Version check") #--- check for boost ---------------------------------------------------------- find_package(Boost REQUIRED COMPONENTS system filesystem ) message(STATUS "Boost libs: ${Boost_LIBRARIES}") #--- check for gsl ------------------------------------------------------------ find_package(GSL REQUIRED) #--- check for fftw3 ---------------------------------------------------------- find_package(FFTW3 REQUIRED) #--- check for libxml2 -------------------------------------------------------- find_package(LibXml2 REQUIRED) #--- check for OpenMP --------------------------------------------------------- if (try_OpenMP AND NOT APPLE) find_package(OpenMP) if (OpenMP_FOUND) add_definitions(-DHAVE_GOMP) set(HAVE_GOMP 1 CACHE INTERNAL "Have GOMP") endif (OpenMP_FOUND) endif (try_OpenMP AND NOT APPLE) #--- check for Qt ------------------------------------------------------------- if (qt_based_tools) # check for any Qt, i.e. AUTO if (qt_version STREQUAL AUTO) # try Qt6 find_package(Qt6Core QUIET) if (Qt6Core_FOUND) find_package(Qt6Widgets CONFIG REQUIRED) find_package(Qt6Xml CONFIG REQUIRED) find_package(Qt6Network CONFIG REQUIRED) find_package(Qt6Svg CONFIG REQUIRED) find_package(Qt6PrintSupport CONFIG REQUIRED) endif (Qt6Core_FOUND) # try Qt5 if (NOT Qt6Core_FOUND) find_package(Qt5Core QUIET) if (Qt5Core_FOUND) find_package(Qt5Widgets CONFIG REQUIRED) find_package(Qt5Xml CONFIG REQUIRED) find_package(Qt5Network CONFIG REQUIRED) find_package(Qt5Svg CONFIG REQUIRED) find_package(Qt5PrintSupport CONFIG REQUIRED) endif (Qt5Core_FOUND) endif (NOT Qt6Core_FOUND) # if Qt6 and Qt5 is not found, try Qt4 if (NOT Qt6Core_FOUND AND NOT Qt5Core_FOUND) find_package(Qt4 COMPONENTS QtGui QtWebKit QtXml) endif (NOT Qt6Core_FOUND AND NOT Qt5Core_FOUND) # if Qt6, Qt5 and Qt4 is not found try Qt3. Hopefully you never reach this point if (NOT Qt6Core_FOUND AND NOT Qt5Core_FOUND AND Qt4_FOUND) find_package(Qt3) endif (NOT Qt6Core_FOUND AND NOT Qt5Core_FOUND AND Qt4_FOUND) endif (qt_version STREQUAL AUTO) # check specifically for Qt6 if (qt_version STREQUAL 6) find_package(Qt6Core) if (Qt6Core_FOUND) find_package(Qt6Widgets CONFIG REQUIRED) find_package(Qt6Xml CONFIG REQUIRED) find_package(Qt6Network CONFIG REQUIRED) find_package(Qt6Svg CONFIG REQUIRED) find_package(Qt6PrintSupport CONFIG REQUIRED) else (Qt6Core_FOUND) message(FATAL_ERROR "Couldn't find the specifically requested Qt6 version.") endif (Qt6Core_FOUND) endif (qt_version STREQUAL 6) # check specifically for Qt5 if (qt_version STREQUAL 5) find_package(Qt5Core) if (Qt5Core_FOUND) find_package(Qt5Widgets CONFIG REQUIRED) find_package(Qt5Xml CONFIG REQUIRED) find_package(Qt5Network CONFIG REQUIRED) find_package(Qt5Svg CONFIG REQUIRED) find_package(Qt5PrintSupport CONFIG REQUIRED) else (Qt5Core_FOUND) message(FATAL_ERROR "Couldn't find the specifically requested Qt5 version.") endif (Qt5Core_FOUND) endif (qt_version STREQUAL 5) # check specifically for Qt4 if (qt_version STREQUAL 4) find_package(Qt4 COMPONENTS QtGui QtWebKit QtXml) if (NOT Qt4_FOUND) message(FATAL_ERROR "Couldn't find the specifically requested Qt4 version.") endif (NOT Qt4_FOUND) endif (qt_version STREQUAL 4) # check specifically for Qt3 if (qt_version STREQUAL 3) find_package(Qt3) if (NOT QT_FOUND) message(FATAL_ERROR "Couldn't find the specifically requested Qt3 version.") endif (NOT QT_FOUND) endif (qt_version STREQUAL 3) endif (qt_based_tools) #--- if NeXus check also for HDF4, HDF5, and MXML ----------------------------- if (nexus) find_package(HDF5 COMPONENTS CXX REQUIRED ) find_package(HDF4 REQUIRED) find_package(NEXUS REQUIRED) add_definitions(-DPNEXUS_ENABLED) endif (nexus) #--- check for Cuba lib if BMWlibs are enabled -------------------------------- #//as35 probably always stick to the internal one ... #--- all checks done -> feed config.h ----------------------------------------- set(HAVE_CONFIG_H 1 CACHE INTERNAL "config.h is available") configure_file(${CMAKE_SOURCE_DIR}/cmake/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h) #--- check if project source is a git repo ------------------------------------ if (EXISTS "${CMAKE_SOURCE_DIR}/.git/HEAD") message(STATUS "is a git repo") set(IS_GIT_REPO 1) else () message(STATUS "is NOT a git repo") set(IS_GIT_REPO 0) endif () #--- propagate to the sub-directories ----------------------------------------- add_subdirectory(src) #--- write summary of the installation message("") message("|-----------------------------------------------------------------------|") message("| |") message("| Summary |") message("| |") message("|-----------------------------------------------------------------------|") message("") message(" System: ${CMAKE_HOST_SYSTEM_NAME} ${CMAKE_SYSTEM_PROCESSOR} - ${CMAKE_HOST_SYSTEM_VERSION}") message(" -------") message("") message(" Build Type: ${CMAKE_BUILD_TYPE}") message(" -----------") message("") message(" Requirements:") message(" -------------") message("") message(" FFTW3 found in ${FFTW3_INCLUDE}, Version: ${FFTW_VERSION}") message(" GSL found in ${GSL_INCLUDE_DIRS}, Version: ${GSL_VERSION}") message(" BOOST found in ${Boost_INCLUDE_DIRS}, Version: ${Boost_VERSION}") message(" LibXML2 found in ${LIBXML2_INCLUDE_DIR}, Version: ${LIBXML2_VERSION_STRING}") message(" ROOT found in ${ROOT_INCLUDE_DIRS}, Version: ${ROOT_VERSION}") if (OpenMP_FOUND) if (OpenMP_CXX_VERSION) message(" OpenMP found Version: ${OpenMP_CXX_VERSION}") else (OpenMP_CXX_VERSION) message(" OpenMP found") endif (OpenMP_CXX_VERSION) endif (OpenMP_FOUND) if (nexus) message("") message(" HDF4 found in ${HDF4_INCLUDE_DIRS}") message(" HDF5 found in ${HDF5_INCLUDE_DIRS}, Version: ${HDF5_VERSION}") message(" NeXus found in ${NEXUS_INCLUDE_DIR}, Version: ${NEXUS_VERSION_STRING}") endif (nexus) message("") if (qt_based_tools) if (Qt6Core_FOUND) message(" Qt found in ${Qt6Core_INCLUDE_DIRS}, Version: ${Qt6Core_VERSION}") else (Qt6Core_FOUND) if (Qt5Core_FOUND) message(" Qt found in ${Qt5Core_INCLUDE_DIRS}, Version: ${Qt5Core_VERSION}") else (Qt5Core_FOUND) if (Qt4_FOUND) message(" Qt found Version: ${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}.${QT_VERSION_PATCH}") else (Qt4_FOUND) if (QT_FOUND) message(" Qt found Version: ${QT_VERSION}") endif (QT_FOUND) endif (Qt4_FOUND) endif (Qt5Core_FOUND) endif (Qt6Core_FOUND) endif (qt_based_tools) message("") message(" Features:") message(" ---------") message("") message(" Supported muSR file formates:") message(" MusrRoot : yes") message(" ROOT (LEM) : yes") message(" MUD (triumf) : yes") message(" PSI-BIN : yes") message(" PSI-MDU : yes") message(" WKM (deprecated) : yes") if (nexus) message(" NeXus : yes") else (nexus) message(" NeXus : no") endif (nexus) message("") message(" External user-function libraries:") if (ASlibs) message(" ASlibs : yes") else (ASlibs) message(" ASlibs : no") endif (ASlibs) if (BMWlibs) message(" BMWlibs : yes") else (BMWlibs) message(" BMWlibs : no") endif (BMWlibs) if (BNMRlibs) message(" BNMRlibs : yes") else (BNMRlibs) message(" BNMRlibs : no") endif (BNMRlibs) if (DummyUserFcn) message(" PDummyUserFcn : yes") endif (DummyUserFcn) if (qt_based_tools) if (Qt6Core_FOUND) message("") message(" Qt6 based tools:") message(" musredit, musrStep, musrWiz, mupp : yes") elseif (Qt5Core_FOUND) message("") message(" Qt5 based tools:") message(" musredit, musrStep, musrWiz, mupp : yes") elseif (Qt4_FOUND) message("") message(" Qt4 based tools (deprecated):") message(" musredit : yes") else () message("") message(" Qt3 based tools (outdated):") message(" musrgui : yes") endif () if (NOT Qt6Core_FOUND AND NOT Qt5Core_FOUND AND NOT Qt4_FOUND AND NOT QT_FOUND) message("") message(" NO Qt based tools will be installed since Qt is not found or not installed on the system") endif (NOT Qt6Core_FOUND AND NOT Qt5Core_FOUND AND NOT Qt4_FOUND AND NOT QT_FOUND) else (qt_based_tools) message("") message(" Qt based tools (musredit, musrStep, musrWiz, mupp) have been disabled") endif (qt_based_tools) message("") message(" Installation directories:") message(" -------------------------") message("") message(" Programs : ${CMAKE_INSTALL_PREFIX}/bin") message(" XML configuration files : " $ENV{HOME} "/.musrfit") message(" Documentation : ${CMAKE_INSTALL_PREFIX}/share/doc/musrfit") message("") message("-------------------------------------------------------------------------") message("") #--- cpack specific info ...................................................... file(TO_NATIVE_PATH ${PROJECT_SOURCE_DIR} PROJECT_SOURCE_DIR_NATIVE) file(TO_NATIVE_PATH ${PROJECT_BINARY_DIR} PROJECT_BINARY_DIR_NATIVE) string(REPLACE "\\" "\\\\" PROJECT_SOURCE_DIR_NATIVE_D ${PROJECT_SOURCE_DIR_NATIVE}) string(REPLACE "\\" "\\\\" PROJECT_BINARY_DIR_NATIVE_D ${PROJECT_BINARY_DIR_NATIVE}) configure_file(${CMAKE_SOURCE_DIR}/cmake/CPackOptions.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/CPackOptions.cmake @ONLY) set (CPACK_PROJECT_CONFIG_FILE "${PROJECT_BINARY_DIR}/CPackOptions.cmake") #set (CPACK_GENERATOR TGZ) # not use ZIP on UNIX as problem with symlinks #set (CPACK_SOURCE_GENERATOR TGZ) # not use ZIP on UNIX as problem with symlinks if (UNIX) set (CPACK_GENERATOR ${CPACK_GENERATOR};RPM) endif () # Include of CPack must always be last include(CPack) #--- end ----------------------------------------------------------------------