将自定义命令添加到 qmake 中的现有目标

2024-02-21

有没有办法指定,在.pro文件中,要添加到标准目标的额外命令Makefile that qmake产生?例如,考虑distclean,可能需要额外的命令来:

  • Remove *~ files.
  • 从源树中清除运行时生成的输出文件。
  • Etc.

我想使用普通目标而不是自定义目标,因为我希望这在我的工作流程中完全透明。那就是(再次使用distclean作为一个例子),我不想...

  • ...需要一定的多项目设置知识生成文件使用自定义规则代替distclean.
  • ... document custom rules, even for stand-alone projects, as distclean is already well-known http://www.gnu.org/software/make/manual/html_node/Standard-Targets.html and intuitive.

I found 如何在 qmake 生成的 Makefile 中添加自定义目标? https://stackoverflow.com/questions/3776476,但这描述了添加自定义目标(即已经记录在案 http://doc.qt.io/qt-5/qmake-advanced-usage.html, even 回到4.6 http://doc.qt.digia.com/4.6/qmake-environment-reference.html#customizing-makefile-output)而不是向现有目标添加规则。虽然它确实包含一些提示,但所有这些提示都需要添加新的自定义目标,因为在一个文件中多次指定同一目标Makefile替换(不添加)来自先前目标的命令。

