在先决条件中具有多个通配符的Makefile

时间:2014-04-29 15:22:08

标签: makefile

我有以下Makefile,我正在尝试简化它。有什么想法吗?

PROG_NAME=a.out

all: $(PROG_NAME)
    "\nBuilt all\n"

$(PROG_NAME): build/file1.o build/file2.o build/file3.o build/file4.0
    gcc -o $@ $^

#build file1.c and file2.c which are both in ../src directory
build/file%.o: ../src/file%.c
    gcc -I ../inc -o $@ $<

#build file3.c and file4.c which are both in ../src2 directory
build/file%.o: ../src2/file%.c
    gcc -I ../inc -o $@ $<

我尝试过这个并不起作用:

PROG_NAME=a.out

all: $(PROG_NAME)
    "\nBuilt all\n"

$(PROG_NAME): build/file1.o build/file2.o build/file3.o build/file4.0
    gcc -o $@ $^

#build ../src/file1.c, ../src/file2.c, ../src2/file3.c, and ../src2/file4.c
build/file%.o: ../src/file%.c ../src2/file%.c
    gcc -I ../inc -o $@ $<

2 个答案:

答案 0 :(得分:1)

你不能简化它。唯一的方法是使用makefile元编程通过eval或其他东西生成规则。

你的尝试显然不起作用,因为:

build/file%.o: ../src/file%.c ../src2/file%.c
        gcc -I ../inc -o $@ $<

说“对于您要构建的任何目标build/fileXXX.o,您可以通过在文件gcc上运行此../src/fileXXX.c命令来创建它,如果其中一个文件../src/fileXXX.c../src2/fileXXX.c早于.o“。这显然不是你想要做的。

答案 1 :(得分:1)

我能够使用make变量VPATH来简化它。

http://www.gnu.org/software/make/manual/make.html#General-Search

PROG_NAME=a.out
VPATH=../src:../src2

all: $(PROG_NAME)
    "\nBuilt all\n"

$(PROG_NAME): build/file1.o build/file2.o build/file3.o build/file4.0
    gcc -o $@ $^

build/file%.o: file%.c
    gcc -I ../inc -o $@ $<