wiki:LibcxxOnOlderSystems

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

--

Using libc++ on older system

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, it is reccomended since you need to set buildfromsource.

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.

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 -s 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++

  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
    
  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 macports-clang-3.3 gcc-4.2 apple-gcc-4.2 gcc-4.0
    
  3. Uninstall all the remaining inactive ports:
    sudo port -v -f uninstall inactive
    
  4. Build a newer clang compiler using libc++ and uninstall the old one using libstdc++:
    sudo port -v install clang-3.5
    sudo port -v uninstall llvm-3.4 clang-3.4
    
  5. Either:
    1. Edit /opt/local/etc/macports/macports.conf again to add macports-clang-3.5 before macports-clang-3.4.
    2. Rebuild clang-3.4 using clang-3.5:
      sudo port -v install clang-3.4 configure.compiler=macports-clang-3.5
      

Leopard (ppc)

PowerPC support is still under heavy development 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 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, I've been able to build libc++ for ppc but have not given it much testing:

sudo port -v -s install clang-3.6

# Doesn't actually install the intel libc++ from the system, just the root
sudo port -v -f uninstall libcxx libcxxabi libmacho libunwind

# ld crashes in getsectiondata linking the ppc slice of libmacho if libmacho is built with macports-clang-3.6
sudo port -v -s install libunwind universal_archs="x86_64 i386 ppc" configure.compiler=gcc-4.2

sudo port -v -s install libcxx universal_archs="x86_64 i386 ppc" configure.compiler=macports-clang-3.6

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.