Skip to content

refactor: centralize PROJECT_VERSION_MAJOR configuration in root CMakeLists#284

Merged
Johnson-zs merged 1 commit intolinuxdeepin:masterfrom
liyigang1:master
May 6, 2026
Merged

refactor: centralize PROJECT_VERSION_MAJOR configuration in root CMakeLists#284
Johnson-zs merged 1 commit intolinuxdeepin:masterfrom
liyigang1:master

Conversation

@liyigang1
Copy link
Copy Markdown
Contributor

Moved PROJECT_VERSION_MAJOR definition from submodule cmake files to root CMakeLists.txt for unified version management
Qt6 build sets PROJECT_VERSION_MAJOR to 1 (libdfm-.so.1) Qt5 build sets PROJECT_VERSION_MAJOR to 0 (libdfm-.so.0) Removed redundant PROJECT_VERSION_MAJOR settings from:

  • src/dfm-burn/dfm-burn-lib/dfm-burn.cmake
  • src/dfm-io/dfm-io/dfm-io.cmake
  • src/dfm-mount/dfm-mount.cmake

This change ensures consistent SOVERSION across all submodules and simplifies version management by having a single source of truth

The change maintains binary compatibility while improving build configuration clarity

Influence:

  1. Verify libdfm-burn.so.* has correct SOVERSION after build
  2. Verify libdfm-io.so.* has correct SOVERSION after build
  3. Verify libdfm-mount.so.* has correct SOVERSION after build
  4. Check Qt5 build produces libdfm-*.so.0
  5. Check Qt6 build produces libdfm-*.so.1

refactor: 将 PROJECT_VERSION_MAJOR 配置集中到根 CMakeLists 中

将 PROJECT_VERSION_MAJOR 定义从子模块 cmake 文件移到根 CMakeLists.txt 实现统一的版本管理
Qt6 构建设置 PROJECT_VERSION_MAJOR 为 1 (libdfm-.so.1) Qt5 构建设置 PROJECT_VERSION_MAJOR 为 0 (libdfm-.so.0) 移除了以下文件中的冗余 PROJECT_VERSION_MAJOR 设置:

  • src/dfm-burn/dfm-burn-lib/dfm-burn.cmake
  • src/dfm-io/dfm-io/dfm-io.cmake
  • src/dfm-mount/dfm-mount.cmake

此变更确保所有子模块的 SOVERSION 一致,并通过单一配置源简化版本管理

该变更保持二进制兼容性的同时提高了构建配置的清晰度

Influence:

  1. 验证构建后 libdfm-burn.so.* 具有正确的 SOVERSION
  2. 验证构建后 libdfm-io.so.* 具有正确的 SOVERSION
  3. 验证构建后 libdfm-mount.so.* 具有正确的 SOVERSION
  4. 检查 Qt5 构建产生 libdfm-*.so.0
  5. 检查 Qt6 构建产生 libdfm-*.so.1

…eLists

Moved PROJECT_VERSION_MAJOR definition from submodule cmake files to root
CMakeLists.txt for unified version management
Qt6 build sets PROJECT_VERSION_MAJOR to 1 (libdfm-*.so.1)
Qt5 build sets PROJECT_VERSION_MAJOR to 0 (libdfm-*.so.0)
Removed redundant PROJECT_VERSION_MAJOR settings from:
  - src/dfm-burn/dfm-burn-lib/dfm-burn.cmake
  - src/dfm-io/dfm-io/dfm-io.cmake
  - src/dfm-mount/dfm-mount.cmake

This change ensures consistent SOVERSION across all submodules and simplifies
version management by having a single source of truth

The change maintains binary compatibility while improving build configuration
clarity

Influence:
1. Verify libdfm-burn.so.* has correct SOVERSION after build
2. Verify libdfm-io.so.* has correct SOVERSION after build
3. Verify libdfm-mount.so.* has correct SOVERSION after build
4. Check Qt5 build produces libdfm-*.so.0
5. Check Qt6 build produces libdfm-*.so.1

refactor: 将 PROJECT_VERSION_MAJOR 配置集中到根 CMakeLists 中

