1#
2# xbs-compatible Makefile for pyobjc.
3#
4
5#GCC_VERSION := $(shell cc -dumpversion | sed -e 's/^\([^.]*\.[^.]*\).*/\1/')
6#GCC_42 := $(shell perl -e "print ($(GCC_VERSION) >= 4.2 ? 'YES' : 'NO')")
7
8GnuNoConfigure      = YES
9Extra_CC_Flags      = -no-cpp-precomp -g
10Extra_Install_Flags = PREFIX=$(RC_Install_Prefix)
11
12#include $(MAKEFILEPATH)/CoreOS/ReleaseControl/GNUSource.make
13include $(MAKEFILEPATH)/CoreOS/ReleaseControl/Common.make
14
15Install_Target      = install
16
17# Automatic Extract & Patch
18AEP            = YES
19AEP_Project    = $(Project)
20AEP_Version    = 2.3.2a0
21AEP_ProjVers   = $(AEP_Project)-$(AEP_Version)
22AEP_Filename   = $(AEP_ProjVers).tar.gz
23AEP_ExtractDir = $(AEP_ProjVers)
24AEP_Patches    = parser-fixes.diff float.diff CGFloat.diff pyobjc-core_Modules_objc_selector.m.diff pyobjc-core_Modules_objc_objc-runtime-compat.h.diff pyobjc-core_Modules_objc_objc-runtime-compat.m.diff pyobjc-framework-Quartz_Modules__callbacks.m.diff pyobjc-core_Modules_objc_OC_PythonNumber.m.diff
25
26ifeq ($(suffix $(AEP_Filename)),.bz2)
27AEP_ExtractOption = j
28else
29AEP_ExtractOption = z
30endif
31
32# Extract the source.
33DEPRECATED_FRAMEWORKS = pyobjc-framework-ServerNotification pyobjc-framework-CalendarStore
34UNUSED = 02-develop-all.sh PyOpenGL-2.0.2.01 altgraph build-support macholib modulegraph py2app pyobjc pyobjc-metadata pyobjc-website pyobjc-xcode trac-example-plugin
35install_source::
36ifeq ($(AEP),YES)
37	$(TAR) -C $(SRCROOT) -$(AEP_ExtractOption)xof $(SRCROOT)/$(AEP_Filename)
38	$(RM) $(SRCROOT)/$(AEP_Filename)
39	$(RMDIR) $(SRCROOT)/$(AEP_Project)
40	$(MV) $(SRCROOT)/$(AEP_ExtractDir) $(SRCROOT)/$(AEP_Project)
41	@set -x && \
42	cd $(SRCROOT)/$(Project) && \
43	rm -rf $(UNUSED) $(DEPRECATED_FRAMEWORKS) && \
44	for patchfile in $(AEP_Patches); do \
45	    patch -p0 -i $(SRCROOT)/patches/$$patchfile || exit 1; \
46	done && \
47	find . \( -name \*.h -or -name \*.m \) -print0 | xargs -0 egrep -l 'CGFLOAT_DEFINED|NSINTEGER_DEFINED' | while read patchfile; do \
48	    mv -f "$$patchfile" "$$patchfile.orig" && \
49	    { unifdef -DCGFLOAT_DEFINED -DNSINTEGER_DEFINED "$$patchfile.orig" > "$$patchfile" || [ $$? -ne 2 ]; } && \
50	    rm -f "$$patchfile.orig" || exit 1; \
51	done && \
52	find . -name pyobjc_setup.py -print0 | xargs -0 egrep -l 'CGFLOAT_DEFINED|NSINTEGER_DEFINED' | while read patchfile; do \
53	    mv -f "$$patchfile" "$$patchfile.orig" && \
54	    { unifdef -t -DCGFLOAT_DEFINED -DNSINTEGER_DEFINED "$$patchfile.orig" > "$$patchfile" || [ $$? -ne 2 ]; } && \
55	    rm -f "$$patchfile.orig" && \
56	    ed - "$$patchfile" < '$(SRCROOT)/patches/pyobjc_setup.py.ed' || exit 1; \
57	done && \
58	find . -name \*.bridgesupport -print0 | xargs -0 fgrep -l "tollfree='NSCF" | while read patchfile; do \
59	    mv -f "$$patchfile" "$$patchfile.orig" && \
60	    sed "s/tollfree='NSCF/tollfree='__NSCF/" "$$patchfile.orig" > "$$patchfile" && \
61	    rm -f "$$patchfile.orig" || exit 1; \
62	done && \
63	find . -type f -print0 | xargs -0 grep -lw iChat | while read patchfile; do \
64	    mv -f "$$patchfile" "$$patchfile.orig" && \
65	    sed 's/[[:<:]]iChat[[:>:]]/Messages/g' "$$patchfile.orig" > "$$patchfile" && \
66	    rm -f "$$patchfile.orig" || exit 1; \
67	done && \
68	find . -name \*setup.py -print0 | xargs -0 fgrep -l ".extend(['-isysroot'," | while read patchfile; do \
69	    ed - "$$patchfile" < '$(SRCROOT)/patches/isysroot.ed' || exit 1; \
70	done
71	ed - $(SRCROOT)/$(Project)/pyobjc-core/setup.py < '$(SRCROOT)/patches/pyobjc-core_setup.py.ed'
72	ed - $(SRCROOT)/$(Project)/pyobjc-core/Lib/objc/_convenience.py < '$(SRCROOT)/patches/pyobjc-core_Lib_objc__convenience.py.ed'
73	ed - $(SRCROOT)/$(Project)/pyobjc-core/Lib/PyObjCTools/TestSupport.py < '$(SRCROOT)/patches/pyobjc-core_Lib_PyObjCTools_TestSupport.py.ed'
74	ed - $(SRCROOT)/$(Project)/pyobjc-core/Modules/objc/parsexml.m < '$(SRCROOT)/patches/pyobjc-core_Modules_objc_parsexml.m.ed'
75	ed - $(SRCROOT)/$(Project)/pyobjc-framework-CFNetwork/Lib/CFNetwork/PyObjC.bridgesupport < '$(SRCROOT)/patches/pyobjc-framework-CFNetwork_Lib_CFNetwork_PyObjC.bridgesupport.ed'
76	ed - $(SRCROOT)/$(Project)/pyobjc-framework-CFNetwork/PyObjCTest/test_cfhttpstream.py < '$(SRCROOT)/patches/pyobjc-framework-CFNetwork_PyObjCTest_test_cfhttpstream.py.ed'
77	ed - $(SRCROOT)/$(Project)/pyobjc-framework-CFNetwork/PyObjCTest/test_cfsocketstream.py < '$(SRCROOT)/patches/pyobjc-framework-CFNetwork_PyObjCTest_test_cfsocketstream.py.ed'
78	ed - $(SRCROOT)/$(Project)/pyobjc-framework-Cocoa/Lib/Foundation/PyObjC.bridgesupport < '$(SRCROOT)/patches/pyobjc-framework-Cocoa_Lib_Foundation_PyObjC.bridgesupport.ed'
79	ed - $(SRCROOT)/$(Project)/pyobjc-framework-Cocoa/Lib/PyObjCTools/Conversion.py < '$(SRCROOT)/patches/pyobjc-framework-Cocoa_Lib_PyObjCTools_Conversion.py.ed'
80	ed - $(SRCROOT)/$(Project)/pyobjc-framework-Quartz/Lib/Quartz/CoreGraphics/PyObjC.bridgesupport < '$(SRCROOT)/patches/pyobjc-framework-Quartz_Lib_Quartz_CoreGraphics_PyObjC.bridgesupport.ed'
81	ed - $(SRCROOT)/$(Project)/pyobjc-framework-Quartz/PyObjCTest/test_camediatiming.py < '$(SRCROOT)/patches/pyobjc-framework-Quartz_PyObjCTest_test_camediatiming.py.ed'
82	@set -x && for z in `find $(SRCROOT)/$(Project) -name \*.py -size 0c`; do \
83	    echo '#' > $$z || exit 1; \
84	done
85	find $(SRCROOT)/$(Project) -name \*.so -print -delete
86endif
87
88copysource:
89	ditto '$(SRCROOT)' '$(OBJROOT)'
90
91DOCS=/Developer/Documentation/Python/PyObjC
92EXAMPLES=/Developer/Examples/Python/PyObjC
93EXTRAS:=$(shell python -c "import sys, os;print os.path.join(sys.prefix, 'Extras')")
94EXTRASLIBPYTHON=$(EXTRAS)/lib/python
95EXTRASPYOBJC=$(EXTRASLIBPYTHON)/PyObjC
96
97real-install:
98	@set -x && \
99	cd '$(OBJROOT)/$(Project)' && \
100	for pkg in pyobjc-core pyobjc-framework-Cocoa `ls -d pyobjc-framework-* | grep -v pyobjc-framework-Cocoa`; do \
101	    cd "$(OBJROOT)/$(Project)/$$pkg" && \
102	    ARCHFLAGS="$(RC_CFLAGS) -D_FORTIFY_SOURCE=0" PYTHONPATH="$(DSTROOT)$(EXTRASPYOBJC)" \
103	    python setup.py install --home="$(EXTRAS)" --root="$(DSTROOT)" || exit 1; \
104	done
105	@set -x && cd "$(DSTROOT)$(EXTRASLIBPYTHON)" && \
106	install -d PyObjC && \
107	for x in *; do \
108	    if [ "$$x" != PyObjC -a "$$x" != PyObjC.pth ]; then \
109		if [ -e PyObjC/$$x ]; then \
110		    ditto $$x PyObjC/$$x && \
111		    $(RMDIR) $$x; \
112		else \
113		    $(MV) "$$x" PyObjC; \
114		fi; \
115	    fi || exit 1; \
116	done
117	cp -f $(Project).txt "$(OSL)/$(Project)-$(AEP_Version).txt"
118	cp -f $(Project).partial "$(OSV)/$(Project)-$(AEP_Version).partial"
119
120ADDMODULES = AVFoundation
121add-module:
122	@set -x && \
123	for i in $(ADDMODULES); do \
124	    install -d $(DSTROOT)$(EXTRASPYOBJC)/$$i && \
125	    sed "s/@XXX@/$$i/g" $(SRCROOT)/patches/newmoduletemplate.py > "$(DSTROOT)$(EXTRASPYOBJC)/$$i/__init__.py" && \
126	    python -c "import py_compile;py_compile.compile('$(DSTROOT)$(EXTRASPYOBJC)/$$i/__init__.py')" && \
127	    chmod 0644 "$(DSTROOT)$(EXTRASPYOBJC)/$$i/__init__.py"* || exit 1; \
128	done
129
130install-docs:
131	$(INSTALL) -d '$(DSTROOT)$(DOCS)'
132	@set -x && \
133	for e in `find "$(OBJROOT)/$(Project)" -name Doc ! -empty ! -path '*pyobjc-metadata*'`; do \
134	    d=`dirname $$e` && \
135	    n=`basename $$d` && \
136	    case $$n in \
137	    pyobjc-core) \
138		rsync -rplt $$e/ "$(DSTROOT)$(DOCS)" || exit 1;; \
139	    pyobjc-*) \
140		b=`echo $$n | sed 's/^.*-//'` && \
141		rsync -rplt $$e/ "$(DSTROOT)$(DOCS)/$$b" || exit 1;; \
142	    esac \
143	done
144
145install-examples:
146	$(INSTALL) -d '$(DSTROOT)$(EXAMPLES)'
147	@set -x && \
148	for e in `find "$(OBJROOT)/$(Project)" -name Examples ! -empty -maxdepth 2`; do \
149	    d=`dirname $$e` && \
150	    n=`basename $$d` && \
151	    case $$n in \
152	    pyobjc-core) \
153		rsync -rplt $$e/ "$(DSTROOT)$(EXAMPLES)" || exit 1;; \
154	    pyobjc-*) \
155		b=`echo $$n | sed 's/^.*-//'` && \
156		rsync -rplt $$e/ "$(DSTROOT)$(EXAMPLES)/$$b" || exit 1;; \
157	    esac \
158	done
159
160fix_strip:
161	@echo ======== fix verification errors =========
162	@echo '=== strip .so files ==='
163	@set -x && cd '$(DSTROOT)' && \
164	for i in `find . -name \*.so | sed 's,^\./,,'`; do \
165	    rsync -R $$i $(SYMROOT) && \
166	    $(STRIP) -x $$i || exit 1; \
167	done
168
169fix_bogus_files:
170	@echo '=== fix bogus_files ==='
171	find -d "$(DSTROOT)$(EXAMPLES)" -name '*~.nib' -print -exec rm -rf {} ';'
172
173fix_inappropriate_executables:
174	@echo '=== fix inappropriate_executables ==='
175	chmod a-x "$(DSTROOT)$(EXAMPLES)/Quartz/Core Graphics/CGRotation/demo.png"
176
177fix_verification-errors: fix_bogus_files fix_inappropriate_executables fix_strip
178
179install:: copysource real-install add-module install-docs install-examples fix_verification-errors
180