moz.configure
author Dustin J. Mitchell <dustin@mozilla.com>
Mon, 16 May 2016 17:44:24 +0000
changeset 367419 f1c435dedcc22700942f5dbbf457ce2654bc42a7
parent 354262 1e5e34826bd992c37b8bdebbd2c598d2d0fd9629
child 354787 3f5d168ebdecd7fb9e7f05c56dee29fe4d6e1a35
child 355960 991d9520212e39e6d818c7885f30a6d0a8e0e6dc
child 357443 b997ea7fb009854861c1bbfa07f9e08357f4f607
child 357446 a2cafaccafb1e048edcd9acbceee2c9d559ce9fc
child 363166 25cf595b0fe20f3293c13cf51f978c1924d34aa6
child 364150 3b61788f62e4eae7709ff134b950bd107bb1a3ab
child 365480 ee3ae56d91f1396c4041c17d76a704b127d3a0f6
child 366571 08d3098a9b7b74d964e8ba52507f73cbd711512a
permissions -rw-r--r--
Bug 1258497: wrap mach Commands in try/except; r?gps MozReview-Commit-ID: FTPDTjw4gR

# -*- Mode: python; c-basic-offset: 4; 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/.

include('build/moz.configure/init.configure')

# Note:
# - Gecko-specific options and rules should go in toolkit/moz.configure.
# - Firefox-specific options and rules should go in browser/moz.configure.
# - Fennec-specific options and rules should go in
#   mobile/android/moz.configure.
# - Spidermonkey-specific options and rules should go in js/moz.configure.
# - etc.

# Multiprocess Firefox Testing UI - Nightly and Aurora
# To be removed in Bug 1003313
@depends(milestone)
def e10s_testing_only(milestone):
    if not milestone.is_release:
        return True

set_config('E10S_TESTING_ONLY', e10s_testing_only)
set_define('E10S_TESTING_ONLY', e10s_testing_only)


option('--enable-artifact-builds', env='MOZ_ARTIFACT_BUILDS',
       help='Download and use prebuilt binary artifacts.')

@depends('--enable-artifact-builds')
def artifact_builds(value):
    if value:
        return True

set_config('MOZ_ARTIFACT_BUILDS', artifact_builds)

@depends('--enable-artifact-builds')
def imply_disable_compile_environment(value):
    if value:
        return False

imply_option('--enable-compile-environment', imply_disable_compile_environment)

option('--disable-compile-environment',
       help='Disable compiler/library checks')

@depends('--disable-compile-environment')
def compile_environment(compile_env):
    if compile_env:
        return True

set_config('COMPILE_ENVIRONMENT', compile_environment)
add_old_configure_assignment('COMPILE_ENVIRONMENT', compile_environment)

@depends('--disable-compile-environment', '--help')
def toolchain_include(compile_env, help):
    if compile_env:
        return 'build/moz.configure/toolchain.configure'

include(toolchain_include)

@depends('--disable-compile-environment', '--help')
def memory_include(compile_env, help):
    if compile_env:
        return 'build/moz.configure/memory.configure'

include(memory_include)


@depends('--help')
@imports(_from='mozbuild.backend', _import='backends')
def build_backends_choices(help):
    return tuple(backends)


option('--enable-build-backend', nargs='+', choices=build_backends_choices,
       help='Enable additional build backends')

@depends('--enable-build-backend', '--enable-artifact-builds')
def build_backend(backends, artifact_builds):
    if artifact_builds:
        all_backends = ['FasterMake+RecursiveMake']
    else:
        all_backends = ['RecursiveMake', 'FasterMake']
    all_backends.extend(backends)
    return unique_list(all_backends)

set_config('BUILD_BACKENDS', build_backend)


# Awk detection
# ==============================================================
awk = check_prog('AWK', ('gawk', 'mawk', 'nawk', 'awk'))

# Until the AWK variable is not necessary in old-configure
@depends(awk)
def awk_for_old_configure(value):
    return value

add_old_configure_assignment('AWK', awk_for_old_configure)


# Perl detection
# ==============================================================
perl = check_prog('PERL', ('perl5', 'perl'))

# Until the PERL variable is not necessary in old-configure
@depends(perl)
def perl_for_old_configure(value):
    return value

add_old_configure_assignment('PERL', perl_for_old_configure)

@template
def perl_version_check(min_version):
    @depends(perl)
    @checking('for minimum required perl version >= %s' % min_version)
    @imports('subprocess')
    def get_perl_version(perl):
        try:
            return Version(subprocess.check_output([perl, '-e', 'print $]']))
        except subprocess.CalledProcessError as e:
            die('Failed to get perl version: %s', e.message)

    @depends(get_perl_version)
    def check_perl_version(version):
        if version < min_version:
            die('Perl %s or higher is required.', min_version)

    @depends(perl)
    @checking('for full perl installation')
    @imports('subprocess')
    def has_full_perl_installation(perl):
        ret = subprocess.call(
            [perl, '-e', 'use Config; exit(!-d $Config{archlib})'])
        return ret == 0

    @depends(has_full_perl_installation)
    def require_full_perl_installation(has_full_perl_installation):
        if not has_full_perl_installation:
            die('Cannot find Config.pm or $Config{archlib}. '
                'A full perl installation is required.')

perl_version_check('5.006')


# Miscellaneous programs
# ==============================================================
check_prog('DOXYGEN', ('doxygen',), allow_missing=True)
check_prog('XARGS', ('xargs',))

@depends(target)
def extra_programs(target):
    if target.kernel == 'Darwin':
        return namespace(
            DSYMUTIL=('dsymutil', 'llvm-dsymutil'),
            GENISOIMAGE=('genisoimage',),
        )
    if target.os == 'GNU' and target.kernel == 'Linux':
        return namespace(RPMBUILD=('rpmbuild',))

check_prog('DSYMUTIL', delayed_getattr(extra_programs, 'DSYMUTIL'),
           allow_missing=True)
check_prog('GENISOIMAGE', delayed_getattr(extra_programs, 'GENISOIMAGE'),
           allow_missing=True)
check_prog('RPMBUILD', delayed_getattr(extra_programs, 'RPMBUILD'),
           allow_missing=True)


# Fallthrough to autoconf-based configure
include('build/moz.configure/old.configure')
# Please do not add anything after the include of old.configure.