cmake基础模板

2020-04-26

cmake概述

因为公司的某个项目,接触了cmake,发现果然比make语法更改高级,且更加智能和好用!因此,写此篇文章以记之。

更多信息请参看:cmake官网

要使用cmake,至少得懂得它的大概!其实cmake的目的很简单,就是通过cmake来解析cmakelist.txt文件,从而生成makefile,来达到编译链接的目的。至于为什么不直接写makefile,而是使用cmake。则是因为cmake更加好写和移植!这也是cmake,以及autotools等工具存在的意义!

一言以蔽之,cmake是make的上层工具!

使用cmake的第一步是安装cmake程序!程序请自行去cmake官网下载安装(www.cmake.org)。

第二步,则是编写cmakelist.txt!通常情况下,每个源码目录都会存在一个cmakelist.txt。

cmakelist根目录

CMAKE_MINIMUM_REQUIRED(VERSION 3.7)
PROJECT(delta_os_arch_mips_kernel)

#重新设置CMAKE_SOURCE_DIR为当前CmakeLists.txt所在路径
SET(CMAKE_SOURCE_DIR .)


SET(FILE_MIPS_KERNEL_DH 
"${CMAKE_SOURCE_DIR}/h/"
)

##拷贝头文件
FILE(COPY ${FILE_MIPS_KERNEL_DH} DESTINATION ${INCLUDE_PATH}/DeltaCore/)

INCLUDE_DIRECTORIES(
"${INCLUDE_PATH}/" 
"${CONFIG_H}/h/" 
)

#设置宏定义
ADD_DEFINITIONS(-D_CORETEK_GLOBAL_SR_IM)

SUBDIRS(src)

ADD_LIBRARY(arch
$<TARGET_OBJECTS:os_arch_mips_kernel_asm> 
$<TARGET_OBJECTS:os_arch_mips_kernel_c> 
)

#clean-arch删除build下delta_os_arch_mips_kernel模块的的所有临时文件
ADD_CUSTOM_TARGET(clean-arch
   COMMAND ${CMAKE_BUILD_TOOL} clean
   COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_SOURCE_DIR}/clean-all.cmake"
)

SET(LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}/lib")

INSTALL(TARGETS arch
        EXPORT  delta_os_target 
        ARCHIVE DESTINATION "${CMAKE_INSTALL_PREFIX}/lib_smp/gnu4.3.3/mips/MIPSI64/little"  	# 静态库安装路径
        )
		
INSTALL(DIRECTORY "${CMAKE_SOURCE_DIR}/h/"
        DESTINATION "${CMAKE_INSTALL_PREFIX}/include"
		)
  1. CMAKE_MINIMUM_REQUIRED(VERSION versionNumber [FATAL_ERROR])

    比如 CMAKE_MINIMUM_REQUIRED(VERSION 2.5 FATAL_ERROR)如果 cmake 版本小与 2.5,则出现严重错误,整个过程中止。

  2. PROJECT(projectname [CXX] [C] [Java])

    你可以用这个指令定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,默认情况表示支持所有语言。这个指令隐式的定义了两个 cmake 变量:<projectname>_BINARY_DIR 以及<projectname>_SOURCE_DIR。同时 cmake 系统也帮助我们预定义了 PROJECT_BINARY_DIR PROJECT_SOURCE_DIR变量,他们的值分别跟以上两个变量 一致。

  3. CMAKE_SOURCE_DIR,PROJECT_SOURCE_DIR,<projectname>_SOURCE_DIR

    这三个变量指代的内容是一致的,不论采用何种编译方式,都是工程顶层目录。

  4. SET(VAR [VALUE][CACHE TYPE DOCSTRING [FORCE]])

    现阶段,你只需要了解 SET 指令可以用来显式的定义变量即可。

  5. INCLUDE_DIRECTORIES([AFTER|BEFORE][SYSTEM] dir1 dir2 ...)

    这条指令可以用来向工程添加多个特定的头文件搜索路径,路径之间用空格分割,如果路径中包含了空格,可以使用双引号将它括起来,默认的行为是追加到当前的头文件搜索路径的后面.

  6. ADD_DEFINITIONS

    向 C/C++编译器添加-D 定义,比如:ADD_DEFINITIONS(-DENABLE_DEBUG -DABC),参数之间用空格分割。

  7. SUBDIRS(dir1 dir2...)它可以一次添加多个子目录,并且,即使外部编译,子目录体系仍然会被保存。

  8. ADD_LIBRARY

  9. 创建一个特殊的“对象库”目标。 对象库编译源文件,但不将其对象文件存档或链接到库中。 相反,add_library()或add_executableadd_library()创建的其他目标可以使用$<TARGET_OBJECTS:objlib>;的表达式引用对象作为源,其中objlib是对象库名。

    ADD_LIBRARY(arch
    $<TARGET_OBJECTS:os_arch_mips_kernel_asm> 
    $<TARGET_OBJECTS:os_arch_mips_kernel_c> 
    )
    

子目录

ENABLE_LANGUAGE(ASM)

AUX_SOURCE_DIRECTORY(. SRC_OS_ARCH_MIPS_KERNEL_C)

ADD_LIBRARY(os_arch_mips_kernel_c OBJECT ${SRC_OS_ARCH_MIPS_KERNEL_C})
  1. AUX_SOURCE_DIRECTORY(dir VARIABLE)作用是发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表。因为目前 cmake 还不能自动发现新添加的源文件。

  2. ADD_LIBRARY

    和根目录的ADD_LIBRARY配合使用

  3. ADD_COMPILE_OPTIONS

    该目录下的文件添加编译选项。

ENABLE_LANGUAGE(ASM)

ADD_COMPILE_OPTIONS(-xassembler-with-cpp)

SET(SRC_OS_ARCH_MIPS_KERNEL_ASM 
asm.s
core.s
)

ADD_LIBRARY(os_arch_mips_kernel_asm OBJECT ${SRC_OS_ARCH_MIPS_KERNEL_ASM})