1##---------------------------------------------------------------------
2# Makefile for python_modules (supporting multiple versions)
3##---------------------------------------------------------------------
4Project = python_modules
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
14NO64 = 2.5
15
16RSYNC = rsync -rlpt
17PWD = $(shell pwd)
18ifndef DSTROOT
19ifdef DESTDIR
20export DSTROOT = $(shell mkdir -p '$(DESTDIR)' && echo '$(DESTDIR)')
21else
22export DSTROOT = /
23endif
24endif
25ifndef OBJROOT
26export OBJROOT = $(shell mkdir -p '$(PWD)/OBJROOT' && echo '$(PWD)/OBJROOT')
27RSYNC += --exclude=OBJROOT
28endif
29ifndef SRCROOT
30export SRCROOT = $(PWD)
31endif
32ifndef SYMROOT
33export SYMROOT = $(shell mkdir -p '$(PWD)/SYMROOT' && echo '$(PWD)/SYMROOT')
34RSYNC += --exclude=SYMROOT
35endif
36ifndef RC_ARCHS
37export RC_ARCHS = $(shell arch)
38export RC_$(RC_ARCHS) = YES
39endif
40ifndef RC_CFLAGS
41export RC_CFLAGS = $(foreach A,$(RC_ARCHS),-arch $(A)) $(RC_NONARCH_CFLAGS)
42endif
43ifndef RC_NONARCH_CFLAGS
44export RC_NONARCH_CFLAGS = -pipe
45endif
46ifndef RC_ProjectName
47export RC_ProjectName = $(Project)
48endif
49
50FIX = $(VERSIONERDIR)/$(PYTHONPROJECT)/fix
51TESTOK := -f $(shell echo $(foreach vers,$(VERSIONS),$(OBJROOT)/$(vers)/.ok) | sed 's/ / -a -f /g')
52
53include $(MAKEFILEPATH)/CoreOS/ReleaseControl/Common.make
54
55installsrc: afterinstallsrc
56
57afterinstallsrc:
58	$(MAKE) -f Makefile afterinstallsrc Project=$(Project)
59
60build::
61	@set -x && \
62	for vers in $(VERSIONS); do \
63	    no64= && \
64	    if echo $(NO64) | fgrep -q $$vers; then \
65		no64=YES; \
66	    fi && \
67	    mkdir -p "$(SYMROOT)/$$vers" && \
68	    mkdir -p "$(OBJROOT)/$$vers/DSTROOT" || exit 1; \
69	    (echo "######## Building $$vers:" `date` '########' > "$(SYMROOT)/$$vers/LOG" 2>&1 && \
70		TOPOBJROOT='$(OBJROOT)' \
71		VERSIONER_PYTHON_VERSION=$$vers \
72		VERSIONER_PYTHON_PREFER_32_BIT=yes \
73		$(MAKE) -f Makefile install Project=$(Project) NO64=$$no64 \
74		OBJROOT="$(OBJROOT)/$$vers" \
75		DSTROOT="$(OBJROOT)/$$vers/DSTROOT" \
76		SYMROOT="$(SYMROOT)/$$vers" \
77		RC_ARCHS='$(RC_ARCHS)' >> "$(SYMROOT)/$$vers/LOG" 2>&1 && \
78		touch "$(OBJROOT)/$$vers/.ok" && \
79		echo "######## Finished $$vers:" `date` '########' >> "$(SYMROOT)/$$vers/LOG" 2>&1 \
80	    ) & \
81	done && \
82	wait && \
83	for vers in $(VERSIONS); do \
84	    cat $(SYMROOT)/$$vers/LOG && \
85	    rm -f $(SYMROOT)/$$vers/LOG || exit 1; \
86	done && \
87	if [ $(TESTOK) ]; then \
88	    $(MAKE) merge; \
89	else \
90	    echo '#### error detected, not merging'; \
91	    exit 1; \
92	fi
93
94#merge: mergebegin mergedefault mergeversions mergebin mergeman
95merge: mergebegin mergeversions mergebin mergedefault
96
97mergebegin:
98	@echo ####### Merging #######
99
100MERGEBIN = /usr/bin
101DUMMY = dummy.py
102mergebin:
103	mkdir -p $(DSTROOT)$(MERGEBIN)
104	install $(FIX)/$(DUMMY) $(DSTROOT)$(MERGEBIN)
105	@set -x && \
106	for vers in $(ORDEREDVERS); do \
107	    cd $(OBJROOT)/$$vers/DSTROOT$(MERGEBIN) && \
108	    for f in `find . -type f ! -name "*$$vers*" | sed 's,^\./,,'`; do \
109		fv=$$f-$$vers && \
110		ditto $$f $(DSTROOT)$(MERGEBIN)/$$fv && \
111		sed -e 's/@SEP@/-/g' -e "s/@VERSION@/$$vers/g" $(FIX)/scriptvers.ed | ed - $(DSTROOT)$(MERGEBIN)/$$fv && \
112		if [ ! -e $(DSTROOT)$(MERGEBIN)/$$f ]; then \
113		    ln -f $(DSTROOT)$(MERGEBIN)/$(DUMMY) $(DSTROOT)$(MERGEBIN)/$$f; \
114		fi || exit 1; \
115	    done && \
116	    cd $(DSTROOT)/System/Library/Frameworks/Python.framework/Versions/$$vers/Extras/bin && \
117	    for f in *; do \
118		sed -e '/^1a/,/^\./d' -e "s/@VERSION@/$$vers/g" $(FIX)/scriptvers.ed | ed - $$f || exit 1; \
119	    done || exit 1; \
120	done
121	rm -f $(DSTROOT)$(MERGEBIN)/$(DUMMY)
122
123MERGEDEFAULT = \
124    usr/local
125mergedefault:
126	cd $(OBJROOT)/$(DEFAULT)/DSTROOT && rsync -Ra $(MERGEDEFAULT) $(DSTROOT)
127
128#MYVERSIONMANLIST = $(OBJROOT)/usr-share-man.list
129#VERSIONMANLIST = $(VERSIONERDIR)/$(PYTHONPROJECT)/usr-share-man.list
130#MERGEMAN = /usr/share/man
131#mergeman:
132#	@set -x && \
133#	for vers in $(ORDEREDVERS); do \
134#	    cd $(OBJROOT)/$$vers/DSTROOT$(MERGEMAN) && \
135#	    for d in man*; do \
136#		cd $$d && \
137#		for f in *.gz; do \
138#		    ff=`echo $$f | sed "s/\.[^.]*\.gz/$$vers&/"` && \
139#		    ditto $$f $(DSTROOT)$(MERGEMAN)/$$d/$$ff && \
140#		    if [ ! -e $(DSTROOT)$(MERGEMAN)/$$d/$$f ]; then \
141#			ln -fs $$ff $(DSTROOT)$(MERGEMAN)/$$d/$$f; \
142#		    fi || exit 1; \
143#		done && \
144#		cd .. || exit 1; \
145#	    done || exit 1; \
146#	done
147#	cd $(DSTROOT)$(MERGEMAN) && \
148#	find . ! -type d | sed 's,^\./,,' | sort > $(MYVERSIONMANLIST) && \
149#	rm -fv `comm -12 $(VERSIONMANLIST) $(MYVERSIONMANLIST)`
150
151MERGEVERSIONS = \
152    System
153mergeversions:
154	@set -x && \
155	for vers in $(VERSIONS); do \
156	    cd $(OBJROOT)/$$vers/DSTROOT && \
157	    rsync -Ra $(MERGEVERSIONS) $(DSTROOT) || exit 1; \
158	done
159