我正在尝试在远程 CI 服务器上构建一个库,但我没有 root 权限。该库需要安装 autoconf、automake 和 libtool 包。我无法使用 apt-get install 执行此操作,因此我尝试了一种解决方法:下载 .deb 包并导出 PATH,以便可以找到 autoconf、libtoolize 等。
问题是这些软件包中的二进制文件有一些指向附加脚本(作为软件包的一部分安装)的硬编码路径。现在我收到此错误:
libtoolize: $pkgltdldir is not a directory: `/usr/share/libtool'
有没有办法用环境变量来改变这个默认路径(方法和这里一样https://superuser.com/a/1144948/62460)?
我尝试导出$pkgltdldir
,但没有成功。
答案1
在 shell 脚本 libtoolize(版本 2.4.2 和 2.4.6)中,有四个变量是硬编码的:
datadir=/usr/share
pkgdatadir=/usr/share/libtool
pkgltdldir=/usr/share/libtool
aclocaldir=/usr/share/aclocal
随后不久就有以下部分:
# Allow the user to override the master libtoolize repository:
if test -n "$_lt_pkgdatadir"; then
pkgltdldir="$_lt_pkgdatadir"
pkgdatadir="$_lt_pkgdatadir/libltdl"
aclocaldir="$_lt_pkgdatadir/libltdl/m4"
因此将 $_lt_pkgdatadir 设置为 libtool 目录将会起作用(对我来说有效 - 但仅当 aclocal 目录位于名为 m4 的 libltdl 子目录中时)。
鉴于此,您的 sed 解决方案似乎非常合理。
答案2
我在这里遇到了同样的问题:
以非 root 用户身份构建 lighttpd-1.4.59
移动$./autogen.sh
main::scan_file() 调用过早,无法检查 /usr/bin/aclocal 第 622 行的原型。autom4te:无法打开 autom4te.cache/requests:没有权限aclocal:/usr/bin/autom4te 失败,退出状态:1 autoreconf:aclocal 失败,退出状态:1 构建需要 autoconf automake libtool m4 pcre pcre-devel pkg-config
以 root 用户身份构建 lighttpd-1.4.59
根目录#./autogen.sh
main::scan_file() 调用过早,无法检查 /usr/bin/aclocal 第 622 行的原型。libtoolize:$pkgltdldir 不是目录:`/syslol/share/libtool'autoreconf:libtoolize 失败,退出状态:1 构建需要 autoconf automake libtool m4 pcre pcre-devel pkg-config
这复制代码尝试找到“/syslol/共享/libtool' 从给定的路径目录中获取 libtool 目录。
因此,创建目录树`/syslol/共享/libtool' 如下
root# mkdir -p /syslol/share/libtool
让我们找到 libtool 目录
root# find / -type d -name libtool
/共享/libtool
添加符号链接以引用“/share/libtool”目录
root# ln -s /share/libtool/* /syslol/share/libtool/
再次运行构建
根目录#./autogen.sh
main::scan_file() 调用过早,无法检查 /usr/bin/aclocal 第 622 行的原型。libtoolize:$aclocaldir 不是目录: `/syslol/share/aclocal'autoreconf:libtoolize 失败,退出状态:1 构建需要 autoconf automake libtool m4 pcre pcre-devel pkg-config
这表明我们还需要将 aclocal 目录链接到此路径`/syslol/share/aclocal'
在 /syslol/share 目录中创建 aclocal
root# mkdir -p /syslol/share/aclocal
让我们找到 aclocal 目录的位置:
root# find / -type d -name aclocal
/共享/aclocal
在 /usr/local/share/aclocal 中
/usr/共享/aclocal
出色地选择/share/aclocal/
链接路径
root# ln -s /share/aclocal/* /syslol/share/aclocal/
第三次试运行:
root# ./autogen.sh
main::scan_file() called too early to check prototype at /usr/bin/aclocal line 622.
`'libtoolize: putting auxiliary files in `.'.
libtoolize: copying file `./ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'.
libtoolize: copying file `m4/libtool.m4'
libtoolize: copying file `m4/ltoptions.m4'
libtoolize: copying file `m4/ltsugar.m4'
libtoolize: copying file `m4/ltversion.m4'
libtoolize: copying file `m4/lt~obsolete.m4'
main::scan_file() called too early to check prototype at /usr/bin/aclocal line 622.
Unescaped left brace in regex is deprecated here (and will be fatal in Perl 5.30), passed through in regex; marked by <-- HERE in m/\${ <-- HERE ([^ \t=:+{}]+)}/ at /usr/bin/automake line 4153.
configure.ac:24: require Automake 1.13, but have 1.11.2
autoreconf: automake failed with exit status: 1
build requires autoconf automake libtool m4 pcre pcre-devel pkg-config
我们已经修复了路径问题,尽管仍然有automake 问题 必须 更新 自动制作为了成功构建。
分布式 automake 版本文件可以在以下位置找到:版本目前我发现Automake 版本 1.13
让我们用 1.13 版本替换 automake 1.11.2 版本
备份原始二进制文件
移动$哪个自动制作
在/usr/bin/automake中
根目录# mv /usr/bin/automake /usr/bin/automake1.11.2
创建一个新的 automake 配置文件,内容为版本 1.13
根目录# cat > /usr/bin/automake
在此处粘贴网站内容
^D
添加执行权限
root# chmod +x /usr/bin/automake
第四次编译
root # ./autogen.sh
main::scan_file() called too early to check prototype at /usr/bin/aclocal line 622.
libtoolize: putting auxiliary files in `.'.
libtoolize: copying file `./ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'.
libtoolize: copying file `m4/libtool.m4'
libtoolize: copying file `m4/ltoptions.m4'
libtoolize: copying file `m4/ltsugar.m4'
libtoolize: copying file `m4/ltversion.m4'
libtoolize: copying file `m4/lt~obsolete.m4'
main::scan_file() called too early to check prototype at /usr/bin/aclocal line 622.
Now type './configure ...' and 'make' to compile.
我们已成功构建