From 77818ac192beaf8d0ccdf45bc2b77c16f7c7c581 Mon Sep 17 00:00:00 2001
From: Andre Sailer <andre.philippe.sailer@cern.ch>
Date: Thu, 3 Oct 2019 13:34:34 +0200
Subject: [PATCH] CMake: add DD4HEP_USE_EXISTING_DD4HEP to allow re-building
 some packages of DD4hep

---
 CMakeLists.txt              | 35 ++++++++++++++++++--
 cmake/DD4hepConfig.cmake.in | 66 ++++++++++++++++++-------------------
 cmake/DD4hepMacros.cmake    |  4 +--
 3 files changed, 67 insertions(+), 38 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4dc3c1b4f..bab135c6e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -77,6 +77,8 @@ MESSAGE(STATUS "Will be building these packages: ${DD4HEP_BUILD_PACKAGES}")
 OPTION(DD4HEP_BUILD_EXAMPLES "Build all the examples" OFF)
 OPTION(DD4HEP_DEBUG_CMAKE "Print debugging information for DD4hep CMAKE" OFF)
 
+SET(DD4HEP_USE_EXISTING_DD4HEP "" CACHE STRING "Build some parts of DD4hep against an existing installation")
+
 #####################
 # Configure version #
 #####################
@@ -146,9 +148,28 @@ endif()
 
 include(DD4hep_XML_setup)
 
+  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()
+
+
+ELSE()
+
 #These pacakges are mandatory
 FOREACH(DDPackage GaudiPluginService DDParsers DDCore)
-  dd4hep_print("|> Building ${DDPackage}")
   add_subdirectory(${DDPackage})
 ENDFOREACH()
 
@@ -166,6 +187,8 @@ if(DD4HEP_BUILD_EXAMPLES)
   add_subdirectory(examples)
 endif()
 
+
+ENDIF(DD4HEP_USE_EXISTING_DD4HEP)
 #######################
 # Treatment for Apple #
 #######################
@@ -202,7 +225,13 @@ display_std_variables()
 # generate and install following configuration files #
 ######################################################
 
-dd4hep_generate_package_configuration_files( DD4hepConfig.cmake )
+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()
@@ -221,6 +250,6 @@ endif()
 
 INSTALL(EXPORT DD4hep 
   NAMESPACE DD4hep::
-  FILE DD4hepConfig-targets.cmake
+  FILE ${CMAKE_PROJECT_NAME}Config-targets.cmake
   DESTINATION cmake
   )
diff --git a/cmake/DD4hepConfig.cmake.in b/cmake/DD4hepConfig.cmake.in
index 53ae7fbd5..4c47354e1 100644
--- a/cmake/DD4hepConfig.cmake.in
+++ b/cmake/DD4hepConfig.cmake.in
@@ -1,19 +1,19 @@
 ##############################################################################
-# cmake configuration file for DD4hep
+# cmake configuration file for @CMAKE_PROJECT_NAME@
 #
 # returns following variables:
 #
-#   DD4hep_FOUND      : set to TRUE if DD4hep found
-#   DD4hep_VERSION    : package version
-#   DD4hep_ROOT       : path to this DD4hep installation
-#   DD4hep_LIBRARIES  : list of DD4hep libraries
-#   DD4hep_INCLUDE_DIRS  : list of paths to be used with INCLUDE_DIRECTORIES
-#   DD4hep_LIBRARY_DIRS  : list of paths to be used with LINK_DIRECTORIES
+#   @CMAKE_PROJECT_NAME@_FOUND      : set to TRUE if @CMAKE_PROJECT_NAME@ found
+#   @CMAKE_PROJECT_NAME@_VERSION    : package version
+#   @CMAKE_PROJECT_NAME@_ROOT       : path to this @CMAKE_PROJECT_NAME@ installation
+#   @CMAKE_PROJECT_NAME@_LIBRARIES  : list of @CMAKE_PROJECT_NAME@ libraries
+#   @CMAKE_PROJECT_NAME@_INCLUDE_DIRS  : list of paths to be used with INCLUDE_DIRECTORIES
+#   @CMAKE_PROJECT_NAME@_LIBRARY_DIRS  : list of paths to be used with LINK_DIRECTORIES
 #
 # @author Jan Engels, Desy
 ##############################################################################
 
-# Locate the DD4hep install prefix. This CMake file is installed in two
+# Locate the @CMAKE_PROJECT_NAME@ install prefix. This CMake file is installed in two
 # different locations (root and "cmake" subdir) that we must disambiguate.
 get_filename_component(_thisdir "${CMAKE_CURRENT_LIST_FILE}" PATH)
 get_filename_component(_lastdir "${_thisdir}" NAME)
