clang and boost

Dear clang/LLVM gurus-

I’m trying clang (off of the trunk) to try and build our C/C++ sources.

Clang compiled the C files properly and a few C++ files OK as well. The problem I currently see is with C++ sources files that use boost headers. The boost headers have relative paths for some headers and clang is unable to get to them.

Any clues to get this working?

Thanks,
-KC

An example:

clang: warning: argument unused during compilation: ‘-mcld’
clang: warning: argument unused during compilation: ‘-fPIE’
In file included from AtomicFileStream.cc:14:
In file included from include/Exceptions.hh:9:
In file included from linux64/include/boost/tr1/tr1/iomanip:16:
bora/build/package/COMPONENTS/boost1430_lin64_gcc412/ob-387294/linux64/include/boost/tr1/detail/config_all.hpp:151:12: fatal error: ‘…/4.2.1/utility’ file not found

include BOOST_TR1_STD_HEADER(utility)

^
bora/build/package/COMPONENTS/boost1430_lin64_gcc412/ob-387294/linux64/include/boost/tr1/detail/config_all.hpp:95:44: note: instantiated from:

define BOOST_TR1_STD_HEADER(name) <…/GNUC.GNUC_MINOR.GNUC_PATCHLEVEL/name>

^
1 error generated.

Thanks,
-KC

To me, it seems more like a boost-issue than a clang-issue, maybe you are more successful on the boost-mailinglist.

2011/4/6 Mark A. Lyan <omineo@gmail.com>

IIUC the issue is that clang masquerades as gcc 4.2.1 to match
llvm-gcc, setting __GNUC__, __GNUC_MINOR__, and GNUC_PATCH_LEVEL__ to
4, 2, and 1. However, Mark doesn't happen to have gcc 4.2.1's
headers. Boost seems to be attempting to include specifically the
headers that go with the version of the compiler being used. Clang
will attempt to use the latest gcc headers installed. Anybody know
why? IMO this logic should be disabled ifdef __clang__.

Reid

IIUC the issue is that clang masquerades as gcc 4.2.1 to match
llvm-gcc, setting __GNUC__, __GNUC_MINOR__, and GNUC_PATCH_LEVEL__ to
4, 2, and 1. However, Mark doesn't happen to have gcc 4.2.1's
headers. Boost seems to be attempting to include specifically the
headers that go with the version of the compiler being used. Clang
will attempt to use the latest gcc headers installed. Anybody know
why? IMO this logic should be disabled ifdef __clang__.

Which boost version are you using?

Only very recently has boost and clang started working well together. I would advise upgrading to the latest version of boost.

Chris

Thanks Christopher.

IIUC the issue is that clang masquerades as gcc 4.2.1 to match
llvm-gcc, setting GNUC, GNUC_MINOR, and GNUC_PATCH_LEVEL__ to
4, 2, and 1. However, Mark doesn’t happen to have gcc 4.2.1’s
headers. Boost seems to be attempting to include specifically the
headers that go with the version of the compiler being used. Clang
will attempt to use the latest gcc headers installed. Anybody know
why? IMO this logic should be disabled ifdef clang.

Which boost version are you using?

I’m using boost-1.43 as of now. But, will try to upgrade to 1.46.1 and see if that helps.

IIUC the issue is that clang masquerades as gcc 4.2.1 to match
llvm-gcc, setting GNUC, GNUC_MINOR, and GNUC_PATCH_LEVEL__ to
4, 2, and 1. However, Mark doesn’t happen to have gcc 4.2.1’s
headers. Boost seems to be attempting to include specifically the
headers that go with the version of the compiler being used. Clang
will attempt to use the latest gcc headers installed. Anybody know
why? IMO this logic should be disabled ifdef clang.

Hm… interesting. So, if I were to add a clang clause and define my own path there, it would work, but, I do not want to patching boost and carry these patches on, everytime I upgrade.

But, that might work for the near future. Thanks much for your advice.

Hello,

Hm.. interesting. So, if I were to add a __clang__ clause and define my own path there, it would work, but, I do not want to patching boost and carry these patches on, everytime I upgrade.

Using boost 1.46.1 here. I just compiled the following line successfully with clang 128404:

#include <boost/tr1/tr1/iomanip>

I only got two warnings about #include_next being an extension.

Boost got support for clang in 1.46.1 (including recognizing its C++0x features).

Jonathan

I am new to Clang. I try to use clang-2.9-mingw to build Boost_1_52_0. One
problem I have is that $(Includes) is not set when build with bjam. I tried
to workaround that by modifying clang-linux.jam to hard-code the include
path.

actions compile.c++.without-pth {
  "$(CONFIG_COMMAND)" -c -x c++ $(OPTIONS) $(USER_OPTIONS) -D$(DEFINES)
-I"C:\boost_1_52_0\boost_1_52_0\boost\compatibility\cpp_c_headers"
-I"C:\boost_1_52_0\boost_1_52_0" -I"C:\boost_1_52_0\boost_1_52_0\boost"
-I"C:\boost_1_52_0\boost_1_52_0\boost\tr1\tr1" -o "$(<)" "$(>)"
}

This helped to get around some of the include path issues but I stuck with
the following message:

In file included from C:\boost_1_52_0\boost_1_52_0\boost\tr1\tr1/utility:19:
C:\boost_1_52_0\boost_1_52_0/boost/tr1/detail/config_all.hpp:161:12: fatal
error
: '../include/utility' file not found
# include BOOST_TR1_STD_HEADER(utility)
           ^
C:\boost_1_52_0\boost_1_52_0/boost/tr1/detail/config_all.hpp:83:41: note:
instantiated from:
# define BOOST_TR1_STD_HEADER(name) <../include/name>

My question is: What do I need to do to get Clang to set up the include path
correctly?

I'm not sure what the problem is, but you should use a newer version
of Clang. Clang development moves fast, and version 2.9 is now very
far behind in terms of language support.

Richard Smith wrote

Pass it -triple i386-pc-mingw32, but this will probably assume that your mingw is located in C:\mingw

I made change in the .jam file with the following:

actions compile.c++.without-pth {
  "$(CONFIG_COMMAND)" -triple i386-pc-mingw32 -c -x c++ $(OPTIONS)
$(USER_OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -o "$(<)" "$(>)"
}

I am still getting the same error of using Visual Studio include headers. I
have MingW toolset installed on C:\mingW

Nikola Smiljanic wrote