You may have noticed that current software sometimes requires newer libc++ 
features than the installed system libc++.dylib version can support.

The libcxx port has the capability to install a newer libc++.dylib, currently 
the libc++ that matches llvm-5.0, which is quite recent in terms of OS version. 

The libc++.dylib for llvm-7.0 should be no problem either, I have that one 
working locally. There was an ABI change at llvm-8.0 that might or might not 
break installed libc++ software, so have to check that version more carefully. 
If so, there may be a way to build with the old ABI enabled I understand.

To allow the newer features to be accessed by clang, edit the "__config" file 
in the c++ includes for the clang version you're using, and disable Apple's 
availability tests that assume the system libc++.dylib is still installed.

WIth a new libc++.dylib, some software that is currently disabled or broken on 
older systems will build, eg. mysql8. So far I have tested this on 10.7.5.

$ port -v installed mysql8
The following ports are currently installed:
  mysql8 @8.0.21_0 (active) platform='darwin 11' archs='x86_64' 
date='2020-07-26T11:50:32-0700'


Here are the steps:

1. install the new system roots (doesn't actually install the software into 
/usr ):
sudo port -v -n upgrade --enforce-variants libcxx +replacemnt_libcxx +universal

2. save the old libc++:

(for some systems, you will have to disable SIP)

sudo cp /usr/lib/libc++.1.dylib /usr/lib/libc++.1.dylib.original
sudo cp /usr/lib/libc++abi.dylib /usr/lib/libc++abi.dylib.original

This also installs two cxxabi headers into /usr/linclude. These headers don't 
exist on 10.7.5, so don't need to be backed up it appears, but I haven't yet 
looked at all newer systems to see when they appeared, so you should check for 
them and back them up if they exist before you overwrite them:


3. Install the new libc++.

cd /
sudo tar xzvf /opt/local/var/system_roots/libcxx-5.0.1-4.tgz

$ ls -la /usr/lib/libc++*
-rwxr-xr-x  1 root  admin  2280984 26 Jul 09:12 /usr/lib/libc++.1.dylib
-rwxr-xr-x  1 root  wheel  1621344 26 Jul 09:25 /usr/lib/libc++.1.dylib.original
lrwxr-xr-x  1 root  admin       14 26 Jul 09:12 /usr/lib/libc++.dylib -> 
libc++.1.dylib
-rwxr-xr-x  1 root  admin   478220 26 Jul 09:12 /usr/lib/libc++abi.dylib
-rwxr-xr-x  1 root  wheel   153840 26 Jul 09:26 
/usr/lib/libc++abi.dylib.original

$ ls -la /usr/include/*cxx*
-rwxr-xr-x  1 root  admin  2032 26 Jul 09:12 /usr/include/__cxxabi_config.h
-rwxr-xr-x  1 root  admin  6945 26 Jul 09:12 /usr/include/cxxabi.h


4. Then change macports-clang-N to ignore the Availability tests by editing the 
include/__config file for the clang version you're interested in using, for 
example for clang-9.0:

bbedit /opt/local/libexec/llvm-9.0/include/c++/v1/__config

and add this near the top:

// for MacPorts, our installed libcxx does not require Apple system 
Availability tests
#define _LIBCPP_DISABLE_AVAILABILITY


If you run into trouble, you can change the libc++ dylib back to the original.

Ken

 

Reply via email to