Normally, find modules call FIND_PACKAGE_HANDLE_STANDARD_ARGS, which in
turn calls FIND_PACKAGE_MESSAGE, to print a nice message about the location
and version of the dependency.
But I haven't found any way or example to do the same when using the CONFIG
mode of find_package. And I really want to see some output about where the
dependencies are located. So I came up with this:
# Prints a message with the location and version of a package
# found in config mode, similar to the message printed by module files.
# When multiple configurations are installed, this tries to print
# the location to the same library selected by the CMake generator.
#
# TODO: handle configuration mapping (?)
function(find_package_config_message _package _target _version)
# The location matching the same build configuration as downstream
# is selected when linking to the library
set(_build_type ${CMAKE_BUILD_TYPE})
if (_build_type)
string(TOUPPER "IMPORTED_LOCATION_${_build_type}" _location_prop)
get_target_property(_location_path ${_target} ${_location_prop})
endif()
# If downstream has no build configuration set,
# or the installed package has no matching configuration,
# the first listed configuration is used to get the location to the
library
if(NOT _location_path)
get_target_property(_target_configurations ${_target}
IMPORTED_CONFIGURATIONS)
if(_target_configurations)
list(GET _target_configurations 0 _build_type)
get_target_property(_location_path ${_target}
"IMPORTED_LOCATION_${_build_type}")
endif()
if (NOT _location_path)
message(SEND_ERROR "No imported location for target ${_target}")
endif()
endif()
set(_message "Found ${_package}")
set(_details "[${_build_type}]")
if(_location_path)
set(_message "${_message}: ${_location_path}")
set(_details "[${_location_path}]${_details}")
endif()
if(_version)
set(_message "${_message} (found version \"${_version}\")")
set(_details "[${_version}]${_details}")
endif()
find_package_message(${_package} ${_message} ${_details})
endfunction()
I think I got it right, based on the observed behavior while experimenting
with different values for CMAKE_BUILD_TYPE on both upstream and downstream,
and it works fine for most common cases.
I would use in the FooConfig.cmake like this (the function would be in
FooHelpers.cmake):
if(NOT TARGET Foo::Foo)
include("${CMAKE_CURRENT_LIST_DIR}/FooTargets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/FooHelpers.cmake")
find_package_config_message(Foo Foo::Foo "@PROJECT_VERSION@")
endif()
Any thoughts/comments?
--
Sebastian Mancilla
--
Powered by www.kitware.com
Please keep messages on-topic and check the CMake FAQ at:
http://www.cmake.org/Wiki/CMake_FAQ
Kitware offers various services to support the CMake community. For more
information on each offering, please visit:
CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake