author Gregory Szorc <>
Tue, 29 Oct 2013 14:53:52 -0700
changeset 152698 9d0bf12c1d1d151ce23eee3a4a000bba4f276945
parent 150500 c1c61b305ce0b58450ec0092457f98cd7119d4ee
child 162885 faafb9526e32b28f3b4647845442a3d3971183ec
permissions -rwxr-xr-x
Bug 877308 - Change when build backend update check it performed; r=glandium Before, we checked if config.status was stale in any entrant Makefile (top level or child directory). This had undesirable side-effects for partial tree builds, notably that if the build backend was out of date, the current Makefile was invalidated. With this patch, we only regenerate the build config automatically in full/toplevel builds. If an outdated build config is detected on partial tree builds, we error. The impact of this is mitigated by having mach build automatically ensure the build config is current.

#!/usr/bin/env 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

from __future__ import print_function, unicode_literals

import os
import sys

def ancestors(path):
    while path:
        yield path
        (path, child) = os.path.split(path)
        if child == "":

def load_mach(topsrcdir):
    sys.path[0:0] = [os.path.join(topsrcdir, "build")]
    import mach_bootstrap
    return mach_bootstrap.bootstrap(topsrcdir)

def main(args):
    # Check whether the current directory is within a mach src or obj dir.
    for dir_path in ancestors(os.getcwd()):
        # If we find a "mozinfo.json" file, we are in the objdir.
        mozinfo_path = os.path.join(dir_path, 'mozinfo.json')
        if os.path.isfile(mozinfo_path):
            import json
            info = json.load(open(mozinfo_path))
            if 'mozconfig' in info and 'MOZCONFIG' not in os.environ:
                # If the MOZCONFIG environment variable is not already set, set it
                # to the value from mozinfo.json.  This will tell the build system
                # to look for a config file at the path in $MOZCONFIG rather than
                # its default locations.
                # Note: subprocess requires native strings in os.environ on Windows
                os.environ[b'MOZCONFIG'] = str(info['mozconfig'])

            if 'topsrcdir' in info:
                # Continue searching for mach_bootstrap in the source directory.
                dir_path = info['topsrcdir']

        # If we find the mach bootstrap module, we are in the srcdir.
        mach_path = os.path.join(dir_path, 'build/')
        if os.path.isfile(mach_path):
            mach = load_mach(dir_path)

    print('Could not run mach: No mach source directory found.')

if __name__ == '__main__':