使用 CMake 构建 metallib

Building metallib with 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?

TL;DR 这两种方法,使用自定义 commands/targets 和添加新语言,都是有效的。选择似乎取决于可重用性、分发范围、目标用户等之间的权衡。就个人而言,我最初会选择前者。


话虽如此,如果您选择 add_custom_command/add_custom_target 方法,它可以让您走得更远。只需确保您提供实际目标并 link 它们带有 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。