更好的Helloworld
1、创建一个t2目录,把t1中的main.c和CmakeList.txt文件复制到t2.
2、添加子目录src,把main.c移动到src目录中
看一下t2目录的文件:
3、需要为任何一个子目录建立一个CMakeList.txt文件,为src创建CMakelist.txt
ADD_EXECUTABLE(hello main.c)//生成目标文件
4、t2目录的CMakeList.txt文件修改成
PROJECT (HELLO)
ADD_SUBDIRECTORY(src bin)//向当前工程中添加子目录,指定中间文件和目标文件的存放位置也就是把中间文件放在了build/bin目录下
5、建立build目录,运行cmake . . 运行make会在build/bin目录中生成hello目标文件。
看一下文件:
6、换个位置保存目标文件
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
这两个指令定义了二进制输出为build/bin库输出为build/lib
CMakeList.txt文件中的指令PROJECT (HELLO)隐式定义了
<projectname>_BINARY_DIR和<projectname>_SOURCE_DIR
这里就是HELLO_BINARY_DIR和HELLO_SOURCE_DIR
也可以是PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR
如果是内部编译的话就是工程所在的目录
外部编译的话就是外部编译所在的目录在这个例子中就是build
把这两个指令加入到那个CMakelist.txt文件夹下,在哪里ADD_EXECUTABLE或者ADD_LIBRARY,如果需要改变目标存放位置,就在哪里加上定义。
7、安装
安装需要两种,一种是在代码编译后直接安装,一种是打包时指定安装目录。
可以通过:
make install
将hello直接安装在/usr/bin目录,也可以通过
make install DESTDIR = /tmp/test
安装在/tmp/test/usr/bin目录。
8、安装规则
安装的内容包括目标二进制文件、动态库、静态库、以及文件、目录、脚本等。
1、目录文件的安装
INSTALL(TARGETS targets...//此处就是我们通过ADD_EXECUTABLE或者ADD_LIBRARY定义的目标文件(二进制文件、动态库、静态库)
[[ARCHIVE|LIBRARY|RUNTIME]//分别表示静态库、动态库、目标二进制文件
[DESTINATION <dir>]//定义安装路径
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[OPTIONAL]]
[... ]
)
2、普通文件的安装
INSTALL(FILES filess... DESTINATION <dir>
[PERMISSIONS permissions...]//访问权限默认644
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[RENAME <name>]
[OPTIONAL])
3、非目标文件的安装
INSTALL(PROGRAMES files... DESTINATION <dir>
[PERMISSIONS permissions...]//访问权限默认755
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[RENAME <name>]
[OPTIONAL])
4、目录的安装
INSTALL(DIRECTORY dirs... DESTINATION <dir>
[FILE_PERMISSIONS permissions...]//访问权限默认644
[DIRECTORY_PERMISSIONS permissions ]
[USE_SOURCE_PERMISSIONS]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[[PATTERN <pattern> | REGEX <regex>]
[EXCLUDE]
[PERMISSIONS permissions...]] [])
//DIRECTORY后面连接的是所在source目录的相对路径,但是注意:abc和abc/的区别abc代表这个目录安装为目标路径下的abc
abc/代表将这个目录中的内容安装到目标路径,但是不包括这个目录本身。
例如
INSTALL(DIRECTORY icons scripts/ DESTINATION share/myproj//icons安装到<prefix>/share/myproj 将scripts/中的内容安装到 <prefix>/share/myproj
PATTERN "cvs" EXCLUDE//不包含cvs
PATTERN "scripts/*"
PERMISSIONS permissions...//指定权限)
二 修改我们的工程
1、在t2添加doc目录及在doc目录下添加hello.txt文件。
2、在工程目录添加runhello.sh 内容为hello
3、在工程目录添加COPYRIGHT和README
4、修改CMakelists.txt文件添加
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/t2)
INSTALL(PROGRAMS runhello.sh DESTINATION bin)
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/t2)
5、之后在build目录进行外部编译
cmake -DCMAKE_INSTALL_PREFIX=/tmp/t2/usr ..
然后运行
make
make install
查看安装结果
/tmp/t2