如何为ARM交叉编译Git?

时间:2013-03-20 05:41:37

标签: git cross-compiling autoconf

不幸的是,我很难为ARMv6架构交叉编译Git。

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

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

我从here抓住Git 1.8.2开始。解压缩后运行的目录:

export 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

这会持续几秒钟,然后以:

中止
checking whether system succeeds to read fopen'ed directory...
configure: error: in `/home/my_name/git-1.8.2':
configure: error: cannot run test program while cross compiling

我破解了开放configure.ac并删除了第806-825行,禁用了测试。在这之后,我还必须删除第806-839行,原因类似。

此时,./configure脚本能够完成。然后我兴奋地运行make来构建Git,经过几分钟后,遇到了这个错误:

fetch-pack.c: In function 'fetch_pack':
fetch-pack.c:928:16: error: 'struct stat' has no member named 'st_mtim'
make: *** [fetch-pack.o] Error 1

不知怎的,我感觉到我做错了#34;这听起来比从configure.ac手动删除测试要容易得多。我错过了什么?

3 个答案:

答案 0 :(得分:10)

失败的宏是ST_MTIME_NSEC中的git-compat-util.h。此宏由宏USE_NSECNO_NSECUSE_ST_TIMESPEC控制,这些宏在构建命令行或config.mak.uname上提供,而不是由配置提供。

如果没有提供选项, 应该,git根本不会尝试使用纳秒时间戳(或st_mtim),但它看起来像一个漏洞。< / p>

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

答案 1 :(得分: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。即使正在测试的API实际上是fread,这个特定的缓存变量也指向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,那么您就不得不求助于钝器。

答案 2 :(得分:0)

我只是交叉编译到ARM以获取最新版本的git 2.28,还遇到了在交叉构建期间无法运行的测试问题。

请注意,我以前为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。

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