2012-11-28 18 views
5

Chcę przeczytać plik o nazwie metaplików wewnątrz pliku Makefile.Czytanie pliku wewnątrz pliku Makefile

metafile wygląda mniej więcej tak:
plik1
plik2
plik3

muszę przeczytać ten metapliku wewnątrz mojej linii makefile po linii i sprawdź, czy pliki wymienione wewnątrz istnieje, czy nie, a tylko nazwy druku plików, które istnieją.

Próbowałem kilku rzeczy bez powodzenia. na przykład:

FILE=`cat metafile` 
for line in $(FILE); if [ -e $${line} ]; then echo $${line} fi; done; 
+0

Czy próbujesz obu tych linii w recepturze? Każda linia jest wykonywana w oddzielnej podpowłoce. Możesz dołączyć do linii z następną linią, wstawiając '; \ na końcu. Ale pierwsza zmienna to "$$ {LINE}", a nie "$ (LINE)". – tripleee

Odpowiedz

11

Możesz umieścić dowolny arbitralny skrypt powłoki w celu. Utrzymywanie zawartości pliku w zmiennej Makefile nie ma dla mnie żadnego sensu, chyba że potrzebujesz danych z innych celów z innych powodów. (Jeśli tak, to nie można używać odwrócone, pojedyncze apostrofy, w każdym razie).

target: 
     @while read -r file; do \ 
      test -e "$$file" && echo "$$file"; \ 
     done <metafile 

Na co warto, pętla while jest bezpieczniejsze i bardziej idiomatycznych sposób do pętli na linii pliku w skrypcie powłoki niż pętli for z backticks , chociaż widzisz to bardzo często.

(The @ zapobiega Bądź z powtarzając skrypt poleceń; wziąć to, jeśli z jakiegoś powodu trzeba je zobaczyć.)

Bardziej idiomatyczne sposób to zrobić w Makefile jest mieć cel zależy na tych plikach i użyj własnej logiki:

target: file1 file2 file3 
     @echo $(filter-out $?,$^) 

To jest GNU Utwórz składnię; może być bardziej skomplikowany, jeśli chcesz być przenośny dla innych smaków Make (do punktu, w którym być może preferowany jest skrypt powłoki). Powoduje echo wszystkiego w jednym wierszu, ale jeśli potrzebujesz osobnych linii, powinno to być proste rozwiązanie.

Chciałbym po prostu zbudować mały fragment pomocniczego Makefile i obejmują zależności:

target: target.d 
target.d: metafile 
     sed 's/^/target: /' $< >[email protected] 
include target.d 

To buduje małą listę zależności, więc nie trzeba ich wymienić w target: zależności wyraźny sposób więc zamiast file1 file2 file3 w przepisie powyżej, Zależności byłoby żyć w wygenerowanym target.d które zawierają

target: file1 
target: file2 
target: file3 

Musisz odfiltrować zależność target.d (lub pozostawić na czarno; wierzę GNU make powinno radzić sobie).

+0

Dzięki za tak szczegółową odpowiedź. Próbuję pierwszej pętli, o której wspomniałeś, ale nie otrzymujesz niczego jako o/p. także drugi "plik $" powinien być "plikiem $$"? – hari

+0

Bez obaw, zadziałało. – hari