pep*_*er0 26 dependencies gnu makefile
假设我们有规则:
a: b c d e
Run Code Online (Sandbox Code Playgroud)
和b,c,d和e相互独立的.
是作出该命令b,c,d,e界定?看来,他们一般会在顺序进行b,c,d,e,但可能它有时会发生,该命令会有所不同?
jww*_*jww 13
GNU make将以什么顺序进行先决条件?
这取决于先决条件的类型.根据GNU Make Manual,第4.2节:
实际上,GNU make理解了两种不同类型的先决条件:正常的先决条件,如上一节中所述,以及仅限订单的先决条件.正常的先决条件产生两个语句:首先,它强加了一个调用配方的顺序:目标的所有先决条件的配方将在目标的配方运行之前完成.其次,它强加了依赖关系:如果任何先决条件比目标更新,那么目标被认为是过时的,必须重建.
通常,这正是您想要的:如果更新目标的先决条件,则还应更新目标.
但是,有时您可能希望对要调用的规则强制执行特定排序,而不强制在执行其中一个规则时更新目标.在这种情况下,您希望定义仅订单的先决条件.可以通过在先决条件列表中放置管道符号(|)来指定仅订单的先决条件:管道符号左侧的任何先决条件都是正常的; 右边的任何先决条件都是仅限订单:
Run Code Online (Sandbox Code Playgroud)targets: normal-prerequisites | order-only-prerequisites正常的先决条件部分当然可能是空的.此外,您仍然可以为同一目标声明多行先决条件:它们被适当地附加(正常先决条件附加到正常先决条件列表;仅订单先决条件附加到仅订单先决条件列表).请注意,如果将同一文件声明为普通文件和仅限订单的先决条件,则通常的先决条件优先(因为它们具有仅限订单先决条件的行为的严格超集).
考虑一个示例,其中您的目标将放置在单独的目录中,并且该目录在
make运行之前可能不存在.在这种情况下,您希望在将任何目标放入其中之前创建目录,但是,因为无论何时添加,删除或重命名文件时目录上的时间戳都会更改,我们当然不希望重建所有目标.目录的时间戳更改.管理此问题的一种方法是使用仅限订单的先决条件:使目录成为所有目标的仅订单先决条件:Run Code Online (Sandbox Code Playgroud)OBJDIR := objdir OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o) $(OBJDIR)/%.o : %.c $(COMPILE.c) $(OUTPUT_OPTION) $< all: $(OBJS) $(OBJS): | $(OBJDIR) $(OBJDIR): mkdir $(OBJDIR)现在,在构建任何'.o'之前,如果需要,将运行创建'objdir'目录的规则,但是由于'objdir'目录时间戳已更改,因此不会构建'.o'.
当然,如果我使用make -j a,他们可能都得到在同一时间建(取决于b,c,d,或者e反过来有其他/相互关联的依赖)。
| 归档时间: |
|
| 查看次数: |
15816 次 |
| 最近记录: |