CMakeLists.txt 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. cmake_minimum_required(VERSION 3.24)
  2. project(cxx_modules_library NONE)
  3. set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "ac01f462-0f5f-432a-86aa-acef252918a6")
  4. find_package(export_usage REQUIRED)
  5. if (NOT TARGET CXXModules::export_usage)
  6. message(FATAL_ERROR
  7. "Missing imported target")
  8. endif ()
  9. if (NOT TARGET CXXModules::export_used)
  10. message(FATAL_ERROR
  11. "Missing imported target")
  12. endif ()
  13. if (NOT TARGET CXXModules::export_build)
  14. message(FATAL_ERROR
  15. "Missing imported target")
  16. endif ()
  17. if (NOT TARGET CXXModules::export_install)
  18. message(FATAL_ERROR
  19. "Missing imported target")
  20. endif ()
  21. if (TARGET CXXModules::export_never)
  22. message(FATAL_ERROR
  23. "Extra imported target")
  24. endif ()
  25. function (check_property expected property)
  26. get_property(actual TARGET CXXModules::export_usage
  27. PROPERTY "${property}")
  28. if (NOT actual STREQUAL expected)
  29. message(SEND_ERROR
  30. "Mismatch for ${property}:\n expected: ${expected}\n actual: ${actual}")
  31. endif ()
  32. endfunction ()
  33. check_property("/usr/exported;/usr/buildiface" "IMPORTED_CXX_MODULES_INCLUDE_DIRECTORIES")
  34. check_property("exported;buildiface" "IMPORTED_CXX_MODULES_COMPILE_DEFINITIONS")
  35. check_property("cxx_std_20;cxx_std_11;cxx_std_14" "IMPORTED_CXX_MODULES_COMPILE_FEATURES")
  36. check_property("${export_interfaces_flag}100;${export_interfaces_flag}200" "IMPORTED_CXX_MODULES_COMPILE_OPTIONS")
  37. check_property("$<COMPILE_ONLY:CXXModules::export_used>;$<COMPILE_ONLY:CXXModules::export_build>" "IMPORTED_CXX_MODULES_LINK_LIBRARIES")
  38. # Extract the export-dependent targets from the export file.
  39. file(STRINGS "${export_usage_DIR}/export_usage-targets.cmake" usage_dependent_targets
  40. REGEX "foreach._target ")
  41. # Rudimentary argument splitting.
  42. string(REPLACE " " ";" usage_dependent_targets "${usage_dependent_targets}")
  43. # Keep only "target" names.
  44. list(FILTER usage_dependent_targets INCLUDE REGEX "CXXModules::")
  45. # Strip quotes.
  46. string(REPLACE "\"" "" usage_dependent_targets "${usage_dependent_targets}")
  47. if (NOT "CXXModules::export_used" IN_LIST usage_dependent_targets)
  48. message(SEND_ERROR
  49. "The main export does not require the 'CXXModules::export_used' target")
  50. endif ()
  51. if (NOT "CXXModules::export_build" IN_LIST usage_dependent_targets)
  52. message(SEND_ERROR
  53. "The main export does not require the 'CXXModules::export_build' target")
  54. endif ()
  55. if ("CXXModules::export_install" IN_LIST usage_dependent_targets)
  56. message(SEND_ERROR
  57. "The main export requires the 'CXXModules::export_install' target")
  58. endif ()