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

Makefile 仅订购GNU Make中的目标-适用于Microsoft NMAKE?,makefile,gnu-make,nmake,Makefile,Gnu Make,Nmake,有时[…]您会遇到这样一种情况,即希望对要调用的规则施加特定的顺序,而不必在执行其中一个规则时强制更新目标。在这种情况下,您需要定义仅限订单的先决条件。通过在“先决条件”列表中放置管道符号(|),可以指定“仅订购”先决条件:管道符号左侧的任何先决条件都是正常的;右侧的任何先决条件仅适用于以下顺序: targets : normal-prerequisites | order-only-prerequisites 只有订单的先决条件不包含在$^中;您可以使用$|引用它们 我发现这对于将系统库指定

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

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做类似的工作?

不幸的是,没有,Microsoft NMAKE没有任何类似GNU make's order only的先决条件,而且考虑到他们早已转向其他构建工具,如MSBuild,Microsoft不太可能添加这样的功能

然而,Electric Cloud提供的高性能GNU make和NMAKE替换产品在NMAKE模式下确实支持仅订购的先决条件。你可以试试看


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

谢谢Eric。当我问这个问题时,我认为VisualStudio(使用MSbuild进行构建)会对我隐藏很多东西,从而妨碍正确的学习……因此我转向NMake寻求简单性,但NMake与GNU Make相比非常有限。同时,我只是简单地使用VisualStudio…