-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgen_mod_headers
More file actions
executable file
·221 lines (168 loc) · 5.67 KB
/
gen_mod_headers
File metadata and controls
executable file
·221 lines (168 loc) · 5.67 KB
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
#!/bin/bash
set -e; set -o pipefail
# Heavily based on PKGBUILD from
# https://www.archlinux.org/packages/core/x86_64/linux/
function error()
{
echo $(basename $0): $@ >&2
}
function fatal()
{
error $@
exit 1
}
function usage()
{
echo "usage: $(basename $0) [target dir] [linux source dir] [objects dir] <arch> <x-compile-prefix> <customcc>">&2
exit 1
}
# See http://stackoverflow.com/a/4774063
function get_full_path()
{
echo "$( cd "$1" ; pwd -P )"
}
function push()
{
pushd $@ >/dev/null
}
function push_linux()
{
push $linux_dir
}
function pop()
{
popd >/dev/null
}
function copy_dir()
{
from="$1"
to="$2"
if [[ -d "$from" ]]; then
cp -a "$from" "$to"
fi
}
function copy_mkdir()
{
local target_dir="$1"
local rel_path="$2"
mkdir -p "$target_dir/$(dirname $rel_path)"
cp "$rel_path" "$target_dir/$rel_path"
}
[[ $# -ge 3 ]] || usage
# Generate target dir if doesn't exist.
install -dm755 $1
target_dir=$(get_full_path $1)
linux_dir=$(get_full_path $2)
# The directory containing .config and Module.symvers.
obj_dir=$(get_full_path $3)
karch=${4:-x86}
prefix=$5
hostcc="${6:-${prefix}gcc}"
# FIXME: We assume host arch == x86.
if [[ "$karch" != "x86" ]]; then
[[ -n $prefix ]] || fatal "Non-x86 arch but no prefix specified."
fi
build_opts=""
# Regardless of target arch, if a prefix is specified we are cross-compiling.
[[ -z "$prefix" ]] || build_opts="ARCH=$karch CROSS_COMPILE=$prefix"
karch_dir="arch/$karch"
target_karch_dir="$target_dir/$karch_dir"
[[ -f "${obj_dir}/.config" ]] || fatal "Missing kernel configuration."
[[ -f "${obj_dir}/Module.symvers" ]] || fatal "Missing Module.symvers."
# Copy in .config and Module.symvers so we can specify O=$target_dir.
cp "${obj_dir}/.config" "${obj_dir}/Module.symvers" "$target_dir"
extra_header_dirs="drivers/md net/mac80211 drivers/media/dvb-core include/config/dvb \
drivers/media/dvb-frontends drivers/media/usb/dvb-usb drivers/media/tuners"
extra_asm_dirs="arch/arm64/kernel/vdso"
push_linux
trap pop EXIT
[[ -d "$karch_dir" ]] || fatal "Unrecognised karch: $karch"
echo Running modules_prepare...
make O="$target_dir" $build_opts modules_prepare
echo Copying required files...
if [[ -n "$prefix" ]]; then
# Move host arch script binaries so we can fix them up later. We don't want to
# keep host binaries in place when we copy in source, we'll compile target arch
# versions later.
mv "$target_dir"/scripts "$target_dir"/xscripts
fi
for f in Makefile kernel/Makefile Documentation/DocBook/Makefile; do
install -D -m644 "$f" "$target_dir/$f"
done
# Arch Linux copies only specific directories, however the difference is 31M
# vs. 37M (~168k compressed) so for future-proofing I think it's not much more
# of a cost to just copy everything.
find include -mindepth 1 -maxdepth 1 -type d | \
xargs -I {} cp -a "{}" "$target_dir/include"
for d in include $extra_header_dirs $extra_asm_dirs; do
[ -d "$d" ] && mkdir -p "$target_dir/$d"
done
# Configure arch/<arch> directory.
mkdir -p "$target_karch_dir"
copy_dir "$karch_dir/include" "$target_karch_dir"
copy_dir "$karch_dir/tools" "$target_karch_dir"
for f in $(find $karch_dir -iname '*.h' -o -name 'Makefile' -o -iname '*.tbl' -o -iname '*.sh'); do
copy_mkdir "$target_dir" "$f"
done
for f in $(find security -iname '*.h'); do
copy_mkdir "$target_dir" "$f"
done
# Copy over tools include as some builds require this.
mkdir -p "$target_dir/tools"
copy_dir tools/include "$target_dir/tools"
copy_dir scripts "$target_dir"
# Don't strip binaries as only makes 200kb difference...
mkdir -p "$target_karch_dir/kernel"
cp "$karch_dir/Makefile" "$target_karch_dir"
# May as well always copy these if available.
for f in Makefile_32.cpu kernel/asm-offsets.s; do
p="$karch_dir/$f"
[ -f $p ] && cp "$p" "$target_karch_dir/$f"
done
# Copy in extra headers. Directories already created above.
for d in $extra_header_dirs; do
[ -d "$d" ] && (cp $d/*.h "$target_dir/$d" || true)
done
# Copy in extra assember. Directories already created above.
for d in $extra_asm_dirs; do
[ -d "$d" ] && (cp $d/*.S "$target_dir/$d" || true)
done
# Specific required files.
if [[ -e drivers/media/i2c/msp3400-driver.h ]]; then
mkdir -p "$target_dir/drivers/media/i2c/"
cp drivers/media/i2c/msp3400-driver.h "$target_dir/drivers/media/i2c/"
fi
# Copy in Kconfig files.
for f in $(find . -name "Kconfig*"); do
copy_mkdir "$target_dir" "$f"
done
if [[ -n "$prefix" ]]; then
echo Fixing up script binaries...
push "$target_dir"
# Make some backups so we can restore sanity after we're done.
cp scripts/basic/Makefile .backup.basic.Makefile
cp scripts/Kbuild.include .backup.kbuild.Makefile.include
cp scripts/Makefile.build .backup.Makefile.build
cp scripts/mod/Makefile .backup.mod.Makefile
cp scripts/kconfig/Makefile .backup.kconfig.Makefile
# Fixup Makefile's so they reference our host arch binaries in xscripts.
# We only need a few fixups since we're only building scripts here.
sed -i 's|$(obj)/fixdep|x$(obj)/fixdep|' scripts/basic/Makefile
sed -i 's|scripts/basic/fixdep|xscripts/basic/fixdep|' scripts/Kbuild.include
sed -i 's|scripts/basic/fixdep|xscripts/basic/fixdep|' scripts/Makefile.build
sed -i 's|$(obj)/mk_elfconfig|x$(obj)/mk_elfconfig|' scripts/mod/Makefile
sed -i 's|$(obj)/conf|x$(obj)/conf|' scripts/kconfig/Makefile
echo Building script binaries for target arch...
make HOSTCC="$hostcc" $build_opts scripts/
echo Cleaning up directory...
# Reinstate pristine Makefile's.
mv .backup.basic.Makefile scripts/basic/Makefile
mv .backup.kbuild.Makefile.include scripts/Kbuild.include
mv .backup.Makefile.build scripts/Makefile.build
mv .backup.mod.Makefile scripts/mod/Makefile
mv .backup.kconfig.Makefile scripts/kconfig/Makefile
# Clean up host script bins.
rm -rf xscripts
pop
fi
echo Done!