1##---------------------------------------------------------------------
2# GNUmakefile for python
3# Call Makefile to do the work, but for the install case, unpack the
4# tarball to create the project source directory
5##---------------------------------------------------------------------
6PROJECT = python
7VERSION = 2.6.9
8
9PWD := $(shell pwd)
10
11ifeq ($(MAKECMDGOALS),)
12MAKECMDGOALS = no_target
13endif
14ifneq ($(filter no_target install,$(MAKECMDGOALS)),)
15ifndef DSTROOT
16ifdef DESTDIR
17export DSTROOT := $(shell mkdir -p '$(DESTDIR)' && echo '$(DESTDIR)')
18else
19export DSTROOT := /
20endif
21endif
22ifndef OBJROOT
23export OBJROOT := $(shell mkdir -p '$(PWD)/OBJROOT' && echo '$(PWD)/OBJROOT')
24endif
25ifndef SYMROOT
26export SYMROOT := $(shell mkdir -p '$(PWD)/SYMROOT' && echo '$(PWD)/SYMROOT')
27endif
28endif
29
30ifndef SRCROOT
31export SRCROOT := $(PWD)
32endif
33ifndef RC_ARCHS
34export RC_ARCHS := $(shell arch)
35export RC_$(RC_ARCHS) := YES
36endif
37ifndef RC_CFLAGS
38export RC_CFLAGS := $(foreach A,$(RC_ARCHS),-arch $(A)) $(RC_NONARCH_CFLAGS)
39endif
40ifndef RC_NONARCH_CFLAGS
41export RC_NONARCH_CFLAGS = -pipe
42endif
43ifndef RC_ProjectName
44export RC_ProjectName = $(PROJECT)
45endif
46
47NAME = Python
48export PYTHON_CURRENT_VERSION = $(shell echo $(VERSION) | sed 's/[a-z].*$$//')
49NAMEVERS = $(NAME)-$(VERSION)
50TARBALL = $(NAMEVERS).tar.xz
51FIX = '$(OBJROOT)/fix'
52
53VERS := $(shell echo $(VERSION) | sed 's/\(^[0-9]*\.[0-9]*\).*/\1/')
54FRAMEWORKS = /System/Library/Frameworks
55PYFRAMEWORK = $(FRAMEWORKS)/Python.framework
56VERSIONSVERS = $(PYFRAMEWORK)/Versions/$(VERS)
57INCLUDEPYTHONVERS = $(VERSIONSVERS)/include/$(PROJECT)$(VERS)
58LIBPYTHONVERS = $(VERSIONSVERS)/lib/$(PROJECT)$(VERS)
59
60DYLIB = lib$(PROJECT)$(VERS).dylib
61USRINCLUDE = /usr/include
62USRLIB = /usr/lib
63EXTRAS = $(VERSIONSVERS)/Extras
64LIBRARYPYTHON = /Library/Python/$(VERS)
65SITEPACKAGES = $(LIBRARYPYTHON)/site-packages
66
67EXTRASPYTHON = '$(DSTROOT)$(EXTRAS)/lib/python'
68PYTHON = '$(OBJROOT)/$(PROJECT)/$(PROJECT).exe'
69PYTHONENV = DYLD_FRAMEWORK_PATH='$(DSTROOT)$(FRAMEWORKS)' DYLD_NEW_LOCAL_SHARED_REGIONS=1 PYTHONPATH='$(DSTROOT)$(LIBPYTHONVERS)':$(EXTRASPYTHON)
70PYDTRACE_H = $(OBJROOT)/$(PROJECT)/Python/pydtrace.h
71
72no_target: python
73
74python: $(OBJROOT)/$(PROJECT)
75	DSTROOT='$(DSTROOT)' OBJROOT='$(OBJROOT)/$(PROJECT)' \
76	    SRCROOT='$(OBJROOT)' SYMROOT='$(SYMROOT)' RC_ARCHS='$(RC_ARCHS)' \
77	    DYLD_NEW_LOCAL_SHARED_REGIONS=1 \
78	    $(MAKE) -C '$(OBJROOT)' -f Makefile \
79	    DSTROOT='$(DSTROOT)' OBJROOT='$(OBJROOT)/$(PROJECT)' \
80	    SRCROOT='$(OBJROOT)' SYMROOT='$(SYMROOT)' RC_ARCHS='$(RC_ARCHS)' \
81	    VERS=$(VERS)
82
83##---------------------------------------------------------------------
84# We patch configure to remove the "-arch_only ppc" option, since we
85# build fat.  We also set DYLD_NEW_LOCAL_SHARED_REGIONS or else python.exe
86# will crash.  And patch unixccompiler for wxWidgets (submit back to python).
87#
88# autoconf is now (normally) unavailable.  So we save the output of autoconf
89# in fix/autoconf and use it to overwrite the original files.  If we need
90# to update the version of python, we will need to install autoconf, and then
91# we run:
92#
93#    % make `pwd`/python OBJROOT=`pwd` PYTHON_AUTOCONF=NO
94#    % mv python python.bak
95#    % make `pwd`/python OBJROOT=`pwd` PYTHON_AUTOCONF=YES
96#    % diff -r --brief python.bak python
97#
98# Make a tarball out of the differences and put in $(FIX)/autoconf.tar.bz2
99##---------------------------------------------------------------------
100defarchflags = $(foreach u,$(RC_ARCHS),-arch $(u))
101
102$(OBJROOT)/$(PROJECT):
103	@set -x && \
104	cd '$(OBJROOT)' && \
105	tar -xof $(TARBALL) && \
106	rm -rf $(PROJECT) && \
107	mv $(NAMEVERS) $(PROJECT) && \
108	ed - $(PROJECT)/Include/py_curses.h < $(FIX)/py_curses.h.ed && \
109	ed - $(PROJECT)/Include/pymactoolbox.h < $(FIX)/pymactoolbox.h.ed && \
110	ed - $(PROJECT)/Lib/ctypes/__init__.py < $(FIX)/Lib_ctypes___init__.py.ed && \
111	ed - $(PROJECT)/Lib/xml/__init__.py < $(FIX)/Lib_xml___init__.py.ed && \
112	ed - $(PROJECT)/Lib/distutils/command/install.py < $(FIX)/install.py.ed && \
113	ed - $(PROJECT)/Lib/distutils/config.py < $(FIX)/Lib_distutils_config.py.ed && \
114	sed 's/@DEFARCHFLAGS@/$(defarchflags)/' $(FIX)/sysconfig.py.ed | ed - $(PROJECT)/Lib/distutils/sysconfig.py && \
115	ed - $(PROJECT)/Lib/distutils/unixccompiler.py < $(FIX)/unixccompiler.py.ed && \
116	ed - $(PROJECT)/Lib/distutils/util.py < $(FIX)/Lib_distutils_util.py.ed && \
117	ed - $(PROJECT)/Lib/locale.py < $(FIX)/locale.py.ed && \
118	ed - $(PROJECT)/Lib/logging/handlers.py < $(FIX)/Lib_logging_handlers.py.ed && \
119	ed - $(PROJECT)/Lib/os.py < $(FIX)/Lib_os.py.ed && \
120	ed - $(PROJECT)/Lib/plat-mac/bundlebuilder.py < $(FIX)/bundlebuilder.py.ed && \
121	ed - $(PROJECT)/Lib/plat-mac/Carbon/AppleEvents.py < $(FIX)/AppleEvents.py.ed && \
122	ed - $(PROJECT)/Lib/platform.py < $(FIX)/Lib_platform.py.ed && \
123	ed - $(PROJECT)/Lib/pydoc.py < $(FIX)/pydoc.py.ed && \
124	ed - $(PROJECT)/Lib/rlcompleter.py < $(FIX)/rlcompleter.py.ed && \
125	ed - $(PROJECT)/Lib/site.py < $(FIX)/site.py.ed && \
126	ed - $(PROJECT)/Lib/test/test__locale.py < $(FIX)/Lib_test_test__locale.py.ed && \
127	ed - $(PROJECT)/Lib/test/test_httpservers.py < $(FIX)/Lib_test_test_httpservers.py.ed && \
128	ed - $(PROJECT)/Lib/test/test_platform.py < $(FIX)/Lib_test_test_platform.py.ed && \
129	ed - $(PROJECT)/Mac/Makefile.in  < $(FIX)/Mac_Makefile.in.ed && \
130	patch $(PROJECT)/Mac/Modules/cf/_CFmodule.c $(FIX)/_CFmodule.c.patch && \
131	ed - $(PROJECT)/Mac/Modules/cg/_CGmodule.c  < $(FIX)/_CGmodule.c.ed && \
132	ed - $(PROJECT)/Mac/Tools/pythonw.c < $(FIX)/pythonw.c.ed && \
133	ed - $(PROJECT)/Makefile.pre.in < $(FIX)/Makefile.pre.in.ed && \
134	patch $(PROJECT)/Misc/python.man $(FIX)/python.man.patch && \
135	ed - $(PROJECT)/Modules/_cursesmodule.c < $(FIX)/_cursesmodule.c.ed && \
136	ed - $(PROJECT)/Modules/dlmodule.c < $(FIX)/dlmodule.c.ed && \
137	ed - $(PROJECT)/Modules/errnomodule.c < $(FIX)/errnomodule.c.ed && \
138	rm $(PROJECT)/Modules/expat/expat.h $(PROJECT)/Modules/expat/expat_external.h && \
139	ed - $(PROJECT)/Modules/getpath.c < $(FIX)/getpath.c.ed && \
140	ed - $(PROJECT)/Modules/_localemodule.c < $(FIX)/_localemodule.c.ed && \
141	ed - $(PROJECT)/Modules/posixmodule.c < $(FIX)/posixmodule.c.ed && \
142	ed - $(PROJECT)/Modules/pwdmodule.c < $(FIX)/pwdmodule.c.ed && \
143	ed - $(PROJECT)/Modules/pyexpat.c < $(FIX)/Modules_pyexpat.c.ed && \
144	sed 's/@VERSION@/$(VERS)/' $(FIX)/python.c.ed | ed - $(PROJECT)/Modules/python.c && \
145	ed - $(PROJECT)/Modules/readline.c < $(FIX)/readline.c.ed && \
146	ex - $(PROJECT)/Modules/selectmodule.c < $(FIX)/selectmodule.c.ex && \
147	ed - $(PROJECT)/pyconfig.h.in < $(FIX)/pyconfig.h.in.ed && \
148	ed - $(PROJECT)/Python/ceval.c < $(FIX)/ceval.c.ed && \
149	ed - $(PROJECT)/Python/dynload_shlib.c < $(FIX)/dynload_shlib.c.ed && \
150	ed - $(PROJECT)/Python/mactoolboxglue.c < $(FIX)/mactoolboxglue.c.ed && \
151	ed - $(PROJECT)/setup.py < $(FIX)/setup.py.ed && \
152	for i in `find $(PROJECT)/Mac -name setup.py | xargs fgrep -l "'-framework', 'Carbon'"`; do \
153	    ed - $$i < $(FIX)/Mac_setup.py.ed || exit 1; \
154	done && \
155	for i in `find $(PROJECT)/Lib -name __init__.py -size 0c`; do \
156	    echo '#' > $$i; \
157	done && \
158	echo > $(PROJECT)/Lib/test/nullcert.pem
159ifdef PYTHON_AUTOCONF
160	@set -x && \
161	cd '$(OBJROOT)' && \
162	ed - $(PROJECT)/configure.in < $(FIX)/configure.in.ed
163ifeq ($(PYTHON_AUTOCONF),YES)
164	cd '$(OBJROOT)/$(PROJECT)' && autoconf
165endif
166else # !PYTHON_AUTOCONF
167	tar -xof $(FIX)/autoconf.tar.bz2 -C '$(OBJROOT)/$(PROJECT)'
168endif
169	dtrace -h -s $(FIX)/pydtrace.d -o '$(PYDTRACE_H)'
170
171install: installpython
172	install $(FIX)/audiotest.au $(DSTROOT)$(LIBPYTHONVERS)/email/test/data/audiotest.au
173	install $(FIX)/audiotest.au $(DSTROOT)$(LIBPYTHONVERS)/test/audiotest.au
174
175##---------------------------------------------------------------------
176# PR-3478215 - for backwards compatibility with non-framework python, we
177# create symbolic links in /usr/include and /usr/lib.  We now create the
178# links w.r.t. multiple versioning.  In addition, the PYTHON_DEFAULT
179# environment variable will be set to YES if this version is the default
180# version of python.
181##---------------------------------------------------------------------
182installpython: $(OBJROOT)/$(PROJECT)
183	install -d '$(DSTROOT)/usr/bin'
184	DSTROOT='$(DSTROOT)' OBJROOT='$(OBJROOT)/$(PROJECT)' \
185	    SRCROOT='$(OBJROOT)' SYMROOT='$(SYMROOT)' RC_ARCHS='$(RC_ARCHS)' \
186	    DYLD_NEW_LOCAL_SHARED_REGIONS=1 \
187	    $(MAKE) -C '$(OBJROOT)' -f Makefile install \
188	    DSTROOT='$(DSTROOT)' OBJROOT='$(OBJROOT)/$(PROJECT)' \
189	    SRCROOT='$(OBJROOT)' SYMROOT='$(SYMROOT)' RC_ARCHS='$(RC_ARCHS)' \
190	    VERS=$(VERS)
191	@obj= && \
192	install -d '$(DSTROOT)$(USRINCLUDE)'
193	ln -sf ../..$(INCLUDEPYTHONVERS) '$(DSTROOT)$(USRINCLUDE)/$(PROJECT)$(VERS)'
194	install -d '$(DSTROOT)$(USRLIB)'
195	ln -sf ../..$(LIBPYTHONVERS) '$(DSTROOT)$(USRLIB)/$(PROJECT)$(VERS)'
196	ln -sf ../..$(VERSIONSVERS)/Python '$(DSTROOT)$(USRLIB)/$(DYLIB)'
197ifeq ($(PYTHON_DEFAULT),YES)
198	ln -sf $(DYLIB) '$(DSTROOT)$(USRLIB)/lib$(PROJECT).dylib'
199endif
200	install -d '$(DSTROOT)$(SITEPACKAGES)'
201
202.DEFAULT:
203	@$(MAKE) -f Makefile $@
204