2015-04-28 41 views
1
CFormat: 

define Format_File := 
    @echo Formatting 
ifneq ("$(wildcard $(1))","") 
    @echo if1 

    # The default extensions for intermediate files are not used, 
    # to avoid collisions with backup files open in the editor, etc. 
    # Save the original source file with an '_X' suffix on the extension. 
ifneq("$(wildcard $(1)_X)","") 
    @echo if2 
else 
    @echo else2 
endif 
    @ren $(1) $(1)_X 
    # C-Comment is invoked separately, due to pathing limitations 
    # The redirection is a means to suppress blabbering. 
    @echo Formatting $(1) . . . 
    $(CFORMAT_PATH)\Cformat -h$(CFORMAT_PATH) $(1)_X -o$[Base, $(1)].tmp -ino >temp.tmp; 
    $(CFORMAT_PATH)\Ccomment -h$(CFORMAT_PATH) $[Base, $(1)].tmp -o$(1) >temp.tmp; 
else 
    @echo else1 
endif 
endef 


FormatAll: CFormat 
$(foreach loopFile,$(ALL_S_SOURCES),$(eval $(call Format_File,$(loopFile)))) 


.PHONY: FormatAll 

當我更換EVAL與信息它打印出來的函數調用正常,但每次我試圖真正EVAL它給我的錯誤在標題格式化之前開始。

編輯:這個問題到處都是語法錯誤,但遵循@MadScientist的建議,我最終能夠使用shell循環來工作。

+0

什麼是'ALL_S_SOURCES'?那個makefile還有什麼?什麼版本的make?有了這個確切的代碼片段,我並沒有發現幾個不同版本的make的錯誤。 (作爲旁邊是什麼'$ [Base,$(1)] .tmp'應該在你的配方行中執行?) –

+0

實際上,如果我使用文件名(存在)填寫'ALL_S_SOURCES',缺少分隔符錯誤。該定義看起來像它想要輸出配方行,但'$(eval)'不會產生任何輸出。同樣用':='賦值的定義會立即對它進行求值,**這意味着所有'$ 1'引用都將是空的。總之,這甚至不能按原樣工作。 –

+0

即使我用一個echo語句替換整個定義,我仍然不能讓它爲列表中的每個文件回顯一次。 – Dakota

回答

1

最簡單的回答是,你不能這樣做的。像​​這樣的單個函數或者單個可變擴展,可以從決不會將擴展爲makefile中的多個邏輯行。這只是解析器的工作方式。

此外,$(eval ...)可用於構建完整的規則,但不能用它構建規則的一部分:在make開始解析評估輸出之前,它將「關閉」當前存在的任何規則定義(就像不能在一個文件中引入規則並在另一個文件中放入配方並使用include來包含配方)。

你還沒有真正解釋爲什麼你想這樣做。一個簡單的答案是使用shell循環,不生成文件的循環,就像這樣:

FormatAll: CFormat 
     @for f in $(ALL_S_SOURCES); do \ 
      echo Formatting; \ 
      if [ -f $$f ]; then \ 
       echo if1; \ 
       if [ -f $${f}_X ]; then \ 
        echo if2; \ 
       else \ 
        echo else2; \ 
       fi; \ 
       ren $$f $${f}_X; \ 
       echo Formatting $$f . . .; \ 
       $(CFORMAT_PATH)\Cformat -h$(CFORMAT_PATH) $F{f}_X -o$[Base, $$f].tmp -ino >temp.tmp; \ 
       $(CFORMAT_PATH)\Ccomment -h$(CFORMAT_PATH) $[Base, $$f].tmp -o$$f >temp.tmp; \ 
      else \ 
       echo else1; \ 
      fi; \ 
     done 

我伊坦同意$[Base ...]語法怪異,肯定是不對的。

如果您想了解更多關於eval和調試的細節,您可以查看this post以及本系列中的較早版本。

0

錯誤消息非常明確:foreach循環在目標配方定義之前/之外吐出配方命令。

你可以嘗試這樣的:

all: 
    $(foreach loopFile,$(ALL_S_SOURCES),$(eval $(call Format_File,$(loopFile)))) 

.PHONY: all 
+0

我在底部添加了同樣的錯誤,我已經調整了上面的代碼以反映更改。 – Dakota