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")
轉載請註明出處
[email protected] // http://blog.csdn.net/CStyle_0x007