diff --git a/MODULE.bazel b/MODULE.bazel index c16da4e..6a4a403 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -9,6 +9,7 @@ module( bazel_dep(name = "bazel_lib", version = "3.0.0") bazel_dep(name = "bazel_features", version = "1.32.0") bazel_dep(name = "bazel_skylib", version = "1.8.1") +bazel_dep(name = "curl", version = "8.8.0.bcr.3") bazel_dep(name = "package_metadata", version = "0.0.5") bazel_dep(name = "platforms", version = "0.0.11") bazel_dep(name = "rules_cc", version = "0.2.0") diff --git a/d/private/rules/cc_toolchain.bzl b/d/private/rules/cc_toolchain.bzl index 93e8634..3b3cb40 100644 --- a/d/private/rules/cc_toolchain.bzl +++ b/d/private/rules/cc_toolchain.bzl @@ -21,14 +21,8 @@ _UNSUPPORTED_FEATURES = [ ] _LINKER_OPTIONS_DENYLIST = { - # Don't link C++ libraries - "-lstdc++": None, - "-lc++": None, - "-lc++abi": None, - # libm and libobjc are added by the D compiler already, so suppress them here, to avoid warnings - "-lm": None, - "-lobjc": None, - "-fobjc-link-runtime": None, + # d-runtime uses __start/__stop_minfo + "-Wl,--gc-sections": None, # --target is passed by the D compiler "--target=": None, # --target passed by the D compiler conflicts with -mmacosx-version-min set by cc_toolchain diff --git a/d/private/rules/common.bzl b/d/private/rules/common.bzl index 6d8cf7e..084d58a 100644 --- a/d/private/rules/common.bzl +++ b/d/private/rules/common.bzl @@ -112,24 +112,38 @@ def compilation_action(ctx, target_type = TARGET_TYPE.LIBRARY): The provider containing the compilation information. """ toolchain = ctx.toolchains["//d:toolchain_type"].d_toolchain_info - c_deps = [d[CcInfo] for d in ctx.attr.deps if CcInfo in d] - c_linker_inputs = [ + cc_deps = [d[CcInfo] for d in ctx.attr.deps if CcInfo in d] + cc_linker_inputs = [ linker_input - for dep in c_deps + for dep in cc_deps for linker_input in dep.linking_context.linker_inputs.to_list() ] - c_libraries = depset([ + cc_libraries = depset([ lib.pic_static_library if lib.pic_static_library else lib.static_library - for li in c_linker_inputs + for li in cc_linker_inputs for lib in li.libraries + ], order = "topological") + fix_linker_flags = { + "-pthread": "-lpthread", + } + cc_linker_flags = depset([ + fix_linker_flags.get(flag, flag) + for li in cc_linker_inputs + for flag in li.user_link_flags ]) d_deps = [d[DInfo] for d in ctx.attr.deps if DInfo in d] - compiler_flags = depset(ctx.attr.dopts, transitive = [d.compiler_flags for d in d_deps]) + compiler_flags = depset( + ctx.attr.dopts, + transitive = [d.compiler_flags for d in d_deps], + ) imports = depset( [paths.join(ctx.label.workspace_root, ctx.label.package, imp) for imp in ctx.attr.imports], transitive = [d.imports for d in d_deps], ) - linker_flags = depset(ctx.attr.linkopts, transitive = [d.linker_flags for d in d_deps]) + linker_flags = depset( + ctx.attr.linkopts, + transitive = [d.linker_flags for d in d_deps] + [cc_linker_flags], + ) string_imports = depset( ([paths.join(ctx.label.workspace_root, ctx.label.package)] if ctx.files.string_srcs else []) + [paths.join(ctx.label.workspace_root, ctx.label.package, imp) for imp in ctx.attr.string_imports], @@ -144,15 +158,15 @@ def compilation_action(ctx, target_type = TARGET_TYPE.LIBRARY): args.add_all(toolchain.compiler_flags) args.add_all(compiler_flags.to_list()) args.add_all(versions.to_list(), format_each = "-version=%s") - args.add_all(toolchain.linker_flags) - args.add_all(linker_flags.to_list(), format_each = "-L=%s") output = None cc_toolchain = None env = ctx.var if target_type in [TARGET_TYPE.BINARY, TARGET_TYPE.TEST]: + args.add_all(toolchain.linker_flags) + args.add_all(linker_flags.to_list(), format_each = "-L=%s") for dep in d_deps: args.add_all(dep.libraries) - args.add_all(c_libraries) + args.add_all(cc_libraries) if target_type == TARGET_TYPE.TEST: args.add_all(["-main", "-unittest"]) output = ctx.actions.declare_file(_binary_name(ctx, ctx.label.name)) @@ -183,7 +197,7 @@ def compilation_action(ctx, target_type = TARGET_TYPE.LIBRARY): transitive_library_inputs = [] if target_type != TARGET_TYPE.LIBRARY: - transitive_library_inputs += [d.libraries for d in d_deps] + [c_libraries] + transitive_library_inputs += [d.libraries for d in d_deps] + [cc_libraries] inputs = depset( direct = ctx.files.srcs + ctx.files.string_srcs, transitive = [toolchain.d_compiler[DefaultInfo].default_runfiles.files] + @@ -219,8 +233,7 @@ def compilation_action(ctx, target_type = TARGET_TYPE.LIBRARY): libraries = depset( [] if ctx.attr.source_only else [output], order = "topological", - transitive = [d.libraries for d in d_deps] + - [c_libraries], + transitive = [d.libraries for d in d_deps] + [cc_libraries], ), linker_flags = linker_flags, string_imports = depset( diff --git a/d/private/sdk/BUILD.dmd.bazel b/d/private/sdk/BUILD.dmd.bazel index 1d59ec1..8755470 100644 --- a/d/private/sdk/BUILD.dmd.bazel +++ b/d/private/sdk/BUILD.dmd.bazel @@ -91,7 +91,12 @@ d_toolchain( "-L--export-dynamic", ], "@platforms//os:macos": ["-L-L{D_COMPILER_ROOT}/osx/lib"], - "@platforms//os:windows": ["-L/LIBPATH:{D_COMPILER_ROOT}/windows/lib64"], + "@platforms//os:windows": [ + "-L/LIBPATH:{D_COMPILER_ROOT}/windows/lib64", + "-L/DEFAULTLIB:msvcrt.lib", + "-L/NODEFAULTLIB:libcmt", + "-L/INCREMENTAL:NO", + ], }), rdmd_tool = ":rdmd", ) diff --git a/tools/BUILD.bazel b/tools/BUILD.bazel index 4403c3a..20dc6b0 100644 --- a/tools/BUILD.bazel +++ b/tools/BUILD.bazel @@ -26,8 +26,8 @@ d_library( "curl_downloader.d", "integrity_hash.d", ], - linkopts = ["-lcurl"], visibility = ["//dub:__subpackages__"], + deps = ["@curl"], ) d_binary( @@ -35,6 +35,5 @@ d_binary( srcs = [ "generate_compiler_versions_bzl.d", ], - tags = ["manual"], # Not built by default; 'curl' dependency may not be available on all platforms. deps = [":d_utils"], )