Полное руководство: Настройка 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 и правильными спецификациями целевой платформы.
Содержание
- Понимание проблемы
- MSYS2 Clang против нативного Windows Clang
- Правильная настройка GN для Skia с Clang
- Настройка среды и зависимости
- Решения для настройки сборки
- Устранение распространенных проблем
Понимание проблемы
При сборке 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
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
"
Ключевые элементы конфигурации:
- Пустые пути MSVC: Установка
win_vc=""иwin_sdk=""предотвращает использование GN инструментария MSVC - Явные пути к компиляторам: Использование полных путей к исполняемым файлам Clang гарантирует использование правильной версии
- Инструментарий GNU: Указание
ld="ld"гарантирует использование компоновщика GNU вместо компоновщика MSVC - Базовый путь Clang: Указывает на каталог установки MSYS2 Clang
Как упоминается в документации Skia, вы можете передать пути VC и SDK в GN, установив переменные win_vc и win_sdk. Установив их в пустые строки, вы эффективно отключаете обнаружение инструментария MSVC.
Настройка среды и зависимости
Настройка среды MSYS2
- Установите MSYS2 с msys2.org
- Обновите пакеты:bash
pacman -Syu pacman -Su
- Установите инструментарий Clang:bash
pacman -S --needed base-devel mingw-w64-x86_64-toolchain mingw-w64-x86_64-clang
Переменные окружения
Установите эти переменные окружения перед запуском GN:
export CC=clang
export CXX=clang++
export PATH="/c/msys64/clang64/bin:$PATH"
Проверка установки
Проверьте вашу установку Clang:
clang --version
# Должно показать: Target: x86_64-w64-windows-gnu
Как показано в примере сборки Stockfish, установка MSYS2 Clang должна показывать Target: x86_64-w64-windows-gnu для подтверждения использования GNU ABI.
Решения для настройки сборки
Решение 1: Полная переопределение инструментария
Создайте пользовательский файл инструментария для GN:
# 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:
gn gen out/clang --args="import(\"//path/to/custom_clang_toolchain.gni\")"
Решение 2: Конфигурация на основе среды
Создайте скрипт для правильной настройки среды:
#!/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:
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:
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.
Источники
- Документация Skia - Как собрать Skia
- Документация сред MSYS2
- Проблемы сборки Stockfish с MSYS2 и Clang
- Понимание различных версий Clang в Windows
- Сборка Skia в Windows 32-бит - Stack Overflow
- Начало работы с Clang и Visual Studio Code в Windows с MSYS2
- Как компилировать с clang и mingw-w64? - Stack Overflow
Заключение
Успешная настройка Google GN для использования Clang вместо MSVC для компиляции Skia в Windows с MSYS2 требует тщательного внимания к нескольким ключевым факторам:
- Полностью отключите инструментарий MSVC, установив пустые пути для
win_vcиwin_sdk - Используйте явное указание целевой платформы с
x86_64-w64-windows-gnuдля обеспечения правильного GNU ABI - Настройте все компоненты инструментария, включая компилятор, компоновщик и архиватор
- Настройте правильную среду MSYS2 с правильной установкой Clang
- Добавьте необходимые флаги компилятора для обработки специфичных для Windows требований компиляции
Наиболее надежный подход - создать пользовательскую конфигурацию инструментария, которая полностью переопределяет обнаружение стандартного инструментария Windows. Это гарантирует, что GN генерирует файлы сборки, последовательно использующие Clang с GNU ABI на протяжении всего процесса сборки.
Для достижения наилучших результатов начните с предоставленной полной конфигурации аргументов GN и устраните любые оставшиеся проблемы, проверяя каждый компонент вашей настройки инструментария. Помните, что Skia показывает значительно лучшую производительность при сборке с Clang, а не с другими компиляторами, что делает усилия по этой настройке worthwhile для достижения оптимальной производительности.