Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ install(DIRECTORY src/sakuraassistant/pkg/usr
DESTINATION "/")

# deb 构建支持
find_package(DebPackage PATHS ${CMAKE_SOURCE_DIR})
add_package_descript(cmake/package-deb.descript)
find_package(SparkDebPackage PATHS ${CMAKE_SOURCE_DIR})
add_package_descript(cmake/spark-deb-package.descript)


# 预留,Appimage 构建支持
Expand Down
120 changes: 73 additions & 47 deletions cmake/SparkAppimageConfig.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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!")
Expand All @@ -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



Expand All @@ -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)
Expand All @@ -150,3 +175,4 @@ endfunction(add_appimage_icon _ICON_PATH)
# genrate-appimage:
# cd build && cmake .. -DLINUXDEPLOYQT=$(LINUXDEPLOYQT) -DAPPIMAGETOOL=$(APPIMAGETOOL)
# cd build && make appimage

27 changes: 25 additions & 2 deletions cmake/DebPackageConfig.cmake → cmake/SparkDebPackageConfig.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,12 @@ function(set_package_vars _IN_KEY _IN_VAL)
set(CPACK_DEBIAN_PACKAGE_RECOMMENDS "${_IN_VAL}" PARENT_SCOPE)
message("--> 软件建议: ${_IN_VAL}")
endif(_Recommends EQUAL "0")

find_str("${_IN_KEY}" "Conflicts" _Conflicts)
if(_Conflicts EQUAL "0")
set(CPACK_DEBIAN_PACKAGE_CONFLICTS "${_IN_VAL}" PARENT_SCOPE)
message("--> 软件冲突: ${_IN_VAL}")
endif(_Conflicts EQUAL "0")

endfunction(set_package_vars _IN_KEY _IN_VAL)

Expand Down Expand Up @@ -238,7 +244,12 @@ function(add_package_descript IN_DES)
set(PREV_DES_LINE "")
while(NOT PREV_DES_LINE STREQUAL DES_LINE)
if(NOT PREV_DES_LINE STREQUAL "")
set(Descrition "${Descrition}\n${DES_LINE}")
if ("${CMAKE_VERSION}" VERSION_LESS "3.15")
set(Descrition "${Descrition}\n${DES_LINE}")
else()
string(STRIP "${DES_LINE}" STRIP_DES_LINE)
set(Descrition "${Descrition}\n${STRIP_DES_LINE}")
endif("${CMAKE_VERSION}" VERSION_LESS "3.15")
endif(NOT PREV_DES_LINE STREQUAL "")
set(PREV_DES_LINE "${DES_LINE}")
sub_next(${DES_CONTENT} NEXT_INDEX DES_LINE DES_CONTENT)
Expand Down Expand Up @@ -275,6 +286,17 @@ function(add_package_descript IN_DES)
)
set(CPACK_DEBIAN_FILE_NAME ${_DebFileName})

# 标识: spark-deb-package
if(NOT "${PACKAGE_SUFFIX}" STREQUAL "")
# eg: remove '_' of '_Debian'
string(SUBSTRING "${PACKAGE_SUFFIX}" 1 -1 DISTRIBUTION)
if ("${CMAKE_VERSION}" VERSION_LESS "3.15")
set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "${Descrition}\n .\n Build for ${DISTRIBUTION} through spark-deb-build.")
else()
set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${Descrition} "\n.\nBuild for ${DISTRIBUTION} through spark-deb-build.")
endif("${CMAKE_VERSION}" VERSION_LESS "3.15")

endif(NOT "${PACKAGE_SUFFIX}" STREQUAL "")

# set(CPACK_DEBIAN_PACKAGE_NAME "${Package}")
# set(CPACK_DEBIAN_PACKAGE_VERSION "${Version}")
Expand Down Expand Up @@ -307,7 +329,7 @@ endfunction(add_package_descript IN_DES)
# CPACK_DEBIAN_FILE_NAME - n
# CPACK_DEBIAN_PACKAGE_NAME - y
# CPACK_DEBIAN_PACKAGE_VERSION - y
# CPACK_DEBIAN_PACKAGE_ARCHITECTURE - y(auto)
# CPACK_DEBIAN_PACKAGE_ARCHITECTURE - y(auto) -> dpkg --print-architecture
# CPACK_DEBIAN_PACKAGE_DEPENDS - y
# CPACK_DEBIAN_PACKAGE_PRIORITY - y
# CPACK_DEBIAN_PACKAGE_MAINTAINER - y
Expand All @@ -320,4 +342,5 @@ endfunction(add_package_descript IN_DES)
# set(ARCHITECTURE "arm64")
# endif()


