[英]For each on target of Makefile variable
我有如下的makefile
apps = app1 app2 app3
all: dir app1 app2 app3 zip cleanup
現在,我想對可變的apps
列表進行一些循環,
就像是
`loop on apps
endloop`
是否可以在makefile中對其進行循環,我需要對apps
變量列表進行循環
更新
可以說這個變量( apps
)是由我的程序在make
文件中生成的,它為每個項目提供了不同的app值,有時其apps= app1 app2
有時其apps= app1
有時可以是20個或更多apps= app1 app2 appN
我如何迭代apps
變量並執行某些操作,例如在每次迭代中打印如下內容:
now im in `app1`
now im in `app2`
etc
嘗試以下時
.PHONY: foo
all: foo
APPS = app1 app2 app3 app4
foo : $(APPS)
for $$f in $(APPS); do echo $$f is here; done
我收到以下錯誤:
make: *** No rule to make target
app1',而foo'. Stop.
需要foo'. Stop.
foo'. Stop.
我看到您來回走了一點,所以讓我發表評論可能會或可能不會有幫助。
通常,您不會在make配方中編寫循環,因為make本身提供了“循環”。 因此,當您編寫如下規則時:
all: app1 app2 app3 app4
make將嘗試一次構建其中的每個先決條件。 因此,如果您希望有一個makefile可以為apps
變量中的每個條目回顯一行,則可以這樣操作:
all: $(apps)
$(apps):
@echo $@
這告訴make從all
目標開始,並嘗試“構建”其每個前提條件,這些前提條件是apps
變量中的值。
然后定義一個有關如何構建應用程序的規則,對於每個應用程序,您都說該規則是echo $@
,其中$@
是一個自動變量 ,可以擴展到當前正在構建的目標。
在make中,語法為:
foo bar biz:
some command
是寫的簡寫,並且等同於:
foo:
some command
bar:
some command
biz:
some command
編寫makefile時至關重要的是,您要考慮如何編寫規則以從零個或多個前提文件中創建一個文件(目標)。 然后,讓您擔心如何將所有這些先決條件連接在一起並正確訂購它們。
ETA如果要對$(apps)
變量中包含的一長串目標中的特定目標使用特殊規則,可以執行以下操作:
$(filter-out bar,$(apps)):
@echo print $@
bar:
some other command
也許您想要類似的東西(我假設Makefile
其他部分描述了應如何使用適當的規則來構建app1
和app2
等...)。
foo: app1 app2 app3 app4
for f in $^ ; do echo $$f is here ; done
或(稍微好一點)
APPS = app1 app2 app3 app4
foo : $(APPS)
for f in $(APPS); do echo $$f is here; done
並且您可能對make中的foreach
函數 (或它的eval
函數 ,也許與其他函數混合)感興趣
最后,您的makefile(或其中包含的某些部分)可以由某些(shell,AWK,Python等)腳本(或什至是其他用C ++,Java,Ocaml編碼的程序)生成。
我建議使用remake作為remake -x
來調試您的Makefile
您也可以生成一些子submakefile
並在某些配方中運行$(MAKE) -f submakefile
。
我強烈建議您花至少一個小時完全閱讀GNU的make文件編碼在你的東西之前Makefile
。 而且您可能還需要閱讀bash
的文檔 。
最后,您可能會考慮使用其他一些構建自動化工具,例如ninja
(其原理有所不同 :應該會生成 build.ninja
文件,並且您必須為其提供生成器)
對於您的下一個問題,請提供一些MCVE
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.