install

安装的需求有两种情况:
  • 代码编译后执行make install安装;
  • 打包时指定安装路径.

CMAKE_INSTALL_PREFIX

该变量用于指定安装时的路径前缀.

赋值方式:
  • CMakeLists.txt中使用set指令设置该变量的值:

    set(CMAKE_INSTALL_PREFIX <install_path>)
    

    需要注意的是, 该变量要在project(<project_name>)指令后面设置.

  • 在执行cmake命令时, 在命令行中定义:

    cmake -DCMAKE_INSTALL_PREFIX=<install_path>
    
  • 如果没有在CMakeLists.txt中定义CMAKE_INSTALL_PREFIX, 也没有在命令行中赋值, 默认值是/usr/local.

指定安装路径

指定安装路径时, 可以使用相对路径绝对路径. 使用相对路径时, 是相对 CMAKE_INSTALL_PREFIX 的相对路径, 如果没有显式设定该变量的值, 默认是 /usr/local.

install指令

用于定义安装规则, 安装的目标可以包括 二进制可执行文件, 动态库, 静态库, 普通文件, 目录, 脚本等.

install指令常用选项

  • DESTINATION - 指定安装路径.

    • 绝对路径
    • 相对路径(相对CMAKE_INSTALL_PREFIX的路径)
    • 安装时重定位
  • PERMISSEIONS - 指定安装文件的权限.

    如果没有显式指定安装文件的权限, 根据文件类型使用默认权限.

Installing Targets

  • TARGETS定义要安装目标文件, 是通过add_executableadd_library生成的目标文件, 可以是二进制可执行文件, 动态库或静态库, 目标类型也就相应的有三种(Linux平台):

    • ARCHIVE - 静态库
    • LIBRARY - 动态库
    • RUNTIME - 二进制可执行文件
  • 若在一个install指令中安装多个目标文件, 先在TARGETS后列出安装目标文件列表, 之后需要指定每一个目标文件的类型, 安装路径, 权限等参数.

Example:

install(TARGETS my_run my lib my_staticlib
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION staticlib
)

Installing Files

安装普通文件, install指令的参数以FILES开头, 后接安装文件列表, 多个文件之间用空格分隔; 若安装路径是以相对路径的形式给出, 表示相对当前source directory的路径;

注解

安装目标文件时, 若install指令中有多个目标文件, 需要指定每个目标文件的类型, 安装路径等参数; 但安装普通文件时, 若install指令中有多个普通文件, 将这些普通文件列在FILES后即可, 不需要为每一个普通文件单独指定其参数 (或者说这些普通文件只能安装到相同的路径下).

Installing Directories

  • 安装目录时, 指令以DIRECTORY参数开头, 后接要安装的目录列表, 如果有多个要安装的目录, 用空格分隔;

    如果要安装的目录是以相对路径给出, 表示相对当前source directory的路径.

  • 对于要安装的目录, abcabc/两种写法有很大的区别;

    • 如果目录名不以/结尾, 那么这个目录被安装为目标路径下的abc;
    • 如果目录名以/结尾, 那么这个目录中的内容将被安装到目标路径下,但不包括这个路径自身.
  • 安装目录中的内容时, 还使用使用正则表达式包含/排除特定文件.

Example:

install(DIRECTORY icons scripts/
    DESTINATION share/myproj
)

这条指令的执行结果是: 将icos目录安装到${CMAKE_INSTALL_PREFIX}/share/myproj, 将scripts/中的内容安装到${CMAKE_INSTALL_PREFIX}/share/proj, 但不包含scripts目录自身.