bazel: win: Explicitly link libcef.lib in cc_binary (see #3757)

Using cc_import + interface_library/shared_library to link libcef.lib causes
libcef.dll to be copied as a transitive dependency, leading to issues with
complex Bazel configs. Instead, we explicitly link libcef.lib in the binary
target (cc_binary + linkopts/additional_linker_inputs) and explicitly copy
libcef.dll to the target directory.
This commit is contained in:
Marshall Greenblatt 2024-11-05 11:46:31 -05:00
parent 213c0280e9
commit 980cc4b9fe
3 changed files with 34 additions and 13 deletions

View File

@ -47,10 +47,10 @@ def declare_exe(name, srcs, manifest_srcs, rc_file, resources_srcs, resources_de
srcs = srcs, srcs = srcs,
deps = [ deps = [
"@cef//:cef_wrapper", "@cef//:cef_wrapper",
"@cef//:cef",
"@cef//:cef_sandbox", "@cef//:cef_sandbox",
] + deps, ] + deps,
linkopts = [ linkopts = [
"$(location @cef//:cef_lib)",
"$(location :{})".format(res_target), "$(location :{})".format(res_target),
] + COMMON_LINKOPTS + linkopts, ] + COMMON_LINKOPTS + linkopts,
copts = COMMON_COPTS + select({ copts = COMMON_COPTS + select({
@ -62,6 +62,7 @@ def declare_exe(name, srcs, manifest_srcs, rc_file, resources_srcs, resources_de
"//conditions:default": COMMON_DEFINES_RELEASE, "//conditions:default": COMMON_DEFINES_RELEASE,
}) + local_defines, }) + local_defines,
additional_linker_inputs = [ additional_linker_inputs = [
"@cef//:cef_lib",
":{}".format(res_target), ":{}".format(res_target),
] + additional_linker_inputs, ] + additional_linker_inputs,
data = [ data = [

View File

@ -6,10 +6,10 @@
# Distribution DLLs. # Distribution DLLs.
# #
# NOTE: libcef.dll is included via the //:cef dependency.
DLLS = [ DLLS = [
"chrome_elf.dll", "chrome_elf.dll",
"d3dcompiler_47.dll", "d3dcompiler_47.dll",
"libcef.dll",
"libEGL.dll", "libEGL.dll",
"libGLESv2.dll", "libGLESv2.dll",
"vk_swiftshader.dll", "vk_swiftshader.dll",

View File

@ -274,29 +274,19 @@ alias(
}) })
) )
# Only available on Linux/Windows. # Only available on Linux.
cc_import( cc_import(
name = "cef_dbg", name = "cef_dbg",
interface_library = select({
"@platforms//os:windows": "Debug/libcef.lib",
"//conditions:default": None,
}),
shared_library = select({ shared_library = select({
"@platforms//os:linux": "Debug/libcef.so", "@platforms//os:linux": "Debug/libcef.so",
"@platforms//os:windows": "Debug/libcef.dll",
"//conditions:default": None, "//conditions:default": None,
}), }),
) )
cc_import( cc_import(
name = "cef_opt", name = "cef_opt",
interface_library = select({
"@platforms//os:windows": "Release/libcef.lib",
"//conditions:default": None,
}),
shared_library = select({ shared_library = select({
"@platforms//os:linux": "Release/libcef.so", "@platforms//os:linux": "Release/libcef.so",
"@platforms//os:windows": "Release/libcef.dll",
"//conditions:default": None, "//conditions:default": None,
}), }),
) )
@ -309,6 +299,36 @@ alias(
}), }),
) )
# Only available on Windows.
# Using cc_import + interface_library/shared_library to link libcef.lib causes
# libcef.dll to be copied as a transitive dependency, leading to issues with
# complex Bazel configs. Instead, we explicitly link libcef.lib in the binary
# target (cc_binary + linkopts/additional_linker_inputs) and explicitly copy
# libcef.dll to the target directory.
alias(
name = "cef_lib_dbg",
actual = select({
"@platforms//os:windows": "Debug/libcef.lib",
"//conditions:default": None,
}),
)
alias(
name = "cef_lib_opt",
actual = select({
"@platforms//os:windows": "Release/libcef.lib",
"//conditions:default": None,
}),
)
alias(
name = "cef_lib",
actual = select({
"@cef//:dbg": "@cef//:cef_lib_dbg",
"//conditions:default": "@cef//:cef_lib_opt",
}),
)
# Copy the CEF framework into the app bundle but do not link it. See # Copy the CEF framework into the app bundle but do not link it. See
# https://groups.google.com/g/cef-announce/c/Fith0A3kWtw/m/6ds_mJVMCQAJ # https://groups.google.com/g/cef-announce/c/Fith0A3kWtw/m/6ds_mJVMCQAJ
# for background. Use `copy_directory` instead of `filegroup` to remove # for background. Use `copy_directory` instead of `filegroup` to remove