slitaz-arm view sat-rpi @ rev 144

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