Welcome to my personal blog: www.freehacker.cn
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。
CMake的所有的语句都写在一个叫:CMakeLists.txt 的文件中。当CMakeLists.txt文件确定后,可以用ccmake命令对相关 的变量值进行配置。这个命令必须指向CMakeLists.txt所在的目录。配置完成之后,应用cmake命令生成相应的makefile(在Unix like系统下)或者 project文件(指定用window下的相应编程工具编译时)。需要为任何子目录建立一个CMakeLists.txt。
其基本操作流程为:
ccmake directory
cmake directory
cmake -DCMAKE_BUILD_TYPE=Debug/Release directory
make
其中,directory为CMakeLists.txt所在目录,Makefile等文件的生成目录为cmake执行目录:
注:为了方便描述,下面的文件目录按照以下规则:
工程顶层目录:/cmake
in source编译下:工程编译发生目录为/cmake
out of source编译下:工程编译目录为/cmake/build
源文件所在目录为:/cmake/src
二进制文件目录:/cmake/build/bin
|----build/builds
| |----cmake
| |----mingw32
| |----msvc
| |----redhat
| |----valgrind
| |----zos
|----common
|----config
|----debug
|----doc
|----include
|----release
|----src
|----tests
|----tools
|----utils
|--- AUTHORS
|--- autogen.bat/sh
|--- CMakeLists.txt
|--- COPYING
|--- INSTALL
|--- MAINTAINERS
|--- NEWS
|--- README.md
CMAKE_SOURCE_DIR
PROJECT_SOURCE_DIR
_SOURCE_DIR
// 以下环境变量在in source编译情况下为工程顶层目录
CMAKE_BINARY_DIR
PROJECT_BINARY_DIR
_BINARY_DIR
//out of source编译情况下
CMAKE_BINARY_DIR
PROJECT_BINARY_DIR
_BINARY_DIR
CMAKE_CURRENT_SOURCE_DIR //当前处理的 CMakeLists.txt 所在的路径。例如源文件所在目录/cmake/src
//如果是in source编译,就是工程顶层目录/cmake
//如果是out of source编译,就是target编译目录(/cmake/build/bin),可以使用ADD_SUBDIRECTORY(src bin)来更改这个值。
CMAKE_CURRRENT_BINARY_DIR
EXECUTABLE_OUTPUT_PATH
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
LIBRARY_OUTPUT_PATH
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
PROJECT_SOURCE_DIR为工程所在目录;PROJECT_BINARY_DIR为编译发生的当前目录,也就是make的执行目录。
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(projectname [CXX] [C] [Java])
示例:PROJECT (HELLO CXX)
用来定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,默认情况表示支持所有语言。
这个指令隐式的定义了两个cmake变量:
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
示例:SET(SRC_LIST main.cpp t1.cpp t2.cpp)
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)
示例:MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
用于向终端输出用户定义的信息,包含三种类型:
ADD_EXECUTABLE(demo ${SRC_LIST})
ADD_EXECUTABLE(demo main.cpp t1.cpp t2.cpp)
定义了这个工程会生成一个名为demo的可执行文件,相关的源文件是SRC_LIST中定义的源文件列表。
ADD_LIBRARY(libname [SHARED|STATIC|MODULE][EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
SET_TARGET_PROPERTIES(target1 target2 ...PROPERTIES prop1 value1prop2 value2 ...)
用来设置输出的名称,对于动态库,还可以用来指定动态库版本和 API 版本。
INSTALL(TARGETS myrun mylib mystaticlib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION libstatic
)
运行下面的代码,会先创建一个./debug目录,然后拷贝file.dll到./debug目录。
add_custom_command(
OUTPUT ./debug/file.dll
COMMAND mkdir -p ./debug
cp ./file.dll ./debug
DEPENDS ./file.dll
)
add_custom_target(dlltest DEPENDS ./debug/file.dll)
add_executable(demo ${SRC_LIST})
add_dependencies(demo dlltest )