#!/usr/bin/env python # coding: utf-8 # # detecting ABI version of libraries # # for possible use in conda-build # # This notebook is CC-0 (public domain) # In[42]: import os import re import sys macos_abi_pat = re.compile("lib[^\.]+\.([\d\.]+)\.dylib$", re.IGNORECASE) linux_abi_pat = re.compile("lib[^\.]+\.so\.([\d\.]+)$", re.IGNORECASE) abi_pat = macos_abi_pat if sys.platform == 'darwin' else linux_abi_pat SHLIB_EXT = '.dylib' if sys.platform == 'darwin' else '.so' def detect_abi_version(libname): """Return the ABI version of a library given 'libzmq' return '5' as its ABI version because $PREFIX/lib/libzmq.dylib is a symlink to libzmq.5.dylib or $PREFIX/lib/libzmq.so is a symlink to libzmq.so.5 """ lib = os.path.join(sys.prefix, 'lib', libname + SHLIB_EXT) if not os.path.exists(lib): raise OSError("%s does not exist" % lib) if not os.path.islink(lib): print("%s is not a symlink, no ABI info found" % lib) # libfoo.dylib is not a symlink, no ABI version to find return target = os.readlink(lib) target_libname = os.path.basename(target) match = abi_pat.match(target_libname) if not match: print("No ABI found in %s" % target_libname) return return match.group(1) # In[43]: detect_abi_version("libzmq") # In[44]: detect_abi_version("libsodium") # In[45]: detect_abi_version("libicui18n") # In[46]: detect_abi_version("libpython3.6m")