Какая польза от LLVM в Android NDK Toolchains? - PullRequest
0 голосов
/ 20 февраля 2019

Какая польза от LLVM в Android NDK Toolchains?


Небольшое резюме:

Я строил свой собственный проект с Gradlew на Ubuntu, ориентируясь наархитектуры arm и x86_64.Похоже, что LLVM были использованы для вызова C / C ++ компилятора arm-linux-androideabi-4.9 , а также x86_64 (?)

Следующее извлечено из armeabi-v7a / ndkBuild_build_output.log:

/ home / mypc / Android / android-ndk-r17c / toolchains / llvm/ prebuilt / linux-x86_64 / bin / clang ++ -MMD -MP -MF / home / mypc / git / android-project-1 / build / посредников / ndkBuild / debug / obj / local / armeabi-v7a / objs-debug / module-5 / stream_cpp.od -gcc-toolchain /home/mypc/Android/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 -fpic -ffunction-section -funwind-tables -fstack-protector-strong -Wno-invalid-аргумент командной строки ...

.. и следующее извлечено из x86_64 / ndkBuild_build_output.log:

/ home / mypc / Android / android-ndk-r17c / toolchains / llvm / предварительно встроенный / linux-x86_64 / bin / clang ++ -MMD -MP -MF / home / mypc / git /Android-проект-1 / сборки / промежуточные / ndkBuild / дebug / obj / local / x86_64 / objs-debug / module-5 / stream_cpp.od -gcc-toolchain /home/mypc/Android/android-ndk-r17c/toolchains/x86_64-4.9/prebuilt/linux-x86_64 -target x86_64-none-linux-android -ffunction-section -funwind-tables -fstack-protector-strong -fPIC -Wno-invalid-аргумент командной строки ...

  • The "... "указывает на то, что есть длинный хвост этой однострочной команды, которую я обрезал.
  • Имена личных папок и проекта были изменены.

Давайте посмотрим, чтоВ папке Android * NDK toolchains :

myacc:~/.../android-ndk-r17c/toolchains$ tree -L 1
.
├── aarch64-linux-android-4.9
├── arm-linux-androideabi-4.9
├── llvm
├── mips64el-linux-android-4.9
├── mipsel-linux-android-4.9
├── NOTICE-MIPS
├── NOTICE-MIPS64
├── renderscript
├── x86-4.9
└── x86_64-4.9

Меня это довольно смущает.Я думал, что llvm - это своего рода набор инструментов, поскольку он находится здесь, рядом с другими наборами инструментов.Опять же, что на самом деле использует LLVM в Android NDK Toolchains?

Спасибо за помощь:)

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

LLVM теперь является зонтичным проектом, и он содержит несколько модульных и многократно используемых технологий компилятора и цепочки инструментов.Вы можете проверить более подробную информацию на Инфраструктура компилятора LLVM .

Для Android NDK llvm стал цепочкой инструментов по умолчанию, так как r13b и gcc были удалены с r18b.

Согласно каталогу инструментальных цепочек toolchains/llvm/prebuilt/darwin-x86_64, llvm поддерживает все ABI, то есть x86, x86_64, arm, arm64.

Возможно, в будущих выпусках NDK будет только один каталог llvm в каталоге toolchains, когда все связанные с gcc инструменты, заголовки и библиотеки полностью перенесены в llvm.

enter image description here

Ссылки, которые могут помочь: Переменная пути Android NDK для команды "strip" в цепочке инструментов сборки CMake


Обновления

Просто провел быстрый тест на разных ревизиях NDK, чтобы проверить конфигурации для --gcc-toolchain и --sysroot, которые предназначены для кросс-компиляции.

На r16b

--target=armv7-none-linux-androideabi 
--gcc-toolchain=~/ndks/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
--sysroot=~/ndks/android-ndk-r16b/sysroot 

На r17c

--target=armv7-none-linux-androideabi
--gcc-toolchain=~/ndks/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
--sysroot=~/ndks/android-ndk-r17c/sysroot

На r18b

--target=armv7-none-linux-androideabi19
--gcc-toolchain=~/ndks/android-ndk-r18b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
--sysroot=~/ndks/android-ndk-r18b/sysroot

На r19b

--target=armv7-none-linux-androideabi19 
--gcc-toolchain=~/ndks/android-ndk-r19b/toolchains/llvm/prebuilt/darwin-x86_64 
--sysroot=~/ndks/android-ndk-r19b/toolchains/llvm/prebuilt/darwin-x86_64/sysroot 

Как показано выше, до NDK r19b , NDK использует компилятор clang, но --gcc-toolchain и --sysroot настроены как более старые пути для инструментов сборки, заголовков и библиотек.

Но, , поскольку NDK r19b , --gcc-toolchain и --sysroot настроены как новые цепочки инструментов llvm , т.е. toolchains/llvm/prebuilt/darwin-x86_64, и инструменты (например, будут использованы заголовочные файлы ranlib, ar, strip и т. д.) и библиотеки «версии llvm».

Также обратите внимание, что toolchains/llvm/prebuilt/darwin-x86_64 содержит поддержку для всех ABI Android, то есть aarch64-linux-android для arm64-v8a , arm-linux-androideabi для armeabi-v7a , i686-linux-android для x86 , x86_64-linux-android для x86_64 .

Итак, вы можете попробовать NDK r19b, если хотите просто использовать набор инструментов llvm.

0 голосов
/ 20 февраля 2019

LLVM - это компилятор (бэкэнд).Используемый компилятор - Clang, который находится в каталоге llvm.(LLVM - это имя компонента Clang, который выполняет фактическую генерацию кода, то есть бэкэнд.)

Ранее NDK использовал GCC в качестве компилятора.При использовании GCC каждая целевая архитектура (arm, aarch64, x86 и т. Д.) Имела отдельную копию GCC, созданную с этой настроенной отдельной целью.Clang / LLVM, с другой стороны, может использовать любую настроенную архитектуру с помощью одного исполняемого файла компилятора.Так что с Clang вы сэкономите немного места на диске, избегая иметь много отдельных исполняемых файлов компилятора.Вот почему существует только одна копия дерева каталогов llvm.

В NDK r17 доступны компиляторы GCC и Clang;Clang используется по умолчанию, но GCC по-прежнему доступен для проектов, которые еще не смогли перейти на использование Clang.В более новых версиях NDK старый GCC удаляется.

В более новых версиях NDK, даже если GCC удаляется, специфичные для архитектуры каталоги, такие как aarch64-linux-android-4.9, по-прежнему сохраняются, как GNU binutils (используются второстепенные инструменты).процесс сборки) все еще используются, и они также приходят по одному экземпляру на архитектуру (хотя технически они могут работать на разных архитектурах).

А что касается, например, сборки для arm, также упоминается x86_64;когда вы используете Clang или GCC, вы запускаете исполняемый файл для своего компьютера сборки, на котором выполняется x86_64, следовательно, prebuilt/linux-x86_64 часть путей.

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