# string(TIMESTAMP BUILD_TIME "%Y%m%d")
58 changes: 27 additions & 31 deletions cmake/SparkDesktopMacros.cmake
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
# SparkDesktopMacros.cmake

macro(spark_desktop_macros _APP_NAME _APP_NAME_ZH_CN _APP_COMMENT _APP_TYPE _APP_EXECUTE_PATH _APP_EXECUTE_ICON_PATH _APP_CATEGORIES)
set(APP_NAME ${_APP_NAME})
set(APP_NAME_ZH_CN ${_APP_NAME_ZH_CN})
set(APP_COMMENT ${_APP_COMMENT})
set(APP_TYPE ${_APP_TYPE})
set(APP_EXECUTE_PATH ${_APP_EXECUTE_PATH})
set(APP_EXECUTE_ICON_PATH ${_APP_EXECUTE_ICON_PATH})
set(APP_CATEGORIES ${_APP_CATEGORIES})
configure_file(cmake/spark-desktop.desktop.in
${CMAKE_BINARY_DIR}/${_APP_NAME}.desktop
macro(spark_desktop_macros)
set(APP_NAME ${ARGV0})
set(APP_NAME_ZH_CN ${ARGV1})
set(APP_COMMENT ${ARGV2})
set(APP_TYPE ${ARGV3})
set(APP_EXECUTE_PATH ${ARGV4})
set(APP_EXECUTE_ICON_PATH ${ARGV5})
set(APP_CATEGORIES ${ARGV6})
set(APP_MIME_TYPE ${ARGV7})
configure_file(cmake/spark-desktop.desktop.in.txt
${CMAKE_BINARY_DIR}/${ARGV0}.desktop
)
endmacro(spark_desktop_macros _APP_NAME _APP_NAME_ZH_CN _APP_COMMENT _APP_TYPE _APP_EXECUTE_PATH _APP_EXECUTE_ICON_PATH _APP_CATEGORIES)
set(SPARK_DESKTOP_FILE ${CMAKE_BINARY_DIR}/${ARGV0}.desktop)
endmacro(spark_desktop_macros)

# include(cmake/SparkDesktopMacros.cmake)
# 内容默认应用名称: Name= 应与项目名称相同
Expand All @@ -22,33 +25,26 @@ endmacro(spark_desktop_macros _APP_NAME _APP_NAME_ZH_CN _APP_COMMENT _APP_TYPE _
# 执行程序: Exec=
# 图标路径: Icon=
# 应用分类: Category=
# MIME类型: MimeType=
# )

# TODO 安装位置:INSTALL(将自动实现 install 文件,如 /usr/share/applications)

# install(FILES ${APP_NAME}.desktop
# DESTINATION /usr/share/applications
# )
# 或者
# install(FILES ${SPARK_DESKTOP_FILE}
# DESTINATION /usr/share/applications
# )

# 基于 configure_file 填充内容配置
# configure_file(<input> <output>
# [NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS |
# FILE_PERMISSIONS <permissions>...]
# [COPYONLY] [ESCAPE_QUOTES] [@ONLY]
# [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])

# install(FILES ${APP_NAME}.desktop
# install(FILES ${SPARK_DESKTOP_FILE}.desktop
# DESTINATION /usr/share/applications
# )

################ 提供用于 Appimage 所用的配置 ################################
# 内容默认应用名称: Name= 应与项目名称相同
spark_desktop_macros(
# 应用名称: Name=
${PROJECT_NAME}
# 应用名称: Name[zh_CN]=
樱花助手
# 应用说明: Comment=
樱花助手
# 应用类型: Type=
Application
# 执行程序: Exec=
"/usr/bin/spark-assistant %F"
# 图标路径: Icon=
"spark-assistant"
# 应用分类: Category=
Application
)
16 changes: 15 additions & 1 deletion cmake/SparkEnvConfig.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,18 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
# set(CMAKE_BUILD_TYPE "Debug")
# set(CMAKE_BUILD_TYPE "Debug")

option(SPARK_DEBUG_MESSAGE "CMake Spark Module Debug Message." OFF)
set(SPAKK_DEBUG_LOGFILE "${CMAKE_BINARY_DIR}/spark_debug.log" CACHE STRING "Spark Build Debug logfile." FORCE)
file(WRITE ${SPAKK_DEBUG_LOGFILE})

macro(spark_debug_message)
if(SPARK_DEBUG_MESSAGE)
set(SPARK_ONECE_LOG ${ARGN})
message("[SPARK_MESSAGE]: " ${SPARK_ONECE_LOG})
file(APPEND ${SPAKK_DEBUG_LOGFILE} ${SPARK_ONECE_LOG} "\n")
unset(SPARK_ONECE_LOG)
endif(SPARK_DEBUG_MESSAGE)
endmacro(spark_debug_message)

Loading