wiki:LibcxxOnOlderSystems

Version 58 (modified by jeremyhu (Jeremy Huddleston Sequoia), 7 years ago) (diff)

--

Using libc++ on older system

If you have been referred to this page, you are likely trying to build software that uses C++11 on OS X 10.8 or earlier. The default C++ runtime on OS X 10.8 and earlier is a version of libstdc++ based on GCC 4.2.1 which does not support C++11. The default C++ runtime on OS X 10.9 and later is libc++ which does support C++11.

The recommended solution, if your computer supports it, is to upgrade to OS X 10.9 or later. If you do this, you can ignore the rest of this article, and should instead see the migration instructions.

Alternately, you can switch MacPorts on OS X 10.8 or earlier to use libc++ instead of libstdc++. This must be done for MacPorts as a whole; it can't be done for individual ports.

At this time the MacPorts project does not build binary packages for libc++ on OS X 10.8 or earlier, so if you make this change, MacPorts will be building all ports from source.

If you use MacPorts C++-using ports as dependencies for C++-using software that you compile outside of MacPorts, you must compile that software using libc++ as well.

Lion and Mountain Lion

Lion and Mountain Lion systems have libc++ installed with the OS but still use libstdc++ as the default C++ runtime. You can use it by passing -stdlib=libc++ as a command line argument to clang++, and you can instruct MacPorts to use it instead of libstdc++ as the default C++ runtime.

  1. Start with a new install of MacPorts or uninstall all ports that use C++
  2. Edit /opt/local/etc/macports/macports.conf to contain:
cxx_stdlib         libc++
buildfromsource    always
delete_la_files    yes

delete_la_files is not necessary for libc++, but it is recommended since you need to set buildfromsource and rebuild all ports from scratch anyways.

Leopard and Snow Leopard (Intel)

Leopard and Snow Leopard do not have libc++ installed by the OS, but MacPorts can build and install system roots that contain these runtimes for your use. After installing these roots (which is done automatically when the libcxxabi and libcxx ports activate), you can choose to continue using libstdc++ as the default C++ runtime in MacPorts or configure MacPorts to use the new libc++ runtime.

Warning: libc++ is fairly well tested on Snow Leopard, and Leopard support was only recently added on November 1, 2016.

Bootstrapping 1: Fix the SDK (Leopard Only)

Leopard's SDK has some bugs that are more visible when using newer toolchains, so please follow the steps in Leopard SDK Fixes first.

Bootstrapping 2: Install libc++ and libc++abi

  1. Start with a new install of MacPorts or uninstall all ports that use C++
  2. Install the libcxx port. When it activates, the libcxxabi and libcxx ports will install libc++.dylib and libc++abi.dylib (which will remain after you uninstall MacPorts). This will pull in a number of dependencies.
    sudo port -v install libcxx
    

At this point, you will have libc++ installed and can use clang++-mp-3.4 -stdlib=libc++ for your personal projects, but like Lion and Mountain Lion, MacPorts will continue to use libstdc++ by default unless you continue with the next step.

Bootstrapping 3: Build a current version of clang against libc++

The instructions below will install clang-3.7. clang-3.8 and clang-3.9 recently started to support Leopard and Snow Leopard.

  1. Deactivate all your active ports (or at least the C++ ports) in order to prepare to rebuild them, and just activate the new toolchain:
    sudo port -v -f deactivate active
    sudo port -v install clang-3.4 ld64 cctools libcxx
    
  2. Edit /opt/local/etc/macports/macports.conf to contain:
    cxx_stdlib         libc++
    buildfromsource    always
    delete_la_files    yes
    default_compilers  macports-clang-3.4 gcc-4.2 apple-gcc-4.2 gcc-4.0
    
  3. Uninstall all the remaining inactive ports:
    sudo port -v -f uninstall inactive
    
  4. Install clang-3.7 against libc++. Note that clang-3.7 is installed here because clang-3.8+ have extra dependencies. You might be able to use clang-3.8+ here, but I haven't tried that yet. Please report back.
    sudo port -v install clang-3.7
    
  5. Disable the variants corresponding to the bootstrap versions of llvm in /opt/local/etc/macports/variants.conf. This ensures that future installs of cctools and ld64 will use a newer version of llvm:
    -llvm34
    +llvm39 # You may need to update this to +llvm40 and higher in the future
    
  6. Edit /opt/local/etc/macports/macports.conf again to add macports-clang-3.7 as preferred compiler:
    default_compilers  macports-clang-3.7 macports-clang-3.4 gcc-4.2 apple-gcc-4.2 gcc-4.0
    
  7. Rebuild cctools and ld64 to use the newer version of llvm (currently llvm-3.9):
    sudo port -v -n upgrade --force --enforce-variants cctools -llvm34 +llvm39
    sudo port -v -n upgrade --force --enforce-variants ld64 -llvm34 +llvm39
    
  8. Snow Leopard Only: Disable the variants corresponding to the older versions of ld64 in /opt/local/etc/macports/variants.conf. This ensures that ld64 will be reinstalled using the appropriate variants in the future:
    -ld64_97
    -ld64_127
    -ld64_236
    
  9. Snow Leopard Only: Reinstall ld64 with the legacy variants disabled to use ld64-latest as the default linker:
    sudo port -v upgrade --enforce-variants ld64 -ld64_97 -ld64_127 -ld64_236
    
  10. Experimental: Install clang-3.9
    sudo port -v install clang-3.9
    
  11. Experimental: Edit /opt/local/etc/macports/macports.conf again to add macports-clang-3.9 as preferred compiler:
    default_compilers macports-clang-3.9 macports-clang-3.8 macports-clang-3.7 macports-clang-3.4 gcc-4.2 apple-gcc-4.2 gcc-4.0
    
  12. Uninstall the bootstrap toolchain:
    sudo port -v deactivate llvm-3.4 clang-3.4
    sudo port -v uninstall inactive
    

Leopard (ppc)

Darwin/PowerPC support is still quite experimental in llvm, so expect things to not be as stable as more established toolchains. Additionally, it is non-trivial to bootstrap libc++ on Leopard because the libcxx port does not build for ppc with versions older than clang-3.6, and clang-3.5 and newer require libc++. After setting up my Leopard/Intel Mac as described above (fully upgraded through 1ad7738a54d1bb11c98455154e6d625680f49b2d), I've been able to build a universal libc++ runtime for ppc:

# clang-3.6 or newer is required for compiling ppc code with clang
sudo port -v -s install clang-3.7

# Re-build libcxx, libcxxabi, libmacho, and libunwind with a ppc slice
sudo port -v -n upgrade --force libmacho +universal universal_archs="x86_64 i386 ppc" configure.compiler=macports-clang-3.7
sudo port -v -n upgrade --force libunwind +universal universal_archs="x86_64 i386 ppc" configure.compiler=macports-clang-3.7
sudo port -v -n upgrade --force libcxxabi +universal universal_archs="x86_64 i386 ppc" configure.compiler=macports-clang-3.7
sudo port -v -n upgrade --force libcxx +universal universal_archs="x86_64 i386 ppc" configure.compiler=macports-clang-3.7

With this, a simple PPC C++ "Hello World" app was able to run successfully on an Intel Mac.

Exceptions are known to not work, and there are likely other problems as well:

Not much more testing has been done than that.

Tiger

I do not have a Tiger machine or VM, so I am not sure how feasible it is to get things working on Tiger. If you are adventurous, I suggest you follow the Leopard instructions above and report issues. Note that it will take a while to build libcxx because we'll need to build apple-gcc42 and use it to build clang-3.4 and use it to build libcxx.