# 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. load("//tools/build_rules:deprecation.bzl", "deprecated") def warning(rule): print(deprecated( "sass", rule, "@bazel_tools//tools/build_defs/sass:sass.bzl", "@io_bazel_rules_sass//sass:sass.bzl")) SASS_FILETYPES = FileType([ ".sass", ".scss", ]) def collect_transitive_sources(ctx): source_files = set(order="compile") for dep in ctx.attr.deps: source_files += dep.transitive_sass_files return source_files def _sass_library_impl(ctx): warning("sass_library") transitive_sources = collect_transitive_sources(ctx) transitive_sources += SASS_FILETYPES.filter(ctx.files.srcs) return struct( files = set(), transitive_sass_files = transitive_sources) def _sass_binary_impl(ctx): # Reference the sass compiler and define the default options # that sass_binary uses. warning("sass_binary") sassc = ctx.file._sassc options = [ "--style={0}".format(ctx.attr.output_style), "--sourcemap", ] # Load up all the transitive sources as dependent includes. transitive_sources = collect_transitive_sources(ctx) for src in transitive_sources: options += ["-I={0}".format(src)] ctx.action( inputs = [sassc, ctx.file.src] + list(transitive_sources), executable = sassc, arguments = options + [ctx.file.src.path, ctx.outputs.css_file.path], mnemonic = "SassCompiler", outputs = [ctx.outputs.css_file, ctx.outputs.css_map_file], ) sass_deps_attr = attr.label_list( providers = ["transitive_sass_files"], allow_files = False, ) sass_library = rule( attrs = { "srcs": attr.label_list( allow_files = SASS_FILETYPES, non_empty = True, mandatory = True, ), "deps": sass_deps_attr, }, implementation = _sass_library_impl, ) sass_binary = rule( attrs = { "src": attr.label( allow_files = SASS_FILETYPES, mandatory = True, single_file = True, ), "output_style": attr.string(default = "compressed"), "deps": sass_deps_attr, "_sassc": attr.label( default = Label("@bazel_tools//tools/build_defs/sass:sassc"), executable = True, single_file = True, ), }, outputs = { "css_file": "%{name}.css", "css_map_file": "%{name}.css.map", }, implementation = _sass_binary_impl, ) LIBSASS_BUILD_FILE = """ package(default_visibility = ["@sassc//:__pkg__"]) filegroup( name = "srcs", srcs = glob([ "src/**/*.h*", "src/**/*.c*", ]), ) # Includes directive may seem unnecessary here, but its needed for the weird # interplay between libsass/sassc projects. This is intentional. cc_library( name = "headers", includes = ["include"], hdrs = glob(["include/**/*.h"]), ) """ SASSC_BUILD_FILE = """ package(default_visibility = ["//visibility:public"]) cc_binary( name = "sassc", srcs = [ "@libsass//:srcs", "sassc.c", "sassc_version.h", ], linkopts = ["-ldl", "-lm"], deps = ["@libsass//:headers"], ) """ def sass_repositories(): warning("sass_repositories") native.new_http_archive( name = "libsass", url = "https://github.com/sass/libsass/archive/3.3.0-beta1.tar.gz", sha256 = "6a4da39cc0b585f7a6ee660dc522916f0f417c890c3c0ac7ebbf6a85a16d220f", build_file_content = LIBSASS_BUILD_FILE, strip_prefix = "libsass-3.3.0-beta1", ) native.new_http_archive( name = "sassc", url = "https://github.com/sass/sassc/archive/3.3.0-beta1.tar.gz", sha256 = "87494218eea2441a7a24b40f227330877dbba75c5fa9014ac6188711baed53f6", build_file_content = SASSC_BUILD_FILE, strip_prefix = "sassc-3.3.0-beta1", )