告诉automake在安装之前或链接之后在程序上运行一些命令
我想在安装二进制文件之前使用automake处理/修改它们。例如,我想将二进制文件中的符号提取到一个单独的文件和位置(如)。另一个示例是收集关键资产的MD5总和以发布报告 这是一个简化(但具有代表性)的Makefile.am,我有:告诉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
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: $(ALL_SYMS)
install exec hook的问题是程序foo和bar已经在运行
在我有机会使用%.sym规则修改它们之前安装。除了福
酒吧安装在不同的地方,我没有一个通用的方法
在编写合适的install exec钩子规则时获取它们的目标位置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$@
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