slitaz-arm view sat-rpi @ rev 133

rpi: use raspberrypi package, clean up code
author Christophe Lincoln <pankso@slitaz.org>
date Sat Apr 26 03:12:28 2014 +0200 (2014-04-26)
parents aea5676e77c8
children d2106327fb89
line source
1 #!/bin/sh
2 #
3 # Sat RPi - SliTaz Raspberry Pi Build Tool
4 #
5 # Copyright (C) 2012-2014 SliTaz ARM - BSD License
6 # Author: Christophe Lincoln <pankso@slitaz.org>
7 #
8 . /lib/libtaz.sh
10 #: ${arch=armv6hf}
11 : ${arch=arm}
13 # Paths
14 [ "$work" ] || work="$(pwd)"
15 distro="$work/distro"
16 rpi="$work/rpi"
17 data="$rpi/data"
18 cache="$rpi/cache"
19 boot="$distro/boot"
20 rootfs="$distro/rootfs"
21 rpi_git="$rpi/git"
22 kernel="$rpi_git/linux"
23 firmware="$rpi_git/firmware"
24 dev="$2"
26 # URLs
27 rpi_mirror="http://mirror.slitaz.org/arm/rpi/"
28 rpi_git_url="git://github.com/raspberrypi/"
30 #
31 # Functions
32 #
34 usage() {
35 cat << EOT
37 $(boldify "Usage:") $(basename $0) [command] [--option]
39 SliTaz Raspberry Pi Tool
41 $(boldify "Commands:")
42 info Display paths and distro info
43 install Install SliTaz RPi to sdcard
44 gen Generate a new SliTaz RPi distro
45 cook-linux Build the Raspberry Pi Linux kernel
46 get-linux Get the SliTaz RPi linux package
47 clone-fw Clone the RPi firmware repository
48 get-prebuilt Get a prebuilt SliTaz ARM toolchain
49 clean Clean the current work directory
50 release Release an installable tarball
52 $(boldify "Options:")
53 --nosat Don't regenerate the distro with sat
55 EOT
56 }
58 error() {
59 echo "[ $(colorize 31 'ERROR') ] $@"
60 }
62 header() {
63 newline && colorize 35 "$@" && separator
64 }
66 # Get all RPi firmware
67 clone_fw() {
68 [ -d "${rpi_git}/firmware" ] && return 0
69 mkdir -p ${rpi_git} && cd ${rpi_git}
70 git clone --depth 1 ${rpi_git_url}firmware.git
71 }
73 umount_sd() {
74 umount /dev/${dev}1 2>/dev/null || exit 1
75 umount /dev/${dev}3 2>/dev/null || exit 1
76 }
78 #
79 # Commands
80 #
82 case "$1" in
83 info)
84 header "SliTaz Raspberry Pi info"
85 echo "RPi path : $rpi"
86 colorize 36 "/boot/cmdline.txt:"
87 cat ${boot}/cmdline.txt
88 colorize 36 "/boot/config.txt:"
89 cat ${boot}/config.txt
90 separator && newline ;;
92 install)
93 rpiboot="/media/rpi/boot"
94 rpiroot="/media/rpi/rootfs"
95 header "SliTaz Raspberry Pi install"
96 if [ ! "$dev" ]; then
97 echo -n "SD card disk name (ex sdc): "; read dev
98 fi
99 [ ! "$dev" ] && exit 1
101 # Store sdcard partition(s) list
102 fdisk -l /dev/${dev} | grep "^/dev/$dev" | awk '{print $1}' \
103 > ${cache}/sdcard.part
104 partnb=$(cat ${cache}/sdcard.part | wc -l)
105 if [ "$partnb" != 3 ]; then
106 error "SliTaz RPi needs 3 partitions on the sdcard"
107 newline && exit 1
108 fi
110 # Mount sdcard
111 if mount | grep -q "^/dev/$dev[1-3]"; then
112 debug "Unmounting: /dev/$dev"
113 umount_sd
114 fi
115 echo -n "Mounting: /dev/$dev partitions"
116 mkdir -p ${rpiboot} ${rpiroot}
117 mount /dev/${dev}1 ${rpiboot} || exit 1
118 mount /dev/${dev}3 ${rpiroot} || exit 1
119 status
120 echo -n "Cleaning: filesystem directories"
121 for dir in bin dev etc lib media mnt proc sbin sys tmp usr var run
122 do
123 rm -rf ${rpiroot}/${dir}
124 done; status
125 echo -n "Installing: boot files"
126 cp -rf ${boot}/* ${rpiboot}; status
127 echo -n "Installing: rootfs files"
128 cp -a ${rootfs}/* ${rpiroot}; status
130 # Unmount
131 echo -n "Unmounting: RPi sdcard"
132 umount_sd; status
134 rm -f ${cache}/sdcard.part
135 separator
136 echo "Insert the SD card into your Raspberry Pi and boot!"
137 newline ;;
139 gen)
140 # Separate boot files since the Raspberry Pi boots off a FAT32 /boot
141 # partition on the sdcard.
142 : ${flavor=rpi-base}
144 # Use the rootfs generated by sat
145 if [ ! -x "/usr/bin/sat" ]; then
146 error "Sat is not installed" && exit 1
147 fi
148 check_root
150 # We may want to simply regenerate the RPi distro
151 if [ ! "$nosat" ]; then
152 sat gen --work="$work" --flavor="$flavor" --noinit --nolinux
153 else
154 newline
155 fi
157 colorize 35 "SliTaz Raspberry Pi distro"
158 separator
159 mkdir -p ${boot}
161 # Custom RPi rootfs: make sure all files belong to root
162 if [ -d "$rpi/rootfs" ]; then
163 size=$(du -sh $rpi/rootfs | awk '{print $1}')
164 echo -n "Copying custom RPi rootfs: $size"
165 tmp=$distro/tmp-$$
166 mkdir -p $tmp
167 cp -r $rpi/rootfs/* $tmp
168 chown -R root.root $tmp
169 cp -a $tmp/* ${rootfs} && rm -rf $tmp
170 mv -f ${rootfs}/boot/* ${boot}
171 status
172 fi
174 # TazBerry
175 echo -n "Copying utility: TazBerry..."
176 cp -f ${rpi}/tazberry ${rootfs}/usr/bin
177 cp -a ${rpi}/cgi-adm/* ${rootfs}/var/www/adm
178 status
180 # PiBoot
181 echo -n "Copying bootloader: PiBoot..."
182 cp -f ${rpi}/piboot ${rootfs}/sbin
183 status
185 # Kernel at last
186 . $cache/linux-*/receipt
187 kvers="$VERSION"
188 kpkg="$rootfs/var/lib/tazpkg/installed/linux"
189 fs="$cache/linux-$kvers/fs"
190 ksize=$(du -sh $fs | awk '{print $1}')
191 if [ -d "$fs" ]; then
192 echo -n "Copying: kernel $kvers ($ksize)"
193 rm -rf ${rootfs}/lib/modules
194 cp -rf ${fs}/lib/* ${rootfs}/lib
195 cp -f ${fs}/boot/* ${boot}
196 mkdir -p ${kpkg}
197 cd ${cache}/linux-${kvers}
198 cp -f files.list md5sum receipt ${kpkg}
199 status
200 else
201 echo "SliTaz RPi Kernel: not used"
202 fi
204 separator
205 echo -n "Boot: $(du -sh $boot | awk '{print $1}') "
206 echo "- Rootfs: $(du -sh $rootfs | awk '{print $1}')"
207 newline ;;
209 cook-linux)
210 # Native SliTaz Toolchain and cross toolchain must be installed
211 check_root
212 install="$cache/linux-install"
213 if [ ! -d "/cross/$arch" ]; then
214 error "Missing cross toolchain in: /cross/$arch" && exit 1
215 fi
217 # Kernel source
218 cd ${rpi_git}
219 [ -d "$kernel" ] || git clone --depth 1 ${rpi_git_url}linux.git
221 # Compile
222 [ "$clean" ] && rm -rf ${install}
223 if [ ! -d "$install" ]; then
224 cd ${kernel}
225 export PATH=$PATH:/cross/${arch}/tools/bin
226 export HOST_SYSTEM=${arch}-slitaz-linux-gnueabi
227 make mrproper &&
228 make ARCH=arm bcmrpi_defconfig
229 echo "Patching SliTaz RPi Linux .config"
230 patch -p0 -i ${data}/linux-rpi.patch || exit 1
231 make ARCH=arm CROSS_COMPILE=${HOST_SYSTEM}- zImage &&
232 make ARCH=arm CROSS_COMPILE=${HOST_SYSTEM}- modules &&
233 make ARCH=arm CROSS_COMPILE=${HOST_SYSTEM}- \
234 INSTALL_MOD_PATH=${install} modules_install || exit 1
235 mkdir -p ${install}/boot
236 cp -a arch/arm/boot/zImage ${install}/boot/kernel.img
237 fi
239 # Kernel version
240 kvers=$(ls ${install}/lib/modules)
241 kvers=${kvers%-slitaz-rpi+}+
243 # Compress modules
244 cd ${install}/lib/modules/${kvers%+}-slitaz-rpi+/ || exit 1
245 mods=$(find . -name "*.ko$" | wc -l)
246 newline
247 echo "Compressing kernel modules: $mods"
248 find . -name "*.ko$" -exec gzip '{}' \; #2> /dev/null
250 # Rebuild modules.dep
251 cd ${install}
252 depmod -b . ${kvers%+}-slitaz-rpi+
254 # Kernel
255 fs="$cache/linux-$kvers/fs"
256 echo "Kernel version: $kvers"
257 if [ -d "$install" ]; then
258 rm -rf ${cache}/linux-${kvers}
259 mkdir -p ${cache}/linux-${kvers}
260 cp -a ${install} ${fs}
261 rm -f ${fs}/lib/modules/*/build \
262 ${fs}/lib/modules/*/source
263 fi
265 # Pack .tazpkg
266 cd ${cache}
267 echo "Creating package: receipt"
268 cat > linux-$kvers/receipt << EOT
269 # SliTaz package receipt
271 PACKAGE="linux"
272 VERSION="$kvers"
273 SHORT_DESC="SliTaz Linux Kernel for the Raspberry Pi."
274 WEB_SITE="http://www.kernel.org"
276 EOT
277 tazpkg pack linux-$kvers ;;
279 clone-fw)
280 clone_fw ;;
282 get-linux)
283 # Precook RPi kernel
284 check_root
285 mkdir -p ${cache}
287 # Last version
288 rm -f ${cache}/linux-version.txt
289 if busybox wget -q -s ${rpi_mirror}/last-linux.txt; then
290 echo -n "Fetching latest Kernel string..."
291 wget -q ${rpi_mirror}/last-linux.txt \
292 -O ${cache}/linux-version.txt || exit 1
293 status
294 else
295 echo "Mirror is unreachable" && exit 1
296 fi
297 kvers=$(cat $cache/linux-version.txt)
298 [ "$up" ] && rm -rf ${cache}/linux-${kvers}*
299 echo "Kernel version: $kvers"
301 # Download
302 if [ ! -f "$cache/linux-$kvers.tazpkg" ]; then
303 echo -n "Fetching latest Linux package..."
304 wget -q ${rpi_mirror}/linux-${kvers}.tazpkg \
305 -O ${cache}/linux-${kvers}.tazpkg; status
306 fi
308 # Extract
309 if [ ! -d "$cache/linux-$kvers" ]; then
310 cd ${cache} && tazpkg extract linux-${kvers}.tazpkg
311 fi
312 rm -f ${cache}/linux-version.txt ;;
314 get-prebuilt)
315 # --> in cross ??
316 : ${arch=arm}
317 name="slitaz-$arch-toolchain"
318 vers="20140304"
319 tarball="$name-$vers.tar.bz2"
320 url="http://mirror.slitaz.org/packages/cross/"
321 mkdir -p /cross
322 cd /cross
323 if [ ! -f "$tarball" ]; then
324 if busybox wget -qs ${url%/}/${tarball}; then
325 busybox wget ${url%/}/${tarball}
326 else
327 echo "Toolchain URL is unreachable" && exit 1
328 fi
329 fi
330 if [ ! -d "${name}-${vers}" ]; then
331 echo "Extracting: $tarball"
332 tar xjf ${tarball}
333 fi
334 echo "Copying: ${name}-${vers}/${arch}"
335 mkdir -p ${arch}
336 cp -a ${name}-${vers}/${arch}/* ${arch}
337 echo "Tools path: /cross/${arch}/tools/bin" ;;
339 release)
340 # Used to release official SliTaz RPi images
341 cd ${distro} || exit 1
342 if [ ! "$flavor" ]; then
343 . $distro/rootfs/etc/slitaz/flavor.conf || exit 1
344 flavor="$FLAVOR"
345 fi
346 dname="slitaz-$flavor-$(date +%Y%m%d)"
347 dsize=$(du -sh $distro | awk '{print $1}' | cut -d "." -f 1)
348 rm -rf ${dname} && mkdir ${dname}
349 cp -a boot rootfs ${dname}
350 echo "Copying: SliTaz release files"
351 cp ${rpi}/release/* ${dname}
352 echo "Creating: ${dname}.tar.bz2"
353 tar -cjf ${dname}.tar.bz2 ${dname}
354 echo "Creating: ${dname}.md5"
355 md5sum ${dname}.tar.bz2 > ${dname}.md5
356 rm -rf ${dname} ;;
358 clean)
359 echo "Cleaning: $rpi"
360 rm -rf ${cache} ${rpi_git} ;;
362 *|*help) usage ;;
363 esac
364 exit 0