源码

首页 » 归档 » 源码 » Clang 之路——编写我的第一个 Clang 插件:检测 ObjC 中的类声明规范

Clang 之路——编写我的第一个 Clang 插件:检测 ObjC 中的类声明规范

TIM截图20180815101211.png

本文所介绍插件检测的效果图

前言

LLVM 是一个模块化和可重用的编译器和工具链技术的集合,Clang 是 LLVM 的子项目,是 C,C++ 和 Objective-C 编译器,因为多模块的复用,所以提供了惊人的快速编译,比 GCC 快3倍。创始人是 Chris Lattner,也是Swift之父,以下是他的部分履历:

  • 开发了一个叫作 LLVM 的编译器开发工具套件

  • 开发了 Clang,使得 LLVM 直接挑战 GCC 的地位

    2005年加入苹果,将苹果使用的 GCC 全面转为 LLVM

    2010年开始主导开发 Swift 语言

    2017年入职特斯拉

    加入特斯拉仅六个月之后离职,随后在 Google Brain 从事人工智能方面的工作。

TIM截图20180815101317.png

LLVM 创始人 Chris Lattner

首先让我们来看下 LLVM 子项目都有哪些:

1)LLVM Core

提供了一个现代的源代码和目标独立优化器, 以及许多流行的 CPU (甚至是一些不太常见的处理器) 的汇编代码生成支持。

2)Clang

一个 C/C++/Objective-C 编译器,致力于提供令人惊讶的快速编译,极其有用的错误和警告信息,提供一个可用于构建很棒的源代码级别的工具。

3)dragonegg

GCC 插件,可将 GCC 的优化和代码生成器替换为 LLVM 的相应工具。

4)LLDB

基于LLVM提供的库和Clang构建的优秀的本地调试器。

5)libc++、libc++ ABI

符合标准的,高性能的C++标准库实现,以及对 C++11 的完整支持。

6)compiler-rt

针对 __fixunsdfdi 和其他目标机器上没有一个核心 IR(intermediate representation) 对应的短原生指令序列时,提供高度调优过的底层代码生成支持。

7)OpenMP

Clang 中对多平台并行编程的runtime支持。

8)vmkit

基于 LLVM 的 Java 和 .NET 虚拟机实现

9)polly

支持高级别的循环和数据本地化优化支持的 LLVM 框架。

10)libclc

OpenCL 标准库的实现

11)klee

基于 LLVM 编译基础设施的符号化虚拟机

12)SAFECode

内存安全的C/C++编译器

13)lld

Clang/LLVM 内置的链接器

Clang 作为 LLVM 提供的编译器前端,将用户的源代码 (C/C++/Objective-C) 编译成语言/目标设备无关的IR实现。并且提供良好的插件支持,容许用户在编译时,运行额外的自定义动作。

接下来,开始 “编写我的第一个 Clang 插件” 之路~~

源码编译

准备工作

Clang 需要用 CMake 和 Ninja 来编译,可以通过 Homebrew 安装

  • 安装 Homebrew

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • 安装 CMake

$ brew install cmake
  • 安装 Ninja

$ brew install ninja

源码下载

下载 LLVM

$ git clone https://git.llvm.org/git/llvm.git/

下载 Clang

$ cd llvm/tools

$ git clone https://git.llvm.org/git/clang.git/

⚠️ Clang 源码需要安装到 llvm/tools 目录下

源码编译

1) 使用 Ninja 编译

在 LLVM 同级目录下新建一个 llvm_build 目录,然后执行以下操作

$ cd llvm_build
$ cmake -G Ninja ../llvm -DCMAKE_INSTALL_PREFIX=../llvm_release 

# -DCMAKE_INSTALL_PREFIX 指定 LLVM 的安装路径

最终会在 llvm_build 目录下生成 build.ninja 文件

TIM截图20180815101525.png

接着依次执行编译、安装指令

$ninja

编译完成后,llvm_build 目录大概 21.41GB 左右

TIM截图20180815101553.png

$ninja install

安装完后,安装目录大概 12.04GB

TIM截图20180815101609.png

2) 使用 Xcode 编译

在 LLVM 同级目录下新建一个 llvm_Xcode 目录,然后执行以下操作

$ cd llvm_xcode 
$ cmake -G Xcode ../llvm

生成的文件如下:

TIM截图20180815101744.png

然后在 llvm_Xcode 目录下打开 LLVM.xcodeproj 文件,选择自动创建 Schemes:

TIM截图20180815101817.png

选择 ALL_BUILD,编译,然后就是漫长的等待⌛️,编译大概需要一个多小时...(我用公司配的闲置着的 macmini 从早上11:48同时开始命令行跟Xcode编译,一直到吃完午饭,1点多才编译好。。。

(1)

本文由 投稿者 创作,文章地址:https://blog.isoyu.com/archives/clang-zhilubianxiewodediyige-clang-chajianjiance-objc-zhongdeleishengmingguifan.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:8月 15, 2018 at 07:24 下午

热评文章

发表回复

[必填]

我是人?

提交后请等待三秒以免造成未提交成功和重复