В файле makefile, как использовать правила статического шаблона с именем файла, содержащим знак доллара?

#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,.,,,,