@@ -21,24 +21,24 @@ if (_lastdir STREQUAL "cmake")
   get_filename_component(_thisdir "${_thisdir}" PATH)
 endif()
 
-set ( DD4hep_DIR                "${_thisdir}" )
-set ( DD4hep_ROOT               "${_thisdir}" )
-set ( DD4hep_VERSION            "@DD4hep_VERSION@" )
-set ( DD4hep_SOVERSION          "@DD4hep_SOVERSION@" )
+set ( @CMAKE_PROJECT_NAME@_DIR                "${_thisdir}" )
+set ( @CMAKE_PROJECT_NAME@_ROOT               "${_thisdir}" )
+set ( @CMAKE_PROJECT_NAME@_VERSION            "@DD4hep_VERSION@" )
+set ( @CMAKE_PROJECT_NAME@_SOVERSION          "@DD4hep_SOVERSION@" )
 set ( DD4HEP_USE_GEANT4         @DD4HEP_USE_GEANT4@ )
 set ( DD4HEP_USE_CLHEP          @DD4HEP_USE_CLHEP@ )
 set ( DD4HEP_USE_LCIO           @DD4HEP_USE_LCIO@ )
 set ( DD4HEP_USE_XERCESC        @DD4HEP_USE_XERCESC@ )
-set ( DD4hep_BUILD_CXX_STANDARD @CMAKE_CXX_STANDARD@ )
+set ( @CMAKE_PROJECT_NAME@_BUILD_CXX_STANDARD @CMAKE_CXX_STANDARD@ )
 
-include ( ${DD4hep_DIR}/cmake/DD4hep.cmake )
+include ( ${@CMAKE_PROJECT_NAME@_DIR}/cmake/@CMAKE_PROJECT_NAME@.cmake )
 
 include(CMakeFindDependencyMacro)
 
-set (CMAKE_MODULE_PATH  ${CMAKE_MODULE_PATH} ${DD4hep_DIR}/cmake  )
+set (CMAKE_MODULE_PATH  ${CMAKE_MODULE_PATH} ${@CMAKE_PROJECT_NAME@_DIR}/cmake  )
 
 # ---------- include dirs -----------------------------------------------------
-set(DD4hep_INCLUDE_DIRS "")
+set(@CMAKE_PROJECT_NAME@_INCLUDE_DIRS "")
 
 # ---------- default build type  --------------------------------------------------------
 if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
@@ -50,7 +50,7 @@ FIND_DEPENDENCY(Boost REQUIRED)
 DD4HEP_SETUP_BOOST_TARGETS()
 
 if(DD4HEP_USE_GEANT4)
-  MESSAGE(STATUS "DD4hep uses Geant4")
+  MESSAGE(STATUS "@CMAKE_PROJECT_NAME@ uses Geant4")
   IF(DD4HEP_USE_CLHEP)
     find_dependency(CLHEP REQUIRED CONFIG)
     UNSET(CLHEP_INCLUDE_DIR)
@@ -63,28 +63,28 @@ FIND_DEPENDENCY(ROOT REQUIRED)
 DD4HEP_SETUP_ROOT_TARGETS()
 
 if(DD4HEP_USE_LCIO)
-  MESSAGE(STATUS "DD4hep uses LCIO")
+  MESSAGE(STATUS "@CMAKE_PROJECT_NAME@ uses LCIO")
   find_dependency(LCIO REQUIRED)
   DD4HEP_SETUP_LCIO_TARGETS()
 endif()
 
-if(NOT CMAKE_PROJECT_NAME STREQUAL DD4hep)
-  include("${DD4hep_ROOT}/cmake/DD4hepConfig-targets.cmake")
+if(NOT CMAKE_PROJECT_NAME STREQUAL @CMAKE_PROJECT_NAME@)
+  include("${@CMAKE_PROJECT_NAME@_ROOT}/cmake/@CMAKE_PROJECT_NAME@Config-targets.cmake")
 endif()
 
-# Backward compatible DD4hep_INCLUDE_DIRS and DD4hep_LIBRARIES variables
-GET_TARGET_PROPERTY(DD4hep_INCLUDE_DIRS DD4hep::DDCore INTERFACE_INCLUDE_DIRECTORIES)
-set(DD4hep_LIBRARIES DD4hep::DDCore)
+# Backward compatible @CMAKE_PROJECT_NAME@_INCLUDE_DIRS and @CMAKE_PROJECT_NAME@_LIBRARIES variables
+GET_TARGET_PROPERTY(@CMAKE_PROJECT_NAME@_INCLUDE_DIRS @CMAKE_PROJECT_NAME@::DDCore INTERFACE_INCLUDE_DIRECTORIES)
+set(@CMAKE_PROJECT_NAME@_LIBRARIES @CMAKE_PROJECT_NAME@::DDCore)
 
