CMakeLists之make install(三)

1、安装命令详解

1.1、CMAKE_INSTALL_PREFIX命令


CMAKE_INSTALL_PREFIX变量类似于configure脚本的 –prefix,常见的使用方法看

起来是这个样子:

cmake -DCMAKE_INSTALL_PREFIX=/usr .

1.2、INSTALL命令

1.2.1、INSTALL命令基础

INSTALL 指令用于定义安装规则,安装的内容可以包括目标二进制、动态库、静态库以及 文件、目录、脚本等。

INSTALL 指令包含了各种安装类型,我们需要一个个分开解释:

 

1.2.2、目标文件的安装

INSTALL(TARGETS targets...
            [[ARCHIVE|LIBRARY|RUNTIME]
                        [DESTINATION ]
                        [PERMISSIONS permissions...]
                        [CONFIGURATIONS
          [Debug|Release|...]]
                        [COMPONENT ]
                        [OPTIONAL]
                       ] [...])

参数中的 TARGETS 后面跟的就是我们通过 ADD_EXECUTABLE 或者 ADD_LIBRARY 定义的 目标文件,可能是可执行二进制、动态库、静态库

目标类型也就相对应的有三种,ARCHIVE 特指静态库,LIBRARY 特指动态库,RUNTIME 特指可执行目标二进制。

DESTINATION 定义了安装的路径,如果路径以/开头,那么指的是绝对路径,这时候 CMAKE_INSTALL_PREFIX 其实就无效了。如果你希望使用 CMAKE_INSTALL_PREFIX 来 定义安装路径,就要写成相对路径,即不要以/开头,那么安装后的路径就是

${CMAKE_INSTALL_PREFIX}/

1.2.3、INSTALL实例

INSTALL(TARGETS myrun mylib mystaticlib
     RUNTIME DESTINATION bin
     LIBRARY DESTINATION lib
     ARCHIVE DESTINATION libstatic
)

可执行二进制 myrun 安装到${CMAKE_INSTALL_PREFIX}/bin 目录
动态库 libmylib 安装到${CMAKE_INSTALL_PREFIX}/lib 目录
静态库 libmystaticlib 安装到${CMAKE_INSTALL_PREFIX}/libstatic 目录

1.2.4、普通文件的安装

INSTALL(FILES files... DESTINATION 
            [PERMISSIONS permissions...]
            [CONFIGURATIONS [Debug|Release|...]]
            [COMPONENT ]
            [RENAME ] [OPTIONAL])

可用于安装一般文件,并可以指定访问权限,文件名是此指令所在路径下的相对路径。如果 默认不定义权限 PERMISSIONS,安装后的权限为:

OWNER_WRITE, OWNER_READ, GROUP_READ,和WORLD_READ,即644权限。

1.2.5、非目标文件的可执行程序安装

INSTALL(PROGRAMS files... DESTINATION 
            [PERMISSIONS permissions...]
            [CONFIGURATIONS [Debug|Release|...]]
            [COMPONENT ]
            [RENAME ] [OPTIONAL])

跟上面的 FILES 指令使用方法一样,唯一的不同是安装后权限为: OWNER_EXECUTE, GROUP_EXECUTE, 和WORLD_EXECUTE,即755权限

1.2.6、目录的安装

INSTALL(DIRECTORY dirs... DESTINATION 
            [FILE_PERMISSIONS permissions...]
            [DIRECTORY_PERMISSIONS permissions...]
            [USE_SOURCE_PERMISSIONS]
            [CONFIGURATIONS [Debug|Release|...]]
            [COMPONENT ]
            [[PATTERN  | REGEX ]
             [EXCLUDE] [PERMISSIONS permissions...]] [...])

这里主要介绍其中的 DIRECTORY、PATTERN 以及 PERMISSIONS 参数。

DIRECTORY 后面连接的是所在 Source 目录的相对路径,但务必注意:

abc 和 abc/有很大的区别。

如果目录名不以/结尾,那么这个目录将被安装为目标路径下的 abc,如果目录名以/结尾, 代表将这个目录中的内容安装到目标路径,但不包括这个目录本身。

1.2.7、pattern用于正则表达式过滤

PATTERN 用于使用正则表达式进行过滤,PERMISSIONS 用于指定 PATTERN 过滤后的文件 权限。

我们来看一个例子:

INSTALL(DIRECTORY icons scripts/ DESTINATION share/myproj
PATTERN "CVS" EXCLUDE
            PATTERN "scripts/*"
            PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
                    GROUP_EXECUTE GROUP_READ)

这条指令的执行结果是:
将icons目录安装到 /share/myproj,将scripts/中的内容安装到

/share/myproj

不包含目录名为CVS的目录,对于scripts/*文件指定权限为 OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ.

1.2.8、安装时 CMAKE 脚本执行

INSTALL([[SCRIPT ] [CODE ]] [...])
SCRIPT 参数用于在安装时调用 cmake 脚本文件(也就是.cmake 文件) CODE 参数用于执行 CMAKE 指令,必须以双引号括起来。比如: INSTALL(CODE "MESSAGE(\"Sample install message.\")")

安装还有几个被标记为过时的指令,比如 INSTALL_FILES 等,这些指令已经不再推荐使 用,所以,这里就不再赘述了。

下面,我们就来改写我们的工程文件,让他来支持各种文件的安装,并且,我们要使用 CMAKE_INSTALL_PREFIX 指令。

2、实例

CMakeLists外部构建(二) 目录结构如下

CMakeLists之make install(三)_第1张图片

在CMakeLists.txt目录下加入如下语句执行安装操作:

INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/t2)
INSTALL(PROGRAMS bin/run.sh DESTINATION bin)
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/t2)

执行

cmake -DCMAKE_INSTALL_PREFIX=/tmp/t2/usr ..
make
make install

文件COPYRIGHT README 安装到 /tmp/t2/usr/share/doc/cmake/t2目录中
执行文件bin/run.sh 安装到 /tmp/t2/bin中
文件夹doc中的文件安装到 /tmp/t2/share/doc/cmake/t2中

如果我没有定义 CMAKE_INSTALL_PREFIX,执行cmake ..;make;make install, CMAKE_INSTALL_PREFIX 的默认定义是/usr/local

你可能感兴趣的:(c++,c++,CMakeLists.txt)