将 PROJECT_VERSION_MAJOR 定义从子模块 cmake 文件移到根 CMakeLists.txt
实现统一的版本管理
Qt6 构建设置 PROJECT_VERSION_MAJOR 为 1 (libdfm-*.so.1)
Qt5 构建设置 PROJECT_VERSION_MAJOR 为 0 (libdfm-*.so.0)
移除了以下文件中的冗余 PROJECT_VERSION_MAJOR 设置:
  - src/dfm-burn/dfm-burn-lib/dfm-burn.cmake
  - src/dfm-io/dfm-io/dfm-io.cmake
  - src/dfm-mount/dfm-mount.cmake

此变更确保所有子模块的 SOVERSION 一致,并通过单一配置源简化版本管理

该变更保持二进制兼容性的同时提高了构建配置的清晰度

Influence:
1. 验证构建后 libdfm-burn.so.* 具有正确的 SOVERSION
2. 验证构建后 libdfm-io.so.* 具有正确的 SOVERSION
3. 验证构建后 libdfm-mount.so.* 具有正确的 SOVERSION
4. 检查 Qt5 构建产生 libdfm-*.so.0
5. 检查 Qt6 构建产生 libdfm-*.so.1
@deepin-ci-robot
Copy link
Copy Markdown

deepin pr auto review

这份 Git Diff 展示了对 CMake 构建系统中版本号管理逻辑的修改。主要改动是将 PROJECT_VERSION_MAJOR 变量的设置位置从各个子模块的 .cmake 文件中移到了根目录的 CMakeLists.txt 中,并根据 Qt 版本赋予了不同的值(Qt6 为 1,Qt5 为 0)。

以下是对该改动的详细审查意见,涵盖语法逻辑、代码质量、代码性能和代码安全四个方面:

1. 语法逻辑

  • 逻辑一致性

    • 现状:在根 CMakeLists.txt 中,DFM_VERSION_MAJORPROJECT_VERSION_MAJOR 的设置逻辑是联动的。使用 Qt6 时两者都设为 6/1,使用 Qt5 时设为空/0。
    • 潜在问题DFM_VERSION_MAJOR 在 Qt5 模式下被设置为空字符串 (""),而 PROJECT_VERSION_MAJOR 被设置为 0。这可能导致后续生成的版本号字符串(如 0.1.0)与预期不符,或者在使用 PROJECT_VERSION_MAJOR 进行版本比较或字符串拼接时出现非预期的行为(例如,0.x.x 可能被视为比 1.x.x 更旧的版本)。
    • 建议:确认 DFM_VERSION_MAJOR 为空字符串是预期行为。如果 DFM_VERSION_MAJOR 也需要代表主版本号,建议在 Qt5 分支中也明确设置一个数字(例如 5),以保持逻辑对称性。
  • 变量覆盖风险

    • 现状:子模块 .cmake 文件中删除了 if (NOT PROJECT_VERSION_MAJOR) 的检查和默认值设置。
    • 分析:这强制依赖根 CMakeLists.txt 必须定义 PROJECT_VERSION_MAJOR。如果根目录逻辑被修改或未执行(例如在特殊构建配置下),子模块将因变量未定义而报错。
    • 建议:虽然集中管理版本号是好的实践,但为了防御性编程,建议在子模块中保留 if (NOT DEFINED PROJECT_VERSION_MAJOR) 的检查并抛出 FATAL_ERROR,而不是静默失败或使用默认值。这样可以更快地定位配置错误。

