summaryrefslogtreecommitdiffstats
path: root/build/moz.configure/old.configure
diff options
context:
space:
mode:
Diffstat (limited to 'build/moz.configure/old.configure')
-rw-r--r--build/moz.configure/old.configure425
1 files changed, 425 insertions, 0 deletions
diff --git a/build/moz.configure/old.configure b/build/moz.configure/old.configure
new file mode 100644
index 000000000..b32c3f7b7
--- /dev/null
+++ b/build/moz.configure/old.configure
@@ -0,0 +1,425 @@
+# -*- Mode: python; 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/.
+
+@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-android-omx',
+ '--enable-b2g-bt',
+ '--enable-b2g-camera',
+ '--enable-b2g-ril',
+ '--enable-bundled-fonts',
+ '--enable-clang-plugin',
+ '--enable-content-sandbox',
+ '--enable-cookies',
+ '--enable-cpp-rtti',
+ '--enable-crashreporter',
+ '--enable-dbus',
+ '--enable-debug-js-modules',
+ '--enable-directshow',
+ '--enable-dtrace',
+ '--enable-dump-painting',
+ '--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-mobile-optimize',
+ '--enable-mozril-geoloc',
+ '--enable-necko-wifi',
+ '--enable-negotiateauth',
+ '--enable-nfc',
+ '--enable-nspr-build',
+ '--enable-official-branding',
+ '--enable-omx-plugin',
+ '--enable-oom-breakpoint',
+ '--enable-optimize',
+ '--enable-parental-controls',
+ '--enable-pie',
+ '--enable-png-arm-neon-support',
+ '--enable-posix-nspr-emulation',
+ '--enable-pref-extensions',
+ '--enable-pulseaudio',
+ '--enable-raw',
+ '--enable-readline',
+ '--enable-reflow-perf',
+ '--enable-release',
+ '--enable-require-all-d3dc-versions',
+ '--enable-safe-browsing',
+ '--enable-sandbox',
+ '--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-system-sqlite',
+ '--enable-tasktracer',
+ '--enable-thread-sanitizer',
+ '--enable-trace-logging',
+ '--enable-ui-locale',
+ '--enable-universalchardet',
+ '--enable-updater',
+ '--enable-url-classifier',
+ '--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-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-intl-api',
+ '--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-icu',
+ '--with-system-jpeg',
+ '--with-system-libevent',
+ '--with-system-libvpx',
+ '--with-system-nspr',
+ '--with-system-nss',
+ '--with-system-png',
+ '--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',
+)
+@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()