要装osg earth, cmake 不会玩,好尴尬。下午看了 cmake 教程(47页)。
-- 几个关键词
PROJECT (project_name, [CXX] [C] [JAVA]) 指定工程名称,及工程支持的语言(可选)
SET (VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE] ]) 显示定义变量
MESSAGE ( [ SEND_ERROR | STATUS | FATAL_ERROR ] "message to display " ... ) 向终端输出用户定义的信息
ADD_EXECUTABLE ( OUTPUT input_src) 生成output 可执行文件,相关源文件是 input_src中定义的源文件列表
ADD_LIBRARY(lib name [SHARED | STATIC | MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... ) 由source文件列表生成某种类型的库文件
SET_TARGET_PROPERTIES (target1 target2 ... PROPERTIES prop1 value1 prop2 value2 ...) 设置输出目标的属性(比如名称,版本)
ADD_SUBDIRECTORY( source_dir [binary_dir] [EXCLUDE_FROM_ALL] ) 用于向当前工程添加存放源文件的子目录,并可指定中间二进制和目标二进制存放的位置。 exclude_from_all 参数是将这个目录从编译过程中排除。比如项目中的 example,可能是需要在工程编译完成之后,再单独编译的。
使用${} 引用变量
-- 外部构建
< 在源文件之外编译,生成可执行文件(库文件等)>
-- 目标文件的安装
INSTALL (TARGETS targets ... [
[ ARCHIVE | LIBRARY | RUNTIME]
[ DESTINATION <dir> ]
[ PERMISSIONS permissions ... ]
[ CONFIGURATIONS [Debug | Release | ... ]
]
[ COMPONENT <component>]
[ OPTIONAL ]
[ ....] )
二进制文件安装 TARGETS(二进制可执行文件,动态/静态库文件)
普通文件安装 FILES(头文件等)
非目标文件的可执行程序安装(脚本)PROGRAMS
目录安装 DIRECTORY
-- 安装共享库和头文件
使用install 安装
-- 使用外部共享库和头文件
INCLUDE_DIRECTORIES ( [AFTER | BEFORE] [SYSTEM] dir1 dir2 ...) 向工程中添加多个特定的头文件搜索路径。路径之间用空格分割,如果路径中包含了空格,可使用双引号将它阔气了。
CMAKE_INCLUDE_DIRECTORIES_BEFOR/AFTER (setting on), 控制添加的头文件搜索路径放在已有路径前还是后
LINK_DIRECTORIES ( dir1 dir2 .... ) 添加非标准的共享库搜索路径
TARGET_LINK_LIBRARIES (targe lib1 <debug | optimized> lib2 ... ) 为target 添加需要链接的共享库。
-- cmake环境变量
CMAKE_INCLUDE_PATH
CMAKE_LIBRARY_PATH
这两个变量是系统环境变量,在export中设置
FIND_PATH ( what_index NAMES xx.c PATHS path) 在指定路径 path中搜索文件名xx.c 如果没有显示path,就使用 CMAKE_INCLUDE_PATH 的值
同理, CMAKE_LIBRARY_PATH 是 FIND_LIBRARY 命令的默认搜索路径
--- 常用变量
CMAKE_BINARY_DIR PROJECT_BINARY_DIR <project_name>_BINARY_DIR 这三个变量在外部构建时,均指工程编译发生的目录。
CMAKE_SOURCE_DIR PROJECT_SOURCE_DIR <project_name>_SOURCE_DIR 一个意思,指向工程顶层目录
CMAKE_CURRENT_SOURCE_DIR 指当前cmakelists.txt 所在路径
CMAKE_CURRENT_BINARY_DIR 在外部构建中指的是 target 编译目录
CMAKE_CURRENT_LIST_FILE
CMAKE_MODULE_PATH 自定义cmake模块所在的路径
EXCUTABLE_OUTPUT_PATH / LIBRARY_OUTPUT_PATH 用来重新定义最终结果的存放目录
PROJECT_NAME
--- cmake 调用环境变量
$ENV{NAME} 调用系统环境变量
CMAKE_INCLUDE_CURRENT_DIR 自动添加 cmake_current_binary_dir & cmake_current_source_dir 到当前cmakelists.txt
-- cmake 常用指令
CMAKE_MINIMUM_REQUIRED ( VERSION versionNumber [FATAL_ERROR] )
FILE(WIRTE | APPEND | READ | GLOB | REMOVE | ... filename "message" variable [ ] ...
INCLUDE (file1 [] module [] ..) 载入cmakelistx.txt文件
FIND_ PACKAGE( <name> [major.minor] [QUIT] [NO_MODULE] [ [REQURIED | COMPONENTS] [ components ... ] ] ) 直接调用预定义模块
--- 控制指令
IF(WIN32)
# DO SOMETHING
ELSEIF( UNIX)
# DO SOMETHING
ELSEIF(APPLE)
# DO SOMETHING
ENDIF(WIN32)
FOREACH
--- 模块的使用 & 自定义模块 (扩展性)
- FINDCURL 举例
对于系统预定义的 Find<name>.cmake 模块,存在CMakeModules 文件夹里。 一般使用:
FIND_PACKAGE(CURL)
IF(CURL_FOUND)
INCLUDE_DIRECTORIES( ${CURL_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(curltest ${CURL_LIBRARY})
ELSE( CURL_FOUND)
MESSAGE(FATAL_ERROR "curl lib not found")
ENDIF(CURL_FOUND)
每个模块文件(.cmake) 定义以下变量:
<name>_FOUND
<name>_INCLUDE_DIR or <name>_INCLUDES
<name>_LIBRARY or <name>_LIBRARIES
通过 <name>_FOUND 判断模块是否被找到。若找到,则 将 <name>_INCLUDE_DIR 加入 INCLUDE_DIRECTORIES, 将<name>_LIBRARY加入 TARGET_LINK_DIRECTORIES 中。