cmake基础模板

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_DIRPROJECT_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})

出差必备

买火车票、高铁票、机票,订酒店都打9折的出行工具TRIP,点击注册

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351