我有一些.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
?
答案 0 :(得分: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功能(即不与特定项目绑定)。为此,您需要定义语言的各个方面,例如编译器和用于处理源文件的规则。除此之外,特征检测和测试通常也落在这里。有关更多详细文档,请查看here。
但是,调查CMake支持的实际语言可能会有所帮助。我建议您在CMake的Modules
目录下查找CUDA(这也将使您也可以查看Compiler
和Platform
子目录)。
注意:在浏览邮件列表时,我碰到了这个thread,其中提到第二种方法可能不适用于非基于Makefile的生成器。从线程(或现有文档)尚不清楚,由于我没有通过此类工具(例如MSVC或Xcode)使用CMake,因此无法尝试。