CMake的install
CMake不止可以用来管理工程,编译工程,还可以安装工程。就是用install命令,但是记住他是cmake的命令,所以不要直接把它当作是一个linux的命令,那样就和linux的install命令混淆了,linux自带一个install命令,它和cp相类似。cmake的install命令可以按照下面的方式使用:
$ cmake ../
$ make install
看完上面的命令,有没有发现其实install就是cmake生成的一个makefile的目标
执行make install就把每个CMakeLists.txt文件的
install( …. )
这样的命令执行一遍。
例如你有个工程,叫做speaker,顶级的CMakeLists.txt文件如下:
cmake_minimum_required(VERSION 2.8)
project(speaker)
add_subdirectory(src)
set( CMAKE_INSTALL_PREFIX "/opt/speaker" )
set(VERSION "1.0.1")
include (InstallRequiredSystemLibraries)
set(CPACK_PACKAGE_VERSION ${VERSION})
set(CPACK_PACKAGE_NAME "speaker")
set(CPACK_GENERATOR "RPM")
set(CPACK_PACKAGE_RELEASE 1)
set(CPACK_PACKAGE_CONTACT "test@foxavideo.com")
set(CPACK_PACKAGE_VENDOR "FoxAVideo")
set(CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
set(CPACK_OUTPUT_FILE_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/installer")
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_PACKAGE_RELEASE}.${CMAKE_SYSTEM_PROCESSOR}")
include(CPack)
src/CMakeLists.txt文件内容如下:
add_subdirectory(greetings)
set(appSrc main.cpp)
add_executable(speaker ${appSrc})
target_link_libraries( speaker greetings )
install( TARGETS speaker DESTINATION bin )
这里的speaker要链接的greetings的库的CMakeLists.txt文件内容如下:
set( libSrc greet.cpp )
add_library( greetings SHARED ${libSrc} )
install( TARGETS greetings DESTINATION lib )
那么在调用
$> make install
就会把speaker安装在目标目录的bin下面,而把libgreetings.so文件安装到目标目录的lib下面。
安装的路径
CMake中控制安装路径的是CMAKE_INSTALL_PREFIX这个变量,这个值有默认值,可以通过CMake的MESSAGE命令输出这个变量的值
MESSAGE( STATUS ${CMAKE_INSTALL_PREFIX})
默认是
/usr/local
要设置成别的目录,可以使用下面的命令
set ( CMAKE_INSTALL_PREFIX "/opt/<工程名>")
安装普通文件
安装任何文件,这个文件不一定是通过编译器编译出来的,可以是任何文件,比如一个文本文件,
install( FILES <文件> DESTINATION <相对路径> )
举个例子
install( FILES introduce.txt DESINATION doc )
就是把当前目录下面的 introduce.txt文件安装到目标目录的doc文件夹下面
注意这种方法不可以安装库或者可执行文件,因为会把文件的可执行属性去掉,也就是安装后这个文件是普通文件,不具有可执行属性。
安装外部或者已编译好的库或者可执行文件
不可用上面的 install( FILES … )这种方式,已经在上面解释了。而要用
install( PROGRAMS … )
例如
install( PROGRAMS boost_system src/lib/boost/libboost_system.so.1.3 DESTINATION lib )
和linux的cp命令的区别
CMake的install和linux的cp命令功能是不一样的
— Installing: /opt/tsiServer/bin/xxx
— Removed runtime path from "/opt/<工程名>/bin/xxx"
和真正的包安装的区别
CMake的install的文件不归系统的包管理工具所管理,也就是说使用
$> make install
安装的这些文件和包(这里的包确切的说是工程名子)的信息,系统的包管理工具并不会记录这些信息。为了验证这一点,使用下面的命令
$> rpm -qa <工程名>
什么都没有输出,这是因为rpm包管理工具并没有找到该包的任何信息。
当然CMake也可以生成rpm安装包,这要就利用CMake的CPack工具,关于这部分我将在另外一篇博客中讲述。
版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章转载自:IT夜班车,否则按侵权处理.