1*b30d1939SAndy Fiddaman/*
2*b30d1939SAndy Fiddaman * {automake|configure} => {nmake|iffe} conversion support
3*b30d1939SAndy Fiddaman *
4*b30d1939SAndy Fiddaman * The first command line target overrides the default original source
5*b30d1939SAndy Fiddaman * directory name $(MAKEFILE:D). The hard work is in the makefile using
6*b30d1939SAndy Fiddaman * these assertions, since it must (manually) provide the nmake makefiles
7*b30d1939SAndy Fiddaman * and config equivalent iffe scripts. The conversion makefile is typically
8*b30d1939SAndy Fiddaman * named lib/package/PACKAGE.cvt in an ast package $PACKAGEROOT directory,
9*b30d1939SAndy Fiddaman * and the conversion is run from the $PACKAGEROOT directory, e.g.:
10*b30d1939SAndy Fiddaman *
11*b30d1939SAndy Fiddaman *	nmake -I lib/package -f PACKAGE-VERSION/PACKAGE.cvt
12*b30d1939SAndy Fiddaman *
13*b30d1939SAndy Fiddaman * The conversion requires the ast nmake, pax and tw commands.
14*b30d1939SAndy Fiddaman *
15*b30d1939SAndy Fiddaman * After the conversion you will be liberated from ./configure, *.in,
16*b30d1939SAndy Fiddaman * *.am, automake, autom4te, libtool, make depend, and makefile
17*b30d1939SAndy Fiddaman * recursion ordering. You can build from $PACKAGEROOT using the ast
18*b30d1939SAndy Fiddaman * package(1) (which sets up the { HOSTTYPE PATH VPATH } environment):
19*b30d1939SAndy Fiddaman *
20*b30d1939SAndy Fiddaman *	package make
21*b30d1939SAndy Fiddaman *
22*b30d1939SAndy Fiddaman * or cd into any arch/$HOSTTYPE/src subdirectory and rebuild that portion
23*b30d1939SAndy Fiddaman * of the hierarchy with the ast nmake(1) (after setting PATH and VPATH):
24*b30d1939SAndy Fiddaman *
25*b30d1939SAndy Fiddaman *	nmake
26*b30d1939SAndy Fiddaman *
27*b30d1939SAndy Fiddaman * The conversion assertions are:
28*b30d1939SAndy Fiddaman *
29*b30d1939SAndy Fiddaman *	package :CONVERT: file ...
30*b30d1939SAndy Fiddaman *
31*b30d1939SAndy Fiddaman *	    files in the original source directory are copied
32*b30d1939SAndy Fiddaman *	    and converted into the ./src and ./lib subdirectories
33*b30d1939SAndy Fiddaman *	    the default original source directory is ./original
34*b30d1939SAndy Fiddaman *
35*b30d1939SAndy Fiddaman *		package	package name
36*b30d1939SAndy Fiddaman *		file	original source file that must exist
37*b30d1939SAndy Fiddaman *
38*b30d1939SAndy Fiddaman *	:OMIT: pattern
39*b30d1939SAndy Fiddaman *
40*b30d1939SAndy Fiddaman *	    files matching pattern are not copied into the converted
41*b30d1939SAndy Fiddaman *	    directory
42*b30d1939SAndy Fiddaman *
43*b30d1939SAndy Fiddaman *		pattern	ksh pattern of files to omit
44*b30d1939SAndy Fiddaman *
45*b30d1939SAndy Fiddaman *	:COPY: from to [ file ... ]
46*b30d1939SAndy Fiddaman *
47*b30d1939SAndy Fiddaman *	    files in the from directory are copied to the to directory
48*b30d1939SAndy Fiddaman *	    the action may contain :MOVE: exceptions to the copy
49*b30d1939SAndy Fiddaman *
50*b30d1939SAndy Fiddaman *		from	original directory subdirectory
51*b30d1939SAndy Fiddaman *			  . names the original directory
52*b30d1939SAndy Fiddaman *			 .. names the
53*b30d1939SAndy Fiddaman *		to	converted subdirectory
54*b30d1939SAndy Fiddaman *			  libNAME => src/lib/libNAME
55*b30d1939SAndy Fiddaman *			     NAME => src/cmd/NAME
56*b30d1939SAndy Fiddaman *		file	files or files in subdirectories to be copied;
57*b30d1939SAndy Fiddaman *			explicit files are copied to the to directory;
58*b30d1939SAndy Fiddaman *			if no files are specified then the from hierarchy
59*b30d1939SAndy Fiddaman *			is recursively copied to the converted directory
60*b30d1939SAndy Fiddaman *
61*b30d1939SAndy Fiddaman *	:MOVE: to file ...
62*b30d1939SAndy Fiddaman *
63*b30d1939SAndy Fiddaman *	    :COPY: assertion exceptions placed in the assertion's action
64*b30d1939SAndy Fiddaman *
65*b30d1939SAndy Fiddaman *		to	files or subdirectory files are copied to this directory
66*b30d1939SAndy Fiddaman *		file	file or files in subdirectories to be copied
67*b30d1939SAndy Fiddaman *
68*b30d1939SAndy Fiddaman *	:FILE: to file <<!
69*b30d1939SAndy Fiddaman *	contents
70*b30d1939SAndy Fiddaman *	!
71*b30d1939SAndy Fiddaman *
72*b30d1939SAndy Fiddaman *	    the :FILE: action is copied to the named file in the to directory
73*b30d1939SAndy Fiddaman *	    the :FILE: action is usually specified using the here syntax to
74*b30d1939SAndy Fiddaman *	    avoid make comment, quote and variable expansion
75*b30d1939SAndy Fiddaman *
76*b30d1939SAndy Fiddaman *	:EDIT: to file ... | - pattern <<!
77*b30d1939SAndy Fiddaman *	edit script
78*b30d1939SAndy Fiddaman *	!
79*b30d1939SAndy Fiddaman *
80*b30d1939SAndy Fiddaman *	    the :EDIT: action is an ed(1) script applied to each file in the
81*b30d1939SAndy Fiddaman *	    to directory after it has been copied from the original source
82*b30d1939SAndy Fiddaman *	    directory; if to is - then the :EDIT: action is a sed(1) script
83*b30d1939SAndy Fiddaman *	    that is applied to all files matching the file pattern during the
84*b30d1939SAndy Fiddaman *	    copy from the original source directory; a file may be subject to
85*b30d1939SAndy Fiddaman *	    both a sed(1) and ed(1) :EDIT:; the :EDIT: action is usually
86*b30d1939SAndy Fiddaman *	    specified using the here syntax to avoid make comment, quote and
87*b30d1939SAndy Fiddaman *	    variable expansion
88*b30d1939SAndy Fiddaman */
89*b30d1939SAndy Fiddaman
90*b30d1939SAndy Fiddaman.CONVERT.ID. = "@(#)$Id: CONVERT (AT&T Research) 2004-03-19 $"
91*b30d1939SAndy Fiddaman
92*b30d1939SAndy Fiddamanset nojobs noscan nowriteobject writestate=$$(MAKEFILE).ms
93*b30d1939SAndy Fiddaman
94*b30d1939SAndy Fiddamanpackage = $(PWD:B)
95*b30d1939SAndy Fiddamanhere = !-=-=-=-=-!
96*b30d1939SAndy Fiddamanhierarchy = src src/cmd src/lib
97*b30d1939SAndy Fiddamanomit = .*|*.?(l)[ao]
98*b30d1939SAndy Fiddamanoriginal = $(MAKEFILE:D)
99*b30d1939SAndy Fiddamanshowedit = $(-debug:?p??)
100*b30d1939SAndy Fiddaman
101*b30d1939SAndy FiddamanCPFLAGS = -u
102*b30d1939SAndy FiddamanPAXFLAGS = -u -v
103*b30d1939SAndy FiddamanSTDEDFLAGS = -
104*b30d1939SAndy FiddamanTW = tw
105*b30d1939SAndy FiddamanTWFLAGS = -CP
106*b30d1939SAndy Fiddaman
107*b30d1939SAndy Fiddamanall  : .VIRTUAL file
108*b30d1939SAndy Fiddamanfile : .VIRTUAL edit
109*b30d1939SAndy Fiddamanedit : .VIRTUAL copy
110*b30d1939SAndy Fiddamancopy : .VIRTUAL init
111*b30d1939SAndy Fiddamaninit : .VIRTUAL
112*b30d1939SAndy Fiddaman
113*b30d1939SAndy Fiddaman.MAKEINIT : .cvt.init
114*b30d1939SAndy Fiddaman
115*b30d1939SAndy Fiddaman.cvt.init : .MAKE .VIRTUAL .FORCE
116*b30d1939SAndy Fiddaman	local D
117*b30d1939SAndy Fiddaman	if D = "$(~.ARGS:O=1)"
118*b30d1939SAndy Fiddaman		if "$(D:T>FD)"
119*b30d1939SAndy Fiddaman			original := $(D)
120*b30d1939SAndy Fiddaman			.ARGS : .CLEAR $(~.ARGS:O>1)
121*b30d1939SAndy Fiddaman		end
122*b30d1939SAndy Fiddaman	end
123*b30d1939SAndy Fiddaman
124*b30d1939SAndy Fiddaman.cvt.filter =
125*b30d1939SAndy Fiddaman.cvt.package =
126*b30d1939SAndy Fiddaman
127*b30d1939SAndy Fiddaman.cvt.atom : .FUNCTION
128*b30d1939SAndy Fiddaman	local N V
129*b30d1939SAndy Fiddaman	V := $(%:O=1)
130*b30d1939SAndy Fiddaman	let .cvt.$(V) = .cvt.$(V) + 1
131*b30d1939SAndy Fiddaman	return .cvt.$(V).$(.cvt.$(V))
132*b30d1939SAndy Fiddaman
133*b30d1939SAndy Fiddaman.cvt.omit : .FUNCTION
134*b30d1939SAndy Fiddaman	return -s',^\(\(?K)?(*/)($(omit))?(/*))$,,$(showedit)'
135*b30d1939SAndy Fiddaman
136*b30d1939SAndy Fiddaman.cvt.to : .FUNCTION
137*b30d1939SAndy Fiddaman	if "$(%)" == "."
138*b30d1939SAndy Fiddaman		return src
139*b30d1939SAndy Fiddaman	end
140*b30d1939SAndy Fiddaman	if "$(%)" == "*/*"
141*b30d1939SAndy Fiddaman		return src/$(%)
142*b30d1939SAndy Fiddaman	end
143*b30d1939SAndy Fiddaman	if "$(%)" == "lib*"
144*b30d1939SAndy Fiddaman		return src/lib/$(%)
145*b30d1939SAndy Fiddaman	end
146*b30d1939SAndy Fiddaman	return src/cmd/$(%)
147*b30d1939SAndy Fiddaman
148*b30d1939SAndy Fiddaman":CONVERT:" : .MAKE .OPERATOR
149*b30d1939SAndy Fiddaman	local I
150*b30d1939SAndy Fiddaman	package := $(<)
151*b30d1939SAndy Fiddaman	I := $(hierarchy:C,$,/Makefile)
152*b30d1939SAndy Fiddaman	init : .cvt.verify $(I)
153*b30d1939SAndy Fiddaman	$(I) : .ACCEPT
154*b30d1939SAndy Fiddaman		test -d $(<:D) || $(MKDIR) -p $(<:D)
155*b30d1939SAndy Fiddaman		echo :MAKE: > $(<)
156*b30d1939SAndy Fiddaman	.cvt.verify : .MAKE .FORCE .REPEAT
157*b30d1939SAndy Fiddaman		local I
158*b30d1939SAndy Fiddaman		if I = "$(.cvt.package:T!=F)"
159*b30d1939SAndy Fiddaman			error 3 $(original): not a $(package) source directory: missing $(I)
160*b30d1939SAndy Fiddaman		end
161*b30d1939SAndy Fiddaman	.cvt.package := $(>:C,^,$$(original)/,)
162*b30d1939SAndy Fiddaman
163*b30d1939SAndy Fiddaman":COPY:" : .MAKE .OPERATOR
164*b30d1939SAndy Fiddaman	local F T I A
165*b30d1939SAndy Fiddaman	F := $(>:O=1)
166*b30d1939SAndy Fiddaman	T := $(.cvt.to $(>:O=2))
167*b30d1939SAndy Fiddaman	A := $(.cvt.atom copy)
168*b30d1939SAndy Fiddaman	copy : $(A)
169*b30d1939SAndy Fiddaman	$(A) : .VIRTUAL
170*b30d1939SAndy Fiddaman	if F == "."
171*b30d1939SAndy Fiddaman		$(A) : $(T)
172*b30d1939SAndy Fiddaman		$(T) :
173*b30d1939SAndy Fiddaman			test -d $(<) || $(MKDIR) -p $(<)
174*b30d1939SAndy Fiddaman		for I $(>:O>2)
175*b30d1939SAndy Fiddaman			eval
176*b30d1939SAndy Fiddaman			$$(A) : $(I:D=$(T):B:S)
177*b30d1939SAndy Fiddaman			$(I:D=$(T):B:S) : $$(original)/$(I)
178*b30d1939SAndy Fiddaman				$$(CP) $$(CPFLAGS) $$(*) $$(<)
179*b30d1939SAndy Fiddaman			end
180*b30d1939SAndy Fiddaman		end
181*b30d1939SAndy Fiddaman	elif "$(F:T=FF)" || "$(F:N=*.(pax|t[bg]z))"
182*b30d1939SAndy Fiddaman		eval
183*b30d1939SAndy Fiddaman		$$(A) : $$(F)
184*b30d1939SAndy Fiddaman			test -d $(T) || $$(MKDIR) -p $(T)
185*b30d1939SAndy Fiddaman			cd $(T)
186*b30d1939SAndy Fiddaman			$$(PAX) $$(PAXFLAGS) -rf $$(*:P=A) -s ',^$(>:O=2)/*,,' $(.cvt.omit) $(.cvt.filter)
187*b30d1939SAndy Fiddaman		end
188*b30d1939SAndy Fiddaman	else
189*b30d1939SAndy Fiddaman		F := $$(original)/$(F)
190*b30d1939SAndy Fiddaman		if ! "$(@:V)"
191*b30d1939SAndy Fiddaman			eval
192*b30d1939SAndy Fiddaman			$$(A) : .FORCE
193*b30d1939SAndy Fiddaman				test -d $(T) || $$(MKDIR) -p $(T)
194*b30d1939SAndy Fiddaman				cd $(F:V)
195*b30d1939SAndy Fiddaman				$$(TW) $$(TWFLAGS) | $$(PAX) $$(PAXFLAGS) -rw $(.cvt.omit) $(.cvt.filter) $(T:P=A)
196*b30d1939SAndy Fiddaman			end
197*b30d1939SAndy Fiddaman		else
198*b30d1939SAndy Fiddaman			.cvt.move =
199*b30d1939SAndy Fiddaman			: $(@:V:@R)
200*b30d1939SAndy Fiddaman			eval
201*b30d1939SAndy Fiddaman			$$(A) : .FORCE
202*b30d1939SAndy Fiddaman				test -d $(T) || $$(MKDIR) -p $(T)
203*b30d1939SAndy Fiddaman				cd $(F:V)
204*b30d1939SAndy Fiddaman				$$(TW) $$(TWFLAGS) | $$(PAX) $$(PAXFLAGS) -rw $(.cvt.omit) $(.cvt.move) $(.cvt.filter) $(T:P=A)
205*b30d1939SAndy Fiddaman			end
206*b30d1939SAndy Fiddaman		end
207*b30d1939SAndy Fiddaman	end
208*b30d1939SAndy Fiddaman
209*b30d1939SAndy Fiddaman":EDIT:" : .MAKE .OPERATOR
210*b30d1939SAndy Fiddaman	local A D F
211*b30d1939SAndy Fiddaman	D := $(>:O=1)
212*b30d1939SAndy Fiddaman	if D == "-"
213*b30d1939SAndy Fiddaman		A := ^$(>:O=2)^$$(SED) -e $(@:Q:/'\n'/ -e /G)
214*b30d1939SAndy Fiddaman		.cvt.filter += --action=$(A:@Q)
215*b30d1939SAndy Fiddaman	else
216*b30d1939SAndy Fiddaman		D := $(.cvt.to $(D))
217*b30d1939SAndy Fiddaman		F := $(>:O>1:C,^,$(D)/,)
218*b30d1939SAndy Fiddaman		edit : $(F)
219*b30d1939SAndy Fiddaman		eval
220*b30d1939SAndy Fiddaman		$$(F) :
221*b30d1939SAndy Fiddaman			$$(STDED) $$(STDEDFLAGS) $$(<) <<'$(here)'
222*b30d1939SAndy Fiddaman			$(@:V)
223*b30d1939SAndy Fiddaman			w
224*b30d1939SAndy Fiddaman			q
225*b30d1939SAndy Fiddaman			$(here)
226*b30d1939SAndy Fiddaman		end
227*b30d1939SAndy Fiddaman	end
228*b30d1939SAndy Fiddaman
229*b30d1939SAndy Fiddaman":FILE:" : .MAKE .OPERATOR
230*b30d1939SAndy Fiddaman	local ( D F ) $(>)
231*b30d1939SAndy Fiddaman	local A
232*b30d1939SAndy Fiddaman	A := $(.cvt.atom file)
233*b30d1939SAndy Fiddaman	$(A) := $(@:V)
234*b30d1939SAndy Fiddaman	D := $(.cvt.to $(D))
235*b30d1939SAndy Fiddaman	file : $(D)/$(F)
236*b30d1939SAndy Fiddaman	eval
237*b30d1939SAndy Fiddaman	$$(D)/$$(F) :
238*b30d1939SAndy Fiddaman		test -d $$(<:D) || $$(MKDIR) -p $$(<:D)
239*b30d1939SAndy Fiddaman		cat > $$(<) <<'$(here)'
240*b30d1939SAndy Fiddaman		$$($(A):V)
241*b30d1939SAndy Fiddaman		$(here)
242*b30d1939SAndy Fiddaman	end
243*b30d1939SAndy Fiddaman
244*b30d1939SAndy Fiddaman":MOVE:" : .MAKE .OPERATOR
245*b30d1939SAndy Fiddaman	local T I
246*b30d1939SAndy Fiddaman	T := ../../../$(.cvt.to $(>:O=1))
247*b30d1939SAndy Fiddaman	for I $(>:O>1)
248*b30d1939SAndy Fiddaman		if I == "*/"
249*b30d1939SAndy Fiddaman			.cvt.move += -s',^\(\(?K)$(I)),$(T)/,$(showedit)'
250*b30d1939SAndy Fiddaman			.cvt.move += -s',^\(\(?K)$(I:C%/$%%))$,,$(showedit)'
251*b30d1939SAndy Fiddaman		else
252*b30d1939SAndy Fiddaman			.cvt.move += -s',^\(\(?K)$(I))$,$(T)/$(I:B:S),$(showedit)'
253*b30d1939SAndy Fiddaman		end
254*b30d1939SAndy Fiddaman	end
255*b30d1939SAndy Fiddaman
256*b30d1939SAndy Fiddaman":OMIT:" : .MAKE .OPERATOR
257*b30d1939SAndy Fiddaman	local P
258*b30d1939SAndy Fiddaman	for P $(>)
259*b30d1939SAndy Fiddaman		omit := $(omit)|$(P)
260*b30d1939SAndy Fiddaman	end
261