Другое

Полное руководство: Настройка GN с Clang для Skia в MSYS2

Узнайте, как правильно настроить Google GN для использования Clang вместо MSVC для компиляции Skia в Windows с MSYS2. Исправьте ошибки компилятора и оптимизируйте сборку с помощью этого полного пошагового руководства.

Как настроить Google GN для использования Clang вместо MSVC при компиляции Skia в Windows под MSYS2? Несмотря на установку аргументов cc=‘clang’ и cxx=‘clang++’, GN генерирует файлы Ninja, которые всё ещё используют MSVC cl.exe, что приводит к сбоям сборки из-за недопустимых опций компилятора, таких как ‘/Wno-attributes’.

Настройка Google GN для использования Clang вместо MSVC для компиляции Skia в Windows с MSYS2

Чтобы настроить Google GN на использование Clang вместо MSVC для компиляции Skia в Windows с MSYS2, необходимо правильно настроить среду MSYS2 Clang и передать GN определенные аргументы, которые переопределяют обнаружение стандартного инструментария Windows. Проблема возникает потому, что GN по умолчанию использует MSVC в Windows, что требует явной настройки для использования MSYS2 Clang с GNU ABI и правильными спецификациями целевой платформы.

Содержание


Понимание проблемы

При сборке Skia в Windows с использованием GN система сборки автоматически обнаруживает и использует MSVC в качестве компилятора по умолчанию. Это происходит потому, что обнаружение инструментария Windows в GN отдает приоритет MSVC при запуске на системах Windows. Ошибка, с которой вы сталкиваетесь с недопустимыми опциями компилятора, такими как /Wno-attributes, возникает потому, что это флаги, специфичные для MSVC, которые не работают с Clang.

Согласно документации Skia, “Skia использует сгенерированный код, который оптимизируется только при сборке Skia с использованием clang. Другие компиляторы получают неоптимизированный универсальный код”. Это делает правильную настройку Clang необходимой для оптимальной производительности Skia.

Основная проблема заключается в том, что даже при установке cc='clang' и cxx='clang++' в аргументах GN, инструментарий Windows все равно переопределяет эти настройки с конфигурациями, специфичными для MSVC.


MSYS2 Clang против нативного Windows Clang

Существуют важные различия между доступными вариантами Clang в Windows, которые необходимо понимать:

Нативный Windows Clang

  • Использует ABI и библиотеки MSVC
  • Совместим с инструментарием Visual Studio
  • Компоновщик по умолчанию - компоновщик MSVC
  • Целевая платформа - Windows с временем выполнения MSVC

MSYS2 Clang

  • Использует ABI и библиотеки GNU
  • Совместим с инструментарием MinGW-w64
  • Компоновщик по умолчанию - GNU ld
  • Целевая платформа - Windows с временем выполнения GNU (glibc или ucrt)
  • Определяет флаги __GNUC__ вместо _MSC_VER

Как указано в документации MSYS2, “Хотя в средах MINGW также существует пакет Clang, он все равно использует компоновщик GNU и библиотеку GNU C++”.

Ключевое различие в информации о версии показывает:

  • Нативный Windows Clang: Target: x86_64-pc-windows-msvc
  • MSYS2 Clang: Target: x86_64-w64-windows-gnu

Это различие имеет решающее значение, поскольку система сборки Skia должна быть настроена на распознавание и правильную обработку варианта MSYS2 Clang.


Правильная настройка GN для Skia с Clang

Чтобы успешно настроить GN на использование MSYS2 Clang для компиляции Skia, необходимо переопределить несколько аспектов конфигурации стандартного инструментария Windows:

Требуемые аргументы GN

bash
gn gen out/clang --args="
is_debug=false
target_cpu=\"x86_64\"
use_clang=true
win_vc=\"\"
win_sdk=\"\"
cc=\"clang\"
cxx=\"clang++\"
ld=\"ld\"
ar=\"llvm-ar\"
strip=\"llvm-strip\"
clang_base_path=\"C:/msys64/clang64\"
clang_use_chrome_plugins=false
treat_warnings_as_errors=false
skia_use_system_libpng=false
skia_use_system_libjpeg=false
skia_use_system_icu=false
"

