只有GNU Make中的目标

GNU Make允许指定仅限订单的目标:

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

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:

有什么办法让微软NMAKE做同样的事情吗?


不幸的是,微软NMAKE没有像GNU make的订单一样的先决条件,并且由于他们早已转移到其他构建工具(如MSBuild),微软不可能添加这样的功能。

然而,ElectricAccelerator是一款高性能的GNU制造商,从Electric Cloud取代NMAKE,确实支持NMAKE模式下的订单前提条件。 你可以试试看。

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

链接地址: http://www.djcxy.com/p/64115.html

上一篇: only targets as in GNU Make

下一篇: in a makefile, declaring a phony target as a wildcard