内部构建
PROJECT(projectname [CXX] [C] [Java]):
这个指令定义工程名称,并可指定工程支持的语言(这个指令隐式的定义了两个cmake变量:
<projectname>_BINARY_DIR以及<projectname>_SOURCE_DIR,这里就是 HELLO_BINARY_DIR和HELLO_SOURCE_DIR)
因为采用的是内部编译,两个变量目前指的都是工程所在路径/backup/cmake/t1
同时 cmake 系统也帮助我们预定义了 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR
变量,他们的值分别跟 HELLO_BINARY_DIR 与 HELLO_SOURCE_DIR 一致
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]):
用来显式的定义变量例如:SET(SRC_LIST main.c)
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...):
向终端输出用户定义的信息
ADD_EXECUTABLE(hello ${SRC_LIST}):
定义了这个工程会生成一个文件名为hello的可执行文件,相关的源文件是SRC_LIST中 定义的源文件列表($){}是引用变量)
外部构建
ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
这个指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。EXCLUDE_FROM_ALL 参数的含义是将这个目录从编译过程中排除
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
定义二进制文件的输出路径和库的输出路径
安装:
- make install DESTDIR=/tmp/test 将他安装在/tmp/test/usr/bin 目录,打包时这个方式经常被使用。
- ./configure --prefix=/usr/local(prefix---前缀)
- cmake -D CMAKE_INSTALL_PREFIX=/usr(CMAKE_INSTALL_PREFIX 变量类似于 configure 脚本的 –prefix)
cmake的安装指令(INSTALL):
1.目标文件的安装
INSTALL(TARGETS targets...
[[ARCHIVE|LIBRARY|RUNTIME]
[DESTINATION <dir>]
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[OPTIONAL]
] [...])
例如:INSTALL(TARGETS myrun mylib mystaticlib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION libstatic
)
TARGETS是目标文件,可以是静态库 / 动态库 / 可执行文件
DESTINATION定义安装路径,如果路径以/开头,那么指的是绝对路径,这时CMAKE_INSTALL_PREFIX 其实就无效了。如果你希望使用 CMAKE_INSTALL_PREFIX 来定义安装路径,就要写成相对路径,即不要以/开头,那么安装后的路径就${CMAKE_INSTALL_PREFIX}/<DESTINATION 定义的路径>
2.普通文件的安装
INSTALL(FILES files... DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[RENAME <name>] [OPTIONAL])
PERMISSIONS是指定访问权限,一般文件默认为OWNER_WRITE, OWNER_READ, GROUP_READ,和 WORLD_READ即 644 权限。脚本文件默认为OWNER_EXECUTE, GROUP_EXECUTE, 和 WORLD_EXECUTE,即 755 权限
3.目录的安装
INSTALL(DIRECTORY dirs... DESTINATION <dir>
[FILE_PERMISSIONS permissions...]
[DIRECTORY_PERMISSIONS permissions...]
[USE_SOURCE_PERMISSIONS]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[[PATTERN <pattern> | REGEX <regex>]
[EXCLUDE] [PERMISSIONS permissions...]] [...])
DIRECTORY 后面连接的是所在 Source 目录的相对路径
例如:INSTALL(DIRECTORY icons scripts/ DESTINATION share/myproj
PATTERN "CVS" EXCLUDE
PATTERN "scripts/*"
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
GROUP_EXECUTE GROUP_READ)
将 icons 目录安装到 <prefix>/share/myproj,将 scripts/中的内容安装到<prefix>/share/myproj不包含目录名为 CVS 的目录对于 scripts/*文件指定权限为 OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ
相关变量:
ARCHIVE---------静态库
LIBRARY---------动态库
RUNTIME---------可执行目标二进制
<projectname>_BINARY_DIR---------隐式定义的可执行文件目录
<projectname>_SOURCE_DIR---------隐式定义的源代码文件目录
EXECUTABLE_OUTPUT_PATH---------二进制文件输出路径
LIBRARY_OUTPUT_PATH---------库的输出路径
CMAKE_INSTALL_PREFIX---------编译目录前缀
TARGETS---------目标文件