You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
5.3 KiB
133 lines
5.3 KiB
cmake_minimum_required(VERSION 3.12)
|
|
|
|
project(FindPkgConfig_IMPORTED_TARGET C)
|
|
|
|
find_package(PkgConfig REQUIRED)
|
|
pkg_check_modules(NCURSES IMPORTED_TARGET QUIET ncurses)
|
|
|
|
message(STATUS "source: ${CMAKE_CURRENT_SOURCE_DIR} bin ${CMAKE_CURRENT_BINARY_DIR}")
|
|
|
|
if (NCURSES_FOUND)
|
|
set(tgt PkgConfig::NCURSES)
|
|
if (NOT TARGET ${tgt})
|
|
message(FATAL_ERROR "FindPkgConfig found ncurses, but did not create an imported target for it")
|
|
endif ()
|
|
set(prop_found FALSE)
|
|
foreach (prop IN ITEMS INTERFACE_INCLUDE_DIRECTORIES INTERFACE_LINK_LIBRARIES INTERFACE_COMPILE_OPTIONS)
|
|
get_target_property(value ${tgt} ${prop})
|
|
if (value)
|
|
message(STATUS "Found property ${prop} on target: ${value}")
|
|
set(prop_found TRUE)
|
|
endif ()
|
|
endforeach ()
|
|
if (NOT prop_found)
|
|
message(FATAL_ERROR "target ${tgt} found, but it has no properties")
|
|
endif ()
|
|
else ()
|
|
message(STATUS "skipping test; ncurses not found")
|
|
endif ()
|
|
|
|
|
|
# Setup for the remaining package tests below
|
|
set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH)
|
|
set(fakePkgDir ${CMAKE_CURRENT_BINARY_DIR}/pc-fakepackage)
|
|
foreach(i 1 2)
|
|
set(pname cmakeinternalfakepackage${i})
|
|
file(WRITE ${fakePkgDir}/lib/lib${pname}.a "")
|
|
file(WRITE ${fakePkgDir}/lib/${pname}.lib "")
|
|
file(WRITE ${fakePkgDir}/lib/pkgconfig/${pname}.pc
|
|
"Name: CMakeInternalFakePackage${i}
|
|
Description: Dummy package (${i}) for FindPkgConfig IMPORTED_TARGET test
|
|
Version: 1.2.3
|
|
Libs: -l${pname}
|
|
")
|
|
endforeach()
|
|
|
|
# Always find the .pc file in the calls further below so that we can test that
|
|
# the import target find_library() calls handle the NO...PATH options correctly
|
|
set(ENV{PKG_CONFIG_PATH} ${fakePkgDir}/lib/pkgconfig)
|
|
|
|
# Confirm correct behavior of NO_CMAKE_PATH, ensuring we only find the library
|
|
# for the imported target if we have both set CMAKE_PREFIX_PATH and have not
|
|
# given the NO_CMAKE_PATH option
|
|
unset(CMAKE_PREFIX_PATH)
|
|
unset(ENV{CMAKE_PREFIX_PATH})
|
|
pkg_check_modules(FakePackage1 QUIET IMPORTED_TARGET cmakeinternalfakepackage1)
|
|
if (TARGET PkgConfig::FakePackage1)
|
|
message(FATAL_ERROR "Have import target for fake package 1 with no path prefix")
|
|
endif()
|
|
|
|
set(CMAKE_PREFIX_PATH ${fakePkgDir})
|
|
pkg_check_modules(FakePackage1 QUIET IMPORTED_TARGET NO_CMAKE_PATH cmakeinternalfakepackage1)
|
|
if (TARGET PkgConfig::FakePackage1)
|
|
message(FATAL_ERROR "Have import target for fake package 1 with ignored cmake path")
|
|
endif()
|
|
|
|
pkg_check_modules(FakePackage1 REQUIRED QUIET IMPORTED_TARGET cmakeinternalfakepackage1)
|
|
if (NOT TARGET PkgConfig::FakePackage1)
|
|
message(FATAL_ERROR "No import target for fake package 1 with prefix path")
|
|
endif()
|
|
|
|
# find targets in subdir and check their visibility
|
|
add_subdirectory(target_subdir)
|
|
if (TARGET PkgConfig::FakePackage1_dir)
|
|
message(FATAL_ERROR "imported target PkgConfig::FakePackage1_dir is visible outside it's directory")
|
|
endif()
|
|
|
|
if (NOT TARGET PkgConfig::FakePackage1_global)
|
|
message(FATAL_ERROR "imported target PkgConfig::FakePackage1_global is not visible outside it's directory")
|
|
endif()
|
|
|
|
# And now do the same for the NO_CMAKE_ENVIRONMENT_PATH - ENV{CMAKE_PREFIX_PATH}
|
|
# combination
|
|
unset(CMAKE_PREFIX_PATH)
|
|
unset(ENV{CMAKE_PREFIX_PATH})
|
|
pkg_check_modules(FakePackage2 QUIET IMPORTED_TARGET cmakeinternalfakepackage2)
|
|
if (TARGET PkgConfig::FakePackage2)
|
|
message(FATAL_ERROR "Have import target for fake package 2 with no path prefix")
|
|
endif()
|
|
|
|
set(ENV{CMAKE_PREFIX_PATH} ${fakePkgDir})
|
|
pkg_check_modules(FakePackage2 QUIET IMPORTED_TARGET NO_CMAKE_ENVIRONMENT_PATH cmakeinternalfakepackage2)
|
|
if (TARGET PkgConfig::FakePackage2)
|
|
message(FATAL_ERROR "Have import target for fake package 2 with ignored cmake path")
|
|
endif()
|
|
|
|
pkg_check_modules(FakePackage2 REQUIRED QUIET IMPORTED_TARGET cmakeinternalfakepackage2)
|
|
if (NOT TARGET PkgConfig::FakePackage2)
|
|
message(FATAL_ERROR "No import target for fake package 2 with prefix path")
|
|
endif()
|
|
|
|
# check that the full library path is also returned
|
|
if (NOT FakePackage2_LINK_LIBRARIES STREQUAL "${fakePkgDir}/lib/libcmakeinternalfakepackage2.a")
|
|
message(FATAL_ERROR "FakePackage2_LINK_LIBRARIES has bad content on first run: ${FakePackage2_LINK_LIBRARIES}")
|
|
endif()
|
|
|
|
# the information in *_LINK_LIBRARIES is not cached, so ensure is also is present on second run
|
|
unset(FakePackage2_LINK_LIBRARIES)
|
|
pkg_check_modules(FakePackage2 REQUIRED QUIET IMPORTED_TARGET cmakeinternalfakepackage2)
|
|
if (NOT FakePackage2_LINK_LIBRARIES STREQUAL "${fakePkgDir}/lib/libcmakeinternalfakepackage2.a")
|
|
message(FATAL_ERROR "FakePackage2_LINK_LIBRARIES has bad content on second run: ${FakePackage2_LINK_LIBRARIES}")
|
|
endif()
|
|
|
|
set(pname fakelinkoptionspackage)
|
|
file(WRITE ${fakePkgDir}/lib/pkgconfig/${pname}.pc
|
|
"Name: FakeLinkOptionsPackage
|
|
Description: Dummy package for FindPkgConfig IMPORTED_TARGET INTERFACE_LINK_OPTIONS test
|
|
Version: 1.2.3
|
|
Libs: -e dummy_main
|
|
")
|
|
|
|
set(expected_link_options -e dummy_main)
|
|
pkg_check_modules(FakeLinkOptionsPackage REQUIRED QUIET IMPORTED_TARGET fakelinkoptionspackage)
|
|
if (NOT TARGET PkgConfig::FakeLinkOptionsPackage)
|
|
message(FATAL_ERROR "No import target for fake link options package")
|
|
endif()
|
|
get_target_property(link_options PkgConfig::FakeLinkOptionsPackage INTERFACE_LINK_OPTIONS)
|
|
if (NOT link_options STREQUAL expected_link_options)
|
|
message(FATAL_ERROR
|
|
"Additional link options not present in INTERFACE_LINK_OPTIONS property"
|
|
"expected: \"${expected_link_options}\", but got \"${link_options}\""
|
|
)
|
|
endif()
|