learnxinyminutes-docs/zh-cn/cmake-cn.html.markdown
2020-05-17 19:05:28 +08:00

169 lines
5.1 KiB
CMake
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
category: tool
tool: cmake
contributors:
- ["Bruno Alano", "https://github.com/brunoalano"]
translators:
- ["tx23", "https://github.com/tx23"]
filename: CMake-cn
lang: zh-cn
---
CMake
CMake Makefile 跨平台的自动配置问题(不同的make解释器有不同的命令)
CMake
CMake使 CMakeLists.txt
使Unix makefiles Windows MSVC projects/workspaces
```cmake
# 在 CMake 中, 这是一条命令
# 要运行我们的代码,请执行以下命令:
# - mkdir build && cd build
# - cmake ..
# - make
#
# 通过上述命令,我们将遵循最佳实践在子目录中进行编译
# 在第二行命令中我们请求Cmake 生成新的依赖于系统的Makefile文件。
# 最后我们运行本地的make 命令。
#------------------------------------------------------------------------------
# 基础部分
#------------------------------------------------------------------------------
#
# Cmake文件必须被命令为 “CMakeLists.txt” 。
# 设置生成Makefile的CMake所需最低版本要求
cmake_minimum_required (VERSION 2.8)
# 当版本小于2.8时,需要加入关键字 FATAL_ERROR。
cmake_minimum_required (VERSION 2.8 FATAL_ERROR)
# 在这里定义了项目的名称同时会影响Cmake 生成的目录命名约定。
# 我们可以将代码的语言作为第二个参数传入。
project (learncmake C)
# 设置项目的源目录(仅仅是由于惯例)
set( LEARN_CMAKE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} )
set( LEARN_CMAKE_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} )
# 在构建系统中用“semver”风格为我们代码设置当前版本是很有用的。
set (LEARN_CMAKE_VERSION_MAJOR 1)
set (LEARN_CMAKE_VERSION_MINOR 0)
set (LEARN_CMAKE_VERSION_PATCH 0)
# 将变量(版本号)发送到源代码头
configure_file (
"${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
"${PROJECT_BINARY_DIR}/TutorialConfig.h"
)
# 包含目录
# 在 GCC中, 该语句等同于 "-I" 命令
include_directories( include )
# 在哪里安装其他库注意在此处提供includes路径后续检查将解决所有其他问题
set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMake/modules/" )
# 条件
if ( CONDITION )
# 输出!
# 附带信息
message(STATUS "My message")
# CMake 警告,继续处理
message(WARNING "My message")
# CMake 警告 (dev),继续处理
message(AUTHOR_WARNING "My message")
# CMake 错误,继续处理但是会跳过生成
message(SEND_ERROR "My message")
# CMake 错误,停止处理和生成
message(FATAL_ERROR "My message")
endif()
if( CONDITION )
elseif( CONDITION )
else( CONDITION )
endif( CONDITION )
# 循环
foreach(loop_var arg1 arg2 ...)
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
endforeach(loop_var)
foreach(loop_var RANGE total)
foreach(loop_var RANGE start stop [step])
foreach(loop_var IN [LISTS [list1 [...]]]
[ITEMS [item1 [...]]])
while(condition)
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
endwhile(condition)
# 逻辑运算
if(FALSE AND (FALSE OR TRUE))
message("Don't display!")
endif()
# 将常规,缓存或环境变量设置为给定值。
# 如果指定了PARENT_SCOPE选项则将在当前作用域上的作用域中设置变量
# `set(<variable> <value>... [PARENT_SCOPE])`
# 如何在带引号和不带引号的参数中引用变量How to reference variables inside quoted and unquoted arguments?
# 如果未设置变量,变量引用由变量值或空字符串替换。
${variable_name}
# 清单
# 设置源文件列表
set( LEARN_CMAKE_SOURCES
src/main.c
src/imagem.c
src/pather.c
)
# 调用编译器
#
# ${PROJECT_NAME} 即 Learn_CMake
add_executable( ${PROJECT_NAME} ${LEARN_CMAKE_SOURCES} )
# 链接库
target_link_libraries( ${PROJECT_NAME} ${LIBS} m )
# 在哪里安装其他库注意在此处提供includes路径后续检查将解决所有其他问题
set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMake/modules/" )
# 编译条件 (gcc ; g++)
if ( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" )
message( STATUS "Setting the flags for ${CMAKE_C_COMPILER_ID} compiler" )
add_definitions( --std=c99 )
endif()
# 检查 OS
if( UNIX )
set( LEARN_CMAKE_DEFINITIONS
"${LEARN_CMAKE_DEFINITIONS} -Wall -Wextra -Werror -Wno-deprecated-declarations -Wno-unused-parameter -Wno-comment" )
endif()
```
### 资源
+ [CMake tutorial](https://cmake.org/cmake-tutorial/)
+ [CMake documentation](https://cmake.org/documentation/)
+ [Mastering CMake](http://amzn.com/1930934319/)
+ [An Introduction to Modern CMake](https://cliutils.gitlab.io/modern-cmake/)