-
Notifications
You must be signed in to change notification settings - Fork 119
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
353 lines (288 loc) · 12.5 KB
/
CMakeLists.txt
File metadata and controls
353 lines (288 loc) · 12.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
PROJECT( DD4hep LANGUAGES NONE)
SET_PROPERTY(DIRECTORY . PROPERTY PACKAGE_NAME DD4hep)
#################
# Setup version #
#################
SET( DD4hep_VERSION_MAJOR 1 )
SET( DD4hep_VERSION_MINOR 35 )
SET( DD4hep_VERSION_PATCH 0 )
#######################
# Basic project setup #
#######################
set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake )
IF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
SET( CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR} CACHE PATH
"install prefix path - overwrite with -D CMAKE_INSTALL_PREFIX = ..."
FORCE )
MESSAGE(STATUS "CMAKE_INSTALL_PREFIX is ${CMAKE_INSTALL_PREFIX} - overwrite with -D CMAKE_INSTALL_PREFIX" )
ENDIF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
# When enabling DDG4 on Alma 9 and related, CMAKE_INSTALL_LIBDIR is set to lib64
# Here, we force it to be lib if unset
if(NOT CMAKE_INSTALL_LIBDIR)
set(CMAKE_INSTALL_LIBDIR lib CACHE STRING "Installation directory for libraries" FORCE)
endif()
###############################################
# Setup the environment for the documentation #
###############################################
OPTION(BUILD_DOCS_ONLY "Build documentation only" OFF)
OPTION(BUILD_DOCS "Build documentation" ON)
# Add targets for Doxygen code reference and LaTeX User manual
if (BUILD_DOCS)
ADD_SUBDIRECTORY(doc)
ENDIF()
# If only building docs, stop processing the rest of the CMake file:
IF(BUILD_DOCS_ONLY)
RETURN()
ENDIF()
#############################################################
# Enable CXX as project language to perform compiler checks #
#############################################################
ENABLE_LANGUAGE(CXX)
# Set C++ standard
set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard used for compiling")
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
SET(DD4hep_DIR ${CMAKE_SOURCE_DIR} CACHE STRING "DD4hep directory")
SET(DD4hep_ROOT ${CMAKE_INSTALL_PREFIX})
IF(${CMAKE_CXX_STANDARD} LESS 17)
MESSAGE(FATAL_ERROR "DD4hep requires at least CXX Standard 17 to compile")
ENDIF()
###############################
# Define DD4hep build options #
###############################
# NINJA ONLY
# Limit number of parallel DDParser builds to number equal to 2 gigs per core
cmake_host_system_information(RESULT HOST_RAM_MB QUERY TOTAL_PHYSICAL_MEMORY)
math(EXPR DD4HEP_HIGH_MEM_POOL_DEPTH "${HOST_RAM_MB} / 2000" OUTPUT_FORMAT DECIMAL)
option(DD4HEP_USE_XERCESC "Enable 'Detector Builders' based on XercesC" OFF)
option(DD4HEP_USE_GEANT4 "Enable the simulation part based on Geant4" OFF)
option(DD4HEP_IGNORE_GEANT4_TLS "Ignore the tls flag Geant4 was compiled with" OFF)
option(DD4HEP_USE_GEAR "Build gear wrapper for backward compatibility" OFF)
option(DD4HEP_USE_LCIO "Build lcio extensions" OFF)
option(DD4HEP_USE_GEANT4_UNITS "Build using Geant4 units throughout" OFF)
option(DD4HEP_USE_EDM4HEP "Build edm4hep extensions" OFF)
option(DD4HEP_USE_HEPMC3 "Build hepmc3 extensions" OFF)
option(DD4HEP_USE_TBB "Build features that require TBB" OFF)
option(DD4HEP_LOAD_ASSIMP "Download and build ASSIMP from github" OFF)
option(DD4HEP_DISABLE_PACKAGES "Selectively disable DD4HEP sub-packages [Separate multiples by space]" OFF)
option(BUILD_TESTING "Enable and build tests" ON)
option(BUILD_SHARED_LIBS "If OFF build STATIC Libraries" ON)
option(DD4HEP_SET_RPATH "Link libraries with built-in RPATH (run-time search path)" ON)
option(DD4HEP_RELAX_PYVER "Do not require exact python version match with ROOT" OFF)
#
OPTION(DD4HEP_BUILD_EXAMPLES "Build all the examples" OFF)
OPTION(DD4HEP_DEBUG_CMAKE "Print debugging information for DD4hep CMAKE" OFF)
#
SET(DD4HEP_BUILD_PACKAGES "DDRec DDDetectors DDCond DDAlign DDCAD DDDigi DDG4 DDEve UtilityApps"
CACHE STRING "List of DD4hep packages to build")
#
SEPARATE_ARGUMENTS(DD4HEP_BUILD_PACKAGES)
IF( DD4HEP_DISABLE_PACKAGES )
STRING(REPLACE " " ";" DISABLED_PACKAGES "${DD4HEP_DISABLE_PACKAGES}" )
STRING(REPLACE "," ";" DISABLED_PACKAGES "${DISABLED_PACKAGES}" )
FOREACH( PKG ${DISABLED_PACKAGES} )
LIST(REMOVE_ITEM DD4HEP_BUILD_PACKAGES ${PKG})
MESSAGE(STATUS "Disable package: ${PKG}" )
ENDFOREACH()
ENDIF()
MESSAGE(STATUS "Will be building these packages: ${DD4HEP_BUILD_PACKAGES}")
SET(DD4HEP_USE_EXISTING_DD4HEP "" CACHE STRING "Build some parts of DD4hep against an existing installation")
SET(DD4HEP_HIGH_MEM_POOL_DEPTH "${DD4HEP_HIGH_MEM_POOL_DEPTH}" CACHE STRING "Number of build slots for high memory compile units (DDParsers), Ninja only")
SET(DD4HEP_BUILD_DEBUG "" CACHE STRING "Enable some DEBUG features in DD4hep. Set to 'ON' or 'OFF' to override default handling")
IF(DD4HEP_BUILD_DEBUG AND NOT DD4HEP_BUILD_DEBUG MATCHES "ON|OFF")
MESSAGE(FATAL_ERROR "Invalid value for DD4HEP_BUILD_DEBUG, ${DD4HEP_BUILD_DEBUG}, use '', 'ON', 'OFF'")
ENDIF()
# create the job pool
set_property(GLOBAL PROPERTY JOB_POOLS HIGH_MEM_POOL=${DD4HEP_HIGH_MEM_POOL_DEPTH})
#####################
# Configure version #
#####################
include ( DD4hepBuild )
dd4hep_set_version(DD4hep
MAJOR ${DD4hep_VERSION_MAJOR}
MINOR ${DD4hep_VERSION_MINOR}
PATCH ${DD4hep_VERSION_PATCH} )
configure_file (
"${PROJECT_SOURCE_DIR}/cmake/Version.h.in"
"${PROJECT_SOURCE_DIR}/DDCore/include/DD4hep/Version.h"
)
dd4hep_configure_output( OUTPUT "${PROJECT_BINARY_DIR}" INSTALL "${CMAKE_INSTALL_PREFIX}" )
########################
# Resolve dependencies #
########################
# Configure ROOT
find_package (ROOT 6.08 REQUIRED CONFIG)
DD4HEP_SETUP_ROOT_TARGETS()
# ROOT no longer finds nlohmann_json unless we ask for the ROOTEve component, so we ask
# for the ROOTEve component if the ROOTEve component exists.
# DDEve and one executable in UtilityApps depend on this
if(TARGET ROOT::ROOTEve)
find_package (ROOT REQUIRED COMPONENTS ROOTEve CONFIG)
endif()
# Set when the minimum required CMake version is at least 3.30
if(POLICY CMP0167)
cmake_policy(SET CMP0167 NEW)
endif()
find_package(Boost 1.49 REQUIRED)
DD4HEP_SETUP_BOOST_TARGETS()
# Configure Geant4
if(DD4HEP_USE_GEANT4)
find_package( Geant4 10.2.2 REQUIRED gdml ui_all vis_all CONFIG)
IF(NOT Geant4_builtin_clhep_FOUND)
SET(DD4HEP_USE_CLHEP TRUE)
ENDIF()
if(Geant4_CXX_STANDARD MATCHES "[0-9]+" AND Geant4_CXX_STANDARD LESS ${CMAKE_CXX_STANDARD})
message(FATAL_ERROR "Geant4 was compiled with C++${Geant4_CXX_STANDARD}, but DD4hep requires C++${CMAKE_CXX_STANDARD}")
endif()
DD4HEP_SETUP_GEANT4_TARGETS()
# Geant4 sets the CLHEP include directory to include_directories, we undo this here
# we don't do this inside DD4hep_SETUP_GEANT4_TARGETS, because that is also used in
# DD4hepConfig by users of DD4hep
SET_DIRECTORY_PROPERTIES(PROPERTIES INCLUDE_DIRECTORIES "")
endif()
if(DD4HEP_USE_LCIO)
find_package(LCIO REQUIRED CONFIG)
DD4HEP_SETUP_LCIO_TARGETS()
endif()
if(DD4HEP_USE_EDM4HEP)
# EDM4hep is "SameMajorVersion" compatible so we try to find a recent version
# first and fall back to a compatible on in case we don't find it
find_package(EDM4HEP 1.0)
if (NOT EDM4HEP_FOUND)
message(STATUS "EDM4HEP 1.0 not found, falling back to at least version 0.10.5")
find_package(EDM4HEP 0.10.5 REQUIRED)
endif()
# we need podio with Frame support (>=0.16.3)
# podio is "SameMajorVersion" compatible
find_package(podio 1.0)
if(NOT podio_FOUND)
message(STATUS "podio 1.0 not found, falling back to at least version 0.16.7")
find_package(podio 0.16.7 REQUIRED) # this will not find 1.0 and newer
endif()
# DD4HEP_SETUP_EDM4HEP_TARGETS()
endif()
if(DD4HEP_USE_HEPMC3)
find_package(HepMC3 REQUIRED)
# Optional dependencies for compressed input support
if(HEPMC3_VERSION VERSION_GREATER_EQUAL "3.02.05")
option(DD4HEP_HEPMC3_COMPRESSION_SUPPORT "Enable reading of compressed HepMC files" OFF)
if(DD4HEP_HEPMC3_COMPRESSION_SUPPORT)
find_package(ZLIB REQUIRED)
find_package(LibLZMA REQUIRED)
find_package(BZip2 REQUIRED)
endif()
else()
option(DD4HEP_HEPMC3_COMPRESSION_SUPPORT "Enable reading of compressed HepMC files" OFF)
if(DD4HEP_HEPMC3_COMPRESSION_SUPPORT)
message(FATAL_ERROR "HepMC3 >= 3.2.5 is required for -DDD4HEP_HEPMC3_COMPRESSION_SUPPORT=ON")
endif()
endif()
endif()
if(DD4HEP_USE_TBB)
find_package(TBB REQUIRED CONFIG)
endif()
######################
# Set compiler flags #
######################
dd4hep_set_compiler_flags()
####################
# Include packages #
####################
include(DD4hep)
include(DD4hepMacros)
if( DEFINED DD4HEP_WITH_GEANT4 OR DEFINED DD4HEP_WITH_GEAR )
dd4hep_print_cmake_options( OPTIONAL "Obsolete options: only the following are allowed:" ERROR 1 )
endif()
IF(DD4HEP_USE_EXISTING_DD4HEP)
MESSAGE(STATUS "|!!> Using pre-existing DD4hep: ${DD4HEP_USE_EXISTING_DD4HEP}")
SET(CMAKE_PROJECT_NAME DD4hepSelected)
dd4hep_set_version(${CMAKE_PROJECT_NAME}
MAJOR ${${CMAKE_PROJECT_NAME}_VERSION_MAJOR}
MINOR ${${CMAKE_PROJECT_NAME}_VERSION_MINOR}
PATCH ${${CMAKE_PROJECT_NAME}_VERSION_PATCH} )
FIND_PACKAGE(DD4hep REQUIRED NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH
PATHS ${DD4HEP_USE_EXISTING_DD4HEP})
dd4hep_configure_output( OUTPUT "${PROJECT_BINARY_DIR}" INSTALL "${CMAKE_INSTALL_PREFIX}" )
FOREACH(DDPackage IN LISTS DD4HEP_BUILD_PACKAGES)
dd4hep_print("|> Building ${DDPackage}")
add_subdirectory(${DDPackage})
ENDFOREACH()
LIST(GET DD4HEP_BUILD_PACKAGES 0 DD4HEP_SELECTED_PACKAGE)
ELSE()
include(DD4hep_XML_setup)
#These packages are mandatory
SET(DD4HEP_SELECTED_PACKAGE DDCore)
FOREACH(DDPackage GaudiPluginService DDParsers DDCore)
dd4hep_print("|> Building ${DDPackage}")
add_subdirectory(${DDPackage})
ENDFOREACH()
IF(DD4HEP_BUILD_DEBUG MATCHES "ON" OR (CMAKE_BUILD_TYPE MATCHES "DEBUG|Debug" AND NOT DD4HEP_BUILD_DEBUG MATCHES "OFF"))
message(STATUS "BUILD DD4HEP and depending software with debug extensions")
target_compile_definitions(DDCore PUBLIC DD4HEP_DEBUG=1)
set(DD4HEP_BUILD_DEBUG ON)
ELSE()
set(DD4HEP_BUILD_DEBUG OFF)
ENDIF()
message(STATUS "BUILD Packages: ${DD4HEP_BUILD_PACKAGES}")
FOREACH(DDPackage IN LISTS DD4HEP_BUILD_PACKAGES)
dd4hep_print("|> Building ${DDPackage}")
add_subdirectory(${DDPackage})
ENDFOREACH()
if(BUILD_TESTING)
dd4hep_enable_tests()
add_subdirectory(DDTest)
endif()
if(DD4HEP_BUILD_EXAMPLES)
add_subdirectory(examples)
endif()
ENDIF(DD4HEP_USE_EXISTING_DD4HEP)
#########################
# Configure and install #
#########################
configure_file(cmake/thisdd4hep.sh bin/thisdd4hep.sh @ONLY)
configure_file(cmake/thisdd4hep_only.sh bin/thisdd4hep_only.sh @ONLY)
configure_file(cmake/run_test.sh bin/run_test.sh @ONLY)
install(FILES ${CMAKE_BINARY_DIR}/bin/thisdd4hep.sh DESTINATION bin )
install(FILES ${CMAKE_BINARY_DIR}/bin/thisdd4hep_only.sh DESTINATION bin )
install(PROGRAMS ${CMAKE_BINARY_DIR}/bin/run_test.sh DESTINATION bin )
install(DIRECTORY cmake
DESTINATION ${CMAKE_INSTALL_PREFIX}
FILES_MATCHING PATTERN "*.cmake" PATTERN "thisdd4hep_package.sh.in" PATTERN "run*.sh" PATTERN "*.cpp"
PATTERN ".svn" EXCLUDE
)
#--- enable CPack --------------------------------------------
option(ENABLE_CPACK "Whether or not to use cpack config" OFF)
if(ENABLE_CPACK)
include(cmake/DD4hepCPack.cmake)
endif()
###############################
# Dispaly final configuration #
###############################
display_std_variables()
######################################################
# generate and install following configuration files #
######################################################
CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/cmake/DD4hepConfig.cmake.in
${PROJECT_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake @ONLY
)
INSTALL(FILES ${PROJECT_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake DESTINATION cmake)
dd4hep_generate_package_configuration_files( ${CMAKE_PROJECT_NAME}Config.cmake )
if(APPLE)
SET ( ENV{DD4HEP_LIBRARY_PATH} $ENV{DYLD_LIBRARY_PATH} )
else()
SET ( ENV{DD4HEP_LIBRARY_PATH} ${LD_LIBRARY_PATH} )
SET ( DD4HEP_LIBRARY_PATH ${LD_LIBRARY_PATH} )
endif()
#######################
# Treatment for Apple #
#######################
if(APPLE)
fill_dd4hep_library_path()
message(STATUS "DD4HEP_LIBRARY_PATH= $ENV{DD4HEP_LIBRARY_PATH}")
endif()
INSTALL(EXPORT DD4hep
NAMESPACE DD4hep::
FILE ${CMAKE_PROJECT_NAME}Config-targets.cmake
DESTINATION cmake
)