Ключевые элементы конфигурации:

  1. Пустые пути MSVC: Установка win_vc="" и win_sdk="" предотвращает использование GN инструментария MSVC
  2. Явные пути к компиляторам: Использование полных путей к исполняемым файлам Clang гарантирует использование правильной версии
  3. Инструментарий GNU: Указание ld="ld" гарантирует использование компоновщика GNU вместо компоновщика MSVC
  4. Базовый путь Clang: Указывает на каталог установки MSYS2 Clang

Как упоминается в документации Skia, вы можете передать пути VC и SDK в GN, установив переменные win_vc и win_sdk. Установив их в пустые строки, вы эффективно отключаете обнаружение инструментария MSVC.


Настройка среды и зависимости

Настройка среды MSYS2

  1. Установите MSYS2 с msys2.org
  2. Обновите пакеты:
    bash
    pacman -Syu
    pacman -Su
    
  3. Установите инструментарий Clang:
    bash
    pacman -S --needed base-devel mingw-w64-x86_64-toolchain mingw-w64-x86_64-clang
    

Переменные окружения

Установите эти переменные окружения перед запуском GN:

bash
export CC=clang
export CXX=clang++
export PATH="/c/msys64/clang64/bin:$PATH"

Проверка установки

Проверьте вашу установку Clang:

bash
clang --version
# Должно показать: Target: x86_64-w64-windows-gnu

Как показано в примере сборки Stockfish, установка MSYS2 Clang должна показывать Target: x86_64-w64-windows-gnu для подтверждения использования GNU ABI.


Решения для настройки сборки

Решение 1: Полная переопределение инструментария

Создайте пользовательский файл инструментария для GN:

python
# custom_clang_toolchain.gni
import("//build/toolchain/gcc.gni")

toolchain("clang") {
  compiler_prefix = ""
  cc = "clang"
  cxx = "clang++"
  ld = "ld"
  ar = "llvm-ar"
  strip = "llvm-strip"
  
  # Переопределение стандартного поведения
  is_clang = true
  use_goma = false
  
  # Добавление необходимых флагов для Clang
  cflags = [
    "-target",
    "x86_64-w64-windows-gnu",
    "-Wno-attributes",
    "-fms-extensions",
    "-fno-exceptions",
  ]
  
  ldflags = [
    "-target",
    "x86_64-w64-windows-gnu",
    "--no-undefined",
  ]
}

Затем ссылайтесь на этот инструментарий в аргументах GN:

bash
gn gen out/clang --args="import(\"//path/to/custom_clang_toolchain.gni\")"

Решение 2: Конфигурация на основе среды

Создайте скрипт для правильной настройки среды:

bash
#!/bin/bash
# build_skia_clang.sh

# Настройка среды
export CC=clang
export CXX=clang++
export PATH="/c/msys64/clang64/bin:$PATH"

