【问题标题】:GNU make: inheriting another rules' prerequisitesGNU make:继承另一个规则的先决条件
【发布时间】:2013-09-25 16:47:43
【问题描述】:

我有一个别人写的包;我无法更改该包中的文件。在那个包中有一个 Makefile,它的规则如下:

$(BIN)/progA:   <long list of .o files>
    $(LINK.cc) $^ -o $@

我想围绕该 Makefile 编写一个 GNU make“包装器”来构建一个库,而不是来自同一个 .o 文件列表的二进制文件。理想情况下,我想要这样的东西:

include package/Makefile

$(LIB)/progA.so: <magically copy the prerequisites for $(BIN)/progA>
    $(LD) -shared  $(LDFLAGS) $^ $(LIBS) -o $@

当然,我可以将包的 Makefile 中的列表复制粘贴到我的,但该包会经常更新;如果我的构建过程会自动神奇地在其 Makefile 中获取对包更改的任何更改,我更喜欢它。

我唯一的其他解决方案是复杂的:使用 sed 或 awk 或 perl 扫描包的 Makefile,提取 .o 文件列表,并将其分配给我的包装器 make 文件中的变量。如果可以的话,我想避免这种情况。

【问题讨论】:

  • 如果包更新频繁,请提交功能请求,以便他们将目标文件放在OBJS 变量中,而不是在规则中硬编码。
  • > 我有一个别人写的包;我无法更改该包中的文件。 这个要求是不现实的。如果您有自己的计算机和文件的副本,您可以做任何您想做的事情。您可以应用补丁、导入到您维护自己的分支的存储库等等。

标签: inheritance makefile prerequisites


【解决方案1】:

我有两个想法给你:

首先,运行类似:

make -n bin/progA LINK.cc='OBJECTS:' | grep ^OBJECTS:

然后捕获输出。不过,您必须从结果中手动删除 -o 等。

另一个想法是运行“make -pn”来获取make数据库的副本,然后用grep或其他方法解析它。

这些与直接通过 makefile 相比的优点是任何变量等都将由 make 为您扩展。

【讨论】:

  • 如果您对解决方案感到满意,请单击旁边的复选标记接受它。
猜你喜欢
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
相关资源
最近更新 更多