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