libc++ differences between 9.2 and 10.0

Shane Ambler FreeBSD at ShaneWare.Biz
Fri Sep 20 11:16:41 UTC 2013


On 20/09/2013 17:50, Michael Gmelin wrote:
> On Fri, 20 Sep 2013 15:01:58 +0930
> Shane Ambler <FreeBSD at ShaneWare.Biz> wrote:
>
>> I'm Starting to look at fixing my ports to build on 10.0 and there
>> appears to be a difference between 9.2 and 10.0 when it comes to
>> using libc++
>>
>> The first port I am looking at is graphics/opencolorio. a patch was
>> submitted (ports/182220) that works fine on 10.0 but it breaks 9.2
>> build when using clang with -
>> error: no type named 'shared_ptr' in namespace 'std'
>>
>> The patch is simple, just adding -
>>
>> #elif __cplusplus >= 199711
>> #include <memory>
>> #define OCIO_SHARED_PTR std::shared_ptr
>> #define OCIO_DYNAMIC_POINTER_CAST std::dynamic_pointer_cast
>>
>> As far as I can see both 10.0 and 9.2 use the same contrib/libc++
>> contents but I don't see why 9.2 isn't finding std::shared_ptr
>>
>>
>> The other thing is I don't think testing __cplusplus is the right way
>> to go but don't see an alternative. __cplusplus is defined in clang
>> irrespective of the library used so isn't really a reliable test.
>>
>> Are there any defines to easily test for std::shared_ptr or is that a
>> test I need to create for configure or cmake - has already been done?
>
> Hi Shane,
>
> I looks like you're using libstdc++ on 9.2 (the version that comes with
> gcc 4.2). To build with libc++ you need to use
>
> CXXFLAGS+= -std=c++11 -stdlib=libc++.

I tried adding that to the Makefile as well as LDFLAGS+= -stdlib=libc++

Just realised that I put them in a test for OSVERSION between 901000
and 100000 - missed a zero for 10 so it wasn't used ;-) my fault

> Checking for _cplusplus isn't enough, since this only checks for the
> language standard, but not for standard c++ library used.
>
> First you should check for a C++11 enabled compiled (you're checking
> for C++98, which didn't standardize std::shared_ptr)
>
> #elif __cplusplus >= 201103
 >
> Then you should also check which standard library is used (in the end
> you can mix clang C++11 and an old C++ standard library):
>
> #elif  _cplusplus >= 201103 && defined(_LIBCPP_VERSION)
>
> This checks if libc++ is used.
>
> Since all relevant version of libc++ support C++11 features like
> shared_ptr this should be good enough.

That sounds like a reasonable option.

> If you want to stay compatible with newer versions of gcc and libstdc++
> you'll have to figure out how to check for this as well (unfortunately
> I can't tell the exact checks to use from the top of my head).
>

This expands tests for OCIO_USE_BOOST_PTR (windows) and __GNUC__
choosing between boost::shared_ptr and std::tr1:;shareed_ptr




More information about the freebsd-ports mailing list