Makefile'a komut satırından argüman nasıl iletilir?


109

Makefile'a komut satırından argüman nasıl iletilir?

Yapabileceğimi anlıyorum

$ make action VAR="value"
$ value

ile Makefile

VAR = "default"
action:
    @echo $(VAR)

Aşağıdaki davranışı nasıl edinirim?

$ make action value
value

?

Ne dersin

$make action value1 value2
value1 value2


Yanıtlar:


212

Muhtemelen bunu yapmamalısın; Make'in nasıl çalıştığına dair temel kalıbı bozuyorsunuz. Ama işte burada:

action:
        @echo action $(filter-out $@,$(MAKECMDGOALS))

%:      # thanks to chakrit
    @:    # thanks to William Pursell

EDIT:
İlk komutu açıklamak için,

$(MAKECMDGOALS) komut satırında yazılı "hedefler" listesidir, örneğin "işlem değeri1 değer2".

$@Bir olan otomatik değişken bu durumda "eylem" in kural hedefin adı için.

filter-outbir listeden bazı öğeleri kaldıran bir işlevdir. Yani $(filter-out bar, foo bar baz)dönüşler foo baz(daha incelikli olabilir, ancak burada inceliğe ihtiyacımız yok).

Bunları bir araya getirin ve $(filter-out $@,$(MAKECMDGOALS))"eylem" dışında komut satırında belirtilen hedeflerin listesini döndürür, bu "değer1 değer2" olabilir.


1
$(shell echo $(MAKECMDGOALS) | sed 's!^.* $@ !!')daha önce tüm hedefleri atlayın ve aşağıdakileri argüman olarak değerlendirin:make target1 target2 action value1 value2
Evgeniy Generalov

1
Cehaletimi bağışlayın. Google'da arama yapmayı denedim %:ve @:bu "direktiflerin" (veya adı ne olursa olsun) ne yaptıkları hakkında bilgi bulamıyorum. Lütfen açıklar mısın?
Jon

15
@Jon: Kılavuz burada . Bölüm oluşan %:ve @:bir olduğunu kuralı . Hedef adı %, herhangi bir şeyle eşleşen bir kural olduğu anlamına gelir ; yani, Make yapmasını söylediğiniz şeyi inşa etmenin başka bir yolunu bulamazsa, o kuralı uygulayacaktır. @:A, tarifi ; :araçlar hiçbir şey ve @araçlar sessizce bunu.
Beta

Teşekkürler. O kılavuzu okudum ve ilk başta, bu %:aslında % :joker türü bir hedef adı olduğunu düşünmedim . Ben ilişkin bu kılavuz içinde bir şey görmüyorum @:bir "hiçbir şey yapmama" kuralı sadece bir olurdu düşündürmektedir olsa ... ;Hedef şartname sonra, yani, bu yazma daha doğru olmaz % : ;"do joker olarak - hiçbir şey "kuralı?
Jon

1
filter-outeylem, komut satırında belirtilen hedefin bağımlılığı olduğunda $@çalışmaz , çünkü komut satırında çağrılan orijinal argümana değil, bağımlılığın adına ayarlanacaktır. Bunun yerine, MAKECMDGOALSbir kabuk dizisine @ args=($(MAKECMDGOALS)); args=("$${args[@]:1}")
atarım

18

@ Beta’ya dayalı genel bir çalışma çözümü

SHELL=/bin/bashMakefile'ımın üstünde GNU Make 4.1 kullanıyorum , yani YMMV!

Bu, fazladan argümanları kabul etmemize olanak tanır (eşleşmeyen bir iş aldığımızda hata atmak yerine hiçbir şey yapmayarak).

%:
    @:

Ve bu bizim için bağımsız değişkenleri alan bir makro:

args = `arg="$(filter-out $@,$(MAKECMDGOALS))" && echo $${arg:-${1}}`

İşte buna diyebilecek bir iş:

test:
    @echo $(call args,defaultstring)

Sonuç şöyle olacaktır:

$ make test
defaultstring
$ make test hi
hi

Not! Sadece Maketools'un nüansları olmadan yapmak için benzer şekilde çalışan bir bash kalıbı olan bir "Taskfile" kullanmanız daha iyi olabilir. Bkz. Https://github.com/adriancooney/Taskfile


İşe yaradı!! Bunu deneyen diğer insanlar için daha tabönce olduğundan emin olun @echo, değil space.
Abdullah Al Maruf - Tuhin

11

Yaklaşım çok daha kolay. Bir görev düşünün:

provision:
        ansible-playbook -vvvv \
        -i .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory \
        --private-key=.vagrant/machines/default/virtualbox/private_key \
        --start-at-task="$(AT)" \
        -u vagrant playbook.yml

Şimdi onu aramak istediğimde şöyle bir şey çalıştırıyorum:

AT="build assets" make provision

ya da sadece:

make provisionbu durumda ATboş bir dizedir


-2

bunu yapmaya çalışma

$ make action value1 value2

bunun yerine komut dosyası oluşturun:

#! /bin/sh
# rebuild if necessary
make
# do action with arguments
action "$@"

ve şunu yapın:

$ ./buildthenaction.sh value1 value2

daha fazla açıklama için neden bu ve makefile korsanlığı uyarıları çok benzer ancak görünüşte yinelenmeyen başka bir soruya cevabımı okur: "Çalıştırmak" için argümanlar iletmek

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.