GN是一种元构建系统(Meta Build System),而ninja是一个注重速度的构建系统。ninja通常与元构建系统一并使用。常见的有:cmake + make
cmake + ninja
gn + ninja
。本文要介绍的是gn + ninja
的构建方式。
ninja安装
ninja安装有两种途径,一是通过ubuntu自带的软件库安装,另一个是从GitHub上下载ninja源码自己编译。本文是直接在Ubuntu中下载,如想自己编译,可以根据GitHub上的README.md进行操作。
$ sudo apt install ninja-build
安装完毕后,查询版本,显示出版本号后,说明安装成功。
$ ninja --version
1.10.0
GN安装
1. 安装clang
编译gn需要编译器支持C++17的特性,所以编译器的版本不能太低,经过测试clang至少需要8.0的版本。
$ sudo apt install clang-8
同样的,安装完之后,查询下版本号
$ clang-8 --version
clang version 8.0.0-3~ubuntu18.04.2 (tags/RELEASE_800/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
注意到,此时我们输入的命令是clang-8而不是clang,要直接使用clang需要去/usr/bin
目录下加入软链接:
$ sudo ln -s ../lib/llvm-8/bin/clang clang
$ sudo ln -s ../lib/llvm-8/bin/clang++ clang++
注意,如果系统本身安装过旧版本的clang,可能会提示
failed to create symbolic link 'clang': File exists
,此时要么rm -rf clang
删除, 要么把上述命令改为ln -snf ../lib/llvm-8/bin/clang clang
修改之后,如下所示,此时再用clang-8就只需要输入clang即可
/usr/bin $ ll|grep clang
lrwxrwxrwx 1 root root 23 Nov 25 14:04 clang -> ../lib/llvm-8/bin/clang*
lrwxrwxrwx 1 root root 25 Nov 25 14:04 clang++ -> ../lib/llvm-8/bin/clang++*
lrwxrwxrwx 1 root root 25 Dec 10 2019 clang++-8 -> ../lib/llvm-8/bin/clang++*
lrwxrwxrwx 1 root root 23 Dec 10 2019 clang-8 -> ../lib/llvm-8/bin/clang*
lrwxrwxrwx 1 root root 27 Dec 10 2019 clang-cpp-8 -> ../lib/llvm-8/bin/clang-cpp*
$ clang --version
clang version 8.0.0-3~ubuntu18.04.2 (tags/RELEASE_800/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
2. 安装gn
gn的源码可以从两个地方下载,google官方的需要科学上网,另一个就是GitHub上有fork的仓库,GitHub也上不去的话,就用鸿蒙提供的Gitee的仓库
官方源: https://gn.googlesource.com/gn
Github: https://github.com/timniederhausen/gn
Gitee: https://gitee.com/openharmony/third_party_gn
git下来代码后,进行编译
$ cd gn
$ python build/gen.py
$ ninja -C out
等待编译结束,跑一下gn的测试代码,显示passed说明gn功能没问题
$ ./out/gn_unittests
[682/682] ImportantFileWriterTest.Basic
PASSED
编译成功后,将gn复制到/usr/bin
目录下
$ sudo cp ./out/gn /usr/bin
在任意终端中,输入gn help
检测gn是否安装成功
$ gn help
Commands (type "gn help <command>" for more help):
analyze: Analyze which targets are affected by a list of files.
args: Display or configure arguments declared by the build.
check: Check header dependencies.
clean: Cleans the output directory.
clean_stale: Cleans the stale output files from the output directory.
...
3. 用gn和ninja编译例程
在gn仓库中,自带一个例程,路径为gn/example/simple_build
$ cd ./example/simple_build #已在gn仓库目录下
$ gn gen out
Done. Made 3 targets from 4 files in 61ms
$ ninja -C out
ninja: Entering directory `out'
[6/6] LINK hello
运行我们通过gn和ninja编译的程序
$ ./out/hello
Hello, world
至此,我们可以愉快地使用gn来编译代码啦。
本文仅用于本人学习笔记之用,部分内容来源网上,如有侵权,请联系博主删除。