author Mike Hommey <>
Wed, 01 Jun 2016 17:11:49 +0900
changeset 341055 b6db2e11244e06e2563e7444709060cd9ea90e9f
parent 130137 bd4704b3f8a2fd6d29019c563f09bddb11fc3d47
child 344050 a2e4369f86dcf620b453de3da6525a87ea1808fc
permissions -rw-r--r--
Bug 1277087 - Change how the buildconfig module searches for config.status. r=gps So far, we relied on the module being copied over in the virtualenv, and the module itself would try to find config.status in parent directories of its own location. Unfortunately, this falls short when the source tree's build/ directory appears early in the sys.path. With this change, we don't copy the module to the virtualenv anymore, and try to find config.status in parent directories of the python executable, which, when running from the virtualenv, will be equivalent to the current behavior.

# 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

import imp
import os
import sys

path = os.path.dirname(sys.executable)
while not os.path.exists(os.path.join(path, 'config.status')):
    parent = os.path.normpath(os.path.join(path, os.pardir))
    if parent == path:
        raise Exception("Can't find config.status")
    path = parent

path = os.path.join(path, 'config.status')
config = imp.load_module('_buildconfig', open(path), path, ('', 'r', imp.PY_SOURCE))

# Copy values from the config.status namespace into this module namespace.
# This effectively imports topsrcdir, topobjdir, defines, substs, files,
# headers and non_global_defines
for var in config.__all__:
    value = getattr(config, var)
    if isinstance(value, list) and value and isinstance(value[0], tuple):
        value = dict(value)
    setattr(sys.modules[__name__], var, value)

for var in os.environ:
    if var != 'SHELL' and var in substs:
        substs[var] = os.environ[var]