Browse Source

cmake/appimage: 改进对 Linux 平台 Appimage 的生成模式

zinface 2 years ago
parent
commit
b929bca982
4 changed files with 105 additions and 60 deletions
  1. 72 47
      cmake/SparkAppimageConfig.cmake
  2. 6 1
      cmake/platforms/linux-appimage.cmake
  3. 15 5
      linux-appimage.mk
  4. 12 7
      src/plugin/CMakeLists.txt

+ 72 - 47
cmake/SparkAppimageConfig.cmake

@@ -24,41 +24,60 @@
     # default.desktop 文件与 default.png 文件的生成。
     # 这是一个依赖的 copy-desktop-appimage 目标,并先行执行
 
-# if ()
-set(APPIMAGE_OUTPUT  "${CMAKE_BINARY_DIR}/appimage")
-set(APPIMAGE_ICON    "${APPIMAGE_OUTPUT}/default.png")
-set(APPIMAGE_DESTKOP "${APPIMAGE_OUTPUT}/default.desktop")
-# set(LINUXDEPLOYQT)
-# set(APPIMAGETOOL)
-
-function(execute_linuxdeploy _PATH)
-    execute_process(COMMAND ${LINUXDEPLOYQT}
-        WORKING_DIRECTORY "${APPIMAGE_OUTPUT}"
-        )
-endfunction(execute_linuxdeploy _PATH)
+# 要求:
+    # LINUXDEPLOYQT   提供的外部参数,一般指 linuxdeployqt 程序路径
+    # APPIMAGETOOL    提供的外部参数,一般指 appimagetool 程序路径
+
+option(USE_APPIMAGE_NEW_GLIBC "允许在打包过程中使用较新版本的 glibc 库" ON)
+
+set(APPIMAGE_OUTPUT         "${CMAKE_BINARY_DIR}/appimage")
+set(APPIMAGE_OUTPUT_ICON    "${APPIMAGE_OUTPUT}/default.png")
+set(APPIMAGE_OUTPUT_DESTKOP "${APPIMAGE_OUTPUT}/default.desktop")
+
+# 1. 添加一个可以用于 Appimage 使用的图标文件
+function(add_appimage_icon _icon)
+    if(CMAKE_VERSION VERSION_LESS 3.21)
+        message("> cmake version is less than 3.21")
+        configure_file(${_icon} ${APPIMAGE_OUTPUT_ICON} COPYONLY)
+    else()
+        file(MAKE_DIRECTORY ${APPIMAGE_OUTPUT})
+        file(COPY_FILE ${_icon} ${APPIMAGE_OUTPUT_ICON})
+    endif(CMAKE_VERSION VERSION_LESS 3.21)
+endfunction(add_appimage_icon _icon)
+
+# 2. 基于 SparkDesktopMacros.cmake 提供的宏来定义 desktop 内容说明
+    # 使用与自身的 desktop.in 模板进行生成
+function(add_appimage_desktop)
+    configure_file(cmake/spark-appimage.desktop.in
+        ${APPIMAGE_OUTPUT_DESTKOP} @ONLY)
+endfunction(add_appimage_desktop)
 
 function(target_linuxdeploy)
-    add_custom_target(linuxdeploy pwd
-        BYPRODUCTS appimage
-        COMMAND cp ../${PROJECT_NAME} .
-        COMMAND "${LINUXDEPLOYQT}" ${PROJECT_NAME} -appimage -unsupported-allow-new-glibc -verbose=3 -no-strip|| true
-        COMMAND cp ../spark-appimage.desktop default.desktop
-        COMMAND cp ../spark-appimage.png     default.png
-        WORKING_DIRECTORY "${APPIMAGE_OUTPUT}")
+
+    if(USE_APPIMAGE_NEW_GLIBC)
+        message("Use New glibc")
+        add_custom_target(linuxdeploy pwd
+            BYPRODUCTS appimage
+            COMMAND "${LINUXDEPLOYQT}" ${PROJECT_NAME} -appimage -unsupported-allow-new-glibc -verbose=3 -no-strip|| true
+            WORKING_DIRECTORY "${APPIMAGE_OUTPUT}")
+    else()
+        message("Un Use New glibc")
+        add_custom_target(linuxdeploy pwd
+            BYPRODUCTS appimage
+            COMMAND "${LINUXDEPLOYQT}" ${PROJECT_NAME} -appimage -verbose=3 -no-strip|| true
+            WORKING_DIRECTORY "${APPIMAGE_OUTPUT}")
+    endif(USE_APPIMAGE_NEW_GLIBC)
+
 endfunction(target_linuxdeploy)
 
 function(target_appimage)
