且让我们从WebRTC的实例来继续分析Ninja.
下载编译WebRTC, 首先要下载Chromium depot_tool, Ninja就在deopt tool 之中.
WebRTC的代码可以支持多平台, 我们以MAC平台为例:
WebRTC的代码下载完成后, 执行:
export GYP_DEFINES="OS=mac target_arch=x86_64"
export GYP_GENERATOR_FLAGS="output_dir=out_mac"
webrtc/build/gyp_webrtc.py
这几个命令是用GYP 生成Ninja的编译文件.
在 src/目录下, 会建立out_mac目录, 里头建立了两个目录, Debug和Release, 对应Debug编译和Release编译. 进入到Release目录, 里头已经有了很多文件, 其中, build.ninja就是入口.
build.ninja之片段:
cc = ../../third_party/llvm-build/Release+Asserts/bin/clang
cxx = ../../third_party/llvm-build/Release+Asserts/bin/clang++
ld = $cc
ldxx = $cxx
ar = ar
rule cc
command = $cc -MMD -MF $out.d $defines $includes $cflags $cflags_c $cflags_pch_c -c $in -o $out
description = CC $out
depfile = $out.d
deps = gcc
rule 定义了命令行, 其格式为: command 定义了被执行的命令, $in 表示输入的文件, $out 是输出的文件。 description 是对command的描述。 depfile 制定的文件包含了依赖信息, deps 必须是gcc活着msvc 其中之一, 表示了处理dependency的方法。 这里的rule表示了c文件的编译方法
rule objc
command = $cc -MMD -MF $out.d $defines $includes $cflags $cflags_objc $cflags_pch_objc -c $in -o $out
description = OBJC $out
depfile = $out.d
deps = gcc
rule objc 表示了objective C文件的编译方法.
socketroctet.ninja之片段:
defines = -DV8_DEPRECATION_WARNINGS $
-D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORE=0 -DCHROMIUM_BUILD $
-DCR_CLANG_REVISION=269902-1 -DUSE_LIBJPEG_TURBO=1 -DENABLE_WEBRTC=1 $
-DENABLE_MEDIA_ROUTER=1 -DENABLE_PEPPER_CDMS -DENABLE_NOTIFICATIONS $
-DFIELDTRIAL_TESTING_ENABLED -DENABLE_TASK_MANAGER=1 $
-DENABLE_EXTENSIONS=1 -DENABLE_PDF=1 -DENABLE_PLUGIN_INSTALLATION=1 $
-DENABLE_PLUGINS=1 -DENABLE_SESSION_SERVICE=1 -DENABLE_THEMES=1 $
-DENABLE_PRINTING=1 -DENABLE_BASIC_PRINTING=1 -DENABLE_PRINT_PREVIEW=1 $
-DENABLE_SPELLCHECK=1 -DUSE_BROWSER_SPELLCHECKER=1 $
-DENABLE_CAPTIVE_PORTAL_DETECTION=1 -DENABLE_SUPERVISED_USERS=1 $
-DENABLE_SERVICE_DISCOVERY=1 -DV8_USE_EXTERNAL_STARTUP_DATA $
-DFULL_SAFE_BROWSING -DSAFE_BROWSING_CSD -DSAFE_BROWSING_DB_LOCAL $
-DWEBRTC_MAC -DCARBON_DEPRECATED=YES -DHASH_NAMESPACE=__gnu_cxx $
-DWEBRTC_POSIX -DDISABLE_DYNAMIC_CAST -D_REENTRANT -DUSE_LIBPCI=1 $
-DNDEBUG -DNVALGRIND -DDYNAMIC_ANNOTATIONS_ENABLED=0
includes = -Igen -I../.. -I../.. -I../../third_party $
-I../../third_party/webrtc -I../../webrtc
cflags = -isysroot $
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk $
-O2 -gdwarf-2 -fvisibility=hidden -Werror -mmacosx-version-min=10.8 $
-arch x86_64 -Wall -Wno-unused-parameter $
-Wno-missing-field-initializers -Wno-selector-type-mismatch $
-Wheader-hygiene -Wno-char-subscripts $
-Wno-unneeded-internal-declaration -Wno-covered-switch-default $
-Wstring-conversion -Wno-c++11-narrowing -Wno-deprecated-register $
-Wno-inconsistent-missing-override -Wno-shift-negative-value $
-Wno-undefined-var-template -Wno-unused-variable $
-Wno-deprecated-declarations -Wno-nonnull
cflags_c = -std=c99 -fcolor-diagnostics -fno-strict-aliasing
cflags_cc = -std=c++11 -stdlib=libc++ -fno-rtti -fno-exceptions $
-fvisibility-inlines-hidden -fno-threadsafe-statics -fcolor-diagnostics $
-fno-strict-aliasing
cflags_objc = $cflags_c -fobjc-arc
cflags_objcc = $cflags_cc -fobjc-arc -fobjc-call-cxx-cdtors
arflags =
build $
obj/webrtc/examples/objc/AppRTCDemo/third_party/SocketRocket/socketrocket.SRWebSocket.o: $
objc $
../../webrtc/examples/objc/AppRTCDemo/third_party/SocketRocket/SRWebSocket.m
rule alink
command = rm -f $out && ./gyp-mac-tool filter-libtool libtool $libtool_flags -static -o $out $in$postbuilds
description = LIBTOOL-STATIC $out, POSTBUILDS
build libsocketrocket.a: alink $
obj/webrtc/examples/objc/AppRTCDemo/third_party/SocketRocket/socketrocket.SRWebSocket.o
其他还有一些, 比如subninja 这个相当于 include, 包含其他的ninja编译文件。
subninja obj/webrtc/socketrocket.ninja
subninja obj/webrtc/tools/agc_test_utils.ninja
subninja obj/webrtc/system_wrappers/metrics_default.ninja
subninja obj/webrtc/system_wrappers/field_trial_default.ninja
subninja obj/webrtc/modules/webrtc_h264.ninja
subninja obj/webrtc/modules/video_processing_sse2.ninja
关于ninja的, 重要的语法点都已经作了介绍, 相当简单吧 :) 其他更多的ninja知识, 可以去ninja 官网学习.
了解了ninja的这些东西, 浏览下ninja编译文件的结构与分布, 对于理解webrtc, 一定是大有帮助.
Reference:
1 . https://ninja-build.org
2. https://webrtc.org