不幸的是,我很难为ARMv6架构交叉编译Git。
但在我开始描述我已经采取的步骤和我已经输入的命令之前,我应该简要介绍构建环境:
/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
手动删除测试要容易得多。我错过了什么?
答案 0 :(得分:10)
失败的宏是ST_MTIME_NSEC
中的git-compat-util.h
。此宏由宏USE_NSEC
,NO_NSEC
和USE_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。
我传递给configure
和make
的其他定义是最好的猜测;我没有调查在我的ARM平台上最好的答案是什么。