Как перекрестно скомпилировать Git для ARM?

К сожалению, у меня возникли трудности с кросс-компиляцией Git для архитектуры ARMv6.

Но прежде чем я начну описывать шаги, которые я принял, и команды, которые я ввел, я должен кратко описать среду сборки:

  • Я перекрестно компилирую на Ubuntu 12.10 64-bit.
  • Кросс-компилятор устанавливается в /home/my_name/cctoolchain (этот каталог содержит bin/, lib/ и т.д.).

Я начал с захвата 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 script. Затем я взволнованно провел 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

Как-то я чувствую, что я "делаю это неправильно". Это похоже на то, что должно быть намного проще, чем вручную удалить тесты из configure.ac. Что мне не хватает?

Ответ 1

Макрос с ошибкой ST_MTIME_NSEC в git-compat-util.h. Этот макрос управляется макросами USE_NSEC, NO_NSEC и USE_ST_TIMESPEC, которые указаны в командной строке сборки или config.mak.uname, а не configure.

Должно быть, если никаких параметров не предусмотрено, git не пытается использовать наносекундные метки времени (или st_mtim) вообще, но похоже, что ошибка проскользнула.

Попробуйте make NO_NSEC=1 и проверьте, устраняет ли это вашу проблему.