Как собрать LLVM (clang,clang++) для Apple M1?

Я пытаюсь создать компиляторы LLVM, чтобы включить OpenMP на Apple M1. Я использую дерево разработки LLVM (поскольку недавно я видел, как некоторая среда исполнения OpenMP использовала это для этого).

Я закончил с этим скриптом для вызова cmake:

      # Xcode, Ninja
BUILD_SYSTEM=Ninja
BUILD_TAG=Ninja

cmake ../llvm \
      -G$BUILD_SYSTEM -B ${BUILD_TAG}_build \
      -DCMAKE_OSX_ARCHITECTURES='arm64' \
      -DCMAKE_C_COMPILER=`which clang` \
      -DCMAKE_CXX_COMPILER=`which clang++` \
      -DCMAKE_BUILD_TYPE=Release \
      -DCMAKE_BUILD_WITH_INSTALL_RPATH=1 \
      -DCMAKE_INSTALL_PREFIX=$HOME/software/clang-12.0.0/arm64 \
      -DLLVM_ENABLE_WERROR=FALSE \
      -DLLVM_TARGETS_TO_BUILD='AArch64' \
      -DLLVM_ENABLE_PROJECTS='clang;openmp,polly' \
      -DLLVM_DEFAULT_TARGET_TRIPLE='aarch64-apple-darwin20.1.0'

Здесь используются следующие компиляторы:

      $ /usr/bin/clang --version
Apple clang version 12.0.0 (clang-1200.0.32.27)
Target: arm64-apple-darwin20.1.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

Затем ниндзя может успешно построить clang, clang++ и среду выполнения OpenMp и установить их. (Проще говоря, изображения Arm64 нацелены на Arms64)

      $ file ~/software/clang-12.0.0/arm64/bin/clang
/Users/jcownie/software/clang-12.0.0/arm64/bin/clang: Mach-O 64-bit executable arm64
$ ~/software/clang-12.0.0/arm64/bin/clang --version
clang version 12.0.0 (https://github.com/llvm/llvm-project.git 879c15e890b4d25d28ea904e92497f091f796019)
Target: aarch64-apple-darwin20.1.0
Thread model: posix
InstalledDir: /Users/jcownie/software/clang-12.0.0/arm64/bin

Все это выглядит разумно, за исключением того, что когда я пытаюсь что-либо скомпилировать с ними, им не хватает пути включения для получения системных заголовков.

      $ ~/software/clang-12.0.0/arm64/bin/clang hello.c
hello.c:1:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
         ^~~~~~~~~
1 error generated.

Итак, после всего этого,

  1. Кто-нибудь знает, как исправить эту проблему с включенным путем?
  2. Кто-нибудь знает, как настроить и собрать толстый двоичный файл для компиляторов (и библиотек), чтобы встроенный компилятор x86_64 нацелился на x86_64 и двоичный файл aarch64 aarch64? (Это то, что делают Xcode clang и clang ++ ...) Моя попытка закончилась получением толстого двоичного файла компилятора, в котором обе архитектуры нацелены на x86_64 :-(

Спасибо

3 ответа

Вы можете установить -DDEFAULT_SYSROOT=/path/to/MacOSX11.1.sdk во время сборки или делать export SDKROOT=/path/to/MacOSX11.1.sdk во время выполнения.

Вам нужно скомпилировать с clang -arch arm64 -arch x86_64чтобы получить жирный двоичный файл из clang. Это нужно сделать и для Apple clang.

ОБНОВЛЕНО 8 февраля 2021 г. Homebrew теперь поддерживает машины Arm на базе M1, поэтому использование этого ответа будет лучшим решением, чем приведенный ниже. Приведенная ниже информация потенциально все еще полезна, если вы хотите сделать это самостоятельно, но используя brew скорее всего будет намного проще.

Предварительно заварить ответ

Я не нашел чистого решения, но на случай, если оно кому-то поможет, у меня есть ужасный взлом.

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

      # Xcode, Ninja
BUILD_SYSTEM=Ninja
BUILD_TAG=ninja
INSTALLDIR=$HOME/software/clang-12.0.0/arm64

cmake ../llvm \
      -G$BUILD_SYSTEM -B ${BUILD_TAG}_build \
      -DCMAKE_OSX_ARCHITECTURES='arm64' \
      -DCMAKE_C_COMPILER=`which clang` \
      -DCMAKE_CXX_COMPILER=`which clang++` \
      -DCMAKE_BUILD_TYPE=Release \
      -DCMAKE_INSTALL_PREFIX=$INSTALLDIR \
      -DLLVM_LOCAL_RPATH=$INSTALLDIR/lib \
      -DLLVM_ENABLE_WERROR=FALSE \
      -DLLVM_TARGETS_TO_BUILD='AArch64' \
      -DLLVM_DEFAULT_TARGET_TRIPLE='aarch64-apple-darwin20.1.0' \
      -DDEFAULT_SYSROOT="$(xcrun --show-sdk-path)" \
      -DLLVM_ENABLE_PROJECTS='clang;openmp;polly;clang-tools-extra;libcxx;libcxxabi' \
#      -DLLVM_ENABLE_PROJECTS='clang;openmp;polly' 

Это дает компилятору, который находит правильные заголовки, но не может успешно связываться, если используется OpenMP, потому что он не передает какой-либо полезный путь -L и не добавляет необходимый rpath.

Чтобы преодолеть это, я создал небольшой сценарий оболочки, который находится в моем ~/bin, в передней части моего $PATH, который добавляет эти дополнительные флаги компоновщика.

      #
# A truly awful hack, but it seems necessary.
# Install this with execute permissions as clang and clang++ in
# a directory early in your path, so that it is executed when clang or
# clang++ is needed.
#
# For brew...
INSTALLDIR=/usr/local/opt/llvm
# For a local build.
INSTALLDIR=${HOME}/software/clang-12.0.0/arm64/

# Find out the name of this file, and then invoke the same file in the
# compiler installation, adding the necessary linker directives
CMD=`echo $0 | sed "s/\/.*\///"`
${INSTALLDIR}/bin/${CMD} -L${INSTALLDIR}/lib -Wl,-rpath,${INSTALLDIR}/lib $*

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

Мне удалось собрать -DDEFAULT_SYSROOT="$(xcrun --show-sdk-path)" -DCMAKE_INSTALL_PREFIX= / Users / foo / lokal / и установить в путь lokal / bin lokal / lib. Как только это будет сделано, вы можете использовать LD_LIBRARY_PATH = / Users / foo / lokal / lib, и все библиотеки должны быть найдены без использования чего-либо, связанного с rpath.

Другие вопросы по тегам