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

时间:2015-03-18 09:29:24

标签: c++ bash autotools automake m4

在我的项目中,我有一组bash脚本,它们与C / C ++二进制文件一起复制到安装根目录。

问题是我必须在安装之前为每个BASH脚本运行一个命令。更具体的是,我必须用autoconf输出变量替换变量:

 anyfile sed 's/ECLIPSE_PATH/@prefix@/g'

这是在Makefile.am

中定义脚本的地方
 bin_SCRIPTS = file1.sh file2.sh

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

更新

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

答案 0 :(得分:6)

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