Как установить clang linux

Как установить clang linux

Руководство по сборке и установке LLVM на Windows и Linux. Знакомит с примерами и утилитами в составе LLVM.

Содержание

Ключевые шаги установки:

  • получить или собрать LLVM с библиотеками, заголовками и утилитами
  • запустить утилиту llvm-config
  • полученные флаги добавить в настройки проекта или скрипты сборки
  • изучить Kaleidoscope, llc и другие примеры кода в составе пакета исходных кодов LLVM

Установка бинарных пакетов в Linux

В большинстве дистрибутивов GNU/Linux все библиотеки и утилиты LLVM доступны в предсобранном виде. Более того, на странице apt.llvm.org доступны постоянно обновляемые репозитории для Debian и Ubuntu.

  • Для версии LLVM 5.0 необходимые для разработчика пакеты будут следующими: llvm-5.0 llvm-5.0-dev llvm-5.0-runtime clang-5.0 .
  • Также можно установить пакеты без явного номера версии, получив привязанную к выпуску дистрибутива версию LLVM/Clang.

Установка бинарных пакетов в Windows

Для Windows проект LLVM/Clang предоставляет инсталлятор Clang, найти который можно на странице releases.llvm.org. К сожалению, инсталлятор не предоставляет библиотек и заголовочных файлов LLVM. Для работы с API LLVM, а не с утилитами, потребуется собрать LLVM самостоятельно.

Установить библиотеки LLVM можно с помощью пакетного менеджера NuGet в составе Visual Studio, нужный пакет есть на странице nuget.org/packages/LLVMLibs

Сборка через CMake

  • Загрузить архив исходников можно на странице releases.llvm.org
  • На сайте LLVM есть детальная инструкция по работе с CMake: llvm.org/docs/CMake.html

CMake используется как основная система сборки для LLVM на всех системах.

CMake представляет собой целый пакет программ и утилит. Система сборки реализуется утилитой командной строки — cmake.exe на Windows и cmake на UNIX. CMake не умеет собирать исходный код самостоятельно и генерирует входные файлы для другой системы сборки, такой как GNU Make (на Linux), xcodebuild (на MacOSX) или msbuild (на Windows)

  • для сборки под Windows или MacOSX разработчик генерирует проекты для Visual Studio или XCode соответственно, и затем собирает привычным способом
  • для сборки под Linux разработчик генерирует Makefile и запускает make

Примеры вызова утилиты cmake:

Сборка и установка на Windows

Допустим, вы распаковали исходный код LLVM в каталог llvm-src на Windows с Visual Studio 2017. Тогда можно создать каталоги llvm-build и llvm-install, и из каталога llvm-build вызвать:

  • После откройте LLVM.sln в Visual Studio и соберите либо весь Solution, либо проекты llc и llvm-config.
  • Для установки LLVM в каталог llvm-install соберите мета-проект CMakePredefinedTargets\PACKAGE

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

Для установки собранного LLVM лучше всего использовать checkinstall, который, в отличии от make install, создаст нормальный Debian-пакет, который затем можно удалить. При запуске checkinstall без параметров утилита сама предложит ввести название пакета, версию, описание и другие атрибуты, а в конце соберёт deb-пакет и установит его.

Чтобы избежать сюрпризов, можно явно указать параметры генерации пакета. Команда, приведённая ниже, создаст и установит пакет llvm-custom:

Утилита llvm-config

Утилита llvm-config хранит жёстко зашитые при сборке параметры собранного дистрибутива LLVM.

При вызове с параметром —includedir утилита выводит путь к заголовочным файлам LLVM, который можно добавить в настройки проекта или скрипты сборки.

При вызове с параметром —libs утилита выводит список доступных для компоновщика библиотек LLVM, оформленный в виде флагов GCC-совместимого компоновщика.

  • Для подключения библиотек к проекту Visual Studio вы можете
    1. скопировать полученный от llvm-config список в текстовый редактор
    2. с помощью Find/Replace заменить формат -lAA -lBB на AA.lib\nBB.lib\n
    3. добавить изменённый список в настройки проекта в раздел “Linker->Input”
  • Не пытайтесь скопировать список из примера выше: на вашей системе он может отличаться
Читайте также:  Android and windows compatibility

При вызове без параметров утилита выдаёт справку:

Изучаем дистрибутив LLVM

Язык LLVM-IR

LLVM-IR — это промежуточный язык компиляторов, использующих библиотеки LLVM, именно с ним работают ключевые подсистемы LLVM. Язык поддерживает:

  • инструкции, близкие к ассемблерным
  • функции с параметрами и возвращаемым значением и их атрибуты
  • структуры и массивы
  • примитивные типы, например, целые числа от i1 (1-битное) до i64 (64-битное)
  • в присваивании участвуют не переменные, а регистры — считается, что в LLVM бесконечно много регистров
  • имена регистров локальные для функции, обычно генератор кода генерирует имена с помощью возрастающего ряда чисел
  • присваивать регистр может только одна инструкция в пределах функции, для присваивания в цикле потребуется снова прыгнуть на эту инструкцию

