Bootstrapping with in-tree libcxx

When I tried to build with -DLLVM_ENABLE_LIBCXX, I found out that
it doesn't try to use the in-tree libcxx but looks for one built and installed
in the system.

Since building all of llvm required CXX and using libcxx with the same
version as the rest of llvm makes sense, I would certainly appreciate
an option to build the in-tree libcxx as a first step and use it in when
building llvm, lld, lldb, clang, ...

Since llvm already builds many other DSOs it needs at runtime, adding
libcxx is reasonable. More so if we consider that not all systems package
libcxx at the same version as clang and llvm. For instance, Arch Linux
has libcxx 3.8.0 but llvm and clang 3.9.0.

When I tried to build with -DLLVM_ENABLE_LIBCXX, I found out that
it doesn't try to use the in-tree libcxx but looks for one built and
installed
in the system.

IIRC, -DLLVM_ENABLE_LIBCXX reduces to passing --stdlib=libc++ (see [1]) to
the compiler.

What you can do is a two-stage build. On the first stage, build just libc++
(ninja cxx cxxabi). On the second stage, re-configure with
-DLLVM_ENABLE_LIBCXX and build the rest of the tools. We have a downstream
builder that works this way to avoid a libstdc++ defect on the host
platform. I can't remember the exact details, can dig them up if it helps.

Cheers,

/ Asiri

[1] http://libcxx.llvm.org/docs/UsingLibcxx.html

Yes please, that would be helpful as an interim workaround.

If you’re willing to install libc++ you can easily work around this by running ninja install-cxx install-cxxabi before running any of the LLVM or Clang build targets.

/Eric

I don't want to detach libcxx from the installation of the rest of llvm,
but if I can tell ninja to install to a temporary prefix for the build
which is nuked later, this could work.

In fact, I've had problems with ninja using absolute paths which
made it impossible to relocate the install.

Hmm, I have mis-remembered. We do have a two-stage build, but probably not
what you want; stage-1 builds clang + libcxx using the host compiler (no
-DLLVM_USE_LIBCXX is passed). Then the stage-2 build uses the compiler
built on stage-1, along with the extra -DLLVM_USE_LIBCXX option.

I'll dig around a bit further, I thought this worked out of the box tbh.

/ Asiri

A bootstrap 2-stage build is the usual way to get there. I’m not sure I really get the motivation of what we’re trying to achieve here that is really useful in a 1-stage build?