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