Maintenance.cmake raw
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_windows_deploy_target)
22 if(MINGW AND TARGET bitcoin 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)
23 find_program(MAKENSIS_EXECUTABLE makensis)
24 if(NOT MAKENSIS_EXECUTABLE)
25 add_custom_target(deploy
26 COMMAND ${CMAKE_COMMAND} -E echo "Error: NSIS not found"
27 )
28 return()
29 endif()
30
31 # TODO: Consider replacing this code with the CPack NSIS Generator.
32 # See https://cmake.org/cmake/help/latest/cpack_gen/nsis.html
33 include(GenerateSetupNsi)
34 generate_setup_nsi()
35 add_custom_command(
36 OUTPUT ${PROJECT_BINARY_DIR}/bitcoin-win64-setup.exe
37 COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/release
38 COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoin>
39 COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-qt> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoin-qt>
40 COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoind> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoind>
41 COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-cli> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoin-cli>
42 COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-tx> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoin-tx>
43 COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-wallet> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoin-wallet>
44 COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-util> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoin-util>
45 COMMAND ${CMAKE_STRIP} $<TARGET_FILE:test_bitcoin> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:test_bitcoin>
46 COMMAND ${MAKENSIS_EXECUTABLE} -V2 ${PROJECT_BINARY_DIR}/bitcoin-win64-setup.nsi
47 VERBATIM
48 )
49 add_custom_target(deploy DEPENDS ${PROJECT_BINARY_DIR}/bitcoin-win64-setup.exe)
50 endif()
51 endfunction()
52
53 function(add_macos_deploy_target)
54 if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND TARGET bitcoin-qt)
55 set(macos_app "Bitcoin-Qt.app")
56 # Populate Contents subdirectory.
57 configure_file(${PROJECT_SOURCE_DIR}/share/qt/Info.plist.in ${macos_app}/Contents/Info.plist NO_SOURCE_PERMISSIONS)
58 file(CONFIGURE OUTPUT ${macos_app}/Contents/PkgInfo CONTENT "APPL????")
59 # Populate Contents/Resources subdirectory.
60 file(CONFIGURE OUTPUT ${macos_app}/Contents/Resources/empty.lproj CONTENT "")
61 configure_file(${PROJECT_SOURCE_DIR}/src/qt/res/icons/bitcoin.icns ${macos_app}/Contents/Resources/bitcoin.icns NO_SOURCE_PERMISSIONS COPYONLY)
62 file(CONFIGURE OUTPUT ${macos_app}/Contents/Resources/Base.lproj/InfoPlist.strings
63 CONTENT "{ CFBundleDisplayName = \"@CLIENT_NAME@\"; CFBundleName = \"@CLIENT_NAME@\"; }"
64 )
65
66 add_custom_command(
67 OUTPUT ${PROJECT_BINARY_DIR}/${macos_app}/Contents/MacOS/Bitcoin-Qt
68 COMMAND ${CMAKE_COMMAND} --install ${PROJECT_BINARY_DIR} --config $<CONFIG> --component bitcoin-qt --prefix ${macos_app}/Contents/MacOS --strip
69 COMMAND ${CMAKE_COMMAND} -E rename ${macos_app}/Contents/MacOS/bin/$<TARGET_FILE_NAME:bitcoin-qt> ${macos_app}/Contents/MacOS/Bitcoin-Qt
70 COMMAND ${CMAKE_COMMAND} -E rm -rf ${macos_app}/Contents/MacOS/bin
71 COMMAND ${CMAKE_COMMAND} -E rm -rf ${macos_app}/Contents/MacOS/share
72 VERBATIM
73 )
74
75 set(macos_zip "bitcoin-macos-app")
76 if(CMAKE_HOST_APPLE)
77 add_custom_command(
78 OUTPUT ${PROJECT_BINARY_DIR}/${macos_zip}.zip
79 COMMAND Python3::Interpreter ${PROJECT_SOURCE_DIR}/contrib/macdeploy/macdeployqtplus ${macos_app} -translations-dir=${QT_TRANSLATIONS_DIR} -zip=${macos_zip}
80 DEPENDS ${PROJECT_BINARY_DIR}/${macos_app}/Contents/MacOS/Bitcoin-Qt
81 VERBATIM
82 )
83 add_custom_target(deploydir
84 DEPENDS ${PROJECT_BINARY_DIR}/${macos_zip}.zip
85 )
86 add_custom_target(deploy
87 DEPENDS ${PROJECT_BINARY_DIR}/${macos_zip}.zip
88 )
89 else()
90 add_custom_command(
91 OUTPUT ${PROJECT_BINARY_DIR}/dist/${macos_app}/Contents/MacOS/Bitcoin-Qt
92 COMMAND ${CMAKE_COMMAND} -E env OBJDUMP=${CMAKE_OBJDUMP} $<TARGET_FILE:Python3::Interpreter> ${PROJECT_SOURCE_DIR}/contrib/macdeploy/macdeployqtplus ${macos_app} -translations-dir=${QT_TRANSLATIONS_DIR}
93 DEPENDS ${PROJECT_BINARY_DIR}/${macos_app}/Contents/MacOS/Bitcoin-Qt
94 VERBATIM
95 )
96 add_custom_target(deploydir
97 DEPENDS ${PROJECT_BINARY_DIR}/dist/${macos_app}/Contents/MacOS/Bitcoin-Qt
98 )
99
100 find_program(ZIP_EXECUTABLE zip)
101 if(NOT ZIP_EXECUTABLE)
102 add_custom_target(deploy
103 COMMAND ${CMAKE_COMMAND} -E echo "Error: ZIP not found"
104 )
105 else()
106 add_custom_command(
107 OUTPUT ${PROJECT_BINARY_DIR}/dist/${macos_zip}.zip
108 WORKING_DIRECTORY dist
109 COMMAND ${PROJECT_SOURCE_DIR}/cmake/script/macos_zip.sh ${ZIP_EXECUTABLE} ${macos_zip}.zip
110 VERBATIM
111 )
112 add_custom_target(deploy
113 DEPENDS ${PROJECT_BINARY_DIR}/dist/${macos_zip}.zip
114 )
115 endif()
116 endif()
117 add_dependencies(deploydir bitcoin-qt)
118 add_dependencies(deploy deploydir)
119 endif()
120 endfunction()
121