我想在安装二进制文件之前使用 automake 处理/修改它们。例如,我想将二进制文件中的符号提取到一个单独的文件和位置(像这样)。另一个示例是收集关键资产的 md5sum 以发布报告。
这是我拥有的简化(但具有代表性)的 Makefile.am:
abc_PROGRAMS = foo
foo_SOURCES = foo.cpp
pqr_PROGRAMS = bar
bar_SOURCES = bar.cpp
ALL_SYMS := $(PROGRAMS:%=%.sym)
sym_DATA = $(ALL_SYMS)
# A convenient target such as "make foo.sym" will trigger this rule:
$(ALL_SYMS): %.sym : %
...
objcopy --preserve-dates --only-keep-debug $< $@
objcopy --preserve-dates --strip-all --add-gnu-debuglink=$@ $<
...
在安装过程中,我尝试了几种方法来挂钩我的脚本,但收效甚微。
一种可能的方法是使用 install-exec-local:
install-exec-local: $(ALL_SYMS)
install-exec-local 的问题在于,当我使用:“make install -j”时,install-exec-local 目标与安装并行运行,因此二进制文件 foo 和 bar 被安装到它们各自的目标目录中,甚至当它们被 %.sym 规则修改时,可能会弄乱已安装的文件。但是,如果不使用 -j,则此解决方案有效。我想我是否可以利用使用 -j 的优势。
另一种可能的方法是使用 install-exec-hook:
install-exec-hook: $(ALL_SYMS)
install-exec-hook 的问题是程序 foo 和 bar 在我有机会使用 %.sym 规则修改它们之前已经安装。除了 foo 和 bar 安装在不同的位置之外,我没有通用的方法来获取它们的目标位置,同时编写合适的 install-exec-hook 规则。
另一种可能的方法是定义 STRIP_PROGRAM 或类似的东西,但这并不能很好地工作,因为我认为它不适用于“make install”目标,而只能用于“make install-strip -j”。我没有走这条路,因为我们的构建脚本使用“make install -j”。
另一种方法是创建在构建时间而不是安装时间运行的构建规则。但是这个真的很麻烦,它在构建目录中创建了很多文件,我想避免它。此外,项目中的新人在添加新程序时可以轻松绕过这些精心调整的精心安排。
abc_PROGRAMS = foo foo : foo.tmp foo.sym : foo noinst_PROGRAMS = foo.tmp foo_tmp_SOURCES = foo.cpp pqr_PROGRAMS = bar bar : bar.tmp bar.sym : bar noinst_PROGRAMS += bar.tmp bar_tmp_SOURCES = bar.cpp sym_DATA = foo.sym bar.sym foo bar: % : %.tmp ... cp $@ $< objcopy --only-keep-debug $@ $@.sym objcopy --strip-all --add-gnu-debuglink=$@.sym $@
如果 automake 提供了一个在安装程序之前或在构建程序之后运行的钩子,我会喜欢的。
stackoverflow.com 社区确实对 Internet 上可用的解决方案的质量产生了影响。我相信一定有人遇到过和我类似的问题。我正在等待有关此问题的良好解决方案或行业最佳实践。最后,对于未能使问题更简短或更易于理解,我深表歉意。