diff --git a/CMakeLists.txt b/CMakeLists.txt index dfab3d132..50b04f615 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,9 +53,18 @@ set(GETTEXT_DOMAIN_NAME "linyaps" CACHE STRING "The name of gettext domain.") set(QT_VERSION_MAJOR CACHE STRING "The major version of qt.") -set(LINGLONG_DESKTOP_EXPORT_PATH - "share/applications" - CACHE STRING "The path to export linglong desktop files.") +set(LINGLONG_EXPORT_PATH + "share" + CACHE STRING + "The path to export linglong config files, it must end with share.") + +if(NOT LINGLONG_EXPORT_PATH MATCHES ".*share$") + message( + WARNING + "LINGLONG_EXPORT_PATH '${LINGLONG_EXPORT_PATH}' must end with 'share'" + ) + set(LINGLONG_EXPORT_PATH "share") +endif() list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) include(PFL) @@ -173,16 +182,16 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) # build ll-build-utils only if(BUILD_LINGLONG_BUILDER_UTILS_IN_BOX) - pfl_init(AUTO) - pfl_add_libraries( - LIBS - api - ocppi - oci-cfg-generators - APPS - ll-builder-utils - uab) - return() + pfl_init(AUTO) + pfl_add_libraries( + LIBS + api + ocppi + oci-cfg-generators + APPS + ll-builder-utils + uab) + return() endif() set(CMAKE_AUTOMOC ON) @@ -275,7 +284,7 @@ pfl_add_libraries( ll-session-helper) if(ENABLE_LINGLONG_APP_BUILDER_UTILS) - add_subdirectory(apps/ll-builder-utils) + add_subdirectory(apps/ll-builder-utils) endif() add_subdirectory(misc) diff --git a/libs/linglong/src/linglong/repo/ostree_repo.cpp b/libs/linglong/src/linglong/repo/ostree_repo.cpp index 798a6f120..1143a4c9f 100644 --- a/libs/linglong/src/linglong/repo/ostree_repo.cpp +++ b/libs/linglong/src/linglong/repo/ostree_repo.cpp @@ -2094,12 +2094,14 @@ OSTreeRepo::exportEntries(const std::filesystem::path &rootEntriesDir, destination = rootEntriesDir / "lib/systemd/user"; } + auto desktopExportPath = std::string{ LINGLONG_EXPORT_PATH } + "/applications"; + if (path == "share/applications") { - if (strcmp(LINGLONG_DESKTOP_EXPORT_PATH, "share/applications") != 0) { + if (desktopExportPath != "share/applications") { qInfo() << "destination update from " << destination.c_str() << " to " - << QString::fromStdString(rootEntriesDir / LINGLONG_DESKTOP_EXPORT_PATH); + << QString::fromStdString(rootEntriesDir / desktopExportPath); } - destination = rootEntriesDir / LINGLONG_DESKTOP_EXPORT_PATH; + destination = rootEntriesDir / desktopExportPath; } // 检查源目录是否存在,跳过不存在的目录 @@ -2199,8 +2201,9 @@ void OSTreeRepo::updateSharedInfo() noexcept { auto defaultApplicationDir = QDir(this->repoDir.absoluteFilePath("entries/share/applications")); // 自定义desktop安装路径 - QDir customApplicationDir = QDir( - this->repoDir.absoluteFilePath(QString{ "entries/%1" }.arg(LINGLONG_DESKTOP_EXPORT_PATH))); + auto desktopExportPath = std::string{ LINGLONG_EXPORT_PATH } + "/applications"; + QDir customApplicationDir = + QDir(this->repoDir.absoluteFilePath(QString{ "entries/%1" }.arg(desktopExportPath.c_str()))); auto mimeDataDir = QDir(this->repoDir.absoluteFilePath("entries/share/mime")); auto glibSchemasDir = QDir(this->repoDir.absoluteFilePath("entries/share/glib-2.0/schemas")); diff --git a/libs/utils/src/linglong/utils/configure.h.in b/libs/utils/src/linglong/utils/configure.h.in index c3d23b2c2..4643085fc 100644 --- a/libs/utils/src/linglong/utils/configure.h.in +++ b/libs/utils/src/linglong/utils/configure.h.in @@ -21,9 +21,9 @@ #define LINGLONG_CONTAINER_INIT LINGLONG_LIBEXEC_DIR "/dumb-init" #define LINGLONG_CLIENT_NAME "@LINGLONG_CLI_BIN@" #define LINGLONG_CLIENT_PATH "@CMAKE_INSTALL_FULL_BINDIR@/@LINGLONG_CLI_BIN@" -#define LINGLONG_DESKTOP_EXPORT_PATH "@LINGLONG_DESKTOP_EXPORT_PATH@" +#define LINGLONG_EXPORT_PATH "@LINGLONG_EXPORT_PATH@" -#define LINGLONG_EXPORT_VERSION "1.0.0.1" +#define LINGLONG_EXPORT_VERSION "1.0.0.2" // The package's locale domain. #define PACKAGE_LOCALE_DOMAIN "@GETTEXT_DOMAIN_NAME@" diff --git a/misc/lib/linglong/generate-xdg-data-dirs.sh b/misc/lib/linglong/generate-xdg-data-dirs.sh index 31a33628a..485bfe0d2 100644 --- a/misc/lib/linglong/generate-xdg-data-dirs.sh +++ b/misc/lib/linglong/generate-xdg-data-dirs.sh @@ -10,25 +10,60 @@ # So we append the path to XDG_DATA_DIRS here like, # instead of prepending it like flatpak. +# --- 变量初始化和规范化 --- LINGLONG_ROOT="@LINGLONG_ROOT@" -LINGLONG_DESKTOP_EXPORT_PATH="@LINGLONG_DESKTOP_EXPORT_PATH@" - -LINGLONG_DATA_DIR=${LINGLONG_ROOT}/entries/share -CUSTOM_DESKTOP_DATA_DIR=${LINGLONG_ROOT}/entries/${LINGLONG_DESKTOP_EXPORT_PATH} - -if [ "$LINGLONG_DESKTOP_EXPORT_PATH" != "share/applications" ]; then - # 检查XDG_DATA_DIRS是否包含CUSTOM_DESKTOP_DATA_DIR - case ":$XDG_DATA_DIRS:" in - *":${CUSTOM_DESKTOP_DATA_DIR}:"* | *":${CUSTOM_DESKTOP_DATA_DIR}/:"*) ;; - *) - XDG_DATA_DIRS=$(echo "$XDG_DATA_DIRS" | sed -E "s@(/usr/local/share/?)(:|$)@\1:$CUSTOM_DESKTOP_DATA_DIR\2@g") - ;; - esac -else - case ":$XDG_DATA_DIRS:" in - *":$LINGLONG_DATA_DIR:"* | *":$LINGLONG_DATA_DIR/:"*) : ;; - *) - XDG_DATA_DIRS="${XDG_DATA_DIRS:-/usr/local/share:/usr/share}:${LINGLONG_DATA_DIR}" - ;; - esac +LINGLONG_EXPORT_PATH="@LINGLONG_EXPORT_PATH@" + +# 规范化 LINGLONG_DATA_DIR:移除末尾可能存在的斜杠 +LINGLONG_DATA_DIR="${LINGLONG_ROOT}/entries/share" +LINGLONG_DATA_DIR=${LINGLONG_DATA_DIR%/} + +# --- 辅助函数:安全地添加路径到 XDG_DATA_DIRS --- +# 这个函数会检查路径是否已存在,如果不存在则添加。 +# 参数1: 要添加的路径 (path_to_add) +# 参数2: 添加位置 ('start' 或 'end',默认为 'start') +_add_path_to_xdg_data_dirs() { + local path_to_add="${1%/}" # 确保要添加的路径没有末尾斜杠 + local position="${2:-start}" # 默认添加到开头 + + # 确保 XDG_DATA_DIRS 变量已定义,如果未定义则初始化为空字符串 + : "${XDG_DATA_DIRS:=}" + + # 检查路径是否已存在于 XDG_DATA_DIRS 中 + # 在 XDG_DATA_DIRS 两端加上冒号,以确保精确匹配(无论路径在开头、中间还是结尾) + if [[ ":${XDG_DATA_DIRS}:" == *":${path_to_add}:"* ]]; then + # 路径已存在,不执行任何操作 + return 0 + fi + + # 如果路径不存在,则根据指定位置添加 + if [[ -z "$XDG_DATA_DIRS" ]]; then + # 如果 XDG_DATA_DIRS 当前为空,直接赋值 + XDG_DATA_DIRS="$path_to_add" + elif [[ "$position" == "start" ]]; then + # 添加到开头 + XDG_DATA_DIRS="$path_to_add:$XDG_DATA_DIRS" + elif [[ "$position" == "end" ]]; then + # 添加到末尾 + XDG_DATA_DIRS="$XDG_DATA_DIRS:$path_to_add" + fi +} + +# 如果有自定义 LINGLONG_EXPORT_PATH(默认为 "share"),将自定义路径添加到 XDG_DATA_DIRS +if [ "$LINGLONG_EXPORT_PATH" != "share" ]; then + # 规范化 CUSTOM_DATA_DIR:移除末尾可能存在的斜杠 + CUSTOM_DATA_DIR="${LINGLONG_ROOT}/entries/${LINGLONG_EXPORT_PATH}" + CUSTOM_DATA_DIR=${CUSTOM_DATA_DIR%/} + _add_path_to_xdg_data_dirs "$CUSTOM_DATA_DIR" "start" fi + +# 2. 处理 LINGLONG_DATA_DIR 的添加逻辑 +# 如果 XDG_DATA_DIRS 为空,则先设置为 /usr/local/share:/usr/share, +# 然后再将 LINGLONG_DATA_DIR 添加到末尾。 +: "${XDG_DATA_DIRS:=/usr/local/share:/usr/share}" + +# 然后,将 LINGLONG_DATA_DIR 添加到 XDG_DATA_DIRS 的末尾(如果不存在) +_add_path_to_xdg_data_dirs "$LINGLONG_DATA_DIR" "end" + +# --- 清理辅助函数 --- +unset -f _add_path_to_xdg_data_dirs