diff --git a/MODULE.bazel b/MODULE.bazel index 61bb2b6..cf81f8d 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -5,12 +5,12 @@ module( ) bazel_dep(name = "bazel_skylib", version = "1.4.1") +bazel_dep(name = "platforms", version = "0.0.6") bazel_dep(name = "aspect_bazel_lib", version = "1.34.0", dev_dependency = True) bazel_dep(name = "bazel_skylib_gazelle_plugin", version = "1.4.1", dev_dependency = True) bazel_dep(name = "buildifier_prebuilt", version = "6.4.0", dev_dependency = True) bazel_dep(name = "gazelle", version = "0.33.0", dev_dependency = True, repo_name = "bazel_gazelle") -bazel_dep(name = "platforms", version = "0.0.6", dev_dependency = True) bazel_dep(name = "rules_testing", version = "0.4.0", dev_dependency = True) bazel_dep(name = "stardoc", dev_dependency = True) git_override( diff --git a/with_cfg/private/frontend.bzl b/with_cfg/private/frontend.bzl index 9031647..75d9eaa 100644 --- a/with_cfg/private/frontend.bzl +++ b/with_cfg/private/frontend.bzl @@ -11,18 +11,31 @@ def get_frontend(*, executable, test): return _frontend_default def _frontend_impl(ctx): + # type: (ctx) -> None target = ctx.attr.exports original_executable = target[FrontendInfo].executable - dirname, separator, basename = ctx.label.name.rpartition("/") executable_basename = original_executable.basename - executable = ctx.actions.declare_file(dirname + separator + basename + "/" + executable_basename) + executable = ctx.actions.declare_file(ctx.label.name + "/" + executable_basename) + + additional_runfiles = [executable] + if CcInfo in target and ctx.target_platform_has_constraint(ctx.attr._windows[platform_common.ConstraintValueInfo]): + # DLLs need to be located next to the executable on Windows. + dlls_to_relocate = [ + f + for f in target[DefaultInfo].default_runfiles.files.to_list() + if f.path.endswith(".dll") and f.dirname != executable.dirname and f.dirname == original_executable.dirname + ] + for dll in dlls_to_relocate: + out_dll = ctx.actions.declare_file(dll.basename, sibling = executable) + ctx.actions.symlink(output = out_dll, target_file = dll) + additional_runfiles.append(out_dll) + + print(additional_runfiles) - # TODO: If this is a copy rather than a symlink, runfiles discovery will not work correctly. - # Fix this by using a wrapper script rather than a symlink. ctx.actions.symlink(output = executable, target_file = original_executable) - data_runfiles = ctx.runfiles([executable]).merge(target[DefaultInfo].data_runfiles) - default_runfiles = ctx.runfiles([executable]).merge(target[DefaultInfo].default_runfiles) + data_runfiles = ctx.runfiles(additional_runfiles).merge(target[DefaultInfo].data_runfiles) + default_runfiles = ctx.runfiles(additional_runfiles).merge(target[DefaultInfo].default_runfiles) run_environment_info = _clean_run_environment_info( target[FrontendInfo].run_environment_info, @@ -79,6 +92,7 @@ _frontend_attrs = { mandatory = True, providers = [FrontendInfo], ), + "_windows": attr.label(default = "@platforms//os:windows"), } _frontend_test_attrs = {