2010-09-02 2 views
0

, кажется, что делают не разрешает символ подстановки% перед вызовом функции оболочки, в случаях, как это одна:решительность Makefile подстановочные% внутри функции оболочки

%.exe: $(shell cat %.txt) 
    gcc $? -o [email protected] 

если я печатаю это на раковине:

$ make test.exe 

shell жалуется, что не может найти «% .txt», но я ожидал, что он найдет «test.txt».

есть ли способ обхода?

спасибо!

+0

Вы можете уточнить на то, что вы пытаетесь достичь с помощью этого правила? – maxschlepzig

+0

для каждого исполняемого файла X есть файл X.txt, в котором перечислены все его исходные зависимости. Я хочу, чтобы «make» помещал содержимое этого файла в целевые зависимости. – cd1

+0

Расширение $ (shell ...) происходит очень рано; ваша ошибка происходит до того, как даже начнется поиск целей. Пожалуйста, прочитайте главу «вторичное расширение» в документации GNU Make, как указано ниже. – MarcH

ответ

0

Я думаю, что вы пытаетесь сделать это:

.SUFFIXES: .exe .txt 
.txt.exe: 
     gcc $? -o [email protected] 
+0

Нет, это не так. В файле .txt указаны все зависимости .exe-файла. –

+0

Ах! В этом случае он должен помещать зависимости в Makefile, а не в файл .txt. –

2

Сделать foo.txt содержат зависимости для foo.exe в Makefile формате:

foo.exe: foo.o bar.o baz.o 

затем использовать include строку в вашем Makefile:

include foo.txt 

Наконец, обновить шаблонное правило:

%.exe: 
    gcc -o [email protected] $^ 
+0

Честно говоря, я бы просто использовал генератор, как 'automake'. Это экономит много этих головных болей, и результат переносится. –

+1

Генераторы создают нечитаемый код. GNU Make - портативный. – MarcH

+1

Переносной по какой метрике? Выход 'automake' работает практически через любой POSIX' make'. –

0

Ну, обычный способ загрузки (динамически) зависимости от внешнего файла использовать включают. То есть вы можете исправить свой пример, вы можете просто добавить адресат во время генерации файла% .txt. В Makefile вы можете написать то что-то вроде этого:

DEPS = $(OBJS:.o=.txt) 

-include $(DEPS) 

BTW, то, как правило, используется суффикс для этих файлов зависимостей% .d.

Следующие web site shows an intelligent approach to integrate the dependency generation in your Makefile. I.e. файлы зависимостей затем генерируются и обновляются по мере необходимости. Не нужно делать шаг «make deps» или что-то в этом роде.

3

Вы можете использовать вторичную функцию расширения GNU сделать:

$ cat Makefile 
all : x.exe 
.PHONY: all 
.SECONDEXPANSION: 
%.exe: $$(shell cat $$(basename $$(@F)).txt) 
    @echo "[email protected] depends on $^" 

$ cat x.txt 
a 
b 
c 

$ touch a b c 

$ make 
x.exe depends on a b c 
Смежные вопросы