【问题标题】:Makefile's 'vpath' doesn't work when searching prerequisites with wildcards使用通配符搜索先决条件时,Makefile 的“vpath”不起作用
【发布时间】:2017-05-04 15:11:31
【问题描述】:

我的项目包括 .c 和 .s (asm) 文件。我用'gcc'编译这两种类型并将输出.o文件放到单独的目录'./bin'中。为此,我正在使用像这样的单个 makefile 规则

bin/%.o: %.[cs]
        $(CC) $(CFLAGS) -o $@ -c $<

(据我了解,在这种情况下使用方括号通配符有点不合常规,但它很有效,而且看起来很整洁,所以......)

前几天我决定将我的一些 .c 文件移动到专用目录 './common',所以我添加了

vpath %.c common

在生成文件的开头。现在,每次我尝试“制作”时,它都会停止并在我移动的文件上抛出错误。例如,对于 'common/foo.c' 我得到

"*** No rule to make target bin/foo.o, needed by..."

好像我没有指定'vpath'。但是当我修改规则只编译 .c 文件时

bin/%.o: %.c
        ... ...

神奇地它再次开始正常运行并检查 './common' 的来源。

看起来'vpath'机制和通配符不能一起工作,但我对'make'仍然很陌生,并且渴望了解这种行为的确切原因。有什么想法吗?提前致谢。

(使用 make–3.81 和 make–4.1 测试。)


UPD:让所有文件和“bin”目录位于同一级别,就像这样

|-bin/
|-foo.c
|-bar.s
|-baz.c
|-Makefile

这里是 MWE

ROOTS   = foo.o bar.o
OBJS    = baz.o
SS      = $(addprefix bin/,$(ROOTS) $(OBJS))

all: ff.out

ff.out: $(SS)
    ld -o $@ $^

bin/%.o: %.[cs]
    gcc -o $@ -c $<

现在,如果我将 'foo.c' 移动到单独的目录并指定 'vpath',构建会停止并显示“没有规则来制作目标 bin/foo.o,ff.out 需要”。

【问题讨论】:

  • 发布您原始makefile的minimal reproducible example,make没有为方括号分配特殊含义,因此它必须使用其内置规则,但您对行为。
  • @user657267 好吧,'make' spec/4.3 另有说明:方括号以类似 bash 的方式被视为通配符。我已将 MWE 添加到我的问题中。
  • 对不起,你是对的,我不敢相信我不知道。

标签: makefile gnu-make


【解决方案1】:

我建议仔细阅读How Not to Use VPATH,因为您似乎处于第三步,在某些地方设置了 OBJDIR,但在其他地方没有。

明确地说,使用静态模式规则不会让您摆脱每个源目录至少需要一个规则,或者每个源目录至少需要一个 make 调用。因此,简单的答案是为新的common/ 目录添加一个与另一个相同的新规则:

bin/%.o: common/%.[cs]
    gcc -o $@ -c $<

还有很多更全面但更复杂的答案,其中一些请参阅后续文章。

对于简单的项目,没有理由不通过添加额外规则来跟踪主 Makefile 中的目录。此外,没有bin/ 目录并拆分.o.out 位置是合理的。分销商和其他人希望能够控制从单独目录运行的文件的创建位置。

我已经根据您的简化示例提出了一个git repo with branches,这可能会澄清一些事情。

【讨论】:

  • 感谢您的回答!实际上,我之前阅读了您建议的文章,但对我没有太大帮助,而且您的第二个选项对我不起作用。现在我开始认为我必须拒绝使用'vpath'并直接指定所有源路径的想法。真正让我感到困惑的是,我找不到任何 Makefile 示例,其中通配符如“?”或 '[...]' 被使用。奇怪。
  • 您应该直接指定 srcdirs,我已经更新了我的答案以使其更清晰。您可能看不到太多通配符,因为更喜欢明确列出文件或其他类型的制作工具。
猜你喜欢
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2014-05-08
  • 1970-01-01
相关资源
最近更新 更多