Skip to content

Commit 747adb6

Browse files
committed
cmake: Add Maintenance module
1 parent 1f60b30 commit 747adb6

File tree

4 files changed

+187
-0
lines changed

4 files changed

+187
-0
lines changed

CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,12 @@ add_subdirectory(src)
540540

541541
include(cmake/tests.cmake)
542542

543+
include(Maintenance)
544+
setup_split_debug_script()
545+
add_maintenance_targets()
546+
add_windows_deploy_target()
547+
add_macos_deploy_target()
548+
543549
message("\n")
544550
message("Configure summary")
545551
message("=================")

cmake/module/GenerateSetupNsi.cmake

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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+
function(generate_setup_nsi)
6+
set(abs_top_srcdir ${PROJECT_SOURCE_DIR})
7+
set(abs_top_builddir ${PROJECT_BINARY_DIR})
8+
set(PACKAGE_URL ${PROJECT_HOMEPAGE_URL})
9+
set(PACKAGE_TARNAME "bitcoin")
10+
set(BITCOIN_GUI_NAME "bitcoin-qt")
11+
set(BITCOIN_DAEMON_NAME "bitcoind")
12+
set(BITCOIN_CLI_NAME "bitcoin-cli")
13+
set(BITCOIN_TX_NAME "bitcoin-tx")
14+
set(BITCOIN_WALLET_TOOL_NAME "bitcoin-wallet")
15+
set(BITCOIN_TEST_NAME "test_bitcoin")
16+
set(EXEEXT ${CMAKE_EXECUTABLE_SUFFIX})
17+
configure_file(${PROJECT_SOURCE_DIR}/share/setup.nsi.in ${PROJECT_BINARY_DIR}/bitcoin-win64-setup.nsi @ONLY)
18+
endfunction()

cmake/module/Maintenance.cmake

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
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()

cmake/script/macos_zip.sh

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#!/bin/sh
2+
# Copyright (c) 2024-present The Bitcoin Core developers
3+
# Distributed under the MIT software license, see the accompanying
4+
# file COPYING or https://opensource.org/license/mit/.
5+
6+
export LC_ALL=C
7+
8+
if [ -n "$SOURCE_DATE_EPOCH" ]; then
9+
find . -exec touch -d "@$SOURCE_DATE_EPOCH" {} +
10+
fi
11+
12+
find . | sort | "$1" -X@ "$2"

0 commit comments

Comments
 (0)