Bug 1239217 - Add the FasterMake+RecursiveMake hybrid backend. r=gps

This commit is contained in:
Mike Hommey 2016-01-22 11:13:26 +09:00
parent e50a6cfd7b
commit 6098e02a36
5 changed files with 63 additions and 3 deletions

View File

@ -123,9 +123,16 @@ default:: $(BUILD_BACKEND_FILES)
endif endif
install_manifests := \ install_manifests := \
$(addprefix dist/,bin branding idl include public private sdk xpi-stage) \ $(addprefix dist/,branding idl include public private sdk xpi-stage) \
_tests \ _tests \
$(NULL) $(NULL)
# Skip the dist/bin install manifest when using the hybrid
# FasterMake/RecursiveMake backend. This is a hack until bug 1241744 moves
# xpidl handling to FasterMake in that case, mechanically making the dist/bin
# install manifest non-existent (non-existent manifests being skipped)
ifeq (,$(filter FasterMake+RecursiveMake,$(BUILD_BACKENDS)))
install_manifests += dist/bin
endif
install_manifest_depends = \ install_manifest_depends = \
CLOBBER \ CLOBBER \
$(configure_dir)/configure \ $(configure_dir)/configure \
@ -145,6 +152,15 @@ endif
.PHONY: install-manifests .PHONY: install-manifests
install-manifests: $(addprefix install-,$(install_manifests)) install-manifests: $(addprefix install-,$(install_manifests))
# If we're using the hybrid FasterMake/RecursiveMake backend, we want
# to recurse in the faster/ directory in parallel of install manifests.
ifneq (,$(filter FasterMake+RecursiveMake,$(BUILD_BACKENDS)))
install-manifests: faster
.PHONY: faster
faster:
$(MAKE) -C faster FASTER_RECURSIVE_MAKE=1
endif
# process_install_manifest needs to be invoked with --no-remove when building # process_install_manifest needs to be invoked with --no-remove when building
# js as standalone because automated builds are building nspr separately and # js as standalone because automated builds are building nspr separately and
# that would remove the resulting files. # that would remove the resulting files.
@ -156,6 +172,12 @@ endif
.PHONY: $(addprefix install-,$(subst /,_,$(install_manifests))) .PHONY: $(addprefix install-,$(subst /,_,$(install_manifests)))
$(addprefix install-,$(install_manifests)): install-%: $(install_manifest_depends) $(addprefix install-,$(install_manifests)): install-%: $(install_manifest_depends)
ifneq (,$(filter FasterMake+RecursiveMake,$(BUILD_BACKENDS)))
@# If we're using the hybrid FasterMake/RecursiveMake backend, we want
@# to ensure the FasterMake end doesn't have install manifests for the
@# same directory, because that would blow up
$(if $(wildcard _build_manifests/install/$(subst /,_,$*)),$(if $(wildcard faster/install_$(subst /,_,$*)*),$(error FasterMake and RecursiveMake ends of the hybrid build system want to handle $*)))
endif
$(addprefix $(call py_action,process_install_manifest,$(if $(NO_REMOVE),--no-remove )$*) ,$(wildcard _build_manifests/install/$(subst /,_,$*))) $(addprefix $(call py_action,process_install_manifest,$(if $(NO_REMOVE),--no-remove )$*) ,$(wildcard _build_manifests/install/$(subst /,_,$*)))
# Dummy wrapper rule to allow the faster backend to piggy back # Dummy wrapper rule to allow the faster backend to piggy back

View File

@ -47,14 +47,19 @@ ifndef NO_XPIDL
default: $(TOPOBJDIR)/config/makefiles/xpidl/xpidl default: $(TOPOBJDIR)/config/makefiles/xpidl/xpidl
endif endif
ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT))
# Mac builds require to copy things in dist/bin/*.app # Mac builds require to copy things in dist/bin/*.app
# TODO: remove the MOZ_WIDGET_TOOLKIT and MOZ_BUILD_APP variables from # TODO: remove the MOZ_WIDGET_TOOLKIT and MOZ_BUILD_APP variables from
# faster/Makefile and python/mozbuild/mozbuild/test/backend/test_build.py # faster/Makefile and python/mozbuild/mozbuild/test/backend/test_build.py
# when this is not required anymore. # when this is not required anymore.
# We however don't need to do this when using the hybrid
# FasterMake/RecursiveMake backend (FASTER_RECURSIVE_MAKE is set when
# recursing from the RecursiveMake backend)
ifndef FASTER_RECURSIVE_MAKE
ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT))
default: default:
$(MAKE) -C $(TOPOBJDIR)/$(MOZ_BUILD_APP)/app repackage $(MAKE) -C $(TOPOBJDIR)/$(MOZ_BUILD_APP)/app repackage
endif endif
endif
.PHONY: FORCE .PHONY: FORCE

