关于cmake:Y-分钟速成-CMake

35次阅读

共计 3123 个字符,预计需要花费 8 分钟才能阅读完成。

源代码下载:CMake-cn

CMake 是一个跨平台且开源的自动化构建零碎工具。通过该工具你能够对你的源代码进行测试、编译或创立安装包。

CMake 试图去解决 Makefile 跨平台的主动配置问题 (不同的 make 解释器有不同的命令),以及链接第三方库时的易用性问题。

CMake 是一个可扩大的开源零碎,它以操作系统和与编译器无关的形式治理构建过程。与其余许多跨平台零碎不同的是,
CMake 被设计为与本机的构建环境联合应用。它通过被搁置于每个源文件目录下的简略配置文件(名为 CMakeLists.txt 的文件)
来生成惯例应用的规范构建文件(比方:Unix 下的 makefiles 文件或 Windows MSVC 中的 projects/workspaces)。

# 在 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
  • CMake documentation
  • Mastering CMake
  • An Introduction to Modern CMake

有倡议?或者发现什么谬误?在 Github 上开一个 issue,或者发动 pull request!


原著 Bruno Alano,并由 0 个好心人批改。
© 2022 Bruno Alano
Translated by: tx23
本作品采纳 CC BY-SA 3.0 协定进行许可。

正文完
 0