xref: /OK3568_Linux_fs/yocto/scripts/runqemu-extract-sdk (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun#
3*4882a593Smuzhiyun# This utility extracts an SDK image tarball using pseudo, and stores
4*4882a593Smuzhiyun# the pseudo database in var/pseudo within the rootfs. If you want to
5*4882a593Smuzhiyun# boot QEMU using an nfsroot, you *must* use this script to create the
6*4882a593Smuzhiyun# rootfs to ensure it is done correctly with pseudo.
7*4882a593Smuzhiyun#
8*4882a593Smuzhiyun# Copyright (c) 2010 Intel Corp.
9*4882a593Smuzhiyun#
10*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-only
11*4882a593Smuzhiyun#
12*4882a593Smuzhiyun
13*4882a593Smuzhiyunfunction usage() {
14*4882a593Smuzhiyun	echo "Usage: $0 <image-tarball> <extract-dir>"
15*4882a593Smuzhiyun}
16*4882a593Smuzhiyun
17*4882a593Smuzhiyunif [ $# -ne 2 ]; then
18*4882a593Smuzhiyun	usage
19*4882a593Smuzhiyun	exit 1
20*4882a593Smuzhiyunfi
21*4882a593Smuzhiyun
22*4882a593SmuzhiyunSYSROOT_SETUP_SCRIPT=`which oe-find-native-sysroot 2> /dev/null`
23*4882a593Smuzhiyunif [ -z "$SYSROOT_SETUP_SCRIPT" ]; then
24*4882a593Smuzhiyun	echo "Error: Unable to find the oe-find-native-sysroot script"
25*4882a593Smuzhiyun	echo "Did you forget to source your build system environment setup script?"
26*4882a593Smuzhiyun	exit 1
27*4882a593Smuzhiyunfi
28*4882a593Smuzhiyun. $SYSROOT_SETUP_SCRIPT meta-ide-support
29*4882a593SmuzhiyunPSEUDO_OPTS="-P $OECORE_NATIVE_SYSROOT/usr"
30*4882a593Smuzhiyun
31*4882a593SmuzhiyunROOTFS_TARBALL=$1
32*4882a593SmuzhiyunSDK_ROOTFS_DIR=$2
33*4882a593Smuzhiyun
34*4882a593Smuzhiyunif [ ! -e "$ROOTFS_TARBALL" ]; then
35*4882a593Smuzhiyun	echo "Error: sdk tarball '$ROOTFS_TARBALL' does not exist"
36*4882a593Smuzhiyun	usage
37*4882a593Smuzhiyun	exit 1
38*4882a593Smuzhiyunfi
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun# Convert SDK_ROOTFS_DIR to a full pathname
41*4882a593Smuzhiyunif [[ ${SDK_ROOTFS_DIR:0:1} != "/" ]]; then
42*4882a593Smuzhiyun	SDK_ROOTFS_DIR=$(readlink -f $(pwd)/$SDK_ROOTFS_DIR)
43*4882a593Smuzhiyunfi
44*4882a593Smuzhiyun
45*4882a593SmuzhiyunTAR_OPTS=""
46*4882a593Smuzhiyunif [[ "$ROOTFS_TARBALL" =~ tar\.xz$ ]]; then
47*4882a593Smuzhiyun	TAR_OPTS="--numeric-owner -xJf"
48*4882a593Smuzhiyunfi
49*4882a593Smuzhiyunif [[ "$ROOTFS_TARBALL" =~ tar\.bz2$ ]]; then
50*4882a593Smuzhiyun	TAR_OPTS="--numeric-owner -xjf"
51*4882a593Smuzhiyunfi
52*4882a593Smuzhiyunif [[ "$ROOTFS_TARBALL" =~ tar\.gz$ ]]; then
53*4882a593Smuzhiyun	TAR_OPTS="--numeric-owner -xzf"
54*4882a593Smuzhiyunfi
55*4882a593Smuzhiyunif [[ "$ROOTFS_TARBALL" =~ \.tar$ ]]; then
56*4882a593Smuzhiyun	TAR_OPTS="--numeric-owner -xf"
57*4882a593Smuzhiyunfi
58*4882a593Smuzhiyunif [ -z "$TAR_OPTS" ]; then
59*4882a593Smuzhiyun	echo "Error: Unable to determine sdk tarball format"
60*4882a593Smuzhiyun	echo "Accepted types: .tar / .tar.gz / .tar.bz2 / .tar.xz"
61*4882a593Smuzhiyun	exit 1
62*4882a593Smuzhiyunfi
63*4882a593Smuzhiyun
64*4882a593Smuzhiyunif [ ! -d "$SDK_ROOTFS_DIR" ]; then
65*4882a593Smuzhiyun	echo "Creating directory $SDK_ROOTFS_DIR"
66*4882a593Smuzhiyun	mkdir -p "$SDK_ROOTFS_DIR"
67*4882a593Smuzhiyunfi
68*4882a593Smuzhiyun
69*4882a593Smuzhiyunpseudo_state_dir="$SDK_ROOTFS_DIR/../$(basename "$SDK_ROOTFS_DIR").pseudo_state"
70*4882a593Smuzhiyunpseudo_state_dir="$(readlink -f $pseudo_state_dir)"
71*4882a593Smuzhiyun
72*4882a593Smuzhiyundebug_image="`echo $ROOTFS_TARBALL | grep '\-dbg\.rootfs\.tar'`"
73*4882a593Smuzhiyun
74*4882a593Smuzhiyunif [ -e "$pseudo_state_dir" -a -z "$debug_image" ]; then
75*4882a593Smuzhiyun	echo "Error: $pseudo_state_dir already exists!"
76*4882a593Smuzhiyun	echo "Please delete the rootfs tree and pseudo directory manually"
77*4882a593Smuzhiyun	echo "if this is really what you want."
78*4882a593Smuzhiyun	exit 1
79*4882a593Smuzhiyunfi
80*4882a593Smuzhiyun
81*4882a593Smuzhiyunmkdir -p "$pseudo_state_dir"
82*4882a593Smuzhiyuntouch "$pseudo_state_dir/pseudo.pid"
83*4882a593SmuzhiyunPSEUDO_LOCALSTATEDIR="$pseudo_state_dir"
84*4882a593Smuzhiyunexport PSEUDO_LOCALSTATEDIR
85*4882a593Smuzhiyun
86*4882a593Smuzhiyunecho "Extracting rootfs tarball using pseudo..."
87*4882a593Smuzhiyunecho "$PSEUDO $PSEUDO_OPTS tar -C \"$SDK_ROOTFS_DIR\" $TAR_OPTS \"$ROOTFS_TARBALL\""
88*4882a593Smuzhiyun$PSEUDO $PSEUDO_OPTS tar -C "$SDK_ROOTFS_DIR" $TAR_OPTS "$ROOTFS_TARBALL"
89*4882a593Smuzhiyun
90*4882a593SmuzhiyunDIRCHECK=`ls -l "$SDK_ROOTFS_DIR" | wc -l`
91*4882a593Smuzhiyunif [ "$DIRCHECK" -lt 5 ]; then
92*4882a593Smuzhiyun	echo "Warning: I don't see many files in $SDK_ROOTFS_DIR"
93*4882a593Smuzhiyun	echo "Please double-check the extraction worked as intended"
94*4882a593Smuzhiyun	exit 0
95*4882a593Smuzhiyunfi
96*4882a593Smuzhiyun
97*4882a593Smuzhiyunecho "SDK image successfully extracted to $SDK_ROOTFS_DIR"
98*4882a593Smuzhiyun
99*4882a593Smuzhiyunexit 0
100