1##---------------------------------------------------------------------
2# Makefile for pyobjc (supporting multiple versions)
3##---------------------------------------------------------------------
4Project = pyobjc
5PYTHONPROJECT = python
6MYFIX = $(SRCROOT)/fix
7VERSIONERDIR = /usr/local/versioner
8PYTHONVERSIONS = $(VERSIONERDIR)/$(PYTHONPROJECT)/versions
9INCOMPATIBLE = 3.0
10DEFAULT := $(shell sed -n '/^DEFAULT = /s///p' $(PYTHONVERSIONS))
11VERSIONS := $(filter-out $(INCOMPATIBLE), $(shell grep '^[0-9]' $(PYTHONVERSIONS)))
12ORDEREDVERS := $(DEFAULT) $(filter-out $(DEFAULT),$(VERSIONS))
13VERSIONERFLAGS = -std=gnu99 -Wall -mdynamic-no-pic -I$(VERSIONERDIR)/$(PYTHONPROJECT) -I$(MYFIX) -framework CoreFoundation
14OSV = OpenSourceVersions
15OSL = OpenSourceLicenses
16
17RSYNC = rsync -rlpt
18PWD = $(shell pwd)
19ifndef DSTROOT
20ifdef DESTDIR
21export DSTROOT = $(shell mkdir -p '$(DESTDIR)' && echo '$(DESTDIR)')
22else
23export DSTROOT = /
24endif
25endif
26ifndef OBJROOT
27export OBJROOT = $(shell mkdir -p '$(PWD)/OBJROOT' && echo '$(PWD)/OBJROOT')
28RSYNC += --exclude=OBJROOT
29endif
30ifndef SRCROOT
31export SRCROOT = $(PWD)
32endif
33ifndef SYMROOT
34export SYMROOT = $(shell mkdir -p '$(PWD)/SYMROOT' && echo '$(PWD)/SYMROOT')
35RSYNC += --exclude=SYMROOT
36endif
37ifndef RC_ARCHS
38export RC_ARCHS = $(shell arch)
39export RC_$(RC_ARCHS) = YES
40endif
41ifndef RC_CFLAGS
42export RC_CFLAGS = $(foreach A,$(RC_ARCHS),-arch $(A)) $(RC_NONARCH_CFLAGS)
43endif
44ifndef RC_NONARCH_CFLAGS
45export RC_NONARCH_CFLAGS = -pipe
46endif
47ifndef RC_ProjectName
48export RC_ProjectName = $(Project)
49endif
50
51FIX = $(VERSIONERDIR)/$(PYTHONPROJECT)/fix
52TESTOK := -f $(shell echo $(foreach vers,$(VERSIONS),$(OBJROOT)/$(vers)/.ok) | sed 's/ / -a -f /g')
53
54installsrc:
55	@echo "*** pyobjc installsrc ***"
56	$(MAKE) -f Makefile installsrc Project=$(Project)
57	for vers in $(VERSIONS); do \
58	    [ ! -d $$vers ] || $(MAKE) -C $$vers -f Makefile installsrc Project=$(Project) SRCROOT="$(SRCROOT)/$$vers" || exit 1; \
59	done
60
61include $(MAKEFILEPATH)/CoreOS/ReleaseControl/Common.make
62
63build::
64	$(MKDIR) $(OBJROOT)/$(OSL)
65	$(MKDIR) $(OBJROOT)/$(OSV)
66	@set -x && \
67	for vers in $(VERSIONS); do \
68	    Copt= && \
69	    srcroot='$(SRCROOT)' && \
70	    if [ -d $$vers ]; then \
71		srcroot="$(SRCROOT)/$$vers"; \
72		Copt="-C $$vers"; \
73	    fi && \
74	    mkdir -p "$(SYMROOT)/$$vers" && \
75	    mkdir -p "$(OBJROOT)/$$vers/DSTROOT" || exit 1; \
76	    (echo "######## Building $$vers:" `date` '########' > "$(SYMROOT)/$$vers/LOG" 2>&1 && \
77		VERSIONER_PYTHON_VERSION=$$vers \
78		VERSIONER_PYTHON_PREFER_32_BIT=yes \
79		$(MAKE) $$Copt -f Makefile install Project=$(Project) \
80		SRCROOT="$$srcroot" \
81		OBJROOT="$(OBJROOT)/$$vers" \
82		DSTROOT="$(OBJROOT)/$$vers/DSTROOT" \
83		SYMROOT="$(SYMROOT)/$$vers" \
84		OSL='$(OBJROOT)/$(OSL)' OSV='$(OBJROOT)/$(OSV)' \
85		RC_ARCHS='$(RC_ARCHS) -g' >> "$(SYMROOT)/$$vers/LOG" 2>&1 && \
86		touch "$(OBJROOT)/$$vers/.ok" && \
87		echo "######## Finished $$vers:" `date` '########' >> "$(SYMROOT)/$$vers/LOG" 2>&1 \
88	    ) & \
89	done && \
90	wait && \
91	for vers in $(VERSIONS); do \
92	    cat $(SYMROOT)/$$vers/LOG && \
93	    rm -f $(SYMROOT)/$$vers/LOG || exit 1; \
94	done && \
95	if [ $(TESTOK) ]; then \
96	    $(MAKE) merge; \
97	else \
98	    echo '#### error detected, not merging'; \
99	    exit 1; \
100	fi
101	$(MKDIR) $(DSTROOT)/usr/local/$(OSL)
102	@set -x && \
103	cd $(OBJROOT)/$(OSL) && \
104	for i in *; do \
105	    echo '##########' `basename $$i` '##########' && \
106	    cat $$i || exit 1; \
107	done > $(DSTROOT)/usr/local/$(OSL)/$(Project).txt
108	$(MKDIR) $(DSTROOT)/usr/local/$(OSV)
109	(cd $(OBJROOT)/$(OSV) && \
110	echo '<plist version="1.0">' && \
111	echo '<array>' && \
112	cat * && \
113	echo '</array>' && \
114	echo '</plist>') > $(DSTROOT)/usr/local/$(OSV)/$(Project).plist
115
116#merge: mergebegin mergedefault mergeversions mergebin mergeman
117merge: mergebegin mergedefault mergeversions rmempty
118
119mergebegin:
120	@echo '####### Merging #######'
121
122#mergebin:
123#	@set -x && \
124#	for vers in $(ORDEREDVERS); do \
125#	    cd $(DSTROOT)/System/Library/Frameworks/Python.framework/Versions/$$vers/Extras/bin && \
126#	    for f in *; do \
127#		sed -e '/^1a/,/^\./d' -e "s/@VERSION@/$$vers/g" $(FIX)/scriptvers.ed | ed - $$f || exit 1; \
128#	    done || exit 1; \
129#	done
130
131PYFRAMEWORK = /System/Library/Frameworks/Python.framework
132PYFRAMEWORKDOCUMENTATION = $(PYFRAMEWORK)/Documentation
133PYFRAMEWORKEXAMPLES = $(PYFRAMEWORK)/Examples
134mergedefault:
135	install -d $(DSTROOT)$(PYFRAMEWORKDOCUMENTATION) $(DSTROOT)$(PYFRAMEWORKEXAMPLES)
136	ditto $(OBJROOT)/$(DEFAULT)/DSTROOT/Developer/Documentation/Python $(DSTROOT)$(PYFRAMEWORKDOCUMENTATION)
137	ditto $(OBJROOT)/$(DEFAULT)/DSTROOT/Developer/Examples/Python $(DSTROOT)$(PYFRAMEWORKEXAMPLES)
138	find $(DSTROOT)$(PYFRAMEWORKDOCUMENTATION) -size 0 -delete
139
140#MYVERSIONMANLIST = $(OBJROOT)/usr-share-man.list
141#VERSIONMANLIST = $(VERSIONERDIR)/$(PYTHONPROJECT)/usr-share-man.list
142#MERGEMAN = /usr/share/man
143#mergeman:
144#	@set -x && \
145#	for vers in $(ORDEREDVERS); do \
146#	    cd $(OBJROOT)/$$vers/DSTROOT$(MERGEMAN) && \
147#	    for d in man*; do \
148#		cd $$d && \
149#		for f in *.gz; do \
150#		    ff=`echo $$f | sed "s/\.[^.]*\.gz/$$vers&/"` && \
151#		    ditto $$f $(DSTROOT)$(MERGEMAN)/$$d/$$ff && \
152#		    if [ ! -e $(DSTROOT)$(MERGEMAN)/$$d/$$f ]; then \
153#			ln -fs $$ff $(DSTROOT)$(MERGEMAN)/$$d/$$f; \
154#		    fi || exit 1; \
155#		done && \
156#		cd .. || exit 1; \
157#	    done || exit 1; \
158#	done
159#	cd $(DSTROOT)$(MERGEMAN) && \
160#	find . ! -type d | sed 's,^\./,,' | sort > $(MYVERSIONMANLIST) && \
161#	rm -fv `comm -12 $(VERSIONMANLIST) $(MYVERSIONMANLIST)`
162
163MERGEVERSIONS = \
164    System
165mergeversions:
166	@set -x && \
167	for vers in $(VERSIONS); do \
168	    cd $(OBJROOT)/$$vers/DSTROOT && \
169	    rsync -Ra $(MERGEVERSIONS) $(DSTROOT) || exit 1; \
170	done
171
172# remove empty files (specific to pyobjc-2.3)
173EMPTY = /Developer/Documentation/Python/PyObjC/10PyObjCTools.txt
174rmempty:
175	@set -x && \
176	for empty in $(EMPTY); do \
177	    rm -f $(DSTROOT)$$empty || exit 1; \
178	done
179