blob: 4dc81114c1bbc19f15d6107ee25dfc4e47923b34 [file] [log] [blame]
"""Provides a rule for setting the IntelliJ/Studio app icon."""
AppIconInfo = provider(
doc = "Defines the application icon artwork for the Studio app.",
fields = {
"png": "The linux app icon.",
"ico": "The Windows app icon.",
"icns": "The MacOS app icon.",
"svg": "A svg file used on all platforms.",
"svg_small": "A smaller svg icon file.",
},
)
_STUDIO_PATH_PNG = "bin/studio.png"
_STUDIO_PATH_ICNS = "Contents/Resources/studio.icns"
_STUDIO_PATH_ICO = "bin/studio.ico"
_STUDIO_PATH_SVG = "bin/studio.svg"
_STUDIO_PATH_SVG_MACOS = "Contents/bin/studio.svg"
_STUDIO_PATH_WINDOWS_EXE = "bin/studio64.exe"
def _app_icon_impl(ctx):
return AppIconInfo(
png = ctx.file.png,
ico = ctx.file.ico,
icns = ctx.file.icns,
svg = ctx.file.svg,
svg_small = ctx.file.svg_small,
)
app_icon = rule(
attrs = {
"png": attr.label(
doc = "The png file used on linux.",
allow_single_file = True,
),
"ico": attr.label(
doc = "The ico file used on windows.",
allow_single_file = True,
),
"icns": attr.label(
doc = "The icns file used on macOS.",
allow_single_file = True,
),
"svg": attr.label(
doc = "The svg file used on all platforms.",
allow_single_file = True,
),
"svg_small": attr.label(
doc = "A smaller svg file.",
allow_single_file = True,
),
},
implementation = _app_icon_impl,
provides = [AppIconInfo],
)
def _modify_exe_launcher(ctx, out, windows_exe, ico_file):
# This number refers to IDI_WINLAUNCHER, or IDI_ICON in openjdk.
icon_id = "2000"
ctx.actions.run(
inputs = [ico_file, windows_exe],
outputs = [out],
arguments = [windows_exe.path, out.path, "--replace_icon", icon_id, ico_file.path],
executable = ctx.executable._patch_exe,
mnemonic = "ModifyExeIcon",
)
def replace_app_icon(ctx, platform_name, file_map, icon_info):
"""Returns a new file map with application icon files replaced.
Args:
ctx: The bazel context.
platform_name: One of linux, win, mac, or mac_arm.
file_map: A map of relative studio paths to files.
icon_info: The AppIconInfo provider.
Returns:
An updated file mapping.
"""
if platform_name not in ["linux", "win", "mac", "mac_arm"]:
fail("Unexpected platform name: '%s'" % platform_name)
resources_jar = "lib/resources.jar"
new_file_map = {k: v for k, v in file_map.items()}
if platform_name == "linux":
if icon_info.png:
new_file_map[_STUDIO_PATH_PNG] = icon_info.png
if icon_info.svg:
new_file_map[_STUDIO_PATH_SVG] = icon_info.svg
if platform_name in ["mac", "mac_arm"]:
resources_jar = "Contents/%s" % resources_jar
if icon_info.icns:
new_file_map[_STUDIO_PATH_ICNS] = icon_info.icns
if icon_info.svg:
new_file_map[_STUDIO_PATH_SVG_MACOS] = icon_info.svg
if platform_name == "win":
if icon_info.ico:
new_file_map[_STUDIO_PATH_ICO] = icon_info.ico
new_win_exe = ctx.actions.declare_file(ctx.attr.name + ".windows-launcher.exe")
win_exe = new_file_map[_STUDIO_PATH_WINDOWS_EXE]
_modify_exe_launcher(ctx, new_win_exe, win_exe, icon_info.ico)
new_file_map[_STUDIO_PATH_WINDOWS_EXE] = new_win_exe
if icon_info.svg:
new_file_map[_STUDIO_PATH_SVG] = icon_info.svg
new_res_jar = ctx.actions.declare_file(ctx.attr.name + ".%s.updated-app-icon-resources.jar" % platform_name)
ctx.actions.run(
inputs = [file_map[resources_jar], icon_info.svg, icon_info.svg_small],
outputs = [new_res_jar],
arguments = [
"--resources_jar",
file_map[resources_jar].path,
"--svg",
icon_info.svg.path,
"--svg_small",
icon_info.svg_small.path,
"--out",
new_res_jar.path,
],
executable = ctx.executable._update_resources_jar,
mnemonic = "UpdateIntellijResourceJar",
)
new_file_map[resources_jar] = new_res_jar
if len(new_file_map) > len(file_map):
extra = list(set(new_file_map) - set(file_map))
fail("Some icon files were missing from the platform. Did the icon locations change? " + str(extra))
return new_file_map