上一篇文章讲了把pybind11的示例程序嵌入到了MLIR的Example中,但是在构建的过程中有一定运气成分,并不知道具体是怎么通过CMake构建系统编译出的共享库文件。在分析了MLIR各层级的CMakeLists.txt文件之后,本文讲述上一篇文章的共享库文件是如何在CMake的帮助下编译出来的。

我们首先回顾一下上一篇文章中的构建过程,在MLIR的Example里面新增一个Ch8路径,将pybind11的示例程序拷贝到该路径下,然后编写CMakeLists.txt,同时改写各个层级的CMakeLists.txt,最后执行相应cmake指令进行构建编译。

其中最后一步进行编译的指令,指定了想要构建的target:check-mlir

cmake --build . --target check-mlir

由于CMake的构建系统是由一系列的target组成的,各个target之间的依赖关系也决定了构建的顺序。在使用--target 指定了check-mlir之后,我们来寻找一下关于check-mlir的依赖关系在哪里定义的。在全局搜索后,我发现在llvm-project/mlir/test/CMakeLists.txt文件中调用了函数add_lit_testsuite,从而添加了check-mlir的依赖MLIR_TEST_DEPENDS 列表:

......
add_lit_testsuite(check-mlir "Running the MLIR regression tests"${CMAKE_CURRENT_BINARY_DIR}DEPENDS ${MLIR_TEST_DEPENDS})
......

add_lit_testsuite 这个函数在llvm-project/llvm/cmake/modules/AddLLVM.cmake文件中定义,同时还调用了一个 add_lit_target 函数,目的就是最终调用add_dependenciesMLIR_TEST_DEPENDS 依赖列表与check-mlir进行绑定:

# A function to add a set of lit test suites to be driven through 'check-*' targets.
function(add_lit_testsuite target comment)cmake_parse_arguments(ARG "" "" "PARAMS;DEPENDS;ARGS" ${ARGN})......# Produce a specific suffixed check rule.add_lit_target(${target} ${comment}${ARG_UNPARSED_ARGUMENTS}PARAMS ${ARG_PARAMS}DEPENDS ${ARG_DEPENDS}ARGS ${ARG_ARGS})
endfunction()......# A raw function to create a lit target. This is used to implement the testuite
# management functions.
function(add_lit_target target comment)cmake_parse_arguments(ARG "" "" "PARAMS;DEPENDS;ARGS" ${ARGN})......if (ARG_DEPENDS)add_dependencies(${target} ${ARG_DEPENDS})endif().......endfunction()

那么,MLIR_TEST_DEPENDS 列表又是在哪里定义的呢?答案是在llvm-project/mlir/test/CMakeLists.txt文件中。首先定义了 MLIR_TEST_DEPENDS 列表中的各种target,然后判断是否开启了LLVM_BUILD_EXAMPLE 编译选项,如果开启,向依赖列表中再加入一系列Example的target,我的示例程序的共享库名称pybind11_example就是在这里添加的:

......
set(MLIR_TEST_DEPENDSFileCheck count notMLIRUnitTestsmlir-cpu-runnermlir-edsc-builder-api-testmlir-optmlir-sdbm-api-testmlir-tblgenmlir-translatecblascblas_interfacemlir_runner_utils)if(LLVM_BUILD_EXAMPLES)list(APPEND MLIR_TEST_DEPENDStoyc-ch1toyc-ch2toyc-ch3toyc-ch4toyc-ch5toyc-ch6toyc-ch7pybind11_example)
endif()
......

pybind11_example共享库是通过pybind11支持的pybind11_add_module 函数定义的,这个函数相当于CMake中的add_library

find_package(pybind11 REQUIRED)
pybind11_add_module(pybind11_example main.cpp)

总结一下

在使用pybind11定义共享库pybind11_example之后,将共享库名称加入到依赖列表MLIR_TEST_DEPENDS 中,再通过调用add_lit_testsuiteadd_lit_target 将依赖列表MLIR_TEST_DEPENDS添加到targetcheck-mlir中,利用这样的流程可以在我们使用--target check-mlir选项时,把pybind11共享库文件编译出来。

本文若有错误纰漏,欢迎大家批评指正。