-    add_custom_target(copy-desktop-appimage
-        COMMAND cp ../spark-appimage.desktop default.desktop
-        COMMAND cp ../spark-appimage.png     default.png
-        WORKING_DIRECTORY "${APPIMAGE_OUTPUT}")
     add_custom_target(appimage pwd
         COMMAND ${APPIMAGETOOL} ${APPIMAGE_OUTPUT}
-        WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
-        DEPENDS copy-desktop-appimage)
+        WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")
 endfunction(target_appimage)
 
-function(add_appimage)
+# 3. 添加对目标的 Appimage 构建,Appimage 在一个项目中只能构建一个目标
+function(add_appimage_target _target)
     # check linuxdeploy
     if(NOT DEFINED LINUXDEPLOYQT)
         message("AppImage> Not Found LINUXDEPLOYQT Variable!")
@@ -84,40 +103,46 @@ function(add_appimage)
     else()
         file(REAL_PATH ${APPIMAGETOOL} APPIMAGETOOL_REAL_PATH)
     endif(CMAKE_VERSION VERSION_LESS 3.19 AND NOT EXISTS ${LINUXDEPLOYQT})
-    message("AppImage> Found APPIMAGETOOL Variable: ${LINUXDEPLOYQT_REAL_PATH}")
+    message("AppImage> Found APPIMAGETOOL Variable: ${APPIMAGETOOL}")
 
     # do add_custome_target
     make_directory(${APPIMAGE_OUTPUT})
     target_linuxdeploy()
     target_appimage()
-endfunction(add_appimage)
 
-function(add_appimage_desktop)
-    configure_file(cmake/spark-appimage.desktop.in
-        ${CMAKE_BINARY_DIR}/spark-appimage.desktop @ONLY)
-endfunction(add_appimage_desktop)
+    # 重设目标输出的目录
+    set_target_properties(${PROJECT_NAME}
+        PROPERTIES
+            RUNTIME_OUTPUT_DIRECTORY "${APPIMAGE_OUTPUT}")
 
-function(add_appimage_icon _ICON_PATH)
-    if(CMAKE_VERSION VERSION_LESS 3.21)
-        message("> cmake version is less than 3.21")
-        configure_file(${_ICON_PATH} ${CMAKE_BINARY_DIR}/spark-appimage.png COPYONLY)
-    else()
-        file(COPY_FILE ${_ICON_PATH} ${CMAKE_BINARY_DIR}/spark-appimage.png)
-    endif(CMAKE_VERSION VERSION_LESS 3.21)
-endfunction(add_appimage_icon _ICON_PATH)
+    # 为解决在不使用 -unsupported-allow-new-glibc 参数时,
+    # 可能不会生成 AppRun 软链接的问题
+    if(NOT USE_APPIMAGE_NEW_GLIBC)
+        set_target_properties(${PROJECT_NAME}
+            PROPERTIES
+                RUNTIME_OUTPUT_NAME "AppRun")
+    endif(NOT USE_APPIMAGE_NEW_GLIBC)    
 
