Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/cmake/Modules/G4ConfigurePkgConfigHelpers.cmake

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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()