#shell #makefile #gnu-make
Вопрос:
У меня есть файлы .c, которые необходимо скомпилировать, например:
$main.c $print.c ...
Они были сгенерированы другой программой. Я хотел бы написать файл makefile, который будет компилировать их отдельно, чтобы я мог это сделать -j 8
.
Мой план состоял в том, чтобы использовать правила статического шаблона, такие как следующие:
SRCS = $(wildcard ./*.c) OBJS = $(patsubst %.c,%.o,$(U_SRC)) $(OBJS):%.o:%.c gcc $(CFLAGS) -c $lt; -o $@
Однако из-за знака доллара имена файлов не могут быть правильно распознаны. Я попытался заменить знак доллара двойным знаком доллара, но все равно не работает.
Как я могу это сделать и упростить компиляцию?
Комментарии:
1. Тьфу, мне тебя жаль. Make настолько плохо приспособлен для обработки странных имен файлов.
2. Есть ли какая-нибудь возможность переименовать файлы и удалить знаки доллара?
3. @johnkugelman я могу использовать
rename
для этого ….. Но это нарушит сценарий, каждый раз перед компиляцией мне нужно их переименовывать4. @johnkugelman на самом деле, подкаталог также создается случайным образом, поэтому каждый раз мне нужно будет повторно оценивать его с помощью регулярного выражения. Есть ли способ, которым я могу заменить » $ «на»$$»?? так что makefile распознает его как знак доллара
5. Make на самом деле подходит почти для всех странных имен файлов: проблематичны только имена, содержащие пробелы. В частности, приведенный выше файл makefile никоим образом не является проблемой для make . Однако помните, что все рецепты на самом деле выполняются в оболочке , и в оболочке есть множество правил, касающихся специальных имен файлов. Если вы хотите использовать их в своем рецепте, вы должны удалить их из оболочки , а не из изготовления.
Ответ №1:
Все в порядке……..
Вот успешный эксперимент в моем окружении:
C_TMP = $(wildcard *.c) C_OBJ = $(patsubst %.c,%.o,$(C_TMP)) $(C_OBJ):%.o:%.c gcc -g -c $lt; -o $@ test: $(C_OBJ) @echo $(C_OBJ)
И в результате получается
[shore@shore-82b6 exam]$ make test gcc -g -c $main.c -o $main.o gcc -g -c $print.c -o $print.o .o .o
Комментарии:
1. Как я уже упоминал выше: вы можете видеть, что на самом деле в вашем файле makefile нет ничего особенного, что вам нужно сделать, чтобы разрешить имена, содержащие
$
возвращенные изwildcard
. Однако, чтобы использовать эти странные имена, вы должны удалить их из оболочки , потому что оболочка рассматривает$
их как особые. ИМО приведенное выше решение не является отличным. Это работает только в том случае, если первый символ имени файла нуждается в специальной обработке. Вместо этого вы должны использовать одинарные кавычки:gcc -g -c '$lt;' -o '$@'
. Это обрабатывает все специальные символы в любом месте имени файла, кроме самих одинарных кавычек (это выполнимо, но сложнее).2. @madscientist Я столкнулся с новой проблемой, содержащей » % » в имени файла T T,.,,,,