В языке нет ни выражений, ни ООП, поскольку из LLVM-IR без излишних преобразований генерируется машинный код. Оптимизаторы кода в составе LLVM работают именно с LLVM-IR.

Пример Kaleidoscope

В состав дистрибутива LLVM включён пример Kaleidoscope (см. каталоги и проекты Kaleidoscope, Kaleidoscope-Ch2, Kaleidoscope-Ch3 и так далее). Для этих же примеров есть актуальные статьи на английском языке: llvm.org/docs/tutorial.

Пример реализует полноценный компилятор с кодогенерацией через LLVM. Особенности примера:

  • фронтенд компилятора сильно упрощён, лексер и парсер написаны вручную
  • для простоты примера используются глобальные переменные, от которых легко избавиться средствами ООП
  • бекенд компилятора построен на библиотеках LLVM, для генерации и обработки промежуточного кода использует API библиотек LLVM
  • есть поддержка выражений (включая if-выражение, эквивалентное тернарному оператору)
  • есть поддержка инструкции for
  • есть поддержка вызова внешних функций, написанных на языке C
  • показан полный цикл кодогенерации, включая генерацию отладочной информации

Утилита llc

Утилита llc получает на вход LLVM-IR код и создаёт машинный код. Благодаря этому она служит прекрасным примером для создания финальной стадии бекенда: генератора машинного кода.

  • код прост и понятен, и не содержит внутренней логики обработки данных
  • в своём проекте алгоритм можно упростить ещё сильнее, убрав обработку ненужных вашему компилятору опций командной строки
  • исходный код незначительно меняется от версии к версии в связи с изменениями в LLVM API

Компиляция из C/C++ в LLVM-IR

Компилятор clang способен компилировать из C/C++ в текстовое представление LLVM-IR, что позволяет исследовать способы генерации кода из различных высокоуровневых конструкций. По умолчанию clang компилирует без оптимизаций, то есть сгенерированный при обходе AST код не искажается проходами оптимизатора.

Источник

Clang. Часть 1: введение

Что такое Clang?

Я провёл последние несколько месяцев, работая с Clang, фронтендом LLVM. Clang умеет парсить и анализировать любой исходный код на языках семейства С (C, C++, ObjectiveC, и т.п. ) и имеет удивительную модульную структуру, которая делает его простым в использовании.

Если вы ищете статический анализатор кода, я настоятельно рекомендую Clang, он существенно превосходит другие статические анализаторы (такие, как CIL. ) и хорошо документирован. Также список рассылки Clang очень активен и полезен, если вы застряли на чём-то.

Лично я использую Clang для статического анализа драйверов ввода-вывода ядра Linux, включая драйвера камеры и драйвера DRM графической карты. Код ядра, особенно код драйвера, может быть очень сложным и трудным для анализа, но Clang позволяет нам легко поддерживать его. Давайте посмотрим, что можно сделать с его помощью.

Читайте также:  Обновление для microsoft windows kb976902 что это такое

Как работает Clang?

В большинстве случаев, Clang запустит препроцессор (который разворачивает все макросы) и парсит исходник, превращая его в абстрактное синтаксическое дерево (AST). C AST работать гораздо проще, чем с исходным кодом, но вы всегда можете получить ссылки на исходник. Фактически, каждая структура в Clang-е, используемая для представления кода (AST, CFG и т.п.), всегда имеет ссылку на оригинальный исходник, полезный для целей анализа, рефакторинга и т.п.

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

Clang AST

Практически каждый компилятор и статический анализатор использует AST для представления исходного кода. AST, используемое в Clang, очень детализированное и сложное, но вы получите удовольствие, изучая различные классы элементов Clang AST. Ниже приводится краткое введение в Clang AST, но самый простой путь изучить его, это просто делать дампы AST для простых исходников, и смотреть, какое AST им соответствует.

В общем, Clang AST сделано из двух очень гибких классов: Decl и Stmt. У обоих есть множество подклассов, вот несколько примеров:

FunctionDecl — прототип или объявление функции
BinaryOperator — бинарный оператор, например (a + b)
CallExpr — вызов функции, например, foo(x);

Большинство классов имеют «говорящие» имена, например, ForStmt, IfStmt, и ReturnStmt. Вы поймёте суть AST, поиграв с ним несколько минут. Вы можете найти документацию по классам AST, поискав что-либо вроде “Clang FunctionDecl.”

Как использовать Clang?

Clang может использоваться как прямая замена gcc и предлагает несколько крутых инструментов статического анализа. Как программист (а не как нормальный пользователь!), вы можете получить доступ к всей мощи clang, используя его как библиотеку одним из трёх способов, в зависимости от того, как вы решите.

