# PTLCMakeUtilities - useful macros and functions for generic tasks # # CMake Extensions # ---------------- # * Include guard include_guard(DIRECTORY) include(CMakeParseArguments) # -------------------------------------------------------------------------------------- # # function ptl_message_on_change( ) Watch and print and # '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( ) Store activation of a feature and a # docstring describing it. 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( ) 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 $<$: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 $<$:${${PROJECT_NAME}_C_FLAGS}> $<$:${${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()