https://github.com/Kitware/CMake
Raw File
Tip revision: dc45b20aca1323d8497ac08d202fe238727c7198 authored by Brad King on 22 February 2024, 14:40:22 UTC
CMake 3.29.0-rc2
Tip revision: dc45b20
CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
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()
back to top