Для начала, ознакомьтесь с описанием интерфейсов clang. В дополнение к тому, что написано в этом описании, я выделю другие существенные различия между различными интерфейсами clang.

Clang Plugin

Ваш код является плагином, и запускается каждый раз заново для каждого файла исходника, что означает, что вы не можете сохранять глобальную информацию или другую контекстную информацию между двумя разными исходными файлами (но вы можете запустить плагин для множества файлов последовательно). Плагин запускается путём передачи соответствующих опций системе компиляции (Clang, Make и т.п.) через аргументы командной строки. Это похоже на то, как вы включаете оптимизацию в GCC (т.е. «-O1»). Вы не можете запустить какую-либо свою задачу до или после того, как исходный файл будет проанализирован.

LibTooling (Clang Tool)

Ваш код — обычная программа на С++, с нормальной функцией main(). LibTooling используется для запуска некоторого анализа на исходном коде (с множеством файлов, при желании) без запуска обычного процесса компиляции. Новый экземпляр кода для анализа (и новый AST) будет создан для каждого нового файла исходника (как и в случае Clang Plugin), но вы можете сохранять контекстную информацию между файлами исходников в своих глобальных переменных. Так как у вас есть функция main(), вы можете запускать какие-либо задачи перед или после того, как clang завершит анализ ваших исходных файлов.

LibClang

LibClang хорош тем, что это стабильный API. Clang периодически меняется, и если вы используете Plugin или Libtooling, вам нужно будет править ваш код, чтобы отслеживать эти изменения (но это не так сложно!). Если вам нужен доступ к Clang API из языков, отличных от C++ (например, из Python), вы должны использовать LibClang.

Примечание: LibClang не даёт полный доступ к AST (только высокоуровневый доступ), но другие два варианта дают. Как правило, нам нужен полный доступ к AST.

Читайте также:  Windows server 2012 безопасная загрузка

Если вы не можете решить, что использовать, я бы порекомендовал начать с интерфейса LibTooling. Он проще, и работает так, как вы ожидаете. Он предлагает гибкость и полный доступ к AST, как и Plugin, без потери глобального контекста между исходными файлами. LibTooling не сложнее в использовании, чем Plugin.

Начинаем работать с Clang

Сейчас, когда вы знаете основы, давайте начнём! Эта инструкция будет работать на любой версии Linux (и, возможно, OS X), но тестировалось на Ubuntu. Вы можете получить LLVM и Clang, проделав следующие шаги (взято из официальной инструкции к Clang):

Скачать и установить (например, с помощью apt-get) все необходимые пакеты.
(Типичный дистрибутив Linux идёт со всем необходимым, кроме subversion).
Смените директорию на ту, в которую вы хотите установить LLVM (например,

/static_analysis/). Будем называть её директорией верхнего уровня. Выполните следующие команды в терминале:

Компиляция LLVM и Clang займёт некоторое время.

Для проверки запустите:

Можно протестировать Clang, запустив классический пример Hello World:

В этом руководстве я использую Clang 3.4 на Ubuntu 13.04, но вы можете использовать другие варианты и того, и другого.

Сейчас перейдём к программированию на Clang.

Источник

Как установить clang linux

This script installs self-contained standalone 9.0 versions of clang, LLVM, libc++, compiler-rt, libc++abi, lldb, and lld, on macOS and Linux, including linking clang and LLVM against libc++ themselves as well. The script keeps all of the installation within a given target prefix (e.g., /opt/clang ), and hence separate from any already installed compilers, libraries, and include files. In particular, you can later uninstall everything easily by just deleting, e.g., /opt/clang . Furthermore, as long as the prefix path is writable, the installation doesn’t need root privileges.

If you have used older version of this script before, see News below for changes.

To see the available options, use -h :

For example, to build Clang on a machine with multiple cores and install it in /opt/clang , you can use:

Once finished, just prefix your PATH with

By default, install-clang currently installs the 9.0 release branch of https://github.com/llvm (the «mono repository»). Adding -m on the command line instructs the script to use the current git master version instead. The script downloads the source code from GitHub and compiles the pieces as needed. Other OSs than macOS and Linux are not currently supported.

The script also has an update option -u that allows for catching up with upstream repository changes without doing the complete compile/install-from-scratch cycle again. Note, however, that unless coupled with -m , this flag has no immediate effect since the git versions to use are hardcoded to the Clang/LLVM release version.

Doing a self-contained Clang installation is a bit more messy than one would hope because the projects make assumptions about specific system-wide installation paths to use. The install-clang script captures some trial-and-error I (and others) went through to get an independent setup working. It compiles Clang up to three times, bootstrapping things with the system compiler as it goes. It also patches some of the Clang/LLVM projects to incorporate the installation prefix into configuration and search paths, and also fixes/tweaks a few other things as well.

install-clang comes with a Dockerfile to build a Docker image, based on Ubuntu, with Clang then in /opt/clang:

Источник

Оцените статью