子文件夹中包含先决条件的Makefile

子文件夹中包含先决条件的Makefile,makefile,Makefile,已经有人问过类似的问题,但我不理解他们的答案 关于匹配,make的文档中说 当目标模式不包含斜杠时(通常是这样) 不),文件名中的目录名将从文件名中删除 在与目标前缀和后缀进行比较之前。[…] 目录仅在查找隐式 要使用的规则,而不是应用该规则 考虑以下示例:我的makefile是 %.out: input/%.in echo $< 这导致make找不到任何关于如何构建其目标的规则。但实际上,我不明白文档是如何解释这种行为的,尽管社区似乎同意这是文档化的行为。而且,我不知道如何规避

已经有人问过类似的问题,但我不理解他们的答案

关于匹配,
make
的文档中说

当目标模式不包含斜杠时(通常是这样) 不),文件名中的目录名将从文件名中删除 在与目标前缀和后缀进行比较之前。[…] 目录仅在查找隐式 要使用的规则,而不是应用该规则

考虑以下示例:我的makefile是

%.out: input/%.in
    echo $<
这导致make找不到任何关于如何构建其目标的规则。但实际上,我不明白文档是如何解释这种行为的,尽管社区似乎同意这是文档化的行为。而且,我不知道如何规避这一点;不幸的是,求助于固定目录名并不是一个(容易实现的)选项

当目标模式不包含斜杠时(通常是这样) 不),文件名中的目录名将从文件名中删除 在与目标前缀和后缀进行比较之前

Make正在尝试生成文件
hello/world.out
,并查找匹配规则。在此规则中,目标模式(
%.out
)不包含斜杠,因此Make在将目录名与目标(
%.out
)进行比较之前,会从文件名中删除目录名(保留
world.out
)。它很相配

将文件名与目标模式进行比较后 目录名及其结尾的斜杠将添加到 从模式规则的 先决条件模式和文件名

因此,stem是
world
,Make首先根据模式(
input/world.in
)构造先决条件名称,然后添加它先前删除的目录名(
hello/
),因此规则需要先决条件
hello/input/world.in
,该先决条件不存在(并且无法构建)

一种解决方案是使用:

输入中的
vpath%
%.out:%.in
回音$<
现在让大家知道如何在
input/
中搜索
hello/world.in

当目标模式不包含斜杠时(通常是这样) 不),文件名中的目录名将从文件名中删除 在与目标前缀和后缀进行比较之前

Make正在尝试生成文件
hello/world.out
,并查找匹配规则。在此规则中,目标模式(
%.out
)不包含斜杠,因此Make在将目录名与目标(
%.out
)进行比较之前,会从文件名中删除目录名(保留
world.out
)。它很相配

将文件名与目标模式进行比较后 目录名及其结尾的斜杠将添加到 从模式规则的 先决条件模式和文件名

因此,stem是
world
,Make首先根据模式(
input/world.in
)构造先决条件名称,然后添加它先前删除的目录名(
hello/
),因此规则需要先决条件
hello/input/world.in
,该先决条件不存在(并且无法构建)

一种解决方案是使用:

输入中的
vpath%
%.out:%.in
回音$<
现在让大家知道如何在
input/
中搜索
hello/world.in

mkdir hello
mkdir -p input/hello
touch input/hello/world.in
make hello/world.out
vpath %.in input

%.out: %.in
    echo $<