FindPkgConfig_IMPORTED_TARGET.cmake 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. cmake_minimum_required(VERSION 3.5)
  2. project(FindPkgConfig_IMPORTED_TARGET C)
  3. find_package(PkgConfig REQUIRED)
  4. pkg_check_modules(NCURSES IMPORTED_TARGET QUIET ncurses)
  5. if (NCURSES_FOUND)
  6. set(tgt PkgConfig::NCURSES)
  7. if (NOT TARGET ${tgt})
  8. message(FATAL_ERROR "FindPkgConfig found ncurses, but did not create an imported target for it")
  9. endif ()
  10. set(prop_found FALSE)
  11. foreach (prop IN ITEMS INTERFACE_INCLUDE_DIRECTORIES INTERFACE_LINK_LIBRARIES INTERFACE_COMPILE_OPTIONS)
  12. get_target_property(value ${tgt} ${prop})
  13. if (value)
  14. message(STATUS "Found property ${prop} on target: ${value}")
  15. set(prop_found TRUE)
  16. endif ()
  17. endforeach ()
  18. if (NOT prop_found)
  19. message(FATAL_ERROR "target ${tgt} found, but it has no properties")
  20. endif ()
  21. else ()
  22. message(STATUS "skipping test; ncurses not found")
  23. endif ()
  24. # Setup for the remaining package tests below
  25. set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH)
  26. set(fakePkgDir ${CMAKE_CURRENT_BINARY_DIR}/pc-fakepackage)
  27. foreach(i 1 2)
  28. set(pname cmakeinternalfakepackage${i})
  29. file(WRITE ${fakePkgDir}/lib/lib${pname}.a "")
  30. file(WRITE ${fakePkgDir}/lib/${pname}.lib "")
  31. file(WRITE ${fakePkgDir}/lib/pkgconfig/${pname}.pc
  32. "Name: CMakeInternalFakePackage${i}
  33. Description: Dummy package (${i}) for FindPkgConfig IMPORTED_TARGET test
  34. Version: 1.2.3
  35. Libs: -l${pname}
  36. ")
  37. endforeach()
  38. # Always find the .pc file in the calls further below so that we can test that
  39. # the import target find_library() calls handle the NO...PATH options correctly
  40. set(ENV{PKG_CONFIG_PATH} ${fakePkgDir}/lib/pkgconfig)
  41. # Confirm correct behavior of NO_CMAKE_PATH, ensuring we only find the library
  42. # for the imported target if we have both set CMAKE_PREFIX_PATH and have not
  43. # given the NO_CMAKE_PATH option
  44. unset(CMAKE_PREFIX_PATH)
  45. unset(ENV{CMAKE_PREFIX_PATH})
  46. pkg_check_modules(FakePackage1 QUIET IMPORTED_TARGET cmakeinternalfakepackage1)
  47. if (TARGET PkgConfig::FakePackage1)
  48. message(FATAL_ERROR "Have import target for fake package 1 with no path prefix")
  49. endif()
  50. set(CMAKE_PREFIX_PATH ${fakePkgDir})
  51. pkg_check_modules(FakePackage1 QUIET IMPORTED_TARGET NO_CMAKE_PATH cmakeinternalfakepackage1)
  52. if (TARGET PkgConfig::FakePackage1)
  53. message(FATAL_ERROR "Have import target for fake package 1 with ignored cmake path")
  54. endif()
  55. pkg_check_modules(FakePackage1 REQUIRED QUIET IMPORTED_TARGET cmakeinternalfakepackage1)
  56. if (NOT TARGET PkgConfig::FakePackage1)
  57. message(FATAL_ERROR "No import target for fake package 1 with prefix path")
  58. endif()
  59. # And now do the same for the NO_CMAKE_ENVIRONMENT_PATH - ENV{CMAKE_PREFIX_PATH}
  60. # combination
  61. unset(CMAKE_PREFIX_PATH)
  62. unset(ENV{CMAKE_PREFIX_PATH})
  63. pkg_check_modules(FakePackage2 QUIET IMPORTED_TARGET cmakeinternalfakepackage2)
  64. if (TARGET PkgConfig::FakePackage2)
  65. message(FATAL_ERROR "Have import target for fake package 2 with no path prefix")
  66. endif()
  67. set(ENV{CMAKE_PREFIX_PATH} ${fakePkgDir})
  68. pkg_check_modules(FakePackage2 QUIET IMPORTED_TARGET NO_CMAKE_ENVIRONMENT_PATH cmakeinternalfakepackage2)
  69. if (TARGET PkgConfig::FakePackage2)
  70. message(FATAL_ERROR "Have import target for fake package 2 with ignored cmake path")
  71. endif()
  72. pkg_check_modules(FakePackage2 REQUIRED QUIET IMPORTED_TARGET cmakeinternalfakepackage2)
  73. if (NOT TARGET PkgConfig::FakePackage2)
  74. message(FATAL_ERROR "No import target for fake package 2 with prefix path")
  75. endif()