# # Name: Makehead.macosx-clang # # Purpose: This file is used to customize operating system and installation # dependent features of the Mp makefiles. This version is # customized for MacOS X running on an x86_64 Macintosh using Clang. # # Please note that modules dynamically loaded via the dlopen() # style API from Linux, Solaris, etc. must be compiled and linked # as Mach-O bundles rather than dylib shared libraries. Thus, # the fact that I am creating bundles below is _not_ a mistake. # #MX_PYTHON = 2.7 ifndef MX_PYTHON MX_PYTHON = $(shell python3 -V 2>&1 | cut -f2 -d' ' | cut -f1-2 -d'.') endif $(info Python is [${MX_PYTHON}]) PYTHON_MAJOR = $(shell echo ${MX_PYTHON} | cut -f1 -d'.') #$(info PYTHON_MAJOR is [${PYTHON_MAJOR}]) #==== ifndef MACOS_MACHINE_TYPE MACOS_MACHINE_TYPE = $(shell uname -m) endif $(info MACOS_MACHINE_TYPE is [${MACOS_MACHINE_TYPE}]) #==== ifeq ($(MACOS_MACHINE_TYPE),arm64) PYTHON_FRAMEWORK_DIR = /Library/Frameworks/Python.framework else ifeq ($(PYTHON_MAJOR),3) PYTHON_FRAMEWORK_DIR = /System/Volumes/Data/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework else PYTHON_FRAMEWORK_DIR = /System/Library/Frameworks/Python.framework endif $(info PYTHON_FRAMEWORK_DIR is [${PYTHON_FRAMEWORK_DIR}]) #==== PYTHON_DIR = $(PYTHON_FRAMEWORK_DIR)/Versions/$(MX_PYTHON) $(info PYTHON_DIR is [${PYTHON_DIR}]) PYTHON_INCLUDES = -I$(PYTHON_DIR)/include/python$(MX_PYTHON) # # !!!!!!!!!! WARNING !!!!!!!!!! # # For macOS Catalina and later, it is not possible to build the Mp*.pyc # modules until _after_ libMp.dylib and MpPrivate.so have been installed. # So we must move the build of MpNum.pyc to the 'make install' step. # # Do NOT give any arguments to OPTIONAL_MODULES for the macosx-clang target! OPTIONAL_MODULES = # #========================================================================= # # Generally, you should not have to modify anything after this point. # ifeq ($(PYTHON_MAJOR),2) PYTHON = python else PYTHON = python$(PYTHON_MAJOR) endif $(info PYTHON is [${PYTHON}]) #---- PYTHON_BIN = $(shell which ${PYTHON}) $(info PYTHON_BIN is [${PYTHON_BIN}]) #---- MP_BUILD_PYC = $(PYTHON) MpBuildPyc.pyx CC = clang CFLAGS = -g -O -fPIC -fno-common $(GCCFLAGS) $(INCLUDES) $(PYTHON_INCLUDES)\ -DOS_MACOSX $(EXTRA_FLAGS) -DDEBUG MAKEDEPEND = $(CC) -MM $(CFLAGS) mp_*.c > Makefile.depend MAKEDEPEND_CLEAN = rm Makefile.depend #--------------------------------------------------------------------- LIBMP_OBJS = $(LIBMP_SRCS:.c=.$(OBJ)) LIBMP_NAME = libMp.dylib LIBMP_BUILD_NAME = $(PWD)/$(LIBMP_NAME) LIBMP_INSTALL_NAME = $(MX_INSTALL_DIR)/lib/$(LIBMP_NAME) LIBMP_STATIC_NAME = libMp.a LIBMP_DELETE = rm $(LIBMP_NAME) $(LIBMP_STATIC_NAME) #--- $(LIBMP_NAME): $(LIBMP_OBJS) -$(LIBMP_DELETE) $(CC) -dynamiclib -o $(LIBMP_NAME) $(LIBMP_OBJS) $(MP_LIBRARIES) \ -undefined suppress -flat_namespace install_name_tool -change libMx.dylib \ $(MX_INSTALL_DIR)/lib/libMx.dylib \ $(LIBMP_NAME) ar rcs $(LIBMP_STATIC_NAME) $(LIBMP_OBJS) ranlib $(LIBMP_STATIC_NAME) #--------------------------------------------------------------------- # # !!!!!!!!!! WARNING !!!!!!!!!! # # For macOS Catalina and later, it is not possible to build the Mp*.pyc # modules until _after_ libMp.dylib and MpPrivate.so have been installed. # So we must move the build of the pyc files to the 'make install' step. # MP_PYTHON_MODULES = #--------------------------------------------------------------------- MP_MODULE_NAME = MpPrivate.so MP_MODULE_OBJS = $(MP_MODULE_SRCS:.c=.$(OBJ)) #--------------------------------------------------------------------- MP_MODULE_DELETE = rm $(MP_MODULE_NAME) $(MP_MODULE_NAME): $(MP_MODULE_OBJS) $(LIBMP_NAME) -$(MP_MODULE_DELETE) $(CC) -bundle -undefined suppress -flat_namespace \ -o $(MP_MODULE_NAME) $(MP_MODULE_OBJS) \ $(LIBMP_NAME) $(MP_LIBRARIES) install_name_tool -change libMp.dylib \ `pwd`/libMp.dylib \ -change libMx.dylib \ $(MX_INSTALL_DIR)/lib/libMx.dylib \ $(MP_MODULE_NAME) # echo "#! ${PYTHON_BIN}" > mpscript.temp tail -n +2 ../mpscript/mpscript >> mpscript.temp # echo "#! ${PYTHON_BIN}" > mpenv.temp tail -n +2 ../mpscript/mpenv >> mpenv.temp #--------------------------------------------------------------------- INCLUDES = -I$(LIBMXSRC) MP_LIBRARIES = -L$(LIBMXSRC) -lMx -lc #--------------------------------------------------------------------- mp_install_main: -mkdir $(MX_INSTALL_DIR)/bin -mkdir $(MX_INSTALL_DIR)/lib -mkdir $(MX_INSTALL_DIR)/lib/mp /usr/bin/install -c -m 644 $(LIBMP_NAME) $(MX_INSTALL_DIR)/lib $(MX_INSTALL_DIR)/bin/mx_mac_fix_lib_path \ $(MX_INSTALL_DIR)/lib/$(LIBMP_NAME) \ $(MX_INSTALL_DIR)/lib/libMx.dylib /usr/bin/install -c -m 644 $(LIBMP_STATIC_NAME) $(MX_INSTALL_DIR)/lib /usr/bin/install -c -m 644 *.py $(MX_INSTALL_DIR)/lib/mp /usr/bin/install -c -m 644 MpPrivate.so $(MX_INSTALL_DIR)/lib/mp $(MX_INSTALL_DIR)/bin/mx_mac_fix_lib_path \ $(MX_INSTALL_DIR)/lib/mp/$(MP_MODULE_NAME) \ $(MX_INSTALL_DIR)/lib/libMp.dylib $(MX_INSTALL_DIR)/bin/mx_mac_fix_lib_path \ $(MX_INSTALL_DIR)/lib/mp/$(MP_MODULE_NAME) \ $(MX_INSTALL_DIR)/lib/libMx.dylib /usr/bin/install -c -m 755 ../mpscript/mpshell $(MX_INSTALL_DIR)/bin /usr/bin/install -c -m 755 mpscript.temp $(MX_INSTALL_DIR)/bin/mpscript /usr/bin/install -c -m 755 mpenv.temp $(MX_INSTALL_DIR)/bin/mpenv /usr/bin/install -c -m 755 ../net/mpnet $(MX_INSTALL_DIR)/bin ( cd $(MX_INSTALL_DIR)/bin ; ln -sf mpnet mpget ) ( cd $(MX_INSTALL_DIR)/bin ; ln -sf mpnet mpput ) ( cd $(MX_INSTALL_DIR)/bin ; ln -sf mpnet mnget ) ( cd $(MX_INSTALL_DIR)/bin ; ln -sf mpnet mnput ) # !!!!!!!!!! SPECIAL CASE !!!!!!!!!! # # The initial build of the *.pyc files for the macos-clang build target must be # deferred until everything else has been installed. The traditional build # method for *.pyc files will trigger a Python ImportError for dlopen() that # says this # # "file system relative paths not allowed in hardened programs" # # mp_install_pyc: Mp.pyc MpScan.pyc MpNum.pyc /usr/bin/install -c -m 644 *.pyc $(MX_INSTALL_DIR)/lib/mp ###mp_install: mp_install_main mp_install_pyc mp_install: mp_install_main