SparkAppimageConfig.cmake 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. # SparkAppimageConfig.cmake
  2. # 1. 在使用时通过准备默认的 icon 与 SparkDesktopConfig.cmake 在生成 desktop 文件
  3. # 时进行借用 desktop 文件中的基本描述完成 spark-appimage.dekstop 文件的生成,
  4. # 并在使用 add_appimage 时完成所有逻辑判断与目标的定义
  5. # add_appimage_icon
  6. # add_appimage_desktop
  7. # add_appimage
  8. # 2. 在 add_appimage 中,我们判断了是否为 cmake 提供了 LINUXDEPLOYQT 宏,
  9. # 并获取此工具的真实路径。并继续判断了 APPIMAGETOOL 宏与该工具的真实路径。
  10. # 然后,创建一个目录,用于即将进行的 Appimage 打包。
  11. # 通过调用 target_linuxdeploy() 来完成 linuxdeploy 的目标创建
  12. # 通过调用 target_appimage() 来完成 appimage 的目标创建
  13. # 3. 对于 linuxdeploy 目标,大致上就是通过执行 linuxdeployqt 命令与 -appimage
  14. # 参数来创建可用于 Appimage 打包的内容结构,并且使用一些参数来处理相关库的依赖。
  15. # 其次就是,将 spark-appimage.desktop 复制为 default.desktop
  16. # 另一个就是 spark-appimage.png 复制为 default.png
  17. # 4. 对于 appimage 目标,大致上就是通过执行 appimagetool 命令将准备好打包的目录
  18. # 结构进行打包为 Appimage 可执行文件,其中为了避免可能缺失的文件,重复了对
  19. # default.desktop 文件与 default.png 文件的生成。
  20. # 这是一个依赖的 copy-desktop-appimage 目标,并先行执行
  21. # 要求:
  22. # LINUXDEPLOYQT 提供的外部参数,一般指 linuxdeployqt 程序路径
  23. # APPIMAGETOOL 提供的外部参数,一般指 appimagetool 程序路径
  24. option(USE_APPIMAGE_NEW_GLIBC "允许在打包过程中使用较新版本的 glibc 库" ON)
  25. set(APPIMAGE_OUTPUT "${CMAKE_BINARY_DIR}/appimage")
  26. set(APPIMAGE_OUTPUT_ICON "${APPIMAGE_OUTPUT}/default.png")
  27. set(APPIMAGE_OUTPUT_DESTKOP "${APPIMAGE_OUTPUT}/default.desktop")
  28. # 1. 添加一个可以用于 Appimage 使用的图标文件
  29. function(add_appimage_icon _icon)
  30. if(CMAKE_VERSION VERSION_LESS 3.21)
  31. message("> cmake version is less than 3.21")
  32. configure_file(${_icon} ${APPIMAGE_OUTPUT_ICON} COPYONLY)
  33. else()
  34. file(MAKE_DIRECTORY ${APPIMAGE_OUTPUT})
  35. file(COPY_FILE ${_icon} ${APPIMAGE_OUTPUT_ICON})
  36. endif(CMAKE_VERSION VERSION_LESS 3.21)
  37. endfunction(add_appimage_icon _icon)
  38. # 2. 基于 SparkDesktopMacros.cmake 提供的宏来定义 desktop 内容说明
  39. # 使用与自身的 desktop.in 模板进行生成
  40. function(add_appimage_desktop)
  41. configure_file(cmake/spark-appimage.desktop.in
  42. ${APPIMAGE_OUTPUT_DESTKOP} @ONLY)
  43. endfunction(add_appimage_desktop)
  44. function(target_linuxdeploy)
  45. if(USE_APPIMAGE_NEW_GLIBC)
  46. message("Use New glibc")
  47. add_custom_target(linuxdeploy pwd
  48. BYPRODUCTS appimage
  49. COMMAND "${LINUXDEPLOYQT}" ${PROJECT_NAME} -appimage -unsupported-allow-new-glibc -verbose=3 -no-strip|| true
  50. WORKING_DIRECTORY "${APPIMAGE_OUTPUT}")
  51. else()
  52. message("Un Use New glibc")
  53. add_custom_target(linuxdeploy pwd
  54. BYPRODUCTS appimage
  55. COMMAND "${LINUXDEPLOYQT}" ${PROJECT_NAME} -appimage -verbose=3 -no-strip|| true
  56. WORKING_DIRECTORY "${APPIMAGE_OUTPUT}")
  57. endif(USE_APPIMAGE_NEW_GLIBC)
  58. endfunction(target_linuxdeploy)
  59. function(target_appimage)
  60. add_custom_target(appimage pwd
  61. COMMAND ${APPIMAGETOOL} ${APPIMAGE_OUTPUT}
  62. WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")
  63. endfunction(target_appimage)
  64. # 3. 添加对目标的 Appimage 构建,Appimage 在一个项目中只能构建一个目标
  65. function(add_appimage_target _target)
  66. # check linuxdeploy
  67. if(NOT DEFINED LINUXDEPLOYQT)
  68. message("AppImage> Not Found LINUXDEPLOYQT Variable!")
  69. return()
  70. endif(NOT DEFINED LINUXDEPLOYQT)
  71. if(CMAKE_VERSION VERSION_LESS 3.19 AND NOT EXISTS ${LINUXDEPLOYQT})
  72. message("> cmake version is less than 3.19")
  73. message(WARNING "!Relative paths are not supported!")
  74. else()
  75. file(REAL_PATH ${LINUXDEPLOYQT} LINUXDEPLOYQT_REAL_PATH)
  76. endif(CMAKE_VERSION VERSION_LESS 3.19 AND NOT EXISTS ${LINUXDEPLOYQT})
  77. message("AppImage> Found LINUXDEPLOYQT Variable: ${LINUXDEPLOYQT_REAL_PATH}")
  78. # check appimagetool
  79. if(NOT DEFINED APPIMAGETOOL)
  80. message("AppImage> Not Found APPIMAGETOOL Variable!")
  81. return()
  82. endif(NOT DEFINED APPIMAGETOOL)
  83. if(CMAKE_VERSION VERSION_LESS 3.19 AND NOT EXISTS ${LINUXDEPLOYQT})
  84. # execute_process(COMMAND realpath ${APPIMAGETOOL} OUTPUT_VARIABLE APPIMAGETOOL_REAL_PATH)
  85. message("> cmake version is less than 3.19")
  86. message(WARNING "!Relative paths are not supported!")
  87. else()
  88. file(REAL_PATH ${APPIMAGETOOL} APPIMAGETOOL_REAL_PATH)
  89. endif(CMAKE_VERSION VERSION_LESS 3.19 AND NOT EXISTS ${LINUXDEPLOYQT})
  90. message("AppImage> Found APPIMAGETOOL Variable: ${APPIMAGETOOL}")
  91. # do add_custome_target
  92. make_directory(${APPIMAGE_OUTPUT})
  93. target_linuxdeploy()
  94. target_appimage()
  95. # 重设目标输出的目录
  96. set_target_properties(${PROJECT_NAME}
  97. PROPERTIES
  98. RUNTIME_OUTPUT_DIRECTORY "${APPIMAGE_OUTPUT}")
  99. # 为解决在不使用 -unsupported-allow-new-glibc 参数时,
  100. # 可能不会生成 AppRun 软链接的问题
  101. if(NOT USE_APPIMAGE_NEW_GLIBC)
  102. set_target_properties(${PROJECT_NAME}
  103. PROPERTIES
  104. RUNTIME_OUTPUT_NAME "AppRun")
  105. endif(NOT USE_APPIMAGE_NEW_GLIBC)
  106. endfunction(add_appimage_target _target)
  107. # 如果 glic>=2.27, 你就需要加上参数 -unsupported-allow-new-glibc 意思就是不再低版本发行版使用了
  108. # 或 -unsupported-bundle-everything
  109. # 大概的意思是尝试兼容,实际测试,到其他发行版直接用不了了,有可能是发行版的原因,还是建议用前者,虽然放弃了低版本
  110. # -unsupported-bundle-everything
  111. # 捆绑所有依赖库,包括 ld-linux.so 加载器和 glibc。
  112. # 这将允许构建在较新系统上的应用程序在较旧的目标系统上运行,
  113. # 但不建议这样做,因为它会导致捆绑包超出所需的大小(并且可能到其他发行版无法使用)
  114. # -unsupported-allow-new-glibc
  115. # 允许 linuxdeployqt 在比仍受支持的最旧 Ubuntu LTS 版本更新的发行版上运行。
  116. # 这将导致 AppImage无法在所有仍受支持的发行版上运行,既不推荐也不测试或支持
  117. # 对 linuxdeployqt 的使用
  118. # ./linuxdeployqt-7-x86_64.AppImage
  119. # 程序目录/程序 -appimage -unsupported-allow-new-glibc
  120. # ./linuxdeployqt-7-x86_64.AppImage
  121. # 程序目录/程序 -appimage -unsupported-bundle-everything
  122. # 1. 在顶层构建中导入 Appimage 的构建
  123. # include(cmake/SparkAppimageConfig.cmake) # 导入来自 Spark 构建的 Appimage 构建
  124. # add_appimage_icon(assets/spark.png) # 添加到 Appimage 中的默认的图标
  125. # add_appimage_desktop() # 添加到 Appimage 中的默认desktop(使用来自 Spark 构建的 Desktop 构建中配置的信息(必须要求 spark-desktop))
  126. # add_appimage_target(${PROJECT_NAME}) # 添加到 Appimage 中的默认目标,应用对 Appimage 的构建
  127. # 2. 在 Makefile 进行构建目标构建 Appimage 的构建流 --
  128. # 在 Makefile 进行构建目标构建 Appimage (要求提供工具的绝对路径,然后可依次进行linuxdeployqt, genrate-appimage)
  129. # 来自于 https://github.com/probonopd/linuxdeployqt 的 linuxdeployqt
  130. # 来自于 https://github.com/AppImage/AppImageKit 的 appimagetool
  131. # 来自于 https://gitlink.org.cn/zinface/bundle-linuxdeployqt.git 托管存储的工具
  132. # 或指定你所想存放克隆项目的位置
  133. # BUNDLE_LINUXDEPLOYQT := $(shell pwd)/build/bundle-linuxdeployqt
  134. # download-bundle-linuxdeploytools:
  135. # -git clone https://gitlink.org.cn/zinface/bundle-linuxdeployqt.git $(BUNDLE_LINUXDEPLOYQT)
  136. # LINUXDEPLOYQT := "$(BUNDLE_LINUXDEPLOYQT)/linuxdeployqt-continuous-x86_64.AppImage"
  137. # APPIMAGETOOL := "$(BUNDLE_LINUXDEPLOYQT)/appimagetool-x86_64.AppImage"
  138. # linuxdeploy: release download-bundle-linuxdeploytools
  139. # cd build && cmake .. -DLINUXDEPLOYQT=$(LINUXDEPLOYQT) -DAPPIMAGETOOL=$(APPIMAGETOOL)
  140. # cd build && make linuxdeploy
  141. # genrate-appimage:
  142. # cd build && cmake .. -DLINUXDEPLOYQT=$(LINUXDEPLOYQT) -DAPPIMAGETOOL=$(APPIMAGETOOL)
  143. # cd build && make appimage