Makefile

时间:2016-06-22 13:54:49

标签: c makefile gnu-make

我有一个makefile:

CFLAGS= -Wall -g

all: ex1.c 
    cc ex1.c -o ex1
    valgrind ./ex1
    cc ex2.c -o ex2
    valgrind ./ex2
    cc ex3.c -o ex3
    valgrind ./ex3

clean:
    rm -f ex1
    rm -f ex2
    rm -f ex3

有没有办法简化这个,所以我不必每个文件添加3行(我期待~50个文件)而是我可以只插入一个数字,它将运行该数量的文件的命令?所有文件都具有相同的命名方案/^ex\d{1,}\.c/,并且都在同一目录中。

感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

您不一定需要循环:

CFLAGS= -Wall -g

ALL_EX=ex1 ex2 ex3

all: $(ALL_EX)

ex%: ex%.c
    $(CC) $(CFLAGS) $@.c -o $@
    valgrind ./$@

clean: ; rm -f $(ALL_EX)

要添加其他测试,您只需要在exN变量中添加另一个ALL_EX

或者,从编译中分割valgrind调用:

CFLAGS= -Wall -g

ALL_EX=ex1 ex2 ex3
TEST_EX=$(ALL_EX:ex%=test_ex%)

all: $(TEST_EX)
cmp: $(ALL_EX)

ex%: ex%.c
    $(CC) $(CFLAGS) $@.c -o $@
test_ex%: ex%
    valgrind ./$<

clean: ; rm -f $(ALL_EX)

这样你也可以避免冗余重新编译ex*.c文件。最重要的是:通过这种方式,您可以使用make -j将编译和测试并行化。