将自定义命令添加到 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 中的现有目标 的相关文章

  • [本机]:在Qt for Android中使用Java函数和第3方库[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 最近我用qt写了一个android应用程序 但我有一个很大的问题 我可以使用 调用一些原生的android API 比如调用特殊的activit
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • 从 QML 实例化 C++ 对象会产生巨大的内存使用开销

    实例化一个QObjectC 堆中的派生类为每个对象提供了大约 160 个字节 通过注册相同的对象qmlRegisterType 用于从 QML 创建并通过以下方式动态创建对象createObject 每个对象给我 2000 多个字节 这是完
  • 有没有办法在没有 QApplication::exec() 的情况下使用 Qt?

    有没有一种安全的方法可以在不调用 QApplication exec 的情况下使用 Qt 我有许多不同的对象正在对多个资源执行长期进程 至少其中一个正在与 Web 应用程序服务器进行通信 我正在制作一个 GUI 应用程序 提示用户在正确的时
  • 我怎样才能强制Make一直执行一个菜谱

    当前的 Makefile 有这样的内容 target1 lib1 a lib2 a target2 lib1 a lib3 a target3 lib3 a lib1 a MAKE C sub dir all 我想更改此 Makefile
  • 程序意外完成 - QT Creator

    我正在尝试使用 QT Creator 使用 QT 框架开发 GUI 控制台应用程序 我使用的是Windows XP 我安装了QT 4 8 3和mingw 两者均已安装 没有任何错误 然后我安装了QT Creator QT 版本 路径中的 Q
  • 在 Mac OS X 上的 Makefile 中设置 PATH(但它适用于 Linux)

    我可以在 Linux 上的 Makefile 中设置 PATH 但不能在 Mac OS X 上设置 在 OS X 中 可以设置 PATH 但不会使用 这是一个演示 在带有 bash 4 1 2 1 release 和 GNU Make 3
  • QtCreator 调试暂停停在代码而不是汇编处

    如何配置 QtCreator 以便在调试并按下暂停时它会显示当前正在处理的代码 现在显示汇编 无法在任何地方找到有关此问题的答案 我使用的是 Windows 7 我在 Ubuntu 16 04 中使用 Qt Creator 4 2 2 时遇
  • Qt WinRT 应用程序无法访问文件权限被拒绝

    我需要使用 Qt 和 FFMPEG 开发 WinRT 应用程序 我根据指令构建了 WinRT 的 ffmpeghere https github com Microsoft FFmpegInterop我可以将库与我的项目链接起来 现在我需要
  • 构建 makefile 依赖/继承树

    如果我解释得不好或者问了一些明显的问题 我很抱歉 但我是 Linux 内核的新手 而且有点深入 我们有一个嵌入式 Linux 系统 它附带一个 文档非常糟糕的 SDK 其中包含数百个文件夹stuff 大多数文件夹包含rules make m
  • 禁用 QML Slider 的鼠标滚轮

    我希望能够滚动Flickable使用鼠标滚轮 或触摸板上的两根手指 不改变Sliders它可能包含 示例代码及结果应用 import QtQuick 2 7 import QtQuick Window 2 2 import QtQuick
  • QGraphicsScene::clear 不会改变 sceneRect

    我有一个 QGraphicsScene 场景 和 QGraphicsView graphicsView 我有一个画图的方法 当我需要重绘所有图形时 我调用这个方法 一切都好 但我意识到 scene gt clear 不会改变 sceneRe
  • 如何在使用cmake完成make后打印消息?

    我正在尝试使用 CMake 完成构建过程后打印消息 我只是想在之后通知用户make命令已完成 没有任何错误 我该怎么做 我试过add custom target 但我无法选择何时跑步 另外 我尝试过add custom command 它再
  • 如何调用使用 Define 创建的 GNU make 宏?

    在我的 Makefile 中调用 GREP 的两种方式有什么区别吗 我有什么理由应该使用其中之一 两者似乎产生相同的结果 define GREP word 3 shell echo define FOO 0xfff00100 endef a
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 如何将图像显示为缩略图

    我有一个QTreeView显示硬盘驱动器和目录 我也有一个QListView显示图像文件如下 但我想将图像显示为缩略图 如下所示 My code mainWidget mainWidget QWidget parent QWidget pa
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959

随机推荐

  • 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 我想使用普通目标