簡體   English   中英

如何將make變量設置為目標相關值?

[英]How can I set a make variable to a target dependent value?

如果這是一個愚蠢的問題,我不是專業專家,我很抱歉。 我想將make變量設置為目標的一部分,因此在target1中,其值為-DPARENT,而在target2 -DCHILD中。 當檢查這些目標的依賴項時,我有一些通用規則要遵守,我需要將那些定義集適當地傳遞給gcc。

這就是我想要做的:

$(OBJ)/%.o: $(XML)/%.c
    $(CC) $(CFLAGS) $(XML_BUILD_TYPE) -c -o $@  $<

$(PROD)/Parent: \
        somehow set XML_BUILD_TYPE = -DPARENT here \
        $(XML)/Xml.h \
        $(TOOLS_OBJS) \
        $(XML_PARENT_OBJECTS) \
        $(XML_INPUTS)
    $(CC) -o $@ $(TOOLS_OBJS) $(XML_PARENT_OBJECTS) -rdynamic $(JSON_LIB) $(CURL_LIB) $(LIBS) -lssl -lidn

$(PROD)/Child: \
        somehow set XML_BUILD_TYPE = -DCHILD here \
        $(XML)/Xmlr.h \
        $(TOOLS_OBJS) \
        $(XML_CHILD_OBJECTS) \
    $(CC) $(CFLAGS) -c -o $(OBJ)/LinkDate.o  $(TOOLS)/LinkDate.c
    $(CC) -o $@ $(TOOLS_OBJS) $(XML_CHILD_OBJECTS) -rdynamic $(OBJ)/LinkDate.o $(JSON_LIB) $(CURL_LIB) $(LIBS) -lssl -lidn

我試過$(eval XML_BUILD_TYPE := -DCHILD)只是發現make在讀取makefile時會評估所有eval,從而導致總是設置最后一個。 我相信一定有可能這樣做,但是如果我知道如何做的話會很震驚。

任何幫助表示贊賞!

您只需將變量放在make目標之前:

$(PROD)/Parent: XML_BUILD_TYPE = -DPARENT
$(PROD)/Parent: \
        $(XML)/Xml.h \
        $(TOOLS_OBJS) \
        $(XML_PARENT_OBJECTS) \
        $(XML_INPUTS)
    $(CC) -o $@ $(TOOLS_OBJS) $(XML_PARENT_OBJECTS) -rdynamic $(JSON_LIB) $(CURL_LIB) $(LIBS) -lssl -lidn

$(PROD)/Child: XML_BUILD_TYPE = -DCHILD
$(PROD)/Child: \
        $(XML)/Xmlr.h \
        $(TOOLS_OBJS) \
        $(XML_CHILD_OBJECTS) \
    $(CC) $(CFLAGS) -c -o $(OBJ)/LinkDate.o  $(TOOLS)/LinkDate.c
    $(CC) -o $@ $(TOOLS_OBJS) $(XML_CHILD_OBJECTS) -rdynamic $(OBJ)/LinkDate.o $(JSON_LIB) $(CURL_LIB) $(LIBS) -lssl -lidn

您可以根據需要擁有任意數量的:

$(PROD)/Parent: XML_BUILD_TYPE = -DPARENT
$(PROD)/Parent: ANOTHERVAR = -DSOMETHING
$(PROD)/Parent: $(XML)/Xml.h $(TOOLS_OBJS) $(XML_PARENT_OBJECTS) $(XML_INPUTS)
    $(CC) -o $@ $(TOOLS_OBJS) $(XML_PARENT_OBJECTS) -rdynamic $(JSON_LIB) $(CURL_LIB) $(LIBS) -lssl -lidn

我可能不知道有一個好的方法,但是直到有人發布它為止……這就是我之前解決此類問題的方式。

$(PROD)/Parent:
        make XML_BUILD_TYPE=-DPARENT Parent_Build

Parent_Build:
        # put in build steps for the parent; $(XML_BUILD_TYPE) is already set

對於這種策略,您永遠不會自己從命令行調用`make Parent_Build。 您只需允許make在內部調用它即可,因為它知道設置所需的變量。

當然,您可以根據需要將其擴展到多個目標和多個變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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