Skip to content

fix(build): detect Qt6 availability when os-version is missing#289

Merged
Johnson-zs merged 1 commit into
linuxdeepin:masterfrom
liyigang1:master
May 8, 2026
Merged

fix(build): detect Qt6 availability when os-version is missing#289
Johnson-zs merged 1 commit into
linuxdeepin:masterfrom
liyigang1:master

Conversation

@liyigang1
Copy link
Copy Markdown
Contributor

When /etc/os-version does not exist, MAJOR_VERSION defaults to 99, which incorrectly selects Qt6 due to 99 > 20 being true. Add a pkg-config check for Qt6Core to determine actual Qt6 availability, preventing build failures on systems without Qt6 installed.

当 /etc/os-version 不存在时,MAJOR_VERSION 默认为 99,
由于 99 > 20 为真会错误地选择 Qt6。
新增通过 pkg-config 检测 Qt6Core 是否实际安装的逻辑,
避免在未安装 Qt6 的系统上构建失败。

Influence:

  1. 修复了 /etc/os-version 缺失时 Qt 版本选择错误的问题
  2. 确保在没有 Qt6 的环境中正确回退到 Qt5 构建

When /etc/os-version does not exist, MAJOR_VERSION defaults to 99,
which incorrectly selects Qt6 due to 99 > 20 being true.
Add a pkg-config check for Qt6Core to determine actual Qt6 availability,
preventing build failures on systems without Qt6 installed.

当 /etc/os-version 不存在时,MAJOR_VERSION 默认为 99,
由于 99 > 20 为真会错误地选择 Qt6。
新增通过 pkg-config 检测 Qt6Core 是否实际安装的逻辑,
避免在未安装 Qt6 的系统上构建失败。

Influence:
1. 修复了 /etc/os-version 缺失时 Qt 版本选择错误的问题
2. 确保在没有 Qt6 的环境中正确回退到 Qt5 构建
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 8, 2026

  • 检测到debian目录文件有变更: debian/rules

@github-actions github-actions Bot requested a review from liujianqiang-niu May 8, 2026 08:56
@deepin-ci-robot
Copy link
Copy Markdown

deepin pr auto review

这段代码是对 debian/rules 文件的修改,主要目的是在无法通过 /etc/os-version 文件确定操作系统版本(此时 MAJOR_VERSION 被设置为 99)时,通过检测系统中是否实际安装了 Qt6 来决定使用哪个版本的 Qt。

以下是对该代码片段的详细审查意见,涵盖语法逻辑、代码质量、代码性能和代码安全性:

1. 语法逻辑

  • 逻辑正确性

    • 代码逻辑是合理的。它首先检查 MAJOR_VERSION 是否为 99(通常意味着未找到版本文件或解析失败)。
    • 如果是 99,它使用 pkg-config 检查 Qt6Core 是否存在。
    • 如果存在,设置 USE_QT6yes,否则为 no
    • 这解决了在未知发行版或文件缺失时构建失败的问题,增加了一种回退机制。
  • Make 语法

    • ifeq:= 的使用符合 GNU Make 的语法规范。
    • 命令替换 $(shell ...) 的使用也是正确的。

2. 代码质量

  • 可读性与注释

    • 注释 # MajorVersion 为 99 时... 非常清晰,解释了添加这段代码的背景和目的,值得肯定。
    • 变量命名 HAS_QT6 语义明确。
  • 可维护性

    • 目前的逻辑将“版本检测”和“Qt 检测”分成了两个阶段。如果未来有更多的回退策略(例如,如果 Qt6 也不存在,是否检查 Qt5?),这段代码结构是容易扩展的。
    • 建议:虽然目前的逻辑是“如果是 99 则检查 Qt6”,但可以思考一下:如果 MAJOR_VERSION 不是 99,且小于等于 20(默认用 Qt5),但系统里只有 Qt6 怎么办?目前的逻辑会强制使用 Qt5,可能导致构建失败。当然,这取决于打包策略是否严格遵循系统版本号。

3. 代码性能

  • Shell 执行开销
    • pkg-config 是一个外部命令。在 Makefile 中,$(shell ...) 会在解析 Makefile 时执行。
    • 由于这段代码位于 debian/rules 的顶层(非目标内部),它只会在 make 运行开始时执行一次。因此,性能开销可以忽略不计,不会影响编译速度。

4. 代码安全性

  • 命令注入风险
    • pkg-config 的参数是硬编码的 Qt6Core,没有使用用户输入的变量,因此不存在命令注入风险。
  • 错误处理
    • 使用了 2>/dev/null 来屏蔽 pkg-config 的错误输出,防止构建日志被无关的错误信息污染,这是良好的实践。

5. 改进建议

尽管代码已经不错,但为了更健壮,可以考虑以下几点优化:

优化建议 1:简化 Shell 逻辑(减少 Shell 调用次数)

目前的代码调用了一次 pkg-config,然后又进行了一次 ifeq 判断赋值。可以在 Shell 内部直接完成逻辑判断,使 Makefile 更简洁。

修改前:

HAS_QT6 := $(shell pkg-config --exists Qt6Core 2>/dev/null && echo yes || echo no)
ifeq ($(HAS_QT6),yes)
    USE_QT6 := yes
else
    USE_QT6 := no
endif

修改后:

# 直接将结果赋值给 USE_QT6
USE_QT6 := $(shell pkg-config --exists Qt6Core 2>/dev/null && echo yes || echo no)

解释:既然 pkg-config 的输出正好是 yesno,且 USE_QT6 在这个分支下本就需要根据此结果设定,直接赋值即可,省去了一层 ifeq 嵌套。

优化建议 2:处理 pkg-config 未安装的情况

如果构建环境中连 pkg-config 都没有安装,$(shell pkg-config ...) 会报错(尽管 2>/dev/null 屏蔽了输出),并且返回空(或非零状态码,取决于 Shell 实现,但在 $(shell) 中通常表现为输出为空)。如果输出为空,USE_QT6 将被赋值为空字符串,随后的 ifeq ($(USE_QT6),yes) 判断会失败,导致行为可能不符合预期(可能默认走了 Qt5 分支,或者后续逻辑出错)。

改进代码:

ifeq ($(MAJOR_VERSION),99)
    # 检查 pkg-config 是否存在以及 Qt6 是否存在
    USE_QT6 := $(shell command -v pkg-config >/dev/null 2>&1 && pkg-config --exists Qt6Core 2>/dev/null && echo yes || echo no)
endif

解释:增加 command -v pkg-config 检查,确保工具存在。如果 pkg-config 不存在,直接输出 no。这样逻辑更严密。

优化建议 3:缩进一致性

debian/rules 中,通常使用 Tab 缩进(虽然 Makefile 语法允许空格,但 Recipe 必须用 Tab)。这里的逻辑赋值行不是 Recipe,使用空格缩进是可以的,但为了保持与文件其他部分风格一致,建议检查文件整体的缩进风格。

总结

这段代码在逻辑上是正确的,能够解决特定场景(版本未知)下的构建问题。主要建议是简化 Shell 逻辑以减少代码行数,并增加对 pkg-config 工具本身是否存在的检查,以提高在极简构建环境下的鲁棒性。

@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 10e6024 into linuxdeepin:master May 8, 2026
18 of 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