mirror of
				git://git.code.sf.net/p/cdesktopenv/code
				synced 2025-03-09 15:50:02 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			1537 lines
		
	
	
	
		
			44 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			1537 lines
		
	
	
	
		
			44 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
| /*
 | |
|  * 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 ...
 | |
|  *	:REQUIRES: 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
 |