模式规则内部的链接

问题描述 投票:0回答:1

我有一个通用的构建系统,我将其作为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:我知道这似乎比其应有的麻烦还要多,但出于这个问题的目的,我已经简化了一些事情。实际上,它使我免于处理一些重复问题,而不仅仅是节省了我一行。

makefile
1个回答
0
投票

好的,我想出了一个答案:

$(BIN_DIR): | $(BIN_DIR)
    $(CC) $(LDFLAGS) -o $@ $< $($(F)_LINK:%=-l %)
foo_LINK = mylib1 mylib2

不幸的是,尽管有关于在规范的第8版中将嵌套/计算变量添加到POSIX make的提议,但似乎在过去10年来一直处于停滞状态。

© www.soinside.com 2019 - 2024. All rights reserved.