Import Geant4 10.7.0.beta source tree
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
################################################################################
|
||||
#
|
||||
# Handles the build settings
|
||||
#
|
||||
################################################################################
|
||||
#
|
||||
set(LIBNAME ptl)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
include(CheckCCompilerFlag)
|
||||
include(CheckCXXCompilerFlag)
|
||||
include(Compilers)
|
||||
include(MacroUtilities)
|
||||
|
||||
ptl_add_interface_library(ptl-compile-options)
|
||||
ptl_add_interface_library(ptl-external-libraries)
|
||||
|
||||
# ---------------------------------------------------------------------------- #
|
||||
#
|
||||
#set(SANITIZE_TYPE leak CACHE STRING "-fsantitize=<TYPE>")
|
||||
|
||||
# ---------------------------------------------------------------------------- #
|
||||
# if master project, set the output directory (critical on Windows and Xcode)
|
||||
#
|
||||
if("${CMAKE_PROJECT_NAME}" STREQUAL "${PROJECT_NAME}")
|
||||
set(_BIN_DIR ${PROJECT_BINARY_DIR})
|
||||
if(WIN32)
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${_BIN_DIR}/outputs/runtime)
|
||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${_BIN_DIR}/outputs/library)
|
||||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${_BIN_DIR}/outputs/archive)
|
||||
else()
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${_BIN_DIR})
|
||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${_BIN_DIR})
|
||||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${_BIN_DIR})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# ---------------------------------------------------------------------------- #
|
||||
# debug macro
|
||||
#
|
||||
string(TOUPPER "${CMAKE_BUILD_TYPE}" UC_BUILD_TYPE)
|
||||
if("${UC_BUILD_TYPE}" STREQUAL "DEBUG")
|
||||
target_compile_definitions(ptl-compile-options INTERFACE DEBUG)
|
||||
else()
|
||||
target_compile_definitions(ptl-compile-options INTERFACE NDEBUG)
|
||||
endif()
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
################################################################################
|
||||
#
|
||||
# Creates a 'format' target that runs clang-format
|
||||
#
|
||||
################################################################################
|
||||
|
||||
find_program(CLANG_FORMATTER
|
||||
NAMES
|
||||
clang-format-8.0
|
||||
clang-format-7.0
|
||||
clang-format-6.0
|
||||
clang-format)
|
||||
|
||||
if(CLANG_FORMATTER)
|
||||
set(_Source_DIR ${PROJECT_SOURCE_DIR})
|
||||
set(_Example_DIR ${PROJECT_SOURCE_DIR}/examples)
|
||||
|
||||
set(_Header_DIR ${_Source_DIR}/PTL)
|
||||
set(_Basic_DIR ${_Example_DIR}/basic)
|
||||
set(_Common_DIR ${_Example_DIR}/common)
|
||||
set(_Extended_DIR ${_Example_DIR}/extended/rotation)
|
||||
set(_Gpu_DIR ${_Example_DIR}/gpu)
|
||||
|
||||
file(GLOB headers
|
||||
${_Header_DIR}/*.hh ${_Header_DIR}/*.icc
|
||||
${_Basic_DIR}/*.hh ${_Common_DIR}/*.hh
|
||||
${_Gpu_DIR}/*.h ${_Gpu_DIR}/*.hh
|
||||
${_Extended_DIR}/*.h ${_Extended_DIR}/*.hh)
|
||||
|
||||
file(GLOB sources
|
||||
${_Source_DIR}/*.cc ${_Extended_DIR}/*.cc
|
||||
${_Basic_DIR}/*.cc ${_Common_DIR}/*.cc
|
||||
${_Gpu_DIR}/*.cc ${_Gpu_DIR}/*.cu
|
||||
${_Extended_DIR}/*.cc)
|
||||
|
||||
file(GLOB_RECURSE extended
|
||||
${_Extended_DIR}/*.hh ${_Extended_DIR}/*.cc)
|
||||
|
||||
# avoid conflicting format targets
|
||||
set(FORMAT_NAME format)
|
||||
if(TARGET format)
|
||||
set(FORMAT_NAME format-ptl)
|
||||
endif()
|
||||
|
||||
add_custom_target(${FORMAT_NAME}
|
||||
COMMAND ${CLANG_FORMATTER} -i ${headers} ${sources} ${extended}
|
||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
||||
COMMENT "Running '${CLANG_FORMATTER}' on '${_Source_DIR}' and '${_Example_DIR}..."
|
||||
SOURCES ${headers} ${sources})
|
||||
|
||||
endif()
|
||||
+396
@@ -0,0 +1,396 @@
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# Compilers
|
||||
#
|
||||
################################################################################
|
||||
#
|
||||
# sets (cached):
|
||||
#
|
||||
# CMAKE_C_COMPILER_IS_<TYPE>
|
||||
# CMAKE_CXX_COMPILER_IS_<TYPE>
|
||||
#
|
||||
# where TYPE is:
|
||||
# - GNU
|
||||
# - CLANG
|
||||
# - INTEL
|
||||
# - INTEL_ICC
|
||||
# - INTEL_ICPC
|
||||
# - PGI
|
||||
# - XLC
|
||||
# - HP_ACC
|
||||
# - MIPS
|
||||
# - MSVC
|
||||
#
|
||||
|
||||
include(CheckLanguage)
|
||||
|
||||
include(CheckCCompilerFlag)
|
||||
include(CheckCSourceCompiles)
|
||||
include(CheckCSourceRuns)
|
||||
|
||||
include(CheckCXXCompilerFlag)
|
||||
include(CheckCXXSourceCompiles)
|
||||
include(CheckCXXSourceRuns)
|
||||
|
||||
include(MacroUtilities)
|
||||
|
||||
if("${LIBNAME}" STREQUAL "")
|
||||
string(TOLOWER "${PROJECT_NAME}" LIBNAME)
|
||||
endif()
|
||||
|
||||
ptl_add_interface_library(${LIBNAME}-compile-options)
|
||||
|
||||
#----------------------------------------------------------------------------------------#
|
||||
# macro converting string to list
|
||||
#----------------------------------------------------------------------------------------#
|
||||
macro(to_list _VAR _STR)
|
||||
STRING(REPLACE " " " " ${_VAR} "${_STR}")
|
||||
STRING(REPLACE " " ";" ${_VAR} "${_STR}")
|
||||
endmacro(to_list _VAR _STR)
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------------------#
|
||||
# macro converting string to list
|
||||
#----------------------------------------------------------------------------------------#
|
||||
macro(to_string _VAR _STR)
|
||||
STRING(REPLACE ";" " " ${_VAR} "${_STR}")
|
||||
endmacro(to_string _VAR _STR)
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------------------#
|
||||
# Macro to add to string
|
||||
#----------------------------------------------------------------------------------------#
|
||||
macro(add _VAR _FLAG)
|
||||
if(NOT "${_FLAG}" STREQUAL "")
|
||||
if("${${_VAR}}" STREQUAL "")
|
||||
set(${_VAR} "${_FLAG}")
|
||||
else()
|
||||
set(${_VAR} "${${_VAR}} ${_FLAG}")
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------------------#
|
||||
# macro to remove duplicates from string
|
||||
#----------------------------------------------------------------------------------------#
|
||||
macro(set_no_duplicates _VAR)
|
||||
if(NOT "${ARGN}" STREQUAL "")
|
||||
set(${_VAR} "${ARGN}")
|
||||
endif()
|
||||
# remove the duplicates
|
||||
if(NOT "${${_VAR}}" STREQUAL "")
|
||||
# create list of flags
|
||||
to_list(_VAR_LIST "${${_VAR}}")
|
||||
list(REMOVE_DUPLICATES _VAR_LIST)
|
||||
to_string(${_VAR} "${_VAR_LIST}")
|
||||
endif(NOT "${${_VAR}}" STREQUAL "")
|
||||
endmacro(set_no_duplicates _VAR)
|
||||
|
||||
|
||||
##########################################################################################
|
||||
#
|
||||
# C compiler flags
|
||||
#
|
||||
##########################################################################################
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------------------#
|
||||
# add C flag to target
|
||||
#----------------------------------------------------------------------------------------#
|
||||
macro(ADD_TARGET_C_FLAG _TARG)
|
||||
target_compile_options(${_TARG} INTERFACE $<$<COMPILE_LANGUAGE:C>:${ARGN}>)
|
||||
endmacro()
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------------------#
|
||||
# add C flag w/o check
|
||||
#----------------------------------------------------------------------------------------#
|
||||
macro(ADD_C_FLAG FLAG)
|
||||
set(_TARG )
|
||||
set(_LTARG )
|
||||
if(NOT "${ARGN}" STREQUAL "")
|
||||
set(_TARG ${ARGN})
|
||||
string(TOLOWER "_${ARGN}" _LTARG)
|
||||
endif()
|
||||
if(NOT "${FLAG}" STREQUAL "")
|
||||
if("${_LTARG}" STREQUAL "")
|
||||
list(APPEND ${PROJECT_NAME}_C_FLAGS "${FLAG}")
|
||||
list(APPEND ${PROJECT_NAME}_C_COMPILE_OPTIONS "${FLAG}")
|
||||
add_target_c_flag(${LIBNAME}-compile-options ${FLAG})
|
||||
else()
|
||||
add_target_c_flag(${_TARG} ${FLAG})
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------------------#
|
||||
# check C flag
|
||||
#----------------------------------------------------------------------------------------#
|
||||
macro(ADD_C_FLAG_IF_AVAIL FLAG)
|
||||
set(_TARG )
|
||||
set(_LTARG )
|
||||
if(NOT "${ARGN}" STREQUAL "")
|
||||
set(_TARG ${ARGN})
|
||||
string(TOLOWER "_${ARGN}" _LTARG)
|
||||
endif()
|
||||
if(NOT "${FLAG}" STREQUAL "")
|
||||
string(REGEX REPLACE "^/" "c${_LTARG}_" FLAG_NAME "${FLAG}")
|
||||
string(REGEX REPLACE "^-" "c${_LTARG}_" FLAG_NAME "${FLAG}")
|
||||
string(REPLACE "-" "_" FLAG_NAME "${FLAG_NAME}")
|
||||
string(REPLACE " " "_" FLAG_NAME "${FLAG_NAME}")
|
||||
string(REPLACE "=" "_" FLAG_NAME "${FLAG_NAME}")
|
||||
check_c_compiler_flag("${FLAG}" ${FLAG_NAME})
|
||||
if(${FLAG_NAME})
|
||||
if("${_LTARG}" STREQUAL "")
|
||||
list(APPEND ${PROJECT_NAME}_C_FLAGS "${FLAG}")
|
||||
list(APPEND ${PROJECT_NAME}_C_COMPILE_OPTIONS "${FLAG}")
|
||||
add_target_c_flag(${LIBNAME}-compile-options ${FLAG})
|
||||
else()
|
||||
add_target_c_flag(${_TARG} ${FLAG})
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------------------#
|
||||
# add C flag to target
|
||||
#----------------------------------------------------------------------------------------#
|
||||
macro(ADD_TARGET_C_FLAG_IF_AVAIL _TARG)
|
||||
foreach(_FLAG ${ARGN})
|
||||
add_c_flag_if_avail(${_FLAG} ${_TARG})
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
|
||||
##########################################################################################
|
||||
#
|
||||
# CXX compiler flags
|
||||
#
|
||||
##########################################################################################
|
||||
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------------------#
|
||||
# add CXX flag to target
|
||||
#----------------------------------------------------------------------------------------#
|
||||
macro(ADD_TARGET_CXX_FLAG _TARG)
|
||||
target_compile_options(${_TARG} INTERFACE $<$<COMPILE_LANGUAGE:CXX>:${ARGN}>)
|
||||
get_property(LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES)
|
||||
if(CMAKE_CUDA_COMPILER AND "CUDA" IN_LIST LANGUAGES)
|
||||
target_compile_options(${_TARG} INTERFACE $<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=${ARGN}>)
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------------------#
|
||||
# add CXX flag w/o check
|
||||
#----------------------------------------------------------------------------------------#
|
||||
macro(ADD_CXX_FLAG FLAG)
|
||||
set(_TARG )
|
||||
set(_LTARG )
|
||||
if(NOT "${ARGN}" STREQUAL "")
|
||||
set(_TARG ${ARGN})
|
||||
string(TOLOWER "_${ARGN}" _LTARG)
|
||||
endif()
|
||||
if(NOT "${FLAG}" STREQUAL "")
|
||||
if("${_LTARG}" STREQUAL "")
|
||||
list(APPEND ${PROJECT_NAME}_CXX_FLAGS "${FLAG}")
|
||||
list(APPEND ${PROJECT_NAME}_CXX_COMPILE_OPTIONS "${FLAG}")
|
||||
add_target_cxx_flag(${LIBNAME}-compile-options ${FLAG})
|
||||
else()
|
||||
add_target_cxx_flag(${_TARG} ${FLAG})
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------------------#
|
||||
# check CXX flag
|
||||
#----------------------------------------------------------------------------------------#
|
||||
macro(ADD_CXX_FLAG_IF_AVAIL FLAG)
|
||||
set(_TARG )
|
||||
set(_LTARG )
|
||||
if(NOT "${ARGN}" STREQUAL "")
|
||||
set(_TARG ${ARGN})
|
||||
string(TOLOWER "_${ARGN}" _LTARG)
|
||||
endif()
|
||||
if(NOT "${FLAG}" STREQUAL "")
|
||||
string(REGEX REPLACE "^/" "cxx${_LTARG}_" FLAG_NAME "${FLAG}")
|
||||
string(REGEX REPLACE "^-" "cxx${_LTARG}_" FLAG_NAME "${FLAG}")
|
||||
string(REPLACE "-" "_" FLAG_NAME "${FLAG_NAME}")
|
||||
string(REPLACE " " "_" FLAG_NAME "${FLAG_NAME}")
|
||||
string(REPLACE "=" "_" FLAG_NAME "${FLAG_NAME}")
|
||||
check_cxx_compiler_flag("${FLAG}" ${FLAG_NAME})
|
||||
if(${FLAG_NAME})
|
||||
if("${_LTARG}" STREQUAL "")
|
||||
list(APPEND ${PROJECT_NAME}_CXX_FLAGS "${FLAG}")
|
||||
list(APPEND ${PROJECT_NAME}_CXX_COMPILE_OPTIONS "${FLAG}")
|
||||
add_target_cxx_flag(${LIBNAME}-compile-options ${FLAG})
|
||||
else()
|
||||
add_target_cxx_flag(${_TARG} ${FLAG})
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------------------#
|
||||
# add CXX flag to target
|
||||
#----------------------------------------------------------------------------------------#
|
||||
macro(ADD_TARGET_CXX_FLAG_IF_AVAIL _TARG)
|
||||
foreach(_FLAG ${ARGN})
|
||||
add_cxx_flag_if_avail(${_FLAG} ${_TARG})
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
|
||||
##########################################################################################
|
||||
#
|
||||
# Common
|
||||
#
|
||||
##########################################################################################
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------------------#
|
||||
# add C and CXX flag w/o checking
|
||||
#----------------------------------------------------------------------------------------#
|
||||
macro(ADD_TARGET_FLAG _TARG)
|
||||
foreach(_ARG ${ARGN})
|
||||
ADD_TARGET_C_FLAG(${_TARG} ${_ARG})
|
||||
ADD_TARGET_CXX_FLAG(${_TARG} ${_ARG})
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------------------#
|
||||
# check C and CXX flag
|
||||
#----------------------------------------------------------------------------------------#
|
||||
macro(ADD_FLAG_IF_AVAIL)
|
||||
foreach(_ARG ${ARGN})
|
||||
ADD_C_FLAG_IF_AVAIL("${_ARG}")
|
||||
ADD_CXX_FLAG_IF_AVAIL("${_ARG}")
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------------------#
|
||||
# check C and CXX flag
|
||||
#----------------------------------------------------------------------------------------#
|
||||
macro(ADD_TARGET_FLAG_IF_AVAIL _TARG)
|
||||
foreach(_ARG ${ARGN})
|
||||
ADD_TARGET_C_FLAG_IF_AVAIL(${_TARG} ${_ARG})
|
||||
ADD_TARGET_CXX_FLAG_IF_AVAIL(${_TARG} ${_ARG})
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------------------#
|
||||
# add to any language
|
||||
#----------------------------------------------------------------------------------------#
|
||||
function(ADD_USER_FLAGS _TARGET _LANGUAGE)
|
||||
|
||||
set(_FLAGS ${${_LANGUAGE}FLAGS} $ENV{${_LANGUAGE}FLAGS}
|
||||
${${_LANGUAGE}_FLAGS} $ENV{${_LANGUAGE}_FLAGS})
|
||||
|
||||
string(REPLACE " " ";" _FLAGS "${_FLAGS}")
|
||||
|
||||
set(${PROJECT_NAME}_${_LANGUAGE}_FLAGS
|
||||
${${PROJECT_NAME}_${_LANGUAGE}_FLAGS} ${_FLAGS} PARENT_SCOPE)
|
||||
|
||||
set(${PROJECT_NAME}_${_LANGUAGE}_COMPILE_OPTIONS
|
||||
${${PROJECT_NAME}_${_LANGUAGE}_COMPILE_OPTIONS} ${_FLAGS} PARENT_SCOPE)
|
||||
|
||||
target_compile_options(${_TARGET} INTERFACE
|
||||
$<$<COMPILE_LANGUAGE:${_LANGUAGE}>:${_FLAGS}>)
|
||||
endfunction()
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------------------#
|
||||
# determine compiler types for each language
|
||||
#----------------------------------------------------------------------------------------#
|
||||
foreach(LANG C CXX)
|
||||
|
||||
macro(SET_COMPILER_VAR VAR _BOOL)
|
||||
set(CMAKE_${LANG}_COMPILER_IS_${VAR} ${_BOOL})
|
||||
endmacro()
|
||||
|
||||
if(("${LANG}" STREQUAL "C" AND CMAKE_COMPILER_IS_GNUCC)
|
||||
OR
|
||||
("${LANG}" STREQUAL "CXX" AND CMAKE_COMPILER_IS_GNUCXX))
|
||||
|
||||
# GNU compiler
|
||||
SET_COMPILER_VAR( GNU ON)
|
||||
|
||||
elseif(CMAKE_${LANG}_COMPILER MATCHES "icc.*")
|
||||
|
||||
# Intel icc compiler
|
||||
SET_COMPILER_VAR( INTEL ON)
|
||||
SET_COMPILER_VAR( INTEL_ICC ON)
|
||||
|
||||
elseif(CMAKE_${LANG}_COMPILER MATCHES "icpc.*")
|
||||
|
||||
# Intel icpc compiler
|
||||
SET_COMPILER_VAR( INTEL ON)
|
||||
SET_COMPILER_VAR( INTEL_ICPC ON)
|
||||
|
||||
elseif(CMAKE_${LANG}_COMPILER_ID MATCHES "Clang" OR
|
||||
CMAKE_${LANG}_COMPILER_ID MATCHES "AppleClang")
|
||||
|
||||
# Clang/LLVM compiler
|
||||
SET_COMPILER_VAR( CLANG ON)
|
||||
|
||||
elseif(CMAKE_${LANG}_COMPILER_ID MATCHES "PGI")
|
||||
|
||||
# PGI compiler
|
||||
SET_COMPILER_VAR( PGI ON)
|
||||
|
||||
elseif(CMAKE_${LANG}_COMPILER MATCHES "xlC" AND UNIX)
|
||||
|
||||
# IBM xlC compiler
|
||||
SET_COMPILER_VAR( XLC ON)
|
||||
|
||||
elseif(CMAKE_${LANG}_COMPILER MATCHES "aCC" AND UNIX)
|
||||
|
||||
# HP aC++ compiler
|
||||
SET_COMPILER_VAR( HP_ACC ON)
|
||||
|
||||
elseif(CMAKE_${LANG}_COMPILER MATCHES "CC" AND
|
||||
CMAKE_SYSTEM_NAME MATCHES "IRIX" AND UNIX)
|
||||
|
||||
# IRIX MIPSpro CC Compiler
|
||||
SET_COMPILER_VAR( MIPS ON)
|
||||
|
||||
elseif(CMAKE_${LANG}_COMPILER_ID MATCHES "Intel")
|
||||
|
||||
SET_COMPILER_VAR( INTEL ON)
|
||||
|
||||
set(CTYPE ICC)
|
||||
if("${LANG}" STREQUAL "CXX")
|
||||
set(CTYPE ICPC)
|
||||
endif()
|
||||
|
||||
SET_COMPILER_VAR( INTEL_${CTYPE} ON)
|
||||
|
||||
elseif(CMAKE_${LANG}_COMPILER MATCHES "MSVC")
|
||||
|
||||
# Windows Visual Studio compiler
|
||||
SET_COMPILER_VAR( MSVC ON)
|
||||
|
||||
endif()
|
||||
|
||||
# set other to no
|
||||
foreach(TYPE GNU INTEL INTEL_ICC INTEL_ICPC CLANG PGI XLC HP_ACC MIPS MSVC)
|
||||
if(NOT ${CMAKE_${LANG}_COMPILER_IS_${TYPE}})
|
||||
SET_COMPILER_VAR(${TYPE} OFF)
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
if(APPLE OR ("${CMAKE_INCLUDE_SYSTEM_FLAG_${LANG}}" STREQUAL "-I" AND NOT WIN32))
|
||||
# set(CMAKE_INCLUDE_SYSTEM_FLAG_${LANG} "-isystem ")
|
||||
endif()
|
||||
|
||||
endforeach()
|
||||
@@ -0,0 +1,43 @@
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# PTL Package installation
|
||||
#
|
||||
################################################################################
|
||||
|
||||
include(CMakePackageConfigHelpers)
|
||||
|
||||
set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR})
|
||||
set(LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR})
|
||||
|
||||
configure_package_config_file(
|
||||
${PROJECT_SOURCE_DIR}/cmake/Templates/${PROJECT_NAME}Config.cmake.in
|
||||
${PROJECT_BINARY_DIR}/installation/${PROJECT_NAME}Config.cmake
|
||||
INSTALL_DESTINATION ${CMAKE_INSTALL_CONFIGDIR}
|
||||
INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}
|
||||
PATH_VARS
|
||||
INCLUDE_INSTALL_DIR
|
||||
LIB_INSTALL_DIR)
|
||||
|
||||
write_basic_package_version_file(
|
||||
${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
|
||||
VERSION ${PROJECT_VERSION}
|
||||
COMPATIBILITY SameMajorVersion)
|
||||
|
||||
install(FILES ${PROJECT_BINARY_DIR}/installation/${PROJECT_NAME}Config.cmake
|
||||
${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
|
||||
DESTINATION ${CMAKE_INSTALL_CONFIGDIR})
|
||||
|
||||
install(FILES ${PROJECT_SOURCE_DIR}/cmake/Modules/FindTBB.cmake
|
||||
DESTINATION ${CMAKE_INSTALL_CONFIGDIR}/Modules)
|
||||
|
||||
|
||||
set(BUILD_TREE ON)
|
||||
configure_package_config_file(
|
||||
${PROJECT_SOURCE_DIR}/cmake/Templates/${PROJECT_NAME}Config.cmake.in
|
||||
${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
|
||||
INSTALL_DESTINATION ${PROJECT_BINARY_DIR}
|
||||
INSTALL_PREFIX ${PROJECT_BINARY_DIR}
|
||||
PATH_VARS
|
||||
INCLUDE_INSTALL_DIR
|
||||
LIB_INSTALL_DIR)
|
||||
@@ -0,0 +1,44 @@
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
# CUDA function
|
||||
#
|
||||
function(NVCUDA_COMPILE_PTX)
|
||||
set(options "")
|
||||
set(oneValueArgs TARGET_PATH GENERATED_FILES OUTPUT_DIR)
|
||||
set(multiValueArgs NVCC_OPTIONS SOURCES)
|
||||
cmake_parse_arguments(NVCUDA_COMPILE_PTX "${options}" "${oneValueArgs}"
|
||||
"${multiValueArgs}" ${ARGN})
|
||||
|
||||
# Match the bitness of the ptx to the bitness of the application
|
||||
set( MACHINE "--machine=32" )
|
||||
if( CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
set( MACHINE "--machine=64" )
|
||||
endif()
|
||||
|
||||
set(_OUTPUT_DIR ${NVCUDA_COMPILE_PTX_OUTPUT_DIR})
|
||||
if("${_OUTPUT_DIR}" STREQUAL "")
|
||||
set(_OUTPUT_DIR ${CUDA_GENERATED_OUTPUT_DIR})
|
||||
endif()
|
||||
|
||||
# Custom build rule to generate ptx files from cuda files
|
||||
foreach(input ${NVCUDA_COMPILE_PTX_SOURCES})
|
||||
get_filename_component(input_we ${input} NAME_WE)
|
||||
|
||||
# generate the *.ptx files inside "ptx" folder inside
|
||||
# the executable's output directory.
|
||||
set( output "${_OUTPUT_DIR}/${input_we}.ptx" )
|
||||
|
||||
list(APPEND PTX_FILES ${output})
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${output}
|
||||
DEPENDS ${input}
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
COMMAND ${CUDA_NVCC_EXECUTABLE} ${MACHINE}
|
||||
--ptx ${NVCUDA_COMPILE_PTX_NVCC_OPTIONS} ${input}
|
||||
-o ${output}
|
||||
)
|
||||
endforeach()
|
||||
|
||||
set(${NVCUDA_COMPILE_PTX_GENERATED_FILES} ${PTX_FILES} PARENT_SCOPE)
|
||||
endfunction()
|
||||
@@ -0,0 +1,227 @@
|
||||
#
|
||||
# Create a "make doc" target using Doxygen
|
||||
# Prototype:
|
||||
# GENERATE_DOCUMENTATION(doxygen_config_file)
|
||||
# Parameters:
|
||||
# doxygen_config_file Doxygen configuration file (must in the
|
||||
# root of the source directory)
|
||||
|
||||
include(MacroUtilities)
|
||||
include(CMakeDependentOption)
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
|
||||
# if BUILD_DOXYGEN_DOCS = ON, we want to build docs quietly
|
||||
# else, don't build quietly
|
||||
add_option(${PROJECT_NAME}_DOCS_QUIET "Suppress standard output when making the docs" ON)
|
||||
mark_as_advanced(${PROJECT_NAME}_DOCS_QUIET)
|
||||
|
||||
if(${PROJECT_NAME}_DOCS_QUIET)
|
||||
set(DOXYGEN_QUIET YES)
|
||||
else()
|
||||
set(DOXYGEN_QUIET NO)
|
||||
endif()
|
||||
|
||||
# GraphViz dot program is used to build call graphs, caller graphs, class graphs
|
||||
find_program(GRAPHVIZ_DOT_PATH dot)
|
||||
mark_as_advanced(GRAPHVIZ_DOT_PATH)
|
||||
|
||||
if("${GRAPHVIZ_DOT_PATH}" STREQUAL "GRAPHVIZ_DOT_PATH-NOTFOUND")
|
||||
set(DOXYGEN_DOT_FOUND NO)
|
||||
set(GRAPHVIZ_DOT_PATH "")
|
||||
else()
|
||||
set(DOXYGEN_DOT_FOUND YES)
|
||||
set(GRAPHVIZ_DOT_PATH ${GRAPHVIZ_DOT_PATH})
|
||||
endif()
|
||||
|
||||
# available Doxygen doc formats
|
||||
set(AVAILABLE_DOXYGEN_DOC_FORMATS HTML LATEX MAN XML RTF)
|
||||
# we want HTML, LATEX, and MAN to be default
|
||||
set(_default_on "MAN")
|
||||
foreach(_doc_format ${AVAILABLE_DOXYGEN_DOC_FORMATS})
|
||||
# find if we want it on
|
||||
STRING(REGEX MATCH "${_doc_format}" SET_TO_ON "${_default_on}")
|
||||
# if doc format is MAN and it is not a UNIX machine --> turn off
|
||||
if("${_doc_format}" STREQUAL "MAN" AND NOT UNIX)
|
||||
set(SET_TO_ON "")
|
||||
endif()
|
||||
# set ON/OFF
|
||||
if("${SET_TO_ON}" STREQUAL "")
|
||||
set(_default "OFF")
|
||||
else()
|
||||
set(_default "ON")
|
||||
endif()
|
||||
# add option
|
||||
add_option(${PROJECT_NAME}_${_doc_format}_DOCS
|
||||
"Build documentation with ${_doc_format} format" ${_default})
|
||||
mark_as_advanced(${PROJECT_NAME}_${_doc_format}_DOCS)
|
||||
endforeach()
|
||||
|
||||
# loop over doc formats and set GENERATE_DOXYGEN_${_doc_format}_DOC to
|
||||
# YES/NO GENERATE_DOXYGEN_${_doc_format}_DOC is used in configure_file @ONLY
|
||||
foreach(_doc_format ${AVAILABLE_DOXYGEN_DOC_FORMATS})
|
||||
if(${PROJECT_NAME}_${_doc_format}_DOCS)
|
||||
set(GENERATE_DOXYGEN_${_doc_format}_DOC YES)
|
||||
else()
|
||||
set(GENERATE_DOXYGEN_${_doc_format}_DOC NO)
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
|
||||
if(DOXYGEN_DOT_FOUND)
|
||||
set(DOXYGEN_DOT_GRAPH_TYPES CLASS CALL CALLER)
|
||||
# options to turn generation of class, call, and caller graphs
|
||||
foreach(_graph_type ${DOXYGEN_DOT_GRAPH_TYPES})
|
||||
# create CMake doc string
|
||||
string(TOLOWER _graph_type_desc ${_graph_type})
|
||||
# add option
|
||||
option(${PROJECT_NAME}_${_graph_type}_GRAPH "${_message}" ON)
|
||||
mark_as_advanced(${PROJECT_NAME}_${_graph_type}_GRAPH)
|
||||
# set GENERATE_DOXYGEN_${_graph_type}_GRAPH to YES/NO
|
||||
# GENERATE_DOXYGEN_${_graph_type}_GRAPH is used in configure_file
|
||||
# @ONLY
|
||||
if(${PROJECT_NAME}_${_graph_type}_GRAPH)
|
||||
set(GENERATE_DOXYGEN_${_graph_type}_GRAPH YES)
|
||||
else()
|
||||
set(GENERATE_DOXYGEN_${_graph_type}_GRAPH NO)
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
# get the documentation include directories
|
||||
get_property(BUILDTREE_DIRS GLOBAL PROPERTY PTL_DOCUMENTATION_DIRS)
|
||||
|
||||
if("${BUILDTREE_DIRS}" STREQUAL "")
|
||||
message(FATAL_ERROR "Property PTL_DOCUMENTATION_DIRS is empty")
|
||||
endif()
|
||||
|
||||
LIST(REMOVE_DUPLICATES BUILDTREE_DIRS)
|
||||
|
||||
set(SOURCE_FILES)
|
||||
set(EXTENSIONS h hh hpp c cc cpp icc tcc py)
|
||||
foreach(_DIR ${BUILDTREE_DIRS})
|
||||
foreach(_EXT ${EXTENSIONS})
|
||||
file(GLOB _FILES "${_DIR}/*.${_EXT}")
|
||||
if(_FILES)
|
||||
list(APPEND SOURCE_FILES ${_FILES})
|
||||
endif()
|
||||
unset(_FILES CACHE)
|
||||
endforeach()
|
||||
endforeach()
|
||||
#message(STATUS "source files: ${SOURCE_FILES}")
|
||||
|
||||
# Doxyfiles was spaces not semi-colon separated lists
|
||||
STRING(REPLACE ";" " " BUILDTREE_DIRS "${BUILDTREE_DIRS}")
|
||||
STRING(REPLACE ";" " " SOURCE_FILES "${SOURCE_FILES}")
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
|
||||
if(XCODE)
|
||||
set(GENERATE_DOCSET_IF_XCODE YES)
|
||||
else()
|
||||
set(GENERATE_DOCSET_IF_XCODE NO)
|
||||
endif()
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
|
||||
configure_file(${PROJECT_SOURCE_DIR}/cmake/Templates/Doxyfile.in
|
||||
${PROJECT_BINARY_DIR}/doc/Doxyfile.${PROJECT_NAME}
|
||||
@ONLY)
|
||||
|
||||
if(${PROJECT_NAME}_HTML_DOCS)
|
||||
FILE(WRITE ${PROJECT_BINARY_DIR}/doc/${PROJECT_NAME}_Documentation.html
|
||||
"<meta http-equiv=\"refresh\" content=\"1;url=html/index.html\">")
|
||||
endif()
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
# Macro to generate documentation
|
||||
# from:
|
||||
# http://www.cmake.org/pipermail/cmake/2007-May/014174.html
|
||||
MACRO(GENERATE_DOCUMENTATION DOXYGEN_CONFIG_FILE)
|
||||
|
||||
FIND_PACKAGE(Doxygen)
|
||||
if(NOT Doxygen_FOUND)
|
||||
message(STATUS "Doxygen executable cannot be found. Disable ${PROJECT_NAME}_DOXYGEN_DOCS")
|
||||
return()
|
||||
endif()
|
||||
SET(DOXYFILE_FOUND false)
|
||||
|
||||
IF(EXISTS ${PROJECT_BINARY_DIR}/doc/${DOXYGEN_CONFIG_FILE})
|
||||
SET(DOXYFILE_FOUND true)
|
||||
ELSE(EXISTS ${PROJECT_BINARY_DIR}/doc/${DOXYGEN_CONFIG_FILE})
|
||||
MESSAGE(STATUS "Doxygen config file was not found at ${PROJECT_BINARY_DIR}/doc/${DOXYGEN_CONFIG_FILE}")
|
||||
ENDIF(EXISTS ${PROJECT_BINARY_DIR}/doc/${DOXYGEN_CONFIG_FILE})
|
||||
|
||||
IF( DOXYGEN_FOUND )
|
||||
IF( DOXYFILE_FOUND )
|
||||
# Add target
|
||||
ADD_CUSTOM_TARGET(docs ${DOXYGEN_EXECUTABLE}
|
||||
"${PROJECT_BINARY_DIR}/doc/${DOXYGEN_CONFIG_FILE}" )
|
||||
|
||||
install(DIRECTORY ${PROJECT_BINARY_DIR}/doc/man/
|
||||
DESTINATION ${CMAKE_INSTALL_MANDIR}
|
||||
OPTIONAL
|
||||
COMPONENT documentation
|
||||
)
|
||||
|
||||
install(DIRECTORY ${PROJECT_BINARY_DIR}/doc/html
|
||||
DESTINATION ${CMAKE_INSTALL_DOCDIR}
|
||||
OPTIONAL
|
||||
COMPONENT documentation
|
||||
)
|
||||
|
||||
install(DIRECTORY ${PROJECT_BINARY_DIR}/doc/latex
|
||||
DESTINATION ${CMAKE_INSTALL_DOCDIR}
|
||||
OPTIONAL
|
||||
COMPONENT documentation
|
||||
)
|
||||
|
||||
install(FILES ${PROJECT_BINARY_DIR}/doc/${PROJECT_NAME}_Documentation.html
|
||||
DESTINATION ${CMAKE_INSTALL_DOCDIR}
|
||||
OPTIONAL
|
||||
COMPONENT documentation
|
||||
)
|
||||
|
||||
ELSE( DOXYFILE_FOUND )
|
||||
MESSAGE( STATUS "Doxygen configuration file not found - Documentation will not be generated" )
|
||||
ENDIF( DOXYFILE_FOUND )
|
||||
ELSE(DOXYGEN_FOUND)
|
||||
MESSAGE(STATUS "Doxygen not found - Documentation will not be generated")
|
||||
ENDIF(DOXYGEN_FOUND)
|
||||
|
||||
ENDMACRO(GENERATE_DOCUMENTATION)
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
# Macro to generate PDF manual from LaTeX using pdflatex
|
||||
# assumes manual is in ${CMAKE_SOURCE_DIR}/doc
|
||||
MACRO(GENERATE_MANUAL MANUAL_TEX MANUAL_BUILD_PATH EXTRA_FILES_TO_COPY)
|
||||
|
||||
find_program(PDFLATEX pdflatex)
|
||||
|
||||
if(PDFLATEX AND NOT "${PDFLATEX}" STREQUAL "PDFLATEX-NOTFOUND")
|
||||
# name with no path is given
|
||||
set(MANUAL_NAME ${MANUAL_TEX})
|
||||
# set to full path
|
||||
set(MANUAL_BUILD_PATH ${CMAKE_BINARY_DIR}/${MANUAL_BUILD_PATH})
|
||||
|
||||
if(NOT EXISTS ${CMAKE_SOURCE_DIR}/doc/${MANUAL_TEX})
|
||||
message(FATAL_ERROR "LaTeX of manual for ${PROJECT_NAME} is not in ${CMAKE_SOURCE_DIR}/doc")
|
||||
endif()
|
||||
|
||||
configure_file(${CMAKE_SOURCE_DIR}/doc/${MANUAL_TEX}
|
||||
${MANUAL_BUILD_PATH}/${MANUAL_NAME}
|
||||
COPYONLY)
|
||||
|
||||
foreach(_file ${EXTRA_FILES_TO_COPY})
|
||||
configure_file(${CMAKE_SOURCE_DIR}/doc/${_file}
|
||||
${MANUAL_BUILD_PATH}/${_file}
|
||||
COPYONLY)
|
||||
endforeach()
|
||||
|
||||
add_custom_target(man
|
||||
${PDFLATEX} "${MANUAL_NAME}"
|
||||
WORKING_DIRECTORY
|
||||
${MANUAL_BUILD_PATH}
|
||||
)
|
||||
endif()
|
||||
ENDMACRO()
|
||||
+350
@@ -0,0 +1,350 @@
|
||||
# Module for locating Intel's Threading Building Blocks (TBB).
|
||||
#
|
||||
# Customizable variables:
|
||||
# TBB_ROOT_DIR
|
||||
# Specifies TBB's root directory.
|
||||
#
|
||||
# Read-only variables:
|
||||
# TBB_FOUND
|
||||
# Indicates whether the library has been found.
|
||||
#
|
||||
# TBB_INCLUDE_DIRS
|
||||
# Specifies TBB's include directory.
|
||||
#
|
||||
# TBB_LIBRARIES
|
||||
# Specifies TBB libraries that should be passed to target_link_libararies.
|
||||
#
|
||||
# TBB_<COMPONENT>_LIBRARIES
|
||||
# Specifies the libraries of a specific <COMPONENT>.
|
||||
#
|
||||
# TBB_<COMPONENT>_FOUND
|
||||
# Indicates whether the specified <COMPONENT> was found.
|
||||
#
|
||||
#
|
||||
# Copyright (c) 2012 Sergiu Dotenco
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in all
|
||||
# copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTTBBLAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
|
||||
INCLUDE (FindPackageHandleStandardArgs)
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
#
|
||||
# Paths
|
||||
#
|
||||
#------------------------------------------------------------------------------#
|
||||
|
||||
IF(CMAKE_VERSION VERSION_GREATER 2.8.7)
|
||||
SET(_TBB_CHECK_COMPONENTS ON)
|
||||
ELSE()
|
||||
SET(_TBB_CHECK_COMPONENTS OFF)
|
||||
ENDIF()
|
||||
|
||||
FIND_PATH(TBB_ROOT_DIR
|
||||
NAMES include/tbb/tbb.h
|
||||
PATHS ENV TBBROOT
|
||||
ENV TBB40_INSTALL_DIR
|
||||
ENV TBB30_INSTALL_DIR
|
||||
ENV TBB22_INSTALL_DIR
|
||||
ENV TBB21_INSTALL_DIR
|
||||
ENV TBB_ROOT_DIR
|
||||
DOC "TBB root directory")
|
||||
|
||||
FIND_PATH(TBB_INCLUDE_DIR
|
||||
NAMES tbb/tbb.h
|
||||
HINTS ${TBB_ROOT_DIR}
|
||||
PATH_SUFFIXES include
|
||||
DOC "TBB include directory")
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
#
|
||||
# Library suffixes
|
||||
#
|
||||
#------------------------------------------------------------------------------#
|
||||
|
||||
IF(MSVC11)
|
||||
SET(_TBB_COMPILER vc11)
|
||||
ELSEIF(MSVC10)
|
||||
SET(_TBB_COMPILER vc10)
|
||||
ELSEIF(MSVC90)
|
||||
SET(_TBB_COMPILER vc9)
|
||||
ELSEIF(MSVC80)
|
||||
SET(_TBB_COMPILER vc8)
|
||||
ELSEIF(WIN32)
|
||||
SET(_TBB_COMPILER vc_mt)
|
||||
ENDIF(MSVC11)
|
||||
|
||||
IF(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
SET(_TBB_POSSIBLE_LIB_SUFFIXES lib/intel64/${_TBB_COMPILER})
|
||||
SET(_TBB_POSSIBLE_BIN_SUFFIXES bin/intel64/${_TBB_COMPILER})
|
||||
ELSE(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
SET(_TBB_POSSIBLE_LIB_SUFFIXES lib/ia32/${_TBB_COMPILER})
|
||||
SET(_TBB_POSSIBLE_BIN_SUFFIXES bin/ia32/${_TBB_COMPILER})
|
||||
ENDIF(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
|
||||
LIST(APPEND _TBB_POSSIBLE_LIB_SUFFIXES lib/$ENV{TBB_ARCH_PLATFORM})
|
||||
|
||||
IF(UNIX)
|
||||
FOREACH(_VERSION 4.7 4.4 4.1)
|
||||
IF(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
LIST(APPEND _TBB_POSSIBLE_LIB_SUFFIXES lib/intel64/gcc${_VERSION})
|
||||
ELSE()
|
||||
LIST(APPEND _TBB_POSSIBLE_LIB_SUFFIXES lib/ia32/gcc${_VERSION})
|
||||
ENDIF()
|
||||
ENDFOREACH()
|
||||
ENDIF()
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
#
|
||||
# TBB library
|
||||
#
|
||||
#------------------------------------------------------------------------------#
|
||||
|
||||
FIND_LIBRARY(TBB_LIBRARY_RELEASE
|
||||
NAMES tbb
|
||||
HINTS ${TBB_ROOT_DIR}
|
||||
PATH_SUFFIXES ${_TBB_POSSIBLE_LIB_SUFFIXES}
|
||||
DOC "TBB release library")
|
||||
|
||||
FIND_LIBRARY(TBB_LIBRARY_DEBUG
|
||||
NAMES tbb_debug
|
||||
HINTS ${TBB_ROOT_DIR}
|
||||
PATH_SUFFIXES ${_TBB_POSSIBLE_LIB_SUFFIXES}
|
||||
DOC "TBB debug library")
|
||||
|
||||
IF(TBB_LIBRARY_RELEASE AND TBB_LIBRARY_DEBUG)
|
||||
IF(NOT TBB_LIBRARY)
|
||||
SET(TBB_LIBRARY optimized ${TBB_LIBRARY_RELEASE} debug ${TBB_LIBRARY_DEBUG}
|
||||
CACHE DOC "TBB library" FORCE)
|
||||
ENDIF(NOT TBB_LIBRARY)
|
||||
LIST(APPEND _TBB_ALL_LIBS optimized ${TBB_LIBRARY_RELEASE} debug ${TBB_LIBRARY_DEBUG})
|
||||
ELSE()
|
||||
IF(TBB_LIBRARY_DEBUG)
|
||||
IF(NOT TBB_LIBRARY)
|
||||
SET(TBB_LIBRARY ${TBB_LIBRARY_DEBUG} CACHE FILEPATH "TBB library" FORCE)
|
||||
ENDIF(NOT TBB_LIBRARY)
|
||||
LIST(APPEND _TBB_ALL_LIBS ${TBB_LIBRARY_DEBUG})
|
||||
ENDIF(TBB_LIBRARY_DEBUG)
|
||||
|
||||
IF(TBB_LIBRARY_RELEASE)
|
||||
IF(NOT TBB_LIBRARY)
|
||||
SET(TBB_LIBRARY ${TBB_LIBRARY_RELEASE} CACHE FILEPATH "TBB library" FORCE)
|
||||
ENDIF(NOT TBB_LIBRARY)
|
||||
LIST(APPEND _TBB_ALL_LIBS ${TBB_LIBRARY_RELEASE})
|
||||
ENDIF()
|
||||
ENDIF(TBB_LIBRARY_RELEASE AND TBB_LIBRARY_DEBUG)
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
#
|
||||
# Components
|
||||
#
|
||||
#------------------------------------------------------------------------------#
|
||||
|
||||
SET(_TBB_POSSIBLE_COMPONENTS preview malloc malloc_proxy)
|
||||
|
||||
FOREACH(_TBB_COMPONENT ${TBB_FIND_COMPONENTS})
|
||||
|
||||
STRING(REPLACE "_debug" "" _TBB_COMPONENT ${_TBB_COMPONENT})
|
||||
STRING(TOUPPER ${_TBB_COMPONENT} _TBB_COMPONENT_UPPER)
|
||||
SET(_TBB_LIBRARY_BASE TBB_${_TBB_COMPONENT_UPPER}_LIBRARY)
|
||||
|
||||
IF(${_TBB_COMPONENT} MATCHES "malloc*")
|
||||
SET(_TBB_LIBRARY_NAME tbb${_TBB_COMPONENT})
|
||||
ELSE()
|
||||
SET(_TBB_LIBRARY_NAME tbb_${_TBB_COMPONENT})
|
||||
ENDIF()
|
||||
|
||||
FIND_LIBRARY(${_TBB_LIBRARY_BASE}_RELEASE
|
||||
NAMES ${_TBB_LIBRARY_NAME}
|
||||
HINTS ${TBB_ROOT_DIR}
|
||||
PATH_SUFFIXES ${_TBB_POSSIBLE_LIB_SUFFIXES}
|
||||
DOC "TBB ${_TBB_COMPONENT} release library")
|
||||
|
||||
FIND_LIBRARY(${_TBB_LIBRARY_BASE}_DEBUG
|
||||
NAMES ${_TBB_LIBRARY_NAME}_debug
|
||||
HINTS ${TBB_ROOT_DIR}
|
||||
PATH_SUFFIXES ${_TBB_POSSIBLE_LIB_SUFFIXES}
|
||||
DOC "TBB ${_TBB_COMPONENT} debug library")
|
||||
|
||||
MARK_AS_ADVANCED (${_TBB_LIBRARY_BASE} ${_TBB_LIBRARY_BASE}_DEBUG)
|
||||
|
||||
# default assumption
|
||||
SET(TBB_${_TBB_COMPONENT_UPPER}_FOUND ON)
|
||||
SET(TBB_${_TBB_COMPONENT}_FOUND ON)
|
||||
|
||||
IF(${_TBB_LIBRARY_BASE}_DEBUG AND ${_TBB_LIBRARY_BASE}_RELEASE)
|
||||
SET(${_TBB_LIBRARY_BASE}
|
||||
debug ${${_TBB_LIBRARY_BASE}_DEBUG}
|
||||
optimized ${${_TBB_LIBRARY_BASE}_RELEASE} CACHE STRING
|
||||
"TBB ${_TBB_COMPONENT} library")
|
||||
LIST(APPEND _TBB_ALL_LIBS
|
||||
optimized ${${_TBB_LIBRARY_BASE}_RELEASE}
|
||||
debug ${${_TBB_LIBRARY_BASE}_DEBUG})
|
||||
LIST(APPEND TBB_FOUND_COMPONENTS ${_TBB_LIBRARY_BASE} ${_TBB_LIBRARY_BASE}_debug)
|
||||
SET(TBB_${_TBB_COMPONENT_UPPER}_LIBRARY ${${_TBB_LIBRARY_BASE}_RELEASE})
|
||||
ELSEIF(${_TBB_LIBRARY_BASE}_DEBUG)
|
||||
SET(${_TBB_LIBRARY_BASE} ${${_TBB_LIBRARY_BASE}_DEBUG})
|
||||
LIST(APPEND _TBB_ALL_LIBS ${${_TBB_LIBRARY_BASE}_DEBUG})
|
||||
LIST(APPEND TBB_FOUND_COMPONENTS ${_TBB_LIBRARY_BASE})
|
||||
SET(TBB_${_TBB_COMPONENT_UPPER}_LIBRARY ${${_TBB_LIBRARY_BASE}_DEBUG})
|
||||
ELSEIF(${_TBB_LIBRARY_BASE}_RELEASE)
|
||||
SET(${_TBB_LIBRARY_BASE} ${${_TBB_LIBRARY_BASE}_RELEASE}
|
||||
CACHE FILEPATH "TBB ${_TBB_COMPONENT} library")
|
||||
LIST(APPEND _TBB_ALL_LIBS ${${_TBB_LIBRARY_BASE}_RELEASE})
|
||||
LIST(APPEND TBB_FOUND_COMPONENTS ${_TBB_LIBRARY_BASE}_debug)
|
||||
SET(TBB_${_TBB_COMPONENT_UPPER}_LIBRARY ${${_TBB_LIBRARY_BASE}_RELEASE})
|
||||
ELSE()
|
||||
# Component missing: record it for a later report
|
||||
LIST(APPEND _TBB_MISSING_COMPONENTS ${_TBB_COMPONENT})
|
||||
SET(TBB_${_TBB_COMPONENT}_FOUND OFF)
|
||||
SET(TBB_${_TBB_COMPONENT_UPPER}_FOUND OFF)
|
||||
ENDIF()
|
||||
|
||||
IF(${_TBB_LIBRARY_BASE})
|
||||
# setup the TBB_<COMPONENT>_LIBRARIES variable
|
||||
SET(TBB_${_TBB_COMPONENT_UPPER}_LIBRARIES ${${_TBB_LIBRARY_BASE}})
|
||||
ELSE()
|
||||
LIST(APPEND _TBB_MISSING_LIBRARIES ${_TBB_LIBRARY_BASE})
|
||||
ENDIF()
|
||||
|
||||
ENDFOREACH(_TBB_COMPONENT ${TBB_FIND_COMPONENTS})
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
#
|
||||
# Standard variables
|
||||
#
|
||||
#------------------------------------------------------------------------------#
|
||||
IF(_TBB_ALL_LIBS)
|
||||
SET(TBB_LIBRARIES ${_TBB_ALL_LIBS})
|
||||
ENDIF()
|
||||
|
||||
IF(TBB_INCLUDE_DIR)
|
||||
SET(TBB_INCLUDE_DIRS ${TBB_INCLUDE_DIR})
|
||||
ENDIF()
|
||||
|
||||
IF(DEFINED _TBB_MISSING_COMPONENTS AND _TBB_CHECK_COMPONENTS)
|
||||
IF(NOT TBB_FIND_QUIETLY)
|
||||
MESSAGE(STATUS "One or more TBB components were not found:")
|
||||
# Display missing components indented, each on a separate line
|
||||
FOREACH(_TBB_MISSING_COMPONENT ${_TBB_MISSING_COMPONENTS})
|
||||
MESSAGE(STATUS " " ${_TBB_MISSING_COMPONENT})
|
||||
ENDFOREACH(_TBB_MISSING_COMPONENT ${_TBB_MISSING_COMPONENTS})
|
||||
ENDIF(NOT TBB_FIND_QUIETLY)
|
||||
ENDIF(DEFINED _TBB_MISSING_COMPONENTS AND _TBB_CHECK_COMPONENTS)
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
#
|
||||
# Library's version
|
||||
#
|
||||
#------------------------------------------------------------------------------#
|
||||
|
||||
SET(_TBB_VERSION_HEADER ${TBB_INCLUDE_DIR}/tbb/tbb_stddef.h)
|
||||
|
||||
IF(EXISTS ${_TBB_VERSION_HEADER})
|
||||
FILE(READ ${_TBB_VERSION_HEADER} _TBB_VERSION_CONTENTS)
|
||||
|
||||
STRING(REGEX REPLACE ".*#define TBB_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1"
|
||||
TBB_VERSION_MAJOR "${_TBB_VERSION_CONTENTS}")
|
||||
STRING(REGEX REPLACE ".*#define TBB_VERSION_MINOR[ \t]+([0-9]+).*" "\\1"
|
||||
TBB_VERSION_MINOR "${_TBB_VERSION_CONTENTS}")
|
||||
|
||||
SET(TBB_VERSION ${TBB_VERSION_MAJOR}.${TBB_VERSION_MINOR})
|
||||
SET(TBB_VERSION_COMPONENTS 2)
|
||||
ENDIF()
|
||||
|
||||
IF(WIN32)
|
||||
FIND_PROGRAM(LIB_EXECUTABLE NAMES lib
|
||||
HINTS
|
||||
"$ENV{VS110COMNTOOLS}/../../VC/bin"
|
||||
"$ENV{VS100COMNTOOLS}/../../VC/bin"
|
||||
"$ENV{VS90COMNTOOLS}/../../VC/bin"
|
||||
"$ENV{VS71COMNTOOLS}/../../VC/bin"
|
||||
"$ENV{VS80COMNTOOLS}/../../VC/bin"
|
||||
DOC "Library manager")
|
||||
|
||||
MARK_AS_ADVANCED (LIB_EXECUTABLE)
|
||||
ENDIF()
|
||||
|
||||
MACRO(GET_LIB_REQUISITES LIB REQUISITES)
|
||||
IF(LIB_EXECUTABLE)
|
||||
GET_FILENAME_COMPONENT(_LIB_PATH ${LIB_EXECUTABLE} PATH)
|
||||
|
||||
IF(MSVC)
|
||||
# Do not redirect the output
|
||||
UNSET(ENV{VS_UNICODE_OUTPUT})
|
||||
ENDIF()
|
||||
|
||||
EXECUTE_PROCESS(COMMAND ${LIB_EXECUTABLE} /nologo /list ${LIB}
|
||||
WORKING_DIRECTORY ${_LIB_PATH}/../../Common7/IDE
|
||||
OUTPUT_VARIABLE _LIB_OUTPUT ERROR_QUIET)
|
||||
|
||||
STRING(REPLACE "\n" ";" "${REQUISITES}" "${_LIB_OUTPUT}")
|
||||
LIST(REMOVE_DUPLICATES ${REQUISITES})
|
||||
ENDIF()
|
||||
ENDMACRO()
|
||||
|
||||
IF(_TBB_ALL_LIBS)
|
||||
# collect lib requisites using the lib tool
|
||||
FOREACH(_TBB_COMPONENT ${_TBB_ALL_LIBS})
|
||||
GET_LIB_REQUISITES(${_TBB_COMPONENT} _TBB_REQUISITES)
|
||||
ENDFOREACH(_TBB_COMPONENT)
|
||||
ENDIF()
|
||||
|
||||
IF(NOT TBB_BINARY_DIR)
|
||||
SET(_TBB_UPDATE_BINARY_DIR ON)
|
||||
ELSE()
|
||||
SET(_TBB_UPDATE_BINARY_DIR OFF)
|
||||
ENDIF()
|
||||
|
||||
SET(_TBB_BINARY_DIR_HINTS ${_TBB_POSSIBLE_BIN_SUFFIXES})
|
||||
|
||||
IF(_TBB_REQUISITES)
|
||||
FIND_FILE(TBB_BINARY_DIR NAMES ${_TBB_REQUISITES}
|
||||
HINTS ${TBB_ROOT_DIR}
|
||||
PATH_SUFFIXES ${_TBB_BINARY_DIR_HINTS} NO_DEFAULT_PATH)
|
||||
ENDIF()
|
||||
|
||||
IF(TBB_BINARY_DIR AND _TBB_UPDATE_BINARY_DIR)
|
||||
SET(_TBB_BINARY_DIR ${TBB_BINARY_DIR})
|
||||
UNSET(TBB_BINARY_DIR CACHE)
|
||||
|
||||
IF(_TBB_BINARY_DIR)
|
||||
GET_FILENAME_COMPONENT(TBB_BINARY_DIR ${_TBB_BINARY_DIR} PATH)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
SET(TBB_BINARY_DIR ${TBB_BINARY_DIR} CACHE PATH "TBB binary directory")
|
||||
|
||||
MARK_AS_ADVANCED(TBB_INCLUDE_DIR TBB_LIBRARY TBB_LIBRARY_RELEASE
|
||||
TBB_LIBRARY_DEBUG TBB_BINARY_DIR)
|
||||
|
||||
IF(NOT _TBB_CHECK_COMPONENTS)
|
||||
SET(_TBB_FPHSA_ADDITIONAL_ARGS HANDLE_COMPONENTS)
|
||||
ENDIF()
|
||||
|
||||
LIST(APPEND _TBB_FPHSA_ADDITIONAL_ARGS VERSION_VAR TBB_VERSION)
|
||||
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(TBB
|
||||
REQUIRED_VARS
|
||||
TBB_ROOT_DIR
|
||||
TBB_INCLUDE_DIR
|
||||
TBB_LIBRARY
|
||||
${_TBB_MISSING_LIBRARIES}
|
||||
HANDLE_COMPONENTS
|
||||
${_TBB_FPHSA_ADDITIONAL_ARGS})
|
||||
@@ -0,0 +1,980 @@
|
||||
# MacroUtilities - useful macros and functions for generic tasks
|
||||
#
|
||||
# CMake Extensions
|
||||
# ----------------
|
||||
# macro set_ifnot(<var> <value>)
|
||||
# If variable var is not set, set its value to that provided
|
||||
#
|
||||
# function enum_option(<option>
|
||||
# VALUES <value1> ... <valueN>
|
||||
# TYPE <valuetype>
|
||||
# DOC <docstring>
|
||||
# [DEFAULT <elem>]
|
||||
# [CASE_INSENSITIVE])
|
||||
# Declare a cache variable <option> that can only take values
|
||||
# listed in VALUES. TYPE may be FILEPATH, PATH or STRING.
|
||||
# <docstring> should describe that option, and will appear in
|
||||
# the interactive CMake interfaces. If DEFAULT is provided,
|
||||
# <elem> will be taken as the zero-indexed element in VALUES
|
||||
# to which the value of <option> should default to if not
|
||||
# provided. Otherwise, the default is taken as the first
|
||||
# entry in VALUES. If CASE_INSENSITIVE is present, then
|
||||
# checks of the value of <option> against the allowed values
|
||||
# will ignore the case when performing string comparison.
|
||||
#
|
||||
#
|
||||
# General
|
||||
# --------------
|
||||
# function add_feature(<NAME> <DOCSTRING>)
|
||||
# Add a feature, whose activation is specified by the
|
||||
# existence of the variable <NAME>, to the list of enabled/disabled
|
||||
# features, plus a docstring describing the feature
|
||||
#
|
||||
# function print_enabled_features()
|
||||
# Print enabled features plus their docstrings.
|
||||
#
|
||||
#
|
||||
|
||||
cmake_policy(PUSH)
|
||||
if(NOT CMAKE_VERSION VERSION_LESS 3.1)
|
||||
cmake_policy(SET CMP0054 NEW)
|
||||
endif()
|
||||
|
||||
include(CMakeDependentOption)
|
||||
include(CMakeParseArguments)
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# CMAKE EXTENSIONS
|
||||
#-----------------------------------------------------------------------
|
||||
# macro set_ifnot(<var> <value>)
|
||||
# If variable var is not set, set its value to that provided
|
||||
#
|
||||
macro(set_ifnot _var _value)
|
||||
if(NOT DEFINED ${_var})
|
||||
set(${_var} ${_value} ${ARGN})
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# macro safe_remove_duplicates(<list>)
|
||||
# ensures remove_duplicates is only called if list has values
|
||||
#
|
||||
macro(safe_remove_duplicates _list)
|
||||
if(NOT "${${_list}}" STREQUAL "")
|
||||
list(REMOVE_DUPLICATES ${_list})
|
||||
endif(NOT "${${_list}}" STREQUAL "")
|
||||
endmacro()
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# function - capitalize - make a string capitalized (first letter is capital)
|
||||
# usage:
|
||||
# capitalize("SHARED" CShared)
|
||||
# message(STATUS "-- CShared is \"${CShared}\"")
|
||||
# $ -- CShared is "Shared"
|
||||
function(capitalize str var)
|
||||
# make string lower
|
||||
string(TOLOWER "${str}" str)
|
||||
string(SUBSTRING "${str}" 0 1 _first)
|
||||
string(TOUPPER "${_first}" _first)
|
||||
string(SUBSTRING "${str}" 1 -1 _remainder)
|
||||
if(GOOD_CMAKE)
|
||||
string(CONCAT str "${_first}" "${_remainder}")
|
||||
else(GOOD_CMAKE)
|
||||
set(str "${_first}${_remainder}")
|
||||
endif(GOOD_CMAKE)
|
||||
set(${var} "${str}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# macro set_ifnot_match(<var> <value>)
|
||||
# If variable var is not set, set its value to that provided
|
||||
#
|
||||
macro(SET_IFNOT_MATCH VAR APPEND)
|
||||
if(NOT "${APPEND}" STREQUAL "")
|
||||
STRING(REGEX MATCH "${APPEND}" _MATCH "${${VAR}}")
|
||||
if(NOT "${_MATCH}" STREQUAL "")
|
||||
SET(${VAR} "${${VAR}} ${APPEND}")
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# macro cache_ifnot(<var> <value>)
|
||||
# If variable var is not set, set its value to that provided and cache it
|
||||
#
|
||||
macro(cache_ifnot _var _value _type _doc)
|
||||
if(NOT ${_var} OR NOT ${CACHE_VARIABLES} MATCHES ${_var})
|
||||
set(${_var} ${_value} CACHE ${_type} "${_doc}")
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# function enum_option(<option>
|
||||
# VALUES <value1> ... <valueN>
|
||||
# TYPE <valuetype>
|
||||
# DOC <docstring>
|
||||
# [DEFAULT <elem>]
|
||||
# [CASE_INSENSITIVE])
|
||||
# Declare a cache variable <option> that can only take values
|
||||
# listed in VALUES. TYPE may be FILEPATH, PATH or STRING.
|
||||
# <docstring> should describe that option, and will appear in
|
||||
# the interactive CMake interfaces. If DEFAULT is provided,
|
||||
# <elem> will be taken as the zero-indexed element in VALUES
|
||||
# to which the value of <option> should default to if not
|
||||
# provided. Otherwise, the default is taken as the first
|
||||
# entry in VALUES. If CASE_INSENSITIVE is present, then
|
||||
# checks of the value of <option> against the allowed values
|
||||
# will ignore the case when performing string comparison.
|
||||
#
|
||||
function(enum_option _var)
|
||||
set(options CASE_INSENSITIVE)
|
||||
set(oneValueArgs DOC TYPE DEFAULT)
|
||||
set(multiValueArgs VALUES)
|
||||
cmake_parse_arguments(_ENUMOP "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
||||
|
||||
# - Validation as needed arguments
|
||||
if(NOT _ENUMOP_VALUES)
|
||||
message(FATAL_ERROR "enum_option must be called with non-empty VALUES\n(Called for enum_option '${_var}')")
|
||||
endif()
|
||||
|
||||
# - Set argument defaults as needed
|
||||
if(_ENUMOP_CASE_INSENSITIVE)
|
||||
set(_ci_values )
|
||||
foreach(_elem ${_ENUMOP_VALUES})
|
||||
string(TOLOWER "${_elem}" _ci_elem)
|
||||
list(APPEND _ci_values "${_ci_elem}")
|
||||
endforeach()
|
||||
set(_ENUMOP_VALUES ${_ci_values})
|
||||
endif()
|
||||
|
||||
set_ifnot(_ENUMOP_TYPE STRING)
|
||||
set_ifnot(_ENUMOP_DEFAULT 0)
|
||||
list(GET _ENUMOP_VALUES ${_ENUMOP_DEFAULT} _default)
|
||||
|
||||
if(NOT DEFINED ${_var})
|
||||
set(${_var} ${_default} CACHE ${_ENUMOP_TYPE} "${_ENUMOP_DOC} (${_ENUMOP_VALUES})")
|
||||
else()
|
||||
set(_var_tmp ${${_var}})
|
||||
if(_ENUMOP_CASE_INSENSITIVE)
|
||||
string(TOLOWER ${_var_tmp} _var_tmp)
|
||||
endif()
|
||||
|
||||
list(FIND _ENUMOP_VALUES ${_var_tmp} _elem)
|
||||
if(_elem LESS 0)
|
||||
message(FATAL_ERROR "Value '${${_var}}' for variable ${_var} is not allowed\nIt must be selected from the set: ${_ENUMOP_VALUES} (DEFAULT: ${_default})\n")
|
||||
else()
|
||||
# - convert to lowercase
|
||||
if(_ENUMOP_CASE_INSENSITIVE)
|
||||
set(${_var} ${_var_tmp} CACHE ${_ENUMOP_TYPE} "${_ENUMOP_DOC} (${_ENUMOP_VALUES})" FORCE)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# from
|
||||
# http://www.cmake.org/pipermail/cmake/2008-April/021345.html
|
||||
#-----------------------------------------------------------------------
|
||||
#
|
||||
#
|
||||
# Adds a file or directory to the FILES_TO_DELETE var so that it is removed
|
||||
# when "make distclean" is run
|
||||
#
|
||||
# Prototype:
|
||||
# ADD_TO_DISTCLEAN(file)
|
||||
# Parameters:
|
||||
# file A file or dir
|
||||
#
|
||||
|
||||
MACRO(ADD_TO_DISTCLEAN TARGET_TO_DELETE)
|
||||
SET( FILES_TO_DELETE ${FILES_TO_DELETE} ${TARGET_TO_DELETE} )
|
||||
ENDMACRO(ADD_TO_DISTCLEAN)
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# from
|
||||
# http://www.cmake.org/pipermail/cmake/2008-April/021345.html
|
||||
#-----------------------------------------------------------------------
|
||||
#
|
||||
# Create a "make distclean" target
|
||||
#
|
||||
# Prototype:
|
||||
# GENERATE_DISTCLEAN_TARGET()
|
||||
# Parameters:
|
||||
# (none)
|
||||
#
|
||||
|
||||
MACRO(GENERATE_DISTCLEAN_TARGET)
|
||||
IF( EXISTS ${PROJECT_BINARY_DIR}/distclean_manifest.txt )
|
||||
FILE( REMOVE ${PROJECT_BINARY_DIR}/distclean_manifest.txt )
|
||||
ENDIF( EXISTS ${PROJECT_BINARY_DIR}/distclean_manifest.txt )
|
||||
|
||||
IF(MSVC)
|
||||
SET( FILES_TO_DELETE ${FILES_TO_DELETE} ${PROJECT_BINARY_DIR}/*.dir )
|
||||
ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/*.vcproj )
|
||||
ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/*.vcproj.cmake )
|
||||
ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.sln )
|
||||
ENDIF(MSVC)
|
||||
ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/distclean.dir )
|
||||
ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/CMakeCache.txt )
|
||||
ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/install_manifest.txt )
|
||||
ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/CPackConfig.cmake )
|
||||
ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/CPackSourceConfig.cmake )
|
||||
ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/_CPack_Packages )
|
||||
ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/PACKAGE.dir )
|
||||
ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/cmake_install.cmake )
|
||||
|
||||
# This code does not work yet. I don't know why CPACK_GENERATOR is null.
|
||||
IF(CPACK_GENERATOR)
|
||||
FOREACH(gen ${CPACK_GENERATOR})
|
||||
MESSAGE("Adding file ${PROJECT_BINARY_DIR}/${CPACK_SOURCE_PACKAGE_FILE_NAME}.${gen} to distclean")
|
||||
ADD_TO_DISTCLEAN(${PROJECT_BINARY_DIR}/${CPACK_SOURCE_PACKAGE_FILE_NAME}.${gen} )
|
||||
ENDFOREACH(gen)
|
||||
ELSE(CPACK_GENERATOR)
|
||||
MESSAGE("CPACK_GENERATOR was not defined (value: ${CPACK_GENERATOR})")
|
||||
ENDIF(CPACK_GENERATOR)
|
||||
|
||||
|
||||
|
||||
IF(EXECUTABLE_OUTPUT_PATH)
|
||||
ADD_TO_DISTCLEAN( ${EXECUTABLE_OUTPUT_PATH} )
|
||||
ENDIF(EXECUTABLE_OUTPUT_PATH)
|
||||
IF(LIBRARY_OUTPUT_PATH)
|
||||
ADD_TO_DISTCLEAN( ${LIBRARY_OUTPUT_PATH} )
|
||||
ENDIF(LIBRARY_OUTPUT_PATH)
|
||||
ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY} )
|
||||
ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/Makefile )
|
||||
ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/distclean_manifest.txt )
|
||||
|
||||
FOREACH(f ${FILES_TO_DELETE})
|
||||
FILE(TO_NATIVE_PATH ${f} ff)
|
||||
FILE(APPEND ${PROJECT_BINARY_DIR}/distclean_manifest.txt ${ff})
|
||||
FILE(APPEND ${PROJECT_BINARY_DIR}/distclean_manifest.txt "\n")
|
||||
ENDFOREACH(f)
|
||||
|
||||
IF(WIN32)
|
||||
FILE( TO_NATIVE_PATH ${PROJECT_BINARY_DIR} PROJECT_BINARY_DIR_WIN32 )
|
||||
ADD_CUSTOM_TARGET(distclean
|
||||
FOR /F \"tokens=1* delims= \" %%f IN
|
||||
\(${PROJECT_BINARY_DIR_WIN32}\\distclean_manifest.txt\) DO \(
|
||||
IF EXIST %%f\\nul \(
|
||||
rd /q /s %%f
|
||||
\) ELSE \(
|
||||
IF EXIST %%f \(
|
||||
del /q /f %%f
|
||||
\) ELSE \(
|
||||
echo Warning: Problem when removing %%f. - Probable causes: File already removed or not enough permissions
|
||||
\)
|
||||
\)
|
||||
\)
|
||||
)
|
||||
ELSE(WIN32)
|
||||
# Unix
|
||||
ADD_CUSTOM_TARGET(distclean cat
|
||||
"${PROJECT_BINARY_DIR}/distclean_manifest.txt" | while read f \; do if
|
||||
\[ -e \"\$\${f}\" \]; then rm -rf \"\$\${f}\" \; else echo \"Warning:
|
||||
Problem when removing \"\$\${f}\" - Probable causes: File already
|
||||
removed or not enough permissions\" \; fi\; done COMMENT Cleaning all
|
||||
generated files...
|
||||
)
|
||||
ENDIF(WIN32)
|
||||
ENDMACRO(GENERATE_DISTCLEAN_TARGET)
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# Determine if two paths are the same
|
||||
#
|
||||
#-----------------------------------------------------------------------
|
||||
function(equal_paths VAR PATH1 PATH2)
|
||||
get_filename_component(PATH1 ${PATH1} ABSOLUTE)
|
||||
get_filename_component(PATH2 ${PATH2} ABSOLUTE)
|
||||
|
||||
if ("${PATH1}" STREQUAL "${PATH2}")
|
||||
set(${VAR} ON PARENT_SCOPE)
|
||||
else()
|
||||
set(${VAR} OFF PARENT_SCOPE)
|
||||
endif()
|
||||
endfunction(equal_paths VAR PATH1 PATH2)
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# Resolve symbolic links, remove duplicates, and remove system paths
|
||||
# in CMAKE_PREFIX_PATH
|
||||
#
|
||||
#-----------------------------------------------------------------------
|
||||
function(clean_prefix_path)
|
||||
set(_prefix_path )
|
||||
foreach(_path ${CMAKE_PREFIX_PATH})
|
||||
get_filename_component(_path ${_path} REALPATH)
|
||||
set(IS_SYS_PATH OFF)
|
||||
# loop over system path types
|
||||
foreach(_type PREFIX INCLUDE LIBRARY APPBUNDLE FRAMEWORK PROGRAM)
|
||||
# loop over system paths
|
||||
foreach(_syspath ${CMAKE_SYSTEM_${_type}_PATH})
|
||||
# check if equal
|
||||
equal_paths(IS_SYS_PATH ${_path} ${_syspath})
|
||||
# exit loop if equal
|
||||
if(IS_SYS_PATH)
|
||||
break()
|
||||
endif(IS_SYS_PATH)
|
||||
endforeach(_syspath ${CMAKE_SYSTEM_${_type}_PATH})
|
||||
# exit loop if equal
|
||||
if(IS_SYS_PATH)
|
||||
break()
|
||||
endif(IS_SYS_PATH)
|
||||
endforeach(_type PREFIX INCLUDE LIBRARY APPBUNDLE FRAMEWORK PROGRAM)
|
||||
# if not a system path
|
||||
if(NOT IS_SYS_PATH)
|
||||
list(APPEND _prefix_path ${_path})
|
||||
endif(NOT IS_SYS_PATH)
|
||||
endforeach()
|
||||
# remove any duplicates
|
||||
if(NOT "${_prefix_path}" STREQUAL "")
|
||||
list(REMOVE_DUPLICATES _prefix_path)
|
||||
endif()
|
||||
# force the new prefix path
|
||||
set(CMAKE_PREFIX_PATH ${_prefix_path} CACHE PATH
|
||||
"Prefix path for finding packages" FORCE)
|
||||
endfunction()
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# Add a defined ${PACKAGE_NAME}_ROOT variable defined via CMake or in
|
||||
# environment to the CMAKE_PREFIX_PATH
|
||||
#
|
||||
# This macro should NOT be called directly, instead call
|
||||
# ConfigureRootSearchPath (i.e. with "_" prefix)
|
||||
#-----------------------------------------------------------------------
|
||||
function(subConfigureRootSearchPath _package_name _search_other)
|
||||
|
||||
mark_as_advanced(PREVIOUS_${_package_name}_ROOT)
|
||||
|
||||
# if ROOT not already defined and ENV variable defines it
|
||||
if(NOT ${_package_name}_ROOT_DIR AND
|
||||
NOT "$ENV{${_package_name}_ROOT}" STREQUAL "")
|
||||
cache_ifnot(${_package_name}_ROOT_DIR $ENV{${_package_name}_ROOT}
|
||||
FILEPATH "ROOT search path for ${_package_name}")
|
||||
endif()
|
||||
|
||||
# if ROOT is still not defined, check upper case and capitalize version
|
||||
# and return
|
||||
if(NOT ${_package_name}_ROOT_DIR)
|
||||
if(_search_other)
|
||||
string(TOUPPER "${_package_name}" ALT_PACKAGE_NAME)
|
||||
if("${ALT_PACKAGE_NAME}" STREQUAL "${_package_name}")
|
||||
capitalize("${_package_name}" ALT_PACKAGE_NAME)
|
||||
subConfigureRootSearchPath(${ALT_PACKAGE_NAME} OFF)
|
||||
else()
|
||||
subConfigureRootSearchPath(${ALT_PACKAGE_NAME} OFF)
|
||||
endif()
|
||||
endif()
|
||||
return()
|
||||
endif()
|
||||
|
||||
# if ROOT is defined and has changed
|
||||
if(${_package_name}_ROOT_DIR AND PREVIOUS_${_package_name}_ROOT_DIR AND
|
||||
NOT "${PREVIOUS_${_package_name}_ROOT_DIR}" STREQUAL "${${_package_name}_ROOT_DIR}")
|
||||
if(NOT "${PREVIOUS_${_package_name}_ROOT_DIR}" STREQUAL "${${_package_name}_ROOT_DIR}")
|
||||
set(UNCACHE_PACKAGE_VARS ON)
|
||||
endif()
|
||||
# make sure it exists and is a directory
|
||||
if(EXISTS "${${_package_name}_ROOT_DIR}" AND
|
||||
IS_DIRECTORY "${${_package_name}_ROOT_DIR}")
|
||||
set(CMAKE_PREFIX_PATH ${${_package_name}_ROOT_DIR} ${CMAKE_PREFIX_PATH}
|
||||
CACHE PATH "CMake prefix paths" FORCE)
|
||||
# store previous root to see if it changed
|
||||
set(PREVIOUS_${_package_name}_ROOT_DIR ${${_package_name}_ROOT_DIR}
|
||||
CACHE FILEPATH "Previous root search path for ${_package_name}" FORCE)
|
||||
clean_prefix_path()
|
||||
else()
|
||||
message(WARNING "${_package_name}_ROOT_DIR specified an invalid directory")
|
||||
unset(${_package_name}_ROOT_DIR CACHE)
|
||||
endif()
|
||||
# root changed so we want to refind the package
|
||||
if(UNCACHE_PACKAGE_VARS)
|
||||
string(TOLOWER "${_package_name}" CAP_PACKAGE_NAME)
|
||||
string(SUBSTRING "${CAP_PACKAGE_NAME}" 0 1 FIRST)
|
||||
string(SUBSTRING "${CAP_PACKAGE_NAME}" 1 -1 REST)
|
||||
string(TOUPPER "${FIRST}" FIRST)
|
||||
string(CONCAT CAP_PACKAGE_NAME "${FIRST}" "${REST}")
|
||||
string(TOUPPER "${_package_name}" UPP_PACKAGE_NAME)
|
||||
string(TOLOWER "${_package_name}" LOW_PACKAGE_NAME)
|
||||
|
||||
get_cmake_property(CACHED_VARIABLES CACHE_VARIABLES)
|
||||
foreach(_name ${_package_name} ${CAP_PACKAGE_NAME}
|
||||
${UPP_PACKAGE_NAME} ${LOW_PACKAGE_NAME})
|
||||
# skip maintain
|
||||
if(NOT MAINTAIN_${_name}_CACHE)
|
||||
# loop over cached variables
|
||||
foreach(_var ${CACHED_VARIABLES})
|
||||
if("${_var}_" MATCHES "${_name}")
|
||||
if(NOT "${_var}" STREQUAL "${_name}_ROOT_DIR" AND
|
||||
NOT "${_var}" STREQUAL "PREVIOUS_${_name}_ROOT_DIR" AND
|
||||
NOT "${_var}" STREQUAL "MAINTAIN_${_name}_CACHE")
|
||||
unset(${_var} CACHE)
|
||||
list(REMOVE_ITEM CACHED_VARIABLES "${_var}")
|
||||
endif()
|
||||
endif()
|
||||
endforeach(_var ${CACHE_VARIABLES})
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
else()
|
||||
if(EXISTS "${${_package_name}_ROOT_DIR}" AND
|
||||
IS_DIRECTORY "${${_package_name}_ROOT_DIR}")
|
||||
set(_add ON)
|
||||
foreach(_path ${CMAKE_PREFIX_PATH})
|
||||
if("${_path}" STREQUAL "${${_package_name}_ROOT_DIR}")
|
||||
set(_add OFF)
|
||||
break()
|
||||
endif()
|
||||
endforeach()
|
||||
if(_add)
|
||||
set(CMAKE_PREFIX_PATH ${${_package_name}_ROOT_DIR} ${CMAKE_PREFIX_PATH}
|
||||
CACHE PATH "CMake prefix paths" FORCE)
|
||||
clean_prefix_path()
|
||||
endif()
|
||||
# store previous root to see if it changed
|
||||
set(PREVIOUS_${_package_name}_ROOT_DIR ${${_package_name}_ROOT_DIR}
|
||||
CACHE FILEPATH "Previous root search path for ${_package_name}" FORCE)
|
||||
else()
|
||||
message(WARNING "${_package_name}_ROOT_DIR specified an invalid directory")
|
||||
unset(${_package_name}_ROOT_DIR CACHE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
endfunction()
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# Add a defined ${PACKAGE_NAME}_ROOT_DIR variable defined via CMake or in
|
||||
# environment to the CMAKE_PREFIX_PATH
|
||||
#
|
||||
# Different from _ConfigureRootSearchPath
|
||||
#-----------------------------------------------------------------------
|
||||
macro(ConfigureRootSearchPath)
|
||||
foreach(_package_name ${ARGN})
|
||||
subConfigureRootSearchPath(${_package_name} ON)
|
||||
if($ENV{${_package_name}_DIR})
|
||||
set(${_package_name}_DIR "$ENV{${_package_name}_DIR}" CACHE PATH
|
||||
"CMake config directory for ${_package_name}")
|
||||
endif()
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# GENERAL
|
||||
#-----------------------------------------------------------------------
|
||||
# function add_feature(<NAME> <DOCSTRING>)
|
||||
# Add a project feature, whose activation is specified by the
|
||||
# existence of the variable <NAME>, to the list of enabled/disabled
|
||||
# features, plus a docstring describing the feature
|
||||
#
|
||||
FUNCTION(ADD_FEATURE _var _description)
|
||||
set(EXTRA_DESC "")
|
||||
foreach(currentArg ${ARGN})
|
||||
if(NOT "${currentArg}" STREQUAL "${_var}" AND
|
||||
NOT "${currentArg}" STREQUAL "${_description}")
|
||||
set(EXTRA_DESC "${EXTA_DESC}${currentArg}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
set_property(GLOBAL APPEND PROPERTY PROJECT_FEATURES ${_var})
|
||||
#set(${_var} ${${_var}} CACHE INTERNAL "${_description}${EXTRA_DESC}")
|
||||
|
||||
set_property(GLOBAL PROPERTY ${_var}_DESCRIPTION "${_description}${EXTRA_DESC}")
|
||||
ENDFUNCTION()
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
# function add_subfeature(<ROOT_OPTION> <NAME> <DOCSTRING>)
|
||||
# Add a subfeature, whose activation is specified by the
|
||||
# existence of the variable <NAME>, to the list of enabled/disabled
|
||||
# features, plus a docstring describing the feature
|
||||
#
|
||||
FUNCTION(ADD_SUBFEATURE _root _var _description)
|
||||
set(EXTRA_DESC "")
|
||||
foreach(currentArg ${ARGN})
|
||||
if(NOT "${currentArg}" STREQUAL "${_var}" AND
|
||||
NOT "${currentArg}" STREQUAL "${_description}")
|
||||
set(EXTRA_DESC "${EXTA_DESC}${currentArg}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
set_property(GLOBAL APPEND PROPERTY ${_root}_FEATURES ${_var})
|
||||
set_property(GLOBAL PROPERTY ${_root}_${_var}_DESCRIPTION "${_description}${EXTRA_DESC}")
|
||||
ENDFUNCTION()
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
# function add_option(<OPTION_NAME> <DOCSRING> <DEFAULT_SETTING> [NO_FEATURE])
|
||||
# Add an option and add as a feature if NO_FEATURE is not provided
|
||||
#
|
||||
FUNCTION(ADD_OPTION _NAME _MESSAGE _DEFAULT)
|
||||
SET(__FEATURE ${ARGN})
|
||||
OPTION(${_NAME} "${_MESSAGE}" ${_DEFAULT})
|
||||
IF(NOT "${__FEATURE}" STREQUAL "NO_FEATURE")
|
||||
ADD_FEATURE(${_NAME} "${_MESSAGE}")
|
||||
ELSE()
|
||||
MARK_AS_ADVANCED(${_NAME})
|
||||
ENDIF()
|
||||
ENDFUNCTION(ADD_OPTION _NAME _MESSAGE _DEFAULT)
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
# function add_dependent_option(<OPTION_NAME> <DOCSRING>
|
||||
# <CONDITION_TRUE_SETTING> <CONDITION>
|
||||
# <DEFAULT_SETTING> [NO_FEATURE])
|
||||
# Add an option and add as a feature if NO_FEATURE is not provided
|
||||
#
|
||||
FUNCTION(ADD_DEPENDENT_OPTION _NAME _MESSAGE _COND_SETTING _COND _DEFAULT)
|
||||
SET(_FEATURE ${ARGN})
|
||||
IF(DEFINED ${_NAME} AND NOT ${_COND})
|
||||
OPTION(${_NAME} "${_MESSAGE}" ${_DEFAULT})
|
||||
ELSE(DEFINED ${_NAME} AND NOT ${_COND})
|
||||
CMAKE_DEPENDENT_OPTION(${_NAME} "${_MESSAGE}" ${_COND_SETTING}
|
||||
"${_COND}" ${_DEFAULT})
|
||||
ENDIF(DEFINED ${_NAME} AND NOT ${_COND})
|
||||
|
||||
IF(NOT "${_FEATURE}" STREQUAL "NO_FEATURE")
|
||||
ADD_FEATURE(${_NAME} "${_MESSAGE}")
|
||||
ELSE()
|
||||
MARK_AS_ADVANCED(${_NAME})
|
||||
ENDIF()
|
||||
ENDFUNCTION(ADD_DEPENDENT_OPTION _NAME _MESSAGE _DEFAULT _COND _COND_SETTING)
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
# function print_enabled_features()
|
||||
# Print enabled features plus their docstrings.
|
||||
#
|
||||
function(print_enabled_features)
|
||||
set(_basemsg "The following features are defined/enabled (+):")
|
||||
set(_currentFeatureText "${_basemsg}")
|
||||
get_property(_features GLOBAL PROPERTY PROJECT_FEATURES)
|
||||
if(NOT "${_features}" STREQUAL "")
|
||||
list(REMOVE_DUPLICATES _features)
|
||||
list(SORT _features)
|
||||
endif()
|
||||
foreach(_feature ${_features})
|
||||
if(${_feature})
|
||||
# add feature to text
|
||||
set(_currentFeatureText "${_currentFeatureText}\n ${_feature}")
|
||||
# get description
|
||||
get_property(_desc GLOBAL PROPERTY ${_feature}_DESCRIPTION)
|
||||
# print description, if not standard ON/OFF, print what is set to
|
||||
if(_desc)
|
||||
if(NOT "${${_feature}}" STREQUAL "ON" AND
|
||||
NOT "${${_feature}}" STREQUAL "TRUE")
|
||||
set(_currentFeatureText "${_currentFeatureText}: ${_desc} -- [\"${${_feature}}\"]")
|
||||
else()
|
||||
string(REGEX REPLACE "^USE_" "" _feature_tmp "${_feature}")
|
||||
string(TOLOWER "${_feature_tmp}" _feature_tmp_l)
|
||||
capitalize("${_feature_tmp}" _feature_tmp_c)
|
||||
foreach(_var _feature_tmp _feature_tmp_l _feature_tmp_c)
|
||||
set(_ver "${${${_var}}_VERSION}")
|
||||
if(NOT "${_ver}" STREQUAL "")
|
||||
set(_desc "${_desc} -- [found version ${_ver}]")
|
||||
break()
|
||||
endif()
|
||||
unset(_ver)
|
||||
endforeach(_var _feature_tmp _feature_tmp_l _feature_tmp_c)
|
||||
set(_currentFeatureText "${_currentFeatureText}: ${_desc}")
|
||||
endif()
|
||||
set(_desc NOTFOUND)
|
||||
endif(_desc)
|
||||
# check for subfeatures
|
||||
get_property(_subfeatures GLOBAL PROPERTY ${_feature}_FEATURES)
|
||||
# remove duplicates and sort if subfeatures exist
|
||||
if(NOT "${_subfeatures}" STREQUAL "")
|
||||
list(REMOVE_DUPLICATES _subfeatures)
|
||||
list(SORT _subfeatures)
|
||||
endif()
|
||||
|
||||
# sort enabled and disabled features into lists
|
||||
set(_enabled_subfeatures )
|
||||
set(_disabled_subfeatures )
|
||||
foreach(_subfeature ${_subfeatures})
|
||||
if(${_subfeature})
|
||||
list(APPEND _enabled_subfeatures ${_subfeature})
|
||||
else()
|
||||
list(APPEND _disabled_subfeatures ${_subfeature})
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
# loop over enabled subfeatures
|
||||
foreach(_subfeature ${_enabled_subfeatures})
|
||||
# add subfeature to text
|
||||
set(_currentFeatureText "${_currentFeatureText}\n + ${_subfeature}")
|
||||
# get subfeature description
|
||||
get_property(_subdesc GLOBAL PROPERTY ${_feature}_${_subfeature}_DESCRIPTION)
|
||||
# print subfeature description. If not standard ON/OFF, print
|
||||
# what is set to
|
||||
if(_subdesc)
|
||||
if(NOT "${${_subfeature}}" STREQUAL "ON" AND
|
||||
NOT "${${_subfeature}}" STREQUAL "TRUE")
|
||||
set(_currentFeatureText "${_currentFeatureText}: ${_subdesc} -- [\"${${_subfeature}}\"]")
|
||||
else()
|
||||
set(_currentFeatureText "${_currentFeatureText}: ${_subdesc}")
|
||||
endif()
|
||||
set(_subdesc NOTFOUND)
|
||||
endif(_subdesc)
|
||||
endforeach(_subfeature)
|
||||
|
||||
# loop over disabled subfeatures
|
||||
foreach(_subfeature ${_disabled_subfeatures})
|
||||
# add subfeature to text
|
||||
set(_currentFeatureText "${_currentFeatureText}\n - ${_subfeature}")
|
||||
# get subfeature description
|
||||
get_property(_subdesc GLOBAL PROPERTY ${_feature}_${_subfeature}_DESCRIPTION)
|
||||
# print subfeature description.
|
||||
if(_subdesc)
|
||||
set(_currentFeatureText "${_currentFeatureText}: ${_subdesc}")
|
||||
set(_subdesc NOTFOUND)
|
||||
endif(_subdesc)
|
||||
endforeach(_subfeature)
|
||||
|
||||
endif(${_feature})
|
||||
endforeach(_feature)
|
||||
|
||||
if(NOT "${_currentFeatureText}" STREQUAL "${_basemsg}")
|
||||
message(STATUS "${_currentFeatureText}\n")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
# function print_disabled_features()
|
||||
# Print disabled features plus their docstrings.
|
||||
#
|
||||
function(print_disabled_features)
|
||||
set(_basemsg "The following features are NOT defined/enabled (-):")
|
||||
set(_currentFeatureText "${_basemsg}")
|
||||
get_property(_features GLOBAL PROPERTY PROJECT_FEATURES)
|
||||
if(NOT "${_features}" STREQUAL "")
|
||||
list(REMOVE_DUPLICATES _features)
|
||||
list(SORT _features)
|
||||
endif()
|
||||
foreach(_feature ${_features})
|
||||
if(NOT ${_feature})
|
||||
set(_currentFeatureText "${_currentFeatureText}\n ${_feature}")
|
||||
|
||||
get_property(_desc GLOBAL PROPERTY ${_feature}_DESCRIPTION)
|
||||
|
||||
if(_desc)
|
||||
set(_currentFeatureText "${_currentFeatureText}: ${_desc}")
|
||||
set(_desc NOTFOUND)
|
||||
endif(_desc)
|
||||
endif()
|
||||
endforeach(_feature)
|
||||
|
||||
if(NOT "${_currentFeatureText}" STREQUAL "${_basemsg}")
|
||||
message(STATUS "${_currentFeatureText}\n")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
# function print_features()
|
||||
# Print all features plus their docstrings.
|
||||
#
|
||||
function(print_features)
|
||||
message(STATUS "")
|
||||
print_enabled_features()
|
||||
print_disabled_features()
|
||||
endfunction()
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
macro(DETERMINE_LIBDIR_DEFAULT VAR)
|
||||
set(_LIBDIR_DEFAULT "lib")
|
||||
# Override this default 'lib' with 'lib64' iff:
|
||||
# - we are on Linux system but NOT cross-compiling
|
||||
# - we are NOT on debian
|
||||
# - we are on a 64 bits system
|
||||
# reason is: amd64 ABI: https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI
|
||||
# For Debian with multiarch, use 'lib/${CMAKE_LIBRARY_ARCHITECTURE}' if
|
||||
# CMAKE_LIBRARY_ARCHITECTURE is set (which contains e.g. "i386-linux-gnu"
|
||||
# and CMAKE_INSTALL_PREFIX is "/usr"
|
||||
# See http://wiki.debian.org/Multiarch
|
||||
if(DEFINED _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX)
|
||||
set(__LAST_LIBDIR_DEFAULT "lib")
|
||||
# __LAST_LIBDIR_DEFAULT is the default value that we compute from
|
||||
# _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX, not a cache entry for
|
||||
# the value that was last used as the default.
|
||||
# This value is used to figure out whether the user changed the
|
||||
# LIBDIR_DEFAULT value manually, or if the value was the
|
||||
# default one. When CMAKE_INSTALL_PREFIX changes, the value is
|
||||
# updated to the new default, unless the user explicitly changed it.
|
||||
endif()
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU)$"
|
||||
AND NOT CMAKE_CROSSCOMPILING)
|
||||
if (EXISTS "/etc/debian_version") # is this a debian system ?
|
||||
if(CMAKE_LIBRARY_ARCHITECTURE)
|
||||
if("${CMAKE_INSTALL_PREFIX}" MATCHES "^/usr/?$")
|
||||
set(_LIBDIR_DEFAULT "lib/${CMAKE_LIBRARY_ARCHITECTURE}")
|
||||
endif()
|
||||
if(DEFINED _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX
|
||||
AND "${_GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX}" MATCHES "^/usr/?$")
|
||||
set(__LAST_LIBDIR_DEFAULT "lib/${CMAKE_LIBRARY_ARCHITECTURE}")
|
||||
endif()
|
||||
endif()
|
||||
else() # not debian, rely on CMAKE_SIZEOF_VOID_P:
|
||||
if(NOT DEFINED CMAKE_SIZEOF_VOID_P)
|
||||
message(AUTHOR_WARNING
|
||||
"Unable to determine default LIBDIR_DEFAULT directory "
|
||||
"because no target architecture is known. "
|
||||
"Please enable at least one language before including GNUInstallDirs.")
|
||||
else()
|
||||
if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
|
||||
set(_LIBDIR_DEFAULT "lib64")
|
||||
if(DEFINED _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX)
|
||||
set(__LAST_LIBDIR_DEFAULT "lib64")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# if assign to another variable
|
||||
if(NOT "${VAR}" STREQUAL "LIBDIR_DEFAULT")
|
||||
set(${VAR} "${_LIBDIR_DEFAULT}")
|
||||
endif(NOT "${VAR}" STREQUAL "LIBDIR_DEFAULT")
|
||||
|
||||
# cache the value
|
||||
if(NOT DEFINED LIBDIR_DEFAULT)
|
||||
set(LIBDIR_DEFAULT "${_LIBDIR_DEFAULT}" CACHE PATH "Object code libraries (${_LIBDIR_DEFAULT})" FORCE)
|
||||
elseif(DEFINED __LAST_LIBDIR_DEFAULT
|
||||
AND "${__LAST_LIBDIR_DEFAULT}" STREQUAL "${LIBDIR_DEFAULT}")
|
||||
set_property(CACHE LIBDIR_DEFAULT PROPERTY VALUE "${_LIBDIR_DEFAULT}")
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
# macro CACHE_VARIABLES_FOR_REFERENCE(...)
|
||||
# Provide a list of variables that will be stored in the cache
|
||||
# as {variable_name}_REF for later reference
|
||||
# This version does not force the cache to be updated
|
||||
macro(CACHE_VARIABLES_FOR_REFERENCE)
|
||||
foreach(_var ${ARGN})
|
||||
set(${_var}_REF ${${_var}} CACHE STRING
|
||||
"Cached reference of ${_var} under ${_var}_REF for later comparison")
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
# macro CACHE_VARIABLES_FOR_REFERENCE(...)
|
||||
# Provide a list of variables that will be stored in the cache
|
||||
# as {variable_name}_REF for later reference
|
||||
# This version forces the cache to be updated
|
||||
macro(UPDATE_REFERENCE_CACHE_VARIABLES)
|
||||
foreach(_var ${ARGN})
|
||||
set(${_var}_REF ${${_var}} CACHE STRING
|
||||
"Cached reference of ${_var} under ${_var}_REF for later comparison"
|
||||
FORCE)
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
# macro GET_HOSTNAME(<VAR>)
|
||||
#
|
||||
function(GET_HOSTNAME VAR)
|
||||
find_program(HOSTNAME_CMD hostname)
|
||||
execute_process(COMMAND ${HOSTNAME_CMD}
|
||||
OUTPUT_VARIABLE _HOSTNAME
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
set(${VAR} "${_HOSTNAME}" PARENT_SCOPE)
|
||||
endfunction(GET_HOSTNAME VAR)
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
# macro CHECKOUT_GIT_SUBMODULE()
|
||||
#
|
||||
# Run "git submodule update" if a file in a submodule does not exist
|
||||
#
|
||||
# ARGS:
|
||||
# RECURSIVE (option) -- add "--recursive" flag
|
||||
# RELATIVE_PATH (one value) -- typically the relative path to submodule
|
||||
# from PROJECT_SOURCE_DIR
|
||||
# WORKING_DIRECTORY (one value) -- (default: PROJECT_SOURCE_DIR)
|
||||
# TEST_FILE (one value) -- file to check for (default: CMakeLists.txt)
|
||||
# ADDITIONAL_CMDS (many value) -- any addition commands to pass
|
||||
#
|
||||
macro(CHECKOUT_GIT_SUBMODULE)
|
||||
|
||||
# parse args
|
||||
cmake_parse_arguments(
|
||||
CHECKOUT
|
||||
"RECURSIVE"
|
||||
"RELATIVE_PATH;WORKING_DIRECTORY;TEST_FILE"
|
||||
"ADDITIONAL_CMDS"
|
||||
${ARGN})
|
||||
|
||||
if(NOT CHECKOUT_WORKING_DIRECTORY)
|
||||
set(CHECKOUT_WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
|
||||
endif(NOT CHECKOUT_WORKING_DIRECTORY)
|
||||
|
||||
if(NOT CHECKOUT_TEST_FILE)
|
||||
set(CHECKOUT_TEST_FILE "CMakeLists.txt")
|
||||
endif(NOT CHECKOUT_TEST_FILE)
|
||||
|
||||
set(_DIR "${CHECKOUT_WORKING_DIRECTORY}/${CHECKOUT_RELATIVE_PATH}")
|
||||
# ensure the (possibly empty) directory exists
|
||||
if(NOT EXISTS "${_DIR}")
|
||||
message(FATAL_ERROR "submodule directory does not exist")
|
||||
endif(NOT EXISTS "${_DIR}")
|
||||
|
||||
# if this file exists --> project has been checked out
|
||||
# if not exists --> not been checked out
|
||||
set(_TEST_FILE "${_DIR}/${CHECKOUT_TEST_FILE}")
|
||||
|
||||
# if the module has not been checked out
|
||||
if(NOT EXISTS "${_TEST_FILE}")
|
||||
find_package(Git REQUIRED)
|
||||
|
||||
set(_RECURSE )
|
||||
if(CHECKOUT_RECURSIVE)
|
||||
set(_RECURSE --recursive)
|
||||
endif(CHECKOUT_RECURSIVE)
|
||||
|
||||
# perform the checkout
|
||||
execute_process(
|
||||
COMMAND
|
||||
${GIT_EXECUTABLE} submodule update --init ${_RECURSE}
|
||||
${CHECKOUT_ADDITIONAL_CMDS} ${CHECKOUT_RELATIVE_PATH}
|
||||
WORKING_DIRECTORY
|
||||
${CHECKOUT_WORKING_DIRECTORY}
|
||||
RESULT_VARIABLE RET)
|
||||
|
||||
# check the return code
|
||||
if(RET GREATER 0)
|
||||
|
||||
set(_CMD "${GIT_EXECUTABLE} submodule update --init ${_RECURSE}
|
||||
${CHECKOUT_ADDITIONAL_CMDS} ${CHECKOUT_RELATIVE_PATH}")
|
||||
message(STATUS "macro(CHECKOUT_SUBMODULE) failed.")
|
||||
message(FATAL_ERROR "Command: \"${_CMD}\"")
|
||||
|
||||
endif(RET GREATER 0)
|
||||
|
||||
endif(NOT EXISTS "${_TEST_FILE}")
|
||||
|
||||
endmacro(CHECKOUT_GIT_SUBMODULE)
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# Macro for building library
|
||||
#
|
||||
macro(BUILD_LIBRARY)
|
||||
cmake_parse_arguments(LIB
|
||||
"VERSION" "TYPE;TARGET_NAME;OUTPUT_NAME;EXTENSION" "LINK_LIBRARIES;SOURCES;EXTRA_ARGS"
|
||||
${ARGN})
|
||||
|
||||
macro(setifnot VAR)
|
||||
if(NOT ${VAR} OR "${${VAR}}" STREQUAL "")
|
||||
set(${VAR} ${ARGN})
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
setifnot(LIB_EXTENSION ${PYTHON_MODULE_EXTENSION})
|
||||
setifnot(LIB_OUTPUT_NAME ${LIB_TARGET_NAME})
|
||||
|
||||
add_library(${LIB_TARGET_NAME} ${LIB_TYPE} ${LIB_SOURCES})
|
||||
|
||||
if(LIB_VERSION)
|
||||
list(APPEND LIB_EXTRA_ARGS VERSION ${${PROJECT_NAME}_VERSION}
|
||||
SOVERSION ${${PROJECT_NAME}_VERSION_MAJOR})
|
||||
endif()
|
||||
|
||||
target_link_libraries(${LIB_TARGET_NAME} PUBLIC
|
||||
${EXTERNAL_LIBRARIES} ${LIB_LINK_LIBRARIES}
|
||||
PRIVATE ${PRIVATE_EXTERNAL_LIBRARIES})
|
||||
|
||||
set_target_properties(${LIB_TARGET_NAME}
|
||||
PROPERTIES
|
||||
OUTPUT_NAME ${LIB_OUTPUT_NAME}
|
||||
LANGUAGE CXX
|
||||
LINKER_LANGUAGE CXX
|
||||
POSITION_INDEPENDENT_CODE ON
|
||||
${LIB_EXTRA_ARGS})
|
||||
|
||||
target_compile_definitions(${LIB_TARGET_NAME} PUBLIC
|
||||
${${PROJECT_NAME}_DEFINITIONS})
|
||||
|
||||
target_compile_features(${LIB_TARGET_NAME}
|
||||
PUBLIC cxx_std_${GEANT4_BUILD_CXXSTD})
|
||||
|
||||
get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES)
|
||||
|
||||
if("CUDA" IN_LIST languages)
|
||||
target_compile_options(${LIB_TARGET_NAME} PUBLIC
|
||||
$<$<COMPILE_LANGUAGE:C>:${${PROJECT_NAME}_C_FLAGS} ${LIB_CFLAGS}>
|
||||
$<$<COMPILE_LANGUAGE:CXX>:${${PROJECT_NAME}_CXX_FLAGS} ${LIB_CXXFLAGS}>
|
||||
$<$<COMPILE_LANGUAGE:CUDA>:${${PROJECT_NAME}_CUDA_FLAGS} ${LIB_CUDAFLAGS}>)
|
||||
else()
|
||||
target_compile_options(${LIB_TARGET_NAME} PUBLIC
|
||||
$<$<COMPILE_LANGUAGE:C>:${${PROJECT_NAME}_C_FLAGS} ${LIB_CFLAGS}>
|
||||
$<$<COMPILE_LANGUAGE:CXX>:${${PROJECT_NAME}_CXX_FLAGS} ${LIB_CXXFLAGS}>)
|
||||
endif()
|
||||
|
||||
list(APPEND INSTALL_LIBRARIES ${TARGET_NAME})
|
||||
endmacro(BUILD_LIBRARY)
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# function add_enabled_interface(<NAME>)
|
||||
# Mark an interface library as enabled
|
||||
#
|
||||
FUNCTION(PTL_ADD_ENABLED_INTERFACE _var)
|
||||
set_property(GLOBAL APPEND PROPERTY ${PROJECT_NAME}_ENABLED_INTERFACES ${_var})
|
||||
ENDFUNCTION()
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# function add_disabled_interface(<NAME>)
|
||||
# Mark an interface as disabled
|
||||
#
|
||||
FUNCTION(PTL_ADD_DISABLED_INTERFACE _var)
|
||||
get_property(_DISABLED GLOBAL PROPERTY ${PROJECT_NAME}_DISABLED_INTERFACES)
|
||||
if(NOT ${_var} IN_LIST _DISABLED)
|
||||
set_property(GLOBAL APPEND PROPERTY ${PROJECT_NAME}_DISABLED_INTERFACES ${_var})
|
||||
endif()
|
||||
ENDFUNCTION()
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------------------#
|
||||
# macro to add an interface lib
|
||||
#
|
||||
FUNCTION(PTL_ADD_INTERFACE_LIBRARY _TARGET)
|
||||
if(NOT TARGET ${_TARGET})
|
||||
add_library(${_TARGET} INTERFACE ${ARGN})
|
||||
set_property(GLOBAL APPEND PROPERTY ${PROJECT_NAME}_INTERFACE_LIBRARIES ${_TARGET})
|
||||
ptl_add_enabled_interface(${_TARGET})
|
||||
install(TARGETS ${_TARGET}
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
EXPORT ${PROJECT_NAME}Targets
|
||||
COMPONENT development)
|
||||
endif()
|
||||
ENDFUNCTION()
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------------------#
|
||||
# get the list of interface libraries
|
||||
#
|
||||
FUNCTION(PTL_GET_INTERFACE_LIBRARIES _VAR)
|
||||
get_property(_LIBS GLOBAL PROPERTY ${PROJECT_NAME}_INTERFACE_LIBRARIES)
|
||||
set(${_VAR} ${_LIBS} PARENT_SCOPE)
|
||||
ENDFUNCTION()
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
# always determine the default lib directory
|
||||
DETERMINE_LIBDIR_DEFAULT(LIBDIR_DEFAULT)
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
# get the hostname
|
||||
get_hostname(HOSTNAME)
|
||||
string(REPLACE ".local" "" HOSTNAME "${HOSTNAME}")
|
||||
|
||||
|
||||
cmake_policy(POP)
|
||||
|
||||
+107
@@ -0,0 +1,107 @@
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# PTL Options
|
||||
#
|
||||
################################################################################
|
||||
|
||||
include(MacroUtilities)
|
||||
|
||||
set(_FEATURE )
|
||||
if(NOT PTL_MASTER_PROJECT)
|
||||
set(_FEATURE NO_FEATURE)
|
||||
endif()
|
||||
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON CACHE BOOL "Require the C++ standard" FORCE)
|
||||
set(CMAKE_CXX_EXTENSIONS OFF CACHE BOOL "Disable GNU extensions")
|
||||
|
||||
# features
|
||||
add_feature(CMAKE_BUILD_TYPE "Build type (Debug, Release, RelWithDebInfo, MinSizeRel)")
|
||||
add_feature(CMAKE_INSTALL_PREFIX "Installation prefix")
|
||||
add_feature(CMAKE_CXX_STANDARD "C++11 STL standard")
|
||||
add_feature(${PROJECT_NAME}_C_FLAGS "C flags for project")
|
||||
add_feature(${PROJECT_NAME}_CXX_FLAGS "C++ flags for project")
|
||||
|
||||
# options (always available)
|
||||
add_option(BUILD_STATIC_LIBS "Build static library" ON ${_FEATURE})
|
||||
add_option(BUILD_SHARED_LIBS "Build shared library" ON ${_FEATURE})
|
||||
add_option(PTL_BUILD_EXAMPLES "Build examples" OFF ${_FEATURE})
|
||||
add_option(PTL_BUILD_DOCS "Build documentation with Doxygen" OFF ${_FEATURE})
|
||||
add_option(PTL_DEVELOPER_INSTALL "Install headers, cmake export, and shared libs" ON ${_FEATURE})
|
||||
|
||||
add_option(PTL_USE_TBB "Enable TBB" ON ${_FEATURE})
|
||||
add_option(PTL_USE_GPU "Enable GPU preprocessor" OFF ${_FEATURE})
|
||||
add_option(PTL_USE_SANITIZER "Enable -fsanitize=<type>" OFF ${_FEATURE})
|
||||
add_option(PTL_USE_CLANG_TIDY "Enable running clang-tidy on" OFF ${_FEATURE})
|
||||
add_option(PTL_USE_COVERAGE "Enable code coverage" OFF ${_FEATURE})
|
||||
add_option(PTL_USE_PROFILE "Enable profiling" OFF ${_FEATURE})
|
||||
|
||||
if(PTL_USE_ARCH)
|
||||
add_option(PTL_USE_AVX512 "Enable AVX-512 flags (if available)" OFF ${_FEATURE})
|
||||
endif()
|
||||
|
||||
if(PTL_USE_SANITIZER)
|
||||
add_feature(PTL_SANITIZER_TYPE "Sanitizer type (-fsanitize=<type>)")
|
||||
set(PTL_SANITIZER_TYPE leak CACHE STRING "Sanitizer type (-fsanitize=<type>)")
|
||||
endif()
|
||||
|
||||
if(PTL_USE_GPU)
|
||||
# Check if CUDA can be enabled
|
||||
find_package(CUDA QUIET)
|
||||
if(CUDA_FOUND)
|
||||
check_language(CUDA)
|
||||
if(CMAKE_CUDA_COMPILER)
|
||||
enable_language(CUDA)
|
||||
else()
|
||||
message(STATUS "No CUDA support")
|
||||
set(_USE_CUDA OFF)
|
||||
endif()
|
||||
else()
|
||||
set(_USE_CUDA OFF)
|
||||
set(PTL_USE_GPU OFF)
|
||||
endif()
|
||||
|
||||
if(_USE_CUDA)
|
||||
list(APPEND ${PROJECT_NAME}_DEFINITIONS PTL_USE_GPU)
|
||||
add_option(PTL_USE_CUDA "Enable CUDA option for GPU execution" ${_USE_CUDA} ${_FEATURE})
|
||||
add_option(PTL_USE_NVTX "Enable NVTX for Nsight" ${_USE_CUDA} ${_FEATURE})
|
||||
|
||||
set(CUDA_ARCH "sm_35" CACHE STRING "CUDA architecture flag")
|
||||
if(_FEATURE)
|
||||
add_feature(CUDA_ARCH "CUDA architecture (e.g. sm_35)")
|
||||
add_feature(CUDA_GENERATED_OUTPUT_DIR "CUDA output directory for generated files")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
endif()
|
||||
|
||||
# RPATH settings
|
||||
set(_RPATH_LINK OFF)
|
||||
if(APPLE)
|
||||
set(_RPATH_LINK ON)
|
||||
endif()
|
||||
add_option(CMAKE_INSTALL_RPATH_USE_LINK_PATH "Hardcode installation rpath based on link path" ${_RPATH_LINK} ${_FEATURE})
|
||||
unset(_RPATH_LINK)
|
||||
|
||||
# clang-tidy
|
||||
if(PTL_USE_CLANG_TIDY)
|
||||
find_program(CLANG_TIDY_COMMAND NAMES clang-tidy)
|
||||
add_feature(CLANG_TIDY_COMMAND "Path to clang-tidy command")
|
||||
if(NOT CLANG_TIDY_COMMAND)
|
||||
message(WARNING "PTL_USE_CLANG_TIDY is ON but clang-tidy is not found!")
|
||||
set(PTL_USE_CLANG_TIDY OFF)
|
||||
else()
|
||||
set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_COMMAND}")
|
||||
|
||||
# Create a preprocessor definition that depends on .clang-tidy content so
|
||||
# the compile command will change when .clang-tidy changes. This ensures
|
||||
# that a subsequent build re-runs clang-tidy on all sources even if they
|
||||
# do not otherwise need to be recompiled. Nothing actually uses this
|
||||
# definition. We add it to targets on which we run clang-tidy just to
|
||||
# get the build dependency on the .clang-tidy file.
|
||||
file(SHA1 ${PROJECT_SOURCE_DIR}/.clang-tidy clang_tidy_sha1)
|
||||
set(CLANG_TIDY_DEFINITIONS "CLANG_TIDY_SHA1=${clang_tidy_sha1}")
|
||||
unset(clang_tidy_sha1)
|
||||
endif()
|
||||
configure_file(${PROJECT_SOURCE_DIR}/.clang-tidy ${PROJECT_SOURCE_DIR}/.clang-tidy COPYONLY)
|
||||
endif()
|
||||
@@ -0,0 +1,46 @@
|
||||
#
|
||||
# Find packages
|
||||
#
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
include(MacroUtilities)
|
||||
|
||||
ptl_add_interface_library(ptl-external-packages)
|
||||
ptl_add_interface_library(ptl-threads)
|
||||
ptl_add_interface_library(ptl-tbb)
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# Threads
|
||||
#
|
||||
################################################################################
|
||||
|
||||
if(NOT WIN32)
|
||||
set(CMAKE_THREAD_PREFER_PTHREAD ON)
|
||||
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||
endif()
|
||||
|
||||
find_package(Threads)
|
||||
if(Threads_FOUND)
|
||||
target_link_libraries(ptl-threads INTERFACE Threads::Threads)
|
||||
target_link_libraries(ptl-external-packages INTERFACE ptl-threads)
|
||||
endif()
|
||||
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# TBB
|
||||
#
|
||||
################################################################################
|
||||
|
||||
if(PTL_USE_TBB)
|
||||
find_package(TBB)
|
||||
|
||||
if(TBB_FOUND)
|
||||
target_compile_definitions(ptl-tbb INTERFACE PTL_USE_TBB)
|
||||
target_include_directories(ptl-tbb SYSTEM INTERFACE ${TBB_INCLUDE_DIRS})
|
||||
target_link_libraries(ptl-tbb INTERFACE ${TBB_LIBRARIES})
|
||||
target_link_libraries(ptl-external-packages INTERFACE ptl-tbb)
|
||||
endif()
|
||||
|
||||
endif()
|
||||
@@ -0,0 +1,34 @@
|
||||
################################################################################
|
||||
#
|
||||
# Project settings
|
||||
#
|
||||
################################################################################
|
||||
|
||||
string(TOUPPER "${CMAKE_BUILD_TYPE}" _CONFIG)
|
||||
|
||||
add_feature(CMAKE_C_FLAGS_${_CONFIG} "C compiler build-specific flags")
|
||||
add_feature(CMAKE_CXX_FLAGS_${_CONFIG} "C++ compiler build-specific flags")
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# installation directories
|
||||
#
|
||||
################################################################################
|
||||
|
||||
# cmake installation folder
|
||||
set(CMAKE_INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME})
|
||||
|
||||
# create the full path version and generic path versions
|
||||
foreach(_TYPE in DATAROOT CMAKE INCLUDE LIB BIN MAN DOC)
|
||||
# set the absolute versions
|
||||
if(NOT IS_ABSOLUTE "${CMAKE_INSTALL_${_TYPE}DIR}")
|
||||
set(CMAKE_INSTALL_FULL_${_TYPE}DIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_${_TYPE}DIR})
|
||||
else(NOT IS_ABSOLUTE "${CMAKE_INSTALL_${_TYPE}DIR}")
|
||||
set(CMAKE_INSTALL_FULL_${_TYPE}DIR ${CMAKE_INSTALL_${_TYPE}DIR})
|
||||
endif(NOT IS_ABSOLUTE "${CMAKE_INSTALL_${_TYPE}DIR}")
|
||||
|
||||
# generic "PROJECT_INSTALL_" variables (used by documentation)"
|
||||
set(PROJECT_INSTALL_${_TYPE}DIR ${CMAKE_INSTALL_${TYPE}DIR})
|
||||
set(PROJECT_INSTALL_FULL_${_TYPE}DIR ${CMAKE_INSTALL_FULL_${TYPE}DIR})
|
||||
|
||||
endforeach(_TYPE in DATAROOT CMAKE INCLUDE LIB BIN MAN DOC)
|
||||
Reference in New Issue
Block a user