123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 |
- # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
- # 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.
- 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)
- imply_option('--enable-artifact-build-symbols',
- depends(artifact_builds)(lambda v: False if v is None else None),
- reason='--disable-artifact-builds')
- option('--enable-artifact-build-symbols',
- help='Download symbols when artifact builds are enabled.')
- set_config('MOZ_ARTIFACT_BUILD_SYMBOLS',
- depends_if('--enable-artifact-build-symbols')(lambda _: True))
- @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)
- js_option('--enable-debug',
- nargs='?',
- help='Enable building with developer debug info '
- '(using the given compiler flags).')
- add_old_configure_assignment('MOZ_DEBUG',
- depends('--enable-debug')(lambda v: bool(v)))
- include('build/moz.configure/pkg.configure')
- # Make this assignment here rather than in pkg.configure to avoid
- # requiring this file in unit tests.
- add_old_configure_assignment('PKG_CONFIG', pkg_config)
- include('build/moz.configure/toolchain.configure',
- when='--enable-compile-environment')
- include('build/moz.configure/memory.configure',
- when='--enable-compile-environment')
- include('build/moz.configure/headers.configure',
- when='--enable-compile-environment')
- include('build/moz.configure/warnings.configure',
- when='--enable-compile-environment')
- include(include_project_configure)
- @depends('--help')
- @imports(_from='mozbuild.backend', _import='backends')
- def build_backends_choices(_):
- return tuple(backends)
- @deprecated_option('--enable-build-backend', nargs='+',
- choices=build_backends_choices)
- def build_backend(backends):
- if backends:
- return tuple('+%s' % b for b in backends)
- imply_option('--build-backends', build_backend)
- @depends('--enable-artifact-builds', '--disable-compile-environment', '--help')
- @imports('sys')
- def build_backend_defaults(artifact_builds, compile_environment, _):
- if artifact_builds:
- all_backends = ['FasterMake+RecursiveMake']
- else:
- all_backends = ['RecursiveMake', 'FasterMake']
- # Normally, we'd use target.os == 'WINNT', but a dependency on target
- # would require target to depend on --help, as well as host and shell,
- # and this is not a can of worms we can open at the moment.
- if sys.platform == 'win32' and compile_environment:
- all_backends.append('VisualStudio')
- return tuple(all_backends)
- option('--build-backends', nargs='+', default=build_backend_defaults,
- choices=build_backends_choices, help='Build backends to generate')
- @depends('--build-backends')
- def build_backends(backends):
- return backends
- set_config('BUILD_BACKENDS', build_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):
- 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)
- def get_perl_version(perl):
- return Version(check_cmd_output(
- perl, '-e', 'print $]',
- onerror=lambda: die('Failed to get perl version.')
- ))
- @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')
- # GNU make detection
- # ==============================================================
- option(env='MAKE', nargs=1, help='Path to GNU make')
- @depends('MAKE', host)
- def possible_makes(make, host):
- candidates = []
- if host.kernel == 'WINNT':
- candidates.append('mingw32-make')
- if make:
- candidates.append(make[0])
- if host.kernel == 'WINNT':
- candidates.extend(('make', 'gmake'))
- else:
- candidates.extend(('gmake', 'make'))
- return candidates
- check_prog('GMAKE', possible_makes)
- # tup detection
- # ==============================================================
- @depends(build_backends)
- def tup_progs(build_backends):
- for backend in build_backends:
- if 'Tup' in backend:
- return ['tup']
- return None
- tup = check_prog('TUP', tup_progs)
- # 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)
- option('--enable-system-hunspell',
- help="Use system hunspell (located with pkgconfig)")
- @depends('--enable-system-hunspell', compile_environment)
- def check_for_hunspell(value, compile_env):
- return value and compile_env
- system_hunspell = pkg_check_modules('MOZ_HUNSPELL', 'hunspell',
- when=check_for_hunspell)
- set_config('MOZ_SYSTEM_HUNSPELL', depends_if(system_hunspell)(lambda _: True))
- @depends(target)
- @imports('os')
- def makensis_progs(target):
- if target.kernel != 'WINNT':
- return
- candidates = [
- 'makensis-3.01.exe',
- 'makensis-3.0b3.exe',
- 'makensis-3.0b1.exe',
- 'makensis.exe',
- 'makensis',
- ]
- # Look for nsis installed by msys environment. But only the 32-bit version.
- # We use an absolute path and insert as the first entry so it is preferred
- # over a 64-bit exe that may be in PATH.
- if 'MSYSTEM_PREFIX' in os.environ:
- prefix = os.path.dirname(os.environ['MSYSTEM_PREFIX'])
- candidates.insert(0, os.path.join(prefix, 'mingw32', 'bin', 'makensis.exe'))
- return tuple(candidates)
- nsis = check_prog('MAKENSISU', makensis_progs)
- # Make sure the version of makensis is up to date.
- @depends_if(nsis)
- @checking('for NSIS version')
- @imports('re')
- def nsis_version(nsis):
- nsis_min_version = '3.0b1'
- out = check_cmd_output(nsis, '-version',
- onerror=lambda: die('Failed to get nsis version.'))
- m = re.search(r'(?<=v)[0-9]+\.[0-9]+((a|b|rc)[0-9]+)?', out)
- if not m:
- raise FatalCheckError('Unknown version of makensis')
- ver = Version(m.group(0))
- # Versions comparisons don't quite work well with beta versions, so ensure
- # it works for the non-beta version.
- if ver < nsis_min_version and (ver >= '3.0a' or ver < '3'):
- raise FatalCheckError('To build the installer you must have NSIS'
- ' version %s or greater in your path'
- % nsis_min_version)
- return ver
- # And that makensis is 32-bit.
- @depends_if(nsis)
- @checking('for 32-bit NSIS')
- def nsis_binary_type(nsis):
- bin_type = windows_binary_type(nsis)
- if bin_type != 'win32':
- raise FatalCheckError('%s is not a 32-bit Windows application' % nsis)
- return 'yes'
- # Fallthrough to autoconf-based configure
- include('build/moz.configure/old.configure')
- # Please do not add anything after the include of old.configure.
|