避免在makefile中重复行

时间:2019-06-30 05:04:16

标签: c makefile

我查看了许多不同的站点来尝试找到解决方案,但是我找不到任何我所理解的站点,其中没有包含我不熟悉的其他符号和术语。

我有一个makefile文件,其内容如下:

all: x1 x2 x3 x4...x(y)

x1: x1.o static1.o static2.o
    gcc -o x1 x1.o static1.o static2.o
x2: x2.o static1.o static2.o
    gcc -o x2 x2.o static1.o static2.o
...
x(y); x(y).o static1.o static2.o
    gcc -o x(y) x(y).o static1.o static2.o

x1.o: x1.c sample1.h sample2.h sample3.h
    gcc -c x1.c

x2.o: x2.c sample1.h sample2.h sample3.h
    gcc -c x2.c
...
x(y).o: x(y).c sample1.h sample2.h sample3.h
    gcc -c x(y).c

static1.o: sample1.c sample1.h sample2.h sample3.h
    gcc -c sample1.c sample2.h

static2.o: sample3.c sample3.h
    gcc -c sample3.c

clean:
    @rm -f *o x1 x2 x3... x(y)

y用作变量,而不是实际名称的一部分。

如何使用x%.o之类的东西将其简化为几行?

1 个答案:

答案 0 :(得分:2)

如果您使用的是GNU make,则可以使用static pattern rule。这样,您就可以在规则的目标中使用字符%,并且该规则适用于%被任何字符串替换的所有目标名称。如果%出现在依赖项中,则由相同的字符串替换。

x%: x%.o static1.o static2.o
    gcc -o $@ $*.o static1.o static2.o

x%.o: x%.c sample1.h sample2.h sample3.h
    gcc -c $*.c

此机制不允许您枚举all的所有目标。为此,您需要一些更复杂的操作:列出.c文件,并将相应的目标声明为all的依赖项。使用GNU make,您可以使用wildcard function来列出文件,然后使用basenameaddsuffixpatsubst之类的功能或其缩写形式来转换文件名

all: $(patsubst %.c,%,$(wildcard x*.c))

请注意,我假设x之后的部分可以是任意字符串,而不仅仅是某个范围内的整数。我认为用GNU make坚持一个整数是可行的,但这会困难得多。