From 85d6d3b2e3537b7730542dc410dd6540ee61fcae Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 18 Mar 2024 11:22:47 -0400 Subject: generate_apple_*_selection_file: Add option to capture errors Add an option to capture error messages in a variable instead of terminating with a fatal error. Fixes: #25778 --- Modules/CMakePackageConfigHelpers.cmake | 63 ++++++++++++++++++++-- .../Internal/AppleArchitectureSelection.cmake.in | 6 --- Modules/Internal/ApplePlatformSelection.cmake.in | 3 +- Tests/RunCMake/CMakePackage/RunCMakeTest.cmake | 10 ++++ .../apple-export-unsupported-capture.cmake | 16 ++++++ .../apple-export-unsupported-fatal.cmake | 14 +++++ .../apple-import-unsupported-capture-stdout.txt | 2 + .../apple-import-unsupported-capture.cmake | 11 ++++ ...mport-unsupported-fatal-architecture-result.txt | 1 + ...mport-unsupported-fatal-architecture-stderr.txt | 6 +++ ...ple-import-unsupported-fatal-architecture.cmake | 4 ++ ...le-import-unsupported-fatal-platform-result.txt | 1 + ...le-import-unsupported-fatal-platform-stderr.txt | 6 +++ .../apple-import-unsupported-fatal-platform.cmake | 4 ++ 14 files changed, 137 insertions(+), 10 deletions(-) create mode 100644 Tests/RunCMake/CMakePackage/apple-export-unsupported-capture.cmake create mode 100644 Tests/RunCMake/CMakePackage/apple-export-unsupported-fatal.cmake create mode 100644 Tests/RunCMake/CMakePackage/apple-import-unsupported-capture-stdout.txt create mode 100644 Tests/RunCMake/CMakePackage/apple-import-unsupported-capture.cmake create mode 100644 Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-architecture-result.txt create mode 100644 Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-architecture-stderr.txt create mode 100644 Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-architecture.cmake create mode 100644 Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-platform-result.txt create mode 100644 Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-platform-stderr.txt create mode 100644 Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-platform.cmake diff --git a/Modules/CMakePackageConfigHelpers.cmake b/Modules/CMakePackageConfigHelpers.cmake index 0c04608..fe5cc21 100644 --- a/Modules/CMakePackageConfigHelpers.cmake +++ b/Modules/CMakePackageConfigHelpers.cmake @@ -210,6 +210,7 @@ Generating an Apple Platform Selection File [WATCHOS_SIMULATOR_INCLUDE_FILE ] [VISIONOS_INCLUDE_FILE ] [VISIONOS_SIMULATOR_INCLUDE_FILE ] + [ERROR_VARIABLE ] ) Write a file that includes an Apple-platform-specific ``.cmake`` file, @@ -256,9 +257,16 @@ Generating an Apple Platform Selection File ``VISIONOS_SIMULATOR_INCLUDE_FILE `` File to include if the platform is visionOS Simulator. + ``ERROR_VARIABLE `` + If the consuming project is built for an unsupported platform, + set ```` to an error message. The includer may use this + information to pretend the package was not found. If this option + is not given, the default behavior is to issue a fatal error. + If any of the optional include files is not specified, and the consuming - project is built for its corresponding platform, an error will be thrown - when including the generated file. + project is built for its corresponding platform, the generated file will + consider the platform to be unsupported. The behavior is determined + by the ``ERROR_VARIABLE`` option. .. command:: generate_apple_architecture_selection_file @@ -275,6 +283,7 @@ Generating an Apple Platform Selection File SINGLE_ARCHITECTURE_INCLUDE_FILES ...] [UNIVERSAL_ARCHITECTURES ... UNIVERSAL_INCLUDE_FILE ] + [ERROR_VARIABLE ] ) Write a file that includes an Apple-architecture-specific ``.cmake`` file @@ -313,6 +322,12 @@ Generating an Apple Platform Selection File a (non-strict) subset of the ``UNIVERSAL_ARCHITECTURES`` and does not match any one of the ``SINGLE_ARCHITECTURES``. + ``ERROR_VARIABLE `` + If the consuming project is built for an unsupported architecture, + set ```` to an error message. The includer may use this + information to pretend the package was not found. If this option + is not given, the default behavior is to issue a fatal error. + Example Generating Package Files ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -486,6 +501,7 @@ function(generate_apple_platform_selection_file _output_file) INSTALL_DESTINATION INSTALL_PREFIX ${_config_file_options} + ERROR_VARIABLE ) set(_multi) cmake_parse_arguments(PARSE_ARGV 0 _gpsf "${_options}" "${_single}" "${_multi}") @@ -499,8 +515,15 @@ function(generate_apple_platform_selection_file _output_file) set(maybe_INSTALL_PREFIX "") endif() + if(_gpsf_ERROR_VARIABLE) + set(_branch_INIT "set(\"${_gpsf_ERROR_VARIABLE}\" \"\")") + else() + set(_branch_INIT "") + endif() + + set(_else ELSE) set(_have_relative 0) - foreach(_opt IN LISTS _config_file_options) + foreach(_opt IN LISTS _config_file_options _else) if(_gpsf_${_opt}) set(_config_file "${_gpsf_${_opt}}") if(NOT IS_ABSOLUTE "${_config_file}") @@ -508,6 +531,8 @@ function(generate_apple_platform_selection_file _output_file) set(_have_relative 1) endif() set(_branch_${_opt} "include(\"${_config_file}\")") + elseif(_gpsf_ERROR_VARIABLE) + set(_branch_${_opt} "set(\"${_gpsf_ERROR_VARIABLE}\" \"Platform not supported\")") else() set(_branch_${_opt} "message(FATAL_ERROR \"Platform not supported\")") endif() @@ -527,6 +552,7 @@ function(generate_apple_architecture_selection_file _output_file) INSTALL_DESTINATION INSTALL_PREFIX UNIVERSAL_INCLUDE_FILE + ERROR_VARIABLE ) set(_multi SINGLE_ARCHITECTURES @@ -552,6 +578,30 @@ function(generate_apple_architecture_selection_file _output_file) set(_branch_code "") + if(_gasf_ERROR_VARIABLE) + string(APPEND _branch_code + "set(\"${_gasf_ERROR_VARIABLE}\" \"\")\n" + ) + endif() + + string(APPEND _branch_code + "\n" + "if(NOT CMAKE_OSX_ARCHITECTURES)\n" + ) + if(_gasf_ERROR_VARIABLE) + string(APPEND _branch_code + " set(\"${_gasf_ERROR_VARIABLE}\" \"CMAKE_OSX_ARCHITECTURES must be explicitly set for this package\")\n" + " return()\n" + ) + else() + string(APPEND _branch_code + " message(FATAL_ERROR \"CMAKE_OSX_ARCHITECTURES must be explicitly set for this package\")\n" + ) + endif() + string(APPEND _branch_code + "endif()\n" + ) + foreach(pair IN ZIP_LISTS _gasf_SINGLE_ARCHITECTURES _gasf_SINGLE_ARCHITECTURE_INCLUDE_FILES) set(arch "${pair_0}") set(config_file "${pair_1}") @@ -588,6 +638,13 @@ function(generate_apple_architecture_selection_file _output_file) message(FATAL_ERROR "UNIVERSAL_ARCHITECTURES requires UNIVERSAL_INCLUDE_FILE") endif() + string(APPEND _branch_code "\n") + if(_gasf_ERROR_VARIABLE) + string(APPEND _branch_code "set(\"${_gasf_ERROR_VARIABLE}\" \"Architecture not supported\")") + else() + string(APPEND _branch_code "message(FATAL_ERROR \"Architecture not supported\")") + endif() + configure_package_config_file("${CMAKE_CURRENT_FUNCTION_LIST_DIR}/Internal/AppleArchitectureSelection.cmake.in" "${_output_file}" INSTALL_DESTINATION "${_gasf_INSTALL_DESTINATION}" ${maybe_INSTALL_PREFIX} diff --git a/Modules/Internal/AppleArchitectureSelection.cmake.in b/Modules/Internal/AppleArchitectureSelection.cmake.in index fec0d41..b7315b6 100644 --- a/Modules/Internal/AppleArchitectureSelection.cmake.in +++ b/Modules/Internal/AppleArchitectureSelection.cmake.in @@ -1,8 +1,2 @@ @PACKAGE_INIT@ - -if(NOT CMAKE_OSX_ARCHITECTURES) - message(FATAL_ERROR "CMAKE_OSX_ARCHITECTURES must be explicitly set for this package") -endif() @_branch_code@ - -message(FATAL_ERROR "Architecture not supported") diff --git a/Modules/Internal/ApplePlatformSelection.cmake.in b/Modules/Internal/ApplePlatformSelection.cmake.in index 5f5e01d..6c03ab6 100644 --- a/Modules/Internal/ApplePlatformSelection.cmake.in +++ b/Modules/Internal/ApplePlatformSelection.cmake.in @@ -1,6 +1,7 @@ @PACKAGE_INIT@ string(TOLOWER "${CMAKE_OSX_SYSROOT}" _CMAKE_OSX_SYSROOT_LOWER) +@_branch_INIT@ if(_CMAKE_OSX_SYSROOT_LOWER MATCHES "(^|/)iphonesimulator") @_branch_IOS_SIMULATOR_INCLUDE_FILE@ elseif(_CMAKE_OSX_SYSROOT_LOWER MATCHES "(^|/)iphoneos") @@ -20,5 +21,5 @@ elseif(_CMAKE_OSX_SYSROOT_LOWER MATCHES "(^|/)xros") elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") @_branch_MACOS_INCLUDE_FILE@ else() - message(FATAL_ERROR "Platform not supported") + @_branch_ELSE@ endif() diff --git a/Tests/RunCMake/CMakePackage/RunCMakeTest.cmake b/Tests/RunCMake/CMakePackage/RunCMakeTest.cmake index ccf0a86..1551b55 100644 --- a/Tests/RunCMake/CMakePackage/RunCMakeTest.cmake +++ b/Tests/RunCMake/CMakePackage/RunCMakeTest.cmake @@ -37,6 +37,9 @@ function(apple_import platform system_name archs sysroot) ${maybe_CMAKE_BUILD_TYPE} ) set(RunCMake_TEST_NO_CLEAN 1) + if(apple_import_no_build) + return() + endif() run_cmake_command(apple-import-${platform}-build ${CMAKE_COMMAND} --build . --config Release) endfunction() @@ -93,6 +96,8 @@ if(APPLE AND CMAKE_C_COMPILER_ID STREQUAL "AppleClang") apple_export(visionos-simulator visionOS "${macos_archs}" xrsimulator) endif() apple_export(watchos-simulator watchOS "${watch_sim_archs}" watchsimulator) + apple_export(unsupported-capture Darwin "${macos_archs}" macosx) + apple_export(unsupported-fatal Darwin "${macos_archs}" macosx) apple_import(macos Darwin "${macos_archs}" macosx) apple_import(ios iOS "arm64" iphoneos) @@ -115,4 +120,9 @@ if(APPLE AND CMAKE_C_COMPILER_ID STREQUAL "AppleClang") apple_import(visionos-simulator visionOS "${macos_archs}" xrsimulator) endif() apple_import(watchos-simulator watchOS "${watch_sim_archs}" watchsimulator) + set(apple_import_no_build 1) + apple_import(unsupported-capture Darwin "${macos_archs}" macosx) + apple_import(unsupported-fatal-platform Darwin "${macos_archs}" macosx) + apple_import(unsupported-fatal-architecture Darwin "${macos_archs}" macosx) + unset(apple_import_no_build) endif() diff --git a/Tests/RunCMake/CMakePackage/apple-export-unsupported-capture.cmake b/Tests/RunCMake/CMakePackage/apple-export-unsupported-capture.cmake new file mode 100644 index 0000000..e712bb2 --- /dev/null +++ b/Tests/RunCMake/CMakePackage/apple-export-unsupported-capture.cmake @@ -0,0 +1,16 @@ +include(apple-common.cmake) + +include(CMakePackageConfigHelpers) +generate_apple_platform_selection_file(bad-platform-capture-config-install.cmake + INSTALL_DESTINATION lib/cmake/bad-platform-capture + INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} + ERROR_VARIABLE bad-platform-capture_unsupported + ) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/bad-platform-capture-config-install.cmake DESTINATION lib/cmake/bad-platform-capture RENAME bad-platform-capture-config.cmake) + +generate_apple_architecture_selection_file(bad-arch-capture-config-install.cmake + INSTALL_DESTINATION lib/cmake/bad-arch-capture + INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} + ERROR_VARIABLE bad-arch-capture_unsupported + ) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/bad-arch-capture-config-install.cmake DESTINATION lib/cmake/bad-arch-capture RENAME bad-arch-capture-config.cmake) diff --git a/Tests/RunCMake/CMakePackage/apple-export-unsupported-fatal.cmake b/Tests/RunCMake/CMakePackage/apple-export-unsupported-fatal.cmake new file mode 100644 index 0000000..f2c5802 --- /dev/null +++ b/Tests/RunCMake/CMakePackage/apple-export-unsupported-fatal.cmake @@ -0,0 +1,14 @@ +include(apple-common.cmake) + +include(CMakePackageConfigHelpers) +generate_apple_platform_selection_file(bad-platform-fatal-config-install.cmake + INSTALL_DESTINATION lib/cmake/bad-platform-fatal + INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} + ) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/bad-platform-fatal-config-install.cmake DESTINATION lib/cmake/bad-platform-fatal RENAME bad-platform-fatal-config.cmake) + +generate_apple_architecture_selection_file(bad-arch-fatal-config-install.cmake + INSTALL_DESTINATION lib/cmake/bad-arch-fatal + INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} + ) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/bad-arch-fatal-config-install.cmake DESTINATION lib/cmake/bad-arch-fatal RENAME bad-arch-fatal-config.cmake) diff --git a/Tests/RunCMake/CMakePackage/apple-import-unsupported-capture-stdout.txt b/Tests/RunCMake/CMakePackage/apple-import-unsupported-capture-stdout.txt new file mode 100644 index 0000000..107ad03 --- /dev/null +++ b/Tests/RunCMake/CMakePackage/apple-import-unsupported-capture-stdout.txt @@ -0,0 +1,2 @@ +-- Platform not supported +-- Architecture not supported diff --git a/Tests/RunCMake/CMakePackage/apple-import-unsupported-capture.cmake b/Tests/RunCMake/CMakePackage/apple-import-unsupported-capture.cmake new file mode 100644 index 0000000..6df5fe9 --- /dev/null +++ b/Tests/RunCMake/CMakePackage/apple-import-unsupported-capture.cmake @@ -0,0 +1,11 @@ +include(apple-common.cmake) + +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER) +find_package(bad-platform-capture CONFIG REQUIRED) +find_package(bad-arch-capture CONFIG REQUIRED) + +# The above packages capture their own error messages. +# In real packages they would then set _FOUND to false. +# For testing here, just print the messages. +message(STATUS "${bad-platform-capture_unsupported}") +message(STATUS "${bad-arch-capture_unsupported}") diff --git a/Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-architecture-result.txt b/Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-architecture-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-architecture-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-architecture-stderr.txt b/Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-architecture-stderr.txt new file mode 100644 index 0000000..1e84dac --- /dev/null +++ b/Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-architecture-stderr.txt @@ -0,0 +1,6 @@ +^CMake Error at [^ +]*/Tests/RunCMake/CMakePackage/apple-install/lib/cmake/bad-arch-fatal/bad-arch-fatal-config.cmake:[0-9]+ \(message\): + Architecture not supported +Call Stack \(most recent call first\): + apple-import-unsupported-fatal-architecture\.cmake:[0-9]+ \(find_package\) + CMakeLists\.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-architecture.cmake b/Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-architecture.cmake new file mode 100644 index 0000000..7a26e47 --- /dev/null +++ b/Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-architecture.cmake @@ -0,0 +1,4 @@ +include(apple-common.cmake) + +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER) +find_package(bad-arch-fatal CONFIG REQUIRED) diff --git a/Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-platform-result.txt b/Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-platform-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-platform-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-platform-stderr.txt b/Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-platform-stderr.txt new file mode 100644 index 0000000..1eedad8 --- /dev/null +++ b/Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-platform-stderr.txt @@ -0,0 +1,6 @@ +^CMake Error at [^ +]*/Tests/RunCMake/CMakePackage/apple-install/lib/cmake/bad-platform-fatal/bad-platform-fatal-config.cmake:[0-9]+ \(message\): + Platform not supported +Call Stack \(most recent call first\): + apple-import-unsupported-fatal-platform\.cmake:[0-9]+ \(find_package\) + CMakeLists\.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-platform.cmake b/Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-platform.cmake new file mode 100644 index 0000000..b38cd5c --- /dev/null +++ b/Tests/RunCMake/CMakePackage/apple-import-unsupported-fatal-platform.cmake @@ -0,0 +1,4 @@ +include(apple-common.cmake) + +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER) +find_package(bad-platform-fatal CONFIG REQUIRED) -- cgit v0.12