mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-06 05:40:54 -06:00
Some tests fail because Xcode runs `POST_BUILD` commands before signing the binaries they run. Tell the linker to perform ad-hoc codesign even though Xcode normally tells it not to. Other tests fail because `install_name_tool` does not revise ad-hoc signatures without the codesign `linker-signed` flag. Add that flag ourselves where needed by our tests. For now these changes help our test suite pass so we can use it to cover everything else. Both of these cases may need further investigation to update CMake to help projects in general. Issue: #21845, #21854
114 lines
3.9 KiB
CMake
114 lines
3.9 KiB
CMake
cmake_minimum_required (VERSION 2.6)
|
|
project(BundleTest)
|
|
set(MACOSX_BUNDLE_INFO_STRING "bundle_info_string")
|
|
set(CMAKE_MacOSX_Content_COMPILE_OBJECT "\"${CMAKE_COMMAND}\" -E copy_if_different <SOURCE> <OBJECT>")
|
|
|
|
if(CMAKE_GENERATOR STREQUAL "Xcode" AND
|
|
"${CMAKE_SYSTEM_NAME};${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "Darwin;arm64")
|
|
# Tell Xcode to pretend the linker signed binaries so that
|
|
# editing with install_name_tool preserves ad-hoc signatures.
|
|
# See CMake Issue 21854.
|
|
# This option is supported by codesign on macOS 11 or higher.
|
|
set(CMAKE_XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "-o linker-signed")
|
|
endif()
|
|
|
|
add_custom_command(
|
|
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/randomResourceFile.plist"
|
|
COMMAND /bin/cp
|
|
ARGS "${CMAKE_CURRENT_SOURCE_DIR}/randomResourceFile.plist.in"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/randomResourceFile.plist")
|
|
|
|
set_source_files_properties(
|
|
"${CMAKE_CURRENT_BINARY_DIR}/randomResourceFile.plist"
|
|
PROPERTIES
|
|
MACOSX_PACKAGE_LOCATION Resources
|
|
)
|
|
|
|
set_source_files_properties(
|
|
SomeRandomFile.txt
|
|
"${BundleTest_SOURCE_DIR}/../../README.rst"
|
|
PROPERTIES
|
|
MACOSX_PACKAGE_LOCATION Other
|
|
)
|
|
|
|
set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/foobar")
|
|
|
|
# Test building a bundle linking to a shared library where the
|
|
# shared library links to CoreFoundation, but the executable does not
|
|
# explicitly link to CoreFoundation, but the executable does *depend*
|
|
# on CoreFoundation. There should be a link failure for the executable
|
|
# if CMake's dependency chaining for libraries with "-framework
|
|
# blah" style dependencies gets broken...
|
|
#
|
|
add_library(BundleTestLib SHARED BundleLib.cxx)
|
|
target_link_libraries(BundleTestLib "-framework CoreFoundation")
|
|
|
|
add_executable(BundleTest
|
|
MACOSX_BUNDLE
|
|
BundleTest.cxx
|
|
SomeRandomFile.txt
|
|
"${BundleTest_SOURCE_DIR}/../../README.rst"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/randomResourceFile.plist"
|
|
)
|
|
target_link_libraries(BundleTest BundleTestLib)
|
|
#
|
|
# DO NOT: target_link_libraries(BundleTest "-framework CoreFoundation")
|
|
# (see above comments about CoreFoundation)
|
|
#
|
|
|
|
# Test bundle installation.
|
|
#install(TARGETS BundleTestLib DESTINATION Applications/BundleTestExe.app/Contents/Plugins)
|
|
install(TARGETS BundleTestLib DESTINATION Applications/SecondBundleExe.app/Contents/Plugins)
|
|
install(TARGETS BundleTest DESTINATION Applications)
|
|
|
|
# Test whether bundles respect the output name. Since the library is
|
|
# installed into a location that uses this output name this will fail if the
|
|
# bundle does not respect the name. Also the executable will not be found by
|
|
# the test driver if this does not work.
|
|
set_target_properties(BundleTest PROPERTIES OUTPUT_NAME BundleTestExe)
|
|
|
|
# Test executable versioning if it is supported.
|
|
if(NOT XCODE)
|
|
set_target_properties(BundleTest PROPERTIES VERSION 1)
|
|
endif()
|
|
|
|
# Make sure the executable can find its installed library.
|
|
set_target_properties(BundleTestLib PROPERTIES
|
|
INSTALL_NAME_DIR "@executable_path/../Plugins")
|
|
|
|
include(CPack)
|
|
|
|
# test the framework find stuff
|
|
if(EXISTS /usr/lib/libtcl.dylib
|
|
AND EXISTS /System/Library/Frameworks/Tcl.framework)
|
|
set(TCL NOTFOUND)
|
|
find_library(TCL tcl)
|
|
message("frame: ${TCL}")
|
|
if(NOT "${TCL}" MATCHES .framework)
|
|
message(FATAL_ERROR "Could not find tcl framework, found ${TCL}")
|
|
endif()
|
|
set(TCL NOTFOUND)
|
|
set(CMAKE_FIND_FRAMEWORK LAST)
|
|
find_library(TCL tcl)
|
|
if("${TCL}" MATCHES .framework)
|
|
message(FATAL_ERROR "Found framework and should have found dylib ${TCL}")
|
|
endif()
|
|
set(TCL NOTFOUND)
|
|
set(CMAKE_FIND_FRAMEWORK NEVER)
|
|
find_library(TCL tcl)
|
|
if("${TCL}" MATCHES .framework)
|
|
message(FATAL_ERROR "Found framework and should have found dylib ${TCL}")
|
|
endif()
|
|
message("not frame: ${TCL}")
|
|
set(TCL NOTFOUND)
|
|
set(CMAKE_FIND_FRAMEWORK FIRST)
|
|
find_library(TCL tcl)
|
|
if(NOT "${TCL}" MATCHES .framework)
|
|
message(FATAL_ERROR "Could not find tcl framework, found ${TCL}")
|
|
endif()
|
|
message("frame: ${TCL}")
|
|
endif(EXISTS /usr/lib/libtcl.dylib
|
|
AND EXISTS /System/Library/Frameworks/Tcl.framework)
|
|
|
|
subdirs(BundleSubDir)
|