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