parselist.awk revision 1.2 1 # $NetBSD: parselist.awk,v 1.2 2002/02/05 23:16:51 lukem Exp $
2 #
3 # Copyright (c) 2002 The NetBSD Foundation, Inc.
4 # All rights reserved.
5 #
6 # This code is derived from software contributed to The NetBSD Foundation
7 # by Luke Mewburn of Wasabi Systems.
8 #
9 # Redistribution and use in source and binary forms, with or without
10 # modification, are permitted provided that the following conditions
11 # are met:
12 # 1. Redistributions of source code must retain the above copyright
13 # notice, this list of conditions and the following disclaimer.
14 # 2. Redistributions in binary form must reproduce the above copyright
15 # notice, this list of conditions and the following disclaimer in the
16 # documentation and/or other materials provided with the distribution.
17 # 3. All advertising materials mentioning features or use of this software
18 # must display the following acknowledgement:
19 # This product includes software developed by the NetBSD
20 # Foundation, Inc. and its contributors.
21 # 4. Neither the name of The NetBSD Foundation nor the names of its
22 # contributors may be used to endorse or promote products derived
23 # from this software without specific prior written permission.
24 #
25 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
26 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
29 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 # POSSIBILITY OF SUCH DAMAGE.
36 #
37 # awk -f parselist.awk -v mode=MODE file1 [...]
38 #
39 # Parse list files file1 [...], generating different output,
40 # depending upon the setting of MODE:
41 # crunch crunchgen(1) config
42 # mtree mtree(8) specfile
43 # populate sh(1) commands to populate ${TARGDIR} from ${CURDIR}
44 #
45 # Each line of the input is either a comment (starts with `#'),
46 # or contains one of the following keywords and arguments.
47 # In general, keywords in lowercase are crunchgen(1) keywords which
48 # might be also supported for the other operations.
49 #
50 # mode key operation
51 # -------- ---------
52 # C crunch
53 # M mtree
54 # P populate
55 #
56 # mode keyword arg1 [...] description
57 # ---- ------------------ -----------
58 #
59 # C ARGVLN prog link as per crunchgen(1) `ln'
60 #
61 # P CMD arg1 [...] run CMD as a shell command
62 #
63 # M P COPY src dest copy src to dest
64 #
65 # C LIBS libspec ... as per crunchgen(1) `libs'
66 #
67 # M P LINK src d1 [d2 ...] hard link src to d1, d2, ...
68 #
69 # C M P PROG prog [links...] program(s) to crunch/mtree/populate.
70 # for M and P, the first prog listed
71 # is copied from ${OBJDIR}/${CRUNCHBIN}
72 # and then used as the name to link
73 # all other PROG entries to.
74 #
75 # C SPECIAL prog cmd ... as per crunchgen(1) `special'
76 #
77 # C SRCDIRS dirname ... as per crunchgen(1) `srcdirs'
78 #
79 # M P SYMLINK src dest [...] symlink src to dest, [...]
80 #
81
82 BEGIN \
83 {
84 crunchprog = "";
85
86 if (mode != "crunch" && mode != "mtree" && mode != "populate") {
87 printf("Unknown parselist mode '%s'\n", mode) > "/dev/stderr";
88 exit 1;
89 }
90 print "#";
91 print "# This file is automatically generated by";
92 print "#\tparselist mode=" mode;
93 print "#";
94 print "";
95 if (mode == "populate") {
96 print "checkvarisset()";
97 print "{";
98 print " eval _v=\\$${1}";
99 print " if [ -z \"$_v\" ]; then";
100 print " echo 1>&2 \"Error: $1 is not defined\"";
101 print " exit 1";
102 print " fi";
103 print "}";
104 print;
105 print "checkvarisset CURDIR";
106 print "checkvarisset TARGDIR";
107 print "checkvarisset OBJDIR";
108 print "checkvarisset CRUNCHBIN";
109 print "cd ${CURDIR}";
110 print;
111 } else if (mode == "mtree") {
112 print "/unset\tall";
113 print "/set\ttype=file uname=root gname=wheel";
114 print;
115 }
116 }
117
118 /^$/ || /^#/ \
119 {
120 print;
121 next;
122 }
123
124 $1 == "COPY" \
125 {
126 if (mode == "populate" || mode == "mtree")
127 copy($2, $3);
128 next;
129 }
130
131 $1 == "LIBS" || $1 == "SPECIAL" || $1 == "SRCDIRS" \
132 {
133 if (mode == "crunch") {
134 $1 = tolower($1);
135 print;
136 }
137 next;
138 }
139
140 $1 == "PROG" \
141 {
142 if (mode == "crunch") {
143 prog = basename($2);
144 print "progs " prog;
145 for (i = 3; i <= NF; i++)
146 print "ln " prog " " basename($i);
147 } else {
148 for (i = 2; i <= NF; i++) {
149 if (crunchprog == "") {
150 crunchprog = $i;
151 copy("${OBJDIR}/${CRUNCHBIN}", crunchprog);
152 continue;
153 }
154 link(crunchprog, $i);
155 }
156 }
157 next;
158 }
159
160 $1 == "ARGVLN" \
161 {
162 if (mode == "crunch") {
163 $1 = "ln";
164 print;
165 }
166 next;
167 }
168
169 $1 == "LINK" \
170 {
171 if (mode == "populate" || mode == "mtree") {
172 for (i = 3; i <= NF; i++)
173 link($2, $i);
174 }
175 next;
176 }
177
178 $1 == "SYMLINK" \
179 {
180 if (mode == "populate" || mode == "mtree") {
181 for (i = 3; i <= NF; i++)
182 symlink($2, $i);
183 }
184 next;
185 }
186
187 $1 == "CMD" \
188 {
189 if (mode == "populate") {
190 printf("(cd ${TARGDIR};");
191 for (i = 2; i <= NF; i++)
192 printf(" %s", $i);
193 print ")";
194 }
195 next;
196 }
197
198 {
199 printf("Unknown keyword '%s' at line %d of input.\n", $1, NR) \
200 >"/dev/stderr";
201 exit 1;
202 }
203
204
205 function basename (file) \
206 {
207 gsub(/[^\/]+\//, "", file);
208 return file;
209 }
210
211 function copy (src, dest) \
212 {
213 if (mode == "mtree") {
214 printf("./%s\n", dest);
215 } else {
216 printf("rm -rf ${TARGDIR}/%s\n", dest);
217 printf("cp %s ${TARGDIR}/%s\n", src, dest);
218 }
219 }
220
221 function link (src, dest) \
222 {
223 if (mode == "mtree") {
224 # XXX printf("./%s type=hlink link=%s\n", dest, src);
225 printf("./%s\n", dest);
226 } else {
227 printf("rm -rf ${TARGDIR}/%s\n", dest);
228 printf("(cd ${TARGDIR}; ln %s %s)\n", src, dest);
229 }
230 }
231
232 function symlink (src, dest) \
233 {
234 if (mode == "mtree") {
235 printf("./%s type=link link=%s\n", dest, src);
236 } else {
237 printf("rm -rf ${TARGDIR}/%s\n", dest);
238 printf("(cd ${TARGDIR}; ln -s %s %s)\n", src, dest);
239 }
240 }
241