我不知道有什麼方法可以在GNU Make中定義編程目標。這怎麼可能?如何以編程方式在GNU Make中定義目標?
有時候可以走開with alternate methods。然而,在Makefiles中定義編程目標的能力對編寫和組織複雜的生產規則非常重要,其中make
。的複雜的生產規則的例子是在FreeBSD中的構建系統或在生成文件庫如BSD Owl
殼腳本和Makefiles之間的main differences發現是:
在生成文件時,程序的狀態是由命令行和文件系統給出,因此可以在作業中斷後重新開始工作。當然,這需要正確編寫Makefiles,但即使這很困難,也比使用shell腳本實現類似效果要容易得多。
在Makefile中,用建議來裝飾過程或使用鉤子來裝飾過程是很荒唐的,而在shell腳本中這實際上是不可能的。
例如,一個非常簡單的和有用的模式如下:
build: pre-build
build: do-build
build: post-build
這呈現的build
目標作爲三個目標包含實際指令do-build
和兩個其它,它們是複合材料,一個掛鉤,在do-build
之前和之後執行。此模式是由爲BSD作,這亦允許的目標編程定義寫入許多構建系統使用的,這樣一方面可以在分批寫:
.for _target in configure build test install
.if !target(${_target})
${_target}: pre-${_target}
${_target}: do-${_target}
${_target}: post-${_target}
.endif
.endfor
由.if/.endif
塊引入的條件使用戶能夠使用其自己定義任何${_target}
。
那個GNU Make片段的翻譯是什麼?
需要注意的是,在GNU中,你不需要**在目標先決條件之間得到一個有序保證(儘管沒有'-j'我認爲假設你通常是安全的),所以你的「鉤子「不一定做你想做的事。 – 2015-03-02 16:53:59
@EtanReisner當然,但這與問題沒有直接關係,我忽略了這一點,以保持簡單。例如,在BSD Make中,有人說''。ORDER:預編譯do-build post-build'來執行所提及目標的串行處理。 – 2015-03-02 16:55:41
使用或不使用'-j',make將始終以相同的順序走先決條件列表。只是''j''''''''''''''''''''''''''''''''''''''''''''''''''''不會等待以前的(非相關的)先決條件完成,然後再開始新的先決條件沒有'-j' make _does_保證按順序構建。 – MadScientist 2015-03-02 16:57:18