diff --git a/cmake/GaudiProjectConfig.cmake b/cmake/GaudiProjectConfig.cmake index d7049233e..a9ef71e9a 100644 --- a/cmake/GaudiProjectConfig.cmake +++ b/cmake/GaudiProjectConfig.cmake @@ -356,6 +356,8 @@ macro(gaudi_project project version) # Make sure we select the version of Python provided by LCG (if we are building in that context) if(Python_config_version) set(Python_config_version ${Python_config_version} CACHE STRING "LCG version of Python") + # Prevent special LCG versions (like 2.7.9.p1) to confuse CMake + string(REGEX REPLACE "([0-9]+\\.[0-9]+\\.[0-9]+).*" "\\1" Python_config_version "${Python_config_version}") find_package(PythonInterp ${Python_config_version} QUIET) find_package(PythonLibs ${Python_config_version} QUIET) if(CMAKE_VERSION VERSION_GREATER 3.12) @@ -373,10 +375,10 @@ macro(gaudi_project project version) #-- Set up the boost_python_version variable for the project find_package(PythonInterp) find_package(Boost) - if((Boost_VERSION GREATER 106700) OR (Boost_VERSION EQUAL 106700)) - set(boost_python_version "${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}") + if((Boost_VERSION LESS 106700) OR (Boost_VERSION GREATER 1069000)) + set(boost_python_version "") else() - set(boost_python_version "") + set(boost_python_version "${Python_VERSION_MAJOR}${Python_VERSION_MINOR}") endif() #--- Allow installation on failed builds @@ -1620,9 +1622,24 @@ function(gaudi_resolve_link_libraries variable) set(collected) foreach(package ${ARGN}) # check if it is an actual library or a target first + if(NOT TARGET ${package}) + if(package MATCHES "^Boost::(.*)$") + # special handling of Boost imported targets + find_package(Boost COMPONENTS ${CMAKE_MATCH_1} QUIET) + else() + # the target might be in a project namespace + foreach(_p IN LISTS used_gaudi_projects) + if(TARGET ${_p}::${package}) + #message(STATUS "using ${_p}::${package} for ${package}") + set(package ${_p}::${package}) + break() + endif() + endforeach() + endif() + endif() if(TARGET ${package}) get_property(target_type TARGET ${package} PROPERTY TYPE) - if(NOT target_type MATCHES "(SHARED|STATIC)_LIBRARY") + if(NOT target_type MATCHES "(SHARED|STATIC|UNKNOWN)_LIBRARY") message(FATAL_ERROR "${package} is a ${target_type}: you cannot link against it") endif() #message(STATUS "${package} is a TARGET") @@ -1670,6 +1687,19 @@ function(gaudi_resolve_link_libraries variable) endforeach() #message(STATUS "gaudi_resolve_link_libraries collected: ${collected}") _gaudi_strip_build_type_libs(collected) + # resolve missing Boost::* targets, if needed + set(boost_components ${collected}) + list(FILTER boost_components INCLUDE REGEX "^Boost::") + list(TRANSFORM boost_components REPLACE "^Boost::" "") + set(missing_components) + foreach(comp IN LISTS boost_components) + if(NOT TARGET Boost::${comp}) + list(APPEND missing_components ${comp}) + endif() + endforeach() + if(missing_components) + find_package(Boost COMPONENTS ${missing_components} QUIET) + endif() #message(STATUS "gaudi_resolve_link_libraries output: ${collected}") set(${variable} ${collected} PARENT_SCOPE) endfunction() @@ -3277,6 +3307,14 @@ macro(gaudi_external_project_environment) list(FIND used_gaudi_projects ${pack} gaudi_project_idx) if((NOT pack STREQUAL GaudiProject) AND (gaudi_project_idx EQUAL -1)) message(STATUS " ${pack}") + if(pack STREQUAL Boost) + if(NOT TARGET Boost::headers) + # this is needed to get the non-cache variables for the packages + # but we do not need to call it if we do not use FindBoost.cmake (Boost >= 1.70) + find_package(${pack} QUIET) + endif() + endif() + if(NOT pack MATCHES "^Python(Interp|Libs)?$") # this is needed to get the non-cache variables for the packages find_package(${pack} QUIET) @@ -3325,6 +3363,17 @@ macro(gaudi_external_project_environment) list(APPEND environment SET QT_XKB_CONFIG_ROOT "/usr/share/X11/xkb") endif() endif() + elseif(pack MATCHES "^boost_(.*)$") + # We are using BoostConfig.cmake (>=1.70) and not FindBoost.cmake + if(TARGET "Boost::${CMAKE_MATCH_1}") + set(tgt_name "Boost::${CMAKE_MATCH_1}") + get_property(target_type TARGET ${tgt_name} PROPERTY TYPE) + if(target_type MATCHES "(SHARED|UNKNOWN)_LIBRARY") + # FIXME: I'm not sure it's good to rely on the "_RELEASE" suffix + get_property(lib_path TARGET ${tgt_name} PROPERTY IMPORTED_LOCATION_RELEASE) + get_filename_component(${pack}_LIBRARY_DIR "${lib_path}" PATH) + endif() + endif() endif() list(APPEND binary_path ${${pack}_BINARY_PATH})