moz.configure
author Mike Hommey <mh+mozilla@glandium.org>
Tue, 22 Mar 2016 14:21:32 +0900
changeset 290138 9d2b6f4c3ee8366365c16cee6cbda90c4688c743
parent 289902 43d66eea833b04be65a145051c708dd5c6587a80
child 290139 62ae3968b2d82f17ec2853714ab565c02a7cb9bc
permissions -rw-r--r--
Bug 1257823 - Move set_config() to the global scope. r=nalexander The way set_config is set currently makes it difficult to introspect moz.configure files to know what configuration items are being set, because they're hidden in the control flow of functions. This makes some of the moz.configure more convoluted, but this is why there are templates, and we can improve the recurring cases afterwards.

# -*- 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')
include('build/moz.configure/checks.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:
        set_define('E10S_TESTING_ONLY', True)
        return True

set_config('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:
        imply_option('--disable-compile-environment')
        return True

set_config('MOZ_ARTIFACT_BUILDS', artifact_builds)


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

@depends('--disable-compile-environment')
def compile_environment(value):
    if value:
        add_old_configure_assignment('COMPILE_ENVIRONMENT', True)
        return True

set_config('COMPILE_ENVIRONMENT', compile_environment)


@depends('--help')
@advanced
def build_backends_choices(help):
    from mozbuild.backend import backends
    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):
    add_old_configure_assignment('AWK', value)


# 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):
    add_old_configure_assignment('PERL', value)

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

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

    @depends(perl)
    @checking('for full perl installation')
    @advanced
    def has_full_perl_installation(perl):
        import subprocess
        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:
            error('Cannot find Config.pm or $Config{archlib}. '
                  'A full perl installation is required.')

perl_version_check('5.006')


# yasm detection
# ==============================================================
yasm = check_prog('YASM', ['yasm'], allow_missing=True)

@depends(yasm)
@checking('yasm version')
@advanced
def yasm_version(yasm):
    if yasm:
        import subprocess
        try:
            version = Version(subprocess.check_output(
                [yasm, '--version']
            ).splitlines()[0].split()[1])
            # Until we move all the yasm consumers out of old-configure.
            # bug 1257904
            add_old_configure_assignment('_YASM_MAJOR_VERSION', version.major)
            add_old_configure_assignment('_YASM_MINOR_VERSION', version.minor)
            return version
        except subprocess.CalledProcessError as e:
            error('Failed to get yasm version: %s' % e.message)

@depends(yasm, target)
def yasm_asflags(yasm, target):
    if yasm:
        asflags = {
            ('OSX', 'x86'): '-f macho32',
            ('OSX', 'x86_64'): '-f macho64',
            ('WINNT', 'x86'): '-f win32',
            ('WINNT', 'x86_64'): '-f x64',
        }.get((target.os, target.cpu), None)
        if asflags is None:
            # We're assuming every x86 platform we support that's
            # not Windows or Mac is ELF.
            if target.cpu == 'x86':
                asflags = '-f elf32'
            elif target.cpu == 'x86_64':
                asflags = '-f elf64'
        if asflags:
            asflags += ' -rnasm -pnasm'
            # Until the YASM variable is not necessary in old-configure.
            add_old_configure_assignment('YASM', True)
        return asflags

set_config('YASM_ASFLAGS', yasm_asflags)

@depends(yasm_asflags)
def have_yasm(value):
    if value:
        return True

set_config('HAVE_YASM', have_yasm)


# Miscellaneous programs
# ==============================================================
check_prog('DOXYGEN', ('doxygen',), allow_missing=True)
check_prog('TAR', ('gnutar', 'gtar', 'tar'))
check_prog('UNZIP', ('unzip',))
check_prog('XARGS', ('xargs',))
check_prog('ZIP', ('zip',))

@depends(target)
def mac_programs(target):
    if target.kernel == 'Darwin':
        check_prog('DSYMUTIL', ('dsymutil', 'llvm-dsymutil'), allow_missing=True)
        check_prog('GENISOIMAGE', ('genisoimage',), allow_missing=True)

@depends(target)
def linux_programs(target):
    if target.os == 'GNU' and target.kernel == 'Linux':
        check_prog('RPMBUILD', ('rpmbuild',), allow_missing=True)


# Fallthrough to autoconf-based configure
include('build/moz.configure/old.configure')