Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 12 additions & 6 deletions docs/rules.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

67 changes: 63 additions & 4 deletions zig/config/mode/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,31 +1,90 @@
load("@bazel_skylib//lib:selects.bzl", "selects")

config_setting(
name = "debug",
name = "_debug_explicit",
flag_values = {
"//zig/settings:mode": "debug",
},
)

config_setting(
name = "release_safe",
name = "_debug_auto_dbg",
flag_values = {
"//zig/settings:mode": "auto",
},
values = {
"compilation_mode": "dbg",
},
)

config_setting(
name = "_debug_auto_fastbuild",
flag_values = {
"//zig/settings:mode": "auto",
},
values = {
"compilation_mode": "fastbuild",
},
)

selects.config_setting_group(
name = "debug",
match_any = [
":_debug_explicit",
":_debug_auto_dbg",
":_debug_auto_fastbuild",
],
)

config_setting(
name = "_release_safe_explicit",
flag_values = {
"//zig/settings:mode": "release_safe",
},
)

selects.config_setting_group(
name = "release_safe",
match_any = [":_release_safe_explicit"],
)

config_setting(
name = "release_small",
name = "_release_small_explicit",
flag_values = {
"//zig/settings:mode": "release_small",
},
)

selects.config_setting_group(
name = "release_small",
match_any = [":_release_small_explicit"],
)

config_setting(
name = "release_fast",
name = "_release_fast_explicit",
flag_values = {
"//zig/settings:mode": "release_fast",
},
)

config_setting(
name = "_release_fast_auto_opt",
flag_values = {
"//zig/settings:mode": "auto",
},
values = {
"compilation_mode": "opt",
},
)

selects.config_setting_group(
name = "release_fast",
match_any = [
":_release_fast_explicit",
":_release_fast_auto_opt",
],
)

# Execute `bazel run //util:update_filegroups` to update this target.
filegroup(
name = "all_files",
Expand Down
19 changes: 18 additions & 1 deletion zig/private/settings.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,13 @@ MODE_ARGS = {
"release_fast": ["-O", "ReleaseFast"],
}

MODE_VALUES = ["debug", "release_safe", "release_small", "release_fast"]
MODE_VALUES = ["auto", "debug", "release_safe", "release_small", "release_fast"]

COMPILATION_MODE_TO_MODE = {
"dbg": "debug",
"fastbuild": "debug",
"opt": "release_fast",
}

THREADED_ARGS = {
"multi": ["-fno-single-threaded"],
Expand All @@ -85,12 +91,23 @@ THREADED_VALUES = ["multi", "single"]
def _is_exec_configuration(ctx):
return ctx.genfiles_dir.path.find("-exec") != -1

def _resolve_mode(ctx, mode):
if mode != "auto":
return mode

compilation_mode = ctx.var["COMPILATION_MODE"]
if compilation_mode not in COMPILATION_MODE_TO_MODE:
fail("Unrecognized Bazel compilation mode {}.".format(compilation_mode))

return COMPILATION_MODE_TO_MODE[compilation_mode]

def _settings_impl(ctx):
args = []

is_exec_configuration = _is_exec_configuration(ctx)

mode = ctx.attr.host_mode[BuildSettingInfo].value if is_exec_configuration else ctx.attr.mode[BuildSettingInfo].value
mode = _resolve_mode(ctx, mode)
args.extend(MODE_ARGS[mode])

threaded = ctx.attr.host_threaded[BuildSettingInfo].value if is_exec_configuration else ctx.attr.threaded[BuildSettingInfo].value
Expand Down
6 changes: 4 additions & 2 deletions zig/private/zig_configure.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ Transitions a target and its dependencies to a different configuration.
Settings like the build mode, e.g. `ReleaseSafe`, or the target platform,
can be set on the command-line on demand,
e.g. using `--@rules_zig//zig/settings:mode=release_safe`.
By default, target build mode is `auto`: Bazel `dbg` and `fastbuild`
compilation modes map to Zig `Debug`, and Bazel `opt` maps to Zig `ReleaseFast`.

However, you may wish to always build a given target
in a particular configuration,
Expand Down Expand Up @@ -208,12 +210,12 @@ def _make_attrs(*, executable):
default = -1,
),
"mode": attr.string(
doc = "The build mode setting, corresponds to the `-O` Zig compiler flag.",
doc = "The build mode setting, corresponds to the `-O` Zig compiler flag. `auto` follows Bazel's `--compilation_mode`.",
mandatory = False,
values = MODE_VALUES,
),
"host_mode": attr.string(
doc = "The build mode setting for the host configuration, corresponds to the `-O` Zig compiler flag.",
doc = "The build mode setting for the host configuration, corresponds to the `-O` Zig compiler flag. `auto` follows Bazel's `--compilation_mode`.",
mandatory = False,
values = MODE_VALUES,
),
Expand Down
2 changes: 1 addition & 1 deletion zig/settings/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ bool_flag(

string_flag(
name = "mode",
build_setting_default = "debug",
build_setting_default = "auto",
values = MODE_VALUES,
visibility = ["//zig/config/mode:__pkg__"],
)
Expand Down
18 changes: 15 additions & 3 deletions zig/tests/config_test.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -19,23 +19,32 @@ _string_value = rule(
},
)

def _define_config_settings_test(*, flag, value):
_COMPILATION_MODE = "//command_line_option:compilation_mode"

def _define_config_settings_test(*, flag, value, expected_value = None, compilation_mode = None):
def _test_impl(ctx):
env = analysistest.begin(ctx)

actual_value = analysistest.target_under_test(env)[_ValueInfo].value
asserts.equals(env, value, actual_value, "Unexpected value for {}".format(flag))
asserts.equals(env, expected_value or value, actual_value, "Unexpected value for {}".format(flag))

return analysistest.end(env)

config_settings = {flag: value}
if compilation_mode:
config_settings[_COMPILATION_MODE] = compilation_mode

return analysistest.make(
_test_impl,
config_settings = {flag: value},
config_settings = config_settings,
)

_SETTINGS_MODE = canonical_label("@//zig/settings:mode")
_SETTINGS_THREADED = canonical_label("@//zig/settings:threaded")

_mode_auto_dbg_test = _define_config_settings_test(flag = _SETTINGS_MODE, value = "auto", expected_value = "debug", compilation_mode = "dbg")
_mode_auto_fastbuild_test = _define_config_settings_test(flag = _SETTINGS_MODE, value = "auto", expected_value = "debug", compilation_mode = "fastbuild")
_mode_auto_opt_test = _define_config_settings_test(flag = _SETTINGS_MODE, value = "auto", expected_value = "release_fast", compilation_mode = "opt")
_mode_debug_test = _define_config_settings_test(flag = _SETTINGS_MODE, value = "debug")
_mode_release_safe_test = _define_config_settings_test(flag = _SETTINGS_MODE, value = "release_safe")
_mode_release_small_test = _define_config_settings_test(flag = _SETTINGS_MODE, value = "release_small")
Expand Down Expand Up @@ -71,6 +80,9 @@ def config_test_suite(name):
unittest.suite(
name,
# mode
partial.make(_mode_auto_dbg_test, target_under_test = mode_name, size = "small"),
partial.make(_mode_auto_fastbuild_test, target_under_test = mode_name, size = "small"),
partial.make(_mode_auto_opt_test, target_under_test = mode_name, size = "small"),
partial.make(_mode_debug_test, target_under_test = mode_name, size = "small"),
partial.make(_mode_release_safe_test, target_under_test = mode_name, size = "small"),
partial.make(_mode_release_small_test, target_under_test = mode_name, size = "small"),
Expand Down
Loading
Loading