moz.configure
author Mike Hommey <mh+mozilla@glandium.org>
Tue, 22 Mar 2016 08:26:57 +0900
changeset 327595 22fcb50e9842f1ccd229e689e106e038afafd546
parent 327505 d5efe76a40b3e7d22a85e738b11cd1e567c1de16
child 327812 0f1ddce63248c64f491f1bee530f1cb538aa44e0
permissions -rw-r--r--
Backout changesets f5090987b7c6, 48a94777837d and a63437a74f7a (bug 1257468) for SM bustage on a CLOSED TREE

# -*- 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_config('E10S_TESTING_ONLY', '1')
        set_define('E10S_TESTING_ONLY', '1')


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')
        set_config('MOZ_ARTIFACT_BUILDS', '1')
    return bool(value)


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

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


@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)
    set_config('BUILD_BACKENDS', unique_list(all_backends))


# 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'
            set_config('YASM_ASFLAGS', asflags)
            set_config('HAVE_YASM', '1')
            # Until the YASM variable is not necessary in old-configure.
            add_old_configure_assignment('YASM', '1')
        return asflags

# 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')