mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	.bzl is the extension for Skylark, a subset of Python that is used to define build extensions for the Bazel build system. Eg: https://github.com/bazelbuild/bazel/blob/master/tools/build_rules/closure/closure_js_binary.bzl
		
			
				
	
	
		
			125 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Copyright 2015 The Bazel Authors. All Rights Reserved.
 | |
| #
 | |
| # Licensed under the Apache License, Version 2.0 (the "License");
 | |
| # you may not use this file except in compliance with the License.
 | |
| # You may obtain a copy of the License at
 | |
| #
 | |
| #     http://www.apache.org/licenses/LICENSE-2.0
 | |
| #
 | |
| # Unless required by applicable law or agreed to in writing, software
 | |
| # distributed under the License is distributed on an "AS IS" BASIS,
 | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| # See the License for the specific language governing permissions and
 | |
| # limitations under the License.
 | |
| 
 | |
| """Build definitions for JavaScript binaries compiled with the Closure Compiler.
 | |
| 
 | |
| A single file is produced with the _compiled.js suffix.
 | |
| 
 | |
| By default, the name of the entry point is assumed to be the same as that of the
 | |
| build target. This behaviour may be overridden with the "main" attribute.
 | |
| 
 | |
| The optimization level may be set with the "compilation_level" attribute.
 | |
| Supported values are: unobfuscated, simple, and advanced.
 | |
| 
 | |
| Example:
 | |
| 
 | |
|   closure_js_binary(
 | |
|       name = "hello",
 | |
|       compilation_level = "simple",
 | |
|       language_in = "ecmascript6",
 | |
|       language_out = "ecmascript3",
 | |
|       externs = ["//third_party/javascript/google_cast/cast.js"],
 | |
|       deps = [
 | |
|           "@closure_library//:closure_library",
 | |
|           ":hello_lib",
 | |
|       ],
 | |
|   )
 | |
| 
 | |
| This rule will produce hello_combined.js.
 | |
| """
 | |
| 
 | |
| _COMPILATION_LEVELS = {
 | |
|   "whitespace_only": [
 | |
|       "--compilation_level=WHITESPACE_ONLY",
 | |
|       "--formatting=PRETTY_PRINT"
 | |
|   ],
 | |
|   "simple": ["--compilation_level=SIMPLE"],
 | |
|   "advanced": ["--compilation_level=ADVANCED"]
 | |
| }
 | |
| 
 | |
| _SUPPORTED_LANGUAGES = {
 | |
|   "es3": ["ES3"],
 | |
|   "ecmascript3": ["ECMASCRIPT3"],
 | |
|   "es5": ["ES5"],
 | |
|   "ecmascript5": ["ECMASCRIPT5"],
 | |
|   "es5_strict": ["ES5_STRICT"],
 | |
|   "ecmascript5_strict": ["ECMASCRIPT5_STRICT"],
 | |
|   "es6": ["ES6"],
 | |
|   "ecmascript6": ["ECMASCRIPT6"],
 | |
|   "es6_strict": ["ES6_STRICT"],
 | |
|   "ecmascript6_strict": ["ECMASCRIPT6_STRICT"],
 | |
|   "es6_typed": ["ES6_TYPED"],
 | |
|   "ecmascript6_typed": ["ECMASCRIPT6_TYPED"],
 | |
| }
 | |
| 
 | |
| def _impl(ctx):
 | |
|   externs = set(order="compile")
 | |
|   srcs = set(order="compile")
 | |
|   for dep in ctx.attr.deps:
 | |
|     externs += dep.transitive_js_externs
 | |
|     srcs += dep.transitive_js_srcs
 | |
| 
 | |
|   args = [
 | |
|       "--entry_point=goog:%s" % ctx.attr.main,
 | |
|       "--js_output_file=%s" % ctx.outputs.out.path,
 | |
|       "--dependency_mode=LOOSE",
 | |
|       "--warning_level=VERBOSE",
 | |
|   ] + (["--js=%s" % src.path for src in srcs] +
 | |
|        ["--externs=%s" % extern.path for extern in externs])
 | |
| 
 | |
|   # Set the compilation level.
 | |
|   if ctx.attr.compilation_level in _COMPILATION_LEVELS:
 | |
|     args += _COMPILATION_LEVELS[ctx.attr.compilation_level]
 | |
|   else:
 | |
|     fail("Invalid compilation_level '%s', expected one of %s" %
 | |
|          (ctx.attr.compilation_level, _COMPILATION_LEVELS.keys()))
 | |
| 
 | |
|   # Set the language in.
 | |
|   if ctx.attr.language_in in _SUPPORTED_LANGUAGES:
 | |
|     args += "--language_in=" + _SUPPORTED_LANGUAGES[ctx.attr.language_in]
 | |
|   else:
 | |
|     fail("Invalid language_in '%s', expected one of %s" %
 | |
|          (ctx.attr.language_in, _SUPPORTED_LANGUAGES.keys()))
 | |
| 
 | |
|   # Set the language out.
 | |
|   if ctx.attr.language_out in _SUPPORTED_LANGUAGES:
 | |
|     args += "--language_out=" + _SUPPORTED_LANGUAGES[ctx.attr.language_out]
 | |
|   else:
 | |
|     fail("Invalid language_out '%s', expected one of %s" %
 | |
|          (ctx.attr.language_out, _SUPPORTED_LANGUAGES.keys()))
 | |
| 
 | |
|   ctx.action(
 | |
|       inputs=list(srcs) + list(externs),
 | |
|       outputs=[ctx.outputs.out],
 | |
|       arguments=args,
 | |
|       executable=ctx.executable._closure_compiler)
 | |
| 
 | |
|   return struct(files=set([ctx.outputs.out]))
 | |
| 
 | |
| closure_js_binary = rule(
 | |
|     implementation=_impl,
 | |
|     attrs={
 | |
|         "deps": attr.label_list(
 | |
|             allow_files=False,
 | |
|             providers=["transitive_js_externs", "transitive_js_srcs"]),
 | |
|         "main": attr.string(default="%{name}"),
 | |
|         "compilation_level": attr.string(default="advanced"),
 | |
|         "language_in": attr.string(default="ecmascript6"),
 | |
|         "language_out": attr.string(default="ecmascript3"),
 | |
|         "_closure_compiler": attr.label(
 | |
|             default=Label("//external:closure_compiler_"),
 | |
|             executable=True),
 | |
|     },
 | |
|     outputs={"out": "%{name}_combined.js"})
 |