Przypisać wartość zmiennej makefile do wyniku polecenia bash?

Próbuję przypisać wyjście tego polecenia (które znajduje się w moim pliku makefile ) do nagłówka pliku MAKEFILE, jak w poniższej linii kodu:

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

Problem polega na tym, że jeśli wydrukuję nagłówek w moim pliku makefile używając:

print:
    @echo $(HEADER)

I get

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

A jeśli uruchomię to polecenie bezpośrednio w konsoli i bezpośrednio tam gdzie jest mój plik 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
....

Więc dostaję wszystkie moje pliki nagłówkowe. Robię to, aby uniknąć ręcznego określania wszystkich moich .pliki h ręcznie w moim makefile.

Jakieś pomysły ?
Author: Goles, 2010-03-03

3 answers

Będziesz musiał dwukrotnie uciec znak $ w Komendzie powłoki:

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

Problem polega na tym, że make spróbuje rozwinąć $f jako zmienną, a ponieważ nic nie znajduje, po prostu zastępuje ją przez"". To pozostawia twoje polecenie powłoki z niczym innym jak echo ile, co wiernie robi.

Dodanie $$ mówi make, aby umieścić pojedynczy $ w tej pozycji, co powoduje, że polecenie powłoki wygląda dokładnie tak, jak chcesz.

 65
Author: e.James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-03 16:53:17

Why not simply do

HEADER = $(shell find . -name '*.h')
 14
Author: Sorpigal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-03 16:53:14

Makefile tutorial zasugerował użycie wildcard, Aby uzyskać listę plików w katalogu. W Twoim przypadku oznacza to:

HEADERS=$(wildcard *.h)
 6
Author: BЈовић,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-02 20:47:16