Makefile 模式规则内部的链接

Makefile 模式规则内部的链接,makefile,Makefile,我有一个通用的构建系统,作为Git子模块导入到我的项目中,每个项目都有一个包含构建系统的makefile的包装器makefile。假设构建系统的makefile中有如下内容: $(BIN_DIR): | $(BIN_DIR) $(CC) $(LDFLAGS) -o $@ $< 虽然这种技术对库很有效,但对可执行文件显然不起作用,因为每个文件都需要与一组不同的库相链接。因此,我的问题是如何在不依赖GNU的情况下实现特定功能?有了GNU Make,我可以做这样的事情: $(BIN_D

我有一个通用的构建系统,作为Git子模块导入到我的项目中,每个项目都有一个包含构建系统的makefile的包装器makefile。假设构建系统的makefile中有如下内容:

$(BIN_DIR): | $(BIN_DIR)
    $(CC) $(LDFLAGS) -o $@ $<
虽然这种技术对库很有效,但对可执行文件显然不起作用,因为每个文件都需要与一组不同的库相链接。因此,我的问题是如何在不依赖GNU的情况下实现特定功能?有了GNU Make,我可以做这样的事情:

$(BIN_DIR): | $(BIN_DIR)
    $(CC) $(LDFLAGS) -o $@ $< $((nodir $(basename $@))_LINK:%=-l %)
$(BIN_DIR): | $(BIN_DIR)
    $(CC) $(LDFLAGS) -o $@ $< `cat $@.link`
我曾经想到过一个可移植的解决方案,但由于它是一个巨大的漏洞,所以我不想使用它,它是一个与每个可执行文件关联的.link文件,其中包含一行如下内容:
-l mylib1-lmylib2
,然后执行类似的操作:

$(BIN_DIR): | $(BIN_DIR)
    $(CC) $(LDFLAGS) -o $@ $< $((nodir $(basename $@))_LINK:%=-l %)
$(BIN_DIR): | $(BIN_DIR)
    $(CC) $(LDFLAGS) -o $@ $< `cat $@.link`
$(BIN_DIR):|$(BIN_DIR)
$(CC)$(LDFLAGS)-o$@$<`cat$@.link`
因此,抛开所有这些不谈,我需要以某种方式神奇地将正确的库集传递给模式规则,或者在执行模式规则时让变量扩展到正确的库集

有什么想法吗?谢谢


PS:我知道这似乎比它的价值更麻烦,但为了这个问题,我简化了事情。事实上,它让我不必再去处理一些事情,而不仅仅是帮我省下一句话。

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

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

不幸的是,虽然有人建议在规范第8期的POSIX make中添加嵌套/计算变量,但在过去10年左右的时间里,它似乎一直处于不确定状态。

Err。。。仅订单前提条件和模式规则都是GNU make的特定功能。所以我不明白你为什么说你不能用它们。如果您真的不能使用任何GNU make功能,那么您根本不能将
包含在您的先决条件列表中。仅订购先决条件(
)是GNU make only功能。替换引用中的模式(
%
字符)不是标准的一部分(使用它们会导致未指定的行为)。实际上,它们都将出现在POSIX的第8期中。很可能不是嵌套变量。我一直在试着在他们的bug追踪器上寻找他们。仅限订单?在POSIX中?我从未听说过类似的事情,也从未听说过make的任何其他版本中提供此功能。通常POSIX不会标准化某些东西,除非它已经被广泛使用。您是否对奥斯汀集团提出的关于此次添加的问题有异议?很抱歉回答得太晚。圣诞节很忙:)你说得对,POSIX没有订单专用的先决条件。我自己看了票。
foo_LINK = mylib1 mylib2