Skip to content

fix: Add alternative INCLUDEPATH for dtk widget configurations#799

Merged
deepin-bot[bot] merged 1 commit into
linuxdeepin:develop/snipefrom
dengzhongyuan365-dev:updateTag
Feb 10, 2026
Merged

fix: Add alternative INCLUDEPATH for dtk widget configurations#799
deepin-bot[bot] merged 1 commit into
linuxdeepin:develop/snipefrom
dengzhongyuan365-dev:updateTag

Conversation

@dengzhongyuan365-dev

Copy link
Copy Markdown
Member
  • Introduced alternative search paths in multiple .pro files to address issues with incorrect dtk6widget.pc and dtkwidget.pc files.
  • Updated INCLUDEPATH for both Qt6 and Qt5 configurations to ensure proper widget inclusion.

This change improves build reliability across different environments.

- Introduced alternative search paths in multiple .pro files to address issues with incorrect dtk6widget.pc and dtkwidget.pc files.
- Updated INCLUDEPATH for both Qt6 and Qt5 configurations to ensure proper widget inclusion.

This change improves build reliability across different environments.
@deepin-ci-robot

Copy link
Copy Markdown

deepin pr auto review

这段代码的 diff 主要是为了解决编译时找不到 DTK (Deepin Tool Kit) 头文件的问题,通过硬编码的方式添加了头文件搜索路径。

以下是针对这段 diff 的详细审查意见,包括语法逻辑、代码质量、代码性能和代码安全方面:

1. 语法逻辑

  • 现状:语法上完全符合 qmake 的语法规范,能够被 qmake 解析器正确识别。
  • 问题:逻辑上存在硬编码假设
    • 代码假设 DTK 的头文件一定安装在 /usr/include/dtk6/DWidget/usr/include/dtk5/DWidget 目录下。
    • 代码假设系统架构是标准的(虽然 src/src.pro 中有一处 /usr/include/x86_64-linux-gnu/ 的路径,但新增的 DTK 路径没有区分架构)。
    • 对于非标准安装路径(例如自定义前缀安装)或非 x86_64 架构(如 ARM64),此路径可能不存在,导致编译失败。

2. 代码质量

  • 现状:作为一种临时的“补丁”手段,它确实能解决因 dtk6widget.pcdtkwidget.pc 配置不正确导致的编译错误。
  • 问题可移植性差
    • 这种修改破坏了构建系统的通用性。如果其他开发者在不同的 Linux 发行版或不同的环境下编译,代码将无法工作。
    • 注释中提到 "because of the incorrect dtk6widget.pc",这表明这是一个权宜之计。正确的做法应该是修复上游的 .pc (pkg-config) 文件,而不是在每个使用者的 .pro 文件中打补丁。

3. 代码性能

  • 现状INCLUDEPATH 只是告诉编译器去哪里找头文件。
  • 影响:对运行时性能无影响。对编译时性能有极微小的影响(增加了一个搜索目录),可以忽略不计。

4. 代码安全

  • 现状:添加系统路径通常不会引入直接的安全漏洞。
  • 潜在风险:如果 /usr/include 目录的权限管理不当,或者构建环境被污染,硬编码路径可能会引入非预期的头文件。不过这在标准 Linux 发行版开发环境中风险较低。

改进意见与建议

这段代码的主要问题在于硬编码路径,这降低了代码的可维护性和兼容性。以下是几种改进方案,按推荐程度排序:

方案一:修复上游的 pkg-config 文件(最推荐)

既然注释提到是 .pc 文件不正确,最根本的解决方法是修复 dtk6widget.pc 文件,确保其 Cflags 字段包含了正确的 -I/usr/include/dtk6/DWidget。这样所有依赖 DTK 的项目都不需要修改自己的构建文件。

方案二:使用 pkg-config 动态获取路径(推荐)

如果无法立即修改上游,可以在 .pro 文件中利用 pkg-config 动态查询头文件路径,而不是硬编码。这样能适应不同的安装前缀(Prefix)。

修改示例:

equals(QT_MAJOR_VERSION, 6) {
    QT += widgets dbus
    PKGCONFIG += dtk6widget dtk6core
    
    # 改进:使用 pkg-config 获取 dtk6widget 的包含路径,避免硬编码
    DTK6_INCLUDE_PATH = $$system(pkg-config --variable=includedir dtk6widget)
    !isEmpty(DTK6_INCLUDE_PATH) {
        INCLUDEPATH += $$DTK6_INCLUDE_PATH/dtk6/DWidget
    } else {
        # 如果 pkg-config 实在查不到,再回退到硬编码作为保底
        warning("Failed to get dtk6widget include path from pkg-config, falling back to hardcoded path.")
        INCLUDEPATH += /usr/include/dtk6/DWidget
    }
} else {
    # Qt5 同理
    QT += widgets dbus
    QT += dtkgui
    
    DTK_WIDGET_INCLUDE = $$system(pkg-config --variable=includedir dtkwidget)
    !isEmpty(DTK_WIDGET_INCLUDE) {
        INCLUDEPATH += $$DTK_WIDGET_INCLUDE/dtk5/DWidget
    } else {
        INCLUDEPATH += /usr/include/dtk5/DWidget
    }
}

方案三:使用条件判断增加健壮性(次选)

如果必须保留硬编码路径,建议增加 exists 判断,防止路径不存在时报错,并给出更友好的提示。

修改示例:

equals(QT_MAJOR_VERSION, 6) {
    QT += widgets dbus
    PKGCONFIG += dtk6widget dtk6core
    
    # 改进:检查路径是否存在,不存在则报错或尝试其他常见路径
    DTK6_STD_PATH = /usr/include/dtk6/DWidget
    exists($$DTK6_STD_PATH) {
        INCLUDEPATH += $$DTK6_STD_PATH
    } else {
        # 尝试添加 /usr/local/include 或其他可能的前缀
        # 或者直接报错提示用户检查环境
        message("Warning: Standard DTK6 header path not found.")
    }
}

总结

当前的 diff 属于“为了编译通过而采取的紧急修复”。虽然语法正确且能工作,但从工程角度看,它引入了维护负担和潜在的兼容性问题。

建议:优先采用方案二,通过 pkg-config 动态获取路径,既解决了当前的 .pc 文件缺失信息的问题,又避免了完全硬编码带来的灵活性丧失。如果可以联系到 DTK 库的维护者,应推动方案一

@deepin-ci-robot

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: dengzhongyuan365-dev, lzwind

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

@dengzhongyuan365-dev

Copy link
Copy Markdown
Member Author

/forcemerge

@deepin-bot

deepin-bot Bot commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

This pr force merged! (status: unstable)

@deepin-bot deepin-bot Bot merged commit cae8271 into linuxdeepin:develop/snipe Feb 10, 2026
7 of 9 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