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).
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