Skip to content

Commit

Permalink
Add dotnet_tool_repository rule to download wix
Browse files Browse the repository at this point in the history
This is a preparation to use Bazel to build Mozc for Windows (#948).

With this commit, we can start referencing to wix.exe from Bazel rules.

Note that dotnet-tools.json, which we introduced for #894 [1], does not
work well with Bazel because we cannot assume current working directory
when running Bazel action.  We instead download the WiX executable with

  --tool-path

option so that WiX can be executed from any current working directory.

Note also that there must be no observable behavior change in GYP build.

 [1]: cbd5556

PiperOrigin-RevId: 680138030
  • Loading branch information
yukawa authored and hiroyuki-komatsu committed Sep 29, 2024
1 parent 8bc7db2 commit 4e7b736
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 0 deletions.
11 changes: 11 additions & 0 deletions src/MODULE.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,17 @@ windows_sdk_repository(
name = "windows_sdk",
)

# dotnet tool repository (to load "wix")
dotnet_tool_repository = use_repo_rule(
"@//bazel:dotnet_tool_repository.bzl",
"dotnet_tool_repository"
)

dotnet_tool_repository(
name = "wix",
version = "4.0.5",
)

http_file = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file")
# Material icons
http_file(
Expand Down
7 changes: 7 additions & 0 deletions src/WORKSPACE.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,13 @@ windows_sdk_repository(
name = "windows_sdk"
)

# dotnet tool repository (to load "wix")
load("@//bazel:dotnet_tool_repository.bzl", "dotnet_tool_repository")
dotnet_tool_repository(
name = "wix",
version = "4.0.5",
)

# Google Toolbox for Mac
# https://github.com/google/google-toolbox-for-mac
# We just need UnitTesting, so strip to the directory and skip dependencies.
Expand Down
81 changes: 81 additions & 0 deletions src/bazel/dotnet_tool_repository.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# Copyright 2010-2021, Google Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
# * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

"""Repository rule for dotnet tool."""

BUILD_TEMPLATE = """
package(
default_visibility = ["//visibility:public"],
)
exports_files([
"{executable}", # version {version}
])
"""

def _dotnet_tool_repo_impl(repo_ctx):
is_windows = repo_ctx.os.name.lower().startswith("win")
if not is_windows:
repo_ctx.file("BUILD.bazel", "")
return

repo_root = repo_ctx.path(".")
dotnet_tool = repo_ctx.which("dotnet.exe")
tool_name = repo_ctx.attr.tool_name
if not tool_name:
# In bzlmod, repo_ctx.attr.name has a prefix like "_main~_repo_rules~wix".
tool_name = repo_ctx.attr.name.split("~")[-1]
version = repo_ctx.attr.version

repo_ctx.execute([
dotnet_tool,
"tool",
"install",
tool_name,
"--version",
version,
"--tool-path",
repo_root,
])

build_file_data = BUILD_TEMPLATE.format(
executable = tool_name + ".exe",
version = version,
)
repo_ctx.file("BUILD.bazel", build_file_data, executable = False)

dotnet_tool_repository = repository_rule(
implementation = _dotnet_tool_repo_impl,
configure = True,
local = True,
attrs = {
"tool_name": attr.string(),
"version": attr.string(mandatory = True),
},
)

0 comments on commit 4e7b736

Please sign in to comment.