diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2012-06-24 22:28:35 +0000 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2012-06-24 22:28:35 +0000 |
commit | 3950ffe2a485479f6561c27364d3d7df5a21d124 (patch) | |
tree | 468c6e14449d1b1e279222ec32f676b0311917d2 /lib/package/package.mk | |
download | ksh-3950ffe2a485479f6561c27364d3d7df5a21d124.tar.gz |
Imported Upstream version 93u+upstream
Diffstat (limited to 'lib/package/package.mk')
-rw-r--r-- | lib/package/package.mk | 1537 |
1 files changed, 1537 insertions, 0 deletions
diff --git a/lib/package/package.mk b/lib/package/package.mk new file mode 100644 index 0000000..921fa2d --- /dev/null +++ b/lib/package/package.mk @@ -0,0 +1,1537 @@ +/* + * source and binary package support + * + * @(#)package.mk (AT&T Research) 2012-02-14 + * + * usage: + * + * cd $INSTALLROOT/lib/package + * nmake -f name [closure] [cyg|exp|lcl|pkg|rpm|tgz] [base|delta] type + * + * where: + * + * name package description file or component + * + * type source build source archive, generates + * $(PACKAGEDIR)/name.version.release.suffix + * binary build binary archive, generates + * $(PACKAGEDIR)/name.version.hosttype.release.suffix + * runtime build binary archive, generates + * $(PACKAGEDIR)/name-run.version.hosttype.release.suffix + * + * NOTE: $(PACKAGEDIR) is in the lowest view and is shared among all views + * + * generated archive member files are $(PACKAGEROOT) relative + * + * main assertions: + * + * NAME [ name=value ] :PACKAGE: component ... + * :OMIT: component ... + * :LICENSE: license-class-pattern + * :CATEGORY: category-id ... + * :COVERS: package ... + * :REQURES: package ... + * :INDEX: index description line + * :DESCRIPTION: + * [ verbose description ] + * :DETAILS: style + * :README: + * readme lines + * :EXPORT: + * name=value + * target :INSTALL: [ source ] + * + * option variables, shown with default values + * + * format=tgz + * archive format + * + * version=YYYY-MM-DD + * package base version (overrides current date) + * + * release=YYYY-MM-DD + * package delta release (overrides current date) + * + * license=type.class + * :LICENSE: type.class pattern override + * + * notice=1 + * include the conspicuous empty notice file + * + * copyright=0 + * do not prepend source file copyright notice + * + * strip=0 + * don't strip non-lcl binary package members + * + * variants=pattern + * include variants matching pattern in binary packages + * + * incremental=[source:1 binary:0] + * if a base archive is generated then also generate an + * incremental delta archive from the previous base + * + * NOTE: the Makerules.mk :PACKAGE: operator defers to :package: when + * a target is specified + */ + +/* these are ast centric -- we'll parameterize another day */ + +org = ast +url = http://www.research.att.com/sw/download + +/* generic defaults */ + +base = +category = utils +checksum = md5 +closure = +copyright = 1 +delta = +format = tgz +incremental = +index = +init = INIT +license = +licenses = $(org) +mamfile = 1 +opt = +name = +notice = +release = +strip = 0 +style = tgz +suffix = tgz +type = +variants = !(cc-g) +vendor = +version = $("":T=R%Y-%m-%d) + +SUM = sum + +package.notice = ------------ NOTICE -- LICENSED SOFTWARE -- SEE README FOR DETAILS ------------ + +package.readme = $(@.package.readme.) + +.package.readme. : + This is a package root directory $PACKAGEROOT. Source and binary + packages in this directory tree are controlled by the command + $() + bin/package + $() + Binary files may be in this directory or in the install root directory + $() + INSTALLROOT=$PACKAGEROOT/arch/`bin/package` + $() + For more information run + $() + bin/package help + $() + Many of the packaged commands self-document via the --man and --html + options; those that do have no separate man page. + $() + Each package is covered by one of the license files + $() + $(PACKAGELIB)/LICENSES/<license> + $() + where <license> is the license type for the package. At the top + of each license file is a URL; the license covers all software that + refers to this URL. For details run + $() + bin/package license [<package>] + $() + Any archives, distributions or packages made from source or + binaries covered by license(s) must contain the corresponding + license file(s)$(notice:?, this README file, and the empty file$$("\n")$$(package.notice)?.?) + +.package.licenses. : .FUNCTION + local I F L R T all save text + L := $(%) + while L == "--*" + I := $(L:O=1) + if I == "--all" + all = 1 + elif I == "--save" + save = 1 + elif I == "--text" + text = 1 + end + L := $(L:O>1) + end + if "$(L)" == "*-*" + L += $(L:/[^-]*-//) $(L:/-.*//) + end + L += $(licenses) + for I $(L:U) + if I == "gpl" + I = gnu + all = + end + if F = "$(I:D=$(PACKAGESRC):B:S=.lic:T=F)" + R += $(F) + if save || text + T := $(.FIND. lib/package .lic $(F):P=W,query=type) + R += $(T:D=$(PACKAGESRC)/LICENSES:B) + end + if save + R += $(F:T=I:N=*.def:D=$(PACKAGESRC):B:S:T=F) + elif ! all + break + end + end + end + return $(R) + +/* + * glob(3) doesn't handle / in alternation -- should it? + */ + +.package.glob. : .FUNCTION + local A D I P S + for I $(%) + if I == "*/*" + D := $(I:C,/.*,,) + if ! "$(A:N=$(D))" + local S.$(D) + A += $(D) + end + S.$(D) += $(I:C,[^/]*/,,) + else + P := $(P)$(S)$(I) + end + S = | + end + if P == "*\|*" + P := ($(P)) + end + for I $(A) + P += $(I)/$(.package.glob. $(S.$(I))) + end + return $(P) + + +.MAKEINIT : .package.init + +.package.init : .MAKE .VIRTUAL .FORCE + local V + V := $(VROOT:T=F:P=L*) + if ! PACKAGEROOT + PACKAGEROOT := $(V:N!=*/arch/+([!/]):O=1) + end + if V == "$(PACKAGEROOT)" + V := + end + V += $(INSTALLROOT) $(PACKAGEROOT) + PACKAGEVIEW := $(V:H=RU) + INSTALLOFFSET := $(INSTALLROOT:C%$(PACKAGEROOT)/%%) + if license + license := $(license)|none.none + end + +PACKAGELIB = lib/package +PACKAGESRC = $(PACKAGEROOT)/$(PACKAGELIB) +PACKAGEBIN = $(INSTALLROOT)/$(PACKAGELIB) +PACKAGEDIR = $(PACKAGESRC)/$(style) +INSTALLOFFSET = $(INSTALLROOT:C%$(PACKAGEROOT)/%%) + +package.omit = -|*/$(init) +package.glob.all = $(INSTALLROOT)/src/*/*/($(MAKEFILES:/:/|/G)) +package.all = $(package.glob.all:P=G:W=O=$(?$(name):A=.VIRTUAL):N!=$(package.omit):T=F:$(PACKAGEVIEW:C,.*,C;^&/;;,:/ /:/G):U) +package.glob.pkg = $(.package.glob. $(~$(name):P=U):C%.*%$(INSTALLROOT)/src/*/&/($(MAKEFILES:/:/|/G))%) $(~$(name):P=U:N=$(name):?$$(INSTALLROOT)/src/$$(name)/($$(MAKEFILES:/:/|/G))??) +package.pkg = $(package.glob.pkg:P=G:D:N!=$(package.omit):T=F:$(PACKAGEVIEW:C,.*,C;^&/;;,:/ /:/G):U) +package.closure = $(closure:?$$(package.all)?$$(package.pkg)?) + +package.init = $(.package.glob. $("$(init)$(name)":P=U):C%.*%$(INSTALLROOT)/src/*/&/($(MAKEFILES:/:/|/G))%:P=G:T=F:D::B) +package.ini = ignore mamprobe manmake package silent +package.src.pat = $(PACKAGESRC)/($(name).(ini|pkg)) +package.src = $(package.src.pat:P=G) $(.package.licenses. --save $(name)) +package.bin = $(PACKAGEBIN)/$(name).ini + +package.mam = --never --force --mam=static --corrupt=accept --clobber --compare --link='lib*.a*' CC=$(CC.DIALECT:N=C++:?CC?cc?) package.license.class=$(license:Q) $(=) 'dontcare test' install test + +op = current +stamp = [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] +source = $(PACKAGEDIR)/$(name).$(version)$(release:?.$(release)??).$(suffix) +binary = $(PACKAGEDIR)/$(name).$(version)$(release:?.$(release)??).$(CC.HOSTTYPE).$(suffix) +runtime = $(PACKAGEDIR)/$(name)-run.$(version)$(release:?.$(release)??).$(CC.HOSTTYPE).$(suffix) +old.new.source = $(PACKAGEDIR)/$(name).$(version).$(old.version).$(suffix) +old.new.binary = $(PACKAGEDIR)/$(name).$(version).$(old.version).$(CC.HOSTTYPE).$(suffix) +old.new.runtime = $(PACKAGEDIR)/$(name)-run.$(version).$(old.version).$(CC.HOSTTYPE).$(suffix) + +source.list = $("$(PACKAGEDIR)/$(name).*$(stamp).$(suffix)":P=G:H=R) +binary.list = $("$(PACKAGEDIR)/$(name).*$(stamp).$(CC.HOSTTYPE).$(suffix)":P=G:H=R) +runtime.list = $("$(PACKAGEDIR)/$(name)-run.*$(stamp).$(CC.HOSTTYPE).$(suffix)":P=G:H>) + +source.ratz = $("$(INSTALLROOT)/src/cmd/$(init)/ratz.c":T=F) +binary.ratz = $("$(INSTALLROOT)/src/cmd/$(init)/ratz":T=F) + +$(init) : .VIRTUAL $(init) + +package.requires = 0 + +":package:" : .MAKE .OPERATOR + local P I R V + P := $(<:O=1) + $(P) : $(>:V) + if ! package.requires + if ! name + name := $(P) + .PACKAGE. := $(P) + if name == "$(init)" + package.omit = - + package.src += $(package.ini:C,^,$(PACKAGEROOT)/bin/,) $(PACKAGESRC)/package.mk + else + $(P) : $(package.init) + end + for I $(<:O>1) + if I == "*=*" + eval + $(I) + end + else + version := $(I) + end + end + LICENSEFILEDEFAULT := $(.package.licenses. $(name):@/ /:/G) + export LICENSEFILEDEFAULT + end + if "$(>)" + for I $(>:V) + $(I) : .VIRTUAL + if I == "/*" + package.dir += $(I:V) + end + end + end + if "$(@)" + $(P).README := $(@) + else + $(P).README := This is the $(P) package. + end + end + +":AUXILIARY:" : .MAKE .OPERATOR + package.auxiliary.$(style) += $(>:N=/*:T=F) $(>:N!=/*:C%^%$(INSTALLROOT)/%:T=F) + +":CATEGORY:" : .MAKE .OPERATOR + if ! package.requires + category := $(>) + end + +.covers. : .FUNCTION + local I C D F K=0 L + for I $(%) + if ! "$(~covers:N=$(I:B))" + if F = "$(I:D:B:S=.pkg:T=F)" + if D = "$(F:T=I)" + covers : $(I:B) + for L $(D) + if L == ":COVERS:" + K = 1 + elif L == ":*:" + if K + break + end + elif K + : $(.covers. $(L)) + end + end + end + else + error $(--exec:?3?1?) $(I): unknown package $(I) + end + end + end + +":COVERS:" : .MAKE .OPERATOR + if ! package.requires + : $(.covers. $(>)) + end + +":DESCRIPTION:" : .MAKE .OPERATOR + if ! package.requires + $(name).README := $(@:V) + end + +":DETAILS:" : .MAKE .OPERATOR + if ! package.requires + details.$(>:O=1) := $(@:V) + end + +":EXPORT:" : .MAKE .OPERATOR + if ! package.requires + export.$(style) := $(@:/$$("\n")/ /G) + end + +":INDEX:" : .MAKE .OPERATOR + if ! package.requires + index := $(>) + end + +":INSTALL:" : .MAKE .OPERATOR + if ! package.requires + local T S F X + S := $(>) + T := $(<) + if "$(exe.$(style))" && "$(T)" == "bin/*([!./])" + T := $(T).exe + end + if ! "$(S)" + S := $(T) + elif "$(exe.$(style))" && "$(S)" == "bin/*([!./])" + S := $(S).exe + end + install.$(style) := $(install.$(style):V)$("\n")install : $$(ROOT)/$(T)$("\n")$$(ROOT)/$(T) : $$(ARCH)/$(S)$("\n\t")cp $< $@ + if strip && "$(T:N=*.exe)" + install.$(style) := $(install.$(style):V)$("\n\t")strip $@ 2>/dev/null + end + X := $(PACKAGEROOT)/arch/$(CC.HOSTTYPE)/$(S) + if strip && "$(X:T=Y)" == "*/?(x-)(dll|exe)" + F := filter $(STRIP) $(STRIPFLAGS) $(X) + end + if "$(filter.$(style):V)" + filter.$(style) := $(filter.$(style):V)$$("\n") + end + filter.$(style) := $(filter.$(style):V);;$(F);$(X);usr/$(T) + end + +":LICENSE:" : .MAKE .OPERATOR + if ! package.requires && ! license + license := $(>) + end + +":OMIT:" : .MAKE .OPERATOR + if ! package.requires + package.omit := $(package.omit)|$(>:C,^,*/,:/ /|/G) + end + +":POSTINSTALL:" : .MAKE .OPERATOR + if ! package.requires + postinstall.$(style) := $(@:V) + end + +":README:" : .MAKE .OPERATOR + if ! package.requires + readme.$(style) := $(@:V) + end + +.requires. : .FUNCTION + local I C D F K=0 L V T M=0 + for I $(%) + if ! "$(~requires:N=$(I:B))" + if F = "$(I:D:B:S=.pkg:T=F)" + if I == "$(init)" + package.omit = - + else + requires : $(I:B) + end + if V = "$(I:D:B=gen/$(I:B):S=.ver:T=F)" + req : $(I:B) + else + error 1 $(I): package should be written before $(P) + end + let package.requires = package.requires + 1 + include "$(F)" + let package.requires = package.requires - 1 + else + error 1 $(I): package not found + end + end + end + +":REQUIRES:" : .MAKE .OPERATOR + : $(.requires. $(>)) + +":TEST:" : .MAKE .OPERATOR + if ! package.requires + local T + T := $(>) + if "$(T)" == "bin/*([!./])" + if "$(exe.$(style))" + T := $(T).exe + end + T := $$(PWD)/$$(ARCH)/$(T) + end + test.$(style) := $(test.$(style):V)$("\n")test : $(T:V)$("\n\t")$(@) + end + +base delta : .MAKE .VIRTUAL .FORCE + op := $(<) + +closure : .MAKE .VIRTUAL .FORCE + $(<) := 1 + +cyg exp lcl pkg rpm tgz : .MAKE .VIRTUAL .FORCE + style := $(<) + +source : .source.init .source.gen .source.$$(style) + +.source.init : .MAKE + local A B D P V I + type := source + if ! "$(incremental)" + incremental = 1 + end + if "$(source.$(name))" + suffix = c + end + : $(.init.$(style)) + : $(details.$(style):V:R) : + A := $(source.list) + B := $(A:N=*.$(stamp).$(suffix):N!=*.$(stamp).$(stamp).*:O=1:T=F) + P := $(A:N=*.$(stamp).$(suffix):N!=*.$(stamp).$(stamp).*:O=2:T=F) + D := $(A:N=*.$(stamp).$(stamp).$(suffix):O=1:T=F) + if op == "delta" + if ! B + error 3 delta requires a base archive + end + base := -z $(B) + deltaversion := $(B:B:/$(name).//) + let deltasince = $(deltaversion:/.*-//) + 1 + deltasince := $(deltaversion:/[^-]*$/$(deltasince:F=%02d)/) + if "$(release)" != "$(stamp)" + release := $("":T=R%Y-%m-%d) + end + source := $(B:D:B:S=.$(release).$(suffix)) + version := $(source:B:B:/$(name).//) + elif B || op == "base" + if op == "base" + for I $(B) $(P) + V := $(I:B:/$(name)\.\([^.]*\).*/\1/) + if V == "$(stamp)" && V != "$(version)" + old.version := $(V) + old.source := $(I) + if "$(old.version)" >= "$(version)" + error 3 $(name): previous base $(old.version) is newer than $(version) + end + break + end + end + else + source := $(B) + end + if B == "$(source)" + if "$(B:D:B:B)" == "$(D:D:B:B)" && "$(B:B::S)" != "$(D:B::S)" + error 3 $(B:B:S): base overwrite would invalidate delta $(D:B:S) + end + error 1 $(B:B:S): replacing current base + end + version := $(source:B:S:/^$(name).\(.*\).$(suffix)$/\1/) + end + PACKAGEGEN := $(PACKAGESRC)/gen + +.source.gen : $$(PACKAGEDIR) $$(PACKAGEGEN) $$(PACKAGEGEN)/SOURCE.html $$(PACKAGEGEN)/BINARY.html $$(PACKAGEGEN)/DETAILS.html + +BINPACKAGE := $(PATH:/:/ /G:X=package:T=F:O=1) + +$$(PACKAGEDIR) $$(PACKAGEGEN) : .IGNORE + [[ -d $(<) ]] || mkdir $(<) + +$$(PACKAGEGEN)/SOURCE.html : $(BINPACKAGE) + $(*) html source > $(<) + +$$(PACKAGEGEN)/BINARY.html : $(BINPACKAGE) + $(*) html binary > $(<) + +$$(PACKAGEGEN)/DETAILS.html : $(BINPACKAGE) + $(*) html intro > $(<) + +.source.exp .source.pkg .source.rpm : .MAKE + error 3 $(style): source package style not supported yet + +exe.cyg = .exe +vendor.cyg = gnu + +.name.cyg : .FUNCTION + local N + N := $(%) + if N == "*-*" + vendor := $(N:/-.*//) + if vendor == "$(vendor.cyg)" + vendor := + N := $(N:/[^-]*-//) + end + N := $(N:/-//G) + end + return $(N) + +.init.cyg : .FUNCTION + local N O + closure = 1 + init = . + strip = 1 + suffix = tar.bz2 + format = tbz + vendor := $(licenses:N!=$(vendor.cyg):O=1) + package.ini := $(package.ini) + package.src.pat := $(package.src.pat) + package.src := $(package.src) + package.bin := $(package.bin) + .source.gen : .CLEAR $(*.source.gen:V:N!=*.html) + name.original := $(name) + name := $(.name.cyg $(name)) + if name != "$(name.original)" + $(name) : $(~$(name.original)) + O := $(~covers) + covers : .CLEAR + for N $(O) + covers : $(.name.cyg $(N)) + end + end + stamp = [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9] + version.original := $(version) + version := $(version:/-//G)-1 + if opt + opt := $(opt)/$(vendor)/ + else + opt := $(name)-$(version)/ + end + if type == "source" + version := $(version)-src + source = $(PACKAGEDIR)/$(name)-$(version)$(release:?.$(release)??).$(suffix) + else + binary = $(PACKAGEDIR)/$(name)-$(version)$(release:?.$(release)??).$(suffix) + end + +.source.cyg : + if [[ '$(~$(name))' ]] + then tmp=/tmp/pkg$(tmp) + mkdir $tmp + { + integer m=0 o + cat > $tmp/configure <<'!' + echo "you didn't have to do that" + ! + chmod +x $tmp/configure + echo ";;;$tmp/configure;configure" + cat > $tmp/Makefile0 <<'!' + HOSTTYPE := $$(shell bin/package) + ROOT = ../.. + ARCH = arch/$$(HOSTTYPE) + all : + PACKAGEROOT= CYGWIN="$$CYGWIN ntsec binmode" bin/package make $(export.$(style)) + install : all + $(install.$(style):V) + $(test.$(style):V) + ! + echo ";;;$tmp/Makefile0;Makefile" + cat > $tmp/CYGWIN-README <<'!' + $(readme.$(style):@?$$(readme.$$(style))$$("\n\n")??)To build binaries from source into the ./arch/`bin/package` tree run: + $() + make + $() + $(test.$(style):@?To test the binaries after building/installing run:$$("\n\n\t")make test$$("\n\n")??)To build and/or install the binaries run: + $() + make install + $() + The bin/package command provides a command line interface for all package + operations. The $(opt:/.$//) source and binary packages were generated by: + $() + package write cyg base source version=$(version.original) $(name.original) + package write cyg base binary version=$(version.original) $(name.original) + $() + using the $(org)-base package. To download and install the latest + $(org)-base source package in /opt/$(org) run: + $() + PATH=/opt/$(org)/bin:$PATH + cd /opt/$(org) + package authorize "NAME" password "PASSWORD" setup flat source $("\\") + $(url) $("\\") + $(org)-base + package make + $() + and export /opt/$(org)/bin in PATH to use. The NAME and PASSWORD signify your + agreement to the software license(s). All users get the same NAME and PASSWORD. + See $(url) for details. If multiple architectures may be built under + /opt/$(org) then drop "flat" and export /opt/$(org)/arch/`package`/bin in PATH + to use. To update previously downloaded packages from the same url simply run: + $() + cd /opt/$(org) + package setup + package make + $() + To download and install the latest $(org)-base binary package in + /opt/$(org) change "source" to "binary" and omit "package make". + ! + echo ";;;$tmp/CYGWIN-README;CYGWIN-PATCHES/README" + cat > $(source:/-src.$(suffix)//).setup.hint <<'!' + category: $(category:/\(.\).*/\1/U)$(category:/.\(.*\)/\1/L) + requires: cygwin + sdesc: "$(index)" + ldesc: "$($(name.original).README)" + ! + echo ";;;$(source:/-src.$(suffix)//).setup.hint;CYGWIN-PATCHES/setup.hint" + echo ";;;$(BINPACKAGE);bin/package" + cat > $tmp/Makefile <<'!' + :MAKE: + ! + echo ";;;$tmp/Makefile;src/Makefile" + echo ";;;$tmp/Makefile;src/cmd/Makefile" + echo ";;;$tmp/Makefile;src/lib/Makefile" + if [[ '$(mamfile)' == 1 ]] + then cat > $tmp/Mamfile1 <<'!' + info mam static + note source level :MAKE: equivalent + make install + make all + exec - ${MAMAKE} -r '*/*' ${MAMAKEARGS} + done all virtual + done install virtual + ! + echo ";;;$tmp/Mamfile1;src/Mamfile" + cat > $tmp/Mamfile2 <<'!' + info mam static + note component level :MAKE: equivalent + make install + make all + exec - ${MAMAKE} -r '*' ${MAMAKEARGS} + done all virtual + done install virtual + ! + echo ";;;$tmp/Mamfile2;src/cmd/Mamfile" + echo ";;;$tmp/Mamfile2;src/lib/Mamfile" + fi + $(package.src:U:T=F:/.*/echo ";;;&"$("\n")/) + echo ";;;$(PACKAGEGEN)/$(name.original).req" + set -- $(package.closure) + for i + do cd $(INSTALLROOT)/$i + if [[ ! '$(license)' ]] || $(MAKE) --noexec --silent 'exit $$(LICENSECLASS:N=$(license):?0?1?)' . + then if [[ '$(mamfile)' == 1 ]] + then (( o=m )) + s=$( $(MAKE) --noexec --recurse=list recurse 2>/dev/null ) + if [[ $s ]] + then for j in $s + do if [[ -d $j ]] + then cd $j + if [[ ! '$(license)' ]] || $(MAKE) --noexec --silent 'exit $$(LICENSECLASS:N=$(license):?0?1?)' . + then (( m++ )) + $(MAKE) $(package.mam) $(export.$(style):Q) > $tmp/$m.mam + echo ";;;$tmp/$m.mam;$i/$j/Mamfile" + fi + cd $(INSTALLROOT)/$i + fi + done + if (( o != m )) + then (( m++ )) + cat > $tmp/$m.mam <<'!' + info mam static + note subcomponent level :MAKE: equivalent + make install + make all + exec - ${MAMAKE} -r '*' ${MAMAKEARGS} + done all virtual + done install virtual + ! + echo ";;;$tmp/$m.mam;$i/Mamfile" + fi + else (( m++ )) + $(MAKE) $(package.mam) $(export.$(style):Q) > $tmp/$m.mam + echo ";;;$tmp/$m.mam;$i/Mamfile" + fi + fi + $(MAKE) --noexec $(-) $(=) recurse list.package.$(type) package.license.class=$(license:Q) + fi + done + set -- $(package.dir:P=G) + for i + do tw -d $i -e "action:printf(';;;%s;%s\n',path,path);" + done + } | + { + : > $tmp/HEAD + cat > $tmp/README <<'!' + $(package.readme) + ! + echo ";;;$tmp/README;README" + sort -t';' -k5,5 -u + : > $tmp/TAIL + [[ '$(notice)' ]] && echo ";;;$tmp/TAIL;$(package.notice)" + } | + $(PAX) --filter=- \ + --to=ascii \ + --format=$(format) \ + --local \ + -wvf $(source) $(base) \ + $(PACKAGEVIEW:C%.*%-s",^&/,,"%) \ + $(vendor:?-s",^[^/],$(opt)&,"??) + $(SUM) -x $(checksum) < $(source) > $(source:D:B:S=.$(checksum)) + rm -rf $tmp + fi + +.source.lcl : + if [[ '$(~$(name))' ]] + then tmp=/tmp/pkg$(tmp) + mkdir $tmp + { + integer m=0 o + $(package.src:U:T=F:/.*/echo ";;;&"$("\n")/) + set -- $(package.closure) + for i + do cd $(INSTALLROOT)/$i + $(MAKE) --noexec $(-) $(=) .FILES.+=Mamfile recurse list.package.local + done + set -- $(package.dir:P=G) + for i + do tw -d $i -e "action:printf(';;;%s;%s\n',path,path);" + done + } | + sort -t';' -k5,5 -u | + $(PAX) --filter=- \ + --to=ascii \ + $(op:N=delta:??--format=$(format)?) \ + --local \ + -wvf $(source) $(base) \ + $(op:N=delta:?--format=gzip??) \ + $(PACKAGEVIEW:C%.*%-s",^&/,,"%) + rm -rf $tmp + fi + +.source.tgz : + if [[ '$(~$(name))' ]] + then tmp=/tmp/pkg$(tmp) + mkdir $tmp + { + integer m=0 o + if [[ '$(init)' == '$(name)' ]] + then cat > $tmp/Makefile <<'!' + :MAKE: + ! + $(CMP) $(CMPFLAGS) $tmp/Makefile $(PACKAGEROOT)/src/Makefile && touch -r $(PACKAGEROOT)/src/Makefile $tmp/Makefile + echo ";;;$tmp/Makefile;src/Makefile" + cp $tmp/Makefile $tmp/Makefile1 + $(CMP) $(CMPFLAGS) $tmp/Makefile1 $(PACKAGEROOT)/src/cmd/Makefile && touch -r $(PACKAGEROOT)/src/cmd/Makefile $tmp/Makefile1 + echo ";;;$tmp/Makefile1;src/cmd/Makefile" + cp $tmp/Makefile $tmp/Makefile2 + $(CMP) $(CMPFLAGS) $tmp/Makefile2 $(PACKAGEROOT)/src/lib/Makefile && touch -r $(PACKAGEROOT)/src/lib/Makefile $tmp/Makefile2 + echo ";;;$tmp/Makefile2;src/lib/Makefile" + if [[ '$(mamfile)' == 1 ]] + then cat > $tmp/Mamfile1 <<'!' + info mam static + note source level :MAKE: equivalent + make install + make all + exec - ${MAMAKE} -r '*/*' ${MAMAKEARGS} + done all virtual + done install virtual + ! + $(CMP) $(CMPFLAGS) $tmp/Mamfile1 $(PACKAGEROOT)/src/Mamfile && touch -r $(PACKAGEROOT)/src/Mamfile $tmp/Mamfile1 + echo ";;;$tmp/Mamfile1;src/Mamfile" + cat > $tmp/Mamfile2 <<'!' + info mam static + note component level :MAKE: equivalent + make install + make all + exec - ${MAMAKE} -r '*' ${MAMAKEARGS} + done all virtual + done install virtual + ! + $(CMP) $(CMPFLAGS) $tmp/Mamfile2 $(PACKAGEROOT)/src/cmd/Mamfile && touch -r $(PACKAGEROOT)/src/cmd/Mamfile $tmp/Mamfile2 + echo ";;;$tmp/Mamfile2;src/cmd/Mamfile" + cp $tmp/Mamfile2 $tmp/Mamfile3 + $(CMP) $(CMPFLAGS) $tmp/Mamfile3 $(PACKAGEROOT)/src/lib/Mamfile && touch -r $(PACKAGEROOT)/src/lib/Mamfile $tmp/Mamfile3 + echo ";;;$tmp/Mamfile3;src/lib/Mamfile" + fi + fi + $(package.src:U:T=F:C%^$(PACKAGEROOT)/%%:C%.*%echo ";;;$(PACKAGEROOT)/&;&"$("\n")%) + if [[ '$(~covers)' ]] + then for i in $(~covers) + do for j in lib pkg + do if [[ -f $(PACKAGESRC)/$i.$j ]] + then echo ";;;$(PACKAGESRC)/$i.$j;$(PACKAGELIB)/$i.$j" + fi + done + for j in ver req + do if [[ -f $(PACKAGEGEN)/$i.$j ]] + then echo ";;;$(PACKAGEGEN)/$i.$j;$(PACKAGELIB)/$i.$j" + fi + done + done + for i in $(~covers:D=$(PACKAGESRC):B:S=.lic:T=F:T=I:N=*.def:D=$(PACKAGESRC):B:S:T=F:B:S) + do echo ";;;$(PACKAGESRC)/$i;$(PACKAGELIB)/$i" + done + fi + if [[ '$(PACKAGEDIR:B)' == '$(style)' ]] + then echo $(name) $(version) $(release|version) 1 > $tmp/t + $(CMP) $(CMPFLAGS) $tmp/t $(PACKAGEGEN)/$(name).ver || cp $tmp/t $(PACKAGEGEN)/$(name).ver + echo ";;;$(PACKAGEGEN)/$(name).ver;$(PACKAGELIB)/$(name).ver" + sed 's,1$,0,' $(~req:D=$(PACKAGEGEN):B:S=.ver:T=F) < /dev/null > $tmp/t + $(CMP) $(CMPFLAGS) $tmp/t $(PACKAGEGEN)/$(name).req || cp $tmp/t $(PACKAGEGEN)/$(name).req + echo ";;;$(PACKAGEGEN)/$(name).req;$(PACKAGELIB)/$(name).req" + { + echo "name='$(name)'" + echo "index='$(index)'" + echo "covers='$(~covers)'" + echo "requires='$(~req)'" + } > $tmp/t + $(CMP) $(CMPFLAGS) $tmp/t $(PACKAGEGEN)/$(name).inx || cp $tmp/t $(PACKAGEGEN)/$(name).inx + { + { + echo '$($(name).README)' + if [[ '$(~covers)' ]] + then echo "This package is a superset of the following package$(~covers:O=2:?s??): $(~covers); you won't need $(~covers:O=2:?these?this?) if you download $(name)." + fi + if [[ '$(~requires)' ]] + then echo 'It requires the following package$(~requires:O=2:?s??): $(~requires).' + fi + } | fmt + package help source + package release $(name) + } > $tmp/t + $(CMP) $(CMPFLAGS) $tmp/t $(PACKAGEGEN)/$(name).README || cp $tmp/t $(PACKAGEGEN)/$(name).README + echo ";;;$(PACKAGEGEN)/$(name).README;$(PACKAGELIB)/$(name).README" + { + echo '.xx title="$(name) package"' + echo '.xx meta.description="$(name) package"' + echo '.xx meta.keywords="software, package"' + echo '.MT 4' + echo '.TL' + echo '$(name) package' + echo '.H 1 "$(name) package"' + echo '$($(name).README)' + set -- $(package.closure:C,.*,$(INSTALLROOT)/&/PROMO.mm,:T=F:D::B) + hot= + for i + do hot="$hot -e s/\\(\\<$i\\>\\)/\\\\h'0*1'\\1\\\\h'0'/" + done + set -- $(package.closure:B) + if (( $# )) + then echo 'Components in this package:' + echo '.P' + echo '.TS' + echo 'center expand;' + echo 'l l l l l l.' + if [[ $hot ]] + then hot="sed $hot" + else hot=cat + fi + for i + do echo $i + done | + pr -6 -t -s' ' | + $hot + echo '.TE' + fi + echo '.P' + if [[ '$(~covers)' ]] + then echo "This package is a superset of the following package$(~covers:O=2:?s??): $(~covers); you won't need $(~covers:O=2:?these?this?) if you download $(name)." + fi + if [[ '$(~requires)' ]] + then echo 'It requires the following package$(~requires:O=2:?s??): $(~requires).' + fi + set -- $(.package.licenses. --all $(name)) + case $# in + 0) ;; + *) case $# in + 1) echo 'The software is covered by this license:' ;; + *) echo 'The software is covered by these licenses:' ;; + esac + echo .BL + for j + do i=$( $(PROTO) -l $j -p -h -o type=usage /dev/null | sed -e 's,.*\[-license?\([^]]*\).*,\1,' ) + echo .LI + echo ".xx link=\"$i\"" + done + echo .LE + echo 'Individual components may be covered by separate licenses;' + echo 'refer to the component source and/or binaries for more information.' + echo .P + ;; + esac + echo 'A recent' + echo '.xx link="release change log"' + echo 'is also included.' + cat $(package.closure:C,.*,$(INSTALLROOT)/&/PROMO.mm,:T=F) < /dev/null + echo '.H 1 "release change log"' + echo '.xx index' + echo '.nf' + package release $(name) | + sed -e 's/:::::::: \(.*\) ::::::::/.fi\$("\n").H 1 "\1 changes"\$("\n").nf/' + echo '.fi' + } | + $(MM2HTML) $(MM2HTMLFLAGS) -o nohtml.ident > $tmp/t + $(STDED) $(STDEDFLAGS) $tmp/t <<'!' + /^<!--LABELS-->$/,/^<!--\/LABELS-->$/s/ changes</</ + /^<!--LABELS-->$/,/^<!--\/LABELS-->$/m/<A name="release change log">/ + w + q + ! + $(CMP) $(CMPFLAGS) $tmp/t $(PACKAGEGEN)/$(name).html || cp $tmp/t $(PACKAGEGEN)/$(name).html + echo ";;;$(PACKAGEGEN)/$(name).html;$(PACKAGELIB)/$(name).html" + if [[ '$(deltasince)' ]] + then { + echo '.xx title="$(name) package"' + echo '.xx meta.description="$(name) package $(version) delta $(release)"' + echo '.xx meta.keywords="software, package, delta"' + echo '.MT 4' + echo '.TL' + echo '$(name) package $(deltaversion) delta $(release)' + echo '.H 1 "$(name) package $(deltaversion) delta $(release) changes"' + echo '.nf' + package release $(deltasince) $(name) | + sed -e 's/:::::::: \(.*\) ::::::::/.H 2 \1/' + echo '.fi' + } | + $(MM2HTML) $(MM2HTMLFLAGS) -o nohtml.ident > $tmp/t + $(CMP) $(CMPFLAGS) $tmp/t $(PACKAGEGEN)/$(name).$(release).html || cp $tmp/t $(PACKAGEGEN)/$(name).$(release).html + echo ";;;$(PACKAGEGEN)/$(name).$(release).html;$(PACKAGELIB)/$(name).$(release).html" + fi + fi + set -- $(package.closure) + for i + do cd $(INSTALLROOT)/$i + if [[ ! '$(license)' ]] || $(MAKE) --noexec --silent 'exit $$(LICENSECLASS:N=$(license):?0?1?)' . + then if [[ '$(mamfile)' == 1 ]] + then (( o=m )) + s=$( $(MAKE) --noexec --recurse=list recurse 2>/dev/null ) + if [[ $s ]] + then for j in $s + do if [[ -d $j ]] + then cd $j + if [[ ! '$(license)' ]] || $(MAKE) --noexec --silent 'exit $$(LICENSECLASS:N=$(license):?0?1?)' . + then (( m++ )) + $(MAKE) $(package.mam) > $tmp/$m.mam + $(CMP) $(CMPFLAGS) $tmp/$m.mam $(PACKAGEROOT)/$i/$j/Mamfile && touch -r $(PACKAGEROOT)/$i/$j/Mamfile $tmp/$m.mam + echo ";;;$tmp/$m.mam;$i/$j/Mamfile" + fi + cd $(INSTALLROOT)/$i + fi + done + if (( o != m )) + then (( m++ )) + cat > $tmp/$m.mam <<'!' + info mam static + note subcomponent level :MAKE: equivalent + make install + make all + exec - ${MAMAKE} -r '*' ${MAMAKEARGS} + done all virtual + done install virtual + ! + $(CMP) $(CMPFLAGS) $tmp/$m.mam $(PACKAGEROOT)/$i/Mamfile && touch -r $(PACKAGEROOT)/$i/Mamfile $tmp/$m.mam + echo ";;;$tmp/$m.mam;$i/Mamfile" + fi + else (( m++ )) + $(MAKE) $(package.mam) > $tmp/$m.mam + $(CMP) $(CMPFLAGS) $tmp/$m.mam $(PACKAGEROOT)/$i/Mamfile && touch -r $(PACKAGEROOT)/$i/Mamfile $tmp/$m.mam + echo ";;;$tmp/$m.mam;$i/Mamfile" + fi + fi + $(MAKE) --noexec $(-) $(=) recurse list.package.$(type) package.license.class=$(license:Q) $(copyright:N=1:??LICENSE=?) + fi + done + set -- $(package.dir:P=G) + for i + do tw -d $i -e "action:printf(';;;%s;%s\n',path,path);" + done + } | + { + : > $tmp/HEAD + [[ '$(notice)' ]] && echo ";;;$tmp/HEAD;$(package.notice)" + cat > $tmp/README <<'!' + $(package.readme) + ! + echo ";;;$tmp/README;README" + $(CMP) $(CMPFLAGS) $tmp/README $(PACKAGEROOT)/README && touch -r $(PACKAGEROOT)/README $tmp/README + sort -t';' -k5,5 -u + : > $tmp/TAIL + [[ '$(notice)' ]] && echo ";;;$tmp/TAIL;$(package.notice)" + } | + $(PAX) --filter=- \ + --to=ascii \ + $(op:N=delta:??--format=$(format)?) \ + --local \ + -wvf $(source) $(base) \ + $(op:N=delta:?--format=gzip??) \ + $(PACKAGEVIEW:C%.*%-s",^&/,,"%) + $(SUM) -x $(checksum) < $(source) > $(source:D:B:S=.$(checksum)) + echo local > $(source:D:B=$(name):S=.tim) + if [[ '$(incremental)' == 1 && '$(old.source)' ]] + then $(PAX) -rf $(source) -wvf $(old.new.source) -z $(old.source) + $(SUM) -x $(checksum) < $(old.new.source) > $(old.new.source:D:B:S=.$(checksum)) + fi + rm -rf $tmp + else if [[ '$(old.source)' ]] && $(CMP) $(CMPFLAGS) $(source.$(name)) $(source) + then : $(name) is up to date + else echo $(name) $(version) $(release|version) 1 > $(PACKAGEGEN)/$(name).ver + : > $(PACKAGEGEN)/$(name).req + { + echo "name='$(name)'" + echo "index='$(index)'" + echo "covers='$(~covers)'" + echo "requires='$(~req)'" + } > $(PACKAGEGEN)/$(name).inx + { + echo '.xx title="$(name) package"' + echo '.xx meta.description="$(name) package"' + echo '.xx meta.keywords="software, package"' + echo '.MT 4' + echo '.TL' + echo '$(name) package' + echo '.H 1' + echo '$($(name).README)' + } | + $(MM2HTML) $(MM2HTMLFLAGS) -o nohtml.ident > $(PACKAGEGEN)/$(name).html + if [[ '$(source.$(name))' ]] + then { + echo '$($(name).README)' + package help source + } > $(PACKAGEGEN)/$(name).README + cp $(source.$(name)) $(source) + $(SUM) -x $(checksum) < $(source) > $(source:D:B:S=.$(checksum)) + fi + echo local > $(source:D:B=$(name):S=.tim) + fi + fi + +binary : .binary.init .binary.gen .binary.$$(style) + +.binary.init : .MAKE + local A B D I P V + type := binary + if ! "$(incremental)" + incremental = 0 + end + if ! "$(~$(name))" + if name == "ratz" + suffix = exe + else + suffix = gz + end + end + : $(.init.$(style)) : + : $(details.$(style):V:R) : + A := $(binary.list) + B := $(A:N=*.$(stamp).$(CC.HOSTTYPE).$(suffix):N!=*.$(stamp).$(stamp).*:O=1:T=F) + P := $(A:N=*.$(stamp).$(CC.HOSTTYPE).$(suffix):N!=*.$(stamp).$(stamp).*:O=2:T=F) + D := $(A:N=*.$(stamp).$(stamp).$(CC.HOSTTYPE).$(suffix):O=1:T=F) + if op == "delta" + if ! B + error 3 delta requires a base archive + end + base := -z $(B) + if "$(release)" != "$(stamp)" + release := $("":T=R%Y-%m-%d) + end + binary := $(B:/$(CC.HOSTTYPE).$(suffix)$/$(release).&/) + version := $(binary:B:B:/$(name).//) + elif B || op == "base" + if op == "base" + for I $(B) $(P) + V := $(I:B:/$(name)\.\([^.]*\).*/\1/) + if V == "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]" && V != "$(version)" + old.version := $(V) + old.binary := $(I) + if "$(old.version)" >= "$(version)" + error 3 $(name): previous base $(old.version) is newer than $(version) + end + break + end + end + else + binary := $(B) + end + if B == "$(binary)" + if "$(B:D:B)" == "$(D:D:B)" && "$(B:S)" != "$(D:S)" + error 3 $(B:B:S): base overwrite would invalidate delta $(D:B:S) + end + error 1 $(B:B:S): replacing current base + end + version := $(binary:B:/$(name).//:/\..*//) + end + PACKAGEGEN := $(PACKAGEBIN)/gen + +.binary.gen : $$(PACKAGEDIR) $$(PACKAGEGEN) + +.binary.exp .binary.pkg .binary.rpm : .MAKE + error 3 $(style): binary package style not supported yet + +.binary.cyg : + if [[ '$(~$(name))' ]] + then tmp=/tmp/pkg$(tmp) + mkdir $tmp + { + integer m=0 o + { + echo '$($(name.original).README)' | fmt + cat <<'!' + $(readme.$(style):@?$$("\n")$$(readme.$$(style))??) + ! + } > $tmp/README1 + echo ";;;$tmp/README1;usr/share/doc/Cygwin/$(opt:/.$//).README" + { + echo '$($(name.original).README)' | fmt + cat <<'!' + $() + The remainder of this file is the README from the source package + that was used to generate this binary package. It describes + the source build hierarchy, not the current directory. + $() + $(package.readme) + ! + } > $tmp/README2 + echo ";;;$tmp/README2;usr/share/doc/$(opt)README" + package release $(name.original) > $tmp/RELEASE + echo ";;;$tmp/RELEASE;usr/share/doc/$(opt)RELEASE" + cat > $(binary:/.$(suffix)//).setup.hint <<'!' + category: $(category:/\(.\).*/\1/U)$(category:/.\(.*\)/\1/L) + requires: cygwin + sdesc: "$(index)" + ldesc: "$($(name.original).README)" + ! + set -- $(.package.licenses. --text $(name.original):N!=*.lic) + for i + do echo ";;;${i};usr/share/doc/$(opt)LICENSE-${i##*/}" + done + cat <<'!' + $(filter.$(style)) + ! + if [[ '$(postinstall.$(style):V:O=1:?1??)' ]] + then cat >$tmp/postinstall <<'!' + $("#")!/bin/sh + $(postinstall.$(style)) + ! + echo ";;;$tmp/postinstall;etc/postinstall/$(name).sh" + fi + } | + { + : > $tmp/HEAD + [[ '$(notice)' ]] && echo ";;;$tmp/HEAD;$(package.notice)" + sort -t';' -k5,5 -u + : > $tmp/TAIL + [[ '$(notice)' ]] && echo ";;;$tmp/TAIL;$(package.notice)" + } | + $(PAX) --filter=- \ + --to=ascii \ + --format=$(format) \ + --local \ + -wvf $(binary) + $(SUM) -x $(checksum) < $(binary) > $(binary:D:B:S=.$(checksum)) + rm -rf $tmp + fi + +.binary.lcl : + if [[ '$(~$(name))' ]] + then tmp=/tmp/pkg$(tmp) + mkdir $tmp + { + $(package.src:U:T=F:/.*/echo ";;;&"$("\n")/) + $(package.bin:U:T=F:/.*/echo ";;;&"$("\n")/) + set -- $(package.closure) + for i + do cd $(INSTALLROOT)/$i + $(MAKE) --noexec $(-) --variants=$(variants:Q) $(=) recurse list.package.$(type) package.license.class=$(license:Q) cc- + done + } | + $(PAX) --filter=- \ + --to=ascii \ + $(op:N=delta:??--format=$(format)?) \ + --local \ + --checksum=md5:$(PACKAGEGEN)/$(name).sum \ + --install=$(PACKAGEGEN)/$(name).ins \ + -wvf $(binary) $(base) \ + $(op:N=delta:?--format=gzip??) \ + -s",^$tmp/,$(INSTALLOFFSET)/," \ + $(PACKAGEROOT:C%.*%-s",^&/,,"%) + $(SUM) -x $(checksum) < $(binary) > $(binary:D:B:S=.$(checksum)) + echo local > $(binary:D:B=$(name):S=.$(CC.HOSTTYPE).tim) + rm -rf $tmp + fi + +.binary.tgz : + if [[ '$(~$(name))' ]] + then tmp=/tmp/pkg$(tmp) + mkdir $tmp + { + if [[ '$(init)' == '$(name)' ]] + then for i in lib32 lib64 + do if [[ -d $(INSTALLROOT)/$i ]] + then echo ";physical;;$(INSTALLROOT)/$i" + fi + done + fi + $(package.src:U:T=F:C%^$(PACKAGEROOT)/%%:C%.*%echo ";;;$(PACKAGEROOT)/&;&"$("\n")%) + $(package.bin:U:T=F:C%^$(INSTALLROOT)/%%:C%.*%echo ";;;$(INSTALLROOT)/&;&"$("\n")%) + $(package.auxiliary.$(style):U:T=F:C%^$(INSTALLROOT)/%%:C%.*%echo ";;;$(INSTALLROOT)/&;&"$("\n")%) + if [[ '$(PACKAGEDIR:B)' == '$(style)' ]] + then echo $(name) $(version) $(release|version) 1 > $(PACKAGEGEN)/$(name).ver + echo ";;;$(PACKAGEGEN)/$(name).ver;$(PACKAGELIB)/$(name).ver" + if [[ '$(~covers)' ]] + then for i in $(~covers) + do for j in lic pkg + do if [[ -f $(PACKAGESRC)/$i.$j ]] + then echo ";;;$(PACKAGESRC)/$i.$j;$(PACKAGELIB)/$i.$j" + fi + done + for j in ver req + do if [[ -f $(PACKAGEGEN)/$i.$j ]] + then echo ";;;$(PACKAGEGEN)/$i.$j;$(PACKAGELIB)/$i.$j" + fi + done + done + for i in $(~covers:D=$(PACKAGESRC):B:S=.lic:T=F:T=I:N=*.def:D=$(PACKAGESRC):B:S:T=F:B:S) + do echo ";;;$(PACKAGESRC)/$i;$(PACKAGELIB)/$i" + done + fi + sed 's,1$,0,' $(~req:D=$(PACKAGEGEN):B:S=.ver:T=F) < /dev/null > $(PACKAGEGEN)/$(name).req + echo ";;;$(PACKAGEGEN)/$(name).req;$(PACKAGELIB)/$(name).req" + { + echo "name='$(name)'" + echo "index='$(index)'" + echo "covers='$(~covers)'" + echo "requires='$(~req)'" + } > $(PACKAGEGEN)/$(name).inx + { + { + echo '$($(name).README)' + if [[ '$(~covers)' ]] + then echo "This package is a superset of the following package$(~covers:O=2:?s??): $(~covers); you won't need $(~covers:O=2:?these?this?) if you download $(name)." + fi + if [[ '$(~requires)' ]] + then echo 'It requires the following package$(~requires:O=2:?s??): $(~requires).' + fi + } | fmt + package help binary + package release $(name) + } > $(PACKAGEGEN)/$(name).README + echo ";;;$(PACKAGEGEN)/$(name).README;$(PACKAGELIB)/$(name).README" + fi + set -- $(package.closure) + for i + do cd $(INSTALLROOT)/$i + $(MAKE) --noexec $(-) --variants=$(variants:Q) $(=) package.strip=$(strip) recurse list.package.$(type) package.license.class=$(license:Q) cc- + done + } | + { + : > $tmp/HEAD + [[ '$(notice)' ]] && echo ";;;$tmp/HEAD;$(package.notice)" + cat > $tmp/README <<'!' + $(package.readme) + ! + echo ";;;$tmp/README;README" + sort -t';' -k5,5 -u + : > $tmp/TAIL + [[ '$(notice)' ]] && echo ";;;$tmp/TAIL;$(package.notice)" + } | + $(PAX) --filter=- \ + --to=ascii \ + $(op:N=delta:??--format=$(format)?) \ + --local \ + --checksum=md5:$(PACKAGEGEN)/$(name).sum \ + --install=$(PACKAGEGEN)/$(name).ins \ + -wvf $(binary) $(base) \ + $(op:N=delta:?--format=gzip??) \ + -s",^$tmp/,$(INSTALLOFFSET)/," \ + $(PACKAGEROOT:C%.*%-s",^&/,,"%) + echo $(binary) >> $(binary:D:B=PACKAGE:S=.$(CC.HOSTTYPE).lst) + $(SUM) -x $(checksum) < $(binary) > $(binary:D:B:S=.$(checksum)) + echo $(binary:D:B:S=.$(checksum)) >> $(binary:D:B=PACKAGE:S=.$(CC.HOSTTYPE).lst) + echo local > $(binary:D:B=$(name):S=.$(CC.HOSTTYPE).tim) + if [[ '$(incremental)' == 1 && '$(old.binary)' ]] + then $(PAX) -rf $(binary) -wvf $(old.new.binary) -z $(old.binary) + echo $(old.new.binary) >> $(binary:D:B=PACKAGE:S=.$(CC.HOSTTYPE).lst) + $(SUM) -x $(checksum) < $(old.new.binary) > $(old.new.binary:D:B:S=.$(checksum)) + echo $(old.new.binary:D:B:S=.$(checksum)) >> $(binary:D:B=PACKAGE:S=.$(CC.HOSTTYPE).lst) + fi + rm -rf $tmp + else if [[ '$(binary.$(name))' ]] + then exe=$(binary.$(name)) + else exe=$(INSTALLROOT)/bin/$(name) + fi + if [[ '$(old.binary)' ]] && $(CMP) $(CMPFLAGS) $exe $(binary) + then : $(name) is up to date + else echo $(name) $(version) $(release|version) 1 > $(PACKAGEGEN)/$(name).ver + : > $(PACKAGEGEN)/$(name).req + { + echo "name='$(name)'" + echo "index='$(index)'" + echo "covers='$(~covers)'" + echo "requires='$(~req)'" + } > $(PACKAGEGEN)/$(name).inx + { + echo '$($(name).README)' + package help binary + } > $(PACKAGEGEN)/$(name).README + case "$(binary)" in + *.gz) gzip < $exe > $(binary) ;; + *) cp $exe $(binary) ;; + esac + $(SUM) -x $(checksum) < $(binary) > $(binary:D:B:S=.$(checksum)) + echo local > $(binary:D:B=$(name):S=.$(CC.HOSTTYPE).tim) + fi + echo $(binary) >> $(binary:D:B=PACKAGE:S=.$(CC.HOSTTYPE).lst) + echo $(binary:D:B:S=.$(checksum)) >> $(binary:D:B=PACKAGE:S=.$(CC.HOSTTYPE).lst) + fi + +runtime : .runtime.init .runtime.gen .runtime.$$(style) + +.runtime.init : .MAKE + local A B D I P V + type := runtime + if ! "$(incremental)" + incremental = 0 + end + if ! "$(~$(name))" + if name == "ratz" + suffix = exe + else + suffix = gz + end + end + : $(.init.$(style)) : + : $(details.$(style):V:R) : + A := $(runtime.list) + B := $(A:N=*.$(stamp).$(CC.HOSTTYPE).$(suffix):N!=*.$(stamp).$(stamp).*:O=1:T=F) + P := $(A:N=*.$(stamp).$(CC.HOSTTYPE).$(suffix):N!=*.$(stamp).$(stamp).*:O=2:T=F) + D := $(A:N=*.$(stamp).$(stamp).$(CC.HOSTTYPE).$(suffix):O=1:T=F) + if op == "delta" + if ! B + error 3 delta requires a base archive + end + base := -z $(B) + if "$(release)" != "$(stamp)" + release := $("":T=R%Y-%m-%d) + end + runtime := $(B:/$(CC.HOSTTYPE).$(suffix)$/$(release).&/) + version := $(runtime:B:B:/$(name).//) + elif B || op == "base" + if op == "base" + for I $(B) $(P) + V := $(I:B:/$(name)-run\.\([^.]*\).*/\1/) + if V == "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]" && V != "$(version)" + old.version := $(V) + old.runtime := $(I) + if "$(old.version)" >= "$(version)" + error 3 $(name): previous base $(old.version) is newer than $(version) + end + break + end + end + else + runtime := $(B) + end + if B == "$(runtime)" + if "$(B:D:B)" == "$(D:D:B)" && "$(B:S)" != "$(D:S)" + error 3 $(B:B:S): base overwrite would invalidate delta $(D:B:S) + end + error 1 $(B:B:S): replacing current base + end + version := $(runtime:B:/$(name)-run.//:/\..*//) + end + PACKAGEGEN := $(PACKAGESRC)/gen + +.runtime.gen : $$(PACKAGEDIR) $$(PACKAGEGEN) + +.runtime.cyg .runtime.exp .runtime.lcl .runtime.pkg .runtime.rpm : .MAKE + error 3 $(style): runtime package style not supported yet + +.runtime.tgz : + if [[ '$(~$(name))' ]] + then tmp=/tmp/pkg$(tmp) + mkdir $tmp + { + if [[ '$(init)' == '$(name)' ]] + then for i in lib32 lib64 + do if [[ -d $(INSTALLROOT)/$i ]] + then echo ";physical;;$(INSTALLROOT)/$i" + fi + done + fi + $(package.src:U:T=F:C%^$(PACKAGEROOT)/%%:C%.*%echo ";;;$(PACKAGEROOT)/&;&"$("\n")%) + $(package.bin:U:T=F:C%^$(INSTALLROOT)/%%:C%.*%echo ";;;$(INSTALLROOT)/&;&"$("\n")%) + $(package.auxiliary.$(style):U:T=F:C%^$(INSTALLROOT)/%%:C%.*%echo ";;;$(INSTALLROOT)/&;&"$("\n")%) + echo $(name) $(version) $(release|version) 1 > $(PACKAGEGEN)/$(name).ver + echo ";;;$(PACKAGEGEN)/$(name).ver;$(PACKAGELIB)/$(name).ver" + if [[ '$(~covers)' ]] + then for i in $(~covers) + do for j in lic pkg + do if [[ -f $(PACKAGESRC)/$i.$j ]] + then echo ";;;$(PACKAGESRC)/$i.$j;$(PACKAGELIB)/$i.$j" + fi + done + for j in ver req + do if [[ -f $(PACKAGEGEN)/$i.$j ]] + then echo ";;;$(PACKAGEGEN)/$i.$j;$(PACKAGELIB)/$i.$j" + fi + done + done + for i in $(~covers:D=$(PACKAGESRC):B:S=.lic:T=F:T=I:N=*.def:D=$(PACKAGESRC):B:S:T=F:B:S) + do echo ";;;$(PACKAGESRC)/$i;$(PACKAGELIB)/$i" + done + fi + sed 's,1$,0,' $(~req:D=$(PACKAGEGEN):B:S=.ver:T=F) < /dev/null > $(PACKAGEGEN)/$(name).req + echo ";;;$(PACKAGEGEN)/$(name).req;$(PACKAGELIB)/$(name).req" + { + echo "name='$(name)'" + echo "index='$(index)'" + echo "covers='$(~covers)'" + echo "requires='$(~req)'" + } > $(PACKAGEGEN)/$(name).inx + { + { + echo '$($(name).README)' + if [[ '$(~covers)' ]] + then echo + echo "This package is a superset of the following package$(~covers:O=2:?s??): $(~covers); you won't need $(~covers:O=2:?these?this?) if you download $(name)." + fi + if [[ '$(~requires)' ]] + then echo + echo 'It requires the following package$(~requires:O=2:?s??): $(~requires).' + fi + echo + echo "To install this $(type) package read the tarball into a directory" + echo "suitable for containing bin and lib subdirectories, and run the" + echo "$(PACKAGELIB)/gen/$(name)-run.ins script to fix up permissions." + echo + echo "To use the package export the bin directory in PATH. The commands and" + echo "libraries use \$PATH to locate dynamic libraries and related data files." + echo + } | fmt + } > $(PACKAGEGEN)/$(name)-run.README + echo ";;;$(PACKAGEGEN)/$(name)-run.README;$(PACKAGELIB)/$(name)-run.README" + set -- $(package.closure) + for i + do cd $(INSTALLROOT)/$i + $(MAKE) --noexec $(-) --variants=$(variants:Q) $(=) package.strip=$(strip) recurse list.package.$(type) package.license.class=$(license:Q) cc- + done + } | + { + : > $tmp/HEAD + [[ '$(notice)' ]] && echo ";;;$tmp/HEAD;$(package.notice)" + cat > $tmp/README <<'!' + $(package.readme) + ! + echo ";;;$tmp/README;README" + sort -t';' -k5,5 -u + : > $tmp/TAIL + [[ '$(notice)' ]] && echo ";;;$tmp/TAIL;$(package.notice)" + } | + $(PAX) --filter=- \ + --to=ascii \ + $(op:N=delta:??--format=$(format)?) \ + --local \ + --checksum=md5:$(PACKAGEGEN)/$(name)-run.sum \ + --install=$(PACKAGEGEN)/$(name)-run.ins \ + -wvf $(runtime) $(base) \ + $(op:N=delta:?--format=gzip??) \ + -s",^$tmp/,$(INSTALLOFFSET)/," \ + $(PACKAGEROOT:C%.*%-s",^&/,,"%) + echo $(runtime) >> $(runtime:D:B=PACKAGE:S=.$(CC.HOSTTYPE).lst) + $(SUM) -x $(checksum) < $(runtime) > $(runtime:D:B:S=.$(checksum)) + echo $(runtime:D:B:S=.$(checksum)) >> $(runtime:D:B=PACKAGE:S=.$(CC.HOSTTYPE).lst) + echo local > $(runtime:D:B=$(name)-run:S=.$(CC.HOSTTYPE).tim) + if [[ '$(incremental)' == 1 && '$(old.runtime)' ]] + then $(PAX) -rf $(runtime) -wvf $(old.new.runtime) -z $(old.runtime) + echo $(old.new.runtime) >> $(runtime:D:B=PACKAGE:S=.$(CC.HOSTTYPE).lst) + $(SUM) -x $(checksum) < $(old.new.runtime) > $(old.new.runtime:D:B:S=.$(checksum)) + echo $(old.new.runtime:D:B:S=.$(checksum)) >> $(runtime:D:B=PACKAGE:S=.$(CC.HOSTTYPE).lst) + fi + rm -rf $tmp + fi + +list.installed list.manifest : + set -- $(package.closure) + for i + do cd $(INSTALLROOT)/$i + ignore $(MAKE) --noexec $(-) $(=) $(<) + done |