@@ -243,8 +243,14 @@ and expect the file to have sha256sum `09bea8f4ec41e9079fa03093d3b2db7ac5c533185
243243 ),
244244}
245245
246- NODE_DIR = "bin/nodejs"
247- YARN_DIR = "bin/yarnpkg"
246+ BUILT_IN_NODE_PLATFORMS = [
247+ "darwin_amd64" ,
248+ "linux_amd64" ,
249+ "windows_amd64" ,
250+ ]
251+
252+ NODE_EXTRACT_DIR = "bin/nodejs"
253+ YARN_EXTRACT_DIR = "bin/yarnpkg"
248254
249255GET_SCRIPT_DIR = """
250256# From stackoverflow.com
@@ -268,24 +274,25 @@ def _download_node(repository_ctx):
268274 """
269275 if repository_ctx .attr .vendored_node :
270276 return
271- if repository_ctx .name == "nodejs" :
272- host = os_name (repository_ctx )
273- else :
274- host = repository_ctx .name .split ("nodejs_" , 1 )[1 ]
277+
278+ # The host is baked into the repository name by design.
279+ # Current these workspaces are:
280+ # @nodejs_PLATFORM where PLATFORM is one of BUILT_IN_NODE_PLATFORMS
281+ host_os = repository_ctx .name .split ("nodejs_" , 1 )[1 ]
282+
275283 node_version = repository_ctx .attr .node_version
276284 node_repositories = repository_ctx .attr .node_repositories
277285 node_urls = repository_ctx .attr .node_urls
278286
279287 # Download node & npm
280- node_host_version = "{}-{}" .format (node_version , host )
281- if node_host_version in node_repositories :
282- filename , strip_prefix , sha256 = node_repositories [node_host_version ]
283- else :
284- fail ("Unknown NodeJS host/version {}" .format (node_host_version ))
288+ version_host_os = "%s-%s" % (node_version , host_os )
289+ if not version_host_os in node_repositories :
290+ fail ("Unknown NodeJS version-host %s" % version_host_os )
291+ filename , strip_prefix , sha256 = node_repositories [version_host_os ]
285292
286293 repository_ctx .download_and_extract (
287294 url = [url .format (version = node_version , filename = filename ) for url in node_urls ],
288- output = NODE_DIR ,
295+ output = NODE_EXTRACT_DIR ,
289296 stripPrefix = strip_prefix ,
290297 sha256 = sha256 ,
291298 )
@@ -306,11 +313,11 @@ def _download_yarn(repository_ctx):
306313 if yarn_version in yarn_repositories :
307314 filename , strip_prefix , sha256 = yarn_repositories [yarn_version ]
308315 else :
309- fail ("Unknown Yarn version {}" . format ( yarn_version ) )
316+ fail ("Unknown Yarn version %s" % yarn_version )
310317
311318 repository_ctx .download_and_extract (
312319 url = [url .format (version = yarn_version , filename = filename ) for url in yarn_urls ],
313- output = YARN_DIR ,
320+ output = YARN_EXTRACT_DIR ,
314321 stripPrefix = strip_prefix ,
315322 sha256 = sha256 ,
316323 )
@@ -353,8 +360,8 @@ def _prepare_node(repository_ctx):
353360 "lib/node_modules/npm/bin/npm-cli.js" if not is_windows else "node_modules/npm/bin/npm-cli.js" ,
354361 ] if f ])
355362 else :
356- node_exec = "{} /bin/node". format ( NODE_DIR ) if not is_windows else "{} /node.exe". format ( NODE_DIR )
357- npm_script = "{} /lib/node_modules/npm/bin/npm-cli.js". format ( NODE_DIR ) if not is_windows else "{} /node_modules/npm/bin/npm-cli.js". format ( NODE_DIR )
363+ node_exec = ( "%s /bin/node" % NODE_EXTRACT_DIR ) if not is_windows else ( "%s /node.exe" % NODE_EXTRACT_DIR )
364+ npm_script = ( "%s /lib/node_modules/npm/bin/npm-cli.js" % NODE_EXTRACT_DIR ) if not is_windows else ( "%s /node_modules/npm/bin/npm-cli.js" % NODE_EXTRACT_DIR )
358365 node_exec_label = node_exec
359366 if repository_ctx .attr .vendored_yarn :
360367 yarn_script = "/" .join ([f for f in [
@@ -365,7 +372,7 @@ def _prepare_node(repository_ctx):
365372 "bin/yarn.js" ,
366373 ] if f ])
367374 else :
368- yarn_script = "{} /bin/yarn.js" . format ( YARN_DIR )
375+ yarn_script = "%s /bin/yarn.js" % YARN_EXTRACT_DIR
369376 node_entry = "bin/node" if not is_windows else "bin/node.cmd"
370377 npm_node_repositories_entry = "bin/npm_node_repositories" if not is_windows else "bin/npm_node_repositories.cmd"
371378 yarn_node_repositories_entry = "bin/yarn_node_repositories" if not is_windows else "bin/yarn_node_repositories.cmd"
@@ -420,8 +427,8 @@ CALL "%SCRIPT_DIR%\\{node}" {args} %*
420427# Immediately exit if any command fails.
421428set -e
422429# Generated by node_repositories.bzl
423- export NODE_REPOSITORY_ARGS={}
424- """ .format (node_repo_args ), executable = True )
430+ export NODE_REPOSITORY_ARGS={args }
431+ """ .format (args = node_repo_args ), executable = True )
425432
426433 # The entry points for npm for osx/linux and windows
427434 # Runs npm using appropriate node entry point
@@ -609,18 +616,29 @@ node_repositories_rule = repository_rule(
609616)
610617
611618def _nodejs_host_os_alias_impl (repository_ctx ):
612- host_os = os_name (repository_ctx )
613- node_repository = "@nodejs_%s" % host_os
614619 is_windows_host = is_windows_os (repository_ctx )
615620 file_ending = ".cmd" if is_windows_host else ""
616- actual_node_bin = "bin/nodejs/node.exe" if is_windows_host else "bin/nodejs/bin/node"
621+ node_repository = "@nodejs_%s" % os_name (repository_ctx )
622+ if repository_ctx .attr .vendored_node :
623+ node_bin_repository = "@%s" % repository_ctx .attr .vendored_node .workspace_name
624+ actual_node_bin = "/" .join ([f for f in [
625+ repository_ctx .attr .vendored_node .package ,
626+ repository_ctx .attr .vendored_node .name ,
627+ "bin/node" if not is_windows_host else "node.exe" ,
628+ ] if f ])
629+ else :
630+ node_bin_repository = node_repository
631+ actual_node_bin = "%s/%s" % (
632+ NODE_EXTRACT_DIR ,
633+ "node.exe" if is_windows_host else "bin/node" ,
634+ )
617635 repository_ctx .template (
618636 "BUILD.bazel" ,
619637 Label ("@build_bazel_rules_nodejs//internal/node:BUILD.nodejs_host_os_alias.tpl" ),
620638 substitutions = {
621639 "TEMPLATE__npm_node_repositories" : "%s//:bin/npm_node_repositories%s" % (node_repository , file_ending ),
622640 "TEMPLATE__yarn_node_repositories" : "%s//:bin/yarn_node_repositories%s" % (node_repository , file_ending ),
623- "TEMPLATE_actual_node_bin" : "%s//:%s" % (node_repository , actual_node_bin ),
641+ "TEMPLATE_actual_node_bin" : "%s//:%s" % (node_bin_repository , actual_node_bin ),
624642 "TEMPLATE_node_repo_args" : "%s//:bin/node_repo_args.sh" % node_repository ,
625643 "TEMPLATE_npm" : "%s//:bin/npm%s" % (node_repository , file_ending ),
626644 "TEMPLATE_run_npm" : "%s//:run_npm.sh.template" % node_repository ,
@@ -632,9 +650,12 @@ def _nodejs_host_os_alias_impl(repository_ctx):
632650
633651_nodejs_repo_host_os_alias = repository_rule (
634652 _nodejs_host_os_alias_impl ,
653+ attrs = {
654+ "vendored_node" : attr .label (allow_single_file = True ),
655+ },
635656)
636657
637- def node_repositories (package_json = [], ** kwargs ):
658+ def node_repositories (** kwargs ):
638659 """
639660 Wrapper macro around node_repositories_rule to call it for each platform, register bazel toolchains,
640661 and make other convenience repositories.
@@ -652,14 +673,16 @@ def node_repositories(package_json = [], **kwargs):
652673 minimum_bazel_version = "0.21.0" ,
653674 )
654675
676+ vendored_node = kwargs .pop ("vendored_node" , None )
677+
655678 # This needs to be setup so toolchains can access nodejs for all different versions
656679 for os_arch_name in OS_ARCH_NAMES :
657680 os_name = "_" .join (os_arch_name )
658681 node_repository_name = "nodejs_%s" % os_name
659682 _maybe (
660683 node_repositories_rule ,
661684 name = node_repository_name ,
662- package_json = package_json ,
685+ vendored_node = vendored_node ,
663686 ** kwargs
664687 )
665688 native .register_toolchains ("@build_bazel_rules_nodejs//toolchains/node:node_%s_toolchain" % os_arch_name [0 ])
@@ -673,6 +696,7 @@ def node_repositories(package_json = [], **kwargs):
673696 _maybe (
674697 _nodejs_repo_host_os_alias ,
675698 name = "nodejs" ,
699+ vendored_node = vendored_node ,
676700 )
677701
678702 _maybe (
0 commit comments