使用 Automake 为 bin_SCRIPTS 中的每个文件应用一个命令
Posted
技术标签:
【中文标题】使用 Automake 为 bin_SCRIPTS 中的每个文件应用一个命令【英文标题】:Apply a command for each file in bin_SCRIPTS using Automake 【发布时间】:2015-03-18 09:29:23 【问题描述】:在我的项目中,我有一组 bash 脚本,它们与 C/C++ 二进制文件一起复制到安装根目录。
问题是我必须在安装之前为每个 BASH 脚本运行一个命令。更具体地说,我必须用 autoconf 输出变量替换一个变量:
anyfile sed 's/ECLIPSE_PATH/@prefix@/g'
这里是 Makefile.am 中定义脚本的地方
bin_SCRIPTS = file1.sh file2.sh
我想知道是否有任何标准方法来处理这个问题。如果不是,我想用一些技巧来处理它。谢谢!
更新
我想出了一个 hack 来解决它,这里是 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
但我仍然想知道是否有标准的方法来做到这一点
【问题讨论】:
【参考方案1】:将 autoconf 发现的变量替换到脚本中确实是一件很正常的事情。通常使用AC_CONFIG_FILES
完成。
最正常的做法是给你的源文件一个.in
后缀,然后使用autoconf重写为.sh
。比如:
AC_CONFIG_FILES([script.sh:script.in], [chmod +x script.sh])
然后在源文件中,只写@whatever@
,而不是使用ECLIPSE_PATH
。
现在,我意识到您想在安装时执行此操作。但是,通常这是错误的方法。在 auto* 世界中,在配置和安装时间之间更改 prefix
是不太好的——您必须重新配置。
如果您真的想在安装时这样做,那么我认为您的方法几乎足够合理。循环遍历bindir
的内容对于您的软件包的用户来说是危险的——如果他们将它与其他程序一起安装到树中怎么办?最好,IMO,循环遍历$(bin_SCRIPTS)
。
【讨论】:
您是否知道autoconf
版本对AC_CONFIG_FILES
的参数格式的支持是什么(它是最近的还是实际上是“全部”)?
这么好的答案。只是想我会添加一个指向manual 的链接。
非常好的回答者。它让我对 autotool 有了更多的了解。谢谢:)
我认为您不能使用通配符。不过,您可能可以编写一个循环的 m4 宏。
我曾经是主要贡献者,但我已经很多年没有工作了。要安装文件,只需像往常一样在bin_SCRIPTS
中列出。以上是关于使用 Automake 为 bin_SCRIPTS 中的每个文件应用一个命令的主要内容,如果未能解决你的问题,请参考以下文章