为什么这个makefile规则不能保证多进程模式下的优先级?

问题描述 投票:0回答:1
LOCAL_HEADERS = $(shell find . -name "*.inc.h")
LOCAL_GCHS = $(LOCAL_HEADERS:.h=.h.gch)

CPCH = -include-pch $(LOCAL_GCHS)

%.o: %.c $(LOCAL_GCHS)

  $(CC) -c $(CFLAGS) $(CPCH) $(DEBUG) $< -o $@;

我想确保

.o
文件依赖于
.c
文件和
$(LOCAL_GCHS)
。 在单进程模式下工作,但是在
-j30
模式下,编译器报错:

错误:无法读取PCH文件./headers/world.inc.h.gch:'没有这样的文件或目录'

终于创建了

world.inc.h.gch
文件,但是创建
.o
文件时,
world.inc.h.gch
似乎并不存在。

为什么不能在创建

%.o: %.c $(LOCAL_GCHS)
文件之前重新创建
$(LOCAL_GCHS)
语句?
    

makefile gnu-make
1个回答
0
投票
手册

说:

4.12.1 静态模式规则的语法

以下是静态模式规则的语法:

.o

目标列表指定规则适用的目标。目标可以包含通配符,就像普通规则的目标一样(请参阅
在文件名中使用通配符

)。

target-pattern

prereq-patterns 说明如何计算每个目标的先决条件。每个目标都与 target-pattern 进行匹配,以提取目标名称的一部分(称为词干)。该词干被替换到每个 prereq-patterns 中以生成先决条件名称(每个 prereq-pattern 中的一个)。 每个模式通常仅包含一次字符“%”。当

target-pattern

匹配目标时,‘%’可以匹配目标名称的任何部分;这部分称为茎。模式的其余部分必须完全匹配。例如,目标targets …: target-pattern: prereq-patterns … recipe … 匹配模式‘%.o’,以‘foo’作为词干。目标

foo.o
foo.c
与该模式不匹配。
每个目标的先决条件名称是通过用每个先决条件模式中的“%”替换词干来创建的。例如,如果一个先决条件模式是 

foo.out

,则替换词干“foo”会给出先决条件名称

%.c
。编写不包含“%”的先决条件模式是合法的;那么这个先决条件对于所有目标都是相同的。

从表面上看,这意味着您的规则缺少第二个冒号,应该写成:

foo.c

	
© www.soinside.com 2019 - 2024. All rights reserved.