123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440 |
- # -*- 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/.
- @imports('codecs')
- @imports('sys')
- def encoded_open(path, mode):
- encoding = 'mbcs' if sys.platform == 'win32' else 'utf-8'
- return codecs.open(path, mode, encoding)
- option(env='AUTOCONF', nargs=1, help='Path to autoconf 2.13')
- @depends(mozconfig, 'AUTOCONF')
- @checking('for autoconf')
- @imports(_from='os.path', _import='exists')
- @imports('re')
- def autoconf(mozconfig, autoconf):
- mozconfig_autoconf = None
- if mozconfig['path']:
- make_extra = mozconfig['make_extra']
- if make_extra:
- for assignment in make_extra:
- m = re.match('(?:export\s+)?AUTOCONF\s*:?=\s*(.+)$',
- assignment)
- if m:
- mozconfig_autoconf = m.group(1)
- autoconf = autoconf[0] if autoconf else None
- for ac in (mozconfig_autoconf, autoconf, 'autoconf-2.13', 'autoconf2.13',
- 'autoconf213'):
- if ac:
- autoconf = find_program(ac)
- if autoconf:
- break
- else:
- fink = find_program('fink')
- if fink:
- autoconf = os.path.normpath(os.path.join(
- fink, '..', '..', 'lib', 'autoconf2.13', 'bin', 'autoconf'))
- else:
- brew = find_program('brew')
- if brew:
- autoconf = os.path.normpath(os.path.join(
- brew, '..', '..', 'Cellar', 'autoconf213', '2.13', 'bin',
- 'autoconf213'))
- if not autoconf:
- die('Could not find autoconf 2.13')
- if not exists(autoconf):
- die('Could not find autoconf 2.13 at %s', autoconf)
- return autoconf
- set_config('AUTOCONF', autoconf)
- @depends('OLD_CONFIGURE', mozconfig, autoconf, check_build_environment, shell,
- old_configure_assignments, build_project)
- @imports(_from='__builtin__', _import='open')
- @imports(_from='__builtin__', _import='print')
- @imports('glob')
- @imports('itertools')
- @imports('subprocess')
- # Import getmtime without overwriting the sandbox os.path.
- @imports(_from='os.path', _import='getmtime')
- @imports(_from='os.path', _import='exists')
- @imports(_from='mozbuild.shellutil', _import='quote')
- def prepare_configure(old_configure, mozconfig, autoconf, build_env, shell,
- old_configure_assignments, build_project):
- # os.path.abspath in the sandbox will ensure forward slashes on Windows,
- # which is actually necessary because this path actually ends up literally
- # as $0, and backslashes there breaks autoconf's detection of the source
- # directory.
- old_configure = os.path.abspath(old_configure[0])
- if build_project == 'js':
- old_configure_dir = os.path.dirname(old_configure)
- if not old_configure_dir.endswith('/js/src'):
- old_configure = os.path.join(old_configure_dir, 'js', 'src',
- os.path.basename(old_configure))
- refresh = True
- if exists(old_configure):
- mtime = getmtime(old_configure)
- aclocal = os.path.join(build_env.topsrcdir, 'build', 'autoconf',
- '*.m4')
- for input in itertools.chain(
- (old_configure + '.in',
- os.path.join(os.path.dirname(old_configure), 'aclocal.m4')),
- glob.iglob(aclocal),
- ):
- if getmtime(input) > mtime:
- break
- else:
- refresh = False
- if refresh:
- log.info('Refreshing %s with %s', old_configure, autoconf)
- script = subprocess.check_output([
- shell, autoconf,
- '--localdir=%s' % os.path.dirname(old_configure),
- old_configure + '.in'])
- # Make old-configure append to config.log, where we put our own log.
- # This could be done with a m4 macro, but it's way easier this way
- script = script.replace('>./config.log', '>>./config.log')
- with open(old_configure, 'wb') as fh:
- fh.write(script)
- cmd = [shell, old_configure]
- with encoded_open('old-configure.vars', 'w') as out:
- log.debug('Injecting the following to old-configure:')
- def inject(command):
- print(command, file=out)
- log.debug('| %s', command)
- if mozconfig['path']:
- for key, value in mozconfig['vars']['added'].items():
- inject("%s=%s" % (key, quote(value)))
- for key, (old, value) in mozconfig['vars']['modified'].items():
- inject("%s=%s" % (key, quote(value)))
- for t in ('env', 'vars'):
- for key in mozconfig[t]['removed'].keys():
- inject("unset %s" % key)
- # Autoconf is special, because it might be passed from
- # mozconfig['make_extra'], which we don't pass automatically above.
- inject('export AUTOCONF=%s' % quote(autoconf))
- for assignment in old_configure_assignments:
- inject(assignment)
- return cmd
- @template
- def old_configure_options(*options):
- for opt in options:
- option(opt, nargs='*', help='Help missing for old configure options')
- @dependable
- def all_options():
- return list(options)
- return depends(prepare_configure, extra_old_configure_args, all_options,
- *options)
- @old_configure_options(
- '--cache-file',
- '--datadir',
- '--enable-accessibility',
- '--enable-address-sanitizer',
- '--enable-alsa',
- '--enable-av1',
- '--enable-b2g-bt',
- '--enable-b2g-camera',
- '--enable-b2g-ril',
- '--enable-bundled-fonts',
- '--enable-chrome-compression',
- '--enable-chrome-format',
- '--enable-clang-plugin',
- '--enable-content-sandbox',
- '--enable-cookies',
- '--enable-cpp-rtti',
- '--enable-crashreporter',
- '--enable-dbm',
- '--enable-dbus',
- '--enable-debug-js-modules',
- '--enable-jetpack',
- '--enable-devtools-server',
- '--enable-devtools',
- '--enable-directshow',
- '--enable-dtrace',
- '--enable-dump-painting',
- '--enable-eme',
- '--enable-elf-hack',
- '--enable-extensions',
- '--enable-faststripe',
- '--enable-feeds',
- '--enable-gamepad',
- '--enable-gconf',
- '--enable-gczeal',
- '--enable-gio',
- '--enable-gnomeui',
- '--enable-gold',
- '--enable-hardware-aec-ns',
- '--enable-icf',
- '--enable-install-strip',
- '--enable-ion',
- '--enable-ios-target',
- '--enable-jitspew',
- '--enable-libjpeg-turbo',
- '--enable-libproxy',
- '--enable-llvm-hacks',
- '--enable-logrefcnt',
- '--enable-maintenance-service',
- '--enable-memory-sanitizer',
- '--enable-mozril-geoloc',
- '--enable-necko-wifi',
- '--enable-negotiateauth',
- '--enable-nfc',
- '--enable-nspr-build',
- '--enable-official-branding',
- '--enable-official-vendor',
- '--enable-oom-breakpoint',
- '--enable-optimize',
- '--enable-parental-controls',
- '--enable-pie',
- '--enable-png-arm-neon-support',
- '--enable-posix-nspr-emulation',
- '--enable-precompiled-startupcache',
- '--enable-pref-extensions',
- '--enable-private-build',
- '--enable-pulseaudio',
- '--enable-sndio',
- '--enable-raw',
- '--enable-readline',
- '--enable-reflow-perf',
- '--enable-release',
- '--enable-safe-browsing',
- '--enable-sandbox',
- '--enable-security-sqlstore',
- '--enable-shared-media',
- '--enable-signmar',
- '--enable-simulator',
- '--enable-small-chunk-size',
- '--enable-startup-notification',
- '--enable-startupcache',
- '--enable-stdcxx-compat',
- '--enable-strip',
- '--enable-synth-pico',
- '--enable-system-cairo',
- '--enable-system-extension-dirs',
- '--enable-system-pixman',
- '--enable-tasktracer',
- '--enable-tests',
- '--enable-thread-sanitizer',
- '--enable-trace-logging',
- '--enable-ui-locale',
- '--enable-universalchardet',
- '--enable-updater',
- '--enable-url-classifier',
- '--enable-userinfo',
- '--enable-valgrind',
- '--enable-verify-mar',
- '--enable-webrtc',
- '--enable-xul',
- '--enable-zipwriter',
- '--includedir',
- '--libdir',
- '--no-create',
- '--prefix',
- '--with-android-cxx-stl',
- '--with-android-distribution-directory',
- '--with-android-max-sdk',
- '--with-android-min-sdk',
- '--with-android-sdk',
- '--with-app-basename',
- '--with-app-name',
- '--with-arch',
- '--with-branding',
- '--with-chrome-name',
- '--with-crashreporter-enable-percent',
- '--with-cross-lib',
- '--with-debug-label',
- '--with-default-mozilla-five-home',
- '--with-distribution-id',
- '--with-doc-include-dirs',
- '--with-doc-input-dirs',
- '--with-doc-output-dir',
- '--with-float-abi',
- '--with-fpu',
- '--with-ios-sdk',
- '--with-jitreport-granularity',
- '--with-macbundlename-prefix',
- '--with-macos-private-frameworks',
- '--with-macos-sdk',
- '--with-nspr-cflags',
- '--with-nspr-exec-prefix',
- '--with-nspr-libs',
- '--with-nspr-prefix',
- '--with-nss-exec-prefix',
- '--with-nss-prefix',
- '--with-pthreads',
- '--with-qemu-exe',
- '--with-sixgill',
- '--with-soft-float',
- '--with-system-bz2',
- '--with-system-jpeg',
- '--with-system-zlib',
- '--with-thumb',
- '--with-thumb-interwork',
- '--with-unify-dist',
- '--with-user-appdir',
- '--x-includes',
- '--x-libraries',
- # Below are the configure flags used by comm-central.
- '--enable-ldap',
- '--enable-mapi',
- '--enable-calendar',
- '--enable-incomplete-external-linkage',
- '--enable-mailnews',
- '--enable-mailnews-oauth2',
-
- # Below are configure flags used by Pale Moon
- '--disable-browser-statusbar',
- '--disable-sync',
- '--disable-personas',
-
- # Below are configure flags used by Basilisk
- '--disable-webextensions',
- )
- @imports(_from='__builtin__', _import='compile')
- @imports(_from='__builtin__', _import='open')
- @imports('logging')
- @imports('os')
- @imports('subprocess')
- @imports('sys')
- @imports(_from='mozbuild.shellutil', _import='quote')
- def old_configure(prepare_configure, extra_old_configure_args, all_options,
- *options):
- cmd = prepare_configure
- # old-configure only supports the options listed in @old_configure_options
- # so we don't need to pass it every single option we've been passed. Only
- # the ones that are not supported by python configure need to.
- cmd += [
- value.format(name)
- for name, value in zip(all_options, options)
- if value.origin != 'default'
- ]
- # We also pass it the options from js/moz.configure so that it can pass
- # them down to js/src/configure. Note this list is empty when running
- # js/src/configure, in which case we don't need to pass those options
- # to old-configure since old-configure doesn't handle them anyways.
- if extra_old_configure_args:
- cmd += extra_old_configure_args
- # For debugging purpose, in case it's not what we'd expect.
- log.debug('Running %s', quote(*cmd))
- # Our logging goes to config.log, the same file old.configure uses.
- # We can't share the handle on the file, so close it. We assume nothing
- # beyond this point is going to be interesting to log to config.log from
- # our end, so we don't make the effort to recreate a logging.FileHandler.
- logger = logging.getLogger('moz.configure')
- for handler in logger.handlers:
- if isinstance(handler, logging.FileHandler):
- handler.close()
- logger.removeHandler(handler)
- log_size = os.path.getsize('config.log')
- ret = subprocess.call(cmd)
- if ret:
- with log.queue_debug():
- with encoded_open('config.log', 'r') as fh:
- fh.seek(log_size)
- for line in fh:
- log.debug(line.rstrip())
- log.error('old-configure failed')
- sys.exit(ret)
- raw_config = {}
- with encoded_open('config.data', 'r') as fh:
- code = compile(fh.read(), 'config.data', 'exec')
- # Every variation of the exec() function I tried led to:
- # SyntaxError: unqualified exec is not allowed in function 'main' it
- # contains a nested function with free variables
- exec code in raw_config
- # Ensure all the flags known to old-configure appear in the
- # @old_configure_options above.
- all_options = set(all_options)
- for flag in raw_config['flags']:
- if flag not in all_options:
- die('Missing option in `@old_configure_options` in %s: %s',
- __file__, flag)
- # If the code execution above fails, we want to keep the file around for
- # debugging.
- os.remove('config.data')
- return raw_config
- # set_config is only available in the global namespace, not directly in
- # @depends functions, but we do need to enumerate the result of
- # old_configure, so we cheat.
- @imports('__sandbox__')
- def set_old_configure_config(name, value):
- __sandbox__.set_config_impl(name, value)
- # Same as set_old_configure_config, but for set_define.
- @imports('__sandbox__')
- def set_old_configure_define(name, value):
- __sandbox__.set_define_impl(name, value)
- @depends(old_configure)
- @imports('types')
- def post_old_configure(raw_config):
- for k, v in raw_config['substs']:
- set_old_configure_config(
- k[1:-1], v[1:-1] if isinstance(v, types.StringTypes) else v)
- for k, v in dict(raw_config['defines']).iteritems():
- set_old_configure_define(k[1:-1], v[1:-1])
- set_old_configure_config('non_global_defines',
- raw_config['non_global_defines'])
- # Assuming no other option is declared after this function, handle the
- # env options that were injected by mozconfig_options by creating dummy
- # Option instances and having the sandbox's CommandLineHelper handle
- # them. We only do so for options that haven't been declared so far,
- # which should be a proxy for the options that old-configure handles
- # and that we don't know anything about.
- @depends('--help')
- @imports('__sandbox__')
- @imports(_from='mozbuild.configure.options', _import='Option')
- def remaining_mozconfig_options(_):
- helper = __sandbox__._helper
- for arg in helper:
- if helper._origins[arg] != 'mozconfig':
- continue
- name = arg.split('=', 1)[0]
- if name.isupper() and name not in __sandbox__._options:
- option = Option(env=name, nargs='*', help=name)
- helper.handle(option)
- # Please do not add anything after remaining_mozconfig_options()
|