使用Automake为bin_SCRIPTS中的每个文件应用命令

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)

我想知道是否有任何标准的方法来解决这个问题.如果不是,我想来一些黑客来处理它.谢谢!

UPDATE

我想出了一个解决它的黑客,这是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)

但我仍然想知道是否有标准的方法来做到这一点

Tom*_*mey 6

将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).