Clang 之路——编写我的第一个 Clang 插件:检测 ObjC 中的类声明规范
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.
本文所介绍插件检测的效果图
前言
LLVM 是一个模块化和可重用的编译器和工具链技术的集合,Clang 是 LLVM 的子项目,是 C,C++ 和 Objective-C 编译器,因为多模块的复用,所以提供了惊人的快速编译,比 GCC 快3倍。创始人是 Chris Lattner,也是Swift之父,以下是他的部分履历:
-
开发了一个叫作 LLVM 的编译器开发工具套件
-
开发了 Clang,使得 LLVM 直接挑战 GCC 的地位
2005年加入苹果,将苹果使用的 GCC 全面转为 LLVM
2010年开始主导开发 Swift 语言
2017年入职特斯拉
加入特斯拉仅六个月之后离职,随后在 Google Brain 从事人工智能方面的工作。
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 文件
接着依次执行编译、安装指令
$ninja
编译完成后,llvm_build 目录大概 21.41GB 左右
$ninja install
安装完后,安装目录大概 12.04GB
2) 使用 Xcode 编译
在 LLVM 同级目录下新建一个 llvm_Xcode 目录,然后执行以下操作
$ cd llvm_xcode $ cmake -G Xcode ../llvm
生成的文件如下:
然后在 llvm_Xcode 目录下打开 LLVM.xcodeproj 文件,选择自动创建 Schemes:
选择 ALL_BUILD,编译,然后就是漫长的等待:hourglass:️,编译大概需要一个多小时...(我用公司配的闲置着的 macmini 从早上11:48同时开始命令行跟Xcode编译,一直到吃完午饭,1点多才编译好。。。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK