Makefile' vpath'使用通配符搜索先决条件时不起作用

时间:2017-05-04 15:11:32

标签: makefile gnu-make

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

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

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

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

vpath %.c common

在makefile的开头。现在,每当我尝试制作&#39;时,它就会停止并在我移动的文件上引发错误。例如,对于&#39; common / foo.c&#39;我得到了

"*** No rule to make target bin/foo.o, needed by..."
好像我没有指定&#39; vpath&#39;。但是当我修改规则只编译.c文件

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

神奇地它再次开始正常运行并检查&#39; ./ common&#39;对于消息来源。

看起来像&#39; vpath&#39;机制和通配符不能一起工作,但我还是新手来制作&#39;并且渴望了解这种行为的确切原因。任何人的想法?提前谢谢。

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

UPD:拥有所有文件和&#39; bin&#39;目录驻留在同一级别,如此

|-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 $<

现在,如果我搬家,说,&#39; foo.c&#39;分离目录并指定&#39; vpath&#39;,使用&#34生成停靠点;没有规则来生成ff.out&#34;所需的目标bin / foo.o。

1 个答案:

答案 0 :(得分:0)

我建议仔细阅读How Not to Use VPATH,因为你似乎在某些地方而不是其他地方拥有OBJDIR的第三步。

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

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

有许多更全面但复杂的答案,请参阅以下文章中的部分内容。

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

我根据你可能澄清事情的减少的例子抛出git repo with branches

相关问题