我查看了许多不同的站点来尝试找到解决方案,但是我找不到任何我所理解的站点,其中没有包含我不熟悉的其他符号和术语。
我有一个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
之类的东西将其简化为几行?
答案 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来列出文件,然后使用basename
和addsuffix
或patsubst
之类的功能或其缩写形式来转换文件名
all: $(patsubst %.c,%,$(wildcard x*.c))
请注意,我假设x
之后的部分可以是任意字符串,而不仅仅是某个范围内的整数。我认为用GNU make坚持一个整数是可行的,但这会困难得多。