【问题标题】:How to cross-compile Git for ARM?如何为 ARM 交叉编译 Git?
【发布时间】:2013-03-09 02:41:05
【问题描述】:

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

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

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

我首先从here 获取 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 中删除测试要容易得多。我错过了什么?

【问题讨论】:

  • 谢谢,您的问题对我帮助很大!最终对我有用的命令是CC=armv7l-timesys-linux-gnueabi-gcc CFLAGS="--sysroot=/home/mmes/projects/arm-cross-sdk/tags/0.1.8" LDFLAGS="--sysroot=/home/evadeflow/projects/arm-cross-sdk/tags/0.1.8" ./configure --prefix=/home/evadeflow/git-arm --build=i386-linux-gnu --host=armv7l-timesys-linux-gnueabi。 (--sysroot= arg 对于大多数人来说应该不是必需的。)我还必须按照您的描述(ac_cv_fread_reads_directoriesac_cv_snprintf_returns_bogus)注释掉configure.ac 中的一些测试,然后运行make configure。跨度>

标签: git cross-compiling autoconf


【解决方案1】:

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

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

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

【讨论】:

  • 成功了!make 提供额外参数后,编译的麻烦文件和应用程序的其余部分似乎正在构建(到目前为止,无论如何)。
  • @NathanOsman 你能否在某个站点上提供一些 ARM git 的二进制文件,这样我就可以下载它而无需构建?将不胜感激!
【解决方案2】:

我刚刚为更新版本的 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。

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

【讨论】:

    【解决方案3】:

    我发现./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,那么你就不得不求助于钝器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 2011-07-24
      • 2014-12-05
      • 2012-08-04
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      相关资源
      最近更新 更多