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做同等的事情?
答案 0 :(得分:1)
不幸的是,没有,微软NMAKE没有像GNU make的仅限订单的先决条件,并且考虑到他们已经很长时间转移到其他构建工具,如MSBuild,它不太可能微软将永远添加这样的功能。
但是,来自Electric Cloud的高性能GNU make和NMAKE替换ElectricAccelerator确实支持NMAKE模式中的仅订单先决条件。你可以尝试一下。
(免责声明:我是ElectricAccelerator的架构师和首席开发人员)