Zephyr内核详解,第0.1篇 构建
梳理下构建过程,整个构建过程只需要执行下面四个命令,分别来说明。
1.zephyr根目录执行:source zephyr.sh
2.执行:mdkir ./sample/helloword/build && cd ./sample/helloword/build
3.执行:cmake -GNinja -DBOARD=nucleo_l476rg ..
4.执行:ninja
划重点:
.使用source命令用来初始化ZEPHYR_BASE环境变量,调用用户根目录下的.zephyrrc来初始化一些环境变量(ZEPHYR_TOOLCHAIN_VARIANT/GNUARMEMB_TOOLCHAIN_PATH/OPENOCD_DEFAULT_PATH)。
.创建build目录,并跳转到build目录
.调用cmake解析整个工程的cmake脚本并生成ninja脚本。具体会依次调用:\samples\hello_world\CMakeLists.txt,\cmake\app\boilerplate.cmake,\CMakeLists.txt同时会把整个项目需要添加到工程的CMakeList.txt根据kconfig的配置来添加到构建过程当中。
一.创建app,所有的app需以下面的步骤来完成。
cmake_minimum_required(VERSION 3.8.2) //申明cmake必须满足的最小版本
include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE) project(NONE)//所有的app必须包含boilerplate.cmake模板来初始化各种编译环境和环境变量
target_sources(app PRIVATE src/main.c) //用户app都是cmake library通过target_resource命令来把.c源文件添加到libary里面,最终和core连接到一起。链接脚本会根据board不同选择不同的link.ld文件以stm32L4为例,链接脚本是\include\arch\arm\cortex_m\scripts\link.ld
二.cmake使用下面的命令来确定当前的构建host主机是否是MSYS.
execute_process( //cmake命令用来执行特定的命令
COMMAND //表示用来执行命令
uname //执行linux下的uname命令获取系统信息(linux,msys,macos)
OUTPUT_VARIABLE uname_output //存储信息到变量
)
if(uname_output MATCHES "MSYS") //比较字符串是否是“MSYS”
set(MSYS 1) //如果为真就设置Flag,供后面使用
endif()
三.定义ZEPHYR_LIBS/ZEPHYR_INTERFACE_LIBS/GENERATED_KERNEL_OBJECT_FILES/GENERATED_KERNEL_SOURCE_FILES这些目标,在次级目录里面使用这些来链接目标文件,默认都是空,当某个模块需要被链接到最终的二进制可执行文件的时候,就可以把自己挂在这几个目标下面,在构建的过程中就会被自动链接进来。
define_property(GLOBAL PROPERTY ZEPHYR_LIBS
BRIEF_DOCS "Global list of all Zephyr CMake libs that should be linked in"
FULL_DOCS "Global list of all Zephyr CMake libs that should be linked in.zephyr_library() appends libs to this list.")
set_property(GLOBAL PROPERTY ZEPHYR_LIBS "")
define_property(GLOBAL PROPERTY ZEPHYR_INTERFACE_LIBS
BRIEF_DOCS "Global list of all Zephyr interface libs that should be linked in."
FULL_DOCS "Global list of all Zephyr interface libs that should be linked in.zephyr_interface_library_named() appends libs to this list.")
set_property(GLOBAL PROPERTY ZEPHYR_INTERFACE_LIBS "")
define_property(GLOBAL PROPERTY GENERATED_KERNEL_OBJECT_FILES
BRIEF_DOCS "Object files that are generated after Zephyr has been linked once."
FULL_DOCS "\Object files that are generated after Zephyr has been linked once.\May include mmu tables, etc."
)
set_property(GLOBAL PROPERTY GENERATED_KERNEL_OBJECT_FILES "")
define_property(GLOBAL PROPERTY GENERATED_KERNEL_SOURCE_FILES
BRIEF_DOCS "Source files that are generated after Zephyr has been linked once.
"FULL_DOCS "\Object files that are generated after Zephyr has been linked once.\May include isr_tables.c etc."
)
set_property(GLOBAL PROPERTY GENERATED_KERNEL_SOURCE_FILES "")
set(APPLICATION_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH "Application Source Directory")
set(APPLICATION_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH "Application Binary Directory")
转载请注明出处
Cstyle.z.zhou@outlook.com // http://blog.csdn.net/CStyle_0x007