告诉automake在安装之前或链接之后在程序上运行一些命令

Shr*_*m V 8 automake

我想在安装之前使用automake来处理/修改二进制文件.例如,我想将二进制文件中的符号提取到一个单独的文件和位置(如下所示).另一个例子是收集md5sums的关键资产以发布报告.

这是一个简化的(但有代表性的)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=$@ $<
   ...
Run Code Online (Sandbox Code Playgroud)

我在安装过程中尝试了几种方法来挂钩我的脚本,但成功有限.

  1. 一种可能的方法是使用install-exec-local:

    install-exec-local: $(ALL_SYMS)
    
    Run Code Online (Sandbox Code Playgroud)

    install-exec-local的问题是,当我使用:"make install -j"时,install-exec-local目标与安装并行运行,因此二进制文件foo和bar安装到各自的目标dirs,甚至当他们正在被%.sym规则修改时,从而可能会破坏已安装的文件.但是,如果不使用-j,则此解决方案有效.我想如果我可以利用使用-j的优点.

  2. 另一种可能的方法是使用install-exec-hook:

    install-exec-hook: $(ALL_SYMS)
    
    Run Code Online (Sandbox Code Playgroud)

    install-exec-hook的问题是在我有机会使用%.sym规则修改它们之前已经安装了程序foo和bar.除了foo和bar安装在不同的位置,我没有一个通用的方法来获取他们的目标位置,同时编写一个合适的install-exec-hook规则.

  3. 另一种可能的方法是定义STRIP_PROGRAM或类似的东西,但这不能很好地工作,因为我认为它不适用于"make install"目标,而只能使用"make install-strip -j".我没有走这条路,因为我们的构建脚本使用"make install -j".

  4. 另一种方法是通过创建在构建时间而不是安装时间运行的构建规则来实现.但是这个真的很麻烦,它在build目录中创建了很多文件,我想避免它.此外,项目中的新人在添加新程序时可以轻松绕过这些精心调整的精心安排.

    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 $@
    
    Run Code Online (Sandbox Code Playgroud)

如果automake提供了一个在程序安装之前运行的挂钩,或者只是在程序生成之后,我会很高兴.

stackoverflow.com社区真正改变了互联网上可用解决方案的质量.我相信有人必须遇到类似我的问题.我正在等待有关此问题的良好解决方案或行业最佳实践.最后,我为无法使问题更简单或更容易理解而道歉.

lda*_*v1s 2

按照选项 #3 的思路,在这种情况下,您可能会考虑设置其中一个INSTALL变量(INSTALL、INSTALL_DATA、INSTALL_PROGRAM、INSTALL_SCRIPT),并将其指向执行您想要的操作的脚本,并install在最后一步调用 real。