最近在做的东西,需要抽象库,后台daemon,以及依赖抽象库的application。。
按照之前的尿性 建三个repo就分别写。。
但是写时候一时爽!后面debug可难喽!
干脆组monorepo,把三个独立的repo变成三个文件夹合在一起,发布时候也不会乱拉。。
那编译工具呢!
之前可是一直在用CMake,也写了几个marco作为辅助,但是实在是太难了!急得我哟!
尤其是有个型号新版本才能用,啊我还要升级本机cmake。
装都装了 不如换一个!
其实Cmake的好处都有啥:网上一搜,抄得飞起,VSCode插件一键编译,conan直接导出依赖包。
坏处呢:用过的人都知道!
先提需求:
- 涉及不止一个闭源包,需要方便引入,且闭源包分debug和release版。但是我想用clang,干脆就用release版得了。
- windows下使用vs.sln,linux使用 某编译脚本+vscode内调试
- 他人维护时,所有第三方库都是编译好的(约定编译器版本),可以让项目拿到手直接改完publish。
- 自己维护时,需要看第三方库代码,所以第三方库要带source,且支持可以改完编译给别人用
- daemon和application同时会引用抽象库.lib/.so
- 支持一键打包,把依赖库(dll/.so)和项目binary输出,并设置rpath (linux only),复制config.template
- 调试时,可选多个不同的workingdir (甚至一个target在不同的working dir里运行)
我尝试了腾讯的Blade 最友好
一是中文文档,二是其抽象的非常精炼,有很多直接拿来即用的东西,没有把很多东西都用python包住。。
带来的结果就是:只能在linux下用!不过没关系!Windows下有VS 图形界面,除了导入lib费点劲,用个球写命令。。
于是写个test我才发现一个坑,反正目前的版本是,每次build都会重新生成ninja文件,这个过程贼慢大约10秒。。我改动个文件编译也就是10秒。。这个翻倍让人难过
罢了罢了!
然后又看了please.build
想法很好,基本语法和Blade一样,但是太难用了。。
文档也冇,各种神奇错误,引入外部库连个sample都找不见。。
匆匆评价 放弃
回到起初看的chrome/gn
很早之前就看了,但前两个的诱惑是python脚本,而且please也可以生成portable的exe
就它吧!速度也快,文档也多,而且关键有chrome这个大例子,再覆盖不住衣食住行可就真难了!
这个教程真的好,光说不练不如手把手教!
https://gn.googlesource.com/gn/+/master/docs/quick_start.md
官网拖一个,Windows下,按教程执行,直到遇到了
(本地有minGW和bash套装)
λ ninja -C out hello -v
ninja: Entering directory `out'
[1/3] g++ -MMD -MF obj/libhello_static.hello_static.o.d -c ../hello_static.cc -o obj/libhello_static.hello_static.o
[2/3] rm -f obj/libhello_static.a && ar rcs obj/libhello_static.a obj/libhello_static.hello_static.o
[3/3] g++ -Wl,-rpath=$ORIGIN/ -Wl,-rpath-link= -o hello -Wl,--start-group @hello.rsp -Wl,--end-group
FAILED: hello
g++ -Wl,-rpath=$ORIGIN/ -Wl,-rpath-link= -o hello -Wl,--start-group @hello.rsp -Wl,--end-group
g++: error: obj/libhello_static.a: No such file or directory
ninja: build stopped: subcommand failed.
好难。。看了几个.gn文件 根本没发现异样,单独复制粘贴运行也没发现问题。于是尝试修改
build/toolchain/BUILD.gn 中的 tool("alink")
rm -f
改为rm -v -f
如下文
tool("alink") {
command = "rm -v -f {{output}} && ar rcs {{output}} {{inputs}}"
description = "AR {{target_output_name}}{{output_extension}}"
于是发现异样!提示removed 'obj/libhello_static.hello_static.o'
我。。原来是&&
被当成文件了,在ar之前它把.o删了,怪不得,合成空气啊!
如何引入外部.so 以及(so文件的源码) https://stackoverflow.com/questions/49102921/how-to-include-a-shared-library-in-chromiums-gn-file
GN 小结
已更新 参见另一篇文章 https://blog.vrqq.org/archives/712/