CMake的CPack

CMake的CPack

 

CMake不仅可以用来管理工程,编译,安装,还可以制作安装包,安装包可以是压缩包还可以是rpm包。

下面利用一个简单的例子来解释如何使用CMake的cpack制作安装包

工程名 = Speaker

目录结构

Speaker +

              — CMakeLists.txt                ———> 1

              — src +  

                        — CMakeLists.txt              ———-> 2

                        — main.cpp

                        — greetings+

                                             — CMakeLists.txt               ———->3

                                             — greet.cpp

                                             — greet.h

工程有一个主程序 speaker和动态库 greetings

目的: 编译,安装,并制作安装包

总共3个CMakeLists.txt文件,我们分别使用1, 2, 3 来编号下面列出它们的内容:

CMakeLists.txt                ———> 1

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)

 

CMakeLists.txt                ———> 2

include_directories( ${PROJECT_SOURCE_DIR}/src/greetings )

add_subdirectory(greetings)

set(appSrc main.cpp)
add_executable(speaker ${appSrc})
target_link_libraries( speaker greetings )

install( TARGETS speaker DESTINATION bin )

 

CMakeLists.txt                ———> 3

set( libSrc greet.cpp )
add_library( greetings SHARED ${libSrc} )

install( TARGETS greetings DESTINATION lib )

 

main.cpp

#include <iostream>
#include "greet.h"

using namespace std;


int main( void )
{
    cout<<"test world"<<endl;
    sayWelcome();
}

 

greet.h

void sayWelcome( void );

 

greet.cpp

#include <iostream>
#include "greet.h"

void sayWelcome( void )
{
    std::cout<<"welcome you guys"<<std::endl;
}

 

有了这些东西,我们在根目录下面执行下面的命令,

$> mkdir build

$> cd build

$> cmake ..

$> make

$> make install

$> cpack

然后我们发现在 /opt/下面的多了一个speaker文件夹,里面有bin和lib文件夹,里面是我们上面的工程里面的可执行文件和动态库文件。然后在工程的根目录下面多了一个installer文件夹,里面有个rpm文件,这就是要rpm安装包。

/opt/speaker这个下面的东西是执行 make install命令安装的。

rpm安装包是在执行 cpack文件生成的。这里要提一下,如果运行这个命令默认是找当前文件夹下面CPackConfig.cmake文件,所以这个命令的效果等同于

$> cpack –config CPackConfig.cmake

CPackConfig.cmake这个文件是

$> cmake ..

这个命令执行时生成的。和这个文件类似的还有一个CPackSourceConfig.cmake。这个用来生成发布源代码的安装包,可以试试

$> cpack –config CPackSourceConfig.cmake

再看看 installer这个目录下面新生成的文件。

注意文章一开头提到CMake还可以生成压缩文档形式的安装包,我们把第一个CMakeLists.txt文件的绿色的那一行去掉,也就是

set(CPACK_GENERATOR "RPM")

生成的就是压缩文档形式的安装包

这一行告诉cmake,使用rpm生成器生成安装包。

 

安装后使用rpm查询我们的包,

$> rpm -qa Speaker

 

发现找不到,然后再试试将Speaker改为speaker,

$> rpm -qa Speaker

speaker-1.0.1-1.x86_64

这是怎么回事呢?

原来是package name在制作安装包的自动转为小写了。

 

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章转载自:IT夜班车,否则按侵权处理.

    分享到:

留言

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