Files
musrfit/src/classes/CMakeLists.txt
T
suter_a fe4aa98064 cmake: auto-detect MacPorts install layout for OpenMP, Qt6, and rpath
MacPorts nests libomp's headers/library under an extra 'libomp'
subdirectory and installs the Qt6 CMake package configs under
libexec/qt6 rather than lib/cmake, so find_package(OpenMP)/find_package(Qt6...)
did not see them without manually injecting OpenMP_ROOT/CMAKE_PREFIX_PATH
on the command line. Detect the MacPorts prefix (/opt/local) automatically,
same as already done for Homebrew, including in the install RPATH fallback.
2026-07-27 08:55:07 +02:00

307 lines
10 KiB
CMake

#--- build the PMusr, PUserFcnBase, and PRgeHandler libs ----------------------
#--- generate necessary dictionaries ------------------------------------------
set(MUSRFIT_INC ${CMAKE_SOURCE_DIR}/src/include)
# ROOT requires that the dictonary header files are found at configuration time.
# Hence, target_include_directories cannot be used here because, targets are
# setup only afterwards.
include_directories(${MUSRFIT_INC})
#--- note: FFTW3_INCLUDE is deliberately NOT added here. On a Homebrew or
#--- MacPorts based macOS it is /opt/homebrew/include or /opt/local/include,
#--- i.e. the complete 3rd party header tree,
#--- and a global include_directories() would put it in front of the headers of
#--- every target below. The dictionaries below get it via their OPTIONS, and
#--- everything else via the FFTW3::FFTW3 imported target. ---------------------
root_generate_dictionary(
PFourierCanvasDict
PFourierCanvas.h
OPTIONS
-I${MUSRFIT_INC}
-isystem ${FFTW3_INCLUDE}
-inlineInputHeader
LINKDEF ${MUSRFIT_INC}/PFourierCanvasLinkDef.h
MODULE PFourierCanvas
)
root_generate_dictionary(
PMsgBoxDict
PMsgBox.h
LINKDEF ${MUSRFIT_INC}/PMsgBoxLinkDef.h
OPTIONS
-isystem ${Boost_INCLUDE_DIRS} -isystem ${FFTW3_INCLUDE} -I${MUSRFIT_INC}
-inlineInputHeader
MODULE PMsgBox
)
root_generate_dictionary(
PMusrCanvasDict
PMusrCanvas.h
LINKDEF ${MUSRFIT_INC}/PMusrCanvasLinkDef.h
OPTIONS
-isystem ${Boost_INCLUDE_DIRS} -isystem ${FFTW3_INCLUDE} -I${MUSRFIT_INC}
-inlineInputHeader
MODULE PMusrCanvas
)
root_generate_dictionary(
PMusrT0Dict
PMusrT0.h
LINKDEF ${MUSRFIT_INC}/PMusrT0LinkDef.h
OPTIONS
-isystem ${Boost_INCLUDE_DIRS} -isystem ${FFTW3_INCLUDE} -I${MUSRFIT_INC}
-inlineInputHeader
MODULE PMusrT0
)
root_generate_dictionary(
PStartupHandlerDict
PStartupHandler.h
LINKDEF ${MUSRFIT_INC}/PStartupHandlerLinkDef.h
OPTIONS
-isystem ${FFTW3_INCLUDE} -I${MUSRFIT_INC}
-inlineInputHeader
MODULE PStartupHandler
)
root_generate_dictionary(
PUserFcnBaseDict
PUserFcnBase.h
LINKDEF ${MUSRFIT_INC}/PUserFcnBaseLinkDef.h
OPTIONS
-inlineInputHeader
-isystem ${FFTW3_INCLUDE} -I${MUSRFIT_INC}
MODULE PUserFcnBase
)
root_generate_dictionary(
PRgeHandlerDict
PRgeHandler.h
OPTIONS
-I${NONLOCAL_INC}
-I${MUSRFIT_INC}
-isystem ${FFTW3_INCLUDE}
-I${CMAKE_CURRENT_SOURCE_DIR}
-inlineInputHeader
LINKDEF ${MUSRFIT_INC}/PRgeHandlerLinkDef.h
MODULE PRgeHandler
)
#--- create pkg-config info ---------------------------------------------------
set(prefix "${CMAKE_INSTALL_PREFIX}")
set(exec_prefix "\$\{prefix\}")
set(libdir "\$\{exec_prefix\}/lib")
set(includedir "\$\{prefix\}/include")
set(MUSR_VERSION "1.8.0")
set(MUSR_LIBRARY_NAME "PMusr")
configure_file("PMusr.pc.in" "PMusr.pc" @ONLY)
set(USERFCN_LIBRARY_NAME "PUserFcnBase")
configure_file("PUserFcnBase.pc.in" "PUserFcnBase.pc" @ONLY)
set(PRGEHANDLER_LIBRARY_NAME "PRgeHandler")
configure_file("PRgeHandler.pc.in" "PRgeHandler.pc" @ONLY)
#--- lib creation -------------------------------------------------------------
add_library(PMusr SHARED
PFindRun.cpp
PFitter.cpp
PFitterFcn.cpp
PFitterFcnDKS.cpp
PFourier.cpp
PFourierCanvas.cpp
PFourierCanvasDict.cxx
PMusrCanvas.cpp
PMusrCanvasDict.cxx
PFunction.cpp
PFunctionHandler.cpp
PMsgBox.cpp
PMsgBoxDict.cxx
PMsr2Data.cpp
PMsrHandler.cpp
PStringUtils.cpp
PMusrCanvas.cpp
PMusrCanvasDict.cxx
PMusr.cpp
PMusrT0.cpp
PMusrT0Dict.cxx
PPrepFourier.cpp
PRunAsymmetry.cpp
PRunAsymmetryBNMR.cpp
PRunAsymmetryRRF.cpp
PRunBase.cpp
PRunDataHandler.cpp
PRunListCollection.cpp
PRunMuMinus.cpp
PRunNonMusr.cpp
PRunSingleHisto.cpp
PRunSingleHistoRRF.cpp
PStartupHandler.cpp
PStartupHandlerDict.cxx
PTheory.cpp
)
#--- make sure that the include directory is found ----------------------------
target_include_directories(
PMusr SYSTEM BEFORE PRIVATE
$<BUILD_INTERFACE:${DKS_INCLUDE_DIR}>
$<BUILD_INTERFACE:${HDF4_INCLUDE_DIRS}>
$<BUILD_INTERFACE:${HDF5_INCLUDE_DIRS}>
$<BUILD_INTERFACE:${MUSRFIT_INC}>
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/src/external/MusrRoot>
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/src/external/TLemRunHeader>
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/src/external/MuSR_software/Class_MuSR_PSI>
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/src/external/mud/src>
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/src/external/nexus>
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}>
PUBLIC
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
add_library(PUserFcnBase SHARED
PUserFcnBase.cpp
PUserFcnBaseDict.cxx
)
add_library(PRgeHandler SHARED
PRgeHandler.cpp
PRgeHandlerDict.cxx
)
#--- set target properties, e.g. version --------------------------------------
target_compile_options(PMusr BEFORE PRIVATE "-DHAVE_CONFIG_H")
set_target_properties(PMusr
PROPERTIES
VERSION ${MUSR_VERSION}
)
set_target_properties(PUserFcnBase
PROPERTIES
VERSION ${MUSR_VERSION}
)
set_target_properties(PRgeHandler
PROPERTIES
VERSION ${MUSR_VERSION}
)
#--- make sure that the include directory is found ----------------------------
target_include_directories(
PUserFcnBase BEFORE PRIVATE
$<BUILD_INTERFACE:${MUSRFIT_INC}>
PUBLIC
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
target_include_directories(
PRgeHandler BEFORE PRIVATE
$<BUILD_INTERFACE:${MUSRFIT_INC}>
PUBLIC
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
#--- add ROOT Version >= 6.24 compile options if needed -----------------------
if (ROOT_GRTEQ_24)
target_compile_options(PMusr BEFORE PRIVATE "-DROOT_GRTEQ_24")
endif(ROOT_GRTEQ_24)
#--- add DKS compiler flags if enabled ----------------------------------------
if (DKS_FOUND)
if (CUDA_FOUND)
set(DKS_CXX_FLAGS -DDKS_OPENCL -DDKS_CUDA -I${CUDA_INCLUDE_DIRS} -I${DKS_INCLUDE_DIR})
target_compile_options(PMusr PUBLIC ${DKS_CXX_FLAGS})
endif (CUDA_FOUND)
endif (DKS_FOUND)
#--- add library dependencies -------------------------------------------------
set(DependOnLibs ${ROOT_LIBRARIES})
#set(DependOnLibs ${DependOnLibs} ${FFTW3_LIBRARY})
set(DependOnLibs ${DependOnLibs} FFTW3::FFTW3)
set(DependOnLibs ${DependOnLibs} PUserFcnBase)
set(DependOnLibs ${DependOnLibs} mud)
set(DependOnLibs ${DependOnLibs} TMusrRunHeader)
set(DependOnLibs ${DependOnLibs} TLemRunHeader)
set(DependOnLibs ${DependOnLibs} Class_MuSR_PSI)
if (nexus)
set(DependOnLibs ${DependOnLibs} ${LIBNEXUS_LIBRARY})
set(DependOnLibs ${DependOnLibs} PNeXus)
set(DependOnLibs ${DependOnLibs} ${HDF5_LIBRARIES})
endif (nexus)
if (OpenMP_FOUND)
set(DependOnLibs ${DependOnLibs} OpenMP::OpenMP_CXX)
endif (OpenMP_FOUND)
if (DKS_FOUND)
if (APPLE)
set(DependOnLibs ${DependOnLibs} "-framework OpenCL")
endif (APPLE)
set(DependOnLibs ${DependOnLibs} "-L ${DKS_LIBRARY_DIR}")
set(DependOnLibs ${DependOnLibs} ${DKS_LIBRARY})
endif (DKS_FOUND)
target_link_libraries(PUserFcnBase PRIVATE ${ROOT_LIBRARIES})
target_link_libraries(PRgeHandler PRIVATE ${BOOST_LINK_LIBS} ${ROOT_LIBRARIES})
target_link_libraries(PMusr PRIVATE ${BOOST_LINK_LIBS} ${DependOnLibs})
#--- install PUserFcnBase solib -----------------------------------------------
install(TARGETS PUserFcnBase EXPORT musrfitTargets DESTINATION ${CMAKE_INSTALL_LIBDIR})
#--- install PRgeHandler solib -----------------------------------------------
install(TARGETS PRgeHandler EXPORT musrfitTargets DESTINATION ${CMAKE_INSTALL_LIBDIR})
#--- install PMusr solib ------------------------------------------------------
install(TARGETS PMusr EXPORT musrfitTargets DESTINATION ${CMAKE_INSTALL_LIBDIR})
#--- install root pcm's and rootmaps ------------------------------------------
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/libPFourierCanvas_rdict.pcm
${CMAKE_CURRENT_BINARY_DIR}/libPFourierCanvas.rootmap
${CMAKE_CURRENT_BINARY_DIR}/libPMsgBox_rdict.pcm
${CMAKE_CURRENT_BINARY_DIR}/libPMsgBox.rootmap
${CMAKE_CURRENT_BINARY_DIR}/libPMusrCanvas_rdict.pcm
${CMAKE_CURRENT_BINARY_DIR}/libPMusrCanvas.rootmap
${CMAKE_CURRENT_BINARY_DIR}/libPMusrT0_rdict.pcm
${CMAKE_CURRENT_BINARY_DIR}/libPMusrT0.rootmap
${CMAKE_CURRENT_BINARY_DIR}/libPRgeHandler_rdict.pcm
${CMAKE_CURRENT_BINARY_DIR}/libPRgeHandler.rootmap
${CMAKE_CURRENT_BINARY_DIR}/libPStartupHandler_rdict.pcm
${CMAKE_CURRENT_BINARY_DIR}/libPStartupHandler.rootmap
${CMAKE_CURRENT_BINARY_DIR}/libPUserFcnBase_rdict.pcm
${CMAKE_CURRENT_BINARY_DIR}/libPUserFcnBase.rootmap
DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
#--- install headers ----------------------------------------------------------
install(
FILES ${MUSRFIT_INC}/PFindRun.h
${MUSRFIT_INC}/PFitterFcn.h
${MUSRFIT_INC}/PFitter.h
${MUSRFIT_INC}/PFourierCanvas.h
${MUSRFIT_INC}/PFourier.h
${MUSRFIT_INC}/PFunctionAst.h
${MUSRFIT_INC}/PFunctionGrammar.h
${MUSRFIT_INC}/PFunction.h
${MUSRFIT_INC}/PFunctionHandler.h
${MUSRFIT_INC}/PMsgBox.h
${MUSRFIT_INC}/PMsr2Data.h
${MUSRFIT_INC}/PMsrHandler.h
${MUSRFIT_INC}/PMusrCanvas.h
${MUSRFIT_INC}/PMusr.h
${MUSRFIT_INC}/PMusrT0.h
${MUSRFIT_INC}/PPrepFourier.h
${MUSRFIT_INC}/PRgeHandler.h
${MUSRFIT_INC}/PRunAsymmetry.h
${MUSRFIT_INC}/PRunAsymmetryBNMR.h
${MUSRFIT_INC}/PRunAsymmetryRRF.h
${MUSRFIT_INC}/PRunBase.h
${MUSRFIT_INC}/PRunDataHandler.h
${MUSRFIT_INC}/PRunListCollection.h
${MUSRFIT_INC}/PRunMuMinus.h
${MUSRFIT_INC}/PRunNonMusr.h
${MUSRFIT_INC}/PRunSingleHisto.h
${MUSRFIT_INC}/PRunSingleHistoRRF.h
${MUSRFIT_INC}/PStartupHandler.h
${MUSRFIT_INC}/PStringUtils.h
${MUSRFIT_INC}/PTheory.h
${MUSRFIT_INC}/PUserFcnBase.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
#--- install pkg-config info --------------------------------------------------
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/PUserFcnBase.pc
${CMAKE_CURRENT_BINARY_DIR}/PRgeHandler.pc
${CMAKE_CURRENT_BINARY_DIR}/PMusr.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
)