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