目录
- 前言
- 一、编译框架
- ninja简介
- 编译相关文件
- 二、运行入口
前言
前两篇搭建好了环境,干了代码。编译的时候,ninja?gn?嘛玩意?这篇简单介绍一下。同时自己也能加深理解。
一、编译框架
ninja简介
在Unix/Linux下通常使用Makefile来控制代码的编译,但是Makefile对于比较大的项目有时候会比较慢,代码在编译都变成了程序员放松的借口了。所以这个Google的程序员在开发Chrome的时候因为忍受不了Makefile的速度,自己重新开发出来一套新的控制编译的工具叫作Ninja,Ninja相对于Makefile这套工具更注重于编译速度。除了Chrome现在还有一些其他的比较大的项目也在开始使用Ninja。
编译相关文件
- 业务源码.c文件:在其中实现功能代码,通过启动恢复模块接口**
APP_FEARTURE_INIT
**启动业务,Hello_World作为函数名,用作业务入口。
#include <stdio.h>
#include "ohos_init.h"
void Hello_World(void)
{
printf("Hello World!\r\n");
}
APP_FEATURE_INIT(Hello_World);
APP_FEATURE_INIT()在osoh_init.h文件中定义。
2. 源文件同目录
下的业务编译文件BUILD.gn:用于将业务构建成静态库
- static_library中指定业务模块的编译结果,为静态库文件libmyapp.a,开发者根据实际情况完成填写。
- sources中指定静态库.a所依赖的.c文件及其路径,若路径中包含"//“则表示绝对路径(此处为代码根路径),若不包含”//" 则表示相对路径。
- include_dirs中指定source所需要依赖的.h文件路径。
static_library("myapp") {
sources = [
"hello_world.c"
]
include_dirs = [
"//utils/native/lite/include",
]
}
-
applications\BearPi\BearPi-HM_Nano\sample\BUILD.gn
模块构建BUILD.gn文件:指定参与构建的特性模块
- my_app是相对路径,指向./applications/BearPi/BearPi-HM/sample/my_app/BUILD.gn,与自定义文件夹名称保持一致
- myapp是目标,指向./applications/BearPi/BearPi-HM/sample/my_app/BUILD.gn中的static_library(“myapp”)。是静态库名称
import("//build/lite/config/component/lite_component.gni")
lite_component("app") {
features = [
#"A1_kernal_thread:thread_example",
#"A2_kernel_timer:timer_example",
#"A3_kernel_event:event_example",
#"A4_kernel_mutex:mutex_example",
#"A5_kernel_semaphore:semaphore_example",
#"A6_kernel_message:message_example",
#"B1_basic_led_blink:led_example",
"B2_basic_button:button_example",
#"B3_basic_pwm_led:pwm_example",
#"B4_basic_adc:adc_example",
#"B5_basic_i2c_nfc:i2c_example",
#"B6_basic_uart:uart_example",
#"C1_e53_sf1_mq2:e53_sf1_example",
#"C2_e53_ia1_temp_humi_pls:e53_ia1_example",
#"C3_e53_sc1_pls:e53_sc1_example",
#"C4_e53_sc2_axis:e53_sc2_example",
#"C5_e53_is1_infrared:e53_is1_example",
#"D1_iot_wifi_ap:wifi_ap",
#"D2_iot_wifi_sta_connect:wifi_sta_connect",
#"D3_iot_udp_client:udp_client",
#"D4_iot_tcp_server:tcp_server",
#"D5_iot_mqtt:iot_mqtt",
#"D6_iot_cloud_oc:oc_mqtt",
#"D7_iot_cloud_onenet:onenet_mqtt",
#"D8_iot_cloud_oc_smoke:cloud_oc_smoke",
#"D9_iot_cloud_oc_light:cloud_oc_light",
#"D10_iot_cloud_oc_manhole_cover:cloud_oc_manhole_cover",
#"D11_iot_cloud_oc_infrared:cloud_oc_infrared",
#"D12_iot_cloud_oc_agriculture:cloud_oc_agriculture",
#"D13_iot_cloud_oc_gps:cloud_oc_gps",
#"Zx_Developer:zx_develop_sample" ##不参与构建,为开发者贡献演示结构,其中Zx为 Z1,Z2...Z100
#"Z1_hi3861_uart_ylc:uart_hi3861",
#"Z2_hi3861_flash_ylc:flash_example",
#"my_app:myapp",
]
}
-
build\lite\product\BearPi-HM_Nano.json
Product文件夹下的JSON文件
在子系统中说明应用子系统的路径,并链接上述特性模块构建文件
{
"ohos_version": "OpenHarmony 1.0",
"board": "hi3861v100",
"kernel": "liteos_riscv",
"compiler": "gcc",
"subsystem": [
{
"name": "applications",
"component": [
{ "name": "BearPi-HM_Nano", "dir": "//applications/BearPi/BearPi-HM_Nano/sample:app", "features":[] }
]
},
{
"name": "iot_hardware",
"component": [
{ "name": "wifi-iot", "dir": "//base/iot_hardware/frameworks/wifiiot_lite:iothardware", "features":[] }
]
},
{
"name": "hiviewdfx",
"component": [
{ "name": "common_lite", "dir": "//base/hiviewdfx/utils/lite:common_lite", "features":[] },
{ "name": "hiview_lite", "dir": "//base/hiviewdfx/services/hiview_lite:hiview_lite", "features":[] },
{ "name": "hilog_lite", "dir": "//base/hiviewdfx/frameworks/hilog_lite/mini:hilog_lite", "features":[] }
]
},
{
"name": "distributedschedule",
"component": [
{ "name": "samgr_lite", "dir": "//foundation/distributedschedule/services/samgr_lite:samgr", "features":[] }
]
},
{
"name": "security",
"component": [
{ "name": "hichainsdk_lite", "dir": "//base/security/frameworks/hichainsdk_lite:hichainsdk", "features":[] }
]
},
{
"name": "startup",
"component": [
{ "name": "bootstrap_lite", "dir": "//base/startup/services/bootstrap_lite/source:bootstrap", "features":[] },
{ "name": "parameter", "dir": "//base/startup/frameworks/syspara_lite/parameter:parameter", "features":[] },
{ "name": "token", "dir": "//base/startup/frameworks/syspara_lite/token:token", "features":[] }
]
},
{
"name": "communication",
"component": [
{ "name": "wifi_lite", "dir": "//foundation/communication/frameworks/wifi_lite:wifi", "features":[] },
{ "name": "softbus_lite", "dir": "//foundation/communication/services/softbus_lite:softbus", "features":[] }
]
},
{
"name": "utils",
"component": [
{ "name": "kv_store", "dir": "//utils/native/lite/kv_store:kv_store", "features":[] },
{ "name": "file", "dir": "//utils/native/lite/file:file", "features":[] }
]
},
{
"name": "vendor",
"component": [
{ "name": "hi3861_sdk", "dir": "//vendor/hisi/hi3861/hi3861:wifiiot_sdk", "features":[] }
]
},
{
"name": "test",
"component": [
{ "name": "xts_act", "dir": "//test/xts/acts", "features":[] },
{ "name": "xts_tools", "dir": "//test/xts/tools", "features":[] }
]
}
],
"vendor_adapter_dir": "//vendor/hisi/hi3861/hi3861_adapter",
"third_party_dir": "//vendor/hisi/hi3861/hi3861/third_party",
"ohos_product_type":"",
"ohos_manufacture":"",
"ohos_brand":"",
"ohos_market_name":"",
"ohos_product_series":"",
"ohos_product_model":"",
"ohos_software_model":"",
"ohos_hardware_model":"",
"ohos_hardware_profile":"",
"ohos_serial":"",
"ohos_bootloader_version":"",
"ohos_secure_patch_level":"",
"ohos_abi_list":""
}
二、运行入口
vendor\hisi\hi3861\hi3861\app\wifiiot_app\src\app_main.c
base\startup\services\bootstrap_lite\source\system_init.c
中
初始化了各个模块,板级支持包等
#include "core_main.h"
#include <ohos_init.h>
#include <samgr_lite.h>
void HOS_SystemInit(void)
{
MODULE_INIT(bsp);
MODULE_INIT(device);
MODULE_INIT(core);
SYS_INIT(service);
SYS_INIT(feature);
MODULE_INIT(run);
SAMGR_Bootstrap();
}
在这个里边一步一步的去看下去就能理解了,文章就不贴了。