View File

@ -8,12 +8,18 @@ backends = {
'CompileDB': 'mozbuild.compilation.database', 'CompileDB': 'mozbuild.compilation.database',
'CppEclipse': 'mozbuild.backend.cpp_eclipse', 'CppEclipse': 'mozbuild.backend.cpp_eclipse',
'FasterMake': 'mozbuild.backend.fastermake', 'FasterMake': 'mozbuild.backend.fastermake',
'FasterMake+RecursiveMake': None,
'RecursiveMake': 'mozbuild.backend.recursivemake', 'RecursiveMake': 'mozbuild.backend.recursivemake',
'VisualStudio': 'mozbuild.backend.visualstudio', 'VisualStudio': 'mozbuild.backend.visualstudio',
} }
def get_backend_class(name): def get_backend_class(name):
if '+' in name:
from mozbuild.backend.base import HybridBackend
return HybridBackend(*(get_backend_class(name)
for name in name.split('+')))
class_name = '%sBackend' % name class_name = '%sBackend' % name
module = __import__(backends[name], globals(), locals(), [class_name]) module = __import__(backends[name], globals(), locals(), [class_name])
return getattr(module, class_name) return getattr(module, class_name)

View File

@ -126,7 +126,9 @@ class FasterMakeBackend(CommonBackend, PartialBackend):
'MOZ_BUILD_APP', 'MOZ_BUILD_APP',
'MOZ_WIDGET_TOOLKIT', 'MOZ_WIDGET_TOOLKIT',
): ):
mk.add_statement('%s = %s' % (var, self.environment.substs[var])) value = self.environment.substs.get(var)
if value is not None:
mk.add_statement('%s = %s' % (var, value))
install_manifests_bases = self._install_manifests.keys() install_manifests_bases = self._install_manifests.keys()

View File

@ -12,6 +12,7 @@ import unittest
import mozpack.path as mozpath import mozpack.path as mozpath
from contextlib import contextmanager from contextlib import contextmanager
from mozunit import main from mozunit import main
from mozbuild.backend import get_backend_class
from mozbuild.backend.configenvironment import ConfigEnvironment from mozbuild.backend.configenvironment import ConfigEnvironment
from mozbuild.backend.recursivemake import RecursiveMakeBackend from mozbuild.backend.recursivemake import RecursiveMakeBackend
from mozbuild.backend.fastermake import FasterMakeBackend from mozbuild.backend.fastermake import FasterMakeBackend
@ -92,6 +93,30 @@ class TestBuild(unittest.TestCase):
self.validate(config) self.validate(config)
def test_faster_recursive_make(self):
substs = list(BASE_SUBSTS) + [
('BUILD_BACKENDS', 'FasterMake+RecursiveMake'),
]
with self.do_test_backend(get_backend_class(
'FasterMake+RecursiveMake'), substs=substs) as config:
buildid = mozpath.join(config.topobjdir, 'config', 'buildid')
ensureParentDir(buildid)
with open(buildid, 'w') as fh:
fh.write('20100101012345\n')
build = MozbuildObject(config.topsrcdir, None, None,
config.topobjdir)
overrides = [
'install_manifest_depends=',
'MOZ_CHROME_FILE_FORMAT=flat',
'TEST_MOZBUILD=1',
]
with self.line_handler() as handle_make_line:
build._run_make(directory=config.topobjdir, target=overrides,
silent=False, line_handler=handle_make_line)
self.validate(config)
def test_faster_make(self): def test_faster_make(self):
substs = list(BASE_SUBSTS) + [ substs = list(BASE_SUBSTS) + [
('MOZ_BUILD_APP', 'dummy_app'), ('MOZ_BUILD_APP', 'dummy_app'),