更加工程化的HelloWorld
之后,我们都将采用外部构建的方式,构建目录是工程目录下的build目录
为了看起来更佳工程化,我们需要:
- 为工程添加一个子目录src,用来放置工程源代码;
- 添加一个子目录doc,用来放置这个工程的文档hello.txt;
- 在工程目录添加文本文件COPYRIGHT, README;
- 在工程目录添加一个runhello.sh脚本,用来调用hello二进制;
- 将构建后的目标文件放入构建目录的bin子目录;
- 最终安装这些文件:将hello二进制与runhello.sh安装至/usr/bin,将doc目录
的内容以及COPYRIGHT/README安装到/usr/share/doc/cmake/t2;
语法解释
ADD_SUBDIRECTORY指令
demo过程
准备工作
在当前目录下建立t2目录。
将上一篇文章中的main.c和CMakeLists.txt拷贝到t2目录中。
添加子目录src
mkdir src
mv main.c src
现在的工程看起来是这个样子:
一个子目录src,一个CMakeLists.txt。
### 为每个目录编写CMakeLists.txt
上一节我们提到,需要为任何子目录建立一个CMakeLists.txt,
进入子目录src,编写CMakeLists.txt如下:
ADD_EXECUTABLE(hello main.c)
将t2工程的CMakeLists.txt修改为:
PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)
外部编译
然后建立build目录,进入build目录进行外部编译。
cmake ..
make
换个地方保存目标二进制
我们都可以通过SET指令重新定义EXECUTABLE_OUTPUT_PATH和LIBRARY_OUTPUT_PATH变量
来指定最终的目标二进制的位置(指最终生成的hello或者最终的共享库,不包含编译生成
的中间文件)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
在第一节我们提到了<projectname>_BINARY_DIR和PROJECT_BINARY_DIR变量,他
们指的编译发生的当前目录,如果是内部编译,就相当于PROJECT_SOURCE_DIR也就是
工程代码所在目录,如果是外部编译,指的是外部编译所在目录,也就是本例中的build
目录。
所以,上面两个指令分别定义了:
可执行二进制的输出路径为build/bin和库的输出路径为build/lib。
在这个例子里,当然就是指src下的CMakeLists.txt了
如何安装
安装的需要有两种,一种是从代码编译后直接make install安装,一种是打包时的指定目录安装。
DESTDIR=
install:
mkdir -p $(DESTDIR)/usr/bin
install -m 755 hello $(DESTDIR)/usr/bin
你可以通过make install将hello直接安装到/usr/bin目录,也可以通过make install DESTDIR=/tmp/test
将他安装在/tmp/test/usr/bin目录,打包时这个方式经常被使用。
稍微复杂一点的是还需要定义PREFIX,一般autotools工程,会运行这样的指令:./configure –prefix=/usr或者./configure --prefix=/usr/local来指定PREFIX
比如上面的Makefile就可以改写成:
DESTDIR=
PREFIX=/usr
install:
mkdir -p $(DESTDIR)/$(PREFIX)/bin
install -m 755 hello $(DESTDIR)/$(PREFIX)/bin
INSTALL指令
INSTALL指令用于定义安装规则,安装的内容可以包括目标二进制、动态库、静态库以及
文件、目录、脚本等。
目标文件的安装
普通文件的安装
目录的安装
非目标文件的可执行程序安装(比如脚本之类)
###修改Helloworld支持安装###
首先我们先补上为添加的文件。
添加doc目录及文件:
cd /backup/cmake/t2
mkdir doc
vim doc/hello.txt
随便填写一些内容并保存在工程目录添加runhello.sh脚本,内容为:hello
添加工程目录中的COPYRIGHT和READMEtouch COPYRIGHTtouch README
####尝试我们修改的结果
