Как кросс-компилировать неовим для Synology NAS - PullRequest
1 голос
/ 25 февраля 2020

Как видно из названия, у меня есть проблемы с кросс-компиляцией neovim для моего NAS-устройства Synology.

Хост:

$ uname -srm
Linux 4.12.14-lp151.28.36-default x86_64

Цель:

$ uname -srm
Linux 3.2.40 armv7l

Что я сделал:

Я скачал набор инструментов armadaxp-gcc493_glibc220_hard-GPL.txz и извлек содержимое в ~ / devel / SynologyNAS / armadaxp-gcc493_glibc220_hard -GPL /

Я загрузил источник Synology Nas GPL Источник Synology Nas GPL и извлек содержимое в ~ / devel / SynologyNAS / SynologyNASGPLSource /

(оба выше в соответствии с this article.)

Я клонировал neovim source в ~ / devel / neovim /

Я понимаю, что сначала мне нужно запустить CMake для сгенерируйте Makefiles и затем запустите make для фактической сборки программного обеспечения. (по крайней мере, это то, что я нашел здесь .) Соответственно, я написал файл набора инструментов, как описано в Документация CMake .

$ cat ~/devel/SynologyNAS/armadaxp-toolchain-file.cmake 
# this one is important
SET(CMAKE_SYSTEM_NAME Linux)
#this one not so much
SET(CMAKE_SYSTEM_VERSION 3.2.40)

# specify the cross compiler
SET(CMAKE_C_COMPILER /home/jonas/devel/SynologyNAS/armadaxp-gcc493_glibc220_hard-GPL/bin/arm-unknown-linux-gnueabi-gcc-4.9.3) 
SET(CMAKE_CXX_COMPILER /home/jonas/devel/SynologyNAS/armadaxp-gcc493_glibc220_hard-GPL/bin/arm-unknown-linux-gnueabi-g++) 

# where is the target environment
SET(CMAKE_FIND_ROOT_PATH  /home/jonas/devel/SynologyNAS/armadaxp-gcc493_glibc220_hard-GPL/ /home/jonas/devel/SynologyNAS/SynologyNASGPLSource/)

# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

Затем я попытался скомпилировать сторонние зависимости:

$ mkdir -p ~/devel/NeovimBuildForSynologyNAS/deps
$ cd -p ~/devel/NeovimBuildForSynologyNAS/deps
$ cmake -DCMAKE_TOOLCHAIN_FILE=../../SynologyNAS/armadaxp-toolchain-file.cmake ../../neovim/third-party/

-- The C compiler identification is GNU 4.9.3
-- Check for working C compiler: /home/jonas/devel/SynologyNAS/armadaxp-gcc493_glibc220_hard-GPL/bin/arm-unknown-linux-gnueabi-gcc-4.9.3
-- Check for working C compiler: /home/jonas/devel/SynologyNAS/armadaxp-gcc493_glibc220_hard-GPL/bin/arm-unknown-linux-gnueabi-gcc-4.9.3 -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Performing Test HAS_OG_FLAG
-- Performing Test HAS_OG_FLAG - Success
-- Found GNU Make at /usr/bin/gmake
-- The CXX compiler identification is GNU 4.9.3
-- Check for working CXX compiler: /home/jonas/devel/SynologyNAS/armadaxp-gcc493_glibc220_hard-GPL/bin/arm-unknown-linux-gnueabi-g++
-- Check for working CXX compiler: /home/jonas/devel/SynologyNAS/armadaxp-gcc493_glibc220_hard-GPL/bin/arm-unknown-linux-gnueabi-g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.2") 
-- Performing Test HAS_NO_STACK_CHECK
-- Performing Test HAS_NO_STACK_CHECK - Success
-- Configuring done
-- Generating done
-- Build files have been written to: /home/jonas/devel/NeovimBuildForSynologyNAS/deps

На мой взгляд, это выглядит так, как должно, но при запуске make выдает ошибку о невозможности выполнить host / mini lua что, как я понимаю, в любом случае делать не следует, поскольку он не компилируется для запуска на хосте.

