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