Vic*_*lea 1 c++ bash automake autotools m4
在我的项目中,我有一组bash脚本,它们与C/C++二进制文件一起复制到安装根目录.
问题是我必须在安装之前为每个BASH脚本运行一个命令.更具体的是,我必须用autoconf输出变量替换变量:
anyfile sed 's/ECLIPSE_PATH/@prefix@/g'
Run Code Online (Sandbox Code Playgroud)
这是在Makefile.am中定义脚本的地方
bin_SCRIPTS = file1.sh file2.sh
Run Code Online (Sandbox Code Playgroud)
我想知道是否有任何标准的方法来解决这个问题.如果不是,我想来一些黑客来处理它.谢谢!
我想出了一个解决它的黑客,这是Automake的配方:
install-data-hook:
input_path="@prefix@"; \
path=$${input_path//\//\\/}; \
for i in @bindir@/*; do \
if [[ ! `file $${i}` =~ "ELF" ]]; then \
sed -i "s/\$$ECLIPSE_PATH/$${path}/g" $$i; \
fi \
done
Run Code Online (Sandbox Code Playgroud)
但我仍然想知道是否有标准的方法来做到这一点
将autoconf发现的变量替换为脚本确实是正常的事情.它通常使用完成AC_CONFIG_FILES.
最常用的方法是给源文件一个.in后缀,然后重写为.sh使用autoconf.就像是:
AC_CONFIG_FILES([script.sh:script.in], [chmod +x script.sh])
Run Code Online (Sandbox Code Playgroud)
然后在源文件中,只写@whatever@,而不是使用ECLIPSE_PATH.
现在,我意识到你想在安装时做到这一点.但是,通常这是错误的方法.在auto*世界中,prefix在配置和安装时间之间进行更改并不是一件好事- 您必须重新配置.
如果你真的想在安装时这样做,那么我认为你的方法已经足够合理了.循环使用内容bindir对于您的软件包的用户来说是危险的 - 如果他们将其与其他程序一起安装到树中会怎么样?最好,IMO,循环$(bin_SCRIPTS).