CMAKE用法示例

CMAKE用法示例

  • 命令行相关示例
    • 使用cmake创建目录
    • 在命令行中传入CMAKE变量
    • 让cmake使用指定的编译工具链
    • 让cmake产生Unix Makefile
    • 以4线程编译目标
  • CMAKE脚本相关示例
    • 指定最小的cmake版本号
    • 输出日志
    • 定义工程名及工程使用的语言类型
    • 定义语言标准
    • 定义一个变量
    • 判断一个变量没有被定义
    • 判断一个变量内容与特定的字符串相等
    • 设置可执行程序后缀名
    • 设置静态库的默认前缀(没有lib)
    • 添加编译器头文件搜索路径
    • 判断子cmake文件是否存在并包含它
    • 添加C编译选项
    • 添加C++编译选项
    • 添加链接器选项
    • 添加子目录
    • 将源码文件添加到链接目标中
    • 将库文件添加到连接目标中
    • 将子目录中的所有文件添加到变量中
    • 产生静态库
  • 一个ARMCC的toolchain配置示例
  • 一个ARMCC编译环境的环境变量设置示例

命令行相关示例

使用cmake创建目录

cmake -E make_directory out

在命令行中传入CMAKE变量

cmake -DAPP_NAME=HELLOWORLD

让cmake使用指定的编译工具链

cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake

让cmake产生Unix Makefile

cmake -G "CodeBlocks - Unix Makefiles"

以4线程编译目标

cmake --build out -- -j4

CMAKE脚本相关示例

指定最小的cmake版本号

cmake_minimum_required(VERSION 3.5)

输出日志

MESSAGE("Start build helloworld application")

定义工程名及工程使用的语言类型

PROJECT(HelloWorld C CXX)

以上语句定义了一个明文HelloWorld的工程,并告诉cmake这个工程使用C和C++语言。

定义语言标准

SET(CMAKE_C_STANDARD 99)
SET(CMAKE_CXX_STANDARD 11)

以上语句告诉cmake,C语言标准为C99,C++标准为C++11。

定义一个变量

SET(APP_NAME HelloWorld)

判断一个变量没有被定义

IF (NOT DEFINED APP_NAME )
    SET(APP_NAME "HelloWorld")
ENDIF()

判断一个变量内容与特定的字符串相等

IF (${APP_NAME } STREQUAL "HelloWorld")
    SET(APP_VER "1.2")
ENDIF()

设置可执行程序后缀名

SET(CMAKE_EXECUTABLE_SUFFIX ".elf")

设置静态库的默认前缀(没有lib)

SET(CMAKE_STATIC_LIBRARY_PREFIX_C "")

添加编译器头文件搜索路径

INCLUDE_DIRECTORIES("include")

判断子cmake文件是否存在并包含它

IF (EXISTS "productXX_cfg.cmake")
INCLUDE ("productXX_cfg.cmake")
ENDIF ()

添加C编译选项

STRING(APPEND CMAKE_C_FLAGS " -DLOG_DISABLE ")

添加C++编译选项

STRING(APPEND CMAKE_CXX_FLAGS " -DLOG_DISABLE ")

添加链接器选项

STRING(APPEND CMAKE_EXE_LINKER_FLAGS " --no_debug ")

添加子目录

注意,子目录中必须有CMakeLists.txt文件,这个语句就是告诉cmake子目录中还有需要解析的脚本文件。

ADD_SUBDIRECTORY(src)

将源码文件添加到链接目标中

ADD_EXECUTABLE(HelloWorld src/helloworld.c)

将库文件添加到连接目标中

TARGET_LINK_LIBRARIES(HelloWorld mysdk)

这个语句会将 mysdk.a 这个静态库链接到目标中。

将子目录中的所有文件添加到变量中

AUX_SOURCE_DIRECTORY(sub_app SUBAPP_SRC_LIST)

这个语句会将 sub_app 这个目录中的所有源码文件名添加到变量SUBAPP_SRC_LIST中。

产生静态库

ADD_LIBRARY(subapp STATIC ${SUBAPP_SRC_LIST})

这个语句会将 SUBAPP_SRC_LIST中的所有源码文件编译打包成为一个名为subapp的静态库。

一个ARMCC的toolchain配置示例

INCLUDE(CMakeForceCompiler)

# 指定目标系统类型及架构类型
SET(CMAKE_SYSTEM_NAME Generic)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_SYSTEM_PROCESSOR arm)
SET(CMAKE_C_COMPILER_WORKS 1)

# 指定交叉编译器,路径需要使用cygwin形式的路径,否则找不到
SET(TOOLCHAIN_ROOT_PATH "$ENV{TOOLCHAIN_ROOT_PATH}")
SET(CMAKE_C_COMPILER "${TOOLCHAIN_ROOT_PATH}/bin/armcc.exe")
SET(CMAKE_CXX_COMPILER "${TOOLCHAIN_ROOT_PATH}/bin/armcc.exe")
SET(CMAKE_AR "${TOOLCHAIN_ROOT_PATH}/bin/armar.exe" CACHE FILEPATH "Archiver")

MESSAGE("TOOLCHAIN_ROOT_PATH: ${TOOLCHAIN_ROOT_PATH}")

# 清除缺省的编译、连接器选项
UNSET(CMAKE_C_FLAGS CACHE)
UNSET(CMAKE_CXX_FLAGS CACHE)
UNSET(CMAKE_EXE_LINKER_FLAGS CACHE)
UNSET(CMAKE_AR_FLAGS CACHE)

# 设置编译、打包工具命令格式
SET(CMAKE_C_ARCHIVE_CREATE " ${CMAKE_AR_FLAGS} -o  " CACHE STRING "C Archive Create")
SET(CMAKE_CXX_ARCHIVE_CREATE " ${CMAKE_AR_FLAGS} -o  " CACHE STRING "CXX Archive Create")

# 设置编译器提供的头文件路径
include_directories("${TOOLCHAIN_ROOT_PATH}/include")

# where is the target environment 
SET(CMAKE_FIND_ROOT_PATH "${TOOLCHAIN_ROOT_PATH}")

# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

以上toolchain配置需要依赖一些环境变量,请参考下面一个章节。

一个ARMCC编译环境的环境变量设置示例

@echo off
@echo --------------------------------------
@echo ENV Setup
@echo --------------------------------------
@set SRC_ROOT=%~dp0

:: 避免此脚本被反复执行后path环境变量超长导致的命令行错误
@IF NOT "%ENV_SETUP%"=="" (goto envsetup_end)

:: 因为我们使用Unix风格的makefile,文件路径需要使用unix风格,所以需要用到cygpath.exe来进行路径转换
@set CYGPATH=C:\cygwin64\bin\cygpath.exe

:: toolchian中直接用了这个环境变量,因此需要用cygwin格式的路径
@set TOOLCHAIN_ROOT_PATH=/cygdrive/c/Apps/ARMCT5.01/94

:: 可根据需求设置path路径
@set path=C:\Python27;C:\cygwin64\bin;C:\Apps\ARMCT5.01\94\bin;%SRC_ROOT%tools;%path%

:: 这里设置默认的应用名称
@echo --------------------------------------
@echo 应用名默认: HelloWorld
@echo --------------------------------------
@set APP_NAME=HelloWorld

@SET ENV_SETUP=1
:envsetup_end

@color 07

你可能感兴趣的:(cmake,armcc,ARM嵌入式)