mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-05 21:31:08 -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
137 lines
4.8 KiB
CMake
137 lines
4.8 KiB
CMake
cmake_minimum_required(VERSION 2.8.12)
|
|
project(BundleUtilities)
|
|
|
|
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()
|
|
|
|
###### the various types of dependencies we can have
|
|
|
|
# a shared library
|
|
add_library(shared SHARED shared.cpp shared.h)
|
|
|
|
# another shared library
|
|
add_library(shared2 SHARED shared2.cpp shared2.h)
|
|
|
|
|
|
# a framework library
|
|
add_library(framework SHARED framework.cpp framework.h)
|
|
set_target_properties(framework PROPERTIES FRAMEWORK 1)
|
|
|
|
# make sure rpaths are not helping BundleUtilities or the executables
|
|
set_target_properties(shared shared2 framework PROPERTIES
|
|
SKIP_BUILD_RPATH 1)
|
|
|
|
|
|
###### test a Bundle application using dependencies
|
|
|
|
# a loadable module (depends on shared2)
|
|
# testbundleutils1 will load this at runtime
|
|
add_library(module1 MODULE module.cpp module.h)
|
|
set_target_properties(module1 PROPERTIES PREFIX "")
|
|
target_link_libraries(module1 shared2)
|
|
|
|
# a bundle application
|
|
add_executable(testbundleutils1 MACOSX_BUNDLE testbundleutils1.cpp)
|
|
target_link_libraries(testbundleutils1 shared framework ${CMAKE_DL_LIBS})
|
|
|
|
set_target_properties(testbundleutils1 module1 PROPERTIES
|
|
INSTALL_RPATH "${CMAKE_CURRENT_BINARY_DIR}/testdir1"
|
|
BUILD_WITH_INSTALL_RPATH 1)
|
|
|
|
# add custom target to install and test the app
|
|
add_custom_target(testbundleutils1_test ALL
|
|
COMMAND ${CMAKE_COMMAND}
|
|
"-DINPUT=$<TARGET_FILE:testbundleutils1>"
|
|
"-DMODULE=$<TARGET_FILE:module1>"
|
|
"-DINPUTDIR=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}"
|
|
"-DOUTPUTDIR=${CMAKE_CURRENT_BINARY_DIR}/testdir1"
|
|
-P "${CMAKE_CURRENT_SOURCE_DIR}/bundleutils.cmake"
|
|
DEPENDS testbundleutils1 module1
|
|
)
|
|
|
|
add_dependencies(testbundleutils1_test testbundleutils1)
|
|
|
|
|
|
|
|
###### test a non-Bundle application using dependencies
|
|
|
|
# a loadable module (depends on shared2)
|
|
# testbundleutils2 will load this at runtime
|
|
add_library(module2 MODULE module.cpp module.h)
|
|
set_target_properties(module2 PROPERTIES PREFIX "")
|
|
target_link_libraries(module2 shared2)
|
|
|
|
# a non-bundle application
|
|
add_executable(testbundleutils2 testbundleutils2.cpp)
|
|
target_link_libraries(testbundleutils2 shared framework ${CMAKE_DL_LIBS})
|
|
|
|
set_target_properties(testbundleutils2 module2 PROPERTIES
|
|
INSTALL_RPATH "${CMAKE_CURRENT_BINARY_DIR}/testdir2"
|
|
BUILD_WITH_INSTALL_RPATH 1)
|
|
|
|
# add custom target to install and test the app
|
|
add_custom_target(testbundleutils2_test ALL
|
|
COMMAND ${CMAKE_COMMAND}
|
|
"-DINPUT=$<TARGET_FILE:testbundleutils2>"
|
|
"-DMODULE=$<TARGET_FILE:module2>"
|
|
"-DINPUTDIR=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}"
|
|
"-DOUTPUTDIR=${CMAKE_CURRENT_BINARY_DIR}/testdir2"
|
|
-P "${CMAKE_CURRENT_SOURCE_DIR}/bundleutils.cmake"
|
|
DEPENDS testbundleutils1 module2
|
|
)
|
|
add_dependencies(testbundleutils2_test testbundleutils2)
|
|
|
|
|
|
if(APPLE AND NOT CMAKE_SYSTEM_VERSION VERSION_LESS 9.0)
|
|
###### Test a Bundle application using dependencies
|
|
###### and @rpaths on Mac OS X 10.5 or greater
|
|
|
|
# a shared library
|
|
add_library(shared-3 SHARED shared.cpp shared.h)
|
|
|
|
# another shared library
|
|
add_library(shared2-3 SHARED shared2.cpp shared2.h)
|
|
|
|
# a framework library
|
|
add_library(framework-3 SHARED framework.cpp framework.h)
|
|
set_target_properties(framework-3 PROPERTIES FRAMEWORK 1)
|
|
|
|
# build dependencies with @rpath install name
|
|
set_target_properties(shared-3 shared2-3 framework-3 PROPERTIES
|
|
INSTALL_NAME_DIR "@rpath"
|
|
BUILD_WITH_INSTALL_RPATH 1)
|
|
|
|
# a loadable module (depends on shared2)
|
|
# testbundleutils1 will load this at runtime
|
|
add_library(module3 MODULE module.cpp module.h)
|
|
set_target_properties(module3 PROPERTIES PREFIX "" LINK_FLAGS "-Wl,-rpath,@loader_path/")
|
|
target_link_libraries(module3 shared2-3)
|
|
|
|
# a non-bundle application
|
|
add_executable(testbundleutils3 testbundleutils3.cpp)
|
|
target_link_libraries(testbundleutils3 shared-3 framework-3 ${CMAKE_DL_LIBS})
|
|
|
|
set_target_properties(testbundleutils3 module3 PROPERTIES
|
|
LINK_FLAGS "-Wl,-rpath,@loader_path/"
|
|
BUILD_WITH_INSTALL_RPATH 1)
|
|
|
|
# add custom target to install and test the app
|
|
add_custom_target(testbundleutils3_test ALL
|
|
COMMAND ${CMAKE_COMMAND}
|
|
"-DINPUT=$<TARGET_FILE:testbundleutils3>"
|
|
"-DMODULE=$<TARGET_FILE:module3>"
|
|
"-DINPUTDIR=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}"
|
|
"-DOUTPUTDIR=${CMAKE_CURRENT_BINARY_DIR}/testdir3"
|
|
-P "${CMAKE_CURRENT_SOURCE_DIR}/bundleutils.cmake"
|
|
DEPENDS testbundleutils3 module3
|
|
)
|
|
|
|
add_dependencies(testbundleutils3_test testbundleutils3)
|
|
endif()
|