From 32cd10620f5fd25635265af6bf0fbb1802d24fa9 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 10 May 2026 11:21:39 +0200 Subject: [PATCH] CMake: fixes for xcodebuild --- CMakeLists.txt | 12 +++++++ cmake/Modules/BuildProtobuf.cmake | 18 +++++++++++ src/main/CMakeLists.txt | 32 ++++++++++++++++--- tests/CMakeLists.txt | 52 +++++++++++++++++++++++++------ 4 files changed, 101 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 76b4ed3bf..1731714af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -137,6 +137,11 @@ if(ENABLE_PACKAGING) set(ENABLE_STRIP OFF) endif() +option(ENABLE_GNSSSDR_ADHOC_CODESIGN + "Ad-hoc sign local Darwin build-tree executables that must run after the build." + ON +) + # Testing option(ENABLE_UNIT_TESTING "Build unit tests" ON) @@ -275,6 +280,12 @@ endif() if(NOT ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")) set(ENABLE_STRIP OFF) endif() +if("${CMAKE_SYSTEM_NAME}" MATCHES "Darwin") + find_program(CODESIGN_EXECUTABLE codesign) +endif() +if(NOT CODESIGN_EXECUTABLE) + set(ENABLE_GNSSSDR_ADHOC_CODESIGN OFF) +endif() # Enable optimization options in GCC for Release and RelWithDebInfo build types if((${CMAKE_SYSTEM_NAME} MATCHES "Linux|kFreeBSD|GNU") AND (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")) @@ -3417,6 +3428,7 @@ add_feature_info(ENABLE_INSTALL_TESTS ENABLE_INSTALL_TESTS "Install test binarie add_feature_info(ENABLE_BENCHMARKS ENABLE_BENCHMARKS "Enables building of code snippet benchmarks.") add_feature_info(ENABLE_EXTERNAL_MATHJAX ENABLE_EXTERNAL_MATHJAX "Use MathJax from an external CDN in HTML docs when doing '${CMAKE_MAKE_PROGRAM_PRETTY_NAME} doc'.") add_feature_info(ENABLE_CPUFEATURES ENABLE_CPUFEATURES "Make use of the cpu_features library.") +add_feature_info(ENABLE_GNSSSDR_ADHOC_CODESIGN ENABLE_GNSSSDR_ADHOC_CODESIGN "Ad-hoc sign local Darwin build-tree executables that must run after the build.") add_feature_info(Boost_USE_STATIC_LIBS Boost_USE_STATIC_LIBS "Use Boost static libraries.") message(STATUS "") diff --git a/cmake/Modules/BuildProtobuf.cmake b/cmake/Modules/BuildProtobuf.cmake index 2002379c6..e12d0bfc4 100644 --- a/cmake/Modules/BuildProtobuf.cmake +++ b/cmake/Modules/BuildProtobuf.cmake @@ -175,6 +175,24 @@ ExternalProject_Add(protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} INSTALL_COMMAND "" ) +if("${CMAKE_SYSTEM_NAME}" MATCHES "Darwin") + find_program(CODESIGN_EXECUTABLE codesign) + + if(CODESIGN_EXECUTABLE) + ExternalProject_Add_Step( + protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} + codesign_protoc + COMMAND ${CODESIGN_EXECUTABLE} + --force + --sign - + ${PROTOBUF_PROTOC_EXECUTABLE_} + DEPENDEES build + COMMENT "Ad-hoc signing bundled protoc executable" + VERBATIM + ) + endif() +endif() + file(MAKE_DIRECTORY ${GNSSSDR_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}/include) file(MAKE_DIRECTORY ${GNSSSDR_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}/${CMAKE_INSTALL_LIBDIR}) diff --git a/src/main/CMakeLists.txt b/src/main/CMakeLists.txt index a5e68b546..ac0f42883 100644 --- a/src/main/CMakeLists.txt +++ b/src/main/CMakeLists.txt @@ -88,10 +88,34 @@ if(ENABLE_CLANG_TIDY) endif() endif() -add_custom_command(TARGET gnss-sdr - POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $ - ${LOCAL_INSTALL_BASE_DIR}/install/$ -) +if(ENABLE_GNSSSDR_ADHOC_CODESIGN) + add_custom_command(TARGET gnss-sdr POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory + ${LOCAL_INSTALL_BASE_DIR}/install + COMMAND ${CMAKE_COMMAND} -E copy + $ + ${LOCAL_INSTALL_BASE_DIR}/install/$.tmp + COMMAND ${CODESIGN_EXECUTABLE} + --force + --sign - + ${LOCAL_INSTALL_BASE_DIR}/install/$.tmp + COMMAND ${CMAKE_COMMAND} -E remove -f + ${LOCAL_INSTALL_BASE_DIR}/install/$ + COMMAND ${CMAKE_COMMAND} -E rename + ${LOCAL_INSTALL_BASE_DIR}/install/$.tmp + ${LOCAL_INSTALL_BASE_DIR}/install/$ + VERBATIM + ) +else() + add_custom_command(TARGET gnss-sdr POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory + ${LOCAL_INSTALL_BASE_DIR}/install + COMMAND ${CMAKE_COMMAND} -E copy + $ + ${LOCAL_INSTALL_BASE_DIR}/install/$ + VERBATIM + ) +endif() install(TARGETS gnss-sdr RUNTIME DESTINATION bin diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d84bdb98d..8d62cb43e 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -15,6 +15,43 @@ if(CMAKE_VERSION VERSION_LESS "3.5") include(CMakeParseArguments) endif() +function(gnsssdr_copy_target_to_local_install target) + if(NOT TARGET ${target}) + message(FATAL_ERROR + "gnsssdr_copy_target_to_local_install called for unknown target: ${target}" + ) + endif() + + if(ENABLE_GNSSSDR_ADHOC_CODESIGN) + add_custom_command(TARGET ${target} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory + ${LOCAL_INSTALL_BASE_DIR}/install + COMMAND ${CMAKE_COMMAND} -E copy + "$" + "${LOCAL_INSTALL_BASE_DIR}/install/$.tmp" + COMMAND ${CODESIGN_EXECUTABLE} + --force + --sign - + "${LOCAL_INSTALL_BASE_DIR}/install/$.tmp" + COMMAND ${CMAKE_COMMAND} -E remove -f + "${LOCAL_INSTALL_BASE_DIR}/install/$" + COMMAND ${CMAKE_COMMAND} -E rename + "${LOCAL_INSTALL_BASE_DIR}/install/$.tmp" + "${LOCAL_INSTALL_BASE_DIR}/install/$" + VERBATIM + ) + else() + add_custom_command(TARGET ${target} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory + ${LOCAL_INSTALL_BASE_DIR}/install + COMMAND ${CMAKE_COMMAND} -E copy + "$" + "${LOCAL_INSTALL_BASE_DIR}/install/$" + VERBATIM + ) + endif() +endfunction() + # Helper to fetch optional test data with integrity checking and optional uncompressing # # Arguments: @@ -711,10 +748,7 @@ if(ENABLE_UNIT_TESTING) endif() install(TARGETS run_tests RUNTIME DESTINATION bin COMPONENT "run_tests") else() - add_custom_command(TARGET run_tests POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy $ - ${LOCAL_INSTALL_BASE_DIR}/install/$ - ) + gnsssdr_copy_target_to_local_install(run_tests) endif() if(ENABLE_GPERFTOOLS) if(GPERFTOOLS_FOUND) @@ -882,12 +916,12 @@ function(add_system_test executable) if(EXISTS ${LOCAL_INSTALL_BASE_DIR}/install/${executable}) file(REMOVE ${LOCAL_INSTALL_BASE_DIR}/install/${executable}) endif() - install(TARGETS ${executable} RUNTIME DESTINATION bin COMPONENT "${executable}_test") - else() - add_custom_command(TARGET ${executable} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy $ - ${LOCAL_INSTALL_BASE_DIR}/install/$ + install(TARGETS ${executable} + RUNTIME DESTINATION bin + COMPONENT "${executable}_test" ) + else() + gnsssdr_copy_target_to_local_install(${executable}) endif() xcode_remove_warning_duplicates(${executable})