2010-03-03 2 views
33

Я пытаюсь назначить вывод этой команды (то есть в моем Makefile) в Makefile HEADER вар, как в этой следующей строке кода:Присвоить значение переменной makefile команде bash?

HEADER = $(shell for file in `find . -name *.h`;do echo $file; done) 

Проблема заключается в том, что если я печатаю ЗАГОЛОВКА в моем Makefile с помощью:

print: 
    @echo $(HEADER) 

Я получаю

ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile 

и если я запускаю эту команду непосредственно в консоли, и непосредственно там, где мой Makefile является:

myaccount$ for file in `find . -name *.h`;do echo $file; done 
./engine/helper/crypto/tomcrypt/headers/._tomcrypt_pk.h 
./engine/helper/crypto/tomcrypt/headers/tomcrypt.h 
./engine/helper/crypto/tomcrypt/headers/tomcrypt_argchk.h 
./engine/helper/crypto/tomcrypt/headers/tomcrypt_cfg.h 
./engine/helper/crypto/tomcrypt/headers/tomcrypt_cipher.h 
./engine/helper/crypto/tomcrypt/headers/tomcrypt_custom.h 
./engine/helper/crypto/tomcrypt/headers/tomcrypt_hash.h 
./engine/helper/crypto/tomcrypt/headers/tomcrypt_mac.h 
.... 

Таким образом, я получаю все файлы заголовков. Я делаю это, чтобы вручную не указывать все мои файлы .h в моем make-файле.

Любые идеи?

ответ

61

Вам нужно будет дважды избежать $ персонажа в команде оболочки:

HEADER = $(shell for file in `find . -name *.h`;do echo $$file; done) 

Проблема здесь заключается в том, что марка будет пытаться расширить $f в качестве переменной, и так как он не находит ничего, он просто заменяет его на "". Это оставляет команду оболочки только с echo ile, что верно.

Добавление $$ сообщает make разместить в этой позиции один $, в результате чего команда оболочки выглядит точно так, как вы этого хотите.

+0

Очень хороший ответ :), я делаю это так, потому что в моем цикле for я фактически выполняю более сложные вещи, поэтому я просто разместил здесь небольшой фрагмент. Большое спасибо @ e.James. – Goles

14

Почему бы не просто сделать

HEADER = $(shell find . -name '*.h') 
4

makefile tutorial предложил использовать wildcard, чтобы получить список файлов в каталоге. В вашем случае это означает:

HEADERS=$(wildcard *.h) 
+2

Это не похоже на код в вопросе. Подстановка подстановочного знака происходит во время анализа файла Makefile, тогда как, например, команды оболочки могут выполняться только после выполнения правила Makefile. Это имеет значение при тестировании на наличие файлов, сгенерированных Makefile. –

Смежные вопросы