В чем разница между обязательным условием Makefile в процентах и ​​звездочкой (звездочкой)

Два вызова здесь:

  • -Pподдерживает только один шаблон
  • каждая строка в вашем файле должна быть полным шаблоном, а не только самим текстом

Таким образом, если вы установите greplist.txtна

.\.var$
.\.foo$
.\.varfoo$

и просто беги

grep -vi -f greplist.txt myfile.txt > newfile.txt

Вы должны получить то, что ищете.

1
11.04.2020, 10:14
1 ответ

В makeзнак процента используется для сопоставления с шаблоном, и для этого требуется один в цели, а также (по крайней мере )один в предварительных требованиях:

%.o: %.c
        $(CC) $(CFLAGS) -c -o $@ $<

В этом make-файле мы указываем, что для создания чего-то, имя файла которого заканчивается на .o, вам нужен файл с таким же префиксом, но затем заканчивающийся на .c, а не на .o

.

Чтобы иметь возможность создавать эти правила, вы, очевидно, должны иметь возможность ссылаться на цель, а также на предпосылки; здесь появляются переменные $@и $<. $@означает «цель этого правила», а $<означает «первое указанное предварительное условие этого правила». Если вам нужно создать команду, которая использует все предварительные условия (, например, для связывания исполняемого файла ), вы можете использовать переменную$^:

%: %.o lib.o
        $(CC) $(LDFLAGS) -o $@ $^

Если вы скомбинируете приведенные выше два примера фрагментов make-файла в один make-файл, и у вас есть файл 'lib.c' с некоторым общим кодом, который вы хотите использовать в нескольких программах на C в том же каталоге, вы можете добавить любой случайный .cфайл, скажем foo.c, и скомпилируйте его в программу foo, которая также ссылается на код в lib.c, не требуя каких-либо изменений в вашем make-файле.

Обратите внимание, что также возможно иметь шаблоны с одной и той же целью, если предпосылки различаются; например, следующее будет работать:

%.o: %.c
        $(CC).....
%.o: %.cpp
        $(CXX).....

, то есть он будет работать так, как ожидалось, если в этом каталоге нет исходных файлов C++, которые имеют то же имя (без расширения ), что и исходный файл C. Если это действительно так,версия C++ будет проигнорирована, и вместо нее будет скомпилирован исходный код C (, поскольку правило C указано первым в make-файле)

Для получения дополнительной информации см. соответствующий раздел в руководстве GNU make.

1
19.03.2021, 02:30

Теги

Похожие вопросы