summaryrefslogtreecommitdiff
path: root/scripts/embedded_scripts
blob: 205ac591a563e6125775cc355a77fd72b4bb7640 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/bin/sh

. ./.config || exit 1

target="$1"
custom_loc="$2"
applet_loc="$3"

test "$target" || exit 1
test "$SED" || SED=sed
test "$DD" || DD=dd

if [ x"$CONFIG_FEATURE_SH_EMBEDDED_SCRIPTS" != x"y" ]
then
	printf '#define NUM_SCRIPTS 0\n' >"$target"
	exit 0
fi

# Some people were bitten by their system lacking a (proper) od
od -v -b </dev/null >/dev/null
if test $? != 0; then
	echo 'od tool is not installed or cannot accept "-v -b" options'
	exit 1
fi

bzip2 </dev/null >/dev/null
if test $? != 0; then
	echo 'bzip2 is not installed'
	exit 1
fi

custom_scripts=""
if [ -d "$custom_loc" ]
then
	custom_scripts=$(cd $custom_loc; ls * 2>/dev/null)
fi
all_scripts=$($srctree/applets/busybox.mkscripts)

# all_scripts includes applet scripts and custom scripts, sort them out
applet_scripts=""
for i in $all_scripts
do
    found=0
	for j in $custom_scripts
	do
		if [ "$i" = "$j" ]
		then
			found=1
			break;
		fi
	done
	if [ $found -eq 0 ]
	then
		# anything that isn't a custom script is an applet script
		applet_scripts="$applet_scripts $i"
	fi
done

# we know the custom scripts are present but applet scripts might have
# become detached from their configuration
for i in $applet_scripts
do
	#if [ ! -f "$applet_loc/$i" -a ! -f "$custom_loc/$i" ]
	if [ ! -f "$applet_loc/$i" ]
	then
		echo "missing applet script $i"
		exit 1
	fi
done

n=$(echo $custom_scripts $applet_scripts | wc -w)
nall=$(echo $all_scripts | wc -w)

if [ $n -ne $nall ]
then
	echo "script mismatch $n != $nall"
	exit 1
fi

concatenate_scripts() {
	for i in $custom_scripts
	do
		cat $custom_loc/$i
		printf '\000'
	done
	for i in $applet_scripts
	do
		cat $applet_loc/$i
		printf '\000'
	done
}

exec >"$target.$$"

if [ $n -ne 0 ]
then
	printf '#ifdef DEFINE_SCRIPT_DATA\n'
	printf 'const uint16_t applet_numbers[] = {\n'
	for i in $custom_scripts $applet_scripts
	do
		# TODO support applets with names including invalid characters
		printf '\tAPPLET_NO_%s,\n' $i
	done
	printf '};\n'
	printf '#else\n'
	printf 'extern const uint16_t applet_numbers[];\n'
	printf '#endif\n'
fi

printf "\n"
printf '#define NUM_SCRIPTS %d\n' $n
printf "\n"

if [ $n -ne 0 ]
then
	printf '#define UNPACKED_SCRIPTS_LENGTH '
	concatenate_scripts | wc -c

	printf '#define PACKED_SCRIPTS \\\n'
	concatenate_scripts | bzip2 -1 | $DD bs=2 skip=1 2>/dev/null | \
	od -v -b \
	| grep -v '^ ' \
	| $SED -e 's/^[^ ]*//' \
		-e 's/ //g' \
		-e '/^$/d' \
		-e 's/\(...\)/0\1,/g' \
		-e 's/$/ \\/'
	printf '\n'
fi

mv -- "$target.$$" "$target"