|
Packit |
f0b94e |
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
|
|
Packit |
f0b94e |
# vim: set filetype=python:
|
|
Packit |
f0b94e |
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
Packit |
f0b94e |
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
Packit |
f0b94e |
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
include('build/moz.configure/init.configure')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# Note:
|
|
Packit |
f0b94e |
# - Gecko-specific options and rules should go in toolkit/moz.configure.
|
|
Packit |
f0b94e |
# - Firefox-specific options and rules should go in browser/moz.configure.
|
|
Packit |
f0b94e |
# - Fennec-specific options and rules should go in
|
|
Packit |
f0b94e |
# mobile/android/moz.configure.
|
|
Packit |
f0b94e |
# - Spidermonkey-specific options and rules should go in js/moz.configure.
|
|
Packit |
f0b94e |
# - etc.
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
option('--enable-artifact-builds', env='MOZ_ARTIFACT_BUILDS',
|
|
Packit |
f0b94e |
help='Download and use prebuilt binary artifacts.')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends('--enable-artifact-builds')
|
|
Packit |
f0b94e |
def artifact_builds(value):
|
|
Packit |
f0b94e |
if value:
|
|
Packit |
f0b94e |
return True
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
set_config('MOZ_ARTIFACT_BUILDS', artifact_builds)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
imply_option('--enable-artifact-build-symbols',
|
|
Packit |
f0b94e |
depends(artifact_builds)(lambda v: False if v is None else None),
|
|
Packit |
f0b94e |
reason='--disable-artifact-builds')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
option('--enable-artifact-build-symbols',
|
|
Packit |
f0b94e |
help='Download symbols when artifact builds are enabled.')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
set_config('MOZ_ARTIFACT_BUILD_SYMBOLS',
|
|
Packit |
f0b94e |
depends_if('--enable-artifact-build-symbols')(lambda _: True))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends('--enable-artifact-builds')
|
|
Packit |
f0b94e |
def imply_disable_compile_environment(value):
|
|
Packit |
f0b94e |
if value:
|
|
Packit |
f0b94e |
return False
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
option(env='MOZ_COPY_PDBS',
|
|
Packit |
f0b94e |
help='For builds that do not support symbols in the normal fashion,'
|
|
Packit |
f0b94e |
' generate and copy them into the resulting build archive.')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
set_config('MOZ_COPY_PDBS', depends_if('MOZ_COPY_PDBS')(lambda _: True))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
imply_option('--enable-compile-environment', imply_disable_compile_environment)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
option('--disable-compile-environment',
|
|
Packit |
f0b94e |
help='Disable compiler/library checks')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends('--disable-compile-environment')
|
|
Packit |
f0b94e |
def compile_environment(compile_env):
|
|
Packit |
f0b94e |
if compile_env:
|
|
Packit |
f0b94e |
return True
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
set_config('COMPILE_ENVIRONMENT', compile_environment)
|
|
Packit |
f0b94e |
add_old_configure_assignment('COMPILE_ENVIRONMENT', compile_environment)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
js_option('--disable-tests',
|
|
Packit |
f0b94e |
help='Do not build test libraries & programs')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends('--disable-tests')
|
|
Packit |
f0b94e |
def enable_tests(value):
|
|
Packit |
f0b94e |
if value:
|
|
Packit |
f0b94e |
return True
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
set_config('ENABLE_TESTS', enable_tests)
|
|
Packit |
f0b94e |
set_define('ENABLE_TESTS', enable_tests)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
js_option(env='MOZILLA_OFFICIAL',
|
|
Packit |
f0b94e |
help='Build an official release')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends('MOZILLA_OFFICIAL')
|
|
Packit |
f0b94e |
def mozilla_official(official):
|
|
Packit |
f0b94e |
if official:
|
|
Packit |
f0b94e |
return True
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
set_config('MOZILLA_OFFICIAL', mozilla_official)
|
|
Packit |
f0b94e |
set_define('MOZILLA_OFFICIAL', mozilla_official)
|
|
Packit |
f0b94e |
add_old_configure_assignment('MOZILLA_OFFICIAL', mozilla_official)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends(enable_tests)
|
|
Packit |
f0b94e |
def gtest_has_rtti(value):
|
|
Packit |
f0b94e |
if value:
|
|
Packit |
f0b94e |
return '0'
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
set_define('GTEST_HAS_RTTI', gtest_has_rtti)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends(target, enable_tests)
|
|
Packit |
f0b94e |
def linux_gtest_defines(target, enable_tests):
|
|
Packit |
f0b94e |
if enable_tests and target.os == 'Android':
|
|
Packit |
f0b94e |
return namespace(os_linux_android=True,
|
|
Packit |
f0b94e |
use_own_tr1_tuple=True,
|
|
Packit |
f0b94e |
has_clone='0')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
set_define('GTEST_OS_LINUX_ANDROID',
|
|
Packit |
f0b94e |
linux_gtest_defines.os_linux_android)
|
|
Packit |
f0b94e |
set_define('GTEST_USE_OWN_TR1_TUPLE',
|
|
Packit |
f0b94e |
linux_gtest_defines.use_own_tr1_tuple)
|
|
Packit |
f0b94e |
set_define('GTEST_HAS_CLONE',
|
|
Packit |
f0b94e |
linux_gtest_defines.has_clone)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
js_option('--enable-debug',
|
|
Packit |
f0b94e |
nargs='?',
|
|
Packit |
f0b94e |
help='Enable building with developer debug info '
|
|
Packit |
f0b94e |
'(using the given compiler flags).')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends('--enable-debug')
|
|
Packit |
f0b94e |
def moz_debug(debug):
|
|
Packit |
f0b94e |
if debug:
|
|
Packit |
f0b94e |
return bool(debug)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
set_config('MOZ_DEBUG', moz_debug)
|
|
Packit |
f0b94e |
set_define('MOZ_DEBUG', moz_debug)
|
|
Packit |
f0b94e |
# Override any value MOZ_DEBUG may have from the environment when passing it
|
|
Packit |
f0b94e |
# down to old-configure.
|
|
Packit |
f0b94e |
add_old_configure_assignment('MOZ_DEBUG',
|
|
Packit |
f0b94e |
depends('--enable-debug')(lambda x: bool(x)))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
js_option('--enable-rust-debug',
|
|
Packit |
f0b94e |
help='Build Rust code with debug assertions turned on.')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends('--enable-rust-debug', '--enable-debug')
|
|
Packit |
f0b94e |
def debug_rust(value, debug):
|
|
Packit |
f0b94e |
if value.origin == 'default':
|
|
Packit |
f0b94e |
return bool(debug) or None
|
|
Packit |
f0b94e |
elif bool(value):
|
|
Packit |
f0b94e |
return True
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
set_config('MOZ_DEBUG_RUST', debug_rust)
|
|
Packit |
f0b94e |
set_define('MOZ_DEBUG_RUST', debug_rust)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
include('build/moz.configure/pkg.configure')
|
|
Packit |
f0b94e |
# Make this assignment here rather than in pkg.configure to avoid
|
|
Packit |
f0b94e |
# requiring this file in unit tests.
|
|
Packit |
f0b94e |
add_old_configure_assignment('PKG_CONFIG', pkg_config)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
include('build/moz.configure/toolchain.configure',
|
|
Packit |
f0b94e |
when='--enable-compile-environment')
|
|
Packit |
f0b94e |
include('build/moz.configure/memory.configure',
|
|
Packit |
f0b94e |
when='--enable-compile-environment')
|
|
Packit |
f0b94e |
include('build/moz.configure/headers.configure',
|
|
Packit |
f0b94e |
when='--enable-compile-environment')
|
|
Packit |
f0b94e |
include('build/moz.configure/warnings.configure',
|
|
Packit |
f0b94e |
when='--enable-compile-environment')
|
|
Packit |
f0b94e |
include('build/moz.configure/flags.configure',
|
|
Packit |
f0b94e |
when='--enable-compile-environment')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends(target, host)
|
|
Packit |
f0b94e |
def is_openbsd(target, host):
|
|
Packit |
f0b94e |
return target.kernel == 'OpenBSD' or host.kernel == 'OpenBSD'
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
option(env='SO_VERSION', nargs=1, default='1.0', when=is_openbsd,
|
|
Packit |
f0b94e |
help='Shared library version for OpenBSD systems')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends('SO_VERSION', when=is_openbsd)
|
|
Packit |
f0b94e |
def so_version(value):
|
|
Packit |
f0b94e |
return value
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@template
|
|
Packit |
f0b94e |
def library_name_info_template(host_or_target):
|
|
Packit |
f0b94e |
assert host_or_target in (host, target)
|
|
Packit |
f0b94e |
compiler = {
|
|
Packit |
f0b94e |
host: host_c_compiler,
|
|
Packit |
f0b94e |
target: c_compiler,
|
|
Packit |
f0b94e |
}[host_or_target]
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends(host_or_target, compiler, so_version)
|
|
Packit |
f0b94e |
def library_name_info_impl(host_or_target, compiler, so_version):
|
|
Packit |
f0b94e |
if host_or_target.kernel == 'WINNT':
|
|
Packit |
f0b94e |
# There aren't artifacts for mingw builds, so it's OK that the
|
|
Packit |
f0b94e |
# results are inaccurate in that case.
|
|
Packit |
f0b94e |
if compiler and compiler.type not in ('msvc', 'clang-cl'):
|
|
Packit |
f0b94e |
return namespace(
|
|
Packit |
f0b94e |
dll=namespace(prefix='', suffix='.dll'),
|
|
Packit |
f0b94e |
lib=namespace(prefix='lib', suffix='a'),
|
|
Packit |
f0b94e |
import_lib=namespace(prefix='lib', suffix='a'),
|
|
Packit |
f0b94e |
rust_lib=namespace(prefix='', suffix='lib'),
|
|
Packit |
f0b94e |
obj=namespace(prefix='', suffix='o'),
|
|
Packit |
f0b94e |
)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
return namespace(
|
|
Packit |
f0b94e |
dll=namespace(prefix='', suffix='.dll'),
|
|
Packit |
f0b94e |
lib=namespace(prefix='', suffix='lib'),
|
|
Packit |
f0b94e |
import_lib=namespace(prefix='', suffix='lib'),
|
|
Packit |
f0b94e |
rust_lib=namespace(prefix='', suffix='lib'),
|
|
Packit |
f0b94e |
obj=namespace(prefix='', suffix='obj'),
|
|
Packit |
f0b94e |
)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
elif host_or_target.kernel == 'Darwin':
|
|
Packit |
f0b94e |
return namespace(
|
|
Packit |
f0b94e |
dll=namespace(prefix='lib', suffix='.dylib'),
|
|
Packit |
f0b94e |
lib=namespace(prefix='lib', suffix='a'),
|
|
Packit |
f0b94e |
import_lib=namespace(prefix=None, suffix=''),
|
|
Packit |
f0b94e |
rust_lib=namespace(prefix='lib', suffix='a'),
|
|
Packit |
f0b94e |
obj=namespace(prefix='', suffix='o'),
|
|
Packit |
f0b94e |
)
|
|
Packit |
f0b94e |
elif so_version:
|
|
Packit |
f0b94e |
so = '.so.%s' % so_version
|
|
Packit |
f0b94e |
else:
|
|
Packit |
f0b94e |
so = '.so'
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
return namespace(
|
|
Packit |
f0b94e |
dll=namespace(prefix='lib', suffix=so),
|
|
Packit |
f0b94e |
lib=namespace(prefix='lib', suffix='a'),
|
|
Packit |
f0b94e |
import_lib=namespace(prefix=None, suffix=''),
|
|
Packit |
f0b94e |
rust_lib=namespace(prefix='lib', suffix='a'),
|
|
Packit |
f0b94e |
obj=namespace(prefix='', suffix='o'),
|
|
Packit |
f0b94e |
)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
return library_name_info_impl
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
host_library_name_info = library_name_info_template(host)
|
|
Packit |
f0b94e |
library_name_info = library_name_info_template(target)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
set_config('DLL_PREFIX', library_name_info.dll.prefix)
|
|
Packit |
f0b94e |
set_config('DLL_SUFFIX', library_name_info.dll.suffix)
|
|
Packit |
f0b94e |
set_config('LIB_PREFIX', library_name_info.lib.prefix)
|
|
Packit |
f0b94e |
set_config('LIB_SUFFIX', library_name_info.lib.suffix)
|
|
Packit |
f0b94e |
set_config('RUST_LIB_PREFIX', library_name_info.rust_lib.prefix)
|
|
Packit |
f0b94e |
set_config('RUST_LIB_SUFFIX', library_name_info.rust_lib.suffix)
|
|
Packit |
f0b94e |
set_config('OBJ_SUFFIX', library_name_info.obj.suffix)
|
|
Packit |
f0b94e |
# Lots of compilation tests depend on this variable being present.
|
|
Packit |
f0b94e |
add_old_configure_assignment('OBJ_SUFFIX', library_name_info.obj.suffix)
|
|
Packit |
f0b94e |
set_config('IMPORT_LIB_SUFFIX', library_name_info.import_lib.suffix)
|
|
Packit |
f0b94e |
set_define('MOZ_DLL_SUFFIX', depends(library_name_info.dll.suffix)(lambda s: '"%s"' % s))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
include(include_project_configure)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends('--help')
|
|
Packit |
f0b94e |
@imports(_from='mozbuild.backend', _import='backends')
|
|
Packit |
f0b94e |
def build_backends_choices(_):
|
|
Packit |
f0b94e |
return tuple(backends)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@deprecated_option('--enable-build-backend', nargs='+',
|
|
Packit |
f0b94e |
choices=build_backends_choices)
|
|
Packit |
f0b94e |
def build_backend(backends):
|
|
Packit |
f0b94e |
if backends:
|
|
Packit |
f0b94e |
return tuple('+%s' % b for b in backends)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
imply_option('--build-backends', build_backend)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends('--enable-artifact-builds', '--disable-compile-environment', '--help')
|
|
Packit |
f0b94e |
@imports('sys')
|
|
Packit |
f0b94e |
def build_backend_defaults(artifact_builds, compile_environment, _):
|
|
Packit |
f0b94e |
if artifact_builds:
|
|
Packit |
f0b94e |
all_backends = ['FasterMake+RecursiveMake']
|
|
Packit |
f0b94e |
else:
|
|
Packit |
f0b94e |
all_backends = ['RecursiveMake', 'FasterMake']
|
|
Packit |
f0b94e |
# Normally, we'd use target.os == 'WINNT', but a dependency on target
|
|
Packit |
f0b94e |
# would require target to depend on --help, as well as host and shell,
|
|
Packit |
f0b94e |
# and this is not a can of worms we can open at the moment.
|
|
Packit |
f0b94e |
if sys.platform == 'win32' and compile_environment:
|
|
Packit |
f0b94e |
all_backends.append('VisualStudio')
|
|
Packit |
f0b94e |
return tuple(all_backends)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
option('--build-backends', nargs='+', default=build_backend_defaults,
|
|
Packit |
f0b94e |
choices=build_backends_choices, help='Build backends to generate')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends('--build-backends')
|
|
Packit |
f0b94e |
def build_backends(backends):
|
|
Packit |
f0b94e |
return backends
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
set_config('BUILD_BACKENDS', build_backends)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
option('--disable-gtest-in-build',
|
|
Packit |
f0b94e |
help='Force disable building the gtest libxul during the build.',
|
|
Packit |
f0b94e |
when='--enable-compile-environment')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# Determine whether to build the gtest xul. This happens in automation
|
|
Packit |
f0b94e |
# on Desktop platforms with the exception of Windows PGO, where linking
|
|
Packit |
f0b94e |
# xul-gtest.dll takes too long.
|
|
Packit |
f0b94e |
@depends('MOZ_PGO', build_project, target, 'MOZ_AUTOMATION', '--disable-gtest-in-build',
|
|
Packit |
f0b94e |
enable_tests, when='--enable-compile-environment')
|
|
Packit |
f0b94e |
def build_gtest(pgo, build_project, target, automation, enabled, enable_tests):
|
|
Packit |
f0b94e |
if not enable_tests or not enabled:
|
|
Packit |
f0b94e |
return None
|
|
Packit |
f0b94e |
if (automation and build_project == 'browser' and
|
|
Packit |
f0b94e |
not (pgo and target.os == 'WINNT')):
|
|
Packit |
f0b94e |
return True
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
set_config('LINK_GTEST_DURING_COMPILE', build_gtest)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# Localization
|
|
Packit |
f0b94e |
# ==============================================================
|
|
Packit |
f0b94e |
option('--enable-ui-locale', default='en-US',
|
|
Packit |
f0b94e |
help='Select the user interface locale (default: en-US)')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
set_config('MOZ_UI_LOCALE', depends('--enable-ui-locale')(lambda x: x))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# clang-plugin location
|
|
Packit |
f0b94e |
# ==============================================================
|
|
Packit |
f0b94e |
@depends(library_name_info, check_build_environment, when='--enable-clang-plugin')
|
|
Packit |
f0b94e |
def clang_plugin_path(library_name_info, build_env):
|
|
Packit |
f0b94e |
topobjdir = build_env.topobjdir
|
|
Packit |
f0b94e |
if topobjdir.endswith('/js/src'):
|
|
Packit |
f0b94e |
topobjdir = topobjdir[:-7]
|
|
Packit |
f0b94e |
return os.path.abspath(
|
|
Packit |
f0b94e |
os.path.join(topobjdir, 'build', 'clang-plugin',
|
|
Packit |
f0b94e |
'%sclang-plugin%s' % (library_name_info.dll.prefix,
|
|
Packit |
f0b94e |
library_name_info.dll.suffix))
|
|
Packit |
f0b94e |
)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
add_old_configure_assignment('CLANG_PLUGIN', clang_plugin_path)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# Awk detection
|
|
Packit |
f0b94e |
# ==============================================================
|
|
Packit |
f0b94e |
awk = check_prog('AWK', ('gawk', 'mawk', 'nawk', 'awk'))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# Until the AWK variable is not necessary in old-configure
|
|
Packit |
f0b94e |
@depends(awk)
|
|
Packit |
f0b94e |
def awk_for_old_configure(value):
|
|
Packit |
f0b94e |
return value
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
add_old_configure_assignment('AWK', awk_for_old_configure)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# Perl detection
|
|
Packit |
f0b94e |
# ==============================================================
|
|
Packit |
f0b94e |
perl = check_prog('PERL', ('perl5', 'perl'))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# Until the PERL variable is not necessary in old-configure
|
|
Packit |
f0b94e |
@depends(perl)
|
|
Packit |
f0b94e |
def perl_for_old_configure(value):
|
|
Packit |
f0b94e |
return value
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
add_old_configure_assignment('PERL', perl_for_old_configure)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@template
|
|
Packit |
f0b94e |
def perl_version_check(min_version):
|
|
Packit |
f0b94e |
@depends(perl)
|
|
Packit |
f0b94e |
@checking('for minimum required perl version >= %s' % min_version)
|
|
Packit |
f0b94e |
def get_perl_version(perl):
|
|
Packit |
f0b94e |
return Version(check_cmd_output(
|
|
Packit |
f0b94e |
perl, '-e', 'print $]',
|
|
Packit |
f0b94e |
onerror=lambda: die('Failed to get perl version.')
|
|
Packit |
f0b94e |
))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends(get_perl_version)
|
|
Packit |
f0b94e |
def check_perl_version(version):
|
|
Packit |
f0b94e |
if version < min_version:
|
|
Packit |
f0b94e |
die('Perl %s or higher is required.', min_version)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends(perl)
|
|
Packit |
f0b94e |
@checking('for full perl installation')
|
|
Packit |
f0b94e |
@imports('subprocess')
|
|
Packit |
f0b94e |
def has_full_perl_installation(perl):
|
|
Packit |
f0b94e |
ret = subprocess.call(
|
|
Packit |
f0b94e |
[perl, '-e', 'use Config; exit(!-d $Config{archlib})'])
|
|
Packit |
f0b94e |
return ret == 0
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends(has_full_perl_installation)
|
|
Packit |
f0b94e |
def require_full_perl_installation(has_full_perl_installation):
|
|
Packit |
f0b94e |
if not has_full_perl_installation:
|
|
Packit |
f0b94e |
die('Cannot find Config.pm or $Config{archlib}. '
|
|
Packit |
f0b94e |
'A full perl installation is required.')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
perl_version_check('5.006')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# GNU make detection
|
|
Packit |
f0b94e |
# ==============================================================
|
|
Packit |
f0b94e |
option(env='MAKE', nargs=1, help='Path to GNU make')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends('MAKE', host)
|
|
Packit |
f0b94e |
def possible_makes(make, host):
|
|
Packit |
f0b94e |
candidates = []
|
|
Packit |
f0b94e |
if host.kernel == 'WINNT':
|
|
Packit |
f0b94e |
candidates.append('mingw32-make')
|
|
Packit |
f0b94e |
if make:
|
|
Packit |
f0b94e |
candidates.append(make[0])
|
|
Packit |
f0b94e |
if host.kernel == 'WINNT':
|
|
Packit |
f0b94e |
candidates.extend(('make', 'gmake'))
|
|
Packit |
f0b94e |
else:
|
|
Packit |
f0b94e |
candidates.extend(('gmake', 'make'))
|
|
Packit |
f0b94e |
return candidates
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
check_prog('GMAKE', possible_makes)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# tup detection
|
|
Packit |
f0b94e |
# ==============================================================
|
|
Packit |
f0b94e |
@depends(build_backends)
|
|
Packit |
f0b94e |
def tup_progs(build_backends):
|
|
Packit |
f0b94e |
for backend in build_backends:
|
|
Packit |
f0b94e |
if 'Tup' in backend:
|
|
Packit |
f0b94e |
return ['tup']
|
|
Packit |
f0b94e |
return None
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
tup = check_prog('TUP', tup_progs)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# watchman detection
|
|
Packit |
f0b94e |
# ==============================================================
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
option(env='WATCHMAN', nargs=1, help='Path to the watchman program')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends('WATCHMAN')
|
|
Packit |
f0b94e |
@checking('for watchman', callback=lambda w: w.path if w else 'not found')
|
|
Packit |
f0b94e |
def watchman(prog):
|
|
Packit |
f0b94e |
if not prog:
|
|
Packit |
f0b94e |
prog = find_program('watchman')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
if not prog:
|
|
Packit |
f0b94e |
return
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# `watchman version` will talk to the Watchman daemon service.
|
|
Packit |
f0b94e |
# This can hang due to permissions problems. e.g.
|
|
Packit |
f0b94e |
# https://github.com/facebook/watchman/issues/376. So use
|
|
Packit |
f0b94e |
# `watchman --version` to prevent a class of failures.
|
|
Packit |
f0b94e |
out = check_cmd_output(prog, '--version', onerror=lambda: None)
|
|
Packit |
f0b94e |
if out is None:
|
|
Packit |
f0b94e |
return
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
return namespace(path=prog, version=Version(out.strip()))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends_if(watchman)
|
|
Packit |
f0b94e |
@checking('for watchman version')
|
|
Packit |
f0b94e |
def watchman_version(w):
|
|
Packit |
f0b94e |
return w.version
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
set_config('WATCHMAN', watchman.path)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends_all(hg_version, hg_config, watchman)
|
|
Packit |
f0b94e |
@checking('for watchman Mercurial integration')
|
|
Packit |
f0b94e |
@imports('os')
|
|
Packit |
f0b94e |
def watchman_hg(hg_version, hg_config, watchman):
|
|
Packit |
f0b94e |
if hg_version < Version('3.8'):
|
|
Packit |
f0b94e |
return 'no (Mercurial 3.8+ required)'
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
ext_enabled = False
|
|
Packit |
f0b94e |
mode_disabled = False
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
for k in ('extensions.fsmonitor', 'extensions.hgext.fsmonitor'):
|
|
Packit |
f0b94e |
if k in hg_config and hg_config[k] != '!':
|
|
Packit |
f0b94e |
ext_enabled = True
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
mode_disabled = hg_config.get('fsmonitor.mode') == 'off'
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
if not ext_enabled:
|
|
Packit |
f0b94e |
return 'no (fsmonitor extension not enabled)'
|
|
Packit |
f0b94e |
if mode_disabled:
|
|
Packit |
f0b94e |
return 'no (fsmonitor.mode=off disables fsmonitor)'
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
return True
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# Miscellaneous programs
|
|
Packit |
f0b94e |
# ==============================================================
|
|
Packit |
f0b94e |
check_prog('XARGS', ('xargs',))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends(target)
|
|
Packit |
f0b94e |
def extra_programs(target):
|
|
Packit |
f0b94e |
if target.kernel == 'Darwin':
|
|
Packit |
f0b94e |
return namespace(
|
|
Packit |
f0b94e |
DSYMUTIL=('dsymutil', 'llvm-dsymutil'),
|
|
Packit |
f0b94e |
MKFSHFS=('newfs_hfs', 'mkfs.hfsplus'),
|
|
Packit |
f0b94e |
HFS_TOOL=('hfsplus',)
|
|
Packit |
f0b94e |
)
|
|
Packit |
f0b94e |
if target.os == 'GNU' and target.kernel == 'Linux':
|
|
Packit |
f0b94e |
return namespace(RPMBUILD=('rpmbuild',))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
check_prog('DSYMUTIL', extra_programs.DSYMUTIL,
|
|
Packit |
f0b94e |
allow_missing=True)
|
|
Packit |
f0b94e |
check_prog('MKFSHFS', extra_programs.MKFSHFS,
|
|
Packit |
f0b94e |
allow_missing=True)
|
|
Packit |
f0b94e |
check_prog('HFS_TOOL', extra_programs.HFS_TOOL,
|
|
Packit |
f0b94e |
allow_missing=True)
|
|
Packit |
f0b94e |
check_prog('RPMBUILD', extra_programs.RPMBUILD,
|
|
Packit |
f0b94e |
allow_missing=True)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
option('--enable-system-hunspell',
|
|
Packit |
f0b94e |
help="Use system hunspell (located with pkgconfig)")
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends('--enable-system-hunspell', compile_environment)
|
|
Packit |
f0b94e |
def check_for_hunspell(value, compile_env):
|
|
Packit |
f0b94e |
return value and compile_env
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
system_hunspell = pkg_check_modules('MOZ_HUNSPELL', 'hunspell',
|
|
Packit |
f0b94e |
when=check_for_hunspell)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
set_config('MOZ_SYSTEM_HUNSPELL', depends_if(system_hunspell)(lambda _: True))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@depends(target)
|
|
Packit |
f0b94e |
@imports('os')
|
|
Packit |
f0b94e |
def makensis_progs(target):
|
|
Packit |
f0b94e |
if target.kernel != 'WINNT':
|
|
Packit |
f0b94e |
return
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
candidates = [
|
|
Packit |
f0b94e |
'makensis-3.01',
|
|
Packit |
f0b94e |
'makensis-3.0b3',
|
|
Packit |
f0b94e |
'makensis-3.0b1',
|
|
Packit |
f0b94e |
'makensis',
|
|
Packit |
f0b94e |
]
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# Look for nsis installed by msys environment. But only the 32-bit version.
|
|
Packit |
f0b94e |
# We use an absolute path and insert as the first entry so it is preferred
|
|
Packit |
f0b94e |
# over a 64-bit exe that may be in PATH.
|
|
Packit |
f0b94e |
if 'MSYSTEM_PREFIX' in os.environ:
|
|
Packit |
f0b94e |
prefix = os.path.dirname(os.environ['MSYSTEM_PREFIX'])
|
|
Packit |
f0b94e |
candidates.insert(0, os.path.join(prefix, 'mingw32', 'bin', 'makensis.exe'))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
return tuple(candidates)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
nsis = check_prog('MAKENSISU', makensis_progs, allow_missing=True)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# Make sure the version of makensis is up to date.
|
|
Packit |
f0b94e |
@depends_if(nsis)
|
|
Packit |
f0b94e |
@checking('for NSIS version')
|
|
Packit |
f0b94e |
@imports('re')
|
|
Packit |
f0b94e |
def nsis_version(nsis):
|
|
Packit |
f0b94e |
nsis_min_version = '3.0b1'
|
|
Packit |
f0b94e |
out = check_cmd_output(nsis, '-version',
|
|
Packit |
f0b94e |
onerror=lambda: die('Failed to get nsis version.'))
|
|
Packit |
f0b94e |
m = re.search(r'(?<=v)[0-9]+\.[0-9]+((a|b|rc)[0-9]+)?', out)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
if not m:
|
|
Packit |
f0b94e |
raise FatalCheckError('Unknown version of makensis')
|
|
Packit |
f0b94e |
ver = Version(m.group(0))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# Versions comparisons don't quite work well with beta versions, so ensure
|
|
Packit |
f0b94e |
# it works for the non-beta version.
|
|
Packit |
f0b94e |
if ver < nsis_min_version and (ver >= '3.0a' or ver < '3'):
|
|
Packit |
f0b94e |
raise FatalCheckError('To build the installer you must have NSIS'
|
|
Packit |
f0b94e |
' version %s or greater in your path'
|
|
Packit |
f0b94e |
% nsis_min_version)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
return ver
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# And that makensis is 32-bit (but only on Windows).
|
|
Packit |
f0b94e |
@depends_if(nsis, when=depends(host)(lambda h: h.kernel == 'WINNT'))
|
|
Packit |
f0b94e |
@checking('for 32-bit NSIS')
|
|
Packit |
f0b94e |
def nsis_binary_type(nsis):
|
|
Packit |
f0b94e |
bin_type = windows_binary_type(nsis)
|
|
Packit |
f0b94e |
if bin_type != 'win32':
|
|
Packit |
f0b94e |
raise FatalCheckError('%s is not a 32-bit Windows application' % nsis)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
return 'yes'
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# And any flags we have to give to makensis
|
|
Packit |
f0b94e |
@depends(host)
|
|
Packit |
f0b94e |
def nsis_flags(host):
|
|
Packit |
f0b94e |
if host.kernel != 'WINNT':
|
|
Packit |
f0b94e |
return '-nocd'
|
|
Packit |
f0b94e |
return ''
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
set_config('MAKENSISU_FLAGS', nsis_flags)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
check_prog('7Z', ('7z', '7za'), allow_missing=True, when=target_is_windows)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# Fallthrough to autoconf-based configure
|
|
Packit |
f0b94e |
include('build/moz.configure/old.configure')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@imports('__sandbox__')
|
|
Packit |
f0b94e |
def all_paths():
|
|
Packit |
f0b94e |
return __sandbox__._all_paths
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
set_config('ALL_CONFIGURE_PATHS', all_paths())
|
|
Packit |
f0b94e |
# Please do not add anything after setting ALL_CONFIGURE_PATHS.
|