2. 代码质量

  • 可维护性

    • 优点:将版本号集中管理是很好的改进。之前的代码在多个子模块中重复定义默认值 1,容易导致修改遗漏。现在统一在根目录控制,符合 DRY (Don't Repeat Yourself) 原则。
    • 建议:目前的逻辑将 Qt 版本与项目主版本号强绑定(Qt6 -> v1, Qt5 -> v0)。这种耦合关系是否合理?
      • 如果项目确实计划将 Qt6 版本作为 v1.0.0 发布,而 Qt5 版本作为 v0.x.x 的旧版维护,那么逻辑是正确的。
      • 如果项目版本号应独立于 Qt 版本(例如 Qt6 版本可能是 v2.0.0),建议将版本号的设置与 Qt 的检测逻辑解耦,显式地设置 PROJECT_VERSION_MAJOR,而不是隐式地依赖 Qt 版本。
  • 命名规范

    • PROJECT_VERSION_MAJOR 是 CMake 的标准变量名(通常配合 project() 命令使用),使用它是规范的。
    • DFM_VERSION_MAJOR 是项目自定义变量,需确保其在整个项目中命名一致。

3. 代码性能

  • 影响:CMake 属于构建时工具,这些变量的设置仅在配置阶段执行一次。将变量设置从子模块移至根目录,或者改变其值,对运行时性能没有任何影响。对构建配置时间的影响也可以忽略不计。

4. 代码安全

  • 输入验证
    • 当前代码假设 OPT_ENABLE_QT6 是一个明确的开关。如果该选项未设置,代码会回退到 Qt5 分支。
    • 建议:确保在 if(OPT_ENABLE_QT6) 之前,OPT_ENABLE_QT6 已经被正确初始化(例如通过 option() 命令),以防止未定义行为。
  • 版本号欺骗
    • 虽然这不直接涉及内存安全,但错误的版本号可能导致包管理器(如 deb/rpm)在升级时做出错误的判断(例如认为新版本是旧版本)。确保版本号遵循语义化版本控制(SemVer)规范。

总结与改进建议代码

建议对根 CMakeLists.txt 进行微调,增加防御性检查,并明确版本号的意图。

# ... 前面的代码 ...

# 确保 OPT_ENABLE_QT6 已定义
if(NOT DEFINED OPT_ENABLE_QT6)
    option(OPT_ENABLE_QT6 "Build with Qt6" OFF)
endif()

if(OPT_ENABLE_QT6)
    # 检查 Qt6 是否真的可用,而不仅仅是选项开启
    find_package(Qt6 COMPONENTS Core QUIET)
    if(Qt6_FOUND)
        set(DFM_BUILD_WITH_QT6 TRUE)
        set(QT_VERSION_MAJOR 6)
        set(DFM_VERSION_MAJOR 6)
        
        # 明确设置项目版本,建议与 Qt 版本解耦,除非它们确实是一一对应的
        # 如果 Qt6 版本对应项目主版本 1,则保持原样
        set(PROJECT_VERSION_MAJOR 1)
    else()
        message(WARNING "OPT_ENABLE_QT6 is ON, but Qt6 was not found. Falling back to Qt5.")
        set(DFM_BUILD_WITH_QT6 FALSE)
    endif()
endif()

# 统一处理非 Qt6 (即 Qt5) 的情况
if(NOT DFM_BUILD_WITH_QT6)
   find_package(Qt5 COMPONENTS Core QUIET)
   if(NOT Qt5_FOUND)
       message(FATAL_ERROR "Neither Qt6 nor Qt5 was found.")
   endif()
   
   message(STATUS "Building with Qt5.")
   set(QT_VERSION_MAJOR 5)
   
   # 建议:根据项目规划设置 DFM_VERSION_MAJOR
   # 如果 Qt5 分支是旧版本,设为 0 或 5 均可,但需明确
   set(DFM_VERSION_MAJOR 5) 
   
   # 建议:明确 Qt5 构建对应的项目主版本
   set(PROJECT_VERSION_MAJOR 0)
endif()

# ... 后面的代码 ...

针对子模块 (dfm-burn.cmake 等) 的建议:

虽然移除了默认值设置,但建议保留一个断言,确保变量已被定义,以便在配置出错时提供清晰的错误信息:

# 在子模块 .cmake 文件中
if (NOT VERSION)
    set(VERSION "1.0.0")
endif()

# 防御性检查:确保根目录已经设置了主版本号
if(NOT DEFINED PROJECT_VERSION_MAJOR)
    message(FATAL_ERROR "PROJECT_VERSION_MAJOR is not defined! Check root CMakeLists.txt.")
endif()

set_target_properties(
    ${BIN_NAME} PROPERTIES
    VERSION ${VERSION}
    # ... 其他属性
)

@deepin-ci-robot
Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: Johnson-zs, liyigang1

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@Johnson-zs Johnson-zs merged commit 6298f35 into linuxdeepin:master May 6, 2026
21 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants