Edit

kc3-lang/angle/BUILD.gn

Branch :

  • Show log

    Commit

  • Author : Wander Lairson Costa
    Date : 2020-07-14 15:29:40
    Hash : ee9c4fe4
    Message : D3D: Make possible to build angle without D3D11 A few files inside the D3D11 tree are used by D3D9 and WGL backends. We add these files to the build system even when D3D11 is disabled. Also, we fix the use the of ANGLE_DEFAULT_D3D11 symbol. Bug: angleproject:4839 Change-Id: I981f4bfc60d973c02549caa737c5aed5ccf31282 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2298143 Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>

  • BUILD.gn
  • # Copyright 2019 The ANGLE Project Authors. All rights reserved.
    # Use of this source code is governed by a BSD-style license that can be
    # found in the LICENSE file.
    
    # import the use_x11 variable
    import("gni/angle.gni")
    if (angle_has_build) {
      import("//build/config/linux/pkg_config.gni")
      import("//build/config/ui.gni")
      import("//testing/libfuzzer/fuzzer_test.gni")
    
      if (is_android) {
        # android/rules.gni can only be imported for Android targets
        import("//build/config/android/config.gni")
        import("//build/config/android/rules.gni")
        import("android/angle_apk.gni")
      }
    }
    
    declare_args() {
      # Use the PCI lib to collect GPU information on Linux.
      use_libpci = is_linux && (!is_chromecast || is_cast_desktop_build) &&
                   (angle_use_x11 || use_ozone)
    
      # Link in system libGL, to work with apitrace.  See doc/DebuggingTips.md.
      angle_link_glx = false
    
      # Defaults to capture building to $root_out_dir/angle_libs/with_capture.
      # Switch on to build capture to $root_out_dir.
      angle_with_capture_by_default = false
    
      # Don't build extra (test, samples etc) for Windows UWP. We don't have
      # infrastructure (e.g. windowing helper functions) in place to run them.
      angle_build_all = !build_with_chromium && !angle_is_winuwp && angle_has_build
    
      # Enable generating current commit information using git
      angle_enable_commit_id = true
    }
    
    if (angle_build_all) {
      group("all") {
        testonly = true
        deps = [
          ":angle",
          ":angle_shader_translator",
          ":translator_fuzzer",
          ":xxhash_fuzzer",
          "$angle_root/samples:angle_samples",
          "$angle_root/src/tests:angle_tests",
        ]
      }
    }
    
    if (ozone_platform_gbm) {
      pkg_config("libdrm") {
        packages = [ "libdrm" ]
      }
    }
    
    import("src/compiler.gni")
    import("src/libGLESv2.gni")
    
    # This config is exported to dependent targets (and also applied to internal
    # ones).
    config("external_config") {
      include_dirs = [ "include" ]
    }
    
    # Prevent the GL headers from redeclaring ANGLE entry points.
    config("no_gl_prototypes") {
      defines = [
        "GL_GLES_PROTOTYPES=0",
        "EGL_EGL_PROTOTYPES=0",
      ]
    }
    
    config("gl_prototypes") {
      defines = [
        "GL_GLES_PROTOTYPES=1",
        "EGL_EGL_PROTOTYPES=1",
        "GL_GLEXT_PROTOTYPES",
        "EGL_EGLEXT_PROTOTYPES",
      ]
    }
    
    # This config is applied to internal Angle targets (not pushed to dependents).
    config("internal_config") {
      include_dirs = [
        "include",
        "src",
      ]
    
      defines = []
    
      if (angle_64bit_current_cpu) {
        defines += [ "ANGLE_IS_64_BIT_CPU" ]
      } else {
        defines += [ "ANGLE_IS_32_BIT_CPU" ]
      }
    
      if (is_win) {
        defines += [ "ANGLE_IS_WIN" ]
      } else if (is_linux) {
        defines += [ "ANGLE_IS_LINUX" ]
      }
    
      if (angle_enable_trace) {
        defines += [ "ANGLE_ENABLE_DEBUG_TRACE=1" ]
      }
    
      if (is_chromeos) {
        defines += [ "ANGLE_PLATFORM_CHROMEOS" ]
      }
    
      if (is_ggp) {
        defines += [ "__ggp__" ]
      }
    }
    
    config("constructor_and_destructor_warnings") {
      if (is_clang) {
        cflags = [
          "-Wexit-time-destructors",
          "-Wglobal-constructors",
        ]
      }
    }
    
    config("extra_warnings") {
      cflags = []
    
      # Enable more default warnings on Windows.
      if (is_win) {
        cflags += [
          "/we4244",  # Conversion: possible loss of data.
          "/we4456",  # Variable shadowing.
          "/we4458",  # declaration hides class member.
          "/we4715",  # not all control paths return a value
          "/we4800",  # forcing value to bool.
          "/we4838",  # narrowing conversion.
        ]
      }
      if (is_clang) {
        cflags += [
          "-Wconditional-uninitialized",
          "-Wextra-semi-stmt",
          "-Wfloat-conversion",
          "-Winconsistent-missing-destructor-override",
          "-Wmissing-field-initializers",
          "-Wnewline-eof",
          "-Wnon-virtual-dtor",
          "-Wredundant-parens",
          "-Wshadow-field",
          "-Wtautological-type-limit-compare",
          "-Wundefined-reinterpret-cast",
          "-Wunneeded-internal-declaration",
    
          # The below warnings are used by WebKit. We enable them to make rolling
          # ANGLE in WebKit easier.
          "-Wparentheses",
          "-Wrange-loop-analysis",
          "-Wstrict-prototypes",
          "-Wunreachable-code",
          "-Wshorten-64-to-32",
        ]
      }
    
      if (angle_is_winuwp) {
        cflags += [ "/wd4447" ]  # 'main' signature found without threading model.
      }
    }
    
    # This config adds build-ids to the associated library.
    # -Wl is a special option that indicates that clang should pass the associated
    # option --build-id to the linker. This will cause a build-id section to be added
    # to the associated library. The build-id makes it possible for a debugger to
    # find the right symbol file to use.
    config("build_id_config") {
      ldflags = [ "-Wl,--build-id" ]
    }
    
    # Useful for more informative stack traces.
    config("better_linux_stack_traces") {
      if (angle_better_stack_traces) {
        ldflags = [ "-Wl,--export-dynamic" ]
      }
    }
    
    _use_copy_compiler_dll = angle_has_build && is_win && target_cpu != "arm64"
    
    # Windows ARM64 is available since 10.0.16299 so no need to copy
    # d3dcompiler_47.dll because this file is available as inbox.
    if (_use_copy_compiler_dll) {
      # We also ship an older DLL for compatiblity with Windows 7 machines without
      # the UCRT. This DLL isn't available in the standard SDK distribution.
      _old_compiler = "$windows_sdk_path/Redist/D3D/$target_cpu/d3dcompiler_old.dll"
      _has_old_compiler =
          exec_script("scripts/file_exists.py", [ _old_compiler ], "value")
    
      copy("copy_compiler_dll") {
        sources = [ "$windows_sdk_path/Redist/D3D/$target_cpu/d3dcompiler_47.dll" ]
    
        if (_has_old_compiler) {
          sources += [ _old_compiler ]
        }
    
        outputs = [ "$root_out_dir/{{source_file_part}}" ]
      }
    }
    
    # Holds the shared includes so we only need to list them once.
    config("includes_config") {
      include_dirs = [ "include" ]
    }
    
    angle_source_set("includes") {
      sources = libangle_includes
      public_configs = [ ":includes_config" ]
    }
    
    angle_static_library("preprocessor") {
      sources = angle_preprocessor_sources
    
      public_deps = [
        ":angle_common",
        ":angle_translator_headers",
      ]
    }
    
    config("angle_disable_pool_alloc") {
      defines = [ "ANGLE_DISABLE_POOL_ALLOC" ]
    }
    
    config("debug_annotations_config") {
      if (is_debug) {
        defines = [ "ANGLE_ENABLE_DEBUG_ANNOTATIONS" ]
      }
    }
    
    config("angle_release_asserts_config") {
      if (dcheck_always_on) {
        defines = [ "ANGLE_ENABLE_RELEASE_ASSERTS" ]
      }
    }
    
    config("angle_common_config") {
      include_dirs = [ "src/common/third_party/base" ]
      if (is_android) {
        libs = [ "log" ]
      }
    }
    
    angle_source_set("angle_system_utils") {
      sources = angle_system_utils_sources
    }
    
    angle_source_set("xxhash") {
      sources = xxhash_sources
    }
    
    if (angle_has_build) {
      fuzzer_test("xxhash_fuzzer") {
        sources = [ "src/common/third_party/xxhash/xxhash_fuzzer.cpp" ]
        deps = [ ":xxhash" ]
      }
    }
    
    angle_static_library("angle_common") {
      sources = libangle_common_sources
    
      configs += [
        ":angle_common_config",
        ":debug_annotations_config",
      ]
    
      deps = [ ":xxhash" ]
    
      public_deps = [
        ":angle_system_utils",
        ":angle_version",
        ":includes",
      ]
      public_configs += [ ":angle_common_config" ]
      if (angle_has_build && use_fuzzing_engine) {
        all_dependent_configs = [ ":angle_disable_pool_alloc" ]
      }
    }
    
    config("angle_image_util_config") {
      include_dirs = [
        "include",
        "src",
      ]
    }
    
    angle_source_set("angle_image_util_headers") {
      sources = libangle_image_util_headers
      public_deps = [ ":angle_common" ]
    }
    
    angle_static_library("angle_image_util") {
      sources = libangle_image_util_sources
      public_configs += [ ":angle_image_util_config" ]
      public_deps = [ ":angle_image_util_headers" ]
    }
    
    config("angle_gl_visibility_config") {
      if (is_win) {
        defines = [
          "GL_APICALL=",
          "GL_API=",
        ]
      } else {
        defines = [
          "GL_APICALL=__attribute__((visibility(\"default\")))",
          "GL_API=__attribute__((visibility(\"default\")))",
        ]
      }
    }
    
    config("angle_gpu_info_util_config") {
      include_dirs = [
        "include",
        "src",
      ]
    }
    
    angle_static_library("angle_gpu_info_util") {
      public_configs += [
        ":angle_gpu_info_util_config",
        ":angle_backend_config",
      ]
      public_deps = [ ":angle_common" ]
      sources = libangle_gpu_info_util_sources
      deps = []
      libs = []
      defines = []
    
      if (is_android || is_fuchsia) {
        sources += libangle_gpu_info_util_vulkan_sources
        deps += [ "$angle_root/third_party/vulkan-headers/src:vulkan_headers" ]
      }
    
      if (is_android) {
        sources += libangle_gpu_info_util_android_sources
      }
    
      if (is_fuchsia) {
        sources += libangle_gpu_info_util_fuchsia_sources
        deps += [ "$angle_root/src/common/vulkan:angle_vulkan_entry_points" ]
      }
    
      if (is_win) {
        sources += libangle_gpu_info_util_win_sources
        if (!angle_is_winuwp) {
          libs += [ "setupapi.lib" ]
        }
        libs += [ "dxgi.lib" ]
      }
    
      if (is_linux) {
        sources += libangle_gpu_info_util_linux_sources
    
        if (angle_use_x11) {
          sources += libangle_gpu_info_util_x11_sources
          deps += [ "src/third_party/libXNVCtrl:libXNVCtrl" ]
          defines += [ "GPU_INFO_USE_X11" ]
          libs += [
            "X11",
            "Xi",
            "Xext",
          ]
        }
      }
    
      if (use_libpci) {
        sources += libangle_gpu_info_util_libpci_sources
        defines += [ "GPU_INFO_USE_LIBPCI" ]
        libs += [ "pci" ]
      }
    
      if (is_mac) {
        sources += libangle_gpu_info_util_mac_sources
        frameworks = [
          "IOKit.framework",
          "CoreFoundation.framework",
          "CoreGraphics.framework",
          "OpenGL.framework",
        ]
      }
    }
    
    angle_source_set("angle_translator_headers") {
      sources = angle_translator_exported_headers
      public_deps = [ ":includes" ]
    }
    
    angle_static_library("translator") {
      sources = angle_translator_sources
      defines = []
    
      if (angle_enable_essl || use_fuzzing_engine) {
        sources += angle_translator_essl_sources
        defines += [ "ANGLE_ENABLE_ESSL" ]
      }
    
      if (angle_enable_glsl || use_fuzzing_engine) {
        sources += angle_translator_glsl_sources
        defines += [ "ANGLE_ENABLE_GLSL" ]
      }
    
      if (angle_enable_hlsl || use_fuzzing_engine) {
        sources += angle_translator_hlsl_sources
        defines += [ "ANGLE_ENABLE_HLSL" ]
      }
    
      if (angle_enable_vulkan || use_fuzzing_engine || angle_enable_metal) {
        # This translator is needed by metal backend also.
        sources += angle_translator_lib_vulkan_sources
      }
    
      if (angle_enable_vulkan || use_fuzzing_engine) {
        defines += [ "ANGLE_ENABLE_VULKAN" ]
      }
    
      if (angle_enable_metal) {
        sources += angle_translator_lib_metal_sources
        defines += [ "ANGLE_ENABLE_METAL" ]
      }
    
      if (angle_enable_swiftshader) {
        defines += [ "ANGLE_ENABLE_SWIFTSHADER" ]
      }
    
      public_configs += [ ":external_config" ]
    
      deps = [
        ":includes",
        ":preprocessor",
      ]
    
      public_deps = [
        ":angle_common",
        ":angle_translator_headers",
      ]
    
      if (is_win) {
        # Necessary to suppress some system header xtree warnigns in Release.
        # For some reason this warning doesn't get triggered in Chromium
        cflags = [ "/wd4718" ]
      }
    }
    
    angle_source_set("translator_fuzzer") {
      sources = [ "src/compiler/fuzz/translator_fuzzer.cpp" ]
    
      include_dirs = [
        "include",
        "src",
      ]
    
      deps = [ ":translator" ]
    }
    
    config("commit_id_config") {
      include_dirs = [ "$root_gen_dir/angle" ]
      visibility = [ ":commit_id" ]
    }
    
    commit_id_output_file = "$root_gen_dir/angle/commit.h"
    action("commit_id") {
      script = "src/commit_id.py"
      outputs = [ commit_id_output_file ]
    
      # Add git as a dependency if it is available.
      if (angle_enable_commit_id &&
          exec_script("src/commit_id.py", [ "check" ], "value") == 1) {
        # commit id should depend on angle's HEAD revision
        inputs = [ ".git/HEAD" ]
      }
    
      args = [
        "gen",
        rebase_path(commit_id_output_file, root_build_dir),
      ]
    
      public_configs = [ ":commit_id_config" ]
    }
    
    angle_source_set("angle_version") {
      sources = [ "src/common/version.h" ]
      public_deps = [ ":commit_id" ]
    }
    
    config("angle_backend_config") {
      defines = []
    
      if (angle_enable_d3d9) {
        defines += [ "ANGLE_ENABLE_D3D9" ]
      }
      if (angle_enable_d3d11) {
        defines += [ "ANGLE_ENABLE_D3D11" ]
      }
      if (angle_enable_gl) {
        defines += [ "ANGLE_ENABLE_OPENGL" ]
        if (angle_enable_gl_null) {
          defines += [ "ANGLE_ENABLE_OPENGL_NULL" ]
        }
      }
      if (angle_enable_null) {
        defines += [ "ANGLE_ENABLE_NULL" ]
      }
      if (angle_delegate_workers) {
        defines += [ "ANGLE_DELEGATE_WORKERS" ]
      }
    
      configs = []
    
      if (angle_enable_metal) {
        configs += [ "src/libANGLE/renderer/metal:angle_metal_backend_config" ]
      }
    
      if (angle_enable_vulkan) {
        configs += [ "src/libANGLE/renderer/vulkan:angle_vulkan_backend_config" ]
      }
    }
    
    config("libANGLE_config") {
      cflags = []
      defines = []
      libs = []
      ldflags = []
      if (angle_enable_d3d9) {
        ldflags += [ "/DELAYLOAD:d3d9.dll" ]
      }
      defines += [ "LIBANGLE_IMPLEMENTATION" ]
    
      if (is_win) {
        cflags += [ "/wd4530" ]  # C++ exception handler used, but unwind semantics
                                 # are not enabled.
      }
    
      if (is_android && (angle_enable_gl || angle_enable_vulkan)) {
        # In API level 26 ANativeWindow APIs were moved from libandroid.so
        # into a separate library, libnativewindow.so
        if (ndk_api_level_at_least_26) {
          libs += [ "nativewindow" ]
        } else {
          libs += [ "android" ]
        }
      }
    
      if (angle_use_x11) {
        defines += [ "ANGLE_USE_X11" ]
      }
    
      if (angle_enable_overlay) {
        defines += [ "ANGLE_ENABLE_OVERLAY=1" ]
      }
    }
    
    angle_source_set("libANGLE_headers") {
      sources = libangle_headers
      public_deps = [
        ":angle_common",
        ":angle_translator_headers",
      ]
      public_configs += [ ":libANGLE_config" ]
    }
    
    # Don't even try to build glslang if Metal and Vulkan are disabled.
    if (angle_enable_vulkan || angle_enable_metal) {
      angle_source_set("angle_glslang_wrapper") {
        sources = [
          "src/libANGLE/renderer/glslang_wrapper_utils.cpp",
          "src/libANGLE/renderer/glslang_wrapper_utils.h",
        ]
        deps = [
          ":libANGLE_headers",
          "${angle_glslang_dir}:glslang_default_resource_limits_sources",
          "${angle_glslang_dir}:glslang_lib_sources",
          "${angle_spirv_headers_dir}:spv_headers",
          "${angle_spirv_tools_dir}:spvtools_headers",
        ]
      }
    }
    
    angle_source_set("libANGLE_base") {
      sources = libangle_sources
    
      include_dirs = []
      libs = []
      defines = []
      if (angle_link_glx) {
        libs += [ "GL" ]
        defines += [ "ANGLE_LINK_GLX" ]
      }
      public_deps = [
        ":angle_common",
        ":angle_gpu_info_util",
        ":angle_version",
        ":libANGLE_headers",
        ":translator",
      ]
      deps = [
        ":angle_compression",
        ":angle_image_util",
        ":includes",
      ]
    
      if (is_win) {
        if (angle_enable_d3d9) {
          libs += [ "delayimp.lib" ]
        }
        libs += [
          "gdi32.lib",
          "user32.lib",
        ]
      }
    
      if (angle_enable_vulkan) {
        public_deps += [ "src/libANGLE/renderer/vulkan:angle_vulkan_backend" ]
      }
    
      if (angle_enable_metal) {
        public_deps += [ "src/libANGLE/renderer/metal:angle_metal_backend" ]
      }
    
      # Enable extra Chromium style warnings for libANGLE.
      if (is_clang && angle_has_build) {
        suppressed_configs -= [ "//build/config/clang:find_bad_constructs" ]
      }
    
      # Shared D3D sources.
      if (angle_enable_d3d9 || angle_enable_d3d11) {
        sources += libangle_d3d_shared_sources
    
        defines += [ "ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES={ " + "\"d3dcompiler_47.dll\", \"d3dcompiler_46.dll\", \"d3dcompiler_43.dll\" }" ]
      }
    
      if (angle_enable_d3d9) {
        sources += libangle_d3d9_sources
        libs += [ "d3d9.lib" ]
      }
    
      if (angle_enable_d3d11) {
        sources += libangle_d3d11_sources
    
        if (angle_is_winuwp) {
          sources += libangle_d3d11_winuwp_sources
        } else {
          sources += libangle_d3d11_win32_sources
        }
    
        libs += [ "dxguid.lib" ]
        import("src/libANGLE/renderer/d3d/d3d11/d3d11_blit_shaders_autogen.gni")
        sources += libangle_d3d11_blit_shaders
      }
    
      if (!angle_is_winuwp && (angle_enable_d3d11 || angle_enable_d3d9)) {
        sources += libangle_d3d_win32_sources
      }
    
      if (is_win && (angle_enable_gl || angle_enable_d3d11)) {
        sources += libangle_gl_wgl_d3d11_common_sources
      }
    
      if (angle_enable_gl) {
        sources += libangle_gl_sources
        include_dirs += [ "src/third_party/khronos" ]
    
        if (angle_enable_gl_null) {
          sources += libangle_gl_null_sources
        }
        if (is_win) {
          sources += libangle_gl_wgl_sources
        }
        if (angle_use_x11) {
          sources += libangle_gl_glx_sources
          deps += [ "src/third_party/libXNVCtrl:libXNVCtrl" ]
          libs += [
            "X11",
            "Xi",
            "Xext",
          ]
        }
        if (is_mac) {
          sources += libangle_gl_cgl_sources
          frameworks = [
            "Cocoa.framework",
            "IOSurface.framework",
            "OpenGL.framework",
            "QuartzCore.framework",
          ]
        }
        if (is_android) {
          sources += libangle_gl_egl_sources
          sources += libangle_gl_egl_dl_sources
          sources += libangle_gl_egl_android_sources
        }
        if (is_linux) {
          sources += libangle_gl_egl_sources
          sources += libangle_gl_egl_dl_sources
        }
        if (ozone_platform_gbm) {
          configs += [ ":libdrm" ]
          defines += [ "ANGLE_USE_GBM" ]
          deps += [ "//third_party/minigbm" ]
          sources += libangle_gl_gbm_sources
        }
      }
    
      if (angle_enable_null) {
        sources += libangle_null_sources
      }
    
      if (is_mac) {
        sources += libangle_mac_sources
      }
    
      if (is_debug) {
        defines += [ "ANGLE_GENERATE_SHADER_DEBUG_INFO" ]
      }
    
      configs += [ ":debug_annotations_config" ]
      public_configs += [
        ":libANGLE_config",
        ":angle_backend_config",
      ]
    
      # Windows ARM64 is available since 10.0.16299 so no need to copy
      # d3dcompiler_47.dll because this file is available as inbox.
      if (_use_copy_compiler_dll) {
        data_deps = [ ":copy_compiler_dll" ]
      }
    }
    
    config("angle_frame_capture_disabled") {
      defines = [ "ANGLE_CAPTURE_ENABLED=0" ]
    }
    
    config("angle_frame_capture_enabled") {
      defines = [ "ANGLE_CAPTURE_ENABLED=1" ]
    }
    
    angle_source_set("libANGLE") {
      public_deps = [ ":libANGLE_base" ]
      public_configs = [ ":angle_frame_capture_disabled" ]
      sources = [ "src/libANGLE/FrameCapture_mock.cpp" ]
    
      # gl_enum_utils defaults included in with_capture build
      deps = []
      if (angle_enable_trace || is_debug) {
        deps += [ ":angle_gl_enum_utils" ]
      }
    }
    
    angle_source_set("angle_gl_enum_utils") {
      public_deps = [ ":libANGLE_base" ]
      sources = [
        "src/libANGLE/gl_enum_utils.cpp",
        "src/libANGLE/gl_enum_utils_autogen.cpp",
      ]
    }
    
    config("angle_compression_config") {
      include_dirs = [ "//third_party/zlib/google" ]
    }
    
    group("angle_compression") {
      public_configs = [
        ":angle_compression_config",
        "//third_party/zlib:zlib_config",
      ]
      public_deps = [ "//third_party/zlib/google:compression_utils_portable" ]
    }
    
    angle_source_set("libANGLE_with_capture") {
      public_deps = [ ":libANGLE_base" ]
      deps = [ ":angle_compression" ]
      public_configs = [ ":angle_frame_capture_enabled" ]
      sources = libangle_capture_sources
    }
    
    config("shared_library_public_config") {
      if (is_mac && !is_component_build) {
        # Executable targets that depend on the shared libraries below need to have
        # the rpath setup in non-component build configurations.
        ldflags = [
          "-rpath",
          "@executable_path/",
        ]
        if (build_with_chromium) {
          ldflags += [
            # Path for loading shared libraries for unbundled binaries.
            # From //build/config/mac/BUILD.gn, this is only added for
            # component builds. However, since ANGLE always dynamically
            # links to libvulkan, it should be re-added for non-component
            # builds. (anglebug.com/4455)
            "-Wl,-rpath,@loader_path/.",
          ]
        }
      }
    
      if (angle_is_winuwp) {
        ldflags = [
          "/APPCONTAINER",
    
          # Disable warning about invalid subsystem number.
          # A default appropriate subsystem is selected automatically.
          "/IGNORE:4010",
        ]
      }
    }
    
    config("library_name_config") {
      if (is_component_build && is_android) {
        defines = [
          "ANGLE_EGL_LIBRARY_NAME=\"libEGL${angle_libs_suffix}.cr\"",
          "ANGLE_GLESV2_LIBRARY_NAME=\"libGLESv2${angle_libs_suffix}.cr\"",
        ]
      } else {
        defines = [
          "ANGLE_EGL_LIBRARY_NAME=\"libEGL${angle_libs_suffix}\"",
          "ANGLE_GLESV2_LIBRARY_NAME=\"libGLESv2${angle_libs_suffix}\"",
        ]
      }
    }
    
    # This config controls export definitions on ANGLE API calls.
    config("angle_static") {
      defines = [
        "ANGLE_EXPORT=",
        "ANGLE_UTIL_EXPORT=",
        "EGLAPI=",
        "GL_APICALL=",
        "GL_API=",
      ]
    }
    
    set_defaults("angle_libGLESv2") {
      sources = []
      output_name = "libGLESv2"
    }
    
    template("angle_libGLESv2") {
      angle_shared_library(target_name) {
        sources = libglesv2_sources + invoker.sources
    
        if (is_win) {
          sources += [ "src/libGLESv2/${invoker.output_name}_autogen.def" ]
        }
    
        output_name = "${invoker.output_name}${angle_libs_suffix}"
    
        configs += [
          ":angle_gl_visibility_config",
          ":debug_annotations_config",
          ":gl_prototypes",
        ]
    
        defines = [ "LIBGLESV2_IMPLEMENTATION" ]
    
        deps = invoker.deps + [ ":includes" ]
    
        public_deps = [ ":angle_version" ]
      }
    }
    
    angle_libGLESv2("libGLESv2") {
      if (angle_with_capture_by_default) {
        deps = [ ":libANGLE_with_capture" ]
      } else {
        deps = [ ":libANGLE" ]
      }
    }
    
    # Output capture lib when `angle_with_capture_by_default` disabled, vice versa.
    angle_libGLESv2("libGLESv2_capture_complement") {
      if (angle_with_capture_by_default) {
        deps = [ ":libANGLE" ]
        output_name += "_no_capture"
      } else {
        deps = [ ":libANGLE_with_capture" ]
        output_name += "_with_capture"
      }
    }
    
    if (is_win && !angle_is_winuwp) {
      angle_shared_library("libGL") {
        sources = libgl_sources
    
        output_name = "openGL32"
        output_dir = "$root_out_dir/angle_libs"
    
        configs += [
          ":angle_gl_visibility_config",
          ":debug_annotations_config",
          ":gl_prototypes",
        ]
    
        defines = [
          "ANGLE_CAPTURE_ENABLED=0",
          "LIBGL_IMPLEMENTATION",
        ]
    
        deps = [
          ":includes",
          ":libANGLE",
        ]
    
        public_deps = [ ":angle_version" ]
      }
    }
    
    angle_static_library("libGLESv2_static") {
      sources = libglesv2_sources
      configs += [ ":debug_annotations_config" ]
      public_configs += [ ":angle_static" ]
      deps = [ ":includes" ]
      public_deps = [ ":libANGLE" ]
    }
    
    angle_static_library("libGLESv2_with_capture_static") {
      sources = libglesv2_sources
      configs += [ ":debug_annotations_config" ]
      public_configs += [ ":angle_static" ]
      deps = [ ":includes" ]
      public_deps = [ ":libANGLE_with_capture" ]
    }
    
    angle_shared_library("libGLESv1_CM") {
      sources = libglesv1_cm_sources
      output_name = "libGLESv1_CM${angle_libs_suffix}"
    
      configs += [
        ":angle_gl_visibility_config",
        ":debug_annotations_config",
        ":gl_prototypes",
      ]
    
      defines = []
    
      deps = [
        ":includes",
        ":libGLESv2",
      ]
    }
    
    angle_static_library("libGLESv1_CM_static") {
      sources = libglesv1_cm_sources
      configs += [ ":debug_annotations_config" ]
      public_configs += [ ":angle_static" ]
      deps = [
        ":includes",
        ":libGLESv2_static",
      ]
    }
    
    config("libEGL_egl_loader_config") {
      defines = [ "ANGLE_USE_EGL_LOADER" ]
    }
    
    angle_source_set("libEGL_egl_loader") {
      sources = [
        "src/libEGL/egl_loader_autogen.cpp",
        "src/libEGL/egl_loader_autogen.h",
      ]
    
      public_configs += [
        ":libEGL_egl_loader_config",
        ":gl_prototypes",
      ]
    
      deps = [ ":includes" ]
    }
    
    angle_shared_library("libEGL") {
      sources = libegl_sources
      output_name = "libEGL${angle_libs_suffix}"
    
      configs += [
        ":debug_annotations_config",
        ":library_name_config",
      ]
    
      defines = [ "LIBEGL_IMPLEMENTATION" ]
      if (is_win) {
        defines += [ "EGLAPI=" ]
      } else {
        defines += [ "EGLAPI=__attribute__((visibility(\"default\")))" ]
      }
    
      if (is_win) {
        sources += [ "src/libEGL/libEGL.def" ]
      }
    
      deps = [
        ":angle_common",
        ":angle_system_utils",
        ":angle_version",
        ":libEGL_egl_loader",
      ]
    
      public_deps = [ ":includes" ]
    
      data_deps = [ ":libGLESv2" ]
    }
    
    angle_static_library("libEGL_static") {
      sources = libegl_sources
      configs += [
        ":debug_annotations_config",
        ":library_name_config",
      ]
      public_configs += [ ":angle_static" ]
      deps = [
        ":includes",
        ":libGLESv2_static",
      ]
    }
    
    angle_static_library("libEGL_with_capture_static") {
      sources = libegl_sources
    
      configs += [
        ":debug_annotations_config",
        ":library_name_config",
      ]
    
      public_configs += [ ":angle_static" ]
    
      deps = [
        ":includes",
        ":libGLESv2_with_capture_static",
      ]
    }
    
    # Convenience targets for some of the samples so they can be built
    # with Chromium's toolchain.
    angle_executable("angle_shader_translator") {
      testonly = true
    
      sources = [ "samples/shader_translator/shader_translator.cpp" ]
    
      deps = [ ":translator" ]
    }
    
    if (angle_has_build) {
      config("angle_feature_support_config") {
        include_dirs = [
          "include",
          "src",
        ]
        defines = [ "LIBFEATURE_SUPPORT_IMPLEMENTATION" ]
        if (is_debug) {
          defines += [ "ANGLE_FEATURE_UTIL_LOG_VERBOSE" ]
        }
      }
    
      angle_shared_library("libfeature_support") {
        output_name = "libfeature_support${angle_libs_suffix}"
    
        if (is_android) {
          libs = [ "log" ]
        }
    
        public_configs += [
          ":angle_feature_support_config",
          "${angle_jsoncpp_dir}:jsoncpp_config",
        ]
    
        if (is_mac && !is_component_build) {
          ldflags = [
            "-install_name",
            "@rpath/${target_name}.dylib",
          ]
        }
    
        sources = [
          "src/feature_support_util/feature_support_util.cpp",
          "src/feature_support_util/feature_support_util.h",
        ]
    
        deps = [
          ":angle_gpu_info_util",
          "${angle_jsoncpp_dir}:jsoncpp",
        ]
      }
    }
    
    if (!is_component_build && is_android && symbol_level != 0) {
      action_foreach("compressed_symbols") {
        sources = []
        foreach(_library, angle_libraries) {
          sources += [ "$root_out_dir/${_library}${angle_libs_suffix}.so" ]
        }
        if (angle_enable_vulkan_validation_layers) {
          foreach(_layer, vulkan_validation_layers) {
            sources += [ "$root_out_dir/lib${_layer}.so" ]
          }
        }
    
        script = rebase_path("${root_build_dir}/android/compress_symbols.py",
                             root_build_dir)
    
        deps = []
        foreach(_library, angle_libraries) {
          deps += [ ":$_library" ]
        }
    
        if (angle_enable_vulkan_validation_layers) {
          foreach(_layer, vulkan_validation_layers) {
            deps += [
              "${angle_root}/third_party/vulkan-validation-layers/src:${_layer}",
            ]
          }
        }
    
        outputs = [ "$root_out_dir/lib.compressed/{{source_file_part}}" ]
    
        android_nm = "${android_tool_prefix}nm"
        android_strip = "${android_tool_prefix}strip"
    
        args = [
          "--objcopy",
          rebase_path(android_objcopy, root_build_dir),
          "--nm",
          rebase_path(android_nm, root_build_dir),
          "--strip",
          rebase_path(android_strip, root_build_dir),
          "--unstrippedsofile",
          "{{source_dir}}/lib.unstripped/{{source_file_part}}",
          "--output",
          "{{source_dir}}/lib.compressed/{{source_file_part}}",
        ]
      }
    }
    
    if (build_with_chromium && !is_component_build && is_android &&
        current_toolchain == default_toolchain) {
      # Package ANGLE libraries
      angle_apk("angle_chromium_apk") {
        package_name = "com.chromium.angle"
        apk_name = "AngleLibraries"
      }
    
      group("angle_apks") {
        deps = [ ":angle_chromium_apk" ]
      }
    }
    
    group("angle") {
      data_deps = [
        ":libEGL",
        ":libGLESv1_CM",
        ":libGLESv2",
      ]
    }