繁体   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