-# Backward compatible DD4hep_COMPONENT_LIBRARIES variable
-SET(DD4hep_COMPONENT_LIBRARIES)
-IF(DD4hep_FIND_COMPONENTS)
-  dd4hep_print( "|++> DD4hep: Looking for Components: ${DD4hep_FIND_COMPONENTS}" )
-  FOREACH(comp ${DD4hep_FIND_COMPONENTS})
-    IF(NOT TARGET DD4hep::${comp})
+# Backward compatible @CMAKE_PROJECT_NAME@_COMPONENT_LIBRARIES variable
+SET(@CMAKE_PROJECT_NAME@_COMPONENT_LIBRARIES)
+IF(@CMAKE_PROJECT_NAME@_FIND_COMPONENTS)
+  dd4hep_print( "|++> @CMAKE_PROJECT_NAME@: Looking for Components: ${@CMAKE_PROJECT_NAME@_FIND_COMPONENTS}" )
+  FOREACH(comp ${@CMAKE_PROJECT_NAME@_FIND_COMPONENTS})
+    IF(NOT TARGET @CMAKE_PROJECT_NAME@::${comp})
       MESSAGE(FATAL_ERROR "|++> Did not find required component: ${comp}")
     ENDIF()
-    LIST(APPEND DD4hep_COMPONENT_LIBRARIES DD4hep::${comp})
+    LIST(APPEND @CMAKE_PROJECT_NAME@_COMPONENT_LIBRARIES @CMAKE_PROJECT_NAME@::${comp})
   ENDFOREACH()
 ENDIF()
 
@@ -92,7 +92,7 @@ ENDIF()
 if(DD4HEP_USE_XERCESC)
   set( DD4HEP_USE_XERCESC True )
 endif()
-INCLUDE( ${DD4hep_DIR}/cmake/DD4hep_XML_setup.cmake )
+INCLUDE( ${@CMAKE_PROJECT_NAME@_DIR}/cmake/@CMAKE_PROJECT_NAME@_XML_setup.cmake )
 
 #----- APPLE ? -------
 
@@ -102,6 +102,6 @@ MARK_AS_ADVANCED( USE_DYLD )
 # ---------- final checking ---------------------------------------------------
 INCLUDE( FindPackageHandleStandardArgs )
 # set DD4HEP_FOUND to TRUE if all listed variables are TRUE and not empty
-FIND_PACKAGE_HANDLE_STANDARD_ARGS( DD4hep DEFAULT_MSG DD4hep_DIR DD4hep_INCLUDE_DIRS DD4hep_LIBRARIES )
+FIND_PACKAGE_HANDLE_STANDARD_ARGS( @CMAKE_PROJECT_NAME@ DEFAULT_MSG @CMAKE_PROJECT_NAME@_DIR @CMAKE_PROJECT_NAME@_INCLUDE_DIRS @CMAKE_PROJECT_NAME@_LIBRARIES )
 
-SET( DD4hep_FOUND ${DD4HEP_FOUND} )
+SET( @CMAKE_PROJECT_NAME@_FOUND ${@CMAKE_PROJECT_NAME@_FOUND} )
diff --git a/cmake/DD4hepMacros.cmake b/cmake/DD4hepMacros.cmake
index c4f3b64ce..e65eefcf9 100644
--- a/cmake/DD4hepMacros.cmake
+++ b/cmake/DD4hepMacros.cmake
@@ -90,10 +90,10 @@ MACRO( DD4HEP_GENERATE_PACKAGE_CONFIGURATION_FILES )
     ENDFOREACH()
 
     INCLUDE( CMakePackageConfigHelpers )
-    WRITE_BASIC_PACKAGE_VERSION_FILE( DD4hepConfigVersion.cmake
+    WRITE_BASIC_PACKAGE_VERSION_FILE( ${CMAKE_PROJECT_NAME}ConfigVersion.cmake
                                       VERSION ${DD4hep_VERSION}
                                       COMPATIBILITY AnyNewerVersion )
-    INSTALL( FILES "${PROJECT_BINARY_DIR}/DD4hepConfigVersion.cmake" DESTINATION ./cmake )
+    INSTALL( FILES "${PROJECT_BINARY_DIR}/${CMAKE_PROJECT_NAME}ConfigVersion.cmake" DESTINATION ./cmake )
 
 ENDMACRO( DD4HEP_GENERATE_PACKAGE_CONFIGURATION_FILES )
 
-- 
GitLab