Cmake & Make

进入PASA之后,在danny的指导下才慢慢接触到了cmake, 然后还有ninja.
周末在家有空, 决定写一个日志, 以后可以忘了还有地方找一下.


###make
关于make 和cmake 的关系.
首先, 编译命令. 当我们写好了一个.cpp文件之后, 我们需要编译成一个可执行文件, 在linux下面就是我们的.bin也就是window里面的.exe
当我们有一个简单的project, 这个project里面只有一个server.cpp文件. 我们只需要执行下面这条命令来编译它.

gcc server.cpp -o server

这时候有一个server的软件出现在了现在的dir.

好的, 现在我们的文件要稍微复杂一点了. 这个project文件有两个文件, server.cpp和client.cpp文件. 我们需要把他们分别编译成server和client的文件.
根据前面的例子,我们需要执行两条命令就好了

gcc server.cpp -o server
gcc client.cpp -o client

但是,每次需要的时候都要输入这两条. 很累的喵. 所以,我们需要把这些命令写入一个文件,然后只需要执行这个文件就好啦.
在这个network.mk的文件里面

server:
    gcc server.c -o server

所以呢, 你只需要执行

make server

就可以得到server文件. 如果我们把两个命令都放在一个文件里面呢

server:
    gcc server.c -o server
client:
    gcc client.c -o client

这时候,你可以选择那个文件来编译, make server 或者是make client
恩恩. 是不是很方便呢.. 就好像是从农业时代一下子就进入了工业时代一样. 所有的编译都写好然后重复不断的编译都可以得到一样的结果.
恩.. 但是如果,假如,我们现在有好多好多的src文件.. 怎么办呢.
make也是可以支持variable来代替大量的.c和.h文件. 比如说.

files = foo.elc bar.o lose.o 

$(filter %.o,$(files)): %.o: %.c 
        $(CC) -c $(CFLAGS) $< -o $@ 
$(filter %.elc,$(files)): %.elc: %.el 
        emacs -f batch-byte-compile $< 

好吧,是不是看上去很复杂呢.. 恩. makefile确实在可读性上有一定的缺点.
如果代码不具有可读性,一定程度上是没有价值的.
所以我们就有了现代社会的cmake.

###cmake
cmake其实是一个makefile generator. 我们不需要面对复杂的makefile. cmake简单且直观的语法能够让我们很容易的生成makefile. 具体语法以后讨论喵.
在我看来,cmake的三大优点:

  1. 语法简单,可读性强
  2. 多项目管理方便
  3. 分离编译

make在编译过程中会产生object文件,链接文件. 对于git来管理的源文件而言,这些都是垃圾.为了尽量保证源文件的安全性.. cmake在任意的文件夹下面生成makefile以及编译过程中的文件.. 这样保证的编译文件与源文件的分离. 在你不需要的时候,把整个文件夹删除即可. 例如:

mkdir build
cd  build
cmake ../
make –j5

make -j5命令是让系统通过多核的方式来进行编译.编译所需要的时间大幅减少.

###Ninja

Ninja是一个google开发的build工具.. 他的作用是和GNU的make一样.. 对make文件进行编译.. ninja并不需要-j的指令来开启多任务模式. 它自动使用的是使用的系统的核心数+2的jobs

mkdir build
cd  build
cmake ../
ninja

以上, 具体的cmake的心得. To Be Continue.