Search code examples
c++clangclang++bazel

Clang toolchain fails for system libc files


I wrote a custom (cc_)toolchain for Clang. After some back and forth I now have it mostly working. It is however failing with:

undeclared inclusion(s) in rule '//foo:foo'
this rule is missing dependency declarations for the following files included by 'foo/foobar.cpp':
  '/usr/include/features.h'
  '/usr/include/stdc-predef.h'
  '/usr/include/x86_64-linux-gnu/sys/cdefs.h'
  '/usr/include/x86_64-linux-gnu/bits/wordsize.h'
  '/usr/include/x86_64-linux-gnu/gnu/stubs.h'
  '/usr/include/x86_64-linux-gnu/gnu/stubs-64.h'
  '/usr/include/stdint.h'
  '/usr/include/x86_64-linux-gnu/bits/wchar.h'
  '/usr/include/stdio.h'
  '/usr/include/x86_64-linux-gnu/bits/types.h'
  '/usr/include/x86_64-linux-gnu/bits/typesizes.h'
  '/usr/include/libio.h'
  '/usr/include/_G_config.h'
  '/usr/include/wchar.h'
  '/usr/include/x86_64-linux-gnu/bits/stdio_lim.h'
  '/usr/include/x86_64-linux-gnu/bits/sys_errlist.h'
  '/usr/include/math.h'
  '/usr/include/x86_64-linux-gnu/bits/math-vector.h'
  '/usr/include/x86_64-linux-gnu/bits/libm-simd-decl-stubs.h'
  '/usr/include/x86_64-linux-gnu/bits/huge_val.h'
  '/usr/include/x86_64-linux-gnu/bits/huge_valf.h'
  '/usr/include/x86_64-linux-gnu/bits/huge_vall.h'
  '/usr/include/x86_64-linux-gnu/bits/inf.h'
  '/usr/include/x86_64-linux-gnu/bits/nan.h'
  '/usr/include/x86_64-linux-gnu/bits/mathdef.h'
  '/usr/include/x86_64-linux-gnu/bits/mathcalls.h'
  '/usr/include/assert.h'
  '/usr/include/string.h'
  '/usr/include/xlocale.h'

So how is one supposed to handle these files? Simply hardcode these for the toolchain? Or is there a switch to ignore dependencies from the system (/usr)? Or rather use a hermetic libc like musl, newlib or bionic.

EDIT:


For more details about the actual toolchain see: https://github.com/abergmeier/bazel_toolchains


Solution

  • You need to put the builtin include paths of the compiler into the cxx_builtin_include_directory field of the crosstool proto, so Bazel knows to ignore them during include dependency validation. You can see the builtin include paths of a gcc-compatible compiler by running something like

    $ $CC -x c++ -v - -c -o /dev/null < /dev/null
    

    and looking for the output like

    #include "..." search starts here:
    #include <...> search starts here:
     /usr/include/c++/7
     /usr/include/x86_64-linux-gnu/c++/7
     /usr/include/c++/7/backward
     /usr/lib/gcc/x86_64-linux-gnu/7/include
     /usr/local/include
     /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed
     /usr/include/x86_64-linux-gnu
     /usr/include