1##---------------------------------------------------------------------
2# Makefile for python_modules (supporting multiple versions)
3##---------------------------------------------------------------------
4Project = python_modules
5PYTHONPROJECT = python
6MYFIX = $(SRCROOT)/fix
7_VERSIONERDIR := /usr/local/versioner
8# Look for /usr/local/versioner in $(SDKROOT), defaulting to /usr/local/versioner
9VERSIONERDIR := $(or $(wildcard $(SDKROOT)$(_VERSIONERDIR)),$(_VERSIONERDIR))
10PYTHONVERSIONS = $(VERSIONERDIR)/$(PYTHONPROJECT)/versions
11INCOMPATIBLE =
12DEFAULT := $(shell sed -n '/^DEFAULT = /s///p' $(PYTHONVERSIONS))
13KNOWNVERSIONS := $(filter-out $(INCOMPATIBLE), $(shell grep '^[0-9]' $(PYTHONVERSIONS)))
14BOOTSTRAPPYTHON =
15VERSIONS = $(sort $(KNOWNVERSIONS) $(BOOTSTRAPPYTHON))
16ORDEREDVERS := $(DEFAULT) $(filter-out $(DEFAULT),$(VERSIONS))
17VERSIONERFLAGS = -std=gnu99 -Wall -mdynamic-no-pic -I$(VERSIONERDIR)/$(PYTHONPROJECT) -I$(MYFIX) -framework CoreFoundation
18OSV = OpenSourceVersions
19OSL = OpenSourceLicenses
20
21FIX = $(VERSIONERDIR)/$(PYTHONPROJECT)/fix
22TESTOK := -f $(shell echo $(foreach vers,$(VERSIONS),$(OBJROOT)/$(vers)/.ok) | sed 's/ / -a -f /g')
23TMPPREFIX = $(OBJROOT)/Root
24
25include $(MAKEFILEPATH)/CoreOS/ReleaseControl/Common.make
26
27installsrc: afterinstallsrc
28
29afterinstallsrc:
30	for i in $(SRCROOT)/Modules/*; do \
31	    [ ! -d $$i ] || $(MAKE) -C $$i afterinstallsrc Project=$(Project) || exit 1; \
32	done
33	$(MAKE) -C $(SRCROOT)/tmpprefix afterinstallsrc
34
35build::
36	$(MKDIR) $(OBJROOT)/$(OSL)
37	$(MKDIR) $(OBJROOT)/$(OSV)
38	$(MAKE) -C tmpprefix \
39	    OSL='$(OBJROOT)/$(OSL)' OSV='$(OBJROOT)/$(OSV)' \
40	    TMPPREFIX='$(TMPPREFIX)'
41	@set -x && \
42	for vers in $(VERSIONS); do \
43	    mkdir -p "$(SYMROOT)/$$vers" && \
44	    mkdir -p "$(OBJROOT)/$$vers/DSTROOT" || exit 1; \
45	    (echo "######## Building $$vers:" `date` '########' > "$(SYMROOT)/$$vers/LOG" 2>&1 && \
46		PATH="$(TMPPREFIX)/bin:$$PATH" \
47		VERSIONER_PYTHON_VERSION=$$vers \
48		VERSIONER_PYTHON_PREFER_32_BIT=yes \
49		$(MAKE) -f Makefile install Project=$(Project) \
50		OBJROOT="$(OBJROOT)/$$vers" \
51		DSTROOT="$(OBJROOT)/$$vers/DSTROOT" \
52		SYMROOT="$(SYMROOT)/$$vers" \
53		OSL='$(OBJROOT)/$(OSL)' OSV='$(OBJROOT)/$(OSV)' \
54		TMPPREFIX='$(TMPPREFIX)' \
55		RC_ARCHS='$(RC_ARCHS)' >> "$(SYMROOT)/$$vers/LOG" 2>&1 && \
56		touch "$(OBJROOT)/$$vers/.ok" && \
57		echo "######## Finished $$vers:" `date` '########' >> "$(SYMROOT)/$$vers/LOG" 2>&1 \
58	    ) & \
59	done && \
60	wait && \
61	for vers in $(VERSIONS); do \
62	    cat $(SYMROOT)/$$vers/LOG && \
63	    rm -f $(SYMROOT)/$$vers/LOG || exit 1; \
64	done && \
65	if [ $(TESTOK) ]; then \
66	    $(MAKE) merge; \
67	else \
68	    echo '#### error detected, not merging'; \
69	    exit 1; \
70	fi
71	$(MKDIR) $(DSTROOT)/usr/local/$(OSL)
72	@set -x && \
73	cd $(OBJROOT)/$(OSL) && \
74	for i in *; do \
75	    echo '##########' `basename $$i` '##########' && \
76	    cat $$i || exit 1; \
77	done > $(DSTROOT)/usr/local/$(OSL)/$(Project).txt
78	$(MKDIR) $(DSTROOT)/usr/local/$(OSV)
79	(cd $(OBJROOT)/$(OSV) && \
80	echo '<plist version="1.0">' && \
81	echo '<array>' && \
82	cat * && \
83	echo '</array>' && \
84	echo '</plist>') > $(DSTROOT)/usr/local/$(OSV)/$(Project).plist
85
86#merge: mergebegin mergedefault mergeversions mergebin mergeman
87merge: mergebegin mergeversions mergebin mergeman
88
89mergebegin:
90	@echo ####### Merging #######
91
92MERGEBIN = /usr/bin
93DUMMY = dummy.py
94mergebin:
95	mkdir -p $(DSTROOT)$(MERGEBIN)
96	install $(FIX)/$(DUMMY) $(DSTROOT)$(MERGEBIN)
97	@set -x && \
98	for vers in $(ORDEREDVERS); do \
99	    cd $(OBJROOT)/$$vers/DSTROOT$(MERGEBIN) && \
100	    for f in `find . -type f ! -name "*$$vers*" | sed 's,^\./,,'`; do \
101		fv=$$f-$$vers && \
102		ditto $$f $(DSTROOT)$(MERGEBIN)/$$fv && \
103		sed -e 's/@SEP@/-/g' -e "s/@VERSION@/$$vers/g" $(FIX)/scriptvers.ed | ed - $(DSTROOT)$(MERGEBIN)/$$fv && \
104		if [ ! -e $(DSTROOT)$(MERGEBIN)/$$f ]; then \
105		    ln -f $(DSTROOT)$(MERGEBIN)/$(DUMMY) $(DSTROOT)$(MERGEBIN)/$$f; \
106		fi || exit 1; \
107	    done && \
108	    cd $(DSTROOT)/System/Library/Frameworks/Python.framework/Versions/$$vers/Extras/bin && \
109	    for f in *; do \
110		sed -e '/^1a/,/^\./d' -e "s/@VERSION@/$$vers/g" $(FIX)/scriptvers.ed | ed - $$f || exit 1; \
111	    done || exit 1; \
112	done
113	rm -f $(DSTROOT)$(MERGEBIN)/$(DUMMY)
114
115MERGEVERSIONS = \
116    System
117mergeversions:
118	@set -x && \
119	for vers in $(VERSIONS); do \
120	    cd $(OBJROOT)/$$vers/DSTROOT && \
121	    rsync -Ra $(MERGEVERSIONS) $(DSTROOT) || exit 1; \
122	done
123
124MERGEMAN = usr/share/man
125mergeman:
126	cd $(OBJROOT)/$(DEFAULT)/DSTROOT && rsync -Ra $(MERGEMAN) $(DSTROOT)
127