## 编译构建框架简介 编译构建框架以gn+ninja作为基础构建系统,针对产å“需è¦å’Œéƒ¨ä»¶åŒ–功能,在gn阶段å‰å¢žåŠ 了preloaderå’Œloaderçš„é¢„åŠ è½½è¿‡ç¨‹ã€‚ 1. preloader: 产å“ä¿¡æ¯é¢„åŠ è½½ã€‚æ ¹æ®ç¼–译产å“åç§°ï¼ŒåŠ è½½å¯¹åº”çš„é…置文件(config.json)并解æž,将解æžç»“果以文本方å¼è¾“出到指定目录下。 2. loader:å系统ã€éƒ¨ä»¶å’Œæ¨¡å—ä¿¡æ¯åŠ 载。以编译产å“å称和preloaderçš„è¾“å‡ºä½œä¸ºè¾“å…¥ï¼ŒåŠ è½½å¯¹åº”çš„subsystemã€componentã€module/partç‰é…置信æ¯ï¼Œä»¥æ–‡æœ¬æ–‡ä»¶æ–¹å¼è¾“出结果文件和gn的编译任务。 3. gn: gn是一ç§ç¼–è¯‘æž„å»ºå·¥å…·ï¼Œç”¨äºŽäº§ç”Ÿç¼–è¯‘ç›®æ ‡ä¹‹é—´çš„å›¾çŠ¶ç¼–è¯‘ä¾èµ–。在编译æµç¨‹ä¸ï¼Œç¼–译文件生æˆé˜¶æ®µè´Ÿè´£æž„建å‚数赋值,执行gn gen编译命令,产生的build.ninja文件å¯ä»¥ç±»æ¯”与makefile文件。 4. ninja:ninja是一ç§æŽ¥è¿‘汇编级的编译构建工具。è¯æ³•è§„则简å•ï¼Œæž„建速度快。在编译æµç¨‹ä¸ï¼Œæ ¹æ®ç¼–译规则完æˆå¯¹æ‰€æœ‰ç¼–è¯‘ç›®æ ‡çš„ç¼–è¯‘è¿‡ç¨‹ã€‚ ## 新增编译选项 当å‰çš„编译å‚数通过统一的文本文件管ç†ï¼Œä¿è¯å‚æ•°åŠŸèƒ½ç‹¬ç«‹ï¼Œå¹¶ä¸€ä¸€æ˜ å°„å¯¹åº”çš„å‚数实现函数。 在编译过程ä¸ï¼Œä¸ºäº†æ˜Žç¡®å‚æ•°å…·ä½“çš„ä½œç”¨æ—¶é—´ï¼Œæ ¹æ®ç¼–译的preloader,loader,gn,ninja四个基础过程,人为划分了9个编译阶段。分别为: ``` PRE_BUILD # 编译预处ç†ç›¸å…³å‚数,如--full-compilation,--log-level PRE_LOAD # preloaderå‰ç½®è®¾ç½®å‚æ•° LOAD # loaderå‰ç½®è®¾ç½®å‚数,如--scalable-build,--build-xts PRE_TARGET_GENERATE # gnå‰ç½®è®¾ç½®å‚数,如--gn-args TARGET_GENERATE # gn阶段å‚æ•° POST_TARGET_GENERATE # gnåŽç½®è®¾ç½®å‚æ•° PRE_TARGET_COMPILATION # ninjaå‰ç½®è®¾ç½®å‚数,如--ninja-arg TARGET_COMPILATION # ninja阶段å‚æ•° POST_TARGET_COMPILATION # ninjaåŽç½®è®¾ç½®å‚数,如--generate-ninja-trace POST_BUILD # 编译åŽå¤„ç†å‚数,如--clean-args ``` ä¸ºç¼–è¯‘æ¡†æž¶æ·»åŠ ä¸€ä¸ªç¼–è¯‘é€‰é¡¹ä¸»è¦åˆ†ä¸ºä¸¤æ¥ï¼š 1. 在å‚数管ç†çš„json文件ä¸å¯¹å‚数进行注册 2. 针对å‚数的实际使能方å¼ä¸ºå‚æ•°æ·»åŠ å‚数实现函数。 ## 示例 ### 新增一个--ccache选项,默认为false,用于调用ccache编译缓å˜ï¼ŒåŠ 快编译速度。 1. å‚数注册: 该å‚数在编译å‰å¼€å¯ï¼Œåœ¨build/hb/resources/args/default/buildargs.jsonä¸è¿›è¡Œæ³¨å†Œï¼Œæ–‡ä»¶æ·»åŠ 以下é…置: ``` "ccache": { "arg_name": "--ccache", "argDefault": false, "arg_help": "Default:True. Help:Enable ccache, this option could improve compilation speed. --stat-ccache can summary the cache data", "arg_phase": "prebuild", "arg_type": "gate", "arg_attribute": {}, "resolve_function": "resolve_ccache", "testFunction": "testCCache" }, ``` 2. å‚数实现: 在build/hb/resolver/build_args_resolver.pyä¸æ·»åŠ 相应的实现函数(代ç 仅为简å•ç¤ºä¾‹): ``` @staticmethod def resolve_ccache(target_arg: Arg, build_module: BuildModuleInterface): """resolve '--ccache' arg :param target_arg: arg object which is used to get arg value. :param build_module [maybe unused]: build module object which is used to get other services. :phase: prebuild. """ if target_arg.arg_value: config = Config() cmd = ['ccache', '-M', ccache_max_size] SystemUtil.exec_command(cmd, log_path=config.log_path) ``` 3. å‚数使用:在编译命令ä¸æ·»åŠ --ccacheå³å¯é€šè¿‡åœ¨æŒ‡å®šç¼–译阶段调用resolve_ccache()实现å‚数使能。 ## 注æ„事项 1. 为gnä¼ é€’ä¸“ç”¨å˜é‡ï¼Œè¯·å‹¿æ³¨å†Œå‚数。 例如需è¦å¢žåŠ 一个gnå˜é‡ä¸ºenable_cxx,åªéœ€è¦åœ¨build/ohos_var.gniä¸é€šè¿‡declare声明: ``` declare_args() { enable_cxx = true } ``` 并在编译命令ä¸æ·»åŠ 下é¢å‘½ä»¤å³å¯å®Œæˆä½¿èƒ½ã€‚ ``` --gn-args enable_cxx=false ``` 2. 为ninjaä¼ é€’ç¼–è¯‘å‘½ä»¤ï¼Œè¯·å‹¿æ³¨å†Œå‚数。 例如需è¦åœ¨ninja编译命令ä¸ä¼ 递-vå‚数,在编译命令ä¸æ·»åŠ 下é¢å‘½ä»¤å³å¯å®Œæˆä½¿èƒ½ã€‚ ``` --ninja-args=-v ```