Maintenance.cmake raw
1 # Copyright (c) 2023-present The Limenka 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 foreach(target IN ITEMS limenkad limenka-qt limenka-cli limenka-tx limenka-util limenka-wallet test_limenka bench_limenka)
27 if(TARGET ${target})
28 list(APPEND executables $<TARGET_FILE:${target}>)
29 endif()
30 endforeach()
31
32 add_custom_target(check-symbols
33 COMMAND ${CMAKE_COMMAND} -E echo "Running symbol and dynamic library checks..."
34 COMMAND ${PYTHON_COMMAND} ${PROJECT_SOURCE_DIR}/contrib/devtools/symbol-check.py ${executables}
35 VERBATIM
36 )
37
38 add_custom_target(check-security
39 COMMAND ${CMAKE_COMMAND} -E echo "Checking binary security..."
40 COMMAND ${PYTHON_COMMAND} ${PROJECT_SOURCE_DIR}/contrib/devtools/security-check.py ${executables}
41 VERBATIM
42 )
43 endfunction()
44
45 function(add_windows_deploy_target)
46 if(MINGW AND TARGET limenka-qt AND TARGET limenkad AND TARGET limenka-cli AND TARGET limenka-tx AND TARGET limenka-wallet AND TARGET limenka-util AND TARGET test_limenka)
47 # TODO: Consider replacing this code with the CPack NSIS Generator.
48 # See https://cmake.org/cmake/help/latest/cpack_gen/nsis.html
49 include(GenerateSetupNsi)
50 generate_setup_nsi()
51 add_custom_command(
52 OUTPUT ${PROJECT_BINARY_DIR}/limenka-win64-setup.exe
53 COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/release
54 COMMAND ${CMAKE_STRIP} $<TARGET_FILE:limenka-qt> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:limenka-qt>
55 COMMAND ${CMAKE_STRIP} $<TARGET_FILE:limenkad> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:limenkad>
56 COMMAND ${CMAKE_STRIP} $<TARGET_FILE:limenka-cli> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:limenka-cli>
57 COMMAND ${CMAKE_STRIP} $<TARGET_FILE:limenka-tx> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:limenka-tx>
58 COMMAND ${CMAKE_STRIP} $<TARGET_FILE:limenka-wallet> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:limenka-wallet>
59 COMMAND ${CMAKE_STRIP} $<TARGET_FILE:limenka-util> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:limenka-util>
60 COMMAND ${CMAKE_STRIP} $<TARGET_FILE:test_limenka> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:test_limenka>
61 COMMAND makensis -V2 ${PROJECT_BINARY_DIR}/limenka-win64-setup.nsi
62 DEPENDS generate_nsis_images
63 VERBATIM
64 )
65 add_custom_target(deploy DEPENDS ${PROJECT_BINARY_DIR}/limenka-win64-setup.exe)
66 endif()
67 endfunction()
68
69 function(add_macos_deploy_target)
70 if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND TARGET limenka-qt)
71 set(macos_app "Limenka-Qt.app")
72 # Populate Contents subdirectory.
73 configure_file(${PROJECT_SOURCE_DIR}/share/qt/Info.plist.in ${macos_app}/Contents/Info.plist NO_SOURCE_PERMISSIONS)
74 file(CONFIGURE OUTPUT ${macos_app}/Contents/PkgInfo CONTENT "APPL????")
75 # Populate Contents/Resources subdirectory.
76 file(CONFIGURE OUTPUT ${macos_app}/Contents/Resources/empty.lproj CONTENT "")
77 file(CONFIGURE OUTPUT ${macos_app}/Contents/Resources/Base.lproj/InfoPlist.strings
78 CONTENT "{ CFBundleDisplayName = \"@CLIENT_NAME@\"; CFBundleName = \"@CLIENT_NAME@\"; }"
79 )
80
81 set(limenka_icns ${PROJECT_BINARY_DIR}/src/qt/res/rendered_icons/limenka.icns)
82 set(limenka_icns_dest ${macos_app}/Contents/Resources/limenka.icns)
83 add_custom_command(
84 OUTPUT ${limenka_icns_dest}
85 COMMAND ${CMAKE_COMMAND} -E copy ${limenka_icns} ${limenka_icns_dest}
86 DEPENDS generate_icns
87 VERBATIM
88 )
89 add_custom_target(limenka_icns_deployed DEPENDS "${limenka_icns_dest}")
90
91 add_custom_command(
92 OUTPUT ${PROJECT_BINARY_DIR}/${macos_app}/Contents/MacOS/Limenka-Qt
93 COMMAND ${CMAKE_COMMAND} --install ${PROJECT_BINARY_DIR} --config $<CONFIG> --component limenka-qt --prefix ${macos_app}/Contents/MacOS --strip
94 COMMAND ${CMAKE_COMMAND} -E rename ${macos_app}/Contents/MacOS/bin/$<TARGET_FILE_NAME:limenka-qt> ${macos_app}/Contents/MacOS/Limenka-Qt
95 COMMAND ${CMAKE_COMMAND} -E rm -rf ${macos_app}/Contents/MacOS/bin
96 COMMAND ${CMAKE_COMMAND} -E rm -rf ${macos_app}/Contents/MacOS/share
97 VERBATIM
98 )
99
100 string(REPLACE " " "-" osx_volname ${CLIENT_NAME})
101 if(CMAKE_HOST_APPLE)
102 add_custom_command(
103 OUTPUT ${PROJECT_BINARY_DIR}/${osx_volname}.zip
104 COMMAND ${PYTHON_COMMAND} ${PROJECT_SOURCE_DIR}/contrib/macdeploy/macdeployqtplus ${macos_app} ${osx_volname} -translations-dir=${QT_TRANSLATIONS_DIR} -zip
105 DEPENDS ${PROJECT_BINARY_DIR}/${macos_app}/Contents/MacOS/Limenka-Qt
106 VERBATIM
107 )
108 add_custom_target(deploydir
109 DEPENDS ${PROJECT_BINARY_DIR}/${osx_volname}.zip
110 )
111 add_custom_target(deploy
112 DEPENDS ${PROJECT_BINARY_DIR}/${osx_volname}.zip
113 )
114 else()
115 add_custom_command(
116 OUTPUT ${PROJECT_BINARY_DIR}/dist/${macos_app}/Contents/MacOS/Limenka-Qt
117 COMMAND OBJDUMP=${CMAKE_OBJDUMP} ${PYTHON_COMMAND} ${PROJECT_SOURCE_DIR}/contrib/macdeploy/macdeployqtplus ${macos_app} ${osx_volname} -translations-dir=${QT_TRANSLATIONS_DIR}
118 DEPENDS ${PROJECT_BINARY_DIR}/${macos_app}/Contents/MacOS/Limenka-Qt
119 VERBATIM
120 )
121 add_custom_target(deploydir
122 DEPENDS ${PROJECT_BINARY_DIR}/dist/${macos_app}/Contents/MacOS/Limenka-Qt
123 )
124
125 find_program(ZIP_COMMAND zip REQUIRED)
126 add_custom_command(
127 OUTPUT ${PROJECT_BINARY_DIR}/dist/${osx_volname}.zip
128 WORKING_DIRECTORY dist
129 COMMAND ${PROJECT_SOURCE_DIR}/cmake/script/macos_zip.sh ${ZIP_COMMAND} ${osx_volname}.zip
130 VERBATIM
131 )
132 add_custom_target(deploy
133 DEPENDS ${PROJECT_BINARY_DIR}/dist/${osx_volname}.zip
134 )
135 endif()
136 add_dependencies(deploydir limenka-qt)
137 add_dependencies(deploydir limenka_icns_deployed)
138 add_dependencies(deploy deploydir)
139 endif()
140 endfunction()
141