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')")
7PYTHON3 := $(shell python -c 'import sys;print("YES" if sys.version_info[0] > 2 else "NO")')
8
9GnuNoConfigure      = YES
10Extra_CC_Flags      = -no-cpp-precomp -g
11Extra_Install_Flags = PREFIX=$(RC_Install_Prefix)
12
13#include $(MAKEFILEPATH)/CoreOS/ReleaseControl/GNUSource.make
14include $(MAKEFILEPATH)/CoreOS/ReleaseControl/Common.make
15
16Install_Target      = install
17
18# Automatic Extract & Patch
19AEP            = YES
20AEP_Patches    =
21
22# 10742279 & 10943322: remove deprecated frameworks (don't have those tarball)
23DEPRECATED_FRAMEWORKS = pyobjc-framework-ServerNotification pyobjc-framework-CalendarStore
24
25# Extract the source.
26install_source::
27ifeq ($(AEP),YES)
28	@set -x && \
29	cd $(SRCROOT) && \
30	$(MKDIR) $(Project) && \
31	for i in *.tar.*; do \
32	    $(TAR) -xof $$i -C $(Project) && \
33	    $(RM) $$i || exit 1; \
34	done
35	@set -x && \
36	cd $(SRCROOT)/$(Project) && \
37	for patchfile in $(AEP_Patches); do \
38	    patch -p0 -i $(SRCROOT)/patches/$$patchfile || exit 1; \
39	done && \
40	find . \( -name \*.h -or -name \*.m \) -print0 | xargs -0 egrep -l 'CGFLOAT_DEFINED|NSINTEGER_DEFINED' | while read patchfile; do \
41	    mv -f "$$patchfile" "$$patchfile.orig" && \
42	    { unifdef -DCGFLOAT_DEFINED -DNSINTEGER_DEFINED "$$patchfile.orig" > "$$patchfile" || [ $$? -ne 2 ]; } && \
43	    rm -f "$$patchfile.orig" || exit 1; \
44	done && \
45	find . -name pyobjc_setup.py -print0 | xargs -0 fgrep -l '10.4' | while read patchfile; do \
46	    ed - "$$patchfile" < '$(SRCROOT)/patches/pyobjc_setup.py.ed' || exit 1; \
47	done && \
48	find . -type f -print0 | xargs -0 grep -lw iChat | while read patchfile; do \
49	    mv -f "$$patchfile" "$$patchfile.orig" && \
50	    sed 's/[[:<:]]iChat[[:>:]]/Messages/g' "$$patchfile.orig" > "$$patchfile" && \
51	    rm -f "$$patchfile.orig" || exit 1; \
52	done && \
53	find . -name \*setup.py -print0 | xargs -0 fgrep -l ".extend(['-isysroot'," | while read patchfile; do \
54	    ed - "$$patchfile" < '$(SRCROOT)/patches/isysroot.ed' || exit 1; \
55	done
56	ed - $(SRCROOT)/$(Project)/pyobjc-core-*/setup.py < '$(SRCROOT)/patches/pyobjc-core_setup.py.ed'
57	ed - $(SRCROOT)/$(Project)/pyobjc-core-*/Lib/PyObjCTools/TestSupport.py < '$(SRCROOT)/patches/pyobjc-core_Lib_PyObjCTools_TestSupport.py.ed'
58	ed - $(SRCROOT)/$(Project)/pyobjc-core-*/Lib/objc/_bridgesupport.py < '$(SRCROOT)/patches/pyobjc-core_Lib_objc__bridgesupport.py.ed'
59	ed - $(SRCROOT)/$(Project)/pyobjc-core-*/Modules/objc/module.m < '$(SRCROOT)/patches/pyobjc-core_Modules_objc_module.m.ed'
60	ed - $(SRCROOT)/$(Project)/pyobjc-core-*/PyObjCTest/test_identity.py < '$(SRCROOT)/patches/pyobjc-core_PyObjCTest_test_identity.py.ed'
61	ed - $(SRCROOT)/$(Project)/pyobjc-core-*/PyObjCTest/test_number_proxy.py < '$(SRCROOT)/patches/pyobjc-core_PyObjCTest_test_number_proxy.py.ed'
62	ed - $(SRCROOT)/$(Project)/pyobjc-core-*/PyObjCTest/test_testsupport.py < '$(SRCROOT)/patches/pyobjc-core_PyObjCTest_test_testsupport.py.ed'
63	ed - $(SRCROOT)/$(Project)/pyobjc-framework-CFNetwork-*/Lib/CFNetwork/_metadata.py < '$(SRCROOT)/patches/pyobjc-framework-CFNetwork_Lib_CFNetwork__metadata.py.ed'
64	ed - $(SRCROOT)/$(Project)/pyobjc-framework-CFNetwork-*/PyObjCTest/test_cfhttpstream.py < '$(SRCROOT)/patches/pyobjc-framework-CFNetwork_PyObjCTest_test_cfhttpstream.py.ed'
65	ed - $(SRCROOT)/$(Project)/pyobjc-framework-CFNetwork-*/PyObjCTest/test_cfsocketstream.py < '$(SRCROOT)/patches/pyobjc-framework-CFNetwork_PyObjCTest_test_cfsocketstream.py.ed'
66	ed - $(SRCROOT)/$(Project)/pyobjc-framework-Cocoa-*/Lib/Foundation/_metadata.py < '$(SRCROOT)/patches/pyobjc-framework-Cocoa_Lib_Foundation__metadata.py.ed'
67	ed - $(SRCROOT)/$(Project)/pyobjc-framework-Cocoa-*/Lib/PyObjCTools/Conversion.py < '$(SRCROOT)/patches/pyobjc-framework-Cocoa_Lib_PyObjCTools_Conversion.py.ed'
68	ed - $(SRCROOT)/$(Project)/pyobjc-framework-Cocoa-*/PyObjCTest/test_cfmachport.py < '$(SRCROOT)/patches/pyobjc-framework-Cocoa_PyObjCTest_test_cfmachport.py.ed'
69	ed - $(SRCROOT)/$(Project)/pyobjc-framework-LaunchServices-*/PyObjCTest/test_lsinfo.py < '$(SRCROOT)/patches/pyobjc-framework-LaunchServices_PyObjCTest_test_lsinfo.py.ed'
70	ed - $(SRCROOT)/$(Project)/pyobjc-framework-Quartz-*/Lib/Quartz/CoreGraphics/_metadata.py < '$(SRCROOT)/patches/pyobjc-framework-Quartz_Lib_Quartz_CoreGraphics__metadata.py.ed'
71	ed - $(SRCROOT)/$(Project)/pyobjc-framework-Quartz-*/PyObjCTest/test_camediatiming.py < '$(SRCROOT)/patches/pyobjc-framework-Quartz_PyObjCTest_test_camediatiming.py.ed'
72	ed - $(SRCROOT)/$(Project)/pyobjc-framework-Quartz-*/PyObjCTest/test_cgdisplayconfiguration.py < '$(SRCROOT)/patches/pyobjc-framework-Quartz_PyObjCTest_test_cgdisplayconfiguration.py.ed'
73	ed - $(SRCROOT)/$(Project)/pyobjc-framework-SystemConfiguration-*/PyObjCTest/test_SCDynamicStoreCopyDHCPInfo.py < '$(SRCROOT)/patches/pyobjc-framework-SystemConfiguration_PyObjCTest_test_SCDynamicStoreCopyDHCPInfo.py.ed'
74	@set -x && for z in `find $(SRCROOT)/$(Project) -name \*.py -size 0c`; do \
75	    echo '#' > $$z || exit 1; \
76	done
77	find $(SRCROOT)/$(Project) -name \*.so -print -delete
78endif
79
80copysource:
81	ditto '$(SRCROOT)' '$(OBJROOT)'
82	@set -x && \
83	cd '$(OBJROOT)' && \
84	remove=`ls | grep '^[0-9]\.[0-9]$$'` && \
85	[ -z "$$remove" ] || $(RMDIR) $$remove
86
87custompatching:
88ifeq ($(PYTHON3),YES)
89	! { unifdef -t -DPY3K -o $(OBJROOT)/$(Project)/pyobjc-framework-Cocoa-*/Lib/PyObjCTools/Conversion.py{,} || \
90	[ $$? -ne 1 ]; }
91else
92	! { unifdef -t -UPY3K -o $(OBJROOT)/$(Project)/pyobjc-framework-Cocoa-*/Lib/PyObjCTools/Conversion.py{,} || \
93	[ $$? -ne 1 ]; }
94endif
95
96DOCS=/Developer/Documentation/Python/PyObjC
97EXAMPLES=/Developer/Examples/Python/PyObjC
98EXTRAS:=$(shell python -c "import sys, os;print(os.path.join(sys.prefix, 'Extras'))")
99EXTRASLIBPYTHON=$(EXTRAS)/lib/python
100EXTRASPYOBJC=$(EXTRASLIBPYTHON)/PyObjC
101
102real-install:
103	@set -x && \
104	cd '$(OBJROOT)/$(Project)' && \
105	for pkg in pyobjc-core* pyobjc-framework-Cocoa* `ls -d pyobjc-framework-* | grep -v pyobjc-framework-Cocoa`; do \
106	    cd "$(OBJROOT)/$(Project)/$$pkg" && \
107	    ARCHFLAGS="$(RC_CFLAGS) -D_FORTIFY_SOURCE=0" PYTHONPATH="$(DSTROOT)$(EXTRASPYOBJC)" \
108	    python setup.py install --home="$(EXTRAS)" --root="$(DSTROOT)" || exit 1; \
109	done
110	@set -x && cd "$(DSTROOT)$(EXTRASLIBPYTHON)" && \
111	install -d PyObjC && \
112	for x in *; do \
113	    if [ "$$x" != PyObjC -a "$$x" != PyObjC.pth ]; then \
114		if [ -e PyObjC/$$x ]; then \
115		    ditto $$x PyObjC/$$x && \
116		    $(RMDIR) $$x; \
117		else \
118		    $(MV) "$$x" PyObjC; \
119		fi; \
120	    fi || exit 1; \
121	done
122	cp -f $(Project).txt "$(OSL)/$(Project)-$(AEP_Version).txt"
123	cp -f $(Project).partial "$(OSV)/$(Project)-$(AEP_Version).partial"
124
125ADDMODULES = AVFoundation
126add-module:
127	@set -x && \
128	for i in $(ADDMODULES); do \
129	    install -d $(DSTROOT)$(EXTRASPYOBJC)/$$i && \
130	    sed "s/@XXX@/$$i/g" $(SRCROOT)/patches/newmoduletemplate.py > "$(DSTROOT)$(EXTRASPYOBJC)/$$i/__init__.py" && \
131	    python -c "import py_compile;py_compile.compile('$(DSTROOT)$(EXTRASPYOBJC)/$$i/__init__.py')" && \
132	    chmod 0644 "$(DSTROOT)$(EXTRASPYOBJC)/$$i/__init__.py"* || exit 1; \
133	done
134
135install-docs:
136	$(INSTALL) -d '$(DSTROOT)$(DOCS)'
137	@set -x && \
138	for e in `find "$(OBJROOT)/$(Project)" -name Doc ! -empty ! -path '*pyobjc-metadata*'`; do \
139	    d=`dirname $$e` && \
140	    n=`basename $$d` && \
141	    case $$n in \
142	    pyobjc-core) \
143		rsync -rplt $$e/ "$(DSTROOT)$(DOCS)" || exit 1;; \
144	    pyobjc-*) \
145		b=`echo $$n | sed 's/^.*-//'` && \
146		rsync -rplt $$e/ "$(DSTROOT)$(DOCS)/$$b" || exit 1;; \
147	    esac \
148	done
149
150install-examples:
151	$(INSTALL) -d '$(DSTROOT)$(EXAMPLES)'
152	@set -x && \
153	for e in `find "$(OBJROOT)/$(Project)" -name Examples ! -empty -maxdepth 2`; do \
154	    d=`dirname $$e` && \
155	    n=`basename $$d` && \
156	    case $$n in \
157	    pyobjc-core) \
158		rsync -rplt $$e/ "$(DSTROOT)$(EXAMPLES)" || exit 1;; \
159	    pyobjc-*) \
160		b=`echo $$n | sed 's/^.*-//'` && \
161		rsync -rplt $$e/ "$(DSTROOT)$(EXAMPLES)/$$b" || exit 1;; \
162	    esac \
163	done
164
165fix_strip:
166	@echo ======== fix verification errors =========
167	@echo '=== strip .so files ==='
168	@set -x && cd '$(DSTROOT)' && \
169	for i in `find . -name \*.so | sed 's,^\./,,'`; do \
170	    rsync -R $$i $(SYMROOT) && \
171	    $(STRIP) -x $$i || exit 1; \
172	done
173
174fix_bogus_files:
175	@echo '=== fix bogus_files ==='
176	find -d "$(DSTROOT)$(EXAMPLES)" -name '*~.nib' -print -exec rm -rf {} ';'
177fix_inappropriate_executables:
178	@echo '=== fix inappropriate_executables ==='
179	find "$(DSTROOT)$(EXAMPLES)" -name '*.png' -perm +0111 -print0 | xargs -0 chmod -vv -x
180
181fix_verification-errors: fix_bogus_files fix_inappropriate_executables fix_strip
182
183install:: copysource custompatching real-install add-module install-docs install-examples fix_verification-errors
184