gecko-dev/build/moz.configure/pkg.configure
Gregory Szorc f818d2620e Bug 1411994 - Ignore Unicode errors when logging; r=glandium
LineIO currently attempts to convert bytes to unicode using the
system preferred encoding. This can obviously fail for some byte
sequences.

In many cases, the conversion is happening for purposes of logging.
In these cases, Unicode validation shouldn't be that important to
us.

So, this commit teaches LineIO to accept an argument defining its
Unicode error mode. We also teach relevant users of LineIO doing
logging to switch the default mode from "strict" to "replace" so
invalid Unicode byte sequences can be logged with the Unicode
replacement character.

During review, glandium pointed out that it may make better sense
to defer Unicode decoding to the logging layer instead of in LineIO.
I agree with this idea. But it can be implemented in another bug:
for now we should unbust the build system.

MozReview-Commit-ID: 7miuSDY8Xzv

--HG--
extra : rebase_source : 40d5d97d908d00b410b49d03729a34568e5bfb1a
2017-10-26 15:27:01 -07:00

103 lines
4.2 KiB
Python

# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
# vim: set filetype=python:
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
@depends('--enable-compile-environment')
def pkg_config(compile_env):
if compile_env:
return ('pkg-config',)
pkg_config = check_prog('PKG_CONFIG', pkg_config, allow_missing=True)
@depends_if(pkg_config)
@checking('for pkg-config version')
@imports('subprocess')
def pkg_config_version(pkg_config):
return Version(check_cmd_output(pkg_config, '--version').rstrip())
# Locates the given module using pkg-config.
# - `var` determines the name of variables to set when the package is found.
# <var>_CFLAGS and <var>_LIBS are set with corresponding values.
# - `package_desc` package name and version requirement string, list of
# strings describing packages to locate, or depends function that will
# resolve to such a string or list of strings.
# - `when` a depends function that will determine whether to perform
# any checks (default is to always perform checks).
# - `allow_missing` If set, failure to fulfill the package description
# will not result in an error or logged message, and any error message
# will be returned to the caller.
# Returns `True` when the package description is fulfilled.
@template
def pkg_check_modules(var, package_desc, when=always,
allow_missing=False):
if isinstance(package_desc, (tuple, list)):
package_desc = ' '.join(package_desc)
package_desc = dependable(package_desc)
@depends(when, '--enable-compile-environment')
def when_and_compile_environment(when, compile_environment):
return when and compile_environment
@depends(pkg_config, pkg_config_version,
when=when_and_compile_environment)
def check_pkg_config(pkg_config, version):
min_version = '0.9.0'
if pkg_config is None:
die("*** The pkg-config script could not be found. Make sure it is\n"
"*** in your path, or set the PKG_CONFIG environment variable\n"
"*** to the full path to pkg-config.")
if version < min_version:
die("*** Your version of pkg-config is too old. You need version %s or newer.",
min_version)
@depends(pkg_config, package_desc, when=when_and_compile_environment)
@imports('subprocess')
@imports('sys')
@imports(_from='mozbuild.configure.util', _import='LineIO')
def package(pkg_config, package_desc):
# package_desc may start as a depends function, so we can't use
# @checking here.
log.info("checking for %s... " % package_desc)
with log.queue_debug():
try:
subprocess.check_output([pkg_config, '--errors-to-stdout',
'--print-errors', package_desc])
log.info("yes")
return True
except subprocess.CalledProcessError as e:
log.info("no")
log_writer = log.warning if allow_missing else log.error
with LineIO(lambda l: log_writer(l), 'replace') as o:
o.write(e.output)
if not allow_missing:
sys.exit(1)
@depends(pkg_config, package_desc, when=package)
@checking('%s_CFLAGS' % var, callback=lambda t: ' '.join(t))
def pkg_cflags(pkg_config, package_desc):
flags = check_cmd_output(pkg_config, '--cflags', package_desc)
return tuple(flags.split())
@depends(pkg_config, package_desc, when=package)
@checking('%s_LIBS' % var, callback=lambda t: ' '.join(t))
def pkg_libs(pkg_config, package_desc):
libs = check_cmd_output(pkg_config, '--libs', package_desc)
# Remove evil flags like -Wl,--export-dynamic
return tuple(libs.replace('-Wl,--export-dynamic', '').split())
@depends(pkg_cflags, pkg_libs, when=package)
def pkg_info(cflags, libs):
return namespace(cflags=cflags, libs=libs)
set_config('%s_CFLAGS' % var, pkg_cflags)
set_config('%s_LIBS' % var, pkg_libs)
return pkg_info