|
| 1 | +# Copyright (c) 2023-present The Bitcoin Core developers |
| 2 | +# Distributed under the MIT software license, see the accompanying |
| 3 | +# file COPYING or https://opensource.org/license/mit/. |
| 4 | + |
| 5 | +include_guard(GLOBAL) |
| 6 | + |
| 7 | +function(setup_split_debug_script) |
| 8 | + if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux") |
| 9 | + set(OBJCOPY ${CMAKE_OBJCOPY}) |
| 10 | + set(STRIP ${CMAKE_STRIP}) |
| 11 | + configure_file( |
| 12 | + contrib/devtools/split-debug.sh.in split-debug.sh |
| 13 | + FILE_PERMISSIONS OWNER_READ OWNER_EXECUTE |
| 14 | + GROUP_READ GROUP_EXECUTE |
| 15 | + WORLD_READ |
| 16 | + @ONLY |
| 17 | + ) |
| 18 | + endif() |
| 19 | +endfunction() |
| 20 | + |
| 21 | +function(add_maintenance_targets) |
| 22 | + if(NOT PYTHON_COMMAND) |
| 23 | + return() |
| 24 | + endif() |
| 25 | + |
| 26 | + if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") |
| 27 | + set(exe_format MACHO) |
| 28 | + elseif(WIN32) |
| 29 | + set(exe_format PE) |
| 30 | + else() |
| 31 | + set(exe_format ELF) |
| 32 | + endif() |
| 33 | + |
| 34 | + # In CMake, the components of the compiler invocation are separated into distinct variables: |
| 35 | + # - CMAKE_CXX_COMPILER: the full path to the compiler binary itself (e.g., /usr/bin/clang++). |
| 36 | + # - CMAKE_CXX_COMPILER_ARG1: a string containing initial compiler options (e.g., --target=x86_64-apple-darwin -nostdlibinc). |
| 37 | + # By concatenating these variables, we form the complete command line to be passed to a Python script via the CXX environment variable. |
| 38 | + string(STRIP "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}" cxx_compiler_command) |
| 39 | + add_custom_target(test-security-check |
| 40 | + COMMAND ${CMAKE_COMMAND} -E env CXX=${cxx_compiler_command} CXXFLAGS=${CMAKE_CXX_FLAGS} LDFLAGS=${CMAKE_EXE_LINKER_FLAGS} ${PYTHON_COMMAND} ${PROJECT_SOURCE_DIR}/contrib/devtools/test-security-check.py TestSecurityChecks.test_${exe_format} |
| 41 | + COMMAND ${CMAKE_COMMAND} -E env CXX=${cxx_compiler_command} CXXFLAGS=${CMAKE_CXX_FLAGS} LDFLAGS=${CMAKE_EXE_LINKER_FLAGS} ${PYTHON_COMMAND} ${PROJECT_SOURCE_DIR}/contrib/devtools/test-symbol-check.py TestSymbolChecks.test_${exe_format} |
| 42 | + VERBATIM |
| 43 | + ) |
| 44 | + |
| 45 | + foreach(target IN ITEMS bitcoind bitcoin-qt bitcoin-cli bitcoin-tx bitcoin-util bitcoin-wallet test_bitcoin bench_bitcoin) |
| 46 | + if(TARGET ${target}) |
| 47 | + list(APPEND executables $<TARGET_FILE:${target}>) |
| 48 | + endif() |
| 49 | + endforeach() |
| 50 | + |
| 51 | + add_custom_target(check-symbols |
| 52 | + COMMAND ${CMAKE_COMMAND} -E echo "Running symbol and dynamic library checks..." |
| 53 | + COMMAND ${PYTHON_COMMAND} ${PROJECT_SOURCE_DIR}/contrib/devtools/symbol-check.py ${executables} |
| 54 | + VERBATIM |
| 55 | + ) |
| 56 | + |
| 57 | + if(ENABLE_HARDENING) |
| 58 | + add_custom_target(check-security |
| 59 | + COMMAND ${CMAKE_COMMAND} -E echo "Checking binary security..." |
| 60 | + COMMAND ${PYTHON_COMMAND} ${PROJECT_SOURCE_DIR}/contrib/devtools/security-check.py ${executables} |
| 61 | + VERBATIM |
| 62 | + ) |
| 63 | + else() |
| 64 | + add_custom_target(check-security) |
| 65 | + endif() |
| 66 | +endfunction() |
| 67 | + |
| 68 | +function(add_windows_deploy_target) |
| 69 | + if(MINGW AND TARGET bitcoin-qt AND TARGET bitcoind AND TARGET bitcoin-cli AND TARGET bitcoin-tx AND TARGET bitcoin-wallet AND TARGET bitcoin-util AND TARGET test_bitcoin) |
| 70 | + # TODO: Consider replacing this code with the CPack NSIS Generator. |
| 71 | + # See https://cmake.org/cmake/help/latest/cpack_gen/nsis.html |
| 72 | + include(GenerateSetupNsi) |
| 73 | + generate_setup_nsi() |
| 74 | + add_custom_command( |
| 75 | + OUTPUT ${PROJECT_BINARY_DIR}/bitcoin-win64-setup.exe |
| 76 | + COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/release |
| 77 | + COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-qt> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoin-qt> |
| 78 | + COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoind> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoind> |
| 79 | + COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-cli> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoin-cli> |
| 80 | + COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-tx> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoin-tx> |
| 81 | + COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-wallet> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoin-wallet> |
| 82 | + COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-util> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoin-util> |
| 83 | + COMMAND ${CMAKE_STRIP} $<TARGET_FILE:test_bitcoin> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:test_bitcoin> |
| 84 | + COMMAND makensis -V2 ${PROJECT_BINARY_DIR}/bitcoin-win64-setup.nsi |
| 85 | + VERBATIM |
| 86 | + ) |
| 87 | + add_custom_target(deploy DEPENDS ${PROJECT_BINARY_DIR}/bitcoin-win64-setup.exe) |
| 88 | + endif() |
| 89 | +endfunction() |
| 90 | + |
| 91 | +function(add_macos_deploy_target) |
| 92 | + if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND TARGET bitcoin-qt) |
| 93 | + set(macos_app "Bitcoin-Qt.app") |
| 94 | + # Populate Contents subdirectory. |
| 95 | + configure_file(${PROJECT_SOURCE_DIR}/share/qt/Info.plist.in ${macos_app}/Contents/Info.plist) |
| 96 | + file(CONFIGURE OUTPUT ${macos_app}/Contents/PkgInfo CONTENT "APPL????") |
| 97 | + # Populate Contents/Resources subdirectory. |
| 98 | + file(CONFIGURE OUTPUT ${macos_app}/Contents/Resources/empty.lproj CONTENT "") |
| 99 | + configure_file(${PROJECT_SOURCE_DIR}/src/qt/res/icons/bitcoin.icns ${macos_app}/Contents/Resources/bitcoin.icns COPYONLY) |
| 100 | + file(CONFIGURE OUTPUT ${macos_app}/Contents/Resources/Base.lproj/InfoPlist.strings |
| 101 | + CONTENT "{ CFBundleDisplayName = \"@PACKAGE_NAME@\"; CFBundleName = \"@PACKAGE_NAME@\"; }" |
| 102 | + ) |
| 103 | + |
| 104 | + add_custom_command( |
| 105 | + OUTPUT ${PROJECT_BINARY_DIR}/${macos_app}/Contents/MacOS/Bitcoin-Qt |
| 106 | + COMMAND ${CMAKE_COMMAND} --install ${PROJECT_BINARY_DIR} --config $<CONFIG> --component GUI --prefix ${macos_app}/Contents/MacOS --strip |
| 107 | + COMMAND ${CMAKE_COMMAND} -E rename ${macos_app}/Contents/MacOS/bin/$<TARGET_FILE_NAME:bitcoin-qt> ${macos_app}/Contents/MacOS/Bitcoin-Qt |
| 108 | + COMMAND ${CMAKE_COMMAND} -E rm -rf ${macos_app}/Contents/MacOS/bin |
| 109 | + VERBATIM |
| 110 | + ) |
| 111 | + |
| 112 | + string(REPLACE " " "-" osx_volname ${PACKAGE_NAME}) |
| 113 | + if(CMAKE_HOST_APPLE) |
| 114 | + add_custom_command( |
| 115 | + OUTPUT ${PROJECT_BINARY_DIR}/${osx_volname}.zip |
| 116 | + COMMAND ${PYTHON_COMMAND} ${PROJECT_SOURCE_DIR}/contrib/macdeploy/macdeployqtplus ${macos_app} ${osx_volname} -translations-dir=${QT_TRANSLATIONS_DIR} -zip |
| 117 | + DEPENDS ${PROJECT_BINARY_DIR}/${macos_app}/Contents/MacOS/Bitcoin-Qt |
| 118 | + VERBATIM |
| 119 | + ) |
| 120 | + add_custom_target(deploydir |
| 121 | + DEPENDS ${PROJECT_BINARY_DIR}/${osx_volname}.zip |
| 122 | + ) |
| 123 | + add_custom_target(deploy |
| 124 | + DEPENDS ${PROJECT_BINARY_DIR}/${osx_volname}.zip |
| 125 | + ) |
| 126 | + else() |
| 127 | + add_custom_command( |
| 128 | + OUTPUT ${PROJECT_BINARY_DIR}/dist/${macos_app}/Contents/MacOS/Bitcoin-Qt |
| 129 | + COMMAND OBJDUMP=${CMAKE_OBJDUMP} ${PYTHON_COMMAND} ${PROJECT_SOURCE_DIR}/contrib/macdeploy/macdeployqtplus ${macos_app} ${osx_volname} -translations-dir=${QT_TRANSLATIONS_DIR} |
| 130 | + DEPENDS ${PROJECT_BINARY_DIR}/${macos_app}/Contents/MacOS/Bitcoin-Qt |
| 131 | + VERBATIM |
| 132 | + ) |
| 133 | + add_custom_target(deploydir |
| 134 | + DEPENDS ${PROJECT_BINARY_DIR}/dist/${macos_app}/Contents/MacOS/Bitcoin-Qt |
| 135 | + ) |
| 136 | + |
| 137 | + find_program(ZIP_COMMAND zip REQUIRED) |
| 138 | + add_custom_command( |
| 139 | + OUTPUT ${PROJECT_BINARY_DIR}/dist/${osx_volname}.zip |
| 140 | + WORKING_DIRECTORY dist |
| 141 | + COMMAND ${PROJECT_SOURCE_DIR}/cmake/script/macos_zip.sh ${ZIP_COMMAND} ${osx_volname}.zip |
| 142 | + VERBATIM |
| 143 | + ) |
| 144 | + add_custom_target(deploy |
| 145 | + DEPENDS ${PROJECT_BINARY_DIR}/dist/${osx_volname}.zip |
| 146 | + ) |
| 147 | + endif() |
| 148 | + add_dependencies(deploydir bitcoin-qt) |
| 149 | + add_dependencies(deploy deploydir) |
| 150 | + endif() |
| 151 | +endfunction() |
0 commit comments