xref: /plan9-contrib/sys/src/9/boot/mkboot (revision 97bff0f0e1d5ce249207d5d49a5123df8571cc39)
1#!/bin/rc
2#
3#  this file configures a boot program (/boot) for a kernel.
4#
5if(! ~ $#* 1){
6	echo usage: mkboot file >[1=2]
7	exit 1
8}
9
10cat <<'---'
11#include <u.h>
12#include <libc.h>
13#include "../boot/boot.h"
14
15Method	method[]={
16---
17
18#
19#  configure all remote methods, i.e. all methods in the 'boot' section
20#
21#  EXAMPLE
22#	boot
23#		incon
24#		9600
25#		19200
26#
27../port/mkextract boot 0 $* | awk '{
28	printf "	{ \""  "" $1 "\", "\
29	"config" $1 ", "\
30	"connect" $1 ", "
31	print fieldn(2) " },"
32	}
33
34	func fieldn(n,	s,i)
35	{
36		s = $0
37		while (n > 1) {
38			sub(/^[ \t]*/, "", s)
39			if (substr(s, 1, 1) == "\"") {
40				sub(/^"[^\"]*"/, "", s)
41			} else {
42				sub(/^[^ \t]*/, "", s)
43			}
44			n--
45		}
46		sub(/^[ \t]*/, "", s)
47		if (substr(s, 1, 1) == "\"") {
48			i = index(substr(s, 2), "\"")
49			if (i > 0)
50				return substr(s, 1, i+1)
51			else
52				return s
53		} else {
54			sub(/[ \t].*/, "", s)
55			return s
56		}
57	}'
58
59cat <<'---'
60	{ 0 },
61};
62---
63
64awk '
65	BEGIN	{ cpuflag = 0; bootprog = "boot"; bootdisk = "#S/sdC0/"; rootdir = "/root"; }
66	$0 ~ "^boot" && $2=="cpu"\
67		{ cpuflag = 1
68		  if(NF == 4 && $3 == "boot")
69			bootdisk = $4
70		}
71	$0 ~ "^boot" && $2=="rootdir" && NF==3\
72		{ rootdir = $3 }
73	$0 ~ "^boot" && ($2=="bboot" || $2=="romboot" || $2=="dosboot")\
74		{ cpuflag = 1;  bootprog = $2; }
75	$0 ~ "^boot" && $2=="boot" && NF==3\
76		{ bootdisk = $3 }
77	END 	{ print "int cpuflag = " cpuflag ";"
78		  print "char* rootdir = \"" rootdir "\";"
79		  print "char* bootdisk = \"" bootdisk "\";"
80		  print "extern void " bootprog "(int, char**);"
81		  print "void"
82		  print "main(int argc, char **argv)"
83		  print "{"
84		  print "\t" bootprog "(argc, argv);"
85		  print "}"
86		}
87' $1
88
89#
90#  configure in a cache file system if a
91# /386/bin/root appears in the bootdir section.
92#
93../port/mkextract bootdir 0 $* | awk '
94	BEGIN			{ cfs = 0 }
95	$1 ~ "bin/cfs$"	{ cfs = 1 }
96	END			{ if(cfs)
97					print "int (*cfs)(int) = cache;"
98				  else
99					print "int (*cfs)(int) = 0;"
100				}
101	'
102