mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 01:30: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"})
|