1

在我的项目中,我有一组 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

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

4

1 回答 1

6

将 autoconf 发现的变量替换到脚本中确实是一件很正常的事情。它通常使用AC_CONFIG_FILES.

最正常的做法是给你的源文件一个.in后缀,然后改写为.sh使用autoconf。就像是:

AC_CONFIG_FILES([script.sh:script.in], [chmod +x script.sh])

然后在源文件中,只写@whatever@,而不是使用ECLIPSE_PATH.

现在,我意识到您想在安装时执行此操作。但是,通常这是错误的方法。在 auto* 世界中,在配置和安装时间之间进行更改并不是真的可以prefix——​​您必须重新配置。

如果您真的想在安装时这样做,那么我认为您的方法几乎足够合理。循环bindir访问你的包的内容对用户来说是危险的——如果他们将它与其他程序一起安装到树中怎么办?最好,IMO,循环$(bin_SCRIPTS)

于 2015-03-20T14:52:35.860 回答