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