0

我有一个别人写的包;我无法更改该包中的文件。在那个包中有一个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 文件中的变量。如果可以的话,我想避免这种情况。

4

1 回答 1

0

我有两个想法给你:

首先,运行类似:

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

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

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

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

于 2013-09-25T16:52:40.970 回答