2013-05-27 161 views
1

我試圖寫一個makefile,做類似以下內容:任意莖,然後-foo-,然後一個整數,然後.out多個莖的makefile規則

%-foo-(k).out : %-foo-(k-1).out 
    # do something, e.g. 
    cat $< [email protected] 

即有文件。每個文件都依賴於具有相同名稱的文件,其中整數較小。

例如,如果該文件blah/bleh-foo-1.out存在,那麼

make blah/bleh-foo-2.out 

會工作。

如果有這樣的事情,我可以用多個詞幹來做到這一點......在(gnu)make中做這種事情的另一種方式是什麼?

回答

2

有沒有簡單的方法來做這樣的事情。你基本上有兩種選擇:你可以使用自動生成的makefile,或者你可以使用$(eval ...)。對我來說,自動生成的makefiles更容易,所以這裏有一個解決方案:

SOURCELIST = blah/bleh-foo-1.out 

all: 

-include generated.mk 

generated.mk: Makefile 
     for f in $(SOURCELIST); do \ 
      n=`echo "$$f" | sed -n 's/.*-\([0-9]*\)\.out$/\1/p'`; \ 
      echo "$${f%-foo-[0-9]*.out}-foo-`expr $$n + 1`.out: $$f ; cat $$< > [email protected]"; \ 
     done > [email protected] 
+1

這並不算太壞。不過,它確實讓我覺得我應該使用比製作更靈活的東西。 – petrelharp

+2

它可能是。我會很感興趣的是,如果你發現了足夠靈活的東西來允許你定義任何不需要針對每個目標/先決條件明確聲明的任意「模式」規則,特別是當變化涉及數學表達式如「x- 1「(如果你願意明確地列出它們,那麼你可以做得非常平凡:這只是一個單一的通用規則能夠建立所有目標/先決條件組合,這使得它很棘手)的要求。 – MadScientist