15

不幸的是,我在为 ARMv6 架构交叉编译 Git 时遇到了困难。

但在开始描述我采取的步骤和输入的命令之前,我应该简要描述一下构建环境:

  • 我在 Ubuntu 12.10 64 位上进行交叉编译。
  • 交叉编译器安装到/home/my_name/cctoolchain(此目录包含bin/,lib/等)。

我首先从这里获取 Git 1.8.2 。提取目录后,我运行:

导出 PATH=$PATH:/home/my_name/cctoolchain/bin

我还跑来autoconf确保它./configure是最新的。然后我调用./configure如下:

./configure --prefix=/home/my_name/git-arm --build=x86_64-linux-gnu
  --host=arm-linux-androideabi

这运行了几秒钟,然后中止:

检查系统是否成功读取 fopen'ed 目录...
配置:错误:在`/home/my_name/git-1.8.2'中:
配置:错误:交叉编译时无法运行测试程序

我打开configure.ac并删除了 806-825 行,禁用了测试。之后,出于类似的原因,我还不得不删除第 806-839 行。

至此,./configure脚本就可以完成了。然后我兴奋地跑去make构建 Git,又过了一会儿,遇到了这个错误:

fetch-pack.c:在函数“fetch_pack”中:
fetch-pack.c:928:16:错误:“struct stat”没有名为“st_mtim”的成员
make: *** [fetch-pack.o] 错误 1

不知何故,我觉得我“做错了”。这听起来应该比手动从configure.ac. 我错过了什么?

4

3 回答 3

12

失败的宏ST_MTIME_NSECgit-compat-util.h. 此宏由宏和控制USE_NSEC,它们是在构建命令行上提供的,或者由而不是由 configure 提供。NO_NSECUSE_ST_TIMESPECconfig.mak.uname

应该是,如果没有提供任何选项,git 根本不会尝试使用纳秒时间戳(或st_mtim),但它看起来像一个错误。

试试看make NO_NSEC=1是否能解决您的问题。

于 2013-03-20T06:10:26.797 回答
1

我刚刚为更新版本的 git 2.28 交叉编译到 ARM,并且还遇到了在交叉构建期间无法运行的测试问题。

请注意,我之前为 ARM 构建了 zlib 并将其安装在/opt/arm-zlib,它出现在下面的路径中。

对我有用的咒语是:

./configure --build=i686-pc-linux-gnu --host=arm-linux NO_ICONV=true ac_cv_fread_reads_directories=true ac_cv_snprintf_returns_bogus=false

make LDFLAGS=-L/opt/arm-zlib/lib CFLAGS=-I/opt/arm-zlib/include NO_TCLTK=true NO_GETTEXT=true

NO_TCLTK 禁用了我不想要的 GUI。

configure我传递给的其他定义make是最好的猜测;我没有调查我的 ARM 平台上的最佳答案是什么。

于 2020-10-16T16:33:50.893 回答
0

我发现它./configure支持将检查结果缓存到文件中。如果您手动创建该文件以匹配所需目标的行为,则可以影响./configure运行方式(在一定程度上)。

首先,我跑来./configure --config-cache配置我的本地系统。config.cache这将使用正确的变量和正确的格式填充缓存文件。

然后,我将相关检查复制到中,清理并使用修改后的缓存config.cache.android重新运行。./configure

./configure --config-cache
mv ./config.cache ../
git clean -d -f -x
grep ac_cv_fread_reads_directories ../config.cache > config.cache.android
./configure --cache-file=config.cache.android # ...
# ...
checking whether system succeeds to read fopen'ed directory... (cached) yes
# ...

要知道您需要抓取哪些变量,您需要检查configure.ac. 这个特定的缓存变量指的是fread即使被测试的 API 实际上是fopen.

AC_CACHE_CHECK([whether system succeeds to read fopen'ed directory],
 [ac_cv_fread_reads_directories],
[
AC_RUN_IFELSE(
        [AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],
                [[
                FILE *f = fopen(".", "r");
                return f != NULL;]])],
        [ac_cv_fread_reads_directories=no],
        [ac_cv_fread_reads_directories=yes])
])

如果作者configure.ac没有想到要使用AC_CACHE_CHECK,那么你就不得不求助于钝器。

于 2020-10-11T05:23:46.073 回答