簡體   English   中英

對於Makefile變量中的每個目標

[英]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 其他部分描述了應如何使用適當的規則來構建app1app2等...)。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM