|
| 1 | +### CMakeList for TCoDe |
| 2 | +cmake_minimum_required(VERSION 3.2) |
| 3 | + |
| 4 | +# project name |
| 5 | +project(TCoDe) |
| 6 | + |
| 7 | +# warn user if system is not UNIX |
| 8 | +if(NOT UNIX) |
| 9 | + message(FATAL_ERROR "This is an unsupported system.") |
| 10 | +endif() |
| 11 | + |
| 12 | +#cmake path dir |
| 13 | +SET(TCoDe_CMAKE_DIR "${PROJECT_SOURCE_DIR}/cmake") |
| 14 | +SET(CMAKE_MODULE_PATH "${TCoDe_CMAKE_DIR}" ${CMAKE_MODULE_PATH}) |
| 15 | +SET(CMAKE_VERBOSE_MAKEFILE ON) |
| 16 | + |
| 17 | +#check if compiler is C++14 compliant |
| 18 | +include(CheckCXXCompilerFlag) |
| 19 | +CHECK_CXX_COMPILER_FLAG("--std=c++14" COMPILER_SUPPORTS_CXX14) |
| 20 | +if(NOT COMPILER_SUPPORTS_CXX14) |
| 21 | + message(FATAL "The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler.") |
| 22 | +endif() |
| 23 | + |
| 24 | +#compiler flags |
| 25 | +if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") |
| 26 | + |
| 27 | + MESSAGE(STATUS "Setting Clang flags") |
| 28 | + set(CMAKE_CXX_FLAGS " --std=c++14 -W -march=native -fPIC -O3 -ldl" CACHE STRING "compile flags" FORCE) |
| 29 | + |
| 30 | +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") |
| 31 | + |
| 32 | + MESSAGE(STATUS "Setting GCC flags") |
| 33 | + set(CMAKE_CXX_FLAGS " --std=c++14 -W -march=native -fPIC -O4 -ldl" CACHE STRING "compile flags" FORCE) |
| 34 | + |
| 35 | +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") |
| 36 | + |
| 37 | + MESSAGE(STATUS "Setting ICC flags") |
| 38 | + set(CMAKE_CXX_FLAGS " --std=c++14 -W -march=native -fPIC -O4 -ldl" CACHE STRING "compile flags" FORCE) |
| 39 | + |
| 40 | +#elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") |
| 41 | + #MESSAGE(STATUS "===> Compiling with MSVC") |
| 42 | +endif() |
| 43 | + |
| 44 | +# get Hydra |
| 45 | +find_package(Hydra REQUIRED) |
| 46 | +include_directories(${HYDRA_INCLUDE_DIR}) |
| 47 | + |
| 48 | + |
| 49 | +# get libconfig |
| 50 | +find_package(LibConfig REQUIRED) |
| 51 | +include_directories(${LIBCONFIG_INCLUDE_DIR}) |
| 52 | +link_directories(${LIBCONFIG_LIBRARY}) |
| 53 | + |
| 54 | + |
| 55 | +# get TCLAP |
| 56 | +find_package(TCLAP REQUIRED) |
| 57 | +include_directories(${TCLAP_INCLUDE_DIR}) |
| 58 | + |
| 59 | +# get ROOT |
| 60 | +find_package(ROOT COMPONENTS Minuit2 TreePlayer) |
| 61 | +if(ROOT_FOUND) |
| 62 | +include_directories(${ROOT_INCLUDE_DIR}) |
| 63 | +link_directories(${ROOT_LIBRARY_DIR}) |
| 64 | +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_ROOT_AVAILABLE_") |
| 65 | +if(${ROOT_Minuit2_LIBRARY} MATCHES "libMinuit2.so") |
| 66 | +set(Minuit2_FOUND ON) |
| 67 | +else(Minuit2_FOUND OFF) |
| 68 | +endif() |
| 69 | +endif(ROOT_FOUND) |
| 70 | + |
| 71 | +#get CUDA |
| 72 | +find_package(CUDA 8.0) |
| 73 | +if(CUDA_FOUND) |
| 74 | +link_directories( ${CUDA_TOOLKIT_ROOT_DIR}/lib64/) |
| 75 | + |
| 76 | +#set cuda flags |
| 77 | +SET(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -ftemplate-backtrace-limit=0; --cudart; static; -O4; --expt-relaxed-constexpr; -fmad=true; --expt-extended-lambda;--relocatable-device-code=false ; |
| 78 | +-Xptxas -dlcm=ca; -Xptxas --opt-level=4 ) |
| 79 | + |
| 80 | +SET(CUDA_PROPAGATE_HOST_FLAGS ON) |
| 81 | +SET(CUDA_SEPARABLE_COMPILATION OFF) |
| 82 | +SET(CUDA_VERBOSE_BUILD OFF) |
| 83 | + |
| 84 | +if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.8) |
| 85 | + LIST(APPEND CUDA_NVCC_FLAGS " -Xcompiler -D_MWAITXINTRIN_H_INCLUDED ") |
| 86 | +endif() |
| 87 | + |
| 88 | +if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 5.4) |
| 89 | + LIST(APPEND CUDA_NVCC_FLAGS " -Xcompiler -D__CORRECT_ISO_CPP14_MATH_H_PROTO ") |
| 90 | +endif() |
| 91 | +# Detect CUDA architecture and get best NVCC flags |
| 92 | + |
| 93 | +INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindCudaArch.cmake) |
| 94 | + |
| 95 | +SELECT_NVCC_ARCH_FLAGS(NVCC_FLAGS_EXTRA) |
| 96 | + |
| 97 | +LIST(APPEND CUDA_NVCC_FLAGS ${NVCC_FLAGS_EXTRA}) |
| 98 | + |
| 99 | +endif(CUDA_FOUND) |
| 100 | + |
| 101 | +#get TBB |
| 102 | +find_package(TBB ) |
| 103 | +if(TBB_FOUND) |
| 104 | +include_directories(${TBB_INCLUDE_DIRS}) |
| 105 | +link_directories(${TBB_LIBRARY}) |
| 106 | +endif(TBB_FOUND) |
| 107 | + |
| 108 | +#get OpenMP |
| 109 | +find_package(OpenMP) |
| 110 | +if(OPENMP_CXX_FOUND OR OPENMP_FOUND) |
| 111 | +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") |
| 112 | +endif(OPENMP_CXX_FOUND OR OPENMP_FOUND) |
| 113 | + |
| 114 | +#generate API documentation with Doxygen |
| 115 | +find_package(Doxygen) |
| 116 | +option(BUILD_DOCUMENTATION "Create and install the HTML based API documentation (requires Doxygen)" NO) |
| 117 | + |
| 118 | +# examples etc |
| 119 | +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) |
| 120 | +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) |
| 121 | + |
| 122 | +#always on |
| 123 | +SET(BUILD_CPP_TARGETS ON) |
| 124 | + |
| 125 | +#crucial for clang build, where openmp support is not embeded in the compiler |
| 126 | +if( OPENMP_CXX_FOUND OR OPENMP_FOUND) |
| 127 | + |
| 128 | + SET(BUILD_OMP_TARGETS ON) |
| 129 | +else() |
| 130 | + SET(BUILD_OMP_TARGETS OFF) |
| 131 | +endif() |
| 132 | + |
| 133 | +#not every computer has a GPU and/or cuda installed or |
| 134 | +if( CUDA_FOUND ) |
| 135 | + SET(BUILD_CUDA_TARGETS ON) |
| 136 | +else() |
| 137 | + SET(BUILD_CUDA_TARGETS OFF) |
| 138 | +endif() |
| 139 | + |
| 140 | +# to enable tbb builds |
| 141 | +if(TBB_FOUND) |
| 142 | + SET(BUILD_TBB_TARGETS ON) |
| 143 | +else() |
| 144 | + SET(BUILD_TBB_TARGETS OFF) |
| 145 | +endif(TBB_FOUND) |
| 146 | + |
| 147 | +# messages |
| 148 | +MESSAGE(STATUS "TCLAP Include path: ${TCLAP_INCLUDE_DIR}") |
| 149 | +MESSAGE(STATUS "ROOT include path: ${ROOT_INCLUDE_DIR}") |
| 150 | +MESSAGE(STATUS "ROOT library path: ${ROOT_LIBRARY_DIR}" ) |
| 151 | +MESSAGE(STATUS "ROOT libraries: ${ROOT_LIBRARIES}") |
| 152 | +MESSAGE(STATUS "ROOT::Minuit2: ${ROOT_Minuit2_LIBRARY}") |
| 153 | +MESSAGE(STATUS "Build CUDA/NVCC-based targets: ${BUILD_CUDA_TARGETS}") |
| 154 | +MESSAGE(STATUS "CUDA include: ${CUDA_INCLUDE_DIRS}" ) |
| 155 | +MESSAGE(STATUS "CUDA libraries: ${CUDA_LIBRARIES}" ) |
| 156 | +MESSAGE(STATUS "NVCC flags: ${CUDA_NVCC_FLAGS}" ) |
| 157 | +MESSAGE(STATUS "Build TBB targets: ${BUILD_TBB_TARGETS}") |
| 158 | +MESSAGE(STATUS "TBB include: ${TBB_INCLUDE_DIRS}" ) |
| 159 | +MESSAGE(STATUS "TBB libraries: ${TBB_LIBRARIES}" ) |
| 160 | +MESSAGE(STATUS "Build OpenMP targets: ${BUILD_OMP_TARGETS}") |
| 161 | +MESSAGE(STATUS "OpenMP flags: ${OpenMP_CXX_FLAGS}" ) |
| 162 | +MESSAGE(STATUS "OpenMP libraries: ${OpenMP_CXX_LIBRARIES}" ) |
| 163 | +MESSAGE(STATUS "Host compiler flags: ${CMAKE_CXX_FLAGS}" ) |
| 164 | +MESSAGE(STATUS "Install diretory: ${CMAKE_INSTALL_PREFIX}" ) |
| 165 | +MESSAGE(STATUS "Project source dir: ${PROJECT_SOURCE_DIR}" ) |
| 166 | +MESSAGE(STATUS "Project build dir: ${PROJECT_BINARY_DIR}" ) |
| 167 | + |
| 168 | +#+++++++++++++++++++++++++++ |
| 169 | +# targets + |
| 170 | +#+++++++++++++++++++++++++++ |
| 171 | +include(${TCoDe_CMAKE_DIR}/AddAnalysisTarget.cmake) |
| 172 | + |
| 173 | +ADD_ANALYSIS(simulation) |
| 174 | +ADD_ANALYSIS(loadmaps) |
| 175 | + |
0 commit comments