编写通用make目标时,如何仅使用两个目录之一中的文件?

时间:2019-07-16 14:48:32

标签: makefile gnu-make target

我正在尝试与此类似的事情:

obj/32/%.o: src/all/%.c src/$(ARCH)/%.c
        @mkdir -p obj/32 || true
        $(CC) $(CFLAGS) -m32 -c $< -o $@
        objcopy --strip-unneeded $@

我希望它检查src/all/<file>.c是否存在,如果不存在,请改用src/$(ARCH)/<file>.c

但是,它不起作用。它会尝试创建一个依赖项为obj/32/%.osrc/all/%.c的名为src/$(ARCH)/%.c的目标。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

  

我希望它检查src/all/<file>.c是否存在,如果不存在,请改用src/$(ARCH)/<file>.c

在这种情况下,一种选择是创建指向以下文件之一的符号链接:

src/<file>.c : # no dependencies
    test -f src/all/<file>.c && ln -fs src/all/<file>.c $@ || ln -fs src/$(ARCH)/<file>.c $@

然后使用该符号链接:

obj/32/%.o : src/<file>.c | obj/32
    $(CC) $(CFLAGS) -m32 -c -o $@ $<
    objcopy --strip-unneeded $@

obj/32 :
    mkdir -p $@ || true

在上面,它使用目录的仅顺序依赖关系,因此目录是常规的make目标。


或者,使用vpath

vpath %.c src/all
vpath %.c src/$(ARCH)

obj/32/%.o: %.c
        @mkdir -p obj/32 || true
        $(CC) $(CFLAGS) -m32 -c $< -o $@
        objcopy --strip-unneeded $@

上面可能有错误,因为我无法测试,但您应该明白。