GNU make'de birden çok uzantıya sahip bir listedeki her dosyanın uzantısını nasıl değiştirebilirim?


84

Bir GNU makefile dosyasında, bir dosya listesi girişi ile yeni uzantılarla bir dosya listesi çıktısı oluşturmanın mümkün olup olmadığını merak ediyorum.

Girişte bu listeyi alıyorum:

FILES_IN=file1.doc file2.xls

Ve bu değişkeni makefile dosyamda FILES_IN değişkeninden oluşturmak istiyorum :

FILES_OUT=file1.docx file2.xlsx

Mümkün mü ? Nasıl ?

Bu oldukça zor, çünkü dosya listesini ayrıştırmam ve her uzantıyı (.doc, .xls) doğru uzantıyı değiştirmek için algılamalıyım.

Yanıtlar:


141

Boşluklarla ayrılmış dosya adlarından oluşan bir listedeki uzantıların değiştirilmesi yaygın bir gerekliliktir ve bunun için yerleşik özellikler vardır. xListedeki her ismin sonuna bir eklemek isterseniz :

FILES_OUT = $(FILES_IN:=x)

Genel biçim $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX). Bu, bu son ek ile biten her sözcüğün sonundaki değerini alır VARIABLEve değiştirir (eşleşmeyen sözcükler değiştirilmeden bırakılır). GNU bu özelliği (her make uygulamasında mevcut olan) ikame referanslarını çağırır .OLD_SUFFIXNEW_SUFFIX

Sadece değişim istiyorsanız .dociçine .docxve .xlsiçine .xlsxbu özelliği kullanarak, bir ara değişkeni kullanmak gerekir.

FILES_OUT_1 = $(FILES_IN:.doc=.docx)
FILES_OUT = $(FILES_OUT_1:.xls=.xlsx)

Biraz daha genel sözdizimini de kullanabilirsiniz $(VARIABLE:OLD_PREFIX%OLD_SUFFIX=NEW_PREFIX%NEW_SUFFIX). Bu özellik GNU yapımına özgü değildir, ancak basit sonek değiştirme ikamesi kadar taşınabilir değildir.

Aynı satırda birden çok ikameyi zincirlemenize izin veren bir GNU make özelliği de vardır: patsubstişlev .

FILES_OUT = $(patsubst %.xls,%.xlsx,$(patsubst %.doc,%.docx,$(FILES_IN)))

3
Ya FILES_OUT := $(patsubst %,%x,$(FILES_IN))da kural gerçekten o kadar genel yapılabilirse.
üçlü

Bu operatörün adı nedir? Kılavuzları kontrol etmek istiyorum, ancak doğru adı bulamıyorum.
rph

1
@rkioji Ne operatörü? GNU make el kitabına bir bağlantı veriyorum, $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX)başka ne için kastediyorsunuz?
Gilles 'SO- kötü olmayı bırak'

@Gilles oh evet, bağlantıyı görmedim. "İkame" ye atıfta bulundum. Teşekkürler!
rph
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.