Pull in native_client and build tests.
NaCl has not been added to the default developer workflow, yet. You must point
your .gclient file at DEPS.nacl and pass --nacl to mojob.py.
BUG=https://code.google.com/p/chromium/issues/detail?id=401761
R=jamesr@chromium.org
Review URL: https://codereview.chromium.org/840653003
diff --git a/.gitignore b/.gitignore
index 17cec23..41c17be 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,6 +22,7 @@
/c
/dart/
/mojo/public/tools/prebuilt/
+/native_client/
/out/
/out_*/
/sdch/open-vcdiff/
diff --git a/DEPS.nacl b/DEPS.nacl
new file mode 100644
index 0000000..37dc80d
--- /dev/null
+++ b/DEPS.nacl
@@ -0,0 +1,29 @@
+import gclient_utils
+import os
+
+path = gclient_utils.FindGclientRoot(os.getcwd())
+execfile(os.path.join(path, 'src', 'DEPS')) # Include proper Mojo DEPS.
+
+# Now we need to add in NaCl.
+
+vars.update({
+ 'nacl_revision': 'c71d65ffcb0e7a1f35eacfd37c327ca5edfa647e', # from svn revision r14268
+})
+
+deps.update({
+ 'src/native_client':
+ Var('chromium_git') + '/native_client/src/native_client.git' + '@' + Var('nacl_revision'),
+})
+
+hooks.append({
+ # This downloads binaries for Native Client's newlib toolchain.
+ # Done in lieu of building the toolchain from scratch as it can take
+ # anywhere from 30 minutes to 4 hours depending on platform to build.
+ 'name': 'nacltools',
+ 'pattern': '.',
+ 'action': [
+ 'python', 'src/build/download_nacl_toolchains.py',
+ '--packages', 'pnacl_newlib',
+ 'sync', '--extract',
+ ],
+})
diff --git a/mojo/BUILD.gn b/mojo/BUILD.gn
index ab86729..2299f4f 100644
--- a/mojo/BUILD.gn
+++ b/mojo/BUILD.gn
@@ -11,6 +11,7 @@
testonly = true
declare_args() {
mojo_use_go = false
+ mojo_use_nacl = false
}
deps = [
":tests",
@@ -34,6 +35,13 @@
if (is_linux) {
deps += [ "//mojo/python" ]
}
+
+ if (mojo_use_nacl) {
+ deps += [
+ "//mojo/nacl:mojo_nacl",
+ "//mojo/nacl:mojo_nacl_tests",
+ ]
+ }
}
group("tests") {
diff --git a/mojo/nacl/BUILD.gn b/mojo/nacl/BUILD.gn
new file mode 100644
index 0000000..4315245
--- /dev/null
+++ b/mojo/nacl/BUILD.gn
@@ -0,0 +1,103 @@
+# All toolchains use the same generated code.
+gen_dir = "$root_build_dir/gen/mojo/nacl"
+
+# Only allow the generator to be run by one toolchain.
+if (current_toolchain == default_toolchain) {
+ # Generate the code to plumb the Mojo public API into the NaCl sandbox.
+ action("mojo_nacl_codegen") {
+ script = "generator/generate_nacl_bindings.py"
+ args = [
+ "-d",
+ rebase_path(gen_dir, root_build_dir),
+ ]
+ inputs = [
+ script,
+ "generator/interface.py",
+ "generator/interface_dsl.py",
+ "generator/mojo_syscall.cc.tmpl",
+ "generator/libmojo.cc.tmpl",
+ ]
+ outputs = [
+ "$gen_dir/mojo_syscall.cc",
+ "$gen_dir/libmojo.cc",
+ ]
+ }
+}
+
+# Trusted code
+if (!is_nacl) {
+ # A library for launching a NaCl sandbox connected to a Mojo embedder.
+ static_library("monacl_sel") {
+ sources = [
+ "mojo_syscall_internal.h",
+ "$gen_dir/mojo_syscall.cc",
+ "monacl_sel_main.cc",
+ ]
+ deps = [
+ # This target makes sure we have all the pre-processor defines needed to
+ # use NaCl's headers.
+ "//native_client/build/config/nacl:nacl_base",
+ "//native_client/src/trusted/desc:nrd_xfer",
+ "//native_client/src/trusted/service_runtime:sel_main_chrome",
+ ":mojo_nacl_codegen($default_toolchain)",
+ ]
+ }
+
+ # A simple shell for running untrusted binaries that talk to the Mojo
+ # embedder. (No services.)
+ executable("monacl_shell") {
+ testonly = true
+ sources = [
+ "monacl_shell.cc",
+ ]
+ deps = [
+ "//base:base",
+ "//mojo/edk/system:system",
+ ":monacl_sel",
+ ]
+ }
+}
+
+# Untrusted code
+if (is_nacl) {
+ # Thunk mapping the Mojo public API onto NaCl syscalls.
+ static_library("mojo") {
+ sources = [
+ "$gen_dir/libmojo.cc",
+ ]
+ deps = [
+ ":mojo_nacl_codegen($default_toolchain)",
+ ]
+ }
+
+ # Unit test for the Mojo public API.
+ executable("monacl_test") {
+ testonly = true
+ sources = [
+ "//mojo/public/cpp/system/tests/core_unittest.cc",
+ "//mojo/public/cpp/system/tests/macros_unittest.cc",
+ ]
+ deps = [
+ "//native_client/src/untrusted/nacl:imc_syscalls",
+ "//mojo/public/c/system/tests:tests",
+ "//mojo/public/cpp/system:system",
+ "//testing/gtest:gtest",
+ "//testing/gtest:gtest_main",
+ ":mojo",
+ ]
+ }
+}
+
+group("mojo_nacl") {
+ deps = [
+ "//native_client/src/untrusted/irt:irt_core(//native_client/build/toolchain/nacl:irt_${cpu_arch})",
+ ]
+}
+
+group("mojo_nacl_tests") {
+ testonly = true
+ deps = [
+ ":monacl_shell",
+ ":monacl_test(//native_client/build/toolchain/nacl:clang_newlib_${cpu_arch})",
+ ]
+}
diff --git a/mojo/tools/mojob.py b/mojo/tools/mojob.py
index 9419ce5..ff1cb28 100755
--- a/mojo/tools/mojob.py
+++ b/mojo/tools/mojob.py
@@ -52,6 +52,9 @@
if 'with_dart' in args:
additional_args['with_dart'] = args.with_dart
+ if 'nacl' in args:
+ additional_args['use_nacl'] = args.nacl
+
if 'dry_run' in args:
additional_args['dry_run'] = args.dry_run
@@ -100,6 +103,9 @@
if config.values['with_dart']:
gn_args.append('mojo_use_dart=true')
+ if config.values['use_nacl']:
+ gn_args.append('mojo_use_nacl=true')
+
if config.target_os == Config.OS_ANDROID:
gn_args.append(r'''os=\"android\" cpu_arch=\"arm\"''')
elif config.target_os == Config.OS_CHROMEOS:
@@ -216,6 +222,7 @@
gn_parser.set_defaults(func=gn)
gn_parser.add_argument('--with-dart', help='Configure the Dart bindings',
action='store_true')
+ gn_parser.add_argument('--nacl', help='Add in NaCl', action='store_true')
clang_group = gn_parser.add_mutually_exclusive_group()
clang_group.add_argument('--clang', help='Use Clang (default)', default=None,
action='store_true')