Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
告诉automake在安装之前或链接之后在程序上运行一些命令_Automake - Fatal编程技术网

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

告诉automake在安装之前或链接之后在程序上运行一些命令,automake,Automake,我想在安装二进制文件之前使用automake处理/修改它们。例如,我想将二进制文件中的符号提取到一个单独的文件和位置(如)。另一个示例是收集关键资产的MD5总和以发布报告 这是一个简化(但具有代表性)的Makefile.am,我有: abc_PROGRAMS = foo foo_SOURCES = foo.cpp pqr_PROGRAMS = bar bar_SOURCES = bar.cpp ALL_SYMS := $(PROGRAMS:%=%.sym) sym_DATA = $(ALL

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

这是一个简化(但具有代表性)的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=$@ $<
   ...
installexeclocal的问题是,当我使用“makeinstall-j”时 install exec local target与install并行运行,所以二进制文件foo和bar 在其各自的目标目录中安装到,即使在安装时也是如此 正在被%.sym规则修改,因此可能会弄乱已安装的 文件夹。但是,如果不使用-j,则此解决方案有效。我想知道我是否能利用 使用-j的优点

  • 另一种可能的方法是使用install exec hook:

    install-exec-hook: $(ALL_SYMS)
    
    install exec hook的问题是程序foo和bar已经在运行 在我有机会使用%.sym规则修改它们之前安装。除了福 酒吧安装在不同的地方,我没有一个通用的方法 在编写合适的install exec钩子规则时获取它们的目标位置

  • 另一种可能的方法是定义STRIP_程序或类似的东西,但是 不太好用,因为我认为它在“makeinstall”中不起作用 目标,但仅使用“make-install strip-j”。我没有走这条路,因为我们的 构建脚本使用“makeinstall-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 $@
    
    abc\u程序=foo
    foo:foo.tmp
    foo.sym:foo
    noinst_PROGRAMS=foo.tmp
    foo_tmp_SOURCES=foo.cpp
    pqr_程序=巴
    bar:bar.tmp
    bar.sym:bar
    noinst_程序+=bar.tmp
    bar\u tmp\u源=bar.cpp
    sym_DATA=foo.sym bar.sym
    foo-bar:%:%.tmp
    ...
    cp$@$<
    objcopy--仅保留调试$@$@.sym
    objcopy--全部剥离--添加gnu调试链接=$@.sym$@
    
  • 如果automake提供了一个钩子,在程序安装之前或程序构建之后运行,我会很高兴

    stackoverflow.com社区正在改变互联网上可用解决方案的质量。我相信一定有人遇到过与我类似的问题。我正在等待关于这个问题的好的解决方案或行业最佳实践。最后,我对不能使问题变得更简短或更容易理解感到抱歉。

    < P>沿着选项第3行,在这种情况下,您可能会考虑设置一个<代码>安装< /COD>变量(安装,安装数据,安装程序,安装程序脚本),并指向一个脚本,它可以实现您想要的,最后一步调用real
    install

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

    可以使用
    libtool
    postlink\u cmds
    步骤完成“链接后立即”部分:

    变量:postlink_cmds

    完成链接程序所需的命令。链接程序后,立即执行postlink_cmds。postlink_cmds中出现的任何字符串@OUTPUT@在执行之前都将替换为所创建的可执行文件的名称(即,如果生成了包装,则不是包装)。类似地,@TOOL_OUTPUT@被替换为的工具链格式@OUTPUT@. 通常禁用(即postlink_cmds为空)


    下面是
    configure.ac
    的一部分,它使用
    sed
    在创建
    libtool
    后修补
    libtool
    postlink\u cmds
    。我们需要它在Solaris共享对象上应用软件功能,因为我们通过映射文件
    -M
    设置这些功能的链接选项(显然)被剥夺了

    尽管
    libtool
    有一个
    postlink\u cmds
    我们不知道如何更传统地设置它。也许有个地方可以做这件事

    #############################################################################
    ## Hack ahead. GNU's libtool does not honor our '-M cryptopp.mapfile' in AM_LDFLAGS
    ## for the libcryptopp.so recipe. Many thanks to John Martin of Oracle for help wielding
    ## elfedit. The hw_cap = 0x1800 is SSE2 SSE and its needed for old hardware when new
    ## instructions are present, like SSE4.1, SSE4.2, CLMUL, AES, RDRAND, RDSEED and SHA.
    ## TODO: determine if we are allowed to hijack libtool's postlink_cmds function. It
    ## works well but we may be violating a policy somewhere along the line.
    
    if test "$IS_SUN_OS" -ne "0" && test "$IS_SUN_COMPILER" -ne "0"; then
       if test "$IS_IA32" -ne "0"; then
    
          echo "Adding postlink script"
          rm -f postlink.sh 2>/dev/null
          echo "echo \"Fixing shared object capabilities\"" >> postlink.sh
          echo "elfedit -e 'cap:hw1 0x1800' .libs/cryptest" >> postlink.sh
          echo "elfedit -e 'cap:hw1 0x1800' .libs/cryptestcwd" >> postlink.sh
          echo "elfedit -e 'cap:hw1 0x1800' .libs/libcryptopp.so.6.0.0" >> postlink.sh
          echo "" >> postlink.sh
          chmod +x postlink.sh
    
          echo "Adding postlink script to libtool postlink_cmds"
          sed 's|postlink_cmds=""|postlink_cmds="./postlink.sh"|g' libtool > libtool.fixed
          mv libtool.fixed libtool
          chmod +x libtool
       fi
    fi
    

    在使用
    sed
    进行黑客攻击之前,我尝试在
    configure.ac
    中更传统地设置
    postlink\u cmds
    。不幸的是,它不起作用,导致生成的
    libtool
    中出现
    postlink\u cmds=”“
    。以下是一些不起作用的东西:

    ~
    的原因是:

    。。。用于命名包含用于延迟求值的shell命令的变量的约定是,在需要一行有效shell脚本的情况下使用后缀_cmd,在可能延迟多行shell脚本以供以后求值的情况下使用后缀_cmds。按照惯例,_cmds变量在必要时用~字符分隔评估单元


    在成功构建之后,有什么方法可以做到这一点吗?在尝试运行自检之前,我需要修复Solaris上具有错误功能的共享对象。否则,结果如下:。另请参见Automake邮件列表中的。有关在Automake之前执行代码的方法,请参见另一个线程。我偶然发现了相同的问题,即configure.ac中忽略了“postlink_cmds”。解决方案是将“postlink_cmds”和“postlink_cmds_CXX”(CXX对于C项目可能不同,没有进一步检查)设置为相同的命令。
    #############################################################################
    ## Hack ahead. GNU's libtool does not honor our '-M cryptopp.mapfile' in AM_LDFLAGS
    ## for the libcryptopp.so recipe. Many thanks to John Martin of Oracle for help wielding
    ## elfedit. The hw_cap = 0x1800 is SSE2 SSE and its needed for old hardware when new
    ## instructions are present, like SSE4.1, SSE4.2, CLMUL, AES, RDRAND, RDSEED and SHA.
    ## TODO: determine if we are allowed to hijack libtool's postlink_cmds function. It
    ## works well but we may be violating a policy somewhere along the line.
    
    if test "$IS_SUN_OS" -ne "0" && test "$IS_SUN_COMPILER" -ne "0"; then
       if test "$IS_IA32" -ne "0"; then
    
          echo "Adding postlink script"
          rm -f postlink.sh 2>/dev/null
          echo "echo \"Fixing shared object capabilities\"" >> postlink.sh
          echo "elfedit -e 'cap:hw1 0x1800' .libs/cryptest" >> postlink.sh
          echo "elfedit -e 'cap:hw1 0x1800' .libs/cryptestcwd" >> postlink.sh
          echo "elfedit -e 'cap:hw1 0x1800' .libs/libcryptopp.so.6.0.0" >> postlink.sh
          echo "" >> postlink.sh
          chmod +x postlink.sh
    
          echo "Adding postlink script to libtool postlink_cmds"
          sed 's|postlink_cmds=""|postlink_cmds="./postlink.sh"|g' libtool > libtool.fixed
          mv libtool.fixed libtool
          chmod +x libtool
       fi
    fi
    
    if test x"$postlink_cmds" = "x"; then
        postlink_cmds="./postlink.sh"
    else
        postlink_cmds="~ ./postlink.sh"
    fi