$ make
Scanning dependencies of target luajit
[  1%] Creating directories for 'luajit'
[  2%] Performing download step for 'luajit'
-- file: /home/jonas/devel/NeovimBuildForSynologyNAS/deps/build/downloads/luajit/f0e865dd4861520258299d0f2a56491bd9d602e1.tar.gz
-- downloading...
     src='https://github.com/LuaJIT/LuaJIT/archive/f0e865dd4861520258299d0f2a56491bd9d602e1.tar.gz'
     dst='/home/jonas/devel/NeovimBuildForSynologyNAS/deps/build/downloads/luajit/f0e865dd4861520258299d0f2a56491bd9d602e1.tar.gz'
     timeout='none'
-- downloading... done
-- extracting...
     src='/home/jonas/devel/NeovimBuildForSynologyNAS/deps/build/downloads/luajit/f0e865dd4861520258299d0f2a56491bd9d602e1.tar.gz'
     dst='/home/jonas/devel/NeovimBuildForSynologyNAS/deps/build/src/luajit'
-- extracting... [tar xfz]
-- extracting... [analysis]
-- extracting... [rename]
-- extracting... [clean binary dir]
-- extracting... [clean up]
-- extracting... done
[  3%] No patch step for 'luajit'
[  4%] No update step for 'luajit'
[  5%] No configure step for 'luajit'
[  6%] No build step for 'luajit'
[  7%] Performing install step for 'luajit'
==== Building LuaJIT 2.1.0-beta3 ====
HOSTCC    host/minilua.o
HOSTLINK  host/minilua
DYNASM    host/buildvm_arch.h
host/minilua: host/minilua: Kann die Datei nicht ausführen.
make[4]: *** [Makefile:641: host/buildvm_arch.h] Fehler 126
make[3]: *** [Makefile:113: src/luajit] Fehler 2
make[2]: *** [CMakeFiles/luajit.dir/build.make:74: build/src/luajit-stamp/luajit-install] Fehler 2
make[1]: *** [CMakeFiles/Makefile2:223: CMakeFiles/luajit.dir/all] Fehler 2
make: *** [Makefile:84: all] Fehler 2

Я обнаружил, что могу заставить make продолжаться независимо от ошибок. Затем он запускает пакеты до тех пор, пока не завершится сборкой gperf.

$ make -k
[...]
[ 72%] Performing configure step for 'gperf'
configure: loading site script /usr/share/site/x86_64-unknown-linux-gnu
checking whether make sets $(MAKE)... yes
configure: creating ./config.status
config.status: creating Makefile
=== configuring in lib (/home/jonas/devel/NeovimBuildForSynologyNAS/deps/build/src/gperf/lib)
configure: running /bin/sh ./configure --disable-option-checking '--prefix=/home/jonas/devel/NeovimBuildForSynologyNAS/deps/usr'  'MAKE=make' 'CC=/home/jonas/devel/SynologyNAS/armadaxp-gcc493_glibc220_hard-GPL/bin/arm-unknown-linux-gnueabi-gcc-4.9.3' 'CXX=/home/jonas/devel/SynologyNAS/armadaxp-gcc493_glibc220_hard-GPL/bin/arm-unknown-linux-gnueabi-g++' 'LD=/home/jonas/devel/SynologyNAS/armadaxp-gcc493_glibc220_hard-GPL/bin/arm-unknown-linux-gnueabi-gcc-4.9.3' --cache-file=/dev/null --srcdir=.
configure: loading site script /usr/share/site/x86_64-unknown-linux-gnu
checking whether make sets $(MAKE)... yes
checking for gcc... /home/jonas/devel/SynologyNAS/armadaxp-gcc493_glibc220_hard-GPL/bin/arm-unknown-linux-gnueabi-gcc-4.9.3
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... configure: error: in `/home/jonas/devel/NeovimBuildForSynologyNAS/deps/build/src/gperf/lib':
configure: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
See `config.log' for more details
configure: error: ./configure failed for lib
make[2]: *** [CMakeFiles/gperf.dir/build.make:106: build/src/gperf-stamp/gperf-configure] Fehler 1
make[2]: Das Ziel „CMakeFiles/gperf.dir/build“ wurde wegen Fehlern nicht aktualisiert.
make[1]: *** [CMakeFiles/Makefile2:435: CMakeFiles/gperf.dir/all] Fehler 2
make[1]: Das Ziel „all“ wurde wegen Fehlern nicht aktualisiert.
make: *** [Makefile:84: all] Fehler 2
make: Das Ziel „default_target“ wurde wegen Fehlern nicht aktualisiert.

