GNU Make 中的仅订购目标 - 用于 Microsoft NMAKE?

Posted

技术标签:

【中文标题】GNU Make 中的仅订购目标 - 用于 Microsoft NMAKE?【英文标题】:Order-only targets as in GNU Make - for Microsoft NMAKE? 【发布时间】:2012-07-14 10:20:33 【问题描述】:

GNU Make allows to specify order-only targets:

有时 [...] 您会遇到这样一种情况,即您希望对要调用的规则施加特定的顺序,而不是在执行这些规则之一时强制更新目标。在这种情况下,您想要定义仅订单的先决条件。可以通过在先决条件列表中放置管道符号 (|) 来指定仅订单先决条件:管道符号左侧的任何先决条件都是正常的;右侧的任何先决条件都是仅订购的:

targets : normal-prerequisites | order-only-prerequisites

仅订单的先决条件包含在$^ 中;您可以使用$| 引用它们。

我发现这对于将系统库指定为链接的附加依赖项很有用。

CXX      = cl
CXXFLAGS = /nologo /W4 /EHsc /MD
RC       = rc
RCFLAGS  = /nologo

# Link executables; $^ = all prerequisites; $| = order-only prerequisites
%.exe: %.obj %.res
    $(CXX) $(CXXFLAGS) /Fe$@ $^ $|

# Compile source files
%.obj: %.cpp
    $(CXX) $(CXXFLAGS) /c /Fo$@ $^

# Compile resource files
%.res: %.rc
    $(RC) $(RCFLAGS) /r /fo$@ $^

# System libraries needed for linking. Specify them as order-only prerequisites
# so their (no-op) rule being executed (due to their absence from the build
# directory) won't make the target appear out of date.
ErrorShow.exe:   | user32.lib
Singleton.exe:   | user32.lib advapi32.lib
ProcessInfo.exe: | user32.lib advapi32.lib gdi32.lib

# Set libraries as no-op targets to satisfy rule existence requirement.
advapi32.lib:
gdi32.lib:
user32.lib:

有没有办法让 Microsoft NMAKE 做同样的事情?

【问题讨论】:

【参考方案1】:

很遗憾,没有,Microsoft NMAKE 没有任何类似于 GNU make 的仅限订购的先决条件,并且鉴于他们早已转向其他构建工具(如 MSBuild),因此微软不太可能添加这样的功能。

但是,ElectricAccelerator 是 Electric Cloud 的高性能 GNU make 和 NMAKE 替代品,在 NMAKE 模式下支持仅订购的先决条件。你可以试试看。

(免责声明:我是 ElectricAccelerator 的架构师和首席开发人员)

【讨论】:

谢谢埃里克。当我问这个问题时,我认为 Visual Studio(在构建引擎下使用 MSbuild)会对我隐藏很多东西,从而阻止正确的学习......所以我转向 NMake 以寻求简单性,但与 NMake 相比,NMake 非常有限GNU 制造。同时我只是使用 Visual Studio ...

以上是关于GNU Make 中的仅订购目标 - 用于 Microsoft NMAKE?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GNU Make 中以编程方式定义目标?

在 GNU make 中列出定义中包含变量的目标/目标

gcc make和gnu make的区别,一般是用哪个?

调试 GNU make

GNU make“命令在第一个目标之前开始” [重复]

GNU make:删除生成的文件时如何重建哨兵目标?