使用CMake构建Metallib

时间:2018-08-24 16:24:55

标签: cmake metal metalkit

我有一些.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

1 个答案:

答案 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(这也将使您也可以查看CompilerPlatform子目录)。

注意:在浏览邮件列表时,我碰到了这个thread,其中提到第二种方法可能不适用于非基于Makefile的生成器。从线程(或现有文档)尚不清楚,由于我没有通过此类工具(例如MSVC或Xcode)使用CMake,因此无法尝试。