Видимо, команда Speci c configure не распознает, что я хочу кросс-компиляцию, и я не знаю, как скажите это так, поскольку я не вызываю его вручную, чтобы можно было передать опцию --host. Кроме того, я думал, что вся эта проблема с CMake должна была решить эту проблему. Я также искал configure.log , но не имею ни малейшего понятия, где его найти.

Я должен отметить, что мне удалось скомпилировать это программное обеспечение изначально (т.е. запустить на моем хост-компьютере).

Как вы уже догадались, я отнюдь не опытен в этом вопросе и, следовательно, даже не в состоянии разобраться с реальной проблемой сбоя компиляции. Поэтому я буду очень признателен за помощь и, надеюсь, лучше пойму, что здесь происходит.

Также это мой первый пост, и хотя я старался соблюдать руководящие принципы, я, возможно, не оправдал ожиданий.

Progress Made

Следуя подсказке, предоставленной v sh, я просто добавил --host=arm к команде cmake, насколько я понимаю, она скопирована в переменную CONFIGURE_COMMAND , gperf на самом деле успешно скомпилировался, но make сразу после этого остановился из-за ошибок

[...]
[ 75%] Completed 'gperf'
[ 75%] Built target gperf
make[1]: Das Ziel „all“ wurde wegen Fehlern nicht aktualisiert.
make: *** [Makefile:84: all] Fehler 2
make: Das Ziel „default_target“ wurde wegen Fehlern nicht aktualisiert.

Руководствуясь комментарием v sh, я также проверил neovim/third-party/cmake/BuildGperf.cmake и neovim/third-party/CMakeLists.txt. В обоих файлах есть комментарии, относящиеся к кросс-компиляции.

С BuildGperf.cmake

# Gperf recipe. Gperf is only required when building Neovim, when
# cross compiling we still want to build for the HOST system, whenever
# writing a recipe that is meant for cross-compile, use the HOSTDEPS_* variables
# instead of DEPS_* - check the main CMakeLists.txt for a list.

С CMakeLists.txt

# Cross compiling: use these for dependencies built for the
# HOST system, when not crosscompiling these should be the
# same as DEPS_*. Except when targeting Unix in which case
# want all the dependencies to use the same compiler.

Я довольно смущен это. Очевидно, все зависимости должны быть построены одним и тем же компилятором, предоставленным моим набором инструментов (так как я нацеливаюсь на систему Unix), что, конечно, сделает их не исполняемыми на моем хост-компьютере, что приводит к ошибкам выше.

Я все равно попытаюсь указать HOSTDEPS_* переменные и посмотрим, изменит ли это что-нибудь.

1 Ответ

0 голосов
/ 25 февраля 2020

Кратко посмотрите репо, которое я нашел BuildGperf , который объявляет функцию BuildGperf, которая принимает CONFIGURE_COMMAND. Вы можете попытаться найти в источниках, где BuildGperf был вызван и какой CONFIGURE_COMMAND был дан. Там вы можете попробовать добавить опцию --host, чтобы разрешить кросс-компиляцию Gperf

Я очень кратко посмотрел первый раз)) В файле, о котором я упоминал, вы можете увидеть вызов

    CONFIGURE_COMMAND ${DEPS_BUILD_DIR}/src/gperf/configure
  --prefix=${HOSTDEPS_INSTALL_DIR}
  MAKE=${MAKE_PRG} ${GPERF_BUILDARGS}

здесь Я полагаю, вы можете добавить все, что вам нужно для правильной настройки gperf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...