1##---------------------------------------------------------------------
2# Makefile for perl (supporting multiple versions)
3##---------------------------------------------------------------------
4Project = perl
5
6MY_HOST := x86_64
7PWD := $(shell pwd)
8ifndef SRCROOT
9export SRCROOT = $(PWD)
10endif
11VERSIONER_C = $(SRCROOT)/versioner/versioner.c
12VERSIONERDIR = /usr/local/versioner
13VERSIONERFLAGS = -std=gnu99 -Wall -mdynamic-no-pic -I$(DSTROOT)$(VERSIONERDIR)/$(Project) -I$(SRCROOT)/versioner -framework CoreFoundation $(EXTRAVERSIONERFLAGS)
14
15# SrcDir is the directory of this Makefile, usually the same as SRCROOT,
16# but during installsrc, it is the source directory to be copied to SRCROOT.
17# We need to set up SrcDir, before MAKEFILE_LIST gets changed by including
18# Common.make.
19SrcDir := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
20
21include $(MAKEFILEPATH)/CoreOS/ReleaseControl/Common.make
22
23ifndef RC_TARGET_CONFIG
24export RC_TARGET_CONFIG := MacOSX
25endif
26include $(SrcDir)/Platforms/$(RC_TARGET_CONFIG)/Makefile.inc
27
28VERSIONS = $(sort $(KNOWNVERSIONS) $(BOOTSTRAPPERL))
29OTHERVERSIONS = $(filter-out $(DEFAULT),$(VERSIONS))
30ORDEREDVERS := $(DEFAULT) $(OTHERVERSIONS)
31
32RSYNC = rsync -rlpt
33ifndef DSTROOT
34ifdef DESTDIR
35export DSTROOT = $(shell mkdir -p '$(DESTDIR)' && echo '$(DESTDIR)')
36else
37export DSTROOT = /
38endif
39endif
40ifndef OBJROOT
41export OBJROOT = $(shell mkdir -p '$(PWD)/OBJROOT' && echo '$(PWD)/OBJROOT')
42RSYNC += --exclude=OBJROOT
43endif
44ifndef SYMROOT
45export SYMROOT = $(shell mkdir -p '$(PWD)/SYMROOT' && echo '$(PWD)/SYMROOT')
46RSYNC += --exclude=SYMROOT
47endif
48ifndef RC_ARCHS
49export RC_ARCHS := $(MY_ARCHS)
50endif
51ifndef RC_NONARCH_CFLAGS
52export RC_NONARCH_CFLAGS = -pipe
53endif
54MY_CFLAGS := $(foreach A,$(MY_ARCHS),-arch $(A)) $(RC_NONARCH_CFLAGS)
55ifndef RC_CFLAGS
56export RC_CFLAGS := $(MY_CFLAGS)
57endif
58ifndef RC_ProjectName
59export RC_ProjectName = $(Project)
60endif
61##---------------------------------------------------------------------
62# Before, we used the versioned gcc (e.g., gcc-4.2) because newer compiler
63# would occasionally be incompatible with the compiler flags that python
64# records.  With clang, it doesn't use names with versions, so we just go
65# back to using plain cc and c++.  With 11952207, we will automatically
66# get xcrun support.
67##---------------------------------------------------------------------
68export MY_CC = cc
69
70FIX = $(SRCROOT)/fix
71TESTOK := -f $(shell echo $(foreach vers,$(VERSIONS),$(OBJROOT)/$(vers)/.ok) | sed 's/ / -a -f /g')
72
73VERSIONVERSIONS = $(VERSIONERDIR)/$(Project)/versions
74VERSIONHEADER = $(VERSIONERDIR)/$(Project)/versions.h
75VERSIONBINLIST = $(VERSIONERDIR)/$(Project)/usr-bin.list
76VERSIONMANLIST = $(VERSIONERDIR)/$(Project)/usr-share-man.list
77VERSIONERFIX = dummy.pl scriptvers.ed
78
79build::
80	$(RSYNC) '$(SRCROOT)/' '$(OBJROOT)'
81	@set -x && \
82	for vers in $(VERSIONS); do \
83	    mkdir -p "$(SYMROOT)/$$vers" && \
84	    mkdir -p "$(OBJROOT)/$$vers/DSTROOT" || exit 1; \
85	    (echo "######## Building $$vers:" `date` '########' > "$(SYMROOT)/$$vers/LOG" 2>&1 && \
86		TOPSRCROOT='$(SRCROOT)' \
87		UPDATES_README='$(SRCROOT)/fix/Updates-ReadMe.txt' \
88		$(MAKE) -C "$(OBJROOT)/$$vers" install \
89		SRCROOT="$(SRCROOT)/$$vers" \
90		OBJROOT="$(OBJROOT)/$$vers" \
91		DSTROOT="$(OBJROOT)/$$vers/DSTROOT" \
92		SYMROOT="$(SYMROOT)/$$vers" \
93		ARCHFLAGS='$(ARCHFLAGS)' \
94		RC_ARCHS='$(MY_ARCHS)' \
95		RC_CFLAGS='$(MY_CFLAGS)' \
96		PERLVERSION=$$vers >> "$(SYMROOT)/$$vers/LOG" 2>&1 && \
97		touch "$(OBJROOT)/$$vers/.ok" && \
98		echo "######## Finished $$vers:" `date` '########' >> "$(SYMROOT)/$$vers/LOG" 2>&1 \
99	    ) & \
100	done && \
101	wait && \
102	for vers in $(VERSIONS); do \
103	    cat $(SYMROOT)/$$vers/LOG && \
104	    rm -f $(SYMROOT)/$$vers/LOG || exit 1; \
105	done && \
106	if [ $(TESTOK) ]; then \
107	    $(MAKE) merge; \
108	else \
109	    echo '#### error detected, not merging'; \
110	    exit 1; \
111	fi
112
113installsrc: custominstallsrc
114
115custominstallsrc:
116	@set -x && \
117	for vers in $(VERSIONS); do \
118	    $(MAKE) -C "$(SRCROOT)/$$vers" custominstallsrc SRCROOT="$(SRCROOT)/$$vers" TOPSRCROOT='$(SRCROOT)' || exit 1; \
119	done
120
121merge: mergebegin mergedefault mergeversions versionerdir mergebin $(EXTRAMERGE)
122
123mergebegin:
124	@echo '####### Merging #######'
125
126# 13896386: temporarily use "ditto" instead of "ln -f"
127MERGEBIN = /usr/bin
128TEMPWRAPPER = $(MERGEBIN)/.versioner
129mergebin: $(OBJROOT)/wrappers
130	$(MY_CC) $(MY_CFLAGS) $(VERSIONERFLAGS) $(VERSIONER_C) -o $(DSTROOT)$(TEMPWRAPPER)
131	@set -x && \
132	for w in `sort -u $(OBJROOT)/wrappers`; do \
133	    ditto $(DSTROOT)$(TEMPWRAPPER) $(DSTROOT)$(MERGEBIN)/$$w || exit 1; \
134	done
135	rm -f $(DSTROOT)$(TEMPWRAPPER)
136	cd $(DSTROOT)$(MERGEBIN) && ls | sort > $(DSTROOT)$(VERSIONBINLIST)
137
138DUMMY = dummy.pl
139$(OBJROOT)/wrappers:
140	install -d $(DSTROOT)$(MERGEBIN)
141	install $(FIX)/$(DUMMY) $(DSTROOT)$(MERGEBIN)
142	@set -x && \
143	touch $(OBJROOT)/wrappers && \
144	for vers in $(ORDEREDVERS); do \
145	    cd $(OBJROOT)/$$vers/DSTROOT$(MERGEBIN) && \
146	    for f in *; do \
147		if file $$f | head -1 | fgrep -q script; then \
148		    fv=`echo $$f | sed -E 's/(\.[^.]*)?$$/'"$$vers&/"` && \
149		    ditto $$f $(DSTROOT)$(MERGEBIN)/$$fv && \
150		    sed "s/@VERSION@/$$vers/g" $(FIX)/scriptvers.ed | ed - $(DSTROOT)$(MERGEBIN)/$$fv && \
151		    if [ ! -e $(DSTROOT)$(MERGEBIN)/$$f ]; then \
152			ln -f $(DSTROOT)$(MERGEBIN)/$(DUMMY) $(DSTROOT)$(MERGEBIN)/$$f; \
153		    fi; \
154		elif echo $$f | grep -q "[^0-9]$$vers"; then \
155		    true; \
156		else \
157		    echo $$f >> $(OBJROOT)/wrappers && \
158		    if [ -e $$f$$vers ]; then \
159			ditto $$f$$vers $(DSTROOT)$(MERGEBIN)/$$f$$vers; \
160		    else \
161			ditto $$f $(DSTROOT)$(MERGEBIN)/$$f$$vers; \
162		    fi \
163		fi || exit 1; \
164	    done || exit 1; \
165	done
166	rm -f $(DSTROOT)$(MERGEBIN)/$(DUMMY)
167
168versionerdir:
169	install -d $(DSTROOT)$(VERSIONERDIR)
170	install -m 0644 $(VERSIONER_C) $(DSTROOT)$(VERSIONERDIR)
171	install -d $(DSTROOT)$(VERSIONERDIR)/$(Project)/fix
172	cd $(FIX) && rsync -pt $(VERSIONERFIX) $(DSTROOT)$(VERSIONERDIR)/$(Project)/fix
173	echo DEFAULT = $(DEFAULT) > $(DSTROOT)$(VERSIONVERSIONS)
174	for vers in $(KNOWNVERSIONS); do \
175	    echo $$vers >> $(DSTROOT)$(VERSIONVERSIONS) || exit 1; \
176	done
177	@set -x && ( \
178	    printf '#define DEFAULTVERSION "%s"\n' $(DEFAULT) && \
179	    echo '#define NVERSIONS (sizeof(versions) / sizeof(const char *))' && \
180	    echo '#define PROJECT "$(Project)"' && \
181	    printf '#define UPROJECT "%s"\n' `echo $(Project) | tr a-z A-Z` && \
182	    echo 'static const char *versions[] = {' && \
183	    for v in $(sort $(VERSIONS) $(ADDEDVERSIONS)); do \
184		printf '    "%s",\n' $$v || exit 1; \
185	    done && \
186	    echo '};' ) > $(DSTROOT)$(VERSIONHEADER)
187
188rmusrlocal:
189	rm -rf $(DSTROOT)/usr/local
190
191rmLibrary:
192	rm -rf $(DSTROOT)/Library
193
194mergedefault:
195ifneq ($(strip $(MERGEDEFAULT)),)
196	cd $(OBJROOT)/$(DEFAULT)/DSTROOT && rsync -Ra $(MERGEDEFAULT) $(DSTROOT)
197else
198	@true
199endif
200
201MERGEMAN = /usr/share/man
202mergeman: domergeman customman listman
203
204domergeman:
205	@set -x && \
206	for vers in $(ORDEREDVERS); do \
207	    cd $(OBJROOT)/$$vers/DSTROOT$(MERGEMAN) && \
208	    for d in man*; do \
209		cd $$d && \
210		for f in `find . -type f -name '*.*' | sed 's,^\./,,'`; do \
211		    ff=`echo $$f | sed -E "s/\.[^.]*(.gz)?$$/$$vers&/"` && \
212		    ditto $$f $(DSTROOT)$(MERGEMAN)/$$d/$$ff && \
213		    if [ ! -e $(DSTROOT)$(MERGEMAN)/$$d/$$f ]; then \
214			ditto $$f $(DSTROOT)$(MERGEMAN)/$$d/$$f; \
215		    fi || exit 1; \
216		done && \
217		cd .. || exit 1; \
218	    done || exit 1; \
219	done
220
221CUSTOMTEMP = .temp.1
222customman: $(OBJROOT)/wrappers
223	@set -x && \
224	sed -e 's/@VERSION_DEFAULT@/$(ENV_VERSION_DEFAULT)/g' \
225	    -e 's/@VERSION_ALT@/$(ENV_VERSION_ALT)/g' \
226	    $(FIX)/$(Project).1 > $(DSTROOT)$(MERGEMAN)/man1/$(CUSTOMTEMP) && \
227	gzip $(DSTROOT)$(MERGEMAN)/man1/$(CUSTOMTEMP) && \
228	for w in `sort -u $(OBJROOT)/wrappers`; do \
229	    rm -f $(DSTROOT)$(MERGEMAN)/man1/$$w.1.gz && \
230	    ln -f $(DSTROOT)$(MERGEMAN)/man1/$(CUSTOMTEMP).gz $(DSTROOT)$(MERGEMAN)/man1/$$w.1.gz || exit 1; \
231	done && \
232	rm -f $(DSTROOT)$(MERGEMAN)/man1/$(CUSTOMTEMP).gz
233
234listman:
235	cd $(DSTROOT)$(MERGEMAN) && find . ! -type d | sed 's,^\./,,' | sort > $(DSTROOT)$(VERSIONMANLIST)
236
237OPENSOURCEVERSIONS = /usr/local/OpenSourceVersions
238PLIST = $(OPENSOURCEVERSIONS)/perl.plist
239mergeplist:
240	mkdir -p $(DSTROOT)$(OPENSOURCEVERSIONS)
241	echo '<plist version="1.0">' > $(DSTROOT)$(PLIST)
242	echo '<array>' >> $(DSTROOT)$(PLIST)
243	@set -x && \
244	for vers in $(VERSIONS); do \
245	    if grep -q '^<array>' $(OBJROOT)/$$vers/DSTROOT$(PLIST); then \
246		sed -e '/^<\/*plist/d' -e '/^<\/*array>/d' $(OBJROOT)/$$vers/DSTROOT$(PLIST) >> $(DSTROOT)$(PLIST); \
247	    else \
248		sed -e '/^<\/*plist/d' -e 's/^/	/' $(OBJROOT)/$$vers/DSTROOT$(PLIST) >> $(DSTROOT)$(PLIST); \
249	    fi || exit 1; \
250	done
251	echo '</array>' >> $(DSTROOT)$(PLIST)
252	echo '</plist>' >> $(DSTROOT)$(PLIST)
253	chmod 644 $(DSTROOT)$(PLIST)
254
255MERGEVERSIONS = \
256    Library \
257    System
258mergeversions:
259	@set -x && \
260	for vers in $(VERSIONS); do \
261	    cd $(OBJROOT)/$$vers/DSTROOT && \
262	    rsync -Ra $(MERGEVERSIONS) $(DSTROOT) || exit 1; \
263	done
264