![](/img/trans.png)
[英]Makefile Pattern rule: Circular makefile.o <- makefile dependency dropped
[英]Matched Pattern as argument to function in Makefile dependency
假設文件結構如下:
a/a1.cpp
a/a2.cpp
b/b1.cpp
b/b2.cpp
Makefile
我的目標是建立兩個目標文件ao和bo,其中ao取決於a1.cpp和a2.cpp,而bo取決於b1.cpp和b2.cpp。 但是,事實證明我無法在Makefile中對此進行命名。 這是我嘗試過的:
SOURCES := a/a1.cpp a/a2.cpp b/b1.cpp b/b2.cpp
TARGETS := a.o b.o
RELEVANT = $(filter $(1)/%.cpp,$(SOURCES))
$(TARGETS): %.o: $(call RELEVANT,%)
@echo $^
我本來希望在使用調用函數%時將其替換為a或b且RELEVANT返回所需的依賴關系。 但是,$ ^只返回一個空字符串,表明過濾器功能顯然沒有按預期工作。 基本上,此問題似乎是由在模式匹配規則之前評估函數引起的,如此處所述: Makefile,Regex和多個依賴項 。 但是,我仍然無法將那里提供的解決方案轉移到我的案件中。 此外,它看起來有點駭人聽聞,我希望找到一個不需要bash功能的更清晰的解決方案。
有誰能提出解決這個問題的辦法?
您可以通過多種方法來執行此操作。 如果您確實想使用先決條件列表中的功能來執行此操作,則可以使用輔助擴展:
.SECONDEXPANSION:
$(TARGETS): %.o: $$(call RELEVANT,%)
@echo $^
不過,我不太確定如何將多個.cpp
文件編譯為一個目標文件。
這是另一個:
all : ${TARGETS}
define RULE
${1}.o: $(2)
echo "$$(1) : $$@ : $$^"
endef
$(foreach tgt, $(TARGETS), $(eval $(call RULE, $(basename $(tgt)), $(filter $(basename $(tgt))/%.cpp, $(SOURCES)) )))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.