30

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

 5 years ago
source link: http://www.cocoachina.com/ios/20180815/24572.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

zQreaym.png!web

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

前言

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

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

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

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

    2010年开始主导开发 Swift 语言

    2017年入职特斯拉

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

JBBFV32.png!web

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/

:warning: 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 文件

jInURnz.png!web

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

$ninja

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

uyEVVbM.png!web

$ninja install

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

JbQjyaE.png!web

2) 使用 Xcode 编译

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

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

生成的文件如下:

ENRJr2J.png!web

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

InAvmui.png!web

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK