Files
geant4/source/externals/ptl/cmake/Modules/PTLCMakeUtilities.cmake
2022-07-01 10:44:02 +02:00

123 lines
4.3 KiB
CMake

# PTLCMakeUtilities - useful macros and functions for generic tasks
#
# CMake Extensions
# ----------------
# * Include guard
include_guard(DIRECTORY)
include(CMakeParseArguments)
# -------------------------------------------------------------------------------------- #
# function ptl_message_on_change(<VAR> <MESSAGE>) Watch <VAR> and print <MESSAGE> and
# <VAR>'s value when the value changes
#
function(ptl_message_on_change _var _prefix)
set(_ptl_watch_var_name PTL_WATCH_VALUE_${_var})
if(DEFINED ${_ptl_watch_var_name})
if("${${_var}}" STREQUAL "${${_ptl_watch_var_name}}")
return()
endif()
endif()
set(${_ptl_watch_var_name}
"${${_var}}"
CACHE INTERNAL "Last value of ${_var}" FORCE)
message(STATUS "${_prefix} - ${${_var}}")
endfunction()
# -------------------------------------------------------------------------------------- #
# function ptl_add_feature(<NAME> <DOCSTRING>) Store activation of a feature and a
# docstring describing it. <NAME> should be a variable whose value indicates activation of
# the feature
#
function(ptl_add_feature _var _description)
if(${_var})
set_property(GLOBAL APPEND PROPERTY PTL_ENABLED_FEATURES ${_var})
endif()
set_property(GLOBAL PROPERTY PTL_FEATURE_${_var}_DESCRIPTION "${_description}")
endfunction()
# -----------------------------------------------------------------------
# function ptl_print_features() Print enabled features plus their docstrings.
#
function(ptl_print_features)
set(_currentFeatureText "The following PTL features are enabled:")
get_property(_enabledFeatures GLOBAL PROPERTY PTL_ENABLED_FEATURES)
foreach(_feature ${_enabledFeatures})
set(_currentFeatureText "${_currentFeatureText}\n - ${_feature}")
get_property(_desc GLOBAL PROPERTY PTL_FEATURE_${_feature}_DESCRIPTION)
if(_desc)
set(_currentFeatureText "${_currentFeatureText}: ${_desc}")
set(_desc NOTFOUND)
endif()
endforeach()
message(STATUS "${_currentFeatureText}\n")
endfunction()
# -------------------------------------------------------------------------------------- #
# function ptl_add_option(<OPTION_NAME> <DOCSTRING> <DEFAULT_SETTING>) Add an option for
# master project only, always reporting its value
#
function(ptl_add_option _NAME _MESSAGE _DEFAULT)
if(PTL_MASTER_PROJECT)
option(${_NAME} "${_MESSAGE}" ${_DEFAULT})
ptl_add_feature(${_NAME} "${_MESSAGE}")
endif()
# Always on configure time reporting
ptl_message_on_change(${_NAME} "Building PTL with option ${_NAME}")
endfunction()
# ----------------------------------------------------------------------------
# function ptl_build_library Encapsulates common build/install for main PTL shared/static
# libs
#
function(ptl_build_library)
cmake_parse_arguments(LIB "" "TYPE;TARGET_NAME;OUTPUT_NAME" "SOURCES;EXTRA_ARGS"
${ARGN})
if(NOT LIB_OUTPUT_NAME)
set(LIB_OUTPUT_NAME ${LIB_TARGET_NAME})
endif()
add_library(${LIB_TARGET_NAME} ${LIB_TYPE} ${PTL_EXCLUDE_FROM_ALL})
add_library(${PROJECT_NAME}::${LIB_TARGET_NAME} ALIAS ${LIB_TARGET_NAME})
target_sources(${LIB_TARGET_NAME} PRIVATE ${LIB_SOURCES})
target_compile_definitions(${LIB_TARGET_NAME} PRIVATE $<$<CONFIG:Debug>:DEBUG>)
target_compile_features(${LIB_TARGET_NAME} PUBLIC cxx_std_${CMAKE_CXX_STANDARD})
# Subproject overrides only if not a master project
if(NOT PTL_MASTER_PROJECT)
target_compile_options(
${LIB_TARGET_NAME}
PRIVATE $<$<COMPILE_LANGUAGE:C>:${${PROJECT_NAME}_C_FLAGS}>
$<$<COMPILE_LANGUAGE:CXX>:${${PROJECT_NAME}_CXX_FLAGS}>)
endif()
set_target_properties(
${LIB_TARGET_NAME}
PROPERTIES OUTPUT_NAME ${LIB_OUTPUT_NAME}
VERSION ${${PROJECT_NAME}_VERSION}
SOVERSION ${${PROJECT_NAME}_VERSION_MAJOR}
WINDOWS_EXPORT_ALL_SYMBOLS ON)
# Install the targets and export libraries
if(NOT "${LIB_TYPE}" STREQUAL "OBJECT")
install(
TARGETS ${LIB_TARGET_NAME}
EXPORT ${PROJECT_NAME}Targets
COMPONENT Development
ARCHIVE DESTINATION ${PTL_INSTALL_LIBDIR}
LIBRARY DESTINATION ${PTL_INSTALL_LIBDIR}
RUNTIME DESTINATION ${PTL_INSTALL_BINDIR} OPTIONAL)
endif()
endfunction()