一、开发准备
1、MacOS一般默认都有Xcode,Git和Ruby
2、下载OCLint代码
下载到本地的目录如下:
3、cd进入oclint-scripts文件加,执行./make
如果没有报错的话,大约30分钟后编译完成,大概过程是下载LLVM、clang的源代码,编译LLVM、clang与OCLint的默认规则。
不过一般都会遇到一些问题:
(1)、如果没有安装cmake一般都会报错
cmake官网,下载Mac操作系统对应的安装包。安装完成之后,运行cmake图形界面程序,在左上角的选项栏中选择Tools,点击How to install for Command Line Use。
之后弹出来一个消息框:
One may add CMake to the PATH:
PATH="/Applications/CMake.app/Contents/bin":"$PATH"
Or, to install symlinks to '/usr/local/bin', run:
sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --install
Or, to install symlinks to another directory, run:
sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --install=/path/to/bin
三种安装cmake command line tool 的方法,即终端能够识别cmake命令的方法。复制sudo"/Applications/CMake.app/Contents/bin/cmake-gui" --install 命令到终端,然后运行,当然你也可以打出来。 之后再在终端打cmake命令,就不会再提示什么command not found之类的错误了,到此安装成功了。
在Mac安装cmake command line tool
cmake :command not found解决
(2)、报错fatal error: 'openssl/ssl.h' file not found
brew install openssl
参考文章:
fatal error: openssl/ssl.h 安装失败 解决方案
参考2
(3)、报错ninja not found
brew install ninja
CMake + Ninja OSX issue
(4)、make错误-fatal: 远端意外挂断了
正克隆到 'oclint-json-compilation-database'...
remote: Enumerating objects: 88, done.
error: RPC failed; curl 56 LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 54
fatal: 远端意外挂断了
fatal: early EOF
fatal: unpack-objects 失败
直接重新执行./make
就行
(5)、报错 Operation timed out
A llvm/unittests/IR/CFGBuilder.h
A llvm/unittests/IR/DominatorTreeTest.cpp
svn: E000060: Operation timed out
或者:
svn: E175012: Connection timed out
执行命令open ~/.subversion/config
设置 # busy-timeout = 1000000
默认值是10000毫秒也就是10秒,改成10,000,000,或者更大的数字。
### Set the SQLite busy timeout in milliseconds: the maximum time
### the client waits to get access to the SQLite database before
### returning an error. The default is 10000, i.e. 10 seconds.
### Longer values may be useful when exclusive locking is enabled.
# busy-timeout = 1000000
执行命令open ~/.subversion/servers
设置# http-timeout = 1800
或者更大的数字比如一天86400秒
./make执行成功的画面:
[14/14] Linking CXX executable bin/oclint-0.14
如果改了这两个参数还是失败,建议多试几次,有可能是网络不好。
4、创建自定义的规则
在oclint-scripts目录下OCLint提供了一个叫scaffoldRule的脚本程序。可以传入要生成的规则名,级别,类型,脚本就会在目录oclint-rules/rules/custom/自动生成一个模板代码,并且加入编译路径中。
举个例子:
# 生成一个名为myDemoRule类型是ASTVisitor的规则模板
oclint-scripts/scaffoldRule myDemoRule -t ASTVisitor
执行命令后:
5、编译自定义的规则成动态库
编译方法1:重新执行oclint-scripts/make
这个太慢了,不推荐,很不方便。
编译方法2:将规则相关的内容整合成一个Xcode工程
将规则相关的内容整合成一个Xcode工程,并且我们的每个规则都是一个scheme,编译时可以只选择编译那个选择的规则生成对应的dylib。
OCLint工程使用CMakeLists的方式维护各个文件的依赖关系,可以使用CMake自带的功能将这些CMakeLists生成一个xcodeproj工程文件。
在OCLint源码目录下建立一个文件夹oclint-xcodeproject
xcode-debug.sh
#! /bin/sh -e
cmake -G Xcode -D CMAKE_CXX_COMPILER=../build/llvm-install/bin/clang++ -D CMAKE_C_COMPILER=../build/llvm-install/bin/clang -D OCLINT_BUILD_DIR=../build/oclint-core -D OCLINT_SOURCE_DIR=../oclint-core -D OCLINT_METRICS_SOURCE_DIR=../oclint-metrics -D OCLINT_METRICS_BUILD_DIR=../build/oclint-metrics -D LLVM_ROOT=../build/llvm-install/ ../oclint-rules
执行命令
bash xcode-debug.sh
编译出来的动态库
然后将编译好的动态库放到oclint的规则文件夹,这样就可以使用自己新加的自定义规则了
路径:/usr/local/Cellar/oclint/0.13/lib/oclint/rules
参考文章
OCLint 如何自定义规则