tweag/rules_nixpkgs

compiler-rt-libc-*-dev not available in nixpkgs cc toolchain

iphydf opened this issue · 2 comments

iphydf commented

Describe the bug
#include <sanitizer/msan_interface.h> fails to compile on bazel with nixpkgs. It works with clang++.

To Reproduce
Create a C file with #include <sanitizer/msan_interface.h> in it. Observe:

myfile.c:1:10: fatal error: 'sanitizer/msan_interface.h' file not found

Expected behavior
It should compile.

Environment

  • OS name + version: NixOS 23.05
  • Version of the code: v0.10.0

Additional context
The include directory is known to clang++:

[nix-shell:/src/workspace]$ clang++ -c -xc++ - -v
...
 /nix/store/l4mfdpx5d4ybn6ki1gjhlcmz6hv5p6kh-compiler-rt-libc-16.0.1-dev/include
...
avdv commented

Hi.

I think you should be able to use the library like any other, e.g. with

nixpkgs_package(
    name = "compiler-rt-libc",
    attribute_path = "llvmPackages_16.compiler-rt-libc",
    nix_file_content = """import <nixpkgs> { }""",
    repository = "@nixpkgs",
)

nixpkgs_package(
    name = "compiler-rt-libc.dev",
    attribute_path = "llvmPackages_16.compiler-rt-libc.dev",
    build_file_content = """\
load("@rules_cc//cc:defs.bzl", "cc_library")
filegroup(
    name = "include",
    srcs = glob(["include/**/*.h"]),
    visibility = ["//visibility:public"],
)
cc_library(
    name = "compiler-rt-libc",
    srcs = ["@compiler-rt-libc//:lib"],
    hdrs = [":include"],
    strip_include_prefix = "include",
    visibility = ["//visibility:public"],
)
""",
    nix_file_content = """import <nixpkgs> { }""",
    repository = "@nixpkgs",
)
iphydf commented

The problem is that Go stdlib uses that (when compiling with msan) but doesn't declare it, because it's assumed to be part of the toolchain. Same with absl and probably other third party dependencies.