blob: a05cfb6deeea3fe66afa90ff18c6a9d7e34f521d [file] [log] [blame]
# Copyright 2015 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.
import("//build/config/sanitizers/sanitizers.gni")
import("//build/toolchain/goma.gni")
declare_args() {
# The platform on which the instrumented libraries are being built.
instrumented_libraries_platform = "trusty"
}
group("deps") {
if (use_prebuilt_instrumented_libraries) {
assert(prebuilt_instrumented_libraries_available,
"Prebuilt instrumented libraries are only available when " +
"is_msan = true and msan_track_origins = {0, 2}")
deps = [
":prebuilt",
]
data_deps = [
":prebuilt",
]
}
if (use_locally_built_instrumented_libraries) {
deps = [
":locally_built",
]
}
}
if (is_msan) {
sanitizer_type = "msan"
} else if (is_asan) {
sanitizer_type = "asan"
} else if (is_tsan) {
sanitizer_type = "tsan"
}
if (prebuilt_instrumented_libraries_available) {
group("prebuilt") {
visibility = [ ":deps" ]
deps = [
":extract_prebuilt_instrumented_libraries",
]
data_deps = [
":extract_prebuilt_instrumented_libraries",
]
}
if (is_msan) {
if (msan_track_origins == 0) {
archive_prefix = "msan-no-origins"
} else if (msan_track_origins == 2) {
archive_prefix = "msan-chained-origins"
}
}
# TODO(GYP): scripts/download_binaries.py uses GYP_DEFINES to decide whether
# to download the archives extracted here.
# Note: This requires a clobber whenever Ubuntu version changes.
action("extract_prebuilt_instrumented_libraries") {
visibility = [ ":prebuilt" ]
script = "scripts/unpack_binaries.py"
depfile = "$target_out_dir/$archive_prefix.d"
args = [
archive_prefix,
rebase_path("binaries", root_build_dir),
rebase_path(root_out_dir + "/instrumented_libraries_prebuilt",
root_build_dir),
rebase_path(target_out_dir, root_out_dir),
]
outputs = [
"$target_out_dir/$archive_prefix.txt",
]
data = [
"$root_out_dir/instrumented_libraries_prebuilt/",
]
}
config("prebuilt_ldflags") {
ldflags = [
# Add a relative RPATH entry to Chromium binaries. This puts instrumented
# DSOs before system-installed versions in library search path.
"-Wl,-R,\$ORIGIN/instrumented_libraries_prebuilt/$sanitizer_type/lib",
"-Wl,-z,origin",
# Add some padding to allow RPATHs to be modified later.
"-Wl,-R,________________________________________________________________PADDING________________________________________________________________"
]
}
}
if (use_locally_built_instrumented_libraries) {
assert(instrumented_libraries_platform == "trusty",
"Currently, the only supported platform is Trusty.")
group("locally_built") {
visibility = [ ":deps" ]
deps = [
":atk1.0",
":brltty",
":dee",
":freetype",
":harfbuzz",
":libappindicator3-1",
":libasound2",
":libatk-bridge2.0-0",
":libatspi2.0-0",
":libcairo2",
":libcap2",
":libcredentialkit_pkcs11",
":libdbus-1-3",
":libdbus-glib-1-2",
":libdbusmenu",
":libdbusmenu-glib4",
":libexpat1",
":libffi6",
":libfontconfig1",
":libgcrypt11",
":libgdk-pixbuf2.0-0",
":libglib2.0-0",
":libgnome-keyring0",
":libgpg-error0",
":libgtk-3-0",
":libgtk2.0-0",
":libido3-0.1-0",
":libindicator3-7",
":libnspr4",
":libp11-kit0",
":libpci3",
":libpcre3",
":libpixman-1-0",
":libsecret",
":libtasn1-6",
":libunity9",
":libva1",
":libx11-6",
":libxau6",
":libxcb1",
":libxcomposite1",
":libxcursor1",
":libxdamage1",
":libxdmcp6",
":libxext6",
":libxfixes3",
":libxi6",
":libxinerama1",
":libxrandr2",
":libxrender1",
":libxss1",
":libxtst6",
":nss",
":pango1.0",
":pulseaudio",
":udev",
":zlib1g",
]
if (is_msan) {
deps += [
":libcups2",
":libgnutls26",
]
}
if (!is_tsan) {
deps += [ ":libpng12-0" ]
}
data = [
"${root_out_dir}/instrumented_libraries/${sanitizer_type}/lib",
]
}
config("locally_built_ldflags") {
ldflags = [
# Add a relative RPATH entry to Chromium binaries. This puts instrumented
# DSOs before system-installed versions in library search path.
"-Wl,-R,\$ORIGIN/instrumented_libraries/${sanitizer_type}/lib",
"-Wl,-z,origin",
# Add some padding to allow RPATHs to be modified later.
"-Wl,-R,________________________________________________________________PADDING________________________________________________________________"
]
}
template("instrumented_library") {
action(target_name) {
script = "scripts/download_build_install.py"
build_method = "destdir"
if (defined(invoker.build_method)) {
build_method = invoker.build_method
}
cc = rebase_path("//third_party/llvm-build/Release+Asserts/bin/clang")
cxx = rebase_path("//third_party/llvm-build/Release+Asserts/bin/clang++")
if (use_goma) {
cc = "${goma_dir}/gomacc ${cc}"
cxx = "${goma_dir}/gomacc ${cxx}"
}
package_cflags = [
"-O2",
"-gline-tables-only",
"-fPIC",
"-w",
"-U_FORITFY_SOURCE",
"-fno-omit-frame-pointer",
]
package_ldflags = []
if (is_asan) {
package_cflags += [ "-fsanitize=address" ]
package_ldflags = [ "-fsanitize=address" ]
} else if (is_msan) {
package_cflags += [
"-fsanitize=memory",
"-fsanitize-memory-track-origins=${msan_track_origins}",
]
package_ldflags = [ "-fsanitize=memory" ]
} else if (is_tsan) {
package_cflags += [ "-fsanitize=thread" ]
package_ldflags = [ "-fsanitize=thread" ]
}
if (defined(invoker.package_cflags)) {
package_cflags += invoker.package_cflags
}
if (defined(invoker.package_ldflags)) {
package_ldflags += invoker.package_ldflags
}
if (defined(invoker.deps)) {
deps = invoker.deps
}
product_dir = rebase_path(root_out_dir)
intermediate_dir = rebase_path(target_gen_dir)
args = [
"--build-method=${build_method}",
"--cc=${cc}",
"--cxx=${cxx}",
"--intermediate-dir=${intermediate_dir}",
"--libdir=lib",
"--package=${target_name}",
"--product-dir=${product_dir}",
"--cflags=${package_cflags}",
"--ldflags=${package_ldflags}",
"--sanitizer=${sanitizer_type}",
]
outputs = [
"${root_out_dir}/instrumented_libraries/${sanitizer_type}/${target_name}.txt",
]
inputs = []
if (defined(invoker.pre_build)) {
inputs += [ invoker.pre_build ]
args += [ "--pre-build=${invoker.pre_build}" ]
}
if (defined(invoker.patch)) {
inputs += [ invoker.patch ]
args += [ "--patch=${invoker.patch}" ]
}
if (defined(invoker.asan_blacklist)) {
if (is_asan) {
inputs += [ invoker.asan_blacklist ]
args += [ "--sanitizer-blacklist=${invoker.asan_blacklist}" ]
} else {
assert(invoker.asan_blacklist != "", "")
}
}
if (defined(invoker.msan_blacklist)) {
if (is_msan) {
inputs += [ invoker.msan_blacklist ]
args += [ "--sanitizer-blacklist=${invoker.msan_blacklist}" ]
} else {
assert(invoker.msan_blacklist != "", "")
}
}
if (defined(invoker.extra_configure_flags)) {
args += [ "--extra-configure-flags=${invoker.extra_configure_flags}" ]
}
}
}
instrumented_library("atk1.0") {
extra_configure_flags = [
"--disable-static",
# See above.
"--disable-introspection",
]
}
instrumented_library("brltty") {
extra_configure_flags = [
"--disable-static",
# From debian/rules.
"--without-viavoice",
"--without-theta",
"--without-swift",
"--bindir=/sbin",
"--with-curses=ncursesw",
"--disable-stripping",
# We don't need any of those.
"--disable-java-bindings",
"--disable-lisp-bindings",
"--disable-ocaml-bindings",
"--disable-python-bindings",
"--disable-tcl-bindings",
]
}
instrumented_library("dee") {
extra_configure_flags = [
"--disable-static",
# See above.
"--disable-introspection",
]
pre_build = "scripts/pre-build/autogen.sh"
}
instrumented_library("freetype") {
pre_build = "scripts/pre-build/freetype.sh"
extra_configure_flags = [ "--disable-static" ]
}
instrumented_library("harfbuzz") {
package_cflags = [ "-Wno-c++11-narrowing" ]
extra_configure_flags = [
"--disable-static",
# From debian/rules.
"--with-graphite2=yes",
"--with-gobject",
# See above.
"--disable-introspection",
]
}
instrumented_library("libappindicator3-1") {
extra_configure_flags = [
"--disable-static",
# See above.
"--disable-introspection",
"--with-gtk=3",
]
pre_build = "scripts/pre-build/autogen.sh"
}
instrumented_library("libasound2") {
extra_configure_flags = [ "--disable-static" ]
pre_build = "scripts/pre-build/libasound2.sh"
}
instrumented_library("libatk-bridge2.0-0") {
extra_configure_flags = [ "--disable-static" ]
}
instrumented_library("libatspi2.0-0") {
extra_configure_flags = [
"--disable-static",
"--disable-introspection",
]
}
instrumented_library("libcairo2") {
extra_configure_flags = [
"--disable-gtk-doc",
"--disable-static",
]
}
instrumented_library("libcap2") {
extra_configure_flags = [ "--disable-static" ]
build_method = "custom_libcap"
}
instrumented_library("libcredentialkit_pkcs11") {
build_method = "stub"
}
instrumented_library("libcups2") {
patch = "patches/libcups2.diff"
extra_configure_flags = [
"--disable-static",
# All from debian/rules.
"--localedir=/usr/share/cups/locale",
"--enable-slp",
"--enable-libpaper",
"--enable-ssl",
"--enable-gnutls",
"--disable-openssl",
"--enable-threads",
"--enable-debug",
"--enable-dbus",
"--with-dbusdir=/etc/dbus-1",
"--enable-gssapi",
"--enable-avahi",
"--with-pdftops=/usr/bin/gs",
"--disable-launchd",
"--with-cups-group=lp",
"--with-system-groups=lpadmin",
"--with-printcap=/var/run/cups/printcap",
"--with-log-file-perm=0640",
"--with-local_protocols=\"CUPS dnssd\"",
"--with-remote_protocols=\"CUPS dnssd\"",
"--enable-libusb",
]
pre_build = "scripts/pre-build/libcups2.sh"
}
instrumented_library("libdbus-1-3") {
extra_configure_flags = [
"--disable-static",
# From debian/rules.
"--disable-libaudit",
"--enable-apparmor",
"--enable-systemd",
"--libexecdir=/lib/dbus-1.0",
"--with-systemdsystemunitdir=/lib/systemd/system",
"--disable-tests",
"--exec-prefix=/",
# From dh_auto_configure.
"--prefix=/usr",
"--localstatedir=/var",
]
}
instrumented_library("libdbus-glib-1-2") {
extra_configure_flags = [
# Use system dbus-binding-tool. The just-built one is instrumented but
# doesn't have the correct RPATH, and will crash.
"--with-dbus-binding-tool=dbus-binding-tool",
"--disable-static",
]
}
instrumented_library("libdbusmenu") {
extra_configure_flags = [
"--disable-static",
# From debian/rules.
"--disable-scrollkeeper",
"--with-gtk=2",
# See above.
"--disable-introspection",
"--disable-vala",
]
pre_build = "scripts/pre-build/autogen.sh"
}
instrumented_library("libdbusmenu-glib4") {
extra_configure_flags = [
"--disable-static",
# From debian/rules.
"--disable-scrollkeeper",
"--enable-gtk-doc",
# --enable-introspection introduces a build step that attempts to run
# a just-built binary and crashes. Vala requires introspection.
# TODO(eugenis): find a better fix.
"--disable-introspection",
"--disable-vala",
]
pre_build = "scripts/pre-build/autogen.sh"
}
instrumented_library("libexpat1") {
extra_configure_flags = [ "--disable-static" ]
}
instrumented_library("libffi6") {
extra_configure_flags = [ "--disable-static" ]
}
instrumented_library("libfontconfig1") {
extra_configure_flags = [
"--disable-docs",
"--sysconfdir=/etc/",
"--disable-static",
# From debian/rules.
"--with-add-fonts=/usr/X11R6/lib/X11/fonts,/usr/local/share/fonts",
]
patch = "patches/libfontconfig.${instrumented_libraries_platform}.diff"
}
instrumented_library("libgcrypt11") {
package_ldflags = [ "-Wl,-z,muldefs" ]
extra_configure_flags = [
# From debian/rules.
"--enable-noexecstack",
"--enable-ld-version-script",
"--disable-static",
# http://crbug.com/344505
"--disable-asm",
]
}
instrumented_library("libgdk-pixbuf2.0-0") {
extra_configure_flags = [
"--disable-static",
# From debian/rules.
"--with-libjasper",
"--with-x11",
# Make the build less problematic.
"--disable-introspection",
# Do not use loadable modules. Same as with Pango, there's no easy way
# to make gdk-pixbuf pick instrumented versions over system-installed
# ones.
"--disable-modules",
]
pre_build = "scripts/pre-build/libgdk-pixbuf2.0-0.sh"
}
instrumented_library("libglib2.0-0") {
extra_configure_flags = [
"--disable-gtk-doc",
"--disable-gtk-doc-html",
"--disable-gtk-doc-pdf",
"--disable-static",
]
asan_blacklist = "blacklists/asan/libglib2.0-0.txt"
msan_blacklist = "blacklists/msan/libglib2.0-0.txt"
pre_build = "scripts/pre-build/autogen.sh"
}
instrumented_library("libgnome-keyring0") {
extra_configure_flags = [
"--disable-static",
"--enable-tests=no",
# Make the build less problematic.
"--disable-introspection",
]
package_ldflags = [ "-Wl,--as-needed" ]
}
instrumented_library("libgnutls26") {
extra_configure_flags = [
# from debian/rules.
"--enable-ld-version-script",
"--enable-cxx",
"--without-lzo",
"--disable-guile",
"--with-libgcrypt",
"--with-packager=Debian",
]
}
instrumented_library("libgpg-error0") {
extra_configure_flags = [ "--disable-static" ]
}
instrumented_library("libgtk2.0-0") {
package_cflags = [ "-Wno-return-type" ]
extra_configure_flags = [
"--disable-static",
# From debian/rules.
"--prefix=/usr",
"--sysconfdir=/etc",
"--enable-test-print-backend",
"--enable-introspection=no",
"--with-xinput=yes",
]
patch = "patches/libgtk2.0-0.${instrumented_libraries_platform}.diff"
pre_build = "scripts/pre-build/libgtk2.0-0.sh"
}
instrumented_library("libgtk-3-0") {
package_cflags = [ "-Wno-return-type" ]
extra_configure_flags = [
"--disable-static",
"--disable-introspection",
# From debian/rules.
"--enable-test-print-backend",
"--enable-x11-backend",
]
pre_build = "scripts/pre-build/libgtk-3-0.sh"
}
instrumented_library("libido3-0.1-0") {
package_cflags = [ "-Wno-return-type" ]
extra_configure_flags = [
"--disable-static",
# See above.
"--disable-introspection",
"--with-gtk=3",
]
pre_build = "scripts/pre-build/autogen.sh"
}
instrumented_library("libindicator3-7") {
extra_configure_flags = [
"--disable-static",
# See above.
"--disable-introspection",
]
pre_build = "scripts/pre-build/autogen.sh"
}
instrumented_library("libnspr4") {
extra_configure_flags = [
"--enable-64bit",
"--disable-static",
# TSan reports data races on debug variables.
"--disable-debug",
]
pre_build = "scripts/pre-build/libnspr4.sh"
}
instrumented_library("libp11-kit0") {
extra_configure_flags = [ "--disable-static" ]
# Required on Trusty due to autoconf version mismatch.
pre_build = "scripts/pre-build/autoreconf.sh"
}
instrumented_library("libpci3") {
extra_configure_flags = [ "--disable-static" ]
build_method = "custom_libpci3"
}
instrumented_library("libpcre3") {
extra_configure_flags = [
"--enable-utf8",
"--enable-unicode-properties",
"--disable-static",
]
}
instrumented_library("libpixman-1-0") {
extra_configure_flags = [
"--disable-static",
# From debian/rules.
"--disable-gtk",
"--disable-silent-rules",
# Avoid a clang issue. http://crbug.com/449183
"--disable-mmx",
]
patch = "patches/libpixman-1-0.diff"
}
instrumented_library("libpng12-0") {
extra_configure_flags = [ "--disable-static" ]
}
instrumented_library("libsecret") {
extra_configure_flags = [
"--disable-static",
# See above.
"--disable-introspection",
]
pre_build = "scripts/pre-build/autoreconf.sh"
}
instrumented_library("libtasn1-3") {
extra_configure_flags = [
"--disable-static",
# From debian/rules.
"--enable-ld-version-script",
]
}
instrumented_library("libtasn1-6") {
extra_configure_flags = [
"--disable-static",
# From debian/rules.
"--enable-ld-version-script",
]
}
instrumented_library("libunity9") {
extra_configure_flags = [ "--disable-static" ]
pre_build = "scripts/pre-build/autogen.sh"
}
instrumented_library("libva1") {
extra_configure_flags = [ "--disable-static" ]
# Backport a use-after-free fix:
# http://cgit.freedesktop.org/libva/diff/va/va.c?h=staging&id=d4988142a3f2256e38c5c5cdcdfc1b4f5f3c1ea9
patch = "patches/libva1.diff"
pre_build = "scripts/pre-build/libva1.sh"
}
instrumented_library("libx11-6") {
extra_configure_flags = [
"--disable-specs",
"--disable-static",
]
msan_blacklist = "blacklists/msan/libx11-6.txt"
# Required on Trusty due to autoconf version mismatch.
pre_build = "scripts/pre-build/autoreconf.sh"
}
instrumented_library("libxau6") {
extra_configure_flags = [ "--disable-static" ]
}
instrumented_library("libxcb1") {
extra_configure_flags = [
"--disable-build-docs",
"--disable-static",
]
pre_build = "scripts/pre-build/autoreconf.sh"
}
instrumented_library("libxcomposite1") {
extra_configure_flags = [ "--disable-static" ]
}
instrumented_library("libxcursor1") {
extra_configure_flags = [ "--disable-static" ]
}
instrumented_library("libxdamage1") {
extra_configure_flags = [ "--disable-static" ]
}
instrumented_library("libxdmcp6") {
extra_configure_flags = [
"--disable-docs",
"--disable-static",
]
}
instrumented_library("libxext6") {
extra_configure_flags = [
"--disable-specs",
"--disable-static",
]
}
instrumented_library("libxfixes3") {
extra_configure_flags = [ "--disable-static" ]
}
instrumented_library("libxi6") {
extra_configure_flags = [
"--disable-specs",
"--disable-docs",
"--disable-static",
]
}
instrumented_library("libxinerama1") {
extra_configure_flags = [ "--disable-static" ]
}
instrumented_library("libxrandr2") {
extra_configure_flags = [ "--disable-static" ]
}
instrumented_library("libxrender1") {
extra_configure_flags = [ "--disable-static" ]
}
instrumented_library("libxss1") {
extra_configure_flags = [ "--disable-static" ]
}
instrumented_library("libxtst6") {
extra_configure_flags = [
"--disable-specs",
"--disable-static",
]
}
instrumented_library("nss") {
# TODO(eugenis): get rid of this dependency
deps = [
":libnspr4",
]
patch = "patches/nss.diff"
build_method = "custom_nss"
}
instrumented_library("pango1.0") {
extra_configure_flags = [
"--disable-static",
# Avoid https://bugs.gentoo.org/show_bug.cgi?id=425620
"--enable-introspection=no",
# Pango is normally used with dynamically loaded modules. However,
# ensuring pango is able to find instrumented versions of those modules
# is a huge pain in the neck. Let's link them statically instead, and
# hope for the best.
"--with-included-modules=yes",
]
}
instrumented_library("pulseaudio") {
# New location of libpulsecommon.
package_ldflags = [ "-Wl,-R,XORIGIN/pulseaudio/." ]
extra_configure_flags = [
"--disable-static",
# From debian/rules.
"--enable-x11",
"--disable-hal-compat",
# Disable some ARM-related code that fails compilation. No idea why
# this even impacts x86-64 builds.
"--disable-neon-opt",
]
pre_build = "scripts/pre-build/pulseaudio.sh"
}
instrumented_library("udev") {
extra_configure_flags = [
"--disable-static",
# Without this flag there's a linking step that doesn't honor LDFLAGS
# and fails.
# TODO(eugenis): find a better fix.
"--disable-gudev",
]
pre_build = "scripts/pre-build/udev.sh"
}
instrumented_library("zlib1g") {
# --disable-static is not supported
patch = "patches/zlib1g.diff"
}
}