2012-11-28 8 views
5

Bir makefile içinde meta dosyası adlı bir dosyayı okumak istiyorum.Makefile içinde bir dosya okuma

meta dosyası şuna benzer:
dosya1
file2
dosya3
Ben çizgi ile benim makefile çizgisi içinde bu meta okumak ve içine sözü dosyalar var veya yok ve sadece baskı adları olmadığını kontrol etmek gerekir

Varolan dosyaların

Birkaç şey denemeden başarılı oldum. benzer:

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

Bu satırların ikisini de bir tarifte mi deniyorsunuz? Her satır ayrı bir alt kabukta yürütülür. Bir sonraki satıra bir satır ekleyerek '; sonunda. Ama sonra ilk değişken '$$ {LINE}' 'değil (LINE)' olacaktır. – tripleee

cevap

11

Bir hedefe rastgele bir kabuk komut dosyası yerleştirebilirsiniz. Dosyanın içeriğini bir Makefile değişkeninde tutmak, başka nedenlerden dolayı başka hedeflere de ihtiyacınız olmadıkça, benim için hiçbir anlam ifade etmemektedir. (Eğer öyleyse, zaten komutu ters tırnak kullanamaz.)

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

bu değer ne için, while döngü ters tırnakların ile for döngü daha bir kabuk komut dosyası içinde bir dosyanın hattı üzerinden döngü için daha güvenli ve daha deyimsel yoludur Bunu çok görseniz bile.

bir Makefiledaki Bunu yapmanın daha deyimsel yolu bir hedef bağlıdır sahip olmaktır;

(nedense onları görmek gerekiyorsa getirir misin @ komutları shell script yankılandırmasını olun engeller.) Bu dosyalar üzerinde ve Make'in kendi mantığını kullanın: Bu, GNU Make sözdizimidir; Diğer Make flavour'lara (eğer kabuk betiğinin hepsinden önce tercih edilebileceği noktaya) taşınabilir olmak istiyorsanız daha karmaşık olabilir. Her şey bir satırda yankılanacak, ama ayrı çizgilere ihtiyacınız varsa, bu önemsiz bir düzeltme olmalı. Ben sadece küçük bir yardımcı Makefile pasajını inşa etmek ve olurdu

bağımlılıkları şunlardır: Bu açıkça target: bağımlılıkları listeleyebilirsiniz gerek kalmaz bağımlılıkları küçük listesini oluşturur

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

; böylece yerine file1 file2 file3 yukarıdaki tarifte, bağımlılıklar Sen target.d bağımlılığını filtrelemek için gereken

target: file1 
target: file2 
target: file3 

içerecektir hangi oluşturulan target.d yaşayan (ya da bildirilmeyen bırakın, ben GNU başa gerektiğini olun inanmak) olacaktır.

+0

Bu tür ayrıntılı yanıt için teşekkürler. Bahsettiğin ilk zaman döngüsünü deniyorum ama o/p olarak bir şey elde etmiyorum. Ayrıca ikinci "$ dosya" "$$ dosya" olmalıdır? – hari

+0

Endişelenme, işe yaradı. – hari