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

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

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

转载请注明出处!

关于如何编写新的 Dialect 的编码部分前期已经介绍完毕。

今天介绍一下mlir-hello项目的工程配置部分,本质上也就是文件结构和 cmake 项目文件的编写。

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

这里从编译指令出发,开始 cmake 项目构建之旅。完整的根目录 CMakeLists.txt 文件内容见最后一小节。

利用 LLVM 项目

这里,mlir-hello 的编译指令为,

1
2
3
4
5
cmake -G Ninja .. \
-DLLVM_DIR=${LLVM_BUILD_DIR}/lib/cmake/llvm \
-DMLIR_DIR=${MLIR_BUILD_DIR}/lib/cmake/mlir \
-DCMAKE_C_COMPILER=${CLANG} \
-DCMAKE_CXX_COMPILER=${CLANGXX}

从之前编写的 C++ 头文件可以看出,MLIR 相关项目将不可避免的用到 LLVM(MLIR) 基础设施,也就会引入相关 .cmake 文件。

由于这个项目会用到编译 LLVM(MLIR) 项目产出的

1
2
3
4
include(TableGen) # TableGen.cmake
include(AddLLVM) # AddLLVM.cmake
include(AddMLIR) # AddMLIR.cmake
include(HandleLLVMOptions) # HandleLLVMOptions.cmake

可以看到,有两项关键的参数指向目录,这两个目录要分别包含 MLIRConfig.cmakeLLVMConfig.cmake 文件,

1
find_package(MLIR REQUIRED CONFIG) # MLIRConfig.cmake

MLIRConfig.cmake中又要用到,

1
find_package(LLVM REQUIRED CONFIG) # LLVMConfig.cmake

另外,要符合这个项目的需要,

  • LLVM_BUILD_DIR,它对应编译 LLVM build 目录下的 lib/cmake/llvm
    • TableGen.cmake
    • AddLLVM.cmake
    • HandleLLVMOptions.cmake
  • MLIR_BUILD_DIR,它对应编译 LLVM build 目录下的 lib/cmake/mlir
    • AddMLIR.cmake

文件组织

接下来,将引入本项目编译时需要使用的头文件、库文件等等。

1
2
3
4
5
6
7
8
include_directories(${LLVM_INCLUDE_DIRS})
include_directories(${MLIR_INCLUDE_DIRS})
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${PROJECT_BINARY_DIR}/include)

link_directories(${LLVM_BUILD_LIBRARY_DIR})

add_definitions(${LLVM_DEFINITIONS})

首先 include_directories 引入了 LLVM 基础设施中的头文件。

然后引入了 2 个本地 include 目录中的头文件,

  • PROJECT_SOURCE_DIR 对应 cmake .. 后面的 .. 这个目录,在这里就是根目录
  • PROJECT_BINARY_DIR 对应使用 cmake 的这个目录,这里是 mlir-hello/build

link_directories 引入第三方库所在路径。这里是通过前面的 find 操作下的 .cmake 引入的。

最后通过 add_definitions 引入 LLVM 预设的一些配置项。

引入已分解的子项目组成

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

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

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

小结

mlir-hello 通过 cmake 组织项目。本文介绍了根目录下的 CMakeLists.txt,以及它如何串联 LLVM 基础设施和本地项目文件。下期将进一步介绍这些子目录的组织。

根目录 CMakeLists.txt

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
cmake_minimum_required(VERSION 3.13.4)

if(POLICY CMP0068)
cmake_policy(SET CMP0068 NEW)
set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)
endif()

if(POLICY CMP0075)
cmake_policy(SET CMP0075 NEW)
endif()

if(POLICY CMP0077)
cmake_policy(SET CMP0077 NEW)
endif()

project(mlir-hello LANGUAGES CXX C)

set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to")

find_package(MLIR REQUIRED CONFIG)

message(STATUS "Using MLIRConfig.cmake in: ${MLIR_DIR}")
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")

set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/bin)
set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/lib)
set(MLIR_BINARY_DIR ${CMAKE_BINARY_DIR})

list(APPEND CMAKE_MODULE_PATH "${MLIR_CMAKE_DIR}")
list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}")
include(TableGen)
include(AddLLVM)
include(AddMLIR)
include(HandleLLVMOptions)

include_directories(${LLVM_INCLUDE_DIRS})
include_directories(${MLIR_INCLUDE_DIRS})
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${PROJECT_BINARY_DIR}/include)
link_directories(${LLVM_BUILD_LIBRARY_DIR})
add_definitions(${LLVM_DEFINITIONS})

add_subdirectory(include)
add_subdirectory(lib)
add_subdirectory(test)
add_subdirectory(hello-opt)

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

至少点个赞再走吧~

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

https://xlindo.com/kewenlu2022/posts/4b8ef040/

Author

xlindo

Posted on

2023-01-05

Updated on

2024-01-16

Licensed under

Comments