[LLVMdev] Building llvm from source with clang instead of gcc
Edward Diener
eldlistmailingz at tropicsoft.com
Sun Jan 6 08:45:37 PST 2013
On 1/6/2013 9:47 AM, Justin Holewinski wrote:
> On Sat, Jan 5, 2013 at 11:08 PM, Edward Diener
> <eldlistmailingz at tropicsoft.com <mailto:eldlistmailingz at tropicsoft.com>>
> wrote:
>
> On 1/5/2013 8:01 PM, Justin Holewinski wrote:
>
>
> On Sat, Jan 5, 2013 at 5:59 PM, Edward Diener
> <eldlistmailingz at tropicsoft.__com
> <mailto:eldlistmailingz at tropicsoft.com>
> <mailto:eldlistmailingz at __tropicsoft.com
> <mailto:eldlistmailingz at tropicsoft.com>>>
>
> wrote:
>
> On 01/05/2013 01:11 PM, Dmitri Gribenko wrote:
>
> On Sat, Jan 5, 2013 at 7:48 PM, Edward Diener
> <eldlistmailingz at tropicsoft.____com
> <mailto:eldlistmailingz at __tropicsoft.com
> <mailto:eldlistmailingz at tropicsoft.com>>> wrote:
>
>
> I actually found out that llvm/configure will
> choose clang
> if it is
> found in the path. This contradicts what is written at
> http://llvm.org/docs/____GettingStarted.html#____requirements
> <http://llvm.org/docs/__GettingStarted.html#__requirements>
>
> <http://llvm.org/docs/__GettingStarted.html#__requirements
> <http://llvm.org/docs/GettingStarted.html#requirements>>,
>
> where it says it
> will use the first GCC it finds. Perhaps that
> explanation
> needs to be
> updated.
>
>
> Updated docs in r171630.
>
> Finally I found that if llvm/configure uses clang
> instead of
> gcc, it
> invariably fails on my Linux distros because it is
> using the gcc
> distributed included directories and an earlier
> version of
> clang will
> often fail with these gcc header files. Once I force
> llvm/configure to
> use gcc, building llvm/clang succeeds again.
>
>
> Right. Maybe we need to skip old clang versions in
> this case.
>
>
> I think this should be done until clang can use its own
> header files
> and libraries, when it is installed as a binary, rather
> than the
> ones that gcc installs. In fact I am a bit amazed that
> clang does
> not already have its own header files and libraries for use
> when one
> tries llvm/configure and it sets up llvm's build system to
> use clang
> as its compiler. Is this the fault of clang or is it the
> fault of
> the llvm/configure system ?
>
>
> There is no complete solution for LLVM-only headers/libraries yet on
> Linux. For C++, you can use libc++, but you still need some GCC
> libraries (or alternatives). And you will at least need glibc or
> another compatible C runtime.
>
>
> Should not what it is needed by clang to work correctly under Linux
> be posted somewhere on the clang Getting Started web page ? Even
> what you posted above requires guesswork on my part.
>
>
> Clang will attempt to use your installed system libraries, usually
> libstdc++ and glibc on a Linux distribution. We could probably maintain
> a libstdc++ compatibility table that says clang x.y is compatible with
> libstdc++ up to z.w. In the vast majority of cases, this just works if
> you install a somewhat-newer version of clang. The problems arise when
> you use an older clang with a newer libstdc++ (e.g. newer gcc and/or
> linux distribution).
This is what evidently happens. A clang binary distribution gets created
for a particular Linux distro but there is no compatibility in the
package which states that it only works with some version of libstdc++
or glibc or earlier. Then a later version of gcc gets installed and with
it a later version of libstdc++ and glibc as a dependency. Now the
binary version of clang no longer works on that system because of the
updates to the C/C++ standard library.
I do not believe this should ever happen. I am not focusing blame but
simply saying that from an end-user's POV this is not acceptable if one
wants to use clang without having to build it oneself.
>
>
> Am I supposed to install libc++ and glibc in a Linux distro for
> clang to work correctly ?
>
>
> glibc will already be there. libc++ is purely optional. Clang will
> happily use libstdc++ (which comes with your linux distribution), but
> newer libstdc++ versions may use new GCC extensions that clang does not
> yet support. This is an unfortunate condition that arises from
> depending on GNU libraries that assume GCC. At this time, libc++ is not
> entirely self-contained on Linux and still requires some GCC libraries
> for some external functions.
>
>
> Which versions do I need ?
>
>
> I'm guessing you are running into issues with the C++ standard library
> headers. In that case, it depends on which clang version you are using.
> For compatibility reasons, it is best to always use the latest
> released clang (if not trunk). If you try again with 3.2, I bet your
> problems go away.
>
>
> How do I tell clang what to use or is this automatically figured out
> by clang ?
>
>
> There are ways to override the location for the headers/libraries of
> libstdc++, but I would not recommend this. Upgrading to a newer clang
> should be easier in the long run.
>
>
> Will llvm/configure use these libraries if I let it choose a clang
> binary in order to build the latest llvm/clang from source ?
>
>
> Which libraries? An older libstdc++? You can use CXXFLAGS and LDFLAGS
> to adjust the library search paths, just as you use CXX to set the
> compiler to use.
>
>
> Generally, it is recommended to bootstrap clang:
>
> 1. Build llvm/clang with system gcc
> 2. Build llvm/clang with new clang
> 3. Install new clang somewhere (which will automatically use system
> libstdc++/glibc).
>
> This should solve your problem.
OK, this sounds good. Can this process not be explained on the clang
Getting Started page for those who are building clang from source. I am
not sure how step 3) is supposed to go. Do I just copy the built bin
directory somewhere else and then put it first in my PATH, before
running llvm/configure ? Or is "Install new clang" more complicated than
that ?
Originally I thought I could have both an earlier binary version of
clang as well as the latest built version of clang in a Linux distro so
that I could test code on both for compatibility of my library for
end-users. But with the fairly common breakage of the binary version
package of clang when libstdc++/glibc gets updated, this has become much
less of a reality.
More information about the llvm-dev
mailing list