2016-09-30 80 views
0

有沒有辦法使用自動變量來獲取目標名稱。Makefile中的過濾函數

SOURCES = $(wildcard *.c) 
dummytgt: $(OBJ)/tier.o 
$(GCC) $(CFLAGS) -c $(filter [email protected],$(SOURCES)).c -o [email protected] 

我不想提及的文件名作爲輸入,但將要使用的過濾功能,以獲得.c文件是相同的目標名稱。使引發錯誤沒有輸入文件

回答

0

這是有幫助的看看如何使解析這個:

SOURCES = $(wildcard *.c) 
dummytgt: $(OBJ)/tier.o 
    $(GCC) $(CFLAGS) -c $(filter [email protected],$(SOURCES)).c -o [email protected] 

首先, 它會讀取makefile文件,定義和擴展宏,因爲它去。

  • SOURCES = $(wildcard *.c)意味着${SOURCES}是與定義一個$(wildcard *.c)懶惰變量。 懶惰?是的,這些遞歸變量(因爲使手冊有它)只有當他們自己擴大時擴大其右手邊。
  • 使在讀取文件時需要相關性,因此$(OBJ)被展開。 讓我們假設${OBJ}的擴展是objs(說)。
  • shell命令塊保持爲單個惰性變量。 重要的是要注意這些是而不是擴展到使得決定它想要構建dmmytgt

你可以寫這完全一樣的效果:

dummytgt: objs/tier.o 
    $(GCC) $(CFLAGS) -c $(filter [email protected],$(wildcard *.c)).c -o [email protected] 

對該片段工作, 文件objs/tier.o必須已經存在。 讓我們假設它。

製作目前擁有它需要建立dummytgt(根據你的makefile), 所以現在它擴展命令塊。

  • $(wildcard *.c)擴大爲1.c 2.c(說)。
  • [email protected]dummytgt
  • $(filter dummytgt,1.c 2.c)當然是空的(並且總是會是!)
  • ${GCC}gcc(說)
  • ${CFLAGS}是空的(說)

因此,外殼變得

gcc -c .c -o dummytgt 

想必GCC抱怨說沒有叫.c文件。 由此產生的錯誤停止使的執行。

有些東西不喜歡在這裏: $(wildcard)僅適用於hacky單線程makefiles恕我直言。 dummytgt需要objs/tier.o,但其構建說明從未引用它。 你的$(filter)總是膨脹到無。