+endfunction(add_appimage_target _target)
 
 
-# 如果glic>=2.27,你就需要加上参数 -unsupported-allow-new-glibc (意思就是不再低版本发行版使用了)
-# 或 -unsupported-bundle-everything(大概的意思是尝试兼容,实际测试,到其他发行版直接用不了了,有可能是发行版的原因,还是建议用前者,虽然放弃了低版本)
+# 如果 glic>=2.27, 你就需要加上参数 -unsupported-allow-new-glibc 意思就是不再低版本发行版使用了
+# 或 -unsupported-bundle-everything
+# 大概的意思是尝试兼容,实际测试,到其他发行版直接用不了了,有可能是发行版的原因,还是建议用前者,虽然放弃了低版本
 
 # -unsupported-bundle-everything
-    # 捆绑所有依赖库,包括 ld-linux.so 加载器和 glibc。这将允许构建在较新系统上的应用程序在较旧的目标系统上运行,但不建议这样做,因为它会导致捆绑包超出所需的大小(并且可能到其他发行版无法使用)
+    # 捆绑所有依赖库,包括 ld-linux.so 加载器和 glibc。
+    # 这将允许构建在较新系统上的应用程序在较旧的目标系统上运行,
+        # 但不建议这样做,因为它会导致捆绑包超出所需的大小(并且可能到其他发行版无法使用)
 # -unsupported-allow-new-glibc
-    # 允许 linuxdeployqt 在比仍受支持的最旧 Ubuntu LTS 版本更新的发行版上运行。这将导致 AppImage无法在所有仍受支持的发行版上运行,既不推荐也不测试或支持
+    # 允许 linuxdeployqt 在比仍受支持的最旧 Ubuntu LTS 版本更新的发行版上运行。
+    # 这将导致 AppImage无法在所有仍受支持的发行版上运行,既不推荐也不测试或支持
 
-# ./linuxdeployqt-7-x86_64.AppImage 程序目录/程序 -appimage -unsupported-allow-new-glibc
-# ./linuxdeployqt-7-x86_64.AppImage 程序目录/程序 -appimage -unsupported-bundle-everything
+# 对 linuxdeployqt 的使用
+# ./linuxdeployqt-7-x86_64.AppImage 
+    # 程序目录/程序 -appimage -unsupported-allow-new-glibc
+# ./linuxdeployqt-7-x86_64.AppImage 
+    # 程序目录/程序 -appimage -unsupported-bundle-everything
 
 
 
@@ -126,7 +151,7 @@ endfunction(add_appimage_icon _ICON_PATH)
 # include(cmake/SparkAppimageConfig.cmake)  # 导入来自 Spark 构建的 Appimage 构建
 # add_appimage_icon(assets/spark.png)       # 添加到 Appimage 中的默认的图标
 # add_appimage_desktop()                    # 添加到 Appimage 中的默认desktop(使用来自 Spark 构建的 Desktop 构建中配置的信息(必须要求 spark-desktop))
-# add_appimage()                            # 应用对 Appimage 的构建
+# add_appimage_target(${PROJECT_NAME})      # 添加到 Appimage 中的默认目标,应用对 Appimage 的构建
 
 # 2. 在 Makefile 进行构建目标构建 Appimage 的构建流 --
 # 在 Makefile 进行构建目标构建 Appimage (要求提供工具的绝对路径,然后可依次进行linuxdeployqt, genrate-appimage)

+ 6 - 1
cmake/platforms/linux-appimage.cmake

@@ -43,6 +43,11 @@ if(USE_LINUX_APPIMAGE)
     include(cmake/SparkAppimageConfig.cmake)  # 导入来自 Spark 构建的 Appimage 构建
     add_appimage_icon(assets/spark.png)       # 添加到 Appimage 中的默认的图标
     add_appimage_desktop()                    # 添加到 Appimage 中的默认desktop(使用来自 Spark 构建的 Desktop 构建中配置的信息(必须要求 spark-desktop))
