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).