Сборка металлиба с помощью CMake

У меня есть файлы .metal, и я хочу скомпилировать их в .metallib. Вся система сборки использует CMake, и я собираюсь использовать ее также для компиляции .metal.

Для создания .metallib я должен использовать следующие две команды:

xcrun -sdk macosx metal -c MyLibrary.metal -o MyLibrary.air
xcrun -sdk macosx metallib MyLibrary.air -o MyLibrary.metallib

Есть ли какой-нибудь удобный способ сделать это с помощью CMake, где я могу установить компилятор, а CMake все сделает автоматически? Или мне следует использовать add_custom_command и вручную вызывать xcrun?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
818
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

TL; DR Оба подхода, с использованием пользовательских команд / целей и добавлением нового языка, допустимы. Выбор, кажется, зависит от компромиссов между возможностью повторного использования, диапазоном распространения, целевыми пользователями и т. д. Лично я изначально выбрал первое.


При этом, если вы выберете метод add_custom_command / add_custom_target, он может уйти довольно далеко. Просто убедитесь, что вы указали фактические цели и связали их с OUTPUT пользовательских команд, чтобы иметь возможность установить правильные зависимости и избежать ненужного повторного выполнения целей, когда зависимости все еще актуальны. Например,

set(FOO_FILE "foo.txt")

add_custom_command(OUTPUT ${FOO_FILE}
  COMMAND ${CMAKE_COMMAND} -E touch ${FOO_FILE}
  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
  COMMENT "Creating ${FOO_FILE}"
  VERBATIM)

add_custom_target(foo DEPENDS ${FOO_FILE})

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

Однако исследование реального языка, поддерживаемого CMake, может быть полезным. Я бы посоветовал заглянуть в каталог CMake Modules для поиска CUDA (это заставит вас также заглянуть в подкаталоги Compiler и Platform).

ПРИМЕЧАНИЕ: Покопавшись в списке рассылки, я наткнулся на этот нить, в котором упоминается, что второй подход может не работать так хорошо с генераторами, не основанными на Makefile. Это неясно из потока (или существующей документации), и я не могу попробовать, поскольку я не использую CMake с помощью такого инструмента (например, MSVC или Xcode).

Спасибо! В итоге я использовал add_custom_command и add_custom_target. Для каждого файла .metal я установил add_custom_command для создания .air. А затем я определяю собственную команду для создания .metallib.

M.S. 27.08.2018 15:04

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