|
@@ -0,0 +1,257 @@
|
|
|
|
+# HG changeset patch
|
|
|
|
+# User Nathan Froyd <froydnj@mozilla.com>
|
|
|
|
+# Date 1506950482 14400
|
|
|
|
+# Mon Oct 02 09:21:22 2017 -0400
|
|
|
|
+# Node ID 2dbb140bb423400ceb523377d2f74bee6a47edea
|
|
|
|
+# Parent 17f2ec08235e7b064033ad5bc283ee34038c67c3
|
|
|
|
+Bug 1373878 - part 2 - build system support for Rust tests; r=rillian
|
|
|
|
+
|
|
|
|
+diff --git a/build/templates.mozbuild b/build/templates.mozbuild
|
|
|
|
+--- a/build/templates.mozbuild
|
|
|
|
++++ b/build/templates.mozbuild
|
|
|
|
+@@ -155,10 +155,17 @@ def DisableStlWrapping():
|
|
|
|
+ @template
|
|
|
|
+ def NoVisibilityFlags():
|
|
|
|
+ COMPILE_FLAGS['VISIBILITY'] = []
|
|
|
|
+
|
|
|
|
+ @template
|
|
|
|
+ def AllowCompilerWarnings():
|
|
|
|
+ COMPILE_FLAGS['WARNINGS_AS_ERRORS'] = []
|
|
|
|
+
|
|
|
|
++@template
|
|
|
|
++def RustTest(name, features=None):
|
|
|
|
++ RUST_TEST = name
|
|
|
|
++
|
|
|
|
++ if features:
|
|
|
|
++ RUST_TEST_FEATURES = features
|
|
|
|
++
|
|
|
|
+ include('gecko_templates.mozbuild')
|
|
|
|
+ include('test_templates.mozbuild')
|
|
|
|
+diff --git a/config/rules.mk b/config/rules.mk
|
|
|
|
+--- a/config/rules.mk
|
|
|
|
++++ b/config/rules.mk
|
|
|
|
+@@ -965,16 +965,28 @@ force-cargo-library-build:
|
|
|
|
+
|
|
|
|
+ force-cargo-library-check:
|
|
|
|
+ $(call CARGO_CHECK,$(target_cargo_env_vars)) --lib $(cargo_target_flag) $(rust_features_flag)
|
|
|
|
+ else
|
|
|
|
+ force-cargo-library-check:
|
|
|
|
+ @true
|
|
|
|
+ endif # RUST_LIBRARY_FILE
|
|
|
|
+
|
|
|
|
++ifdef RUST_TEST
|
|
|
|
++
|
|
|
|
++ifdef RUST_TEST_FEATURES
|
|
|
|
++rust_features_flag := --features "$(RUST_TEST_FEATURES)"
|
|
|
|
++endif
|
|
|
|
++
|
|
|
|
++force-cargo-test-run:
|
|
|
|
++ $(call RUN_CARGO,test $(cargo_target_flag) -p $(RUST_TEST) $(rust_features_flag),$(target_cargo_env_vars))
|
|
|
|
++
|
|
|
|
++check:: force-cargo-test-run
|
|
|
|
++endif
|
|
|
|
++
|
|
|
|
+ ifdef HOST_RUST_LIBRARY_FILE
|
|
|
|
+
|
|
|
|
+ ifdef HOST_RUST_LIBRARY_FEATURES
|
|
|
|
+ host_rust_features_flag := --features "$(HOST_RUST_LIBRARY_FEATURES)"
|
|
|
|
+ endif
|
|
|
|
+
|
|
|
|
+ force-cargo-host-library-build:
|
|
|
|
+ $(REPORT_BUILD)
|
|
|
|
+diff --git a/python/mozbuild/mozbuild/backend/recursivemake.py b/python/mozbuild/mozbuild/backend/recursivemake.py
|
|
|
|
+--- a/python/mozbuild/mozbuild/backend/recursivemake.py
|
|
|
|
++++ b/python/mozbuild/mozbuild/backend/recursivemake.py
|
|
|
|
+@@ -61,16 +61,17 @@ from ..frontend.data import (
|
|
|
|
+ LocalizedPreprocessedFiles,
|
|
|
|
+ ObjdirFiles,
|
|
|
|
+ ObjdirPreprocessedFiles,
|
|
|
|
+ PerSourceFlag,
|
|
|
|
+ Program,
|
|
|
|
+ RustLibrary,
|
|
|
|
+ HostRustLibrary,
|
|
|
|
+ RustProgram,
|
|
|
|
++ RustTest,
|
|
|
|
+ SharedLibrary,
|
|
|
|
+ SimpleProgram,
|
|
|
|
+ Sources,
|
|
|
|
+ StaticLibrary,
|
|
|
|
+ TestManifest,
|
|
|
|
+ VariablePassthru,
|
|
|
|
+ XPIDLFile,
|
|
|
|
+ )
|
|
|
|
+@@ -610,16 +611,19 @@ class RecursiveMakeBackend(CommonBackend
|
|
|
|
+ self._compile_graph[build_target]
|
|
|
|
+
|
|
|
|
+ elif isinstance(obj, HostRustProgram):
|
|
|
|
+ self._process_host_rust_program(obj, backend_file)
|
|
|
|
+ # Hook the program into the compile graph.
|
|
|
|
+ build_target = self._build_target_for_obj(obj)
|
|
|
|
+ self._compile_graph[build_target]
|
|
|
|
+
|
|
|
|
++ elif isinstance(obj, RustTest):
|
|
|
|
++ self._process_rust_test(obj, backend_file)
|
|
|
|
++
|
|
|
|
+ elif isinstance(obj, Program):
|
|
|
|
+ self._process_program(obj, backend_file)
|
|
|
|
+ self._process_linked_libraries(obj, backend_file)
|
|
|
|
+ self._no_skip['syms'].add(backend_file.relobjdir)
|
|
|
|
+
|
|
|
|
+ elif isinstance(obj, HostProgram):
|
|
|
|
+ self._process_host_program(obj.program, backend_file)
|
|
|
|
+ self._process_linked_libraries(obj, backend_file)
|
|
|
|
+@@ -1137,16 +1141,22 @@ class RecursiveMakeBackend(CommonBackend
|
|
|
|
+ 'RUST_PROGRAMS',
|
|
|
|
+ 'RUST_CARGO_PROGRAMS')
|
|
|
|
+
|
|
|
|
+ def _process_host_rust_program(self, obj, backend_file):
|
|
|
|
+ self._process_rust_program_base(obj, backend_file,
|
|
|
|
+ 'HOST_RUST_PROGRAMS',
|
|
|
|
+ 'HOST_RUST_CARGO_PROGRAMS')
|
|
|
|
+
|
|
|
|
++ def _process_rust_test(self, obj, backend_file):
|
|
|
|
++ self._no_skip['check'].add(backend_file.relobjdir)
|
|
|
|
++ backend_file.write_once('CARGO_FILE := $(srcdir)/Cargo.toml\n')
|
|
|
|
++ backend_file.write_once('RUST_TEST := %s\n' % obj.name)
|
|
|
|
++ backend_file.write_once('RUST_TEST_FEATURES := %s\n' % ' '.join(obj.features))
|
|
|
|
++
|
|
|
|
+ def _process_simple_program(self, obj, backend_file):
|
|
|
|
+ if obj.is_unit_test:
|
|
|
|
+ backend_file.write('CPP_UNIT_TESTS += %s\n' % obj.program)
|
|
|
|
+ assert obj.cxx_link
|
|
|
|
+ else:
|
|
|
|
+ backend_file.write('SIMPLE_PROGRAMS += %s\n' % obj.program)
|
|
|
|
+ if not obj.cxx_link and not self.environment.bin_suffix:
|
|
|
|
+ backend_file.write('PROG_IS_C_ONLY_%s := 1\n' % obj.program)
|
|
|
|
+@@ -1258,17 +1268,17 @@ class RecursiveMakeBackend(CommonBackend
|
|
|
|
+ backend_file.write_once('LIBRARY_NAME := %s\n' % libdef.basename)
|
|
|
|
+ backend_file.write('FORCE_STATIC_LIB := 1\n')
|
|
|
|
+ backend_file.write('REAL_LIBRARY := %s\n' % libdef.lib_name)
|
|
|
|
+ if libdef.no_expand_lib:
|
|
|
|
+ backend_file.write('NO_EXPAND_LIBS := 1\n')
|
|
|
|
+
|
|
|
|
+ def _process_rust_library(self, libdef, backend_file):
|
|
|
|
+ backend_file.write_once('%s := %s\n' % (libdef.LIB_FILE_VAR, libdef.import_name))
|
|
|
|
+- backend_file.write('CARGO_FILE := $(srcdir)/Cargo.toml\n')
|
|
|
|
++ backend_file.write_once('CARGO_FILE := $(srcdir)/Cargo.toml\n')
|
|
|
|
+ # Need to normalize the path so Cargo sees the same paths from all
|
|
|
|
+ # possible invocations of Cargo with this CARGO_TARGET_DIR. Otherwise,
|
|
|
|
+ # Cargo's dependency calculations don't work as we expect and we wind
|
|
|
|
+ # up recompiling lots of things.
|
|
|
|
+ target_dir = mozpath.join(backend_file.objdir, libdef.target_dir)
|
|
|
|
+ target_dir = mozpath.normpath(target_dir)
|
|
|
|
+ backend_file.write('CARGO_TARGET_DIR := %s\n' % target_dir)
|
|
|
|
+ if libdef.features:
|
|
|
|
+diff --git a/python/mozbuild/mozbuild/frontend/context.py b/python/mozbuild/mozbuild/frontend/context.py
|
|
|
|
+--- a/python/mozbuild/mozbuild/frontend/context.py
|
|
|
|
++++ b/python/mozbuild/mozbuild/frontend/context.py
|
|
|
|
+@@ -1249,16 +1249,30 @@ VARIABLES = {
|
|
|
|
+
|
|
|
|
+ 'HOST_RUST_LIBRARY_FEATURES': (List, list,
|
|
|
|
+ """Cargo features to activate for this host library.
|
|
|
|
+
|
|
|
|
+ This variable should not be used directly; you should be using the
|
|
|
|
+ HostRustLibrary template instead.
|
|
|
|
+ """),
|
|
|
|
+
|
|
|
|
++ 'RUST_TEST': (unicode, unicode,
|
|
|
|
++ """Name of a Rust test to build and run via `cargo test`.
|
|
|
|
++
|
|
|
|
++ This variable should not be used directly; you should be using the
|
|
|
|
++ RustTest template instead.
|
|
|
|
++ """),
|
|
|
|
++
|
|
|
|
++ 'RUST_TEST_FEATURES': (List, list,
|
|
|
|
++ """Cargo features to activate for RUST_TEST.
|
|
|
|
++
|
|
|
|
++ This variable should not be used directly; you should be using the
|
|
|
|
++ RustTest template instead.
|
|
|
|
++ """),
|
|
|
|
++
|
|
|
|
+ 'UNIFIED_SOURCES': (ContextDerivedTypedList(SourcePath, StrictOrderingOnAppendList), list,
|
|
|
|
+ """Source code files that can be compiled together.
|
|
|
|
+
|
|
|
|
+ This variable contains a list of source code files to compile,
|
|
|
|
+ that can be concatenated all together and built as a single source
|
|
|
|
+ file. This can help make the build faster and reduce the debug info
|
|
|
|
+ size.
|
|
|
|
+ """),
|
|
|
|
+diff --git a/python/mozbuild/mozbuild/frontend/data.py b/python/mozbuild/mozbuild/frontend/data.py
|
|
|
|
+--- a/python/mozbuild/mozbuild/frontend/data.py
|
|
|
|
++++ b/python/mozbuild/mozbuild/frontend/data.py
|
|
|
|
+@@ -481,16 +481,28 @@ class RustProgram(BaseRustProgram):
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ class HostRustProgram(BaseRustProgram):
|
|
|
|
+ SUFFIX_VAR = 'HOST_BIN_SUFFIX'
|
|
|
|
+ KIND = 'host'
|
|
|
|
+ TARGET_SUBST_VAR = 'RUST_HOST_TARGET'
|
|
|
|
+
|
|
|
|
+
|
|
|
|
++class RustTest(ContextDerived):
|
|
|
|
++ __slots__ = (
|
|
|
|
++ 'name',
|
|
|
|
++ 'features',
|
|
|
|
++ )
|
|
|
|
++
|
|
|
|
++ def __init__(self, context, name, features):
|
|
|
|
++ ContextDerived.__init__(self, context)
|
|
|
|
++ self.name = name
|
|
|
|
++ self.features = features
|
|
|
|
++
|
|
|
|
++
|
|
|
|
+ class BaseLibrary(Linkable):
|
|
|
|
+ """Generic context derived container object for libraries."""
|
|
|
|
+ __slots__ = (
|
|
|
|
+ 'basename',
|
|
|
|
+ 'lib_name',
|
|
|
|
+ 'import_name',
|
|
|
|
+ 'refs',
|
|
|
|
+ )
|
|
|
|
+diff --git a/python/mozbuild/mozbuild/frontend/emitter.py b/python/mozbuild/mozbuild/frontend/emitter.py
|
|
|
|
+--- a/python/mozbuild/mozbuild/frontend/emitter.py
|
|
|
|
++++ b/python/mozbuild/mozbuild/frontend/emitter.py
|
|
|
|
+@@ -62,16 +62,17 @@ from .data import (
|
|
|
|
+ ObjdirPreprocessedFiles,
|
|
|
|
+ PerSourceFlag,
|
|
|
|
+ PreprocessedTestWebIDLFile,
|
|
|
|
+ PreprocessedWebIDLFile,
|
|
|
|
+ Program,
|
|
|
|
+ RustLibrary,
|
|
|
|
+ HostRustLibrary,
|
|
|
|
+ RustProgram,
|
|
|
|
++ RustTest,
|
|
|
|
+ SharedLibrary,
|
|
|
|
+ SimpleProgram,
|
|
|
|
+ Sources,
|
|
|
|
+ StaticLibrary,
|
|
|
|
+ TestHarnessFiles,
|
|
|
|
+ TestWebIDLFile,
|
|
|
|
+ TestManifest,
|
|
|
|
+ UnifiedSources,
|
|
|
|
+@@ -1214,16 +1215,25 @@ class TreeMetadataEmitter(LoggingMixin):
|
|
|
|
+ context);
|
|
|
|
+
|
|
|
|
+ for c in components:
|
|
|
|
+ if c.endswith('.manifest'):
|
|
|
|
+ yield ChromeManifestEntry(context, 'chrome.manifest',
|
|
|
|
+ Manifest('components',
|
|
|
|
+ mozpath.basename(c)))
|
|
|
|
+
|
|
|
|
++ if self.config.substs.get('MOZ_RUST_TESTS', None):
|
|
|
|
++ rust_test = context.get('RUST_TEST', None)
|
|
|
|
++ if rust_test:
|
|
|
|
++ # TODO: more sophisticated checking of the declared name vs.
|
|
|
|
++ # contents of the Cargo.toml file.
|
|
|
|
++ features = context.get('RUST_TEST_FEATURES', [])
|
|
|
|
++
|
|
|
|
++ yield RustTest(context, rust_test, features)
|
|
|
|
++
|
|
|
|
+ for obj in self._process_test_manifests(context):
|
|
|
|
+ yield obj
|
|
|
|
+
|
|
|
|
+ for obj in self._process_jar_manifests(context):
|
|
|
|
+ yield obj
|
|
|
|
+
|
|
|
|
+ computed_as_flags.resolve_flags('MOZBUILD',
|
|
|
|
+ context.get('ASFLAGS'))
|