我有一个通用的构建系统,我将其作为Git子模块导入到我的项目中,每个项目都有一个包含构建系统的makefile的包装makefile。假设我在构建系统的makefile中有以下内容:
$(BIN_DIR): | $(BIN_DIR)
$(CC) $(LDFLAGS) -o $@ $<
以及项目的makefile中类似以下的先决条件:
$(BIN_DIR)/foo: $(FOO_OBJ_FILES:%=$(OBJ_DIR)/%)
虽然此技术对库很好用,但对可执行文件显然不起作用,因为每种技术都需要与一组不同的库链接。所以我的问题是如何实现不依赖GNU Make特定功能?使用GNU Make,我可以执行以下操作:
$(BIN_DIR): | $(BIN_DIR)
$(CC) $(LDFLAGS) -o $@ $< $((nodir $(basename $@))_LINK:%=-l %)
foo_LINK = mylib1 mylib2
$(BIN_DIR)/foo: $(FOO_OBJ_FILES:%=$(OBJ_DIR)/%)
我曾想过但不愿使用的一种便携式解决方案,因为它是一个巨大的漏洞,它是与每个可执行文件关联一个。link文件,其中包含如下一行:-l mylib1 -lmylib2
然后执行像这样的东西:
$(BIN_DIR): | $(BIN_DIR)
$(CC) $(LDFLAGS) -o $@ $< `cat [email protected]`
所以,除了所有这些,我需要以某种方式神奇地将正确的库集传递给模式规则,或者在执行模式规则时将变量扩展到正确的库集。
有什么想法吗?谢谢。
PS:我知道这似乎比其应有的麻烦还要多,但出于这个问题的目的,我已经简化了一些事情。实际上,它使我免于处理一些重复问题,而不仅仅是节省了我一行。
好的,我想出了一个答案:
$(BIN_DIR): | $(BIN_DIR)
$(CC) $(LDFLAGS) -o $@ $< $($(F)_LINK:%=-l %)
foo_LINK = mylib1 mylib2
不幸的是,尽管有关于在规范的第8版中将嵌套/计算变量添加到POSIX make的提议,但似乎在过去10年来一直处于停滞状态。