簡體   English   中英

匹配模式作為Makefile依賴項中函數的參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM