chromium/third_party/libxml/BUILD.gn

# Copyright 2013 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Define an "os_include" variable that points at the OS-specific generated
# headers.  These were generated by running the configure script offline.
if (is_linux || is_chromeos || is_android || is_nacl || is_fuchsia) {
  os_include = "linux"
} else if (is_apple) {
  os_include = "mac"
} else if (is_win) {
  os_include = "win32"
}

import("//third_party/libxml/libxml_visibility.gni")

config("libxml_config") {
  # Define LIBXML_STATIC as nothing to match how libxml.h (an internal header)
  # defines LIBXML_STATIC, otherwise we get the macro redefined warning from
  # GCC. ("defines" does "-DFOO" which defines the macro FOO as 1.)
  cflags = [ "-DLIBXML_STATIC=" ]

  include_dirs = [
    "src/include",
    "$os_include/include",
  ]
}

config("libxml_warnings") {
  if (is_win) {
    cflags_c = [
      "/wd4018",  # Signed/unsigned mismatch in comparison.
      "/wd4267",  # TODO(brucedawson): http://crbug.com/554200 fix C4267
      "/wd4311",  # and C4311 warnings.
    ]
  }
  if (is_clang) {
    cflags = [
      # libxml passes `const unsigned char*` through `const char*`.
      "-Wno-pointer-sign",

      # pattern.c and uri.c both have an intentional `for (...);` /
      # `while(...);` loop. I submitted a patch to move the `'` to its own
      # line, but until that's landed suppress the warning:
      "-Wno-empty-body",

      # debugXML.c compares array 'arg' to NULL.
      "-Wno-tautological-pointer-compare",

      # threads.c attempts to forward declare a pthread_equal which doesn't
      # match the prototype in pthreads.h
      "-Wno-ignored-attributes",

      # libxml casts from int to long to void*.
      "-Wno-int-to-void-pointer-cast",

      # libxml passes a volatile LPCRITICAL_SECTION* to a function expecting
      # a void* volatile*.
      "-Wno-incompatible-pointer-types",

      # trio_is_special_quantity and trio_is_negative are only
      # used with certain preprocessor defines set.
      "-Wno-unused-function",

      # Comparison between xmlElementType and xmlXPathTypeVal.
      # TODO(hans): See if we can fix upstream (http://crbug.com/763944).
      "-Wno-enum-compare",
    ]
  } else if (is_linux || is_chromeos) {
    cflags = [
      # gcc spits out a bunch of warnings about passing too many arguments to
      # __xmlSimpleError.
      "-Wno-format-extra-args",
    ]
  }
}

# Please keep in sync with //build/linux/unbundle/libxml.gn.
static_library("xml_reader") {
  # Do not expand this visibility list without first consulting with the
  # Security Team.
  visibility = [
    "//base/test:test_support",
    "//components/policy/core/common:unit_tests",
    "//services/data_decoder:*",
  ]
  if (is_win) {
    visibility += [ "//components/wifi" ]
  }
  sources = [
    "chromium/xml_reader.cc",
    "chromium/xml_reader.h",
  ]
  deps = [
    ":libxml",
    ":libxml_utils",
  ]
  configs += [ ":libxml_config" ]
}

# Please keep in sync with //build/linux/unbundle/libxml.gn.
static_library("xml_writer") {
  # The XmlWriter is considered safe to use from any target.
  visibility = [ "*" ]
  sources = [
    "chromium/xml_writer.cc",
    "chromium/xml_writer.h",
  ]
  deps = [
    ":libxml",
    ":libxml_utils",
  ]
  configs += [ ":libxml_config" ]
}

# Please keep in sync with //build/linux/unbundle/libxml.gn.
static_library("libxml_utils") {
  # Do not expand this visibility list without first consulting with the
  # Security Team.
  visibility = [
    ":xml_reader",
    ":xml_writer",
    "//base/test:test_support",
    "//services/data_decoder:lib",
    "//services/data_decoder:xml_parser_fuzzer_deps",
  ]
  sources = [
    "chromium/libxml_utils.cc",
    "chromium/libxml_utils.h",
  ]
  deps = [ ":libxml" ]
  public_deps = [ "//third_party/icu:icuuc" ]
  public_configs = [ ":libxml_config" ]
}

