Избегание повторяющихся строк в make-файле - PullRequest
1 голос
/ 30 июня 2019

Я просмотрел множество разных сайтов, чтобы попытаться найти решение, но не смог найти ни одного, который, как я понял, не включал бы кучу других символов и терминов, с которыми я был незнаком.

У меня есть make-файл, который выглядит следующим образом:

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 Ответ

2 голосов
/ 30 июня 2019

Если вы используете GNU make, вы можете использовать статическое шаблонное правило . Это позволяет использовать символ % в качестве цели правила, и правило применяется ко всем именам целей, где % заменяется любой строкой символов. Если % появляется в зависимости, она заменяется той же самой строкой.

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 для вывода списка файлов, а затем таких функций, как basename и addsuffix или patsubst или его сокращенная форма для преобразования имен файлов.

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

Обратите внимание, что я предполагаю, что часть после x может быть произвольной строкой, а не просто целым числом в определенном диапазоне. Я думаю, что с GNU make можно настаивать на целом числе, но это будет намного сложнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...