cmake -E make_directory out
cmake -DAPP_NAME=HELLOWORLD
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake
cmake -G "CodeBlocks - Unix Makefiles"
cmake --build out -- -j4
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")
SET(CMAKE_STATIC_LIBRARY_PREFIX_C "")
INCLUDE_DIRECTORIES("include")
IF (EXISTS "productXX_cfg.cmake")
INCLUDE ("productXX_cfg.cmake")
ENDIF ()
STRING(APPEND CMAKE_C_FLAGS " -DLOG_DISABLE ")
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的静态库。
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配置需要依赖一些环境变量,请参考下面一个章节。
@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