CMake的install

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夜班车,否则按侵权处理.

    分享到:

留言

你的邮箱是保密的 必填的信息用*表示