WebRTC编译篇之Ninja 编译系统 二

且让我们从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


这里的cc, cxx 等是ninja 文件声明的变量。  cc 就表示clang命令, cxx 表示 clang++命令 


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

经过上面的分析, 这里的代码就容易理解, 这里的build定义了如果从SRWebSocket.m,  用Rule objc来生成socketrocket.SRWebSocket.o  


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

这个是另一个例子,  从socketrocket.SRWebSocket.o  用rule alink 生成 libsocketrocket.a 


其他还有一些, 比如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




你可能感兴趣的:(多媒体)