static_library("libxml") {
  # Do not expand this visibility list without first consulting with the
  # Security Team.
  visibility = [
    ":libxml_utils",
    ":xml_reader",
    ":xml_writer",
    "//chromecast/internal",
    "//testing/libfuzzer/*",
    "//third_party/blink/renderer/*",
    "//third_party/fontconfig",
    "//third_party/libxslt",
    "//third_party/maldoca/*",
  ]
  if (is_ios) {
    foreach(tgt, ios_libxml_visibility_additions) {
      visibility += [ "//ios_internal/$tgt" ]
    }
  }

  output_name = "libxml2"

  # Commented out sources are libxml2 files we do not want to include. They are
  # here to make it easy to identify files which are new.
  sources = [
    "src/HTMLparser.c",
    "src/HTMLtree.c",

    #"src/SAX.c",
    "src/SAX2.c",
    "src/buf.c",

    #"src/c14n.c",
    #"src/catalog.c",
    "src/chvalid.c",

    #"src/debugXML.c",
    "src/dict.c",
    "src/encoding.c",
    "src/entities.c",
    "src/error.c",
    "src/globals.c",
    "src/hash.c",
    "src/include/libxml/HTMLparser.h",
    "src/include/libxml/HTMLtree.h",
    "src/include/libxml/SAX.h",
    "src/include/libxml/SAX2.h",
    "src/include/libxml/c14n.h",
    "src/include/libxml/catalog.h",
    "src/include/libxml/chvalid.h",
    "src/include/libxml/debugXML.h",
    "src/include/libxml/dict.h",
    "src/include/libxml/encoding.h",
    "src/include/libxml/entities.h",
    "src/include/libxml/globals.h",
    "src/include/libxml/hash.h",
    "src/include/libxml/list.h",
    "src/include/libxml/nanoftp.h",
    "src/include/libxml/nanohttp.h",
    "src/include/libxml/parser.h",
    "src/include/libxml/parserInternals.h",
    "src/include/libxml/pattern.h",
    "src/include/libxml/relaxng.h",
    "src/include/libxml/schemasInternals.h",
    "src/include/libxml/schematron.h",
    "src/include/libxml/threads.h",
    "src/include/libxml/tree.h",
    "src/include/libxml/uri.h",
    "src/include/libxml/valid.h",
    "src/include/libxml/xinclude.h",
    "src/include/libxml/xlink.h",
    "src/include/libxml/xmlIO.h",
    "src/include/libxml/xmlautomata.h",
    "src/include/libxml/xmlerror.h",
    "src/include/libxml/xmlexports.h",
    "src/include/libxml/xmlmemory.h",
    "src/include/libxml/xmlmodule.h",
    "src/include/libxml/xmlreader.h",
    "src/include/libxml/xmlregexp.h",
    "src/include/libxml/xmlsave.h",
    "src/include/libxml/xmlschemas.h",
    "src/include/libxml/xmlschemastypes.h",
    "src/include/libxml/xmlstring.h",
    "src/include/libxml/xmlunicode.h",
    "src/include/libxml/xmlwriter.h",
    "src/include/libxml/xpath.h",
    "src/include/libxml/xpathInternals.h",
    "src/include/libxml/xpointer.h",

    #"src/legacy.c",
    "src/libxml.h",
    "src/list.c",
    "src/parser.c",
    "src/parserInternals.c",
    "src/pattern.c",

    #"src/relaxng.c",

    #"src/schematron.c",
    "src/threads.c",
    "src/timsort.h",
    "src/tree.c",

    "src/uri.c",
    "src/valid.c",

    #"src/xinclude.c",
    #"src/xlink.c",
    "src/xmlIO.c",
    "src/xmlmemory.c",

    #"src/xmlmodule.c",
    "src/xmlreader.c",

    #"src/xmlregexp.c",
    "src/xmlsave.c",

    #"src/xmlschemas.c",
    #"src/xmlschemastypes.c",
    "src/xmlstring.c",
    "src/xmlunicode.c",
    "src/xmlwriter.c",
    "src/xpath.c",

    #"src/xpointer.c",
    #"src/xzlib.c",
  ]

  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",

    # Must be after no_chromium_code for warning flags to be ordered correctly.
    ":libxml_warnings",
  ]

  if (is_linux || is_chromeos) {
    sources += [
      "linux/config.h",
      "linux/include/libxml/xmlversion.h",
    ]
  }

  if (is_mac) {
    sources += [
      "mac/config.h",
      "mac/include/libxml/xmlversion.h",
    ]
  }

  if (is_win) {
    sources += [
      "src/include/win32config.h",
      "src/include/wsockcompat.h",
      "win32/config.h",
      "win32/include/libxml/xmlversion.h",
    ]

    # libxml2 already defines WIN32_LEAN_AND_MEAN.
    configs -= [ "//build/config/win:lean_and_mean" ]
  }

  sources += [ "chromium/disabled_libxml_features.cc" ]

  public_configs = [ ":libxml_config" ]
  public_deps = [ "//third_party/icu:icuuc" ]
  deps = [ "//third_party/zlib" ]

  if (is_apple || is_android || is_fuchsia) {
    # http://www.xmlsoft.org/threads.html says that this is required when using
    # libxml from several threads, which can possibly happen in chrome. On
    # linux, this is picked up by transitivity from pkg-config output from
    # build/linux/system.gyp.
    defines = [ "_REENTRANT" ]
  }

  include_dirs = [ "$os_include" ]
}