我唯一真正能想到尝试的就是添加target.commands += new commands to the .pro文件作为一个疯狂的猜测(例如distclean.commands += rm \"*~\")。这没有效果。

如何透明地将自定义命令添加到现有目标qmake?


For the distclean example: While maintainer-clean is also on that "standard target" list, in practice I have found it to be rarely used, and in any case qmake doesn't generate it by default; I consider it to be unsuitable.


有两种简单的方法可以实现此目的,具体取决于您希望解决方案的独立性/可移植性以及您希望对命令执行顺序的宽松程度。


Option 1

第一个选项是在中创建自定义目标.pro文件中包含新命令,然后将该目标作为先决条件添加到您正在修改的标准目标中。回到distclean例如,假设您要添加一个命令来删除所有*~ files:

  1. 在您的中创建自定义目标.pro文件。请注意,您必须转义引号和斜杠.pro文件。例如,添加:

    extraclean.commands = find . -name \"*~\" -exec rm -v {} \\;
    
  2. 将此目标添加为您正在修改的目标的依赖项:

    distclean.depends = extraclean
    

    这实际上不会修改distclean规则还没有,因为此方法不能用于修改现有规则。然而...

  3. 将新目标和正在修改的目标添加为额外目标:

    QMAKE_EXTRA_TARGETS += distclean extraclean
    

    这将添加第二个规范distclean to the Makefile,但这可行,因为您可以将依赖项添加到现有目标中make在单独的规则中,即使您不能以这种方式添加命令 https://www.gnu.org/software/make/manual/html_node/Multiple-Rules.html#Multiple-Rules。如果您还指定distclean.commands在你的.pro文件,你会破坏现有的distclean通过替换其默认配方。

所以,把所有这些放在一起,在.pro file:

extraclean.commands = find . -name \"*~\" -exec rm -v {} \\;
distclean.depends = extraclean
QMAKE_EXTRA_TARGETS += distclean extraclean

Where extraclean是一些自定义目标,其中包含您要添加的命令,以及distclean是您要修改的现有目标。

Pros:

  • 完全独立于一个.pro file.
  • 尽可能便携,保留实际Makefile语法和生成高达qmake.

Cons:

  • 您的新命令不是appended到现有的食谱。相反,它们发生在满足所有先决条件目标之后,但是before现有的食谱。在里面distclean例如,版本为qmake我正在使用的,这将命令放置在源树干净之后但之前Makefile本身被删除(这是默认配方采取的唯一操作)。对于本示例来说这不是问题,但对您来说可能是个问题。

Option 2

第二个选项是更改名称Makefile that qmake生成并创建您自己的自定义Makefile that defers到生成的,而不是包含 + 覆盖它。这也是一个简单的选择;虽然不像选项 1 那样独立,但它使您能够在默认生成的配方之前和之后执行命令。

您不想包含+覆盖现有的Makefile,因为您不想替换默认食谱。如果这样做,您必须重新实现默认值,但这可能是一个问题,因为默认值可能会更改(并且您必须跟上更改)。最好让qmake尽可能多地完成工作,而不是重复工作。

去做这个:

  1. 首先,更改文件名qmake生成。这可以通过在.pro file:

    MAKEFILE = RealMakefile
    

    这会导致qmake输出真正的Makefile代替Makefile.

  2. 下一步是创建您自己的Makefile使用您的自定义命令。然而,这里有一些警告。首先,一个完整的例子,再次使用distclean。在一个名为Makefile:

    .DEFAULT_GOAL := all
    
    %:
        @$(MAKE) -f RealMakefile $@
    
    distclean:
        @$(MAKE) -f RealMakefile $@ 
        @find . -name "*~" -exec rm -v {} \;
    

    关于此的一些注意事项:

    • We set .DEFAULT_GOAL因为否则distclean将是默认值。如果您对此不满意,可以选择替代方案.DEFAULT_GOAL, 是指定一个all规则使用@$(MAKE) -f RealMakefile $@作为食谱。
    • The %目标匹配任何未在此定义的目标Makefile。它只是将处理委托给真正的Makefile.
    • The distcleantarget 是我们添加命令的地方。我们仍然需要委托给真正的Makefile,但是可以在发生之前和之后添加其他命令。

Pros:

  • 对命令顺序的更多控制。可以在默认配方之前和之后添加命令。

Cons:

  • 不是独立的.pro.
  • 不那么便携:它不会留下所有Makefile世代高达qmake,而且我实际上也不确定哪些部分是 GNU 特有的make在这里(欢迎评论)。

因此,虽然这个答案可能有点长,但这两种方法都非常简单。我更喜欢选项 1,除非命令执行顺序有问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将自定义命令添加到 qmake 中的现有目标 的相关文章

  • 链接 C 代码时如何判断符号的定义位置

    我面临着链接中特定符号的未定义参考问题 error undefined reference to g queue pop nth 我正在 LOP 和 ARM 平台上工作 我们在两个平台上使用相同的环境 我们的 ARM 构建可以毫无问题地链接
  • 使用 OpenGL 渲染 QImage

    与我相关的其他问题 https stackoverflow com questions 20126354 render qimage from sooffscreenrenderer in qglwidget 我认为更核心的问题是 如何渲染
  • 如何去除QWizard中的水平线?

    我正在研究一个样式表QWizard我想删除按钮上方的水平线 我尝试递归浏览所有小部件并将其边框设置为无 但似乎没有任何小部件具有此边框 这是我的代码 可以找到完整的可构建示例here https gist github com ardeid
  • 如何在 Makefile 中自动创建(和删除)临时目录?

    是否可以有make在执行第一个目标之前创建一个临时目录 也许使用一些黑客 一些额外的目标等 Makefile 中的所有命令都可以引用自动创建的目录 TMPDIR 并且该目录将被自动删除make命令结束 以前的这些答案要么不起作用 要么看起来
  • 是否有 Qt 小部件可以浏览应用程序中小部件的层次结构(类似于 Spy++)?

    我们有一个具有复杂的小部件层次结构的应用程序 我希望能够以与 Spy 类似的方式浏览此层次结构 查看和编辑属性 例如大小 如果有一个小部件可以显示此信息 则它不需要在外部应用程序中运行 那么问题来了 这样的神兽存在吗 您可以使用Gammar
  • Qt中用于线程间通信的类设计

    问题陈述 用相机跟踪物体并相应地移动相机的方位角和仰角 Process 相机获取物体的图像 处理相机的每一帧以查找物体 应该被跟踪 并将每帧中生成的信息传递给机械设备 万向节 以平移和倾斜方式移动摄像机 Design 主 Gui 在一个线程
  • 针对初学者的 QT 商业许可证与非商业许可证 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 QT 许可似乎非常反学习 因为据我所知 用它开发的任何东西都只能是商业的当且仅当 its entire开发是在使用商业许可证的情况下完成的
  • 覆盖 QWebView 中的页面回复

    我试图在 Qt 的 QWebView 中拦截页面 表单请求 并在某些情况下使用替代内容进行响应 QNetworkReply ngcBrowser createRequest Operation operation const QNetwor
  • PyQt4 信号和槽

    我正在使用 PyQt4 编写我的第一个 Python 应用程序 我有一个 MainWindow 和一个 Dialog 类 它是 MainWindow 类的一部分 self loginDialog LoginDialog 我使用插槽和信号 这
  • 即使我在单独的线程中运行,QT GUI 也会冻结

    我有一个小型聊天应用程序 其中使用 SQLite 数据库来存储所有对话 我注意到该应用程序随机冻结 然后我必须最小化和最大化它才能使其再次工作 我认为问题可能是 SQLite 选择 插入导致 gui 冻结 我决定尝试将所有 SQLite 方
  • QML 列表视图拖放

    我想创建两个 qml 列表视图 可以执行两个功能 拖放一个列表中的项目以更改项目的顺序 跨列表拖放项目 项目将从一个列表中删除并添加到另一个列表中 根据 Qt 文档中的拖放示例 我决定创建两个访问同一列表模型的列表视图 列表模型中的每个项目
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • Q风格所有权

    在 Qt 应用程序中使用样式时 我遇到了一个有趣的问题QStyle所有权 QStyle继承自QObject 通常接受QObject parent作为构造函数参数来管理其子级的生命周期 但QStyle的构造函数没有此构造函数参数 第一个问题
  • 如何向 PyQt5 GUI 添加线程?

    所以我使用 QT Designer 创建了一个 GUI 它工作得很好 但在更复杂的调用中 它不会更新主窗口并锁定 我想运行我的CustomComplexFunction 在根据不断变化的后端信息更新主窗口中的文本编辑时 我希望它每 2 秒运
  • 在 Qt 中,许多插槽连接到同一信号,它们在发出信号时是否按顺序调用?

    In the Qt文件说 如果多个插槽连接到一个信号 则这些插槽将 按照它们连接的顺序一个接一个地执行 当信号发出时 但在connect 功能 设置Qt ConnectionType输入为Qt QueuedConnection意思是 当控制
  • Qt:更改 Mac OS X 上的应用程序 QMenuBar 内容

    我的应用程序对多个 页面 使用 QTabWidget 其中顶级菜单根据用户所在的页面而变化 我的问题是 尝试重新创建菜单栏的内容会导致严重的显示问题 它在除 Mac OS X 之外的所有平台上按预期使用第一种和第三种样式 尚未测试第二种 但
  • 使用 QGraphicsScene 和 QGraphicsView 在 Qt 中开始基于 Tile 的游戏

    我将开始在 Qt 中编写基于 2D 图块的游戏 并阅读 QGraphicsScene 和 QGraphicsView 类 这些类旨在显示和处理大量 2D 对象 我的问题是 使用 QGraphicsScene 创建一个包含大量图块的世界是否可
  • 如何为 Windows 安装开源 Qt 库 5 二进制版本

    这个问题具体是关于Qt libraries 5 0 0 for Windows VS 2010 406 MB at http qt project org downloads http qt project org downloads 但我
  • 相对文件路径的区别:Qt Creator的调试模式和发布模式

    QFile file test txt if file open QIODevice ReadOnly qDebug lt lt You got me 我在用 Qt 4 8 6 与 MSVC 2010 Qt 创建者 3 1 1 Window
  • 从 make 文件中禁用 make 内置规则和变量

    我想根据传递禁用内置规则和变量 r and R options http www gnu org software make manual make html Options Summary从 make 文件内部到 GNU make 也欢迎

随机推荐

  • ASP.NET Core 和 JQuery 不显眼的 AJAX 无法正常工作

    如果我在 net 4 5 中启动一个新项目并点击 管理 nuget 包 搜索 ajax 然后点击 安装 ajax unobtrusive 然后我可以进入我的 cshtml 文件并输入 Ajax 例如 Ajax beginForm 如果我使用
  • Yii - 从 URL 中消除模块的默认控制器 ID

    我创建了一个模块 其中存在一个默认控制器 现在我可以访问默认控制器中的索引操作 默认操作 例如 mymodule 对于所有其他操作 我需要在 url 中指定控制器 id 例如 mymodule default register 我想知道是否
  • JavaScript 遍历数组并用下一个减去每个项目

    我有一个如下所示的数组 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 21 19 22 20 23 我想
  • Git 在提交时指定用户和电子邮件?

    我们已经在测试服务器上创建了代码分支 多个用户现在正在通过 SSH 连接到新服务器并使用命令行进行所有提交来处理该代码 但是 Git 当然不知道是谁进行了更改并提交了这些更改 因此我们需要在提交期间指定作者 我认为我们可以通过以下方式实现这
  • 是否可以使用 Jigsaw 在 Java 9 中通过反射来访问包作用域的方法?

    我有以下代码来检索默认值URLStreamHandlers对于 http 和 https 它通过访问静态包作用域方法在 Java 8 中工作URL getURLStreamHandler private URLStreamHandler g
  • 编辑构建 R 包时生成的默认 PDF 手册

    我已成功执行以下步骤来创建我自己的 R 包 创建包的骨架并粘贴 Rd NAMESPACE and DESCRIPTION files 被处决R CMD check package name 没有错误 它还生成了 2 个 pdf 其中之一包含
  • 具有动态数组的 VBA 字典

    我正在尝试创建包含动态数组的动态字典 电子表格中的示例行 Facility Name Contact Name Contact Role 设施和联系人之间的关系是M2M 我想重新创建一个如下所示的工作表 Contact Name Facil
  • 持久化图形数据 (Java)

    我有一个利用图形 树状 自定义结构的应用程序 这些结构不是真正的树 但几乎所有东西都连接在一起 数据量也很大 可以存在数百万个节点 树节点的类型可以不同 以使其更有趣 继承 我不想改变数据结构来适应持久性存储 我想保留这些数据而不需要太多额
  • 在两个不同模式中使用两个同名表时避免 Hibernate Annotation Exception

    我有两个表 都在两个不同的模式中命名为 Language 我们将它们称为 schema1 和 schema2 当我注释每个表的模型时 我的代码如下所示 实体 Table 名称 语言 目录 模式1 公开课语言 Entity Table nam
  • 资源 FullCalendar 中的固定列宽

    我正在使用支持资源视图的 FullCalendar 特殊版本 http tux fi jarnok fullcalendar resourceviews http tux fi jarnok fullcalendar resourcevie
  • SQL删除表中不重复的条目

    我有一个有两列的表格CountryCode CountryName 中存在重复条目countrycode 但我想删除不重复的条目并保留重复的行countrycode柱子 所以我想写一个SQL语句来做到这一点 我想我必须使用having 但不
  • Ruby on Rails 生成视图

    有没有办法使用railsgenerate命令单独生成视图 我也愿意安装一个 gem 来完成现有的任务 基本上 脚手架命令给了我太多的东西 我宁愿手动编写我的控制器 但是 使用记录表编写索引视图的效率不是很高 您可以使用控制器生成器生成控制器
  • Firefox 扩展将 Javascript 数组作为对象发送

    我在将 JavaScript 数组传递给我正在编写的附加组件时遇到问题附加生成器 https builder addons mozilla org 为了进行通信 我使用事件并使用数组发送事件 但附加组件 内容脚本 获取一个对象 而不是数组
  • 尝试获取最小整数

    所以我有4个清单 我想找出哪个 list size 是最低的 我可以找到最低的 但有些结果是相同的 这是 我拥有的 if EAmount lt DAmount EAmount lt GAmount EAmount lt IAmount Fi
  • 如何解决 flutter firebase 中的此 NoSuchMethodError

    我有这段代码 应该返回 userId 问题是它返回 null 因为用户已注销 override void initState TODO implement initState super initState try widget auth
  • 如何将字符串转换为浮点数? [复制]

    这个问题在这里已经有答案了 可能的重复 在 Objective C 中将字符串转换为浮点数 https stackoverflow com questions 3191034 convert string to float in objec
  • Grunt.js:在任务完成之前修改文件后立即触发 livereload

    我正在使用 Grunt 来编译带有指南针的 CSS 并触发浏览器 livereload 这些是我的手表任务 watch styles options spawn false files assetsDir scss dev min scss
  • React - ComponentDidMount 没有从 Redux 状态获取值

    I am getting the Redux state updated correctly Here is what the Redux state of updateNeeded is In this case it is true 我
  • 使用 SSL 从 NXlog 传送到 Logstash

    我让 NXLog 将我的 Windows 事件发送到另一台仅在 TCP 中正常工作的 Logstash 机器 但我想使用自签名证书加密流量 我想我对 SSL 有基本的了解 但对 NXLog 文档感到困惑 NXLog om ssl 文档显示
  • 将自定义命令添加到 qmake 中的现有目标

    有没有办法指定 在 pro文件中 要添加到标准目标的额外命令Makefile that qmake产生 例如 考虑distclean 可能需要额外的命令来 Remove files 从源树中清除运行时生成的输出文件 Etc 我想使用普通目标