12 Mart 2019 Salı

makefile ve wildcard

Örnek
Elimizde şöyle bir kod olsun.
%.foo: %.bar
    cp $< $@

test: *.foo
    echo *.foo
Uzantısı *.foo veya *.bar olan dosyaları bul ve komutu çalıştır anlamına gelir. $< ile bulunan dosyalar temsil edilir. $@ ile target temsil edilir. Çıktı olarak şunu alırız. Ancak bu istediğimiz şey değildir. Amacımız b.bar dosyasını b.foo haline getirmek.
cp b.bar *.foo
echo *.foo
*.foo
Açıklaması şöyle.
There is no *.foo file to begin with. So what make does is look for how to make *.foo literaly and the first rule does this. Make expands $< to the first pre-requisite (*.bar, which happens to be b.bar in this case). Make then runs the shell command cp b.bar *.foo. Since there is no *.foo, shell expands it to cp b.bar *.foo literally. That's how you get a *.foo file.
Şöyle yaparız. wildcard ile b.bar dosyası bulunur. pathsubst ile b.foo haline getirilir.
%.foo: %.bar
    cp $< $@

foos = $(patsubst %.bar,%.foo,$(wildcard *.bar))

test: $(foos)
    echo $(foos)
Açıklaması şöyle.
$(wildcard *.bar) expands to all the files ending in .bar, the patsubst call replaces .bar with .foo, and all the targets are then processed as you’d expect.

Hiç yorum yok:

Yorum Gönder