Поделиться через


Выбор функций LLVM

Установка библиотеки

Мы рассмотрим llvm в качестве примера. Его можно установить с помощью:

> vcpkg install llvm

или с помощью манифеста с помощью:

{
  "dependencies": ["llvm"]
}

После установки llvm мы можем выполнить следующее:

> installed\x86-windows\bin\llc.exe --version

Мы видим:

  Registered Targets:
    x86    - 32-bit X86: Pentium-Pro and above
    x86-64 - 64-bit X86: EM64T and AMD64

Установка дополнительных функций

Но llvm поддерживает гораздо больше целевых объектов, от ARM до SPARC до SystemZ. Однако, очевидно, что текущая установка не включает ARM в качестве целевого объекта; Таким образом, нам нужно узнать, как vcpkg позволяет устанавливать другие целевые объекты LLVM. Порт llvm позволяет использовать эти функции с помощью функций target-*.

Если мы делаем:

> vcpkg search llvm

Мы видим:

llvm                 10.0.0#6         The LLVM Compiler Infrastructure
llvm[clang]                           Build C Language Family Front-end.
llvm[clang-tools-extra]               Build Clang tools.
...
llvm[target-all]                      Build with all backends.
llvm[target-amdgpu]                   Build with AMDGPU backend.
llvm[target-arm]                      Build with ARM backend.
...

Мы можем установить любой из этих целевых объектов с помощью синтаксиса компонента установки:

> vcpkg install llvm[target-arm] # Installs LLVM with the ARM target
{
  "dependencies": [{ "name": "llvm", "features": ["target-arm"] }]
}

Отказ от функций по умолчанию

Порт llvm включает несколько функций по умолчанию, которые вы можете использовать как пользователь, возможно, не требуется: например, clang эта функция используется по умолчанию, что означает, что vcpkg install llvm также будет выполнять сборку и установку clang. Если вы пишете компилятор, использующий LLVM в качестве серверной части, скорее всего, вы не заинтересованы в установке clang, и мы можем сделать это, отключив функции по умолчанию со специальными core функциями:

> vcpkg install llvm[core,target-arm] # removing the default-feature with "core" also removes all of the default targets you get

или в файлах манифеста:

{
  "dependencies": [{
    "name": "llvm",
    "default-features": false,
    "features": ["target-arm"]
  }]
}