1##---------------------------------------------------------------------
2# GNUmakefile for CPAN (supporting multiple versions)
3##---------------------------------------------------------------------
4Project = CPAN
5PERLPROJECT = perl
6MY_HOST := x86_64
7ifdef SDKROOT
8PATH := $(SDKROOT)/usr/bin:$(PATH)
9endif
10_VERSIONERDIR := /usr/local/versioner
11# Look for /usr/local/versioner in $(SDKROOT), defaulting to /usr/local/versioner
12VERSIONERDIR := $(or $(wildcard $(SDKROOT)$(_VERSIONERDIR)),$(_VERSIONERDIR))
13PERLVERSIONS = $(VERSIONERDIR)/$(PERLPROJECT)/versions
14PWD = $(shell pwd)
15ifndef SRCROOT
16export SRCROOT = $(PWD)
17endif
18# SrcDir is the directory of this Makefile, usually the same as SRCROOT,
19# but during installsrc, it is the source directory to be copied to SRCROOT.
20# We need to set up SrcDir, before MAKEFILE_LIST gets changed by including
21# Common.make.
22SrcDir := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
23
24include $(MAKEFILEPATH)/CoreOS/ReleaseControl/Common.make
25
26ifndef RC_TARGET_CONFIG
27export RC_TARGET_CONFIG := MacOSX
28endif
29include $(SrcDir)/Platforms/$(RC_TARGET_CONFIG)/GNUmakefile.inc
30
31MYFIX = $(SRCROOT)/fix
32VERSIONS = $(sort $(KNOWNVERSIONS) $(BOOTSTRAPPERL))
33ORDEREDVERS := $(DEFAULT) $(filter-out $(DEFAULT),$(VERSIONS))
34VERSIONERFLAGS = -std=gnu99 -Wall -mdynamic-no-pic -I$(VERSIONERDIR)/$(PERLPROJECT) -I$(MYFIX) -framework CoreFoundation $(EXTRAVERSIONERFLAGS)
35
36RSYNC = rsync -rlpt
37ifndef DSTROOT
38ifdef DESTDIR
39export DSTROOT = $(shell mkdir -p '$(DESTDIR)' && echo '$(DESTDIR)')
40else
41export DSTROOT = /
42endif
43endif
44ifndef OBJROOT
45export OBJROOT = $(shell mkdir -p '$(PWD)/OBJROOT' && echo '$(PWD)/OBJROOT')
46RSYNC += --exclude=OBJROOT
47endif
48ifndef SYMROOT
49export SYMROOT = $(shell mkdir -p '$(PWD)/SYMROOT' && echo '$(PWD)/SYMROOT')
50RSYNC += --exclude=SYMROOT
51endif
52ifndef RC_ARCHS
53export RC_ARCHS := $(MY_ARCHS)
54endif
55ifndef RC_NONARCH_CFLAGS
56export RC_NONARCH_CFLAGS = -pipe
57endif
58MY_CFLAGS := $(foreach A,$(MY_ARCHS),-arch $(A)) $(RC_NONARCH_CFLAGS)
59ifndef RC_CFLAGS
60export RC_CFLAGS = $(MY_CFLAGS)
61endif
62ifndef RC_ProjectName
63export RC_ProjectName = $(Project)
64endif
65
66FIX = $(VERSIONERDIR)/$(PERLPROJECT)/fix
67TESTOK := -f $(shell echo $(foreach vers,$(VERSIONS),$(OBJROOT)/$(vers)/.ok) | sed 's/ / -a -f /g')
68
69MYVERSIONBINLIST = $(OBJROOT)/usr-bin.list
70MYVERSIONMANLIST = $(OBJROOT)/usr-share-man.list
71VERSIONER_C = $(VERSIONERDIR)/versioner.c
72VERSIONBINLIST = $(VERSIONERDIR)/$(PERLPROJECT)/usr-bin.list
73VERSIONMANLIST = $(VERSIONERDIR)/$(PERLPROJECT)/usr-share-man.list
74PERL_ARCHNAME = $(shell perl -MConfig -e 'print $$Config::Config{archname}')
75PERL_CC = $(shell perl -MConfig -e 'print $$Config::Config{cc}')
76
77build:: $(foreach v,$(VERSIONS),$(SRCROOT)/$(v).inc)
78	@set -x && \
79	for vers in $(VERSIONS); do \
80	    mkdir -p "$(SYMROOT)/$$vers" && \
81	    mkdir -p "$(OBJROOT)/$$vers/DSTROOT" || exit 1; \
82	    (echo "######## Building $$vers:" `date` '########' > "$(SYMROOT)/$$vers/LOG" 2>&1 && \
83		VERSIONER_PERL_VERSION=$$vers \
84		VERSIONER_PERL_PREFER_32_BIT=$(MY_PREFER_32_BIT) \
85		CC=$(PERL_CC) \
86		$(MYEXTRAENV) \
87		$(MAKE) -f Makefile install \
88		VERS=$$vers \
89		OBJROOT="$(OBJROOT)/$$vers" \
90		DSTROOT="$(OBJROOT)/$$vers/DSTROOT" \
91		SYMROOT="$(SYMROOT)/$$vers" \
92		RC_CFLAGS='$(MY_CFLAGS)' \
93		RC_ARCHS='$(MY_ARCHS)' >> "$(SYMROOT)/$$vers/LOG" 2>&1 && \
94		touch "$(OBJROOT)/$$vers/.ok" && \
95		echo "######## Finished $$vers:" `date` '########' >> "$(SYMROOT)/$$vers/LOG" 2>&1 \
96	    ) & \
97	done && \
98	wait && \
99	for vers in $(VERSIONS); do \
100	    cat $(SYMROOT)/$$vers/LOG && \
101	    rm -f $(SYMROOT)/$$vers/LOG || exit 1; \
102	done && \
103	if [ $(TESTOK) ]; then \
104	    $(MAKE) merge; \
105	else \
106	    echo '#### error detected, not merging'; \
107	    exit 1; \
108	fi
109
110MERGEBIN = /usr/bin
111
112merge: mergebegin mergedefault mergeversions fixautodirs
113ifneq ($(wildcard $(OBJROOT)/$(DEFAULT)/DSTROOT$(MERGEBIN)),)
114merge: mergebin
115endif
116ifneq ($(EXTRAMERGE),)
117merge: $(EXTRAMERGE)
118endif
119
120mergebegin:
121	@echo '####### Merging #######'
122
123TEMPWRAPPER = $(MERGEBIN)/.versioner
124mergebin: $(OBJROOT)/wrappers
125	@[ ! -s $(OBJROOT)/wrappers ] || { set -x && \
126	$(PERL_CC) $(MY_CFLAGS) $(VERSIONERFLAGS) $(VERSIONER_C) -o $(DSTROOT)$(TEMPWRAPPER) && \
127	for w in `sort -u $(OBJROOT)/wrappers`; do \
128	    ln -f $(DSTROOT)$(TEMPWRAPPER) $(DSTROOT)$(MERGEBIN)/$$w || exit 1; \
129	done && \
130	rm -f $(DSTROOT)$(TEMPWRAPPER); }
131
132DUMMY = dummy.pl
133$(OBJROOT)/wrappers:
134	mkdir -p $(DSTROOT)$(MERGEBIN)
135	install $(FIX)/$(DUMMY) $(DSTROOT)$(MERGEBIN)
136	@set -x && \
137	touch $(OBJROOT)/wrappers && \
138	for vers in $(ORDEREDVERS); do \
139	    cd $(OBJROOT)/$$vers/DSTROOT$(MERGEBIN) && \
140	    for f in *; do \
141		if file $$f | head -1 | fgrep -q script; then \
142		    fv=`echo $$f | sed -E 's/(\.[^.]*)?$$/'"$$vers&/"` && \
143		    ditto $$f $(DSTROOT)$(MERGEBIN)/$$fv && \
144		    sed "s/@VERSION@/$$vers/g" $(MYFIX)/scriptvers.ed | ed - $(DSTROOT)$(MERGEBIN)/$$fv && \
145		    if [ ! -e $(DSTROOT)$(MERGEBIN)/$$f ]; then \
146			ln -f $(DSTROOT)$(MERGEBIN)/$(DUMMY) $(DSTROOT)$(MERGEBIN)/$$f; \
147		    fi; \
148		elif echo $$f | grep -q "[^0-9]$$vers"; then \
149		    true; \
150		else \
151		    echo $$f >> $(OBJROOT)/wrappers && \
152		    if [ -e $$f$$vers ]; then \
153			ditto $$f$$vers $(DSTROOT)$(MERGEBIN)/$$f$$vers; \
154		    else \
155			ditto $$f $(DSTROOT)$(MERGEBIN)/$$f$$vers; \
156		    fi \
157		fi || exit 1; \
158	    done || exit 1; \
159	done
160	rm -f $(DSTROOT)$(MERGEBIN)/$(DUMMY)
161	cd $(DSTROOT)$(MERGEBIN) && \
162	ls | sort > $(MYVERSIONBINLIST) && \
163	rm -fv `comm -12 $(VERSIONBINLIST) $(MYVERSIONBINLIST)`
164
165MERGEDEFAULT = \
166    Developer
167mergedefault:
168	cd $(OBJROOT)/$(DEFAULT)/DSTROOT && \
169	{ [ ! -d $(MERGEDEFAULT) ] || rsync -Ra $(MERGEDEFAULT) $(DSTROOT); }
170
171MERGEMAN = /usr/share/man
172mergeman:
173	@set -x && \
174	for vers in $(ORDEREDVERS); do \
175	    cd $(OBJROOT)/$$vers/DSTROOT$(MERGEMAN) && \
176	    for d in man*; do \
177		cd $$d && \
178		for f in *.*; do \
179		    ff=`echo $$f | sed -E "s/\.[^.]*(\.gz)?$$/$$vers&/"` && \
180		    ditto $$f $(DSTROOT)$(MERGEMAN)/$$d/$$ff && \
181		    if [ ! -e $(DSTROOT)$(MERGEMAN)/$$d/$$f ]; then \
182			ditto $$f $(DSTROOT)$(MERGEMAN)/$$d/$$f; \
183		    fi || exit 1; \
184		done && \
185		cd .. || exit 1; \
186	    done || exit 1; \
187	done
188	cd $(DSTROOT)$(MERGEMAN) && \
189	find . ! -type d | sed 's,^\./,,' | sort > $(MYVERSIONMANLIST) && \
190	rm -fv `comm -12 $(VERSIONMANLIST) $(MYVERSIONMANLIST)`
191
192MERGEVERSIONS = \
193    System
194mergeversions:
195	@set -x && \
196	for vers in $(VERSIONS); do \
197	    cd $(OBJROOT)/$$vers/DSTROOT && \
198	    rsync -Ra $(MERGEVERSIONS) $(DSTROOT) || exit 1; \
199	done
200
201# 11098667: Unconditionally remove the $(PERL_ARCHNAME)/auto/share/dist
202# directories (empty share directory may be removed by the following change).
203# 12785350: The two modules Syntax-Keyword-Junction and syntax, install a
204# Syntax directory and a syntax.pm file, respectively.  The auto mechanism
205# then creates a Syntax and syntax directory in the auto directory.  This
206# triggers the case-insensitive verifier.  Since these directories are
207# empty (or contain empty directories), we can just remove all these empty
208# directories.
209AUTO = auto $(PERL_ARCHNAME)/auto
210fixautodirs:
211	rm -rf $(foreach v,$(VERSIONS),$(DSTROOT)/System/Library/Perl/Extras/$(v)/$(PERL_ARCHNAME)/auto/share/dist)
212	perl $(MYFIX)/removeemptyautodirs $(foreach v,$(VERSIONS),$(foreach a,$(AUTO),$(DSTROOT)/System/Library/Perl/Extras/$(v)/$(a)))
213
214OSL = $(DSTROOT)/usr/local/OpenSourceLicenses
215OSV = $(DSTROOT)/usr/local/OpenSourceVersions
216PLIST = $(OSV)/$(Project).plist
217LICENSE = $(OSL)/$(Project).txt
218MODULELIST = $(OBJROOT)/ModuleList
219mergeoss:
220	@set -x && \
221	for i in $(VERSIONS); do \
222	    sed -n '/^    /{s/^ *//;s/ \\$$//;p;}' $(SRCROOT)/$$i.inc || exit 1; \
223	done | sort -u > $(MODULELIST)
224	mkdir -p $(OSL) $(OSV)
225	@echo 'Creating $(PLIST):'
226	@echo '<?xml version="1.0" encoding="UTF-8"?>' > $(PLIST)
227	@echo '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">' >> $(PLIST)
228	@echo '<plist version="1.0">' >> $(PLIST)
229	@echo '<array>' >> $(PLIST)
230	@cd $(SRCROOT)/Modules && \
231	for m in `cat $(MODULELIST)`; do \
232	    echo adding $$m && \
233	    sed 's/^/	/' $$m/oss.partial >> $(PLIST) && \
234	    echo "======================== $$m ========================" >> $(LICENSE) && \
235	    cat $$m/LICENSE >> $(LICENSE) || exit 1; \
236	done
237	@echo '</array>' >> $(PLIST)
238	@echo '</plist>' >> $(PLIST)
239