cmake 构建路径_基于CMake构建系统的MLIR Example扩展相关推荐

  1. cmake 构建路径_新手必备:win10 系统下 VSCode+CMake+Clang+GCC 环境的搭建

    打算用C/C++把基本的数据结构与算法实现一遍, 为考研做准备, 因为只是想实现算法和数据结构, 就不太想用VisualStudio, 感觉VSCode不错, 遂在网上找了一些教程, 结合自己的需求, ...

  2. 华为开源构建工具_为什么我构建了用于大数据测试和质量控制的开源工具

    华为开源构建工具 I've developed an open-source data testing and a quality tool called data-flare. It aims to ...

  3. 4怎么打开项目_基于车位引导系统的捷顺室内导航项目怎么调试?

    对于停车难,找车难,捷顺在几年前就已经推出成熟的解决方案,经过这几年,技术越发成熟.先进!那么对于这款可以在室内蓝牙导航的先进系统要怎么调试呢?下面就让我们一起来学习下吧! 一.介绍 基于车位引导系统 ...

  4. uuid怎么获取_基于车位引导系统的捷顺室内导航项目怎么调试?

    对于停车难,找车难,捷顺在几年前就已经推出成熟的解决方案,经过这几年,技术越发成熟.先进!那么对于这款可以在室内蓝牙导航的先进系统要怎么调试呢?下面就让我们一起来学习下吧! 一.介绍 基于车位引导系统 ...

  5. python用户名和密码登录函数_基于Python构建用户ID和密码存储查询系统,python,建立,一个,用户名,UserID,Password,的...

    大家好,本篇博客目的是建立存储和查询用户名和密码的python系统,基础好的可跳过中间小干货,源码在末尾,喜欢的留下小赞哦! 系统主要功能 主要功能如下: 创建一个新用户及其密码 修改值定用户的密码 ...

  6. 一直在构建工作空间_基于用户场景构建的建筑工程弱电设计工作设想

    [摘要]因为弱电产品更新速度快,功能差异变化大,往往会出现设计成果同预期有所区别的情况.针对类似情形,文章提出借鉴发展变化更加迅速的互联网行业中产品设计的理念,通过业主方或者设计方构建用户场景的手段, ...

  7. docker搭建java测试环境_基于docker构建测试环境

    目录 0x01介绍 0x02 镜像基本操作 0x03 容器基本操作 0x04 容器的修改与保存 0x05 使用Dockerfile定制镜像 0x01介绍 Docker 是一个开源的应用容器引擎,基于 ...

  8. js 直接打开选择文件窗口_基于HTML5 构建的 Web端现代化PDF在线预览插件——PDF.js...

    引言 PDF文件现在在许多企业中常用 - 无论您是要生成销售报告,交付合同还是发送发票,PDF都是首选的文件类型.PDF.js是由Mozilla编写的JavaScript库.由于它使用vanilla ...

  9. mysql 可视化监控_基于Prometheus构建MySQL可视化监控平台

    对于MySQL的监控平台,相信大家实现起来有很多了:基于天兔的监控,还有基于zabbix相关的二次开发.相信很多同行都应该已经开始玩起来了.我这边的选型是prometheus + granafa的实现 ...

最新文章

  1. Memcache的部署和使用
  2. centos文本查看及处理相关的常用命令
  3. Qt Creator使用补充工具栏
  4. 重拾强化学习的核心概念_强化学习的核心概念
  5. linux快速php,Linux 下的这些高效指令,是你快速学习的神器
  6. . mybatis指定配置文件的根元素_MyBatis框架
  7. [C#]简单的理解委托和事件
  8. 如何下载英文原版书籍资料
  9. 谷歌云盘Colab使用心得
  10. excle表格导出到本地
  11. Eclipse安装漂亮的Darkest Dark Theme主题步骤(超详细)
  12. canvas实现虚线带箭头效果
  13. (八)51单片机基础——LED点阵屏
  14. coursera和udacity_三大 mooc 网站:coursera 与 udacity 和 edx 比较,哪个更适合中国人你有何经验分享...
  15. 配置OpenWRTnbsp;校园网实现amp;nbsp…
  16. 2022年高考送祝福,金秋9月,CSDN等你哦!
  17. 微信抢红包的方案_微信抢红包怎样才能抢到最大的告诉你一个方法
  18. NXP JN5169 波特率配置方案
  19. Redis Cluster 添加/删除 完整折腾步骤
  20. 程序员租女友被骗 揭秘“租友”市场背后那些坑

热门文章

  1. asp 文本转时间_三分钟学会在ASP.NET Core MVC 中使用Cookie
  2. 谷歌浏览器安卓_冷知识!你知道安卓系统开始收费了吗?
  3. 自定义轮播图以及bug优化
  4. mysql8.0安装问题
  5. 一些移动端的ui框架
  6. MySQL自定义查询字段排序
  7. 抽象工厂模式 -- 大话设计模式
  8. 深度学习 2 机器学习 神经网络 卷积神经网络
  9. mysql 命令限制_MySQL 命令总结
  10. 统计list里面相同元素个数_Array篇easy难度之求相同元素个数