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