沈阳做网站 熊掌号,wordpress添加视频插件吗,网络工程专业是干什么的,石家庄新闻发布会直播ninja | 忍者
ninja是一个叫 Evan Martin的谷歌工程师开源的一个自定义的构建系统,最早是用于 chrome的构建,Martin给它取名 ninja(忍者)的原因是因为它strikes quickly(快速出击).这是忍者的特点,可惜Martin不了解中国文化,不然叫小李飞刀更合适些.究竟有多块呢? 用Martin自…ninja | 忍者
ninja是一个叫 Evan Martin的谷歌工程师开源的一个自定义的构建系统,最早是用于 chrome的构建,Martin给它取名 ninja(忍者)的原因是因为它strikes quickly(快速出击).这是忍者的特点,可惜Martin不了解中国文化,不然叫小李飞刀更合适些.究竟有多块呢? 用Martin自己的话说是当一个文件被修改后,ninja从发现到编译速度是make的十倍.有没有十倍不是本篇讨论的重点,人家做出来了,就算是牛皮也该人家吹.本篇是要对鸿蒙如何使用ninja做一个比较详细的阐述.
ninja是一个重视速度的构建系统,与其对标的是Make,它们都依赖于文件的时间戳进行检测重编.
它的设计目的是让更高级别的构建系统生成其输入端文件,其并不希望你手动去编.ninja文件,可以生成.ninja的工具有gn,cmake,premake,甚至你自己都可以写个 ninja 生成工具.ninja非常高效,可理解为构建系统中的汇编语言。ninja文件没有分支、循环的流程控制是被指定了一堆规则的文件所以要比Makefile简单很多目前已知的GoogleChromeAndroid的一部分LLVM, V8, 方舟编译器, 鸿蒙 等大型系统都使用到了ninja构建.
基本概念
概念 中译 解释
edge 边 即build语句指定目标输出、规则与输入是编译过程拓扑图中的一条边edge。
target 目标 编译过程需要产生的目标由build语句指定。
output 输出 build语句的前半段是target的另一种称呼。
input 输入 build语句的后半段用来产生output的文件或目标另一种称呼是依赖。
rule 规则 通过指定command与一些内置变量决定如何从输入产生输出。
pool 池 一组rule或edge通过指定其depth可以控制并行上限。
scope 作用域 变量的作用范围有rule与build语句的块级也有文件级别。rule也有scope。
--------------------------------------------------------------------------------------------
关键字 作用
build 定义一个edge。
rule 定义一个rule。
pool 定义一个pool。
default 指定默认的一个或多个target。
include 添加一个ninja文件到当前scope。
subninja 添加一个ninja文件其scope与当前文件不同。
phony 一个内置的特殊规则指定非文件的target。
简单的ninja
首先 ninja 一定是简单的,呆板的.凡是能被工具生成的东西,一定是在不断的重复某种简单,众多的简单按一定的规则有效叠加起来就能解决复杂的问题,请仔细想想是不是这个道理.ninja简单到没什么语法,只是几个概念和规则.
看个示例:
cflags -Wall -Werror #全局变量
rule cccommand gcc $cflags -c $in -o $outbuild foo.o: cc foo.cbuild special.o: cc special.ccflags -Wall #局部变量,范围只在编译special.c上有效解读
cflags:定义一个用户变量,用于给规则传参.rule:定义一个叫cc的规则. command:将生成bash命令,接收外部三个参数 第一个build,将foo.c用cc规则编译成foo.o 最终编译选项:gcc -Wall -Werror -c foo.c -o foo.o 第二个build,将special.c用cc规则编译成special.o 最终编译选项:gcc -Wall -c foo.c -o foo.o in,out是ninja的两个内置变量.
phony规则
跟称呼弗拉基米尔·弗拉基米罗维奇·普京为普总一样, 有些文件路径会很长,ninja提供取别名的功能,这仅仅是为了方便.
build ability: phony ./libability.so
build ability_notes: phony obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/ability_notes.stamp
build ability_test: phony obj/foundation/aafwk/aafwk_lite/services/abilitymgr_lite/unittest/ability_test.stamp
build ability_test_pageAbilityTest_group_lv0: phony obj/foundation/aafwk/aafwk_lite/services/abilitymgr_lite/unittest/test_lv0/page_ability_test/ability_test_pageAbilityTest_group_lv0.stamp
有了上面的铺垫,读懂鸿蒙的ninja部分应该没多大障碍了.
鸿蒙 | ninja
在[v60.xx 鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用 ]篇的末尾已说明通过 gn gen生成了以下文件和目录
turingubuntu:/home/openharmony/code-v1.1.1-LTS/out/hispark_aries/ipcamera_hispark_aries$ ls
args.gn build.ninja build.ninja.d NOTICE_FILE obj test_info toolchain.ninjaargs.gn :一些参数build.ninja : ninja的主文件build.ninja.d :记录生成所有.ninja 所依赖的BUILD.gn文件路劲列表,一个BUILD.gn就生成一个.ninja文件obj :各组件模块构建/编译文件输出地.toolchain :放置ninja规则,将被 subninja 进 build.ninja
build.ninja
build.ninja内容如下:
ninja_required_version 1.7.2rule gncommand ../../../../tools/gn --root../../.. -q --dotfile../../../build/lite/.gn --script-executablepython3 gen .description Regenerating ninja filesbuild build.ninja: gngenerator 1depfile build.ninja.dsubninja toolchain.ninjabuild ability: phony ./libability.so
build ability_notes: phony obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/ability_notes.stamp
build ability_test: phony obj/foundation/aafwk/aafwk_lite/services/abilitymgr_lite/unittest/ability_test.stamp
build ability_test_pageAbilityTest_group_lv0: phony obj/foundation/aafwk/aafwk_lite/services/abilitymgr_lite/unittest/test_lv0/page_ability_test/ability_test_pageAbilityTest_group_lv0.stamp
#此处省略诸多 phony ..build all: phony $./libcameraApp.so $obj/applications/sample/camera/cameraApp/cameraApp_hap.stamp $./libgallery.so $...default all解读
前面部分是定义一个 gn规则,用于干嘛呢? 重新生成一遍 *ninja文件subninja相当于 #include文件default all,指定默认的一个或多个target
toolchain | 定义规则
toolchain.ninja 定义了编译c,c,汇编器,链接,静态/动态链接库,时间戳,拷贝等规则. 内容如下:
rule cxxcommand /root/llvm/bin/clang ${defines} ${include_dirs} ${cflags_cc} -c ${in} -o ${out}description clang ${out}depfile ${out}.ddeps gcc
rule alinkcommand /root/llvm/bin/llvm-ar -cr ${out} ${out}.rspdescription AR ${out}rspfile ${out}.rsprspfile_content ${in}
rule linkcommand /root/llvm/bin/clang ${ldflags} ${in} ${libs} -o ${output_dir}/bin/${target_output_name}${output_extension}description LLVM LINK ${output_dir}/bin/${target_output_name}${output_extension}rspfile ${output_dir}/bin/${target_output_name}${output_extension}.rsprspfile_content ${in}
rule solinkcommand /root/llvm/bin/clang -shared ${ldflags} ${in} ${libs} -o ${output_dir}/${target_output_name}${output_extension}description SOLINK ${output_dir}/${target_output_name}${output_extension}rspfile ${output_dir}/${target_output_name}${output_extension}.rsprspfile_content ${in}
rule stampcommand /usr/bin/touch ${out}description STAMP ${out}
rule asmcommand /root/llvm/bin/clang ${include_dirs} ${asmflags} -c ${in} -o ${out}description ASM ${out}depfile ${out}.ddeps gcc
rule cccommand /root/llvm/bin/clang ${defines} ${include_dirs} ${cflags} ${cflags_c} -c ${in} -o ${out}description clang ${out}
rule copycommand cp -afd ${in} ${out}description COPY ${in} ${out}注意这些规则中的描述description字段,其后面的内容会打到控制台上,每一条输出都是一次 build,如图所示,通过这些描述就知道使用了什么规则去构建. 组件编译
本篇以编译ability组件为例说明 ninja对组件的编译情况.每个组件都有自己的.ninja,描述组件的编译细节.而整个鸿蒙系统就是由众多的类似.ninja构建编译完成的.
├── foundation
│ ├── aafwk
│ │ └── aafwk_lite
│ │ ├── frameworks
│ │ │ ├── ability_lite
│ │ │ │ └── ability.ninjaability.ninja内容如下:
defines -DOHOS_APPEXECFWK_BMS_BUNDLEMANAGER \-D_XOPEN_SOURCE700 -DOHOS_DEBUG \-D_FORTIFY_SOURCE2 \-D__LITEOS__ -D__LITEOS_A__
include_dirs -I../../../foundation/aafwk/aafwk_lite/frameworks/abilitymgr_lite/include \-I../../../foundation/aafwk/aafwk_lite/frameworks/want_lite/include \-I../../../foundation/aafwk/aafwk_lite/interfaces/innerkits/abilitymgr_lite \-I../../../foundation/aafwk/aafwk_lite/interfaces/kits/want_lite \-I../../../foundation/aafwk/aafwk_lite/interfaces/kits/ability_lite \-I../../../foundation/appexecfwk/appexecfwk_lite/utils/bundle_lite \-I../../../foundation/appexecfwk/appexecfwk_lite/interfaces/kits/bundle_lite \-I../../../foundation/appexecfwk/appexecfwk_lite/frameworks/bundle_lite/include \-I../../../foundation/graphic/ui/frameworks -I../../../foundation/graphic/surface/interfaces/kits \-I../../../foundation/distributedschedule/samgr_lite/interfaces/kits/registry \-I../../../foundation/distributedschedule/samgr_lite/interfaces/kits/samgr \-I../../../foundation/communication/ipc_lite/frameworks/liteipc/include \-I../../../kernel/liteos_a/kernel/include \-I../../../kernel/liteos_a/kernel/common \-I../../../third_party/bounds_checking_function/include \-I../../../third_party/freetype/include \-I../../../utils/native/lite/kv_store/innerkits \-I../../../utils/native/lite/include \-I../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/include \-I../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite \-I/root/llvm/include/c/v1 \-I../../../prebuilts/lite/sysroot/usr/include/arm-liteos \-I../../../base/hiviewdfx/hilog_lite/interfaces/native/innerkits/hilog \-I../../../base/hiviewdfx/hilog_lite/interfaces/native/innerkits \-I../../../third_party/bounds_checking_function/include \-I../../../third_party/bounds_checking_function/include \-I../../../foundation/communication/ipc_lite/interfaces/kits \-I../../../utils/native/lite/include
cflags -Wall -Wno-format -Wno-format-extra-args -fPIC \--targetarm-liteos \--sysroot/home/openharmony/prebuilts/lite/sysroot \-Oz -flto -mfloat-abisoftfp -mcpucortex-a7 -nostdlib -fno-common -fno-builtin -fno-strict-aliasing -Wall -fsigned-char -mno-unaligned-access -fno-omit-frame-pointer -fstack-protector-all -fPIC
cflags_cc -Wall -Wno-format -Wno-format-extra-args -fPIC \--targetarm-liteos \--sysroot/home/openharmony/prebuilts/lite/sysroot \-Oz -flto -mfloat-abisoftfp -mcpucortex-a7 -nostdlib -fno-common -fno-builtin -fno-strict-aliasing -Wall -mno-unaligned-access -fno-omit-frame-pointer -fstack-protector-all -fexceptions -stdc11 -fPIC
target_output_name libabilitybuild obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_context.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_context.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_env.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_env.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_env_impl.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_env_impl.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_event_handler.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_event_handler.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_loader.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_loader.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_main.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_main.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_scheduler.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_scheduler.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_thread.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_thread.cppbuild ./libability.so: solink \obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability.o \obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_context.o \obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_env.o \obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_env_impl.o \obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_event_handler.o \obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_loader.o \obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_main.o \obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_scheduler.o \obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_thread.o \./libabilitymanager.so ./libbundle.so ./libhilog_shared.so ./libliteipc_adapter.so \./libsec_shared.so ./libutils_kv_store.so || obj/utils/native/lite/kv_store/kv_store.stampldflags -lstdc \--targetarm-liteos \--sysroot/home/openharmony/prebuilts/lite/sysroot \-L/root/llvm/lib/arm-liteos/c \-L/home/openharmony/prebuilts/lite/sysroot/usr/lib/arm-liteos \-L/root/llvm/lib/clang/9.0.0/lib/arm-liteos \-lclang_rt.builtins -lc -lc -lcabi \--sysroot/home/openharmony/prebuilts/lite/sysroot \-mcpucortex-a7 -lc \-L/home/openharmony/out/hispark_aries/ipcamera_hispark_aries \-Wl,-rpath-link/home/openharmony/out/hispark_aries/ipcamera_hispark_aries -Wl,-z,now -Wl,-z,relro -Wl,-z,noexecstacklibs frameworks output_extension .sooutput_dir .解读
defines,include_dirs,cflags_cc都是用户自定义变量,为了给 rule cxx准备参数,对.cpp的编译使用了这个规则 rule cxxcommand /root/llvm/bin/clang ${defines} ${include_dirs} ${cflags_cc} -c ${in} -o ${out}description clang ${out}depfile ${out}.ddeps gccin,out是两个内置变量,无须定义,值由build提供,如此就编译成了一个个的 .o文件.在最后在当前目录下使用了solink规则,生成一个动态链接库libability.so. rule solinkcommand /root/llvm/bin/clang -shared ${ldflags} ${in} ${libs} -o ${output_dir}/${target_output_name}${output_extension}description SOLINK ${output_dir}/${target_output_name}${output_extension}rspfile ${output_dir}/${target_output_name}${output_extension}.rsprspfile_content ${in}ability | 最终生成文件
turingubuntu:/home/openharmony/code-v1.1.1-LTS/out/hispark_aries/ipcamera_hispark_aries/obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite$ tree
.
├── aafwk_abilitykit_lite.stamp
├── ability.ninja
├── ability_notes.stamp
└── src├── libability.ability_context.o├── libability.ability_env_impl.o├── libability.ability_env.o├── libability.ability_event_handler.o├── libability.ability_loader.o├── libability.ability_main.o├── libability.ability.o├── libability.ability_scheduler.o└── libability.ability_thread.o1 directory, 12 files
turingubuntu:/home/openharmony/code-v1.1.1-LTS/out/hispark_aries/ipcamera_hispark_aries/obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite$ stat ability_notes.stamp File: ability_notes.stampSize: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 805h/2053d Inode: 1217028 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ turing) Gid: ( 0/ root)
Access: 2021-07-21 00:38:52.237373740 -0700
Modify: 2021-07-21 00:34:30.207312566 -0700
Change: 2021-07-21 00:34:30.207312566 -0700鸿蒙全栈开发全新学习指南
也为了积极培养鸿蒙生态人才让大家都能学习到鸿蒙开发最新的技术针对一些在职人员、0基础小白、应届生/计算机专业、鸿蒙爱好者等人群整理了一套纯血版鸿蒙HarmonyOS Next全栈开发技术的学习路线【包含了大厂APP实战项目开发】。
本路线共分为四个阶段
第一阶段鸿蒙初中级开发必备技能 第二阶段鸿蒙南北双向高工技能基础gitee.com/MNxiaona/733GH 第三阶段应用开发中高级就业技术 第四阶段全网首发-工业级南向设备开发就业技术https://gitee.com/MNxiaona/733GH 《鸿蒙 (Harmony OS)开发学习手册》共计892页
如何快速入门
1.基本概念 2.构建第一个ArkTS应用 3.…… 开发基础知识:gitee.com/MNxiaona/733GH
1.应用基础知识 2.配置文件 3.应用数据管理 4.应用安全管理 5.应用隐私保护 6.三方应用调用管控机制 7.资源分类与访问 8.学习ArkTS语言 9.……
基于ArkTS 开发
1.Ability开发 2.UI开发 3.公共事件与通知 4.窗口管理 5.媒体 6.安全 7.网络与链接 8.电话服务 9.数据管理 10.后台任务(Background Task)管理 11.设备管理 12.设备使用信息统计 13.DFX 14.国际化开发 15.折叠屏系列 16.……
鸿蒙开发面试真题含参考答案:gitee.com/MNxiaona/733GH 鸿蒙入门教学视频 美团APP实战开发教学gitee.com/MNxiaona/733GH 写在最后
如果你觉得这篇内容对你还蛮有帮助我想邀请你帮我三个小忙点赞转发有你们的 『点赞和评论』才是我创造的动力。关注小编同时可以期待后续文章ing不定期分享原创知识。想要获取更多完整鸿蒙最新学习资源请移步前往小编gitee.com/MNxiaona/733GH