1 # This Source Code Form is subject to the terms of the Mozilla Public
2 # License, v. 2.0. If a copy of the MPL was not distributed with this
3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 @depends(check_build_environment, prepare_configure_options, prepare_mozconfig,
6 old_configure, old_configure_assignments, '--cache-file')
13 @imports(_from='__main__', _import='config_status')
14 @imports(_from='__builtin__', _import='OSError')
15 @imports(_from='__builtin__', _import='open')
16 @imports(_from='__builtin__', _import='object')
17 @imports(_from='mozbuild.configure', _import='ConfigureSandbox')
18 @imports(_from='mozbuild.configure.util', _import='ConfigureOutputHandler')
19 def js_subconfigure(build_env, prepare_configure_options, mozconfig,
20 old_configure, old_configure_assignments, cache_file):
22 class PrefixOutput(object):
23 def __init__(self, prefix, fh):
25 self._begin_line = True
28 def write(self, content):
30 self._fh.write(self._prefix)
31 self._fh.write(('\n' + self._prefix).join(content.splitlines()))
32 self._begin_line = content.endswith('\n')
39 logger = logging.getLogger('moz.configure')
40 formatter = logging.Formatter('js/src> %(levelname)s: %(message)s')
41 for handler in logger.handlers:
42 handler.setFormatter(formatter)
43 if isinstance(handler, ConfigureOutputHandler):
44 handler._stdout = PrefixOutput('js/src> ', handler._stdout)
46 substs = dict(old_configure['substs'])
47 assignments = dict(old_configure_assignments)
48 environ = dict(os.environ)
49 if prepare_configure_options.extra_env:
50 environ.update(prepare_configure_options.extra_env)
53 o for o in prepare_configure_options.options
54 # --with-system-nspr will have been converted into the relevant $NSPR_CFLAGS
56 if not o.startswith('--with-system-nspr')
59 if not substs.get('ENABLE_INTL_API'):
60 options.append('--without-intl-api')
62 if substs.get('NSPR_CFLAGS') or substs.get('NSPR_LIBS'):
64 '--with-nspr-cflags=%s' % ' '.join(substs.get('NSPR_CFLAGS', [])))
66 '--with-nspr-libs=%s' % ' '.join(substs.get('NSPR_LIBS', [])))
68 options.append('--prefix=%s/dist' % build_env.topobjdir)
70 if substs.get('ZLIB_IN_MOZGLUE'):
71 substs['MOZ_ZLIB_LIBS'] = ''
73 environ['MOZILLA_CENTRAL_PATH'] = build_env.topsrcdir
74 if 'MOZ_BUILD_APP' in environ:
75 del environ['MOZ_BUILD_APP']
77 # Here, we mimic what we used to do from old-configure, which makes this
80 # The following variables were saved at the beginning of old-configure,
81 # and restored before invoking the subconfigure. Which means their value
82 # should be taken from the old_configure_assignments or mozconfig.
83 from_assignment = set(
84 ('CC', 'CXX', 'CPPFLAGS', 'CFLAGS', 'CXXFLAGS', 'LDFLAGS', 'HOST_CC',
85 'HOST_CXXFLAGS', 'HOST_LDFLAGS'))
87 # Variables that were explicitly exported from old-configure, and those
88 # explicitly set in the environment when invoking old-configure, were
89 # automatically inherited from subconfigure. We assume the relevant ones
90 # have a corresponding AC_SUBST in old-configure, making them available
92 for var in itertools.chain((
93 'MOZ_SYSTEM_ZLIB', 'MOZ_ZLIB_CFLAGS', 'MOZ_ZLIB_LIBS',
94 'MOZ_APP_NAME', 'MOZ_APP_REMOTINGNAME', 'MOZ_DEV_EDITION',
95 'STLPORT_LIBS', 'DIST', 'MOZ_LINKER', 'ZLIB_IN_MOZGLUE', 'RANLIB',
96 'AR', 'CPP', 'CC', 'CXX', 'CPPFLAGS', 'CFLAGS', 'CXXFLAGS',
97 'LDFLAGS', 'HOST_CC', 'HOST_CXX', 'HOST_CPPFLAGS',
98 'HOST_CXXFLAGS', 'HOST_LDFLAGS'
99 ), prepare_configure_options.extra_env):
100 if var not in from_assignment and var in substs:
102 elif var in assignments:
103 value = assignments[var]
104 elif mozconfig and var in mozconfig and \
105 not mozconfig[var][1].startswith('removed'):
106 value = mozconfig[var][0]
109 if isinstance(value, list):
110 value = ' '.join(value)
113 options.append('JS_STANDALONE=')
115 srcdir = os.path.join(build_env.topsrcdir, 'js', 'src')
116 objdir = os.path.join(build_env.topobjdir, 'js', 'src')
118 data_file = os.path.join(objdir, 'configure.pkl')
120 if os.path.exists(data_file):
121 with open(data_file, 'rb') as f:
122 previous_args = pickle.load(f)
124 cache_file = cache_file or './config.cache'
125 cache_file = os.path.join(build_env.topobjdir, cache_file)
130 if e.errno != errno.EEXIST:
133 with open(data_file, 'wb') as f:
134 pickle.dump(options, f)
136 # Only run configure if one of the following is true:
137 # - config.status doesn't exist
138 # - config.status is older than an input to configure
139 # - the configure arguments changed
140 configure = os.path.join(srcdir, 'old-configure')
141 config_status_path = os.path.join(objdir, 'config.status')
142 skip_configure = True
143 if not os.path.exists(config_status_path):
144 skip_configure = False
146 config_status_deps = os.path.join(objdir, 'config_status_deps.in')
147 if not os.path.exists(config_status_deps):
148 skip_configure = False
150 with open(config_status_deps, 'r') as fh:
151 dep_files = fh.read().splitlines() + [configure]
152 if (any(not os.path.exists(f) or
153 (os.path.getmtime(config_status_path) < os.path.getmtime(f))
154 for f in dep_files) or
155 ((previous_args or options) != options)):
156 skip_configure = False
159 if not skip_configure:
163 os.path.join(build_env.topsrcdir, 'configure.py'),
164 '--enable-project=js',
166 environ['OLD_CONFIGURE'] = os.path.join(
167 os.path.dirname(configure), 'old-configure')
169 command += ['--cache-file=%s' % cache_file]
171 log.info('configuring')
172 log.info('running %s' % ' '.join(command[:-1]))
174 sandbox = ConfigureSandbox(config, environ, command, logger=logger)
175 sandbox.run(os.path.join(build_env.topsrcdir, 'moz.configure'))
176 ret = config_status(config)
179 # Restore unprefixed logging.
180 formatter = logging.Formatter('%(levelname)s: %(message)s')
181 for handler in logger.handlers:
182 handler.setFormatter(formatter)
183 if isinstance(handler, ConfigureOutputHandler):
184 handler._stdout.flush()
185 handler._stdout = handler._stdout._fh