精华内容
下载资源
问答
  • GN 编译配置

    万次阅读 2017-11-08 13:25:51
    GN build configuration本文档提供一些常用的GN编译步骤。假设你已经got a Chromium checkout。 另请参阅 在命令行运行“gn help”。 All GN Docs。 GN Quick Start Guide。 GN Reference(一个网页用来展示“gn ...

    GN build configuration

    本文档提供一些常用的GN编译步骤。假设你已经got a Chromium checkout
    另请参阅

    理解GN编译标志(flags)

    重新调用GN的时候,你需要选择自己的编译目录。这个目录通常情况下都是src/out的子目录。你可以通过以下命令来设置编译目录的编译参数:

    gn args out/mybuild

    这个命令首先会弹出一个编辑器。编辑器默认保存为一个文本文件,文件的内容就相当于编译参数,这些内容其实就是GN代码,我们需要根据GN的语法来设置这些参数变量的值(布尔变量用 true/false,字符串用双引号,#用于注释)。

    你可以通过以下命令来获取给出的编译目录的编译参数变量的列表:

    $ gn args out/mybuild --list

    获取某一个标志文档说明(这里是 is_component_build):

    $ gn args out/mybuild --list=is_component_build

    你必须在第一个参数中指定你的编译目录,因为在不同的编译环境和平台下,这些参数变量的默认值可能是不同的。举个例子,设置Android为目标系统,显示的可能是与Android相关的编译参数,并且这些参数的有不同的默认值。

    这个页面上“GN args”的意思,不是将命令行中的参数传递给GN。而是将args.gn文件当作一个单独的参数传给GN,并且将文件中的内容作为--args参数的内容。

    常用编译变量

    Release编译

    默认GN编译的是debug版本,通过以下参数改成release编译:

    is_debug = false

    release编译下启用DCHECK宏,来发现潜在的bugs。

    dcheck_always_on = true

    分散链接编译(Component build)

    Component build是将最后一步本来很长的链接操作,改为链接成很多个分离的共享库的操作。它是默认的debug版的编译方式(除iOS编译),并且大多数开发者使用这种模式用于每天的编译及调试。这种模式启动会很慢,而且一些链接优化会被禁用,所以这不是测试的标准。有些人喜欢在release编译启用这种模式,来获取更快的链接速度和合理的运行性能。

    is_component_build = true

    不生成符号文件的快速编译

    不生成符号文件将使调试几乎成为不可能,但编译确实会更快。当你想尽快编译的时候会很有用。

    symbol_level = 0

    禁用 Native Client

    大多数开发者不需要测试 Native Client的功能,可以禁用它来提高编译速度。

    enable_nacl = false

    移除WebCore(内核)符号

    WebCore有很多模版,导致会生成大量的符号文件。如果你不需要调试WebCore,可以不生成这些符号文件使编译更小更快。

    remove_webcore_debug_symbols = true

    Warning: 在Windows上,这将会导致许多blink的dll每次都会重新链接,因为丢失pdb文件,所以重新编译时可能会更慢。

    重新指定CPU系列(Overriding the CPU architecture)

    默认情况下,GN会使用和当前系统和CPU结构匹配的设置。重新设置:

    target_cpu = "x86"

    target_cpu可能的值:

    • Windows支持“x86”和“x64”。自从Chromium只支持在64位机器上编译时,默认的值总是“x64”。
    • Mac和桌面Linux只支持“x64”。在桌面Linux上你理论上可以使用ARM或MIPS结构的格式化字符串,但现在还不支持和验证。
    • Chrome OS支持“x86”和“x64”,但是在64位机器上编译32位文件需要是sysroot(管理员账户)。
    • 如果你编译Android包(下面介绍),默认的CPU结构是“arm”。你可以尝试将它重置为”arm64”, “x86”, “mipsel”, or “mips64el”,but the GN builds for these aren’t regularly tested.

    Goma(一种分布式编译器)

    Googlers可以使用它来分布式编译。 goma_dir仅当你将Goma工具放在非标准的路径时才需要指定(默认的路径为:~/goma or C:\goma\goma-win)。

    use_goma = true
    goma_dir = "/home/me/somewhere/goma"  # Optional

    Chrome官方编译(Official Chrome build)

    当你是Google员工且有内容的src源码检出时使用此类编译。在Linux上,运行gn args之前,先运行命令:

    $ export GYP_DEFINES='buildtype=Official branding=Chrome'
    $ gclient runhooks

    The GYP_DEFINES and gclient runhooks steps are required on Linux because the hook that fetches the Linux sysroot still looks at GYP_DEFINES, even though the GYP tool is not actually used.非Linux平台,你可以跳过这步。

    正式编译使用下面的参数:

    is_official_build = true
    is_chrome_branded = true
    is_debug = false

    编译32位正式版时,使用:

    $ export GYP_DEFINES='buildtype=Official branding=Chrome target_arch=ia32'

    替换第一步中Linux下的命令,并且将下面的参数添加到上面的参数设置中:

    target_cpu = "x86"

    Windows

    有一个“gn gen”参数(–ide)用来生成Visual Studio项目和解决方案。

    $ gn gen out\mybuild --ide=vs

    默认生成的是VS 2015的工程文件。

    编译Android版本(在Linux上)

    假设你已经跟着Android build instructions的步骤检出了源码。

    target_os = "android"

    在Linux上使用相同的检出源码编译Android和Linux版本的Chrome是很容易的。你的.gclient文件中必须指出是Android,但必须有对应的SDK。如果你是按照Android文档的指示来检出代码的话,这些都会自动完成。如果已经存在的源码是Linux版本的检出,将下面的内容添加到.gclient文件中(在src上层目录中),并且运行gclient runhooks

    solutions = [
      ...existing stuff in here...
    ]
    target_os = [ 'android' ]  # Add this to get Android stuff checked out.

    编译Chrome OS版本(在Linux上)

    This will build the Chrome OS variant of the browser that is distributed with the operating system. You can run it on your Linux desktop for feature development.

    target_os = "chromeos"
    展开全文
  • gn编译webrtc介绍

    2020-08-16 00:37:58
    说明:由于需要通过gn编译webrtc源代码和自研代码的添加,在此介绍gn命令和格式。 概述:我们通过gclient实现webrtc源码的下载,下载完成后使用gn命令进行编译,此时生成对应平台的文件(.ninja)。 gn参考:...

    说明:由于需要通过gn编译webrtc源代码和自研代码的添加,在此介绍gn命令和格式。

    概述:我们通过gclient实现webrtc源码的下载,下载完成后使用gn命令进行编译,此时生成对应平台的文件(.ninja)。  

    gn参考:https://www.chromium.org/developers/gn-build-configuration

    gn介绍:(generate ninja )顾名思义为生成ninja文件,为一个编译工具,是GYP(Generate Your Project)的替代工具,由google开源c++编写实现,主要实现交叉编译,可以指定输出平台目标,且可以指定多个目标平台。

    gn gen out/Default --args='target_os="linux" target_cpu="x64"

    既然是解释器那么就会有对应的语法,接下来以windows平台为例进行.gn语法介绍。

    BUILD.gn文件,截取一段进行分析如下:

    1:首先import.gni文件,该文件一般为公用的某些功能定义。

    2:编译器会找到对应的目标进行编译,目标的含义是我们的模块需要编译生什么,比如静态库,动态库,或者运行程序等。只有指定目标编译器才能明确的生成。主要类型有如下:

    executable:生成exe程序。group:包含一个多个目标虚拟节点。shared_library:生成静态库lib或.a。loadable_module:动态库或者.so。source_set:轻量级静态库(常用)。app:用于mac/ios。android_apk:生成andorid平台apk.

    3:每个目标都会进行依赖deps包含。此时就会涉及到路径的问题,本地相同路径开头为冒号:。如果是根目录则是“//”开头。

    4:一些变量通过gn的args传递。

    # Copyright (c) 2013 The Chromium Authors. All rights reserved.
    # Use of this source code is governed by a BSD-style license that can be
    # found in the LICENSE file.
    # This is the root build file for GN. GN will start processing by loading this
    # file, and recursively load all dependencies until all dependencies are either
    # resolved or known not to exist (which will cause the build to fail). So if
    # you add a new build file, there must be some path of dependencies from this
    # file to your new one or GN won't know about it.
    import("//build/config/compiler/compiler.gni")
    ...
    if (is_android) {
      import("//build/config/android/config.gni")
    }
    
    # This file defines the following two main targets:
    #
    # "gn_all" is used to create explicit dependencies from the root BUILD.gn to
    # each top-level component that we wish to include when building everything via
    # "all". This is required since the set of targets built by "all" is determined
    # automatically based on reachability from the root BUILD.gn (for details, see
    # crbug.com/503241). Builders should typically use "all", or list targets
    # explicitly, rather than relying on "gn_all".
    #
    # "gn_visibility": targets that are normally not visible to top-level targets,
    # but are built anyway by "all". Since we don't want any such targets, we have
    # this placeholder to make sure hidden targets that aren't otherwise depended
    # on yet are accounted for.
    group("gn_all") {
      testonly = true
      deps = [
        ":gn_visibility",
        "//base:base_perftests",
        "//base:base_unittests",
        "//base/util:base_util_unittests",
        "//chrome/installer",
        "//chrome/updater",
        "//components:components_unittests",
        "//components/gwp_asan:gwp_asan_unittests",
        "//net:net_unittests",
        "//services:services_unittests",
        "//services/service_manager/public/cpp",
        "//skia:skia_unittests",
        "//sql:sql_unittests",
        "//third_party/flatbuffers:flatbuffers_unittests",
        "//tools/binary_size:binary_size_trybot_py",
        "//tools/ipc_fuzzer:ipc_fuzzer_all",
        "//tools/metrics:metrics_metadata",
        "//ui/base:ui_base_unittests",
        "//ui/color:color_unittests",
        "//ui/gfx:gfx_unittests",
        "//url:url_unittests",
      ]
      if (!is_component_build) {
        deps += [ "//third_party/abseil-cpp:absl_tests" ]
      }
      if (!is_android && !is_chromecast) {
        deps += [
          "//crypto:crypto_unittests",
          "//google_apis/gcm:gcm_unit_tests",
        ]
      }
      if (enable_js_type_check) {
        deps += [ ":webui_closure_compile" ]
      }
      if (!is_ios && !is_android && !is_chromecast && !is_fuchsia) {
        deps += [
          "//chrome",
          "//chrome/browser/ui/color:dump_colors",
          "//chrome/test:browser_tests",
          "//chrome/test:interactive_ui_tests",
          "//chrome/test:sync_integration_tests",
          "//chrome/test/chromedriver:chromedriver_unittests",
          "//components/subresource_filter/tools:subresource_filter_tools",
          "//components/zucchini:zucchini",
          "//components/zucchini:zucchini_unittests",
          "//gpu/gles2_conform_support:gles2_conform_test",
          "//gpu/khronos_glcts_support:khronos_glcts_test",
          "//jingle:jingle_unittests",
          "//net:hpack_example_generator",
          "//ppapi:ppapi_unittests",
          "//ppapi/examples/2d",
          "//ppapi/examples/audio",
          "//ppapi/examples/audio_input",
          "//ppapi/examples/crxfs",
          "//ppapi/examples/enumerate_devices",
          "//ppapi/examples/file_chooser",
          "//ppapi/examples/flash_topmost",
          "//ppapi/examples/font",
          "//ppapi/examples/gamepad",
          "//ppapi/examples/gles2",
          "//ppapi/examples/gles2_spinning_cube",
          "//ppapi/examples/ime",
          "//ppapi/examples/input",
          "//ppapi/examples/media_stream_audio",
          "//ppapi/examples/media_stream_video",
          "//ppapi/examples/mouse_cursor",
          "//ppapi/examples/mouse_lock",
          "//ppapi/examples/printing",
          "//ppapi/examples/scaling",
          "//ppapi/examples/scripting",
          "//ppapi/examples/stub",
          "//ppapi/examples/threading",
          "//ppapi/examples/url_loader",
          "//ppapi/examples/video_capture",
          "//ppapi/examples/video_decode",
          "//ppapi/examples/video_encode",
          "//printing:printing_unittests",
          "//third_party/SPIRV-Tools/src:SPIRV-Tools",
          "//third_party/SPIRV-Tools/src/test/fuzzers",
          "//third_party/pdfium/samples:pdfium_test",
          "//tools/perf/clear_system_cache",
          "//tools/polymer:polymer_tools_python_unittests",
          "//ui/accessibility:accessibility_perftests",
          "//ui/accessibility:accessibility_unittests",
          "//ui/accessibility/extensions:extension_tests",
          "//ui/accessibility/extensions:extensions",
        ]
      }
      if (!is_ios) {
        deps += [
          "//cc:cc_unittests",
          "//components/policy:policy_templates",
          "//components/ui_devtools/viz",
          "//components/url_formatter/tools:format_url",
          "//components/viz:viz_perftests",
          "//components/viz:viz_unittests",
          "//content/shell:content_shell",
          "//content/test:content_browsertests",
          "//content/test:content_perftests",
          "//content/test:content_unittests",
          "//gpu:gpu_benchmark",
          "//gpu:gpu_unittests",
          "//ipc:ipc_tests",
          "//media:media_unittests",
          "//media/midi:midi_unittests",
          "//media/mojo:media_mojo_unittests",
          "//mojo",
          "//mojo:mojo_unittests",
          "//net:net_perftests",
          "//storage:storage_unittests",
          "//third_party/angle/src/tests:angle_end2end_tests",
          "//third_party/angle/src/tests:angle_unittests",
          "//third_party/blink/common:blink_common_unittests",
          "//third_party/blink/renderer/controller:blink_unittests",
          "//third_party/blink/renderer/platform:blink_platform_unittests",
          "//third_party/blink/renderer/platform/heap:blink_heap_unittests",
          "//third_party/blink/renderer/platform/wtf:wtf_unittests",
          "//tools/imagediff",
          "//ui/display:display_unittests",
          "//ui/events:events_unittests",
          "//ui/gl:gl_unittests",
          "//ui/latency:latency_unittests",
          "//ui/native_theme:native_theme_unittests",
          "//ui/touch_selection:ui_touch_selection_unittests",
          "//url/ipc:url_ipc_unittests",
          "//v8:gn_all",
        ]
      }
      if (is_win || (is_linux && !is_chromeos) || is_android) {
        deps += [
          "//weblayer/shell:weblayer_shell",
          "//weblayer/test:weblayer_browsertests",
          "//weblayer/test:weblayer_unittests",
        ]
        if (is_android) {
          deps += [ "//weblayer/browser/android/javatests:weblayer_instrumentation_test_apk" ]
        }
      }
      if (!is_ios && !is_android) {
        deps += [
          "//components/cronet:cronet_tests",
          "//components/cronet:cronet_unittests",
          "//components/viz/demo:viz_demo",
        ]
      }
      if (enable_openscreen) {
        deps += [ "//chrome/browser/media/router:openscreen_unittests" ]
      }
      if (!is_ios && !is_fuchsia) {
        deps += [
          "//chrome/test:telemetry_perf_unittests",
          "//chrome/test:unit_tests",
          "//components:components_browsertests",
          "//device:device_unittests",
          "//google_apis/gcm:mcs_probe",
          "//media/capture:capture_unittests",
          "//media/cast:cast_unittests",
          "//third_party/angle/src/tests:angle_white_box_tests",
          "//third_party/catapult/telemetry:bitmaptools($host_toolchain)",
        ]
      } else if (is_ios) {
        deps += [
          "//ios:all",
          "//third_party/crashpad/crashpad:crashpad_tests",
        ]
      } else if (is_fuchsia) {
        deps += [
          ":d8_fuchsia",
          "//fuchsia:gn_all",
          "//headless:headless_non_renderer",
        ]
      }
      deps += root_extra_deps
      if (enable_extensions) {
        deps += [
          "//extensions:extensions_browsertests",
          "//extensions:extensions_unittests",
          "//extensions/shell:app_shell_unittests",
        ]
        # TODO(crbug.com/981112): This target is failing to compile consistently in
        # coverage build, remove this condition when the bug is fixed.
        if (!use_clang_coverage) {
          deps += [ "//extensions/browser/api/declarative_net_request/filter_list_converter" ]
        }
      }
      if (enable_remoting) {
        deps += [ "//remoting:remoting_all" ]
      }
      if (toolkit_views) {
        deps += [
          "//ui/views:views_unittests",
          "//ui/views/examples:views_examples",
          "//ui/views/examples:views_examples_unittests",
          "//ui/views/examples:views_examples_with_content",
        ]
      }
      if (use_aura) {
        deps += [
          "//ui/aura:aura_demo",
          "//ui/aura:aura_unittests",
          "//ui/wm:wm_unittests",
        ]
      }
      if (use_ozone) {
        deps += [
          "//ui/ozone",
          "//ui/ozone:ozone_unittests",
          "//ui/ozone/demo",
          "//ui/ozone/gl:ozone_gl_unittests",
        ]
        if (ozone_platform_x11) {
          deps += [ "//ui/ozone:ozone_x11_unittests" ]
        }
      }
    ...

    比如meida模块中audio的模块BUILD.gn文件中具体某个静态库的编译,可以看出一个模块指定生成静态库后,会将其包含的源文件以及依赖库都进行加载中,其中依赖库包含本地模块的静态库,也包含一些第三方库。不同的类型库不同的加载方式。

    source_set("audio") {
    sources = [
        "agc_audio_stream.h",
        "alive_checker.cc",
        "alive_checker.h",
        "audio_debug_file_writer.cc",
        "audio_debug_file_writer.h",
        "audio_debug_recording_helper.cc",
        "audio_debug_recording_helper.h",
        "audio_debug_recording_manager.cc",
        "audio_debug_recording_manager.h",
        "audio_debug_recording_session.h",
        "audio_debug_recording_session_impl.cc",
        "audio_debug_recording_session_impl.h",
        "audio_device_description.cc",
        "audio_device_description.h",
        ]
     if (is_win) {
        sources += [
          "win/audio_device_listener_win.cc",
          "win/audio_device_listener_win.h",
          "win/audio_low_latency_input_win.cc",
          "win/audio_low_latency_input_win.h",
          "win/audio_low_latency_output_win.cc",
          "win/audio_low_latency_output_win.h",
          "win/audio_manager_win.cc",
          "win/audio_manager_win.h",
    ]
    deps += [
          ":aaudio_stubs",
          "//media/base/android:media_jni_headers",
        ]
     libs += [
          "dxguid.lib",
          "setupapi.lib",
          "winmm.lib",
        ]
    
    

    所以如果我们需要减少编译生成模块大小,和添加自己实现的模块,都可以通过修改gn文件进行。

    展开全文
  • gn编译学习

    2021-07-07 16:57:56
    https://chromium.googlesource.com/chromium/src/tools/gn/+/48062805e19b4697c5fbd926dc649c78b6aaa138/docs/quick_start.md
    展开全文
  • windows上gn编译指引

    2021-02-25 16:11:53
    这里以google的angle跨平台gl库的windows编译作为示例 git clone https://chromium.googlesource.com/angle/angle cd angle python scripts/bootstrap.py gclient sync git checkout master 2.动态库编译 ...

    1.下载与环境配置

    这里以google的angle跨平台gl库的windows编译作为示例

    git clone https://chromium.googlesource.com/angle/angle 
    cd angle 
    python scripts/bootstrap.py 
    gclient sync 
    git checkout master

     

    2.动态库编译

    a.编译配置

    gn gen out/x64.debug 
    或者 gn gen out/x64.release

    out/x64.debug是angle根目录下产物目录路径,这里目录名称包含芯片架构以及debug、release信息,方便区分

     

    b.编译参数

    修改产物路径下的args.gn文件,如out/x64.release/args.gn

    target_cpu = "x64" 
    is_clang = false 
    is_debug = true 
    #is_component_build = false 
    enable_iterator_debugging=true

    target_cpu:编译的产物芯片架构 x86/x64

    is_clang: 是否使用clang或者gcc,这里要固定为false,为true时报错:lld-link: error: invalid timestamp: -2142000. Expected 32-bit integer

    is_component_build: 原本gn的参数表示是否编译动态库,但是angle不生效,这里可不用关注这个参数

    is_debug: debug时为true,release为false

    enable_iterator_debugging: 当编译debug版本的库时,这里一定要为true,否则在链接产物时ITERATOR_DEBUG_LEVEL对不上

     

    c.开始编译

    autoninja -C out/x64.debug -j 18 libGLESv2 libEGL

    d.产物

    拿到产物libEGL.dll libEGL.dll.lib libGLESv2.dll libGLESv2.dll.lib

     

    3.静态库编译

    a.编译配置

    gn gen out/x64.debug 
    或者 gn gen out/x64.release

    这里同动态库编译

    b.编译参数

    修改产物路径下的args.gn,如out/x64.release/args.gn,注意debug和release的参数差异

    target_cpu = "x64" 
    is_clang = false 
    is_debug = true 
    #is_component_build = false 
    enable_iterator_debugging=true

    这里参数解释同动态库编译

    c.开始编译

    这里为了节省时间,针对性进行编译

    autoninja -C out/x64.debug -j 18 libGLESv2_static.lib libEGL_static.lib

    d.产物

    拿到产物obj/libGLESv2_static.lib obj/libEGL_static.lib

     

    e.问题

    1.上面编译的结果静态库太小

    angle依赖的第三方库都没有合并进来

    解决办法:

    默认情况下,静态库不会包含dependence,需要修改BUILD.gn加上

    complete_static_lib = true

     

    3.windows上运行时库的问题

    在windows上还要考虑mt md的问题

    说明

    MT选项:链接LIB版的C和C++运行库。在链接时就会在将C和C++运行时库集成到程序中成为程序中的代码,程序体积会变大。

    MTd选项:LIB的调试版。 

    MD选项:使用DLL版的C和C++运行库,这样在程序运行时会动态的加载对应的DLL,程序体积会减小,缺点是在系统没有对应DLL时程序无法运行。 

    MDd选项:表示使用DLL的调试版。

    windows开发,在一个工程中,工程本身的运行库选项必须和所有被依赖的库的运行库选项一致,否则就会出现如下运行库不匹配的问题:

    angle在release版本中默认输出/MD,debug版本中默认输出/MDd

    解决方案

    我们对外输出的库都是mt,angle需要对应输出mt选项的库

    build.gn中对所有的cflags增加如下配置

    if (is_debug) { 
        cflags = [ "/MTd" ] 
    } else { 
        cflags = [ "/MT" ] 
    }

    编译之后依然出现如下问题:

    依然是mt md的问题,angle依赖的第三方库也要使用mt编译选项

    在angle根目录下查找对应的obj,发现是第三方库vulkan-deps/glslang、vulkan-deps/spirv-tools模块

    在该模块中同样加入mt选项

    陆续发现更多的模块需要加入mt渲染,非常麻烦,我们使用一种简单的方案

    1.config/win/BUILD.gn中的/MD全部改为MT,/MDD全部改为/MT

    2.配置所有target默认config

    已经配置了is_debug=true 居然ITERATOR_DEBUG_LEVEL还是为0,与工程的2不匹配

    查阅得知,gn中需要增加配置参数enable_iterator_debugging=true

    再次编译,完美解决

    展开全文
  • gn编译中,因为涉及多平台的编译,windows、cortex-a9、cortex-a7-poky在生成一个动态库的时候都没问题, 但是当在x86-64平台编译时,却一直提示: hidden symbol `pthread_atfork' in /opt/gcc-linaro-aarch64-...
  • ninja gn编译环境搭建

    2021-06-06 15:37:24
    su - //input your root passwd (first use , ...cpp git clone https://github.com/timniederhausen/gn.git cd gn ./build/gen.py ninja -C out cp ./out/gn /usr/bin chmod +x /usr/bin/gn chmod +x /usr/bin/ninja
  • gn-helloword

    2018-10-10 23:39:23
    gn-helloword.tar.gz是使用gn进行编译的测试程序,此程序中包含了gn编译的相关设置和说明,为后续学习gn提供参考。
  • WebRTC编译系统之gn files

    千次阅读 2017-04-13 13:07:23
    在“WebRTC 构建系统介绍之gn和ninja”中,大概介绍了 gn 和 ninja 的简单用法,这次来看看 gn 用到的项目文件 .gn 、 .gni 和 DEPS
  • WebRTC现在使用 gn 来...我们来大概介绍下编译 WebRTC 会用到的 gn 和 ninja 相关的知识。 想看编译指南的,看这里:Ubuntu 14.04下编译WebRTC。 gn gn 的介绍在这里:https://www.chromium.org/developers/gn-b...
  • gn args out\Debug_GN_x86 用来配置编译参数,执行gn args out\Release_GN_x86时异常: Toolchain is out of date. Run "gclient runhooks" to update the toolchain, or set DEPOT_TOOLS_WIN_TOOLCHAIN=0 to use ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,691
精华内容 1,876
关键字:

gn编译