Присвоить значение переменной makefile для результата команды bash?

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

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

Проблема заключается в том, что если я печатаю HEADER в своем make файле, используя:

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 в моем файле makefile.

Любые идеи?

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

HEADERS=$(wildcard *.h)