1##
2# Makefile for python
3##
4
5Project               = python
6Extra_Configure_Flags = --enable-ipv6 --with-system-expat --with-threads --enable-framework=/System/Library/Frameworks --enable-toolbox-glue --with-system-ffi
7# Define the environment variable DEBUG to YES, to build without optimization
8ifeq ($(DEBUG),YES)
9Extra_Configure_Flags += --with-pydebug
10endif
11
12##---------------------------------------------------------------------
13# Extra_CC_Flags and Extra_LD_Flags are needed because CFLAGS gets overridden
14# by the RC_* variables.  These values would normally be set by the default
15# python Makefile
16##---------------------------------------------------------------------
17Extra_CC_Flags += -fno-common -fno-strict-aliasing -fwrapv -DENABLE_DTRACE -DMACOSX -DNDEBUG -Wall -Wstrict-prototypes -Wshorten-64-to-32
18Extra_LD_Flags += -Wl,-F.
19Extra_Install_Flags   = DESTDIR='$(DSTROOT)'
20GnuAfterInstall       = fixup-after-install install-plist
21Extra_Environment     = CCSHARED='$(RC_CFLAGS)'
22
23# It's a GNU Source project
24include $(MAKEFILEPATH)/CoreOS/ReleaseControl/GNUSource.make
25
26# Override compiler setting from GNUSource.make to use those set in GNUmakefile
27override CC = $(MY_CC)
28override CXX = $(MY_CXX)
29
30Install_Flags := $(shell echo $(Install_Flags) | sed 's/prefix=[^ ]* *//')
31Install_Target = frameworkinstall
32
33FIX = '$(SRCROOT)/fix'
34
35##---------------------------------------------------------------------
36# Patch Makefiles and pyconfig.h just after running configure
37##---------------------------------------------------------------------
38ConfigStamp2 = $(ConfigStamp)2
39
40configure:: $(ConfigStamp2)
41
42$(ConfigStamp2): $(ConfigStamp)
43	ed - '$(OBJROOT)/Makefile' < $(FIX)/Makefile.ed
44	ed - '$(OBJROOT)/pyconfig.h' < $(FIX)/pyconfig.ed
45	$(TOUCH) $(ConfigStamp2)
46
47##---------------------------------------------------------------------
48# Fixup a lot of problems after the install
49##---------------------------------------------------------------------
50APPS = /Applications
51USRBIN = /usr/bin
52PYTHONAPPNAME = Python.app
53FRAMEWORKS = /System/Library/Frameworks
54PYFRAMEWORK = $(FRAMEWORKS)/Python.framework
55VERSIONSVERS = $(PYFRAMEWORK)/Versions/$(VERS)
56RESOURCESVERS = $(VERSIONSVERS)/Resources
57LIBPYTHONVERS = $(VERSIONSVERS)/lib/python$(VERS)
58PYTHONAPP = $(RESOURCESVERS)/$(PYTHONAPPNAME)
59PACONTENTS = $(PYTHONAPP)/Contents
60PAMACOS = $(PACONTENTS)/MacOS
61RUNPYTHON = DYLD_FRAMEWORK_PATH='$(OBJROOT)' '$(OBJROOT)/python.exe'
62BYTE2UTF16 = $(RUNPYTHON) $(FIX)/byte2utf16.py
63UTF162BYTE = $(RUNPYTHON) $(FIX)/utf162byte.py
64
65fixup-after-install: delete-stuff \
66		     strip-installed-files \
67		     fix-PInfo \
68		     fix-paths \
69		     fix-usr-local-bin \
70		     fix-usr-bin \
71		     fix-permissions \
72		     fix-config-Makefile \
73		     additional-man-pages
74
75# We leave "Build Applet.app" in $(APPS) to be deleted, because it uses
76# Carbon, and doesn't work in 64-bit.  We also leave "Python Launcher.app"
77# in $(APPS) to be deleted (10692664).
78delete-stuff:
79	rm -rf '$(DSTROOT)/usr/local' '$(DSTROOT)$(APPS)'
80
81# We now need to create the .dSYM bundles ourselves
82# ($(DSTROOT)$(PYTHONAPP) is already stripped, so copy an unstripped binary)
83strip-installed-files:
84	ditto '$(DSTROOT)$(PYTHONAPP)' '$(SYMROOT)/$(PYTHONAPPNAME)'
85	ditto '$(OBJROOT)/python.exe' '$(SYMROOT)/$(PYTHONAPPNAME)/Contents/MacOS/Python'
86	$(DSYMUTIL) -o '$(SYMROOT)/$(PYTHONAPPNAME).dSYM' '$(SYMROOT)/$(PYTHONAPPNAME)/Contents/MacOS/Python'
87	$(STRIP) -x '$(DSTROOT)$(PAMACOS)/Python'
88	ditto '$(OBJROOT)/Python.framework' '$(SYMROOT)/Python.framework'
89	$(DSYMUTIL) -o '$(SYMROOT)/Python.framework.dSYM' '$(SYMROOT)/Python.framework/Python'
90	$(STRIP) -x '$(DSTROOT)$(VERSIONSVERS)/Python'
91	ditto '$(DSTROOT)$(LIBPYTHONVERS)'/lib-dynload/*.so '$(SYMROOT)/lib-dynload/'
92	cd '$(SYMROOT)/lib-dynload' && \
93	for so in *.so; do \
94	    $(DSYMUTIL) $$so || exit 1; \
95	done
96	$(STRIP) -x '$(DSTROOT)$(LIBPYTHONVERS)'/lib-dynload/*.so
97
98fix-PInfo:
99	ed - '$(DSTROOT)$(PACONTENTS)/Info.plist' < $(FIX)/pinfo.ed
100	ed - '$(DSTROOT)$(RESOURCESVERS)/Info.plist' < $(FIX)/pinfo.ed
101
102##---------------------------------------------------------------------
103# As of python 2.7, the real man page is now python2.7.1 (not python.1).
104##---------------------------------------------------------------------
105MAN1 = /usr/share/man/man1
106additional-man-pages:
107	mv -f $(DSTROOT)$(MAN1)/python$(VERS).1 $(DSTROOT)$(MAN1)/python.1
108	install -m 0644 $(FIX)/pydoc.1 '$(DSTROOT)$(MAN1)'
109	install -m 0644 $(FIX)/pythonw.1 '$(DSTROOT)$(MAN1)'
110	ln -sf pydoc.1 '$(DSTROOT)$(MAN1)/pydoc$(VERS).1'
111	ln -sf python.1 '$(DSTROOT)$(MAN1)/python$(VERS).1'
112	ln -sf pythonw.1 '$(DSTROOT)$(MAN1)/pythonw$(VERS).1'
113
114PYDOC = $(USRBIN)/pydoc
115PYDOCORIG = $(VERSIONSVERS)/bin/pydoc
116
117##---------------------------------------------------------------------
118# The scripts exec $(VERSIONSVERS)/bin/python$(VERS), which execs
119# $(PAMACOS)/Python.  We skip the extra exec by changing the scripts
120# to exec $(PAMACOS)/Python directly.
121##---------------------------------------------------------------------
122fix-paths:
123	@set -x && \
124	cd '$(DSTROOT)$(VERSIONSVERS)/bin' && \
125	for i in `find . -type f | sed 's,^\./,,'`; do \
126	    if [ -n "`file $$i | fgrep script`" ]; then \
127		ed - $$i < $(FIX)/skipextraexec.ed; \
128	    fi || exit 1; \
129	done
130
131CGIPY = $(LIBPYTHONVERS)/cgi.py
132fix-usr-local-bin:
133	@set -x && \
134	cd '$(DSTROOT)$(VERSIONSVERS)' && \
135	patch -p0 < $(FIX)/usrlocalbin.patch && \
136	$(RUNPYTHON) -c "from py_compile import compile;compile('$(DSTROOT)$(CGIPY)', dfile='$(CGIPY)', doraise=True)" && \
137	$(RUNPYTHON) -O -c "from py_compile import compile;compile('$(DSTROOT)$(CGIPY)', dfile='$(CGIPY)', doraise=True)"
138
139##---------------------------------------------------------------------
140# config/Makefile needs the following changes:
141# remove -arch xxx flags
142# 4144521 - correct LINKFORSHARED
143# 3488297 - point BINDIR to /usr/local/bin
144##---------------------------------------------------------------------
145INSTALLPY = $(LIBPYTHONVERS)/distutils/command/install.py
146SYSCONFIGDATA = $(LIBPYTHONVERS)/_sysconfigdata.py
147fix-config-Makefile:
148	ed - '$(DSTROOT)$(LIBPYTHONVERS)/config/Makefile' < $(FIX)/config_Makefile.ed
149	ed - '$(DSTROOT)$(SYSCONFIGDATA)' < $(FIX)/_sysconfigdata.py.ed
150	$(RUNPYTHON) -c "from py_compile import compile;compile('$(DSTROOT)$(SYSCONFIGDATA)', dfile='$(SYSCONFIGDATA)', doraise=True)" && \
151	$(RUNPYTHON) -O -c "from py_compile import compile;compile('$(DSTROOT)$(SYSCONFIGDATA)', dfile='$(SYSCONFIGDATA)', doraise=True)"
152
153fix-usr-bin:
154	@set -x && \
155	cd '$(DSTROOT)$(USRBIN)' && \
156	rm -f idle* && \
157	for i in *; do \
158	    rm -f $$i && \
159	    ln -s ../..$(VERSIONSVERS)/bin/$$i || exit 1; \
160	done
161
162LIBRARYPYTHON = /Library/Python
163LIBRARYPYTHONVERS = $(LIBRARYPYTHON)/$(VERS)
164
165fix-permissions:
166ifeq ($(shell id -u), 0)
167	@set -x && \
168	for i in Applications Developer Library; do \
169	    chgrp -Rf admin $(DSTROOT)/$$i && \
170	    chmod -Rf g+w $(DSTROOT)/$$i; \
171	done
172endif
173
174OSV = /usr/local/OpenSourceVersions
175OSL = /usr/local/OpenSourceLicenses
176
177install-plist:
178	$(MKDIR) '$(DSTROOT)$(OSV)'
179	$(INSTALL_FILE) '$(SRCROOT)/$(Project).plist' '$(DSTROOT)$(OSV)/$(Project).plist'
180	$(MKDIR) '$(DSTROOT)$(OSL)'
181	$(INSTALL_FILE) '$(OBJROOT)/LICENSE' '$(DSTROOT)$(OSL)/$(Project).txt'
182