# Генерация файлов сборки
gn gen out/clang --args="
is_debug=false
target_cpu=\"x86_64\"
use_clang=true
win_vc=\"\"
win_sdk=\"\"
cc=\"clang\"
cxx=\"clang++\"
ld=\"ld\"
ar=\"llvm-ar\"
strip=\"llvm-strip\"
clang_base_path=\"C:/msys64/clang64\"
clang_use_chrome_plugins=false
treat_warnings_as_errors=false
skia_use_system_libpng=false
skia_use_system_libjpeg=false
skia_use_system_icu=false
extra_cflags=[\"-target\", \"x86_64-w64-windows-gnu\"]
extra_ldflags=[\"-target\", \"x86_64-w64-windows-gnu\"]
"

# Сборка
ninja -C out/clang

Решение 3: Аргументы GN с указанием целевой платформы

Если вы предпочитаете хранить все в аргументах GN:

bash
gn gen out/clang --args="
is_debug=false
target_cpu=\"x86_64\"
use_clang=true
win_vc=\"\"
win_sdk=\"\"
cc=\"clang\"
cxx=\"clang++\"
ld=\"ld\"
ar=\"llvm-ar\"
strip=\"llvm-strip\"
clang_base_path=\"C:/msys64/clang64\"
clang_use_chrome_plugins=false
treat_warnings_as_errors=false
skia_use_system_libpng=false
skia_use_system_libjpeg=false
skia_use_system_icu=false
extra_cflags=[\"-target\", \"x86_64-w64-windows-gnu\", \"-Wno-attributes\"]
extra_ldflags=[\"-target\", \"x86_64-w64-windows-gnu\"]
toolchain=\"//build/toolchain/clang:clang\"
"

Устранение распространенных проблем

Проблема 1: GN все еще использует MSVC

Проблема: GN продолжает генерировать файлы сборки на основе MSVC, несмотря на конфигурацию.

Решение: Убедитесь, что вы полностью отключили пути MSVC, установив win_vc="" и win_sdk="". Также проверьте, что ваша установка Clang находится в PATH и доступна.

Проблема 2: Конфликты флагов компилятора

Проблема: Получение ошибок о несовместимых флагах компилятора, таких как /Wno-attributes.

Решение: Это происходит, когда все еще применяются флаги MSVC. Добавьте явный -Wno-attributes в extra_cflags и убедитесь, что целевая платформа правильно указана как x86_64-w64-windows-gnu.

Проблема 3: Проблемы с компоновщиком

Проблема: Ошибки компоновщика или неопределенные символы.

Решение: Убедитесь, что вы используете компоновщик GNU (ld) и правильные флаги целевой платформы как в флагах компилятора, так и в флагах компоновщика.

Проблема 4: Проблемы с путями к библиотекам

Проблема: Отсутствующие библиотеки или неправильные пути к библиотекам.

Решение: Добавьте необходимые пути к библиотекам MSYS2 в ваши extra_ldflags:

bash
extra_ldflags=[
  "-target",
  "x86_64-w64-windows-gnu",
  "-L/c/msys64/clang64/lib",
  "-L/c/msys64/mingw64/lib"
]

Проблема 5: Совместимость ABI

Проблема: Ошибки времени выполнения или совместимости ABI.

Решение: Убедитесь в последовательном использовании либо времени выполнения GNU, либо MSVC. При использовании MSYS2 Clang вы используете время выполнения GNU, поэтому избегайте смешивания с библиотеками, скомпилированными под MSVC.


Источники

  1. Документация Skia - Как собрать Skia
  2. Документация сред MSYS2
  3. Проблемы сборки Stockfish с MSYS2 и Clang
  4. Понимание различных версий Clang в Windows
  5. Сборка Skia в Windows 32-бит - Stack Overflow
  6. Начало работы с Clang и Visual Studio Code в Windows с MSYS2
  7. Как компилировать с clang и mingw-w64? - Stack Overflow

Заключение

Успешная настройка Google GN для использования Clang вместо MSVC для компиляции Skia в Windows с MSYS2 требует тщательного внимания к нескольким ключевым факторам:

  1. Полностью отключите инструментарий MSVC, установив пустые пути для win_vc и win_sdk
  2. Используйте явное указание целевой платформы с x86_64-w64-windows-gnu для обеспечения правильного GNU ABI
  3. Настройте все компоненты инструментария, включая компилятор, компоновщик и архиватор
  4. Настройте правильную среду MSYS2 с правильной установкой Clang
  5. Добавьте необходимые флаги компилятора для обработки специфичных для Windows требований компиляции

Наиболее надежный подход - создать пользовательскую конфигурацию инструментария, которая полностью переопределяет обнаружение стандартного инструментария Windows. Это гарантирует, что GN генерирует файлы сборки, последовательно использующие Clang с GNU ABI на протяжении всего процесса сборки.

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

Авторы
Проверено модерацией
Модерация