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