Geant4 Cross Reference |
1 #.rst: 2 # G4ConfigurePkgConfigHelpers 3 # --------------------------- 4 # 5 # This module configures and installs pkg-config scripts and the 6 # geant4-config program to help clients compile and link against 7 # the Geant4 libraries. 8 # 9 # The geant4-config script provides an sh based interface to provide 10 # information on the Geant4 installation, including installation prefix, 11 # version number, compiler and linker flags. 12 # 13 # The script is generated from a template file and then installed to the 14 # known bindir as an executable. 15 # 16 # Paths are always hardcoded in the build tree version as this is never 17 # intended to be relocatable. 18 # The Install Tree script uses self-location based on that in 19 # {root,clhep}-config is the install itself is relocatable, otherwise 20 # absolute paths are encoded. 21 # 22 # 23 24 #----------------------------------------------------------------- 25 # License and Disclaimer 26 # 27 # The Geant4 software is copyright of the Copyright Holders of 28 # the Geant4 Collaboration. It is provided under the terms and 29 # conditions of the Geant4 Software License, included in the file 30 # LICENSE and available at http://cern.ch/geant4/license . These 31 # include a list of copyright holders. 32 # 33 # Neither the authors of this software system, nor their employing 34 # institutes,nor the agencies providing financial support for this 35 # work make any representation or warranty, express or implied, 36 # regarding this software system or assume any liability for its 37 # use. Please see the license in the file LICENSE and URL above 38 # for the full disclaimer and the limitation of liability. 39 # 40 # This code implementation is the result of the scientific and 41 # technical work of the GEANT4 collaboration. 42 # By using, copying, modifying or distributing the software (or 43 # any work based on the software) you agree to acknowledge its 44 # use in resulting scientific publications, and indicate your 45 # acceptance of all terms of the Geant4 Software license. 46 # 47 #----------------------------------------------------------------- 48 49 50 #----------------------------------------------------------------------- 51 # function get_system_include_dirs 52 # return list of directories our C++ compiler searches 53 # by default. 54 # 55 # The idea comes from CMake's inbuilt technique to do this 56 # for the Eclipse and CodeBlocks generators, but we implement 57 # our own function because the CMake functionality is internal 58 # so we can't rely on it. 59 function(get_system_include_dirs _dirs) 60 # Only for GCC, Clang and Intel 61 if("${CMAKE_CXX_COMPILER_ID}" MATCHES GNU OR "${CMAKE_CXX_COMPILER_ID}" MATCHES Clang OR "${CMAKE_CXX_COMPILER_ID}" MATCHES Intel) 62 # Proceed 63 file(WRITE "${PROJECT_BINARY_DIR}/CMakeFiles/g4dummy" "\n") 64 65 # Save locale, them to "C" english locale so we can parse in English 66 set(_orig_lc_all $ENV{LC_ALL}) 67 set(_orig_lc_messages $ENV{LC_MESSAGES}) 68 set(_orig_lang $ENV{LANG}) 69 70 set(ENV{LC_ALL} C) 71 set(ENV{LC_MESSAGES} C) 72 set(ENV{LANG} C) 73 74 execute_process(COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} -v -E -x c++ -dD g4dummy 75 WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/CMakeFiles 76 ERROR_VARIABLE _cxxOutput 77 OUTPUT_VARIABLE _cxxStdout 78 ) 79 80 file(REMOVE "${PROJECT_BINARY_DIR}/CMakeFiles/g4dummy") 81 82 # Parse and extract search dirs 83 set(_resultIncludeDirs ) 84 if( "${_cxxOutput}" MATCHES "> search starts here[^\n]+\n *(.+ *\n) *End of (search) list" ) 85 string(REGEX MATCHALL "[^\n]+\n" _includeLines "${CMAKE_MATCH_1}") 86 foreach(nextLine ${_includeLines}) 87 string(REGEX REPLACE "\\(framework directory\\)" "" nextLineNoFramework "${nextLine}") 88 string(STRIP "${nextLineNoFramework}" _includePath) 89 list(APPEND _resultIncludeDirs "${_includePath}") 90 endforeach() 91 endif() 92 93 # Restore original locale 94 set(ENV{LC_ALL} ${_orig_lc_all}) 95 set(ENV{LC_MESSAGES} ${_orig_lc_messages}) 96 set(ENV{LANG} ${_orig_lang}) 97 98 set(${_dirs} ${_resultIncludeDirs} PARENT_SCOPE) 99 else() 100 set(${_dirs} "" PARENT_SCOPE) 101 endif() 102 endfunction() 103 104 #----------------------------------------------------------------------- 105 # Only create script if we have a global library build... 106 # 107 #if(NOT GEANT4_BUILD_GRANULAR_LIBS AND UNIX) 108 if(NOT GEANT4_BUILD_GRANULAR_LIBS) 109 # Get implicit search paths 110 get_system_include_dirs(_cxx_compiler_dirs) 111 112 # Setup variables needed for expansion in configuration file 113 # - C++ Filesystem, if needed 114 if(GEANT4_CXX_FILESYSTEM_LIBRARY) 115 set(G4_LINK_CXX_FILESYSTEM "-l${GEANT4_CXX_FILESYSTEM_LIBRARY}") 116 endif() 117 118 # - Static libs 119 if(BUILD_STATIC_LIBS) 120 set(G4_BUILTWITH_STATICLIBS "yes") 121 else() 122 set(G4_BUILTWITH_STATICLIBS "no") 123 endif() 124 125 # - Multithreading 126 if(GEANT4_BUILD_MULTITHREADED) 127 set(G4_BUILTWITH_MULTITHREADING "yes") 128 else() 129 set(G4_BUILTWITH_MULTITHREADING "no") 130 endif() 131 132 # - PHP_AS_HP 133 if(GEANT4_BUILD_PHP_AS_HP) 134 set(G4_BUILTWITH_PHP_AS_HP "yes") 135 else() 136 set(G4_BUILTWITH_PHP_AS_HP "no") 137 endif() 138 139 # - Smart Stack 140 if(GEANT4_USE_SMARTSTACK) 141 set(G4_BUILTWITH_SMARTSTACK "yes") 142 else() 143 set(G4_BUILTWITH_SMARTSTACK "no") 144 endif() 145 146 # - CLHEP 147 if(GEANT4_USE_SYSTEM_CLHEP) 148 set(G4_BUILTWITH_CLHEP "no") 149 #inc path 150 get_filename_component(G4_SYSTEM_CLHEP_INCLUDE_DIR "${CLHEP_INCLUDE_DIR}" ABSOLUTE) 151 152 #libpath 153 list(GET CLHEP_LIBRARIES 0 _zeroth_clhep_lib) 154 get_target_property(_system_clhep_libdir "${_zeroth_clhep_lib}" LOCATION) 155 get_filename_component(_system_clhep_libdir "${_system_clhep_libdir}" REALPATH) 156 get_filename_component(_system_clhep_libdir "${_system_clhep_libdir}" DIRECTORY) 157 set(G4_SYSTEM_CLHEP_LIBRARIES "-L${_system_clhep_libdir}") 158 159 foreach(_clhep_lib ${CLHEP_LIBRARIES}) 160 get_target_property(_curlib "${_clhep_lib}" LOCATION) 161 get_filename_component(_curlib "${_curlib}" NAME) 162 string(REGEX REPLACE "^lib(.*)\\.(so|a|dylib|lib|dll)$" "\\1" _curlib "${_curlib}") 163 set(G4_SYSTEM_CLHEP_LIBRARIES "${G4_SYSTEM_CLHEP_LIBRARIES} -l${_curlib}") 164 endforeach() 165 else() 166 set(G4_BUILTWITH_CLHEP "yes") 167 endif() 168 169 # - EXPAT 170 if(GEANT4_USE_SYSTEM_EXPAT) 171 set(G4_BUILTWITH_EXPAT "no") 172 else() 173 set(G4_BUILTWITH_EXPAT "yes") 174 endif() 175 176 # - ZLIB 177 if(GEANT4_USE_SYSTEM_ZLIB) 178 set(G4_BUILTWITH_ZLIB "no") 179 else() 180 set(G4_BUILTWITH_ZLIB "yes") 181 endif() 182 183 # - PTL 184 if(GEANT4_USE_SYSTEM_PTL) 185 set(G4_BUILTWITH_PTL "no") 186 else() 187 set(G4_BUILTWITH_PTL "yes") 188 endif() 189 190 # - GDML 191 if(GEANT4_USE_GDML) 192 set(G4_BUILTWITH_GDML "yes") 193 set(G4_XERCESC_INCLUDE_DIRS ${XercesC_INCLUDE_DIR}) 194 list(REMOVE_DUPLICATES G4_XERCESC_INCLUDE_DIRS) 195 if(_cxx_compiler_dirs) 196 list(REMOVE_ITEM G4_XERCESC_INCLUDE_DIRS ${_cxx_compiler_dirs}) 197 endif() 198 199 set(G4_XERCESC_CFLAGS ) 200 foreach(_dir ${G4_XERCESC_INCLUDE_DIRS}) 201 set(G4_XERCESC_CFLAGS "${G4_XERCESC_CFLAGS} -I${_dir}") 202 endforeach() 203 else() 204 set(G4_BUILTWITH_GDML "no") 205 endif() 206 207 # - G3ToG4 208 if(GEANT4_USE_G3TOG4) 209 set(G4_BUILTWITH_G3TOG4 "yes") 210 else() 211 set(G4_BUILTWITH_G3TOG4 "no") 212 endif() 213 214 # - USolids 215 if(GEANT4_USE_USOLIDS OR GEANT4_USE_PARTIAL_USOLIDS) 216 set(G4_BUILTWITH_USOLIDS "yes") 217 get_target_property(G4_USOLIDS_INCLUDE_DIRS VecGeom::vecgeom INTERFACE_INCLUDE_DIRECTORIES) 218 list(REMOVE_DUPLICATES G4_USOLIDS_INCLUDE_DIRS) 219 foreach(_dir ${G4_USOLIDS_INCLUDE_DIRS}) 220 set(G4_USOLIDS_CFLAGS "${G4_USOLIDS_CFLAGS} -I${_dir}") 221 endforeach() 222 # NB: should ALSO account for VecGeom having compile_options, but 223 # this is better handled through proper pkg-config support 224 else() 225 set(G4_BUILTWITH_USOLIDS "no") 226 endif() 227 228 # - Freetype 229 if(GEANT4_USE_FREETYPE) 230 set(G4_BUILTWITH_FREETYPE "yes") 231 else() 232 set(G4_BUILTWITH_FREETYPE "no") 233 endif() 234 235 # - HDF5 236 if(GEANT4_USE_HDF5) 237 set(G4_BUILTWITH_HDF5 "yes") 238 else() 239 set(G4_BUILTWITH_HDF5 "no") 240 endif() 241 242 # - Qt 243 if(GEANT4_USE_QT) 244 set(G4_BUILTWITH_QT "yes") 245 set(_qtcomps Core Gui Widgets OpenGL) 246 if(QT_VERSION_MAJOR VERSION_GREATER_EQUAL 5.15) 247 list(APPEND _qtcomp 3DCore 3DExtras 3DRender) 248 endif() 249 250 set(G4_QT_INCLUDE_DIRS ) 251 foreach(_qtc ${_qtcomps}) 252 list(APPEND G4_QT_INCLUDE_DIRS ${Qt${QT_VERSION_MAJOR}${_qtc}_INCLUDE_DIRS}) 253 endforeach() 254 255 list(REMOVE_DUPLICATES G4_QT_INCLUDE_DIRS) 256 if(_cxx_compiler_dirs) 257 list(REMOVE_ITEM G4_QT_INCLUDE_DIRS ${_cxx_compiler_dirs}) 258 endif() 259 260 set(G4_QT_CFLAGS ) 261 foreach(_dir ${G4_QT_INCLUDE_DIRS}) 262 set(G4_QT_CFLAGS "${G4_QT_CFLAGS} -I${_dir}") 263 endforeach() 264 265 if(APPLE AND G4_QT_CFLAGS MATCHES "QtCore\.framework") 266 set(G4_QT_CFLAGS "${G4_QT_CFLAGS} -F${G4QTLIBPATH}") 267 endif() 268 else() 269 set(G4_BUILTWITH_QT "no") 270 endif() 271 272 # - QT3D 273 if(GEANT4_USE_QT3D) 274 set(G4_BUILTWITH_QT3D "yes") 275 else() 276 set(G4_BUILTWITH_QT3D "no") 277 endif() 278 279 # - Motif 280 if(GEANT4_USE_XM) 281 set(G4_BUILTWITH_MOTIF "yes") 282 set(G4_CONFIG_NEEDS_X11 TRUE) 283 else() 284 set(G4_BUILTWITH_MOTIF "no") 285 endif() 286 287 # - RayTracerX 288 if(GEANT4_USE_RAYTRACER_X11) 289 set(G4_BUILTWITH_RAYTRACERX11 "yes") 290 set(G4_CONFIG_NEEDS_X11 TRUE) 291 else() 292 set(G4_BUILTWITH_RAYTRACERX11 "no") 293 endif() 294 295 # - OpenGL X11 296 if(GEANT4_USE_OPENGL_X11) 297 set(G4_BUILTWITH_OPENGLX11 "yes") 298 set(G4_CONFIG_NEEDS_X11 TRUE) 299 else() 300 set(G4_BUILTWITH_OPENGLX11 "no") 301 endif() 302 303 # - OpenInventor 304 if(GEANT4_USE_INVENTOR) 305 set(G4_BUILTWITH_INVENTOR "yes") 306 else() 307 set(G4_BUILTWITH_INVENTOR "no") 308 endif() 309 310 # - VTK 311 if(GEANT4_USE_VTK) 312 set(G4_BUILTWITH_VTK "yes") 313 else() 314 set(G4_BUILTWITH_VTK "no") 315 endif() 316 317 # If we have a module that uses X11, We have to play with the X11 318 # paths to get a clean set suitable for inclusion 319 if(G4_CONFIG_NEEDS_X11) 320 set(_raw_x11_includes ${X11_INCLUDE_DIR}) 321 list(REMOVE_DUPLICATES _raw_x11_includes) 322 if(_cxx_compiler_dirs) 323 list(REMOVE_ITEM _raw_x11_includes ${_cxx_compiler_dirs}) 324 endif() 325 set(G4_X11_CFLAGS ) 326 foreach(_p ${_raw_x11_includes}) 327 set(G4_X11_CFLAGS "-I${_p} ${G4_X11_CFLAGS}") 328 endforeach() 329 endif() 330 331 # Configure the script 332 # - BUILD TREE 333 # Ouch, the include path will be LONG, but at least we always have 334 # absolute paths... 335 set(GEANT4_CONFIG_SELF_LOCATION "# BUILD TREE IS NON-RELOCATABLE") 336 set(GEANT4_CONFIG_INSTALL_PREFIX "${PROJECT_BINARY_DIR}") 337 set(GEANT4_CONFIG_INSTALL_EXECPREFIX \"\") 338 # NB: this only works for *single* mode generators. With multimode 339 # generators, which mode to use is not clear... 340 set(GEANT4_CONFIG_LIBDIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) 341 342 get_property(__geant4_buildtree_include_dirs GLOBAL PROPERTY 343 GEANT4_BUILDTREE_INCLUDE_DIRS) 344 345 foreach(_dir ${__geant4_buildtree_include_dirs}) 346 set(GEANT4_CONFIG_INCLUDE_DIRS "${GEANT4_CONFIG_INCLUDE_DIRS} \\ 347 ${_dir}") 348 endforeach() 349 350 # - Data 351 geant4_export_datasets(BUILD GEANT4_CONFIG_DATASET_DESCRIPTIONS) 352 353 # Configure the build tree script 354 configure_file( 355 ${PROJECT_SOURCE_DIR}/cmake/Templates/geant4-config.in 356 ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/geant4-config 357 @ONLY 358 ) 359 360 file(COPY 361 ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/geant4-config 362 DESTINATION ${PROJECT_BINARY_DIR} 363 FILE_PERMISSIONS 364 OWNER_READ OWNER_WRITE OWNER_EXECUTE 365 GROUP_READ GROUP_EXECUTE 366 WORLD_READ WORLD_EXECUTE 367 ) 368 369 # - Install Tree 370 # Much easier :-) 371 # Non-Relocatable case... 372 if(CMAKE_INSTALL_IS_NONRELOCATABLE) 373 # Hardcoded paths 374 set(GEANT4_CONFIG_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") 375 set(GEANT4_CONFIG_INSTALL_EXECPREFIX \"\") 376 set(GEANT4_CONFIG_LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}") 377 set(GEANT4_CONFIG_INCLUDE_DIRS "${CMAKE_INSTALL_FULL_INCLUDEDIR}/Geant4") 378 else() 379 # Calculate base of self contained install based on relative path from 380 # CMAKE_INSTALL_FULL_BINDIR to CMAKE_INSTALL_PREFIX. 381 file(RELATIVE_PATH _bin_to_prefix ${CMAKE_INSTALL_FULL_BINDIR} ${CMAKE_INSTALL_PREFIX}) 382 # Strip any trailing path separators just for neatness. 383 string(REGEX REPLACE "[/\\]$" "" _bin_to_prefix "${_bin_to_prefix}") 384 385 set(GEANT4_CONFIG_INSTALL_PREFIX "$scriptloc/${_bin_to_prefix}") 386 set(GEANT4_CONFIG_INSTALL_EXECPREFIX \"\") 387 set(GEANT4_CONFIG_LIBDIR "\${prefix}/${CMAKE_INSTALL_LIBDIR}") 388 set(GEANT4_CONFIG_INCLUDE_DIRS "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}/Geant4") 389 endif() 390 391 # - Data 392 geant4_export_datasets(INSTALL GEANT4_CONFIG_DATASET_DESCRIPTIONS) 393 394 # Configure the install tree script 395 configure_file( 396 ${PROJECT_SOURCE_DIR}/cmake/Templates/geant4-config.in 397 ${PROJECT_BINARY_DIR}/InstallTreeFiles/geant4-config 398 @ONLY 399 ) 400 401 # Install it 402 install(FILES ${PROJECT_BINARY_DIR}/InstallTreeFiles/geant4-config 403 DESTINATION ${CMAKE_INSTALL_BINDIR} 404 PERMISSIONS 405 OWNER_READ OWNER_WRITE OWNER_EXECUTE 406 GROUP_READ GROUP_EXECUTE 407 WORLD_READ WORLD_EXECUTE 408 COMPONENT Development 409 ) 410 411 # Win32 helper file geant4-config.cmd 412 if(WIN32) 413 # No configuration just a copy 414 configure_file( 415 ${PROJECT_SOURCE_DIR}/cmake/Templates/geant4-config-cmd.in 416 ${PROJECT_BINARY_DIR}/InstallTreeFiles/geant4-config.cmd 417 @ONLY 418 ) 419 420 # Install helper 421 install(FILES ${PROJECT_BINARY_DIR}/InstallTreeFiles/geant4-config.cmd 422 DESTINATION ${CMAKE_INSTALL_BINDIR} 423 PERMISSIONS 424 OWNER_READ OWNER_WRITE OWNER_EXECUTE 425 GROUP_READ GROUP_EXECUTE 426 WORLD_READ WORLD_EXECUTE 427 COMPONENT Development 428 ) 429 endif() 430 endif()