我有以下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 $@ $<
答案 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 $@ $<