-    add_appimage()                            # 应用对 Appimage 的构建
+    add_appimage_target(${PROJECT_NAME})      # 添加到 Appimage 中的默认目标,应用对 Appimage 的构建
+
+    # 处理 src/themes 目录的复制到
+    add_custom_command(TARGET ${PROJECT_NAME}
+        POST_BUILD
+            COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/src/themes $<TARGET_FILE_DIR:${PROJECT_NAME}>/themes)
 
 endif(USE_LINUX_APPIMAGE)

+ 15 - 5
linux-appimage.mk

@@ -30,16 +30,26 @@ APPIMAGETOOL  := "$(BUNDLE_LINUXDEPLOYQT)/appimagetool-x86_64.AppImage"
 # 追加 Appimagetool、linuxdeployqt 构建配置
 CMAKE_OPTIONS := -DLINUXDEPLOYQT=$(LINUXDEPLOYQT) -DAPPIMAGETOOL=$(APPIMAGETOOL) $(CMAKE_OPTIONS)
 
+# 执行 Linux DeployQt 并生成可制作 Appimage 的目录结构
 linuxdeploy: download-bundle-linuxdeploytools
-	cmake -B$(builddir) $(CMAKE_OPTIONS)
-	cmake --build $(builddir) -- linuxdeploy
+	cmake -B$(builddir) $(CMAKE_OPTIONS) -DUSE_APPIMAGE_NEW_GLIBC=ON
+	cmake --build $(builddir) --target linuxdeploy
+
+# 执行 Linux DeployQt 并生成可制作 Appimage 的目录结构
+# 但生成的应用程序将只使用操作系统中已安装的标准glibc库版本。
+linuxdeploy-fast: download-bundle-linuxdeploytools
+	cmake -B$(builddir) $(CMAKE_OPTIONS) -DUSE_APPIMAGE_NEW_GLIBC=OFF
+	cmake --build $(builddir) --target linuxdeploy
 
-genrate-appimage:
+# 执行 Appimage 目录结构的打包生成
+make-appimage:
 	cmake -B$(builddir) $(CMAKE_OPTIONS)
-	cmake --build $(builddir) -- appimage
+	cmake --build $(builddir) --target appimage
 
+package: linux-universal-release linuxdeploy make-appimage
 
-package: linux-universal-release linuxdeploy genrate-appimage
+# 不要一开始就使用 - 否则无法生成 AppRun
+package-fast: linux-universal-release linuxdeploy-fast make-appimage
 
 linux-build-options:
 	@echo $(CMAKE_OPTIONS)

+ 12 - 7
src/plugin/CMakeLists.txt

@@ -1,16 +1,21 @@
 
-option(USE_NOTEPAD_PLUGIN "Notepad-- 插件构建配置" ON)
+option(USE_NOTEPAD_PLUGIN "构建 Notepad-- 内部插件" ON)
+option(USE_NOTEPAD_PLUGIN_BASE "构建 Notepad-- 内部的插件基础模板" OFF)
 
-if(TRUE)
+
+if(USE_NOTEPAD_PLUGIN)
     add_subdirectory(helloworld-next)
     
-    # 基于源代码构建的系列插件模板
-    add_subdirectory(template-plugins/base-plugin)
-    add_subdirectory(template-plugins/base-widget-plugin)
-    add_subdirectory(template-plugins/base-widget-ui-plugin)
+    if(USE_NOTEPAD_PLUGIN_BASE)
+        # 基于源代码构建的系列插件模板
+        add_subdirectory(template-plugins/base-plugin)
+        add_subdirectory(template-plugins/base-widget-plugin)
+        add_subdirectory(template-plugins/base-widget-ui-plugin)
+    endif(USE_NOTEPAD_PLUGIN_BASE)
 
     # 一个简单的插件示例,但依赖于外部的 opencc 项目(基于 git)
     add_subdirectory(opencc-demo-plugin)
     # 一个简单的版本更新检查的插件
     add_subdirectory(versionUpdate)
-endif(TRUE)
+
+endif(USE_NOTEPAD_PLUGIN)