MLIR:新建一个Dialect(十),CMakeLists.txt

文章来自微信公众号“科文路”,欢迎关注、互动。转发须注明出处。

Multi-Level Intermediate Representation(MLIR)是创建可重用、可扩展编译器基础设施的新途径。本文为第 16 期,继续介绍 mlir-hello 是如何利用 cmake 来组织项目的。

转载请注明出处!

关于文件结构,在之前的文章MLIR:新建一个Dialect(一)已经介绍过了。

上一篇文章已经介绍了mlir-hello项目根目录下,也就是总的的工程配置部分,本质上也就是文件结构和 cmake 项目文件的编写。

本文继续讲下各个子目录的 CMakeLists.txt 文件。

子项目组成

在根目录的项目文件最后,引入了 4 个子目录,这 4 个目录下又都用一个 CMakeLists.txt 重新组织,分别是

1
2
3
4
add_subdirectory(include)
add_subdirectory(lib)
add_subdirectory(test)
add_subdirectory(hello-opt)

这么做是为了更好的分层组织项目,实现解耦。

include,通过ODS生成代码

文件中引入仅有的 Hello 这一个子项目,

1
2
3
add_mlir_dialect(HelloOps hello)
add_mlir_doc(HelloDialect HelloDialect Hello/ -gen-dialect-doc)
add_mlir_doc(HelloOps HelloOps Hello/ -gen-op-doc)

根据 MLIR:新建一个Dialect(四),通过.td定义新DialectMLIR:新建一个Dialect(五),通过.td定义新Op 先回想一下,include 目录下 Hello 的主要内容是为了使用 ODS 定义新 Op。

于是,这里有几条 MLIR 基础设施提供的命令add_mlir_dialectadd_mlir_doc 对应 HelloOps.tdHelloDialect.td,调用 mlir-tblgen 生成相应代码和帮助信息。

lib,利用库生成库

文件中引入仅有的 Hello 这一个子项目,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
add_mlir_dialect_library(MLIRHello
HelloDialect.cpp
HelloOps.cpp
LowerToAffine.cpp
LowerToLLVM.cpp

ADDITIONAL_HEADER_DIRS
${PROJECT_SOURCE_DIR}/include/Hello

DEPENDS
MLIRHelloOpsIncGen

LINK_LIBS PUBLIC
MLIRIR
)

可以看出,这里都是 MLIR:新建一个Dialect(七),lowering 相关的代码。它们要被生成一个库文件 libMLIRHello.a 使用。add_mlir_dialect_library 的语法同样参考 MLIR 基础设施提供的命令

test

晕,忘了说这一部分了,下一篇文章先补这个再总结所有吧。

先看看它的项目文件怎么写的,总之是利用 lit 和 FileCheck 对自己编写的一些测试 .mlir 文件在后期结合生成的工具进行测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
configure_lit_site_cfg(
${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in
${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg.py
MAIN_CONFIG
${CMAKE_CURRENT_SOURCE_DIR}/lit.cfg.py
)

set(HELLO_TEST_DEPENDS
FileCheck count not
mlir-opt
hello-opt
)

add_lit_testsuite(check-hello "Running the hello regression tests"
${CMAKE_CURRENT_BINARY_DIR}
DEPENDS ${HELLO_TEST_DEPENDS}
)
set_target_properties(check-hello PROPERTIES FOLDER "Tests")

add_lit_testsuites(HELLO ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${HELLO_TEST_DEPENDS})

hello-opt

这个子项目被放在最后,因为它需要前面的事情都做完。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
get_property(dialect_libs GLOBAL PROPERTY MLIR_DIALECT_LIBS)
get_property(conversion_libs GLOBAL PROPERTY MLIR_CONVERSION_LIBS)
set(LIBS
${dialect_libs}
${conversion_libs}
MLIRHello
MLIRAnalysis
MLIRCallInterfaces
MLIRCastInterfaces
MLIRExecutionEngine
MLIRIR
MLIRLLVMCommonConversion
MLIRLLVMToLLVMIRTranslation
MLIRMemRefDialect
MLIRLLVMDialect
MLIRParser
MLIRPass
MLIRSideEffectInterfaces
MLIRSupport
MLIRTargetLLVMIRExport
MLIRTransforms
MLIROptLib
)
add_llvm_executable(hello-opt hello-opt.cpp)

llvm_update_compile_flags(hello-opt)
target_link_libraries(hello-opt PRIVATE ${LIBS})

mlir_check_all_link_libraries(hello-opt)
  • get_property, 用于获取属性,得到 MLIR_DIALECT_LIBSMLIR_CONVERSION_LIBS 目录,从而在编译 hello-opt 时使用
  • set, 组织所有库文件,主要是新添了 MLIRHello 这个由 lib 目录新生成的 add_mlir_dialect_library
  • add_llvm_executableAddLLVM.cmake 里的函数,根据一些附加关联生成可执行文件 hello-opt
  • llvm_update_compile_flagsAddLLVM.cmake 的一个函数,引入 llvm 需要的编译标记
  • target_link_libraries,引入刚刚组织好的库文件
  • mlir_check_all_link_librariesAddMLIR.cmake 中的一个函数,调用同文件下定义的 mlir_check_link_libraries 检查所有 lib

小结

mlir-hello 通过 cmake 组织项目。本文继续介绍了各子目录下的 CMakeLists.txt,以及它如何组织串联本地项目文件。

至此,关于如何新建一个 Dialect 的系列文章基本上已经更新完毕。本来下一篇文章将会进行总结,但可能要补一下忘了写的测试部分。

都看到这儿了,不如关注每日推送的“科文路”、互动起来~

至少点个赞再走吧~

MLIR:新建一个Dialect(十),CMakeLists.txt

https://xlindo.com/kewenlu2022/posts/d1db4e37/

Author

xlindo

Posted on

2023-01-12

Updated on

2024-01-16

Licensed under

Comments