如何将make变量设置为目标相关值?

时间:2014-03-12 16:10:33

标签: c linux makefile

如果这是一个愚蠢的问题,我不是专家,所以道歉。我想将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时评估所有的evals,导致总是最后设置的内容。我确信必须有可能做到这一点,但如果我能找到方法就会受到打击。

任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

您只需将变量放在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

答案 1 :(得分:0)

可能有一种我不知道的好方法,但是直到有人发布它...这里是我以前如何解决这类问题。

$(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在内部调用它,因为它知道设置所需的变量。

当然,您可以根据需要为多个目标和多个变量扩展它。