summaryrefslogtreecommitdiffstats
path: root/build/moz.configure/node.configure
diff options
context:
space:
mode:
Diffstat (limited to 'build/moz.configure/node.configure')
-rw-r--r--build/moz.configure/node.configure90
1 files changed, 90 insertions, 0 deletions
diff --git a/build/moz.configure/node.configure b/build/moz.configure/node.configure
new file mode 100644
index 0000000000..66668e7861
--- /dev/null
+++ b/build/moz.configure/node.configure
@@ -0,0 +1,90 @@
+# -*- 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/.
+
+option("--disable-nodejs", help="Require Node.js to build")
+option(env="NODEJS", nargs=1, help="Path to nodejs")
+
+
+@depends(
+ "--enable-nodejs",
+ "NODEJS",
+ bootstrap_search_path("node", when=depends("NODEJS")(lambda x: not x)),
+ host,
+)
+@checking(
+ "for nodejs", callback=lambda x: "%s (%s)" % (x.path, x.str_version) if x else "no"
+)
+@imports(_from="mozbuild.nodeutil", _import="find_node_executable")
+@imports(_from="mozbuild.nodeutil", _import="NODE_MIN_VERSION")
+@imports(_from="__builtin__", _import="OSError")
+@imports("errno")
+def nodejs(require, env_node, search_path, host):
+ # We don't use the dependency directly, but having it ensures the
+ # auto-upgrade code in bootstrap_search_path is triggered, while
+ # find_node_executable will use more or less the same search path.
+ # We do however need to use the variable for the configure lint
+ # not to fail.
+ search_path
+
+ node_exe = env_node[0] if env_node else None
+
+ try:
+ nodejs, version = find_node_executable(node_exe)
+ except OSError as e:
+ if host.cpu == "aarch64" and host.os == "OSX" and e.errno == errno.EBADARCH:
+ # Ideally we'd do it when --enable-bootstrap is set, but when we're wrapped in
+ # mach build or mach configure, running the command doesn't print anything and
+ # waits on input (for license agreement) that it can't actually get.
+ # mach bootstrap should have taken care of it anyways, but in case it hasn't,
+ # it's simpler to ask to run the rosetta install than the whole mach bootstrap.
+ die(
+ "Rosetta is needed to run node. Please run `softwareupdate --install-rosetta`"
+ )
+ raise
+
+ MAYBE_FILE_A_BUG = """
+
+ Executing `mach bootstrap --no-system-changes` should
+ install a compatible version in ~/.mozbuild on most platforms.
+ If you believe this is a bug, <https://mzl.la/2vLbXAv> is a good way
+ to file. More details: <https://bit.ly/2BbyD1E>
+ """
+
+ if not nodejs:
+ msg = (
+ "could not find Node.js executable later than %s; ensure "
+ "`node` or `nodejs` is in PATH or set NODEJS in environment "
+ "to point to an executable.%s" % (NODE_MIN_VERSION, MAYBE_FILE_A_BUG)
+ )
+
+ if require:
+ raise FatalCheckError(msg)
+ else:
+ log.warning(msg)
+ log.warning("(This will become an error in the near future.)")
+ return
+
+ if not version:
+ msg = "NODEJS must point to node %s or newer; found node location: %s. %s" % (
+ NODE_MIN_VERSION,
+ nodejs,
+ MAYBE_FILE_A_BUG,
+ )
+
+ if require:
+ raise FatalCheckError(msg)
+ else:
+ log.warning(msg)
+ return
+
+ return namespace(
+ path=nodejs,
+ version=version,
+ str_version=".".join(str(v) for v in version),
+ )
+
+
+set_config("NODEJS", depends_if(nodejs)(lambda p: p.path))