У меня есть файлы .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?





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.