public inbox for gentoo-embedded@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-embedded] bash script for building toolchain and images using crossdev
@ 2006-09-22 22:20 Siong-Ui Te
  0 siblings, 0 replies; 2+ messages in thread
From: Siong-Ui Te @ 2006-09-22 22:20 UTC (permalink / raw
  To: gentoo-embedded


[-- Attachment #1.1: Type: text/plain, Size: 1844 bytes --]

Hello,
I really appreciate so much contribution done by Gentoo embedded guys.
Several mouths ago I tried to use Gentoo environment to build single
kernel+rootfs image
successfully and crossdev is really a great utility for building
cross-toolchains.
As a result I wrote this script to automate the whole build procedures.
The single kernel+rootfs image is made using initramfs, so only 2.6 kernel
is usable now.
This script is not quite mature and some implementation is really ugly so
far.
To run this dialog-based script, the following packages are needed:
dev-util/dialog
sys-devel/crossdev
app-portage/mirrorselect

Usage example:
1. Build toolchain i686-gentoo-linux-uclibc.
In Main Menu:
Choose Build->i686->gentoo->linux->uclibc->Choose version[Optional]->Select
build stage
->Select Misc options->Confirm->Start to build-> Follow the steps to
configure toolchain
2. Build rootfs
In Main Menu:
Choose Package->Select toolchain i686-gentoo-linux-uclibc->Select the
packages you want to install
(at least C library, baselayout-lite, and busybox are needed), then the
script start to build packages
and the rootfs is located in /usr/i686-gentoo-linux-uclibc/genroot/rootfs.
3. Build image:
In Main Menu:
Choose Kernel->Select toolchain i686-gentoo-linux-uclibc->Choose
1.InstallKernel->Install gentoo-sources
->Then Choose 2. Configure kernel. remember to enable initramfs and specify
initramfs source as
/usr/i686-gentoo-linux-uclibc/genroot/rootfs ->Choose 5. Build a single
image (Kernel+Rootfs)
Then you can get the image under /usr/src/linux/arch/i386/boot/bzImage

I would like to make it GPL'ed and make it part of the gentoo-embedded
project if Gentoo embedded guys
feel the script really help and fit the goal of the project.
Any suggestions and feedbacks are welcomed.
Sorry for my poor English because I am not a native speaker.

[-- Attachment #1.2: Type: text/html, Size: 2006 bytes --]

[-- Attachment #2: gencross.sh --]
[-- Type: application/x-sh, Size: 36692 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

* [gentoo-embedded] bash script for building toolchain and images using crossdev
@ 2006-09-23 16:28 Siong-Ui Te
  0 siblings, 0 replies; 2+ messages in thread
From: Siong-Ui Te @ 2006-09-23 16:28 UTC (permalink / raw
  To: gentoo-embedded


[-- Attachment #1.1: Type: text/plain, Size: 1783 bytes --]

Hello,
I really appreciate so much contribution done by Gentoo embedded guys.
Several mouths ago I tried to use Gentoo environment to build single
kernel+rootfs image
successfully and crossdev is really a great utility for building
cross-toolchains.
As a result I wrote this script to automate the whole build procedures.
The single kernel+rootfs image is made using initramfs, so only 2.6 kernel
is usable now.
This script is not quite mature and some implementation is really ugly so
far.
To run this dialog-based script, the following packages are needed:
dev-util/dialog
sys-devel/crossdev
app-portage/mirrorselect

Usage example:
1. Build toolchain i686-gentoo-linux-uclibc.
In Main Menu:
Choose Build->i686->gentoo->linux->uclibc->Choose version[Optional]->Select
build stage
->Select Misc options->Confirm->Start to build-> Follow the steps to
configure toolchain
2. Build rootfs
In Main Menu:
Choose Package->Select toolchain i686-gentoo-linux-uclibc->Select the
packages you want to install
(at least C library, baselayout-lite, and busybox are needed), then the
script start to build packages
and the rootfs is located in /usr/i686-gentoo-linux-uclibc/genroot/rootfs.
3. Build image:
In Main Menu:
Choose Kernel->Select toolchain i686-gentoo-linux-uclibc->Choose
1.InstallKernel->Install gentoo-sources
->Then Choose 2. Configure kernel. remember to enable initramfs and specify
initramfs source as
/usr/i686-gentoo-linux-uclibc/genroot/rootfs ->Choose 5. Build a single
image (Kernel+Rootfs)
Then you can get the image under /usr/src/linux/arch/i386/boot/bzImage

I would like to make it GPL'ed and make it part of the gentoo-embedded
project if Gentoo embedded guys
feel the script really help and fit the goal of the project.
Any suggestions and feedbacks are welcomed.

[-- Attachment #1.2: Type: text/html, Size: 1964 bytes --]

[-- Attachment #2: gencross --]
[-- Type: application/octet-stream, Size: 36692 bytes --]

#!/bin/bash

GENCROSS_TMPDIR=/tmp/gencross
DIALOG_CMD=${GENCROSS_TMPDIR}/dialog

GENCROSS=$0
TARCH=
HARCH=$(unset ARCH ; portageq envvar ARCH)
CTARGET=
BCAT="sys-devel"  ; BPKG="binutils"      ; BVER="[latest]"
GCAT="sys-devel"  ; GPKG="gcc"           ; GVER="[latest]"
KCAT="sys-kernel" ; KPKG="linux-headers" ; KVER="[latest]"
LCAT=""           ; LPKG=""              ; LVER="[latest]"
STAGE="-s4"
UOPTS="" # Options passed to emerge by crossdev
EX_GCC="no"
EX_GDB="no"

KARCH=
TOOLCHAIN=  # Toolchain selected
SYSROOT=
ROOT=
PORTAGE_CONFIGROOT=
GENMERGE=
GENMAKE=

# Usage: $1 = title
dialog_init() { echo "dialog --backtitle \"gencross utility\" --title \"$1\"" > ${DIALOG_CMD} ; }

# Usage: $1 = extra opts
dialog_extraopts() {
	local CMD=`cat ${DIALOG_CMD}`
	CMD=${CMD}' '$1
	echo ${CMD} > ${DIALOG_CMD}
}

# Usage: $1 = text, $2 = height, $3 = width, $4 = menu-height
dialog_menu() {
	local CMD=`cat ${DIALOG_CMD}`
	CMD=${CMD}" --menu \"$1\" $2 $3 $4"
	echo ${CMD} > ${DIALOG_CMD}
}

# Usage: $1 = text, $2 = height, $3 = width
dialog_msgbox() {
	local CMD=`cat ${DIALOG_CMD}`
	CMD=${CMD}" --msgbox \"$1\" $2 $3"
	echo ${CMD} > ${DIALOG_CMD}
}

# Usage: $1 = text, $2 = height, $3 = width, $4 = list-height
dialog_checklist() {
	local CMD=`cat ${DIALOG_CMD}`
	CMD=${CMD}" --checklist \"$1\" $2 $3 $4"
	echo ${CMD} > ${DIALOG_CMD}
}

# Usage: $1 = text, $2 = height, $3 = width
dialog_yesno() {
	local CMD=`cat ${DIALOG_CMD}`
	CMD=${CMD}" --yesno \"$1\" $2 $3"
	echo ${CMD} > ${DIALOG_CMD}
}

# Usage: $1 = file, $2 = height, $3 = width
dialog_textbox() {
	local CMD=`cat ${DIALOG_CMD}`
	CMD=${CMD}" --textbox \"$1\" $2 $3"
	echo ${CMD} > ${DIALOG_CMD}
}

# Usage: $1 = text, $2 = height, $3 = width, [ $4 = init ]
dialog_inputbox() {
	local CMD=`cat ${DIALOG_CMD}`
	if [ -z "$4" ] ; then
		CMD=${CMD}" --inputbox \"$1\" $2 $3 "
	else
		CMD=${CMD}" --inputbox \"$1\" $2 $3 $4 "
	fi
	echo ${CMD} > ${DIALOG_CMD}
}

# Usage: $1 = tags+items+[status] 
dialog_tag_item() {
	local CMD=`cat ${DIALOG_CMD}`
	CMD=${CMD}" $1"
	echo ${CMD} > ${DIALOG_CMD}
}

# Usage: save the output in ${GENCROSS_TMPDIR}/$1
dialog_save_output() {
	local CMD=`cat ${DIALOG_CMD}`
	CMD=${CMD}" 2>${GENCROSS_TMPDIR}/$1"
	echo ${CMD} > ${DIALOG_CMD}
}

dialog_launch() { sh -c "`cat ${DIALOG_CMD}`" ; }

check_portage_overlay() {
	local POLSTDOUT_FILE=${GENCROSS_TMPDIR}/POLOUT
	local POLSTDERR_FILE=${GENCROSS_TMPDIR}/POLERR
	portageq envvar PORTDIR_OVERLAY 1>${POLSTDOUT_FILE} 2>${POLSTDERR_FILE}
	local POLSTDOUT=`cat ${POLSTDOUT_FILE}`
	local POLSTDERR=`cat ${POLSTDERR_FILE}`
	POLSTDERR=${POLSTDERR#*\'}
	POLSTDERR=${POLSTDERR%\'*}
	if [ -z ${POLSTDOUT} ] ; then
		if [ -z ${POLSTDERR} ] ; then
			# PORTDIR_OVERLAY is not set
			echo "PORTDIR_OVERLAY=/usr/local/portage" >> /etc/make.conf
			mkdir -p /usr/local/portage
			dialog_init "Portage Overlay"
			dialog_msgbox "\nPORTDIR_OVERLAY is not set.\nSet PORTDIR_OVERLAY=/usr/local/portage" 8 45
			dialog_launch
		else
			# PORTDIR_OVERLAY is set, but dir is not there
			mkdir -p ${POLSTDERR}
			dialog_init "Portage Overlay"
			dialog_msgbox "\nPORTDIR_OVERLAY(${POLSTDERR}) dir doesn't exit originally and has been created." 9 45
			dialog_launch
		fi
#	else
		# PORTDIR_OVERLAY is set
#		dialog_init "Portage Overlay"
#		dialog_msgbox "\nThe PORTDIR_OVERLAY has been set as:\n${POLSTDOUT}" 8 42
#		dialog_launch
	fi
}

# $1 = arch of "arch-vendor-OS-libc"
# Determine TARCH(target architecture)
# retuen value: ${TARCH}
determine_tarch() {
	case $1 in
		alpha*)     TARCH=alpha;;
		arm*)       TARCH=arm;;
		hppa*)      TARCH=hppa;;
		parisc)     TARCH=hppa;;
		ia64*)      TARCH=ia64;;
		i?86*)      TARCH=x86;;
		x86)        TARCH=x86;;
		m68*)       TARCH=m68k;;
		mips*)      TARCH=mips;;
		powerpc64*) TARCH=ppc64;;
		ppc64)      TARCH=ppc64;;
		powerpc*)   TARCH=ppc;;
		ppc)        TARCH=ppc;;
		sparc*)     TARCH=sparc;;
		s390*)      TARCH=s390;;
		sh*)        TARCH=sh;;
		x86_64*)    TARCH=amd64;;
		amd64)      TARCH=amd64;;
	esac
}

# $1 = ${TARCH}
# return value" ${KARCH}
determine_karch() {
	case $1 in
		alpha)     KARCH=alpha;;
		amd64)     KARCH=x86_64;;
		arm)       KARCH=arm;;
		hppa)      KARCH=parisc;;
		ia64)      KARCH=ia64;;
		mips)      KARCH=mips;;
		ppc)       KARCH=ppc;;
		ppc64)     KARCH=ppc;;
		s390)      KARCH=s390;;
		sh)        KARCH=sh;;
		sparc)     KARCH=sparc;;
		x86)       KARCH=i386;;
	esac
}

# retuen value: ${CTARGET}, ${LCAT}, ${LPKG}, ${TARCH}
determine_ctarget() {
	# Select arch
	dialog_init "CPU Architecture"
	dialog_extraopts "--no-cancel"
	dialog_extraopts "--default-item i686"
	dialog_menu "Select a target architecture" 16 35 10
	dialog_tag_item "alpha \"\""
	dialog_tag_item "arm \"\""
	dialog_tag_item "armeb \"\""
	dialog_tag_item "hppa \"\""
	dialog_tag_item "i386 \"\""
	dialog_tag_item "i486 \"\""
	dialog_tag_item "i586 \"\""
	dialog_tag_item "i686 \"\""
	dialog_tag_item "ia64 \"\""
	dialog_tag_item "m68k \"\""
	dialog_tag_item "mips \"\""
	dialog_tag_item "mipsel \"\""
	dialog_tag_item "mips64 \"\""
	dialog_tag_item "mips64el \"\""
	dialog_tag_item "powerpc \"\""
	dialog_tag_item "powerpc64 \"\""
	dialog_tag_item "s390 \"\""
	dialog_tag_item "s390x \"\""
	dialog_tag_item "sh \"\""
	dialog_tag_item "sh4 \"\""
	dialog_tag_item "sh64 \"\""
	dialog_tag_item "sparc \"\""
	dialog_tag_item "sparc64 \"\""
	dialog_tag_item "x86_64 \"\""
	dialog_save_output "ARCH"
	dialog_launch

	# Select vendor
	dialog_init "Hardware Platform or Vendor"
	dialog_extraopts "--no-cancel"
	dialog_extraopts "--default-item gentoo"
	dialog_menu "Select a vendor\nNote:softfloat for non-FPU CPU" 11 35 4
	dialog_tag_item "gentoo \"\""
	dialog_tag_item "pc \"\""
	dialog_tag_item "softfloat \"\""
	dialog_tag_item "unknown \"\""
	dialog_save_output "VENDOR"
	dialog_launch

	# Select OS
	dialog_init "Operating System"
	dialog_extraopts "--no-cancel"
	dialog_extraopts "--default-item linux"
	dialog_menu "Select an OS" 8 22 2
	dialog_tag_item "linux \"\""
	dialog_tag_item "uclinux \"\""
	dialog_save_output "OS"
	dialog_launch

	# Select libc
	dialog_init "C Library"
	dialog_extraopts "--no-cancel"
	dialog_extraopts "--default-item uclibc"
	dialog_menu "Select a C Library" 9 22 3
	dialog_tag_item "gnu \"\""
	dialog_tag_item "klibc \"\""
	dialog_tag_item "uclibc \"\""
	dialog_save_output "LIBC"
	dialog_launch

	# Determine CTARGET from previous inputs
	CTARGET=`cat ${GENCROSS_TMPDIR}/ARCH`-`cat ${GENCROSS_TMPDIR}/VENDOR`-`cat ${GENCROSS_TMPDIR}/OS`-`cat ${GENCROSS_TMPDIR}/LIBC`

	# Determine catagory/name(LCAT/LPKG) for libc
	case `cat ${GENCROSS_TMPDIR}/LIBC` in
		gnu)    LCAT="sys-libs" ; LPKG="glibc"  ;;
		klibc)  LCAT="dev-libs" ; LPKG="klibc"  ;;
		uclibc) LCAT="sys-libs" ; LPKG="uclibc" ;;
	esac

	# Determine ${TARCH} (target architecture)
	determine_tarch `cat ${GENCROSS_TMPDIR}/ARCH`
}

# Change the version of the package in the toolchain to be built.
# $1 = package name (binutils, gcc, linux-headers, or libc)
# return value: ${BVER}, or ${GVER}, or ${KVER}, or ${LVER}
package_version() {
	local PORTDIR=`portageq envvar PORTDIR`
	local PKGDIR=
	local TAGSITEMS=
	# Determine package dir from $1
	# e.g. if $1=uclibc, set PKGDIR=/usr/portage/sys-libs/uclibc
	case $1 in
		${BPKG}) PKGDIR=${PORTDIR}/${BCAT}/${BPKG};;
		${GPKG}) PKGDIR=${PORTDIR}/${GCAT}/${GPKG};;
		${KPKG}) PKGDIR=${PORTDIR}/${KCAT}/${KPKG};;
		${LPKG}) PKGDIR=${PORTDIR}/${LCAT}/${LPKG};;
	esac
	# Search ebuilds in the PKGDIR.
	# If the ebuid contains ${TARCH} or ~${TARCH}, add to (tag item) pairs.
	for ebuild in ${PKGDIR}/${1}-* ; do
		local PKGMASK=yes
		local PKGVER=${ebuild##/*/}
		PKGVER=${PKGVER%.*}
		local KEYWORDS=`grep KEYWORDS ${ebuild}`
		KEYWORDS=${KEYWORDS#*\"}
		KEYWORDS=${KEYWORDS%\"*}
		for k in ${KEYWORDS} ; do
			if [ ${k} = ${TARCH} ] ; then
				TAGSITEMS=${TAGSITEMS}${PKGVER}' '${TARCH}' '
				PKGMASK=no
			elif [ ${k} = "~${TARCH}" ] ; then
				TAGSITEMS=${TAGSITEMS}${PKGVER}' '"~${TARCH}"' '
				PKGMASK=no
			fi
		done
		[ ${PKGMASK} = yes ] && TAGSITEMS=${TAGSITEMS}${PKGVER}' '"-"' '
	done
	TAGSITEMS="[latest] N/A "${TAGSITEMS}
	dialog_init "${1} Version"
	dialog_extraopts "--no-cancel"
	dialog_menu "Select a version for $1" 16 45 10
	dialog_tag_item "${TAGSITEMS}"
	dialog_save_output "ANS"
	dialog_launch

	local ANS=`cat ${GENCROSS_TMPDIR}/ANS`
	case ${1} in
		${BPKG}) BVER=${ANS#*-};;
		${GPKG}) GVER=${ANS#*-};;
		${KPKG}) KVER=${ANS#linux-headers-};;
		${LPKG}) LVER=${ANS#*-};;
	esac
}

# return value: ${BVER}, ${GVER}, ${KVER}, ${LVER}
determine_version() {
	local OKVER=no
	local CHGVER=no
	local DFTITEM=${BPKG}
	BVER="[latest]"
	GVER="[latest]"
	KVER="[latest]"
	LVER="[latest]"
	while [ ${OKVER} = no ] ; do
		dialog_init "Toolchain Package Version"
		dialog_extraopts "--ok-label \"Enter\""
		dialog_extraopts "--cancel-label \"OK\""
		dialog_extraopts "--default-item ${DFTITEM}"
		[ ${CHGVER} = "no" ] && dialog_extraopts "--defaultno"
		dialog_menu "Select the package of which the version is to be changed. Press < OK  > to leave if done." 12 55 4
		dialog_tag_item "${BPKG} \"${BVER}\""
		dialog_tag_item "${GPKG} \"${GVER}\""
		dialog_tag_item "${KPKG} \"${KVER}\""
		dialog_tag_item "${LPKG} \"${LVER}\""
		dialog_save_output "ANS"
		dialog_launch

		case `cat ${GENCROSS_TMPDIR}/ANS` in
			${BPKG}) CHGVER=yes;DFTITEM=${BPKG};package_version ${BPKG};;
			${GPKG}) CHGVER=yes;DFTITEM=${GPKG};package_version ${GPKG};;
			${KPKG}) CHGVER=yes;DFTITEM=${KPKG};package_version ${KPKG};;
			${LPKG}) CHGVER=yes;DFTITEM=${LPKG};package_version ${LPKG};;
			*) OKVER=yes;;
		esac
	done
}

# return value: ${UOPTS}, ${EX_GCC}, ${EX_GDB}
parse_misc_opts() {
#	UOPTS=""
#	EX_GCC="no"
#	EX_GDB="no"
	while [ $# -gt 0 ] ; do
		case $1 in
		-b) UOPTS="${UOPTS}$1 ";;
		-d) UOPTS="${UOPTS}$1 ";;
		-p) UOPTS="${UOPTS}$1 ";;
		-v) UOPTS="${UOPTS}$1 ";;
		-q) UOPTS="${UOPTS}$1 ";;
		extra-gcc) EX_GCC="yes";;
		cross-gdb) EX_GDB="yes";;
		esac
		shift
	done
}

# return value: ${STAGE}, ${UOPTS}, ${EX_GCC}, ${EX_GDB}
determine_extraopts() {
	STAGE="-s4"
	UOPTS="" # Options passed to emerge by crossdev
	EX_GCC="no"
	EX_GDB="no"

	dialog_init "Build Stage"
	dialog_extraopts "--no-cancel"
	dialog_extraopts "--default-item -s4"
	dialog_menu "Select a build stage" 12 55 5
	dialog_tag_item "-s0 \"Build just binutils\""
	dialog_tag_item "-s1 \"Also build a C compiler (no libc/C++)\""
	dialog_tag_item "-s2 \"Also build kernel headers\""
	dialog_tag_item "-s3 \"Also build the C library (no C++)\""
	dialog_tag_item "-s4 \"Also build a C++ compiler [default]\""
	dialog_save_output "STAGE"
	dialog_launch
	STAGE=`cat ${GENCROSS_TMPDIR}/STAGE`

	dialog_init "Misc Options"
	dialog_extraopts "--no-cancel"
	dialog_extraopts "--separate-output"
	dialog_checklist "Press <space> to choose options [Multiple Choices]" 14 70 7
	dialog_tag_item "-b \"[passed to emerge] build binary packages\" off"
	dialog_tag_item "-d \"[passed to emerge] debug mode\" off"
	dialog_tag_item "-p \"[passed to emerge] pretend to install\" on"
	dialog_tag_item "-v \"[passed to emerge] verbose mode\" off"
	dialog_tag_item "-q \"[passed to emerge] quiet displays\" off"
	dialog_tag_item "extra-gcc \"Build extra gcc targets (gcj/ada/etc...)\" off"
	dialog_tag_item "cross-gdb \"Build a cross gdb\" off"
	dialog_save_output "CROSSDEV_EXTRA_OPTS"
	dialog_launch
	parse_misc_opts `cat ${GENCROSS_TMPDIR}/CROSSDEV_EXTRA_OPTS`
}

# return value: ${TOOLCHAIN}
select_toolchain() {
	# Search for existing toolchains
	local TOOLCHAINS=
	TOOLCHAIN=
	local PORTDIR_OVERLAY=`portageq envvar PORTDIR_OVERLAY`
	for t in ${PORTDIR_OVERLAY}/cross-* ; do
		[ ${t} = "${PORTDIR_OVERLAY}/cross-*" ] && break
		TOOLCHAINS=${TOOLCHAINS}${t##/*/cross-}" \"\" "
	done
	if [ -z ${TOOLCHAINS} ] ; then
		dialog_init "No Toolchain"
		dialog_msgbox "\nNo toolchain found!\n" 7 25
		dialog_launch
	else
		dialog_init "Select Toolchain"
		dialog_menu "Please select a toolchain" 12 45 5
		dialog_tag_item "${TOOLCHAINS}"
		dialog_save_output "TOOLCHAIN"
		dialog_launch
		# If users select <CANCEL>, TOOLCHAIN will be empty string.
		TOOLCHAIN=`cat ${GENCROSS_TMPDIR}/TOOLCHAIN`
	fi
}

# Usage: ${1} = yes || no [whether to select_toolchain first]
config_toolchain() {
	if [ ${1} = "yes" ] ; then
		# Select a toolchain to configure.
		select_toolchain
		# "No toolchain select" || "No existing toolchain"
		[ -z ${TOOLCHAIN} ] && return
	fi

	CTARGET=${TOOLCHAIN}
	SYSROOT=/usr/${CTARGET}
	ROOT=${SYSROOT}/genroot/rootfs
	PORTAGE_CONFIGROOT=${SYSROOT}

	determine_tarch ${CTARGET%%-*}
	[ -d ${SYSROOT}/genroot ] || mkdir -p ${SYSROOT}/genroot
	[ -d ${ROOT} ] || mkdir -p ${ROOT}

	if [ -f ${SYSROOT}/genroot/GENROOT_CONFIG_OK ] ; then
		dialog_init "Already Configured"
		dialog_extraopts "--defaultno"
		dialog_yesno "\nThe toolchain: ${TOOLCHAIN}\nhas been configured.\n\nDo you want to proceed anyway?" 10 50
		dialog_launch
		case $? in
			1) return;;
			255) return;;
		esac
		rm -rf ${SYSROOT}/genroot/GENROOT_CONFIG_OK
	fi

	# Prepare the content of /usr/${CTARGET}/etc/make.conf in /usr/${CTARGET}/genroot/make.conf
	local MAKECONF=${SYSROOT}/genroot/make.conf
	echo "ACCEPT_KEYWORDS=\"${TARCH}\""          > ${MAKECONF}
	echo "ARCH=\"${TARCH}\""                    >> ${MAKECONF}
	echo "CHOST=\"${CTARGET}\""                 >> ${MAKECONF}
	echo "CBUILD=\"`portageq envvar CHOST`\""   >> ${MAKECONF}
	echo "CTARGET=\"${CTARGET}\""               >> ${MAKECONF}
	echo "CFLAGS=\"-Os -pipe\""                 >> ${MAKECONF}
	echo "CXXFLAGS=\"\${CFLAGS}\""              >> ${MAKECONF}
	echo "INPUT_DEVICES=\"keyboard\""           >> ${MAKECONF}
	echo "MAKEOPTS=\"-j2\""                     >> ${MAKECONF}
	echo "USE=\"${TARCH} symlink\""             >> ${MAKECONF}
	mirrorselect -i -o >> ${MAKECONF}
	# Remove blank line(s)
	sed -i -e '/^$/d' ${MAKECONF}

	# Ask users if default make.conf is OK.
	local MAKEOK="no"
	while [ ${MAKEOK} = "no" ] ; do
		# Show ${SYSROOT}/genroot/make.conf
		dialog_init "make.conf for ${CTARGET}"
		dialog_textbox ${MAKECONF} 15 50
		dialog_launch
		# Ask users if they want to change variables in make.com
		dialog_init "make.conf OK?"
		dialog_extraopts "--defaultno"
		dialog_yesno "\nDo you want to change the content of make.conf?" 7 51
		dialog_launch
		case $? in
			0)
			# Parse variables in make.conf
			cp ${MAKECONF} ${GENCROSS_TMPDIR}/MAKECONF
			sed -i -n -e 's/=".*"/ ""/p' ${GENCROSS_TMPDIR}/MAKECONF
			local ALLMAKVAR=`cat ${GENCROSS_TMPDIR}/MAKECONF`
			# Select a variable to change
			dialog_init "make.conf Variables"
			dialog_extraopts "--no-cancel"
			dialog_menu "Please select a variable" 14 35 7
			dialog_tag_item "${ALLMAKVAR}"
			dialog_save_output "MAKVAR"
			dialog_launch
			local CHGVAR=`cat ${GENCROSS_TMPDIR}/MAKVAR`
			local CHGVARVAL=`grep ${CHGVAR}= ${MAKECONF}`
			CHGVARVAL=${CHGVARVAL#*=}
			CHGVARVAL=${CHGVARVAL//\$/\\\$}
			# Ask users to input new value for the variable
			dialog_init "Change ${CHGVAR}"
			dialog_inputbox "input content for ${CHGVAR}" 8 60 "${CHGVARVAL}"
			dialog_save_output "VARVAL"
			dialog_launch
			local CHGVARVAL=`cat ${GENCROSS_TMPDIR}/VARVAL`
			# Escape /
			CHGVARVAL=${CHGVARVAL//\//\\\/}

			# Create a new make.conf
			sed -i -e "s/${CHGVAR}=\".*\"/${CHGVAR}=\"${CHGVARVAL}\"/" ${MAKECONF}
			;;
			1) MAKEOK="yes";;
			255) ;;
		esac
	done
	# copy /usr/${CTARGET}/genroot/make.conf to /usr/${CTARGET}/etc/make.conf
	[ -d ${SYSROOT}/etc ] || mkdir -p ${SYSROOT}/etc
	cp -f ${MAKECONF} ${SYSROOT}/etc/make.conf

	# Creating ${SYSROOT}/etc/make.globals
	cp -f /etc/make.globals "${SYSROOT}/etc"
	# Create the directory for local profile configuration files
	mkdir -p "${SYSROOT}/etc/portage/profile"
	# Setting the sysroot Portage profile
	# FIXME: ugly implementation
	dialog_init "Select Profile"
	dialog_extraopts "--no-cancel --default-item uclibc/x86"
	dialog_menu "Please select a profile" 15 55 8
	dialog_tag_item "uclibc/amd64 \"\""
	dialog_tag_item "uclibc/arm \"\""
	dialog_tag_item "uclibc/mips \"\""
	dialog_tag_item "uclibc/ppc \"\""
	dialog_tag_item "uclibc/sh \"\""
	dialog_tag_item "uclibc/x86 \"\""
	dialog_tag_item "default-linux/x86/2006.1 \"\""
	dialog_tag_item "default-linux/x86/no-nptl \"\""
	dialog_tag_item "default-linux/x86/no-nptl/2.4 \"\""
	dialog_tag_item "default-linux/x86/2006.1/desktop \"\""
	dialog_tag_item "hardened/x86 \"\""
	dialog_tag_item "hardened/x86/2.6 \"\""
	dialog_tag_item "default-linux/ppc/ppc32/2006.1 \"\""
	dialog_tag_item "hardened/ppc \"\""
	#dialog_tag_item " \"\""
	dialog_save_output PROFILE
	dialog_launch
	local PROFILE=`portageq envvar PORTDIR`/profiles/`cat ${GENCROSS_TMPDIR}/PROFILE`
	ln -snf ${PROFILE} "${SYSROOT}/etc/make.profile"

	# Create xmerge: A simple cross emerge wrapper
	local XMERGEFILE=${SYSROOT}/genroot/xmerge_${CTARGET}
	echo "#!/bin/bash"                                   > ${XMERGEFILE}
	echo                                                >> ${XMERGEFILE}
	echo "SYSROOT=\"${SYSROOT}\""                       >> ${XMERGEFILE}
	echo "PORTAGE_CONFIGROOT=\"${PORTAGE_CONFIGROOT}\"" >> ${XMERGEFILE}
	echo "ROOT=\"${ROOT}\""                             >> ${XMERGEFILE}
	echo "if [ \"\${1}\" == \"--root\" ] ; then"        >> ${XMERGEFILE}
	echo "	ROOT=\"\${2}\""                             >> ${XMERGEFILE}
	echo "	shift 2"                                    >> ${XMERGEFILE}
	echo "fi"                                           >> ${XMERGEFILE}
	echo "export PORTAGE_CONFIGROOT ROOT SYSROOT"       >> ${XMERGEFILE}
	echo                                                >> ${XMERGEFILE}
	echo "emerge \$*"                                   >> ${XMERGEFILE}
	chmod +x ${XMERGEFILE}

	# Create xkmake: A cross kernel make wrapper
	determine_karch ${TARCH}
	local XKMAKEFILE=${SYSROOT}/genroot/xkmake_${CTARGET}
	echo "#!/bin/bash"                                   > ${XKMAKEFILE}
	echo                                                >> ${XKMAKEFILE}
	echo "SYSROOT=\"${SYSROOT}\""                       >> ${XKMAKEFILE}
	echo "PORTAGE_CONFIGROOT=\"${PORTAGE_CONFIGROOT}\"" >> ${XKMAKEFILE}
	echo "ROOT=\"${ROOT}\""                             >> ${XKMAKEFILE}
	echo "if [ \"\${1}\" == \"--root\" ] ; then"        >> ${XKMAKEFILE}
	echo "	ROOT=\"\${2}\""                             >> ${XKMAKEFILE}
	echo "	shift 2"                                    >> ${XKMAKEFILE}
	echo "fi"                                           >> ${XKMAKEFILE}
	echo "export PORTAGE_CONFIGROOT SYSROOT"            >> ${XKMAKEFILE}
	echo                                                >> ${XKMAKEFILE}
	echo "make ARCH=${KARCH} CROSS_COMPILE=${CTARGET}- INSTALL_MOD_PATH=\${ROOT} \$*" >> ${XKMAKEFILE}
	chmod +x ${XKMAKEFILE}

	touch ${SYSROOT}/genroot/GENROOT_CONFIG_OK
}

build_and_config_now() {
	# Prepare arguments for crossdev
	local CROSSDEVOPTS=${UOPTS}
	[ ${EX_GCC} = "yes" ] && CROSSDEVOPTS=${CROSSDEVOPTS}"--ex-gcc "
	[ ${EX_GDB} = "yes" ] && CROSSDEVOPTS=${CROSSDEVOPTS}"--ex-gdb "
	[ ${BVER} != "[latest]" ] && CROSSDEVOPTS=${CROSSDEVOPTS}"--b ${BVER} "
	[ ${GVER} != "[latest]" ] && CROSSDEVOPTS=${CROSSDEVOPTS}"--g ${GVER} "
	[ ${KVER} != "[latest]" ] && CROSSDEVOPTS=${CROSSDEVOPTS}"--k ${KVER} "
	[ ${LVER} != "[latest]" ] && CROSSDEVOPTS=${CROSSDEVOPTS}"--l ${LVER} "
	CROSSDEVOPTS=${CROSSDEVOPTS}"${STAGE} "
	CROSSDEVOPTS=${CROSSDEVOPTS}"-t ${CTARGET}"
	# Ask users to confirm again
	dialog_init "Final Confirmation"
	dialog_extraopts "--defaultno"
	dialog_yesno 	"\nTarget Architecture: ${TARCH}\nHost   Architecture: ${HARCH}\nCTARGET: ${CTARGET}\nbinutils: ${BVER}\ngcc: ${GVER}\nlinux-headers: ${KVER}\n${LPKG}: ${LVER}\nUOPTS: ${UOPTS}\nEX_GCC: ${EX_GCC}\nEX_GDB: ${EX_GDB}" 16 45
	dialog_launch

	if [ $? = "0" ] ; then # Answer is yes
		# Start to build
		clear
		crossdev ${CROSSDEVOPTS}

		# Check if the build is successful
		if [ $? -ne 0 ] ; then
			# Build failure, remove built packages
			echo; echo "Build failure!"; echo "Press <Enter> to continue"; read
			crossdev -C ${CTARGET}
			local PORT_LOGDIR=`portageq envvar PORT_LOGDIR`
			PORT_LOGDIR=${PORT_LOGDIR:-/var/log/portage}
			dialog_init "Build Failure"
			dialog_msgbox "\nPlease check log files in the following dir for more details:\n${PORT_LOGDIR}/cross-${CTARGET}-*" 8 70
			dialog_launch
		else
			# The build is ok.
			dialog_init "Build Success"
			dialog_msgbox "\nToolchain: ${CTARGET}\nhas been built successfully!\n" 8 50
			dialog_launch
			# Config toolchian now!
			dialog_init "Config Toolchain"
			dialog_msgbox "\nConfiguring ${CTARGET}" 7 48
			dialog_launch
			TOOLCHAIN=${CTARGET}
			config_toolchain "no"
		fi
	fi
}

build_toolchain() {
	determine_ctarget # retuen value: ${CTARGET}, ${LCAT}, ${LPKG}, ${TARCH}
	determine_version # return value: ${BVER}, ${GVER}, ${KVER}, ${LVER}
	determine_extraopts # return value: ${STAGE}, ${UOPTS}, ${EX_GCC}, ${EX_GDB}
	build_and_config_now
}

remove_toolchain() {
	# Select a toolchain to configure.
	select_toolchain
	# "No toolchain select" || "No existing toolchain"
	[ -z ${TOOLCHAIN} ] && return

	CTARGET=${TOOLCHAIN}
	SYSROOT=/usr/${CTARGET}
	ROOT=${SYSROOT}/genroot/rootfs
	PORTAGE_CONFIGROOT=${SYSROOT}
	dialog_init "Final Confirmation"
	dialog_extraopts "--defaultno"
	dialog_yesno "The following toolchain is to be removed:\n\n${CTARGET}\n\nAre you sure to do this?" 9 45
	dialog_launch
	case $? in
		0)
			clear
			rm -rf ${SYSROOT}/genroot
			rm -rf ${SYSROOT}/etc
			crossdev -C ${CTARGET};;
		255) ;;
	esac
}

# Install packages in /usr/${CTARGET}/genroot/rootfs by default
parse_and_install() {
	local USEFLAGS=
	local PKGS=
	local NOPKG=no
	[ $# -eq 0 ] && NOPKG=yes

	while [ $# -gt 0 ] ; do
		case ${1} in
		sys-libs/uclibc)
			#USEFLAGS=${USEFLAGS}"minimal "
			PKGS=${PKGS}"sys-libs/uclibc ";;
		sys-apps/baselayout-lite)
			# Check whether baselayout-lite is masked.
			${GENMERGE} -p sys-apps/baselayout-lite 1>/dev/null 2>/dev/null
			[ $? != "0" ] && echo "sys-apps/baselayout-lite -*" >> ${PORTAGE_CONFIGROOT}/etc/portage/package.keywords
			PKGS=${PKGS}"sys-apps/baselayout-lite ";;
		sys-apps/busybox)
			USEFLAGS=${USEFLAGS}"make-symlinks "
			PKGS=${PKGS}"sys-apps/busybox ";;
		net-misc/udhcp)
			PKGS=${PKGS}"net-misc/udhcp ";;
		net-misc/dropbear)
		# FIXME:cannot use "zlib", otherwise cannot configured successfully
			USEFLAGS=${USEFLAGS}"-zlib "
			PKGS=${PKGS}"net-misc/dropbear ";;
		www-client/lynx)
			PKGS=${PKGS}"www-client/lynx ";;
		net-irc/scrollz)
			PKGS=${PKGS}"net-irc/scrollz ";;
		sys-apps/net-tools)
			PKGS=${PKGS}"sys-apps/net-tools ";;
		net-misc/iputils)
			PKGS=${PKGS}"net-misc/iputils ";;
		app-misc/screen)
		# FIXME: cannot configured successfully
			PKGS=${PKGS}"app-misc/screen ";;
		sys-apps/coreutils)
		# FIXME: pull in too many packages
			PKGS=${PKGS}"sys-apps/coreutils ";;
		app-shells/bash)
		# FIXME: cannot configured successfully
			PKGS=${PKGS}"app-shells/bash ";;
			#dialog_init "Install ${1}"
			#dialog_msgbox "\n${1}\n" 7 40
			#dialog_launch ;;
		*) ;;
		esac
		shift
	done

	if [ ${NOPKG} = "yes" ] ; then
		dialog_init "No Packages"
		dialog_msgbox "\nNo packages selected!" 7 27
		dialog_launch
	else
		clear
		USE=${USEFLAGS} ${GENMERGE} -avuN ${PKGS}
		echo; echo "Press <Enter> to continue"; read
	fi
}

config_rootfs() {
	# Configuring rootfs
	dialog_init "Config Rootfs?"
#	dialog_extraopts "--defaultno"
	dialog_yesno "\nConfiguring roofs includes:\n\n1. Set up root password\n2. Set the hostname\n3. Write fstab\n4. Write /init(initramfs)\n\nDo you want to do these?" 14 45
	dialog_launch
	[ $? = "0" ] || return

	# Set up root password
	# FIXME: Is there any way to encrypt user's password in bash shell script?
	# root password: test
	echo "root:\$1\$\$whuMjZj.HMFoaTaZRRtkO0:0:0:root:/root:/bin/ash" > ${ROOT}/etc/passwd
	echo "root:\$1\$\$whuMjZj.HMFoaTaZRRtkO0:0:0:root:/root:/bin/ash" > ${ROOT}/etc/passwd-
	dialog_init "FIXME: Root Password"
	dialog_msgbox "\nRoot password cannot be set dynamically now.\nIt's 'test' by far.\n" 8 50
	dialog_launch
	# Set the hostname
	dialog_init "Set Hostname"
	dialog_inputbox "Please input hostname" 8 60 "genroot"
	dialog_save_output "HOSTNAME"
	dialog_launch
	echo `cat ${GENCROSS_TMPDIR}/HOSTNAME` > ${ROOT}/etc/hostname
	# Write fstab
	local ROOTFSTAB=${ROOT}/etc/fstab
	echo "# default ram disk as root" > ${ROOTFSTAB}
	echo "" >> ${ROOTFSTAB}
	echo "#/dev/ram0		/		cramfs 		defaults 	0 0" >> ${ROOTFSTAB}
	echo "#none			/proc		proc		defaults  	0 0" >> ${ROOTFSTAB}
	echo "" >> ${ROOTFSTAB}
	echo "# glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for" >> ${ROOTFSTAB}
	echo "# POSIX shared memory (shm_open, shm_unlink). " >> ${ROOTFSTAB}
	echo "# (tmpfs is a dynamically expandable/shrinkable ramdisk, and will" >> ${ROOTFSTAB}
	echo "#  use almost no memory if not populated with files)" >> ${ROOTFSTAB}
	echo "# Adding the following line to /etc/fstab should take care of this:" >> ${ROOTFSTAB}
	echo "" >> ${ROOTFSTAB}
	echo "#none			/dev/shm	tmpfs		defaults	0 0" >> ${ROOTFSTAB}
	echo "none			/tmp		tmpfs		defaults	0 0" >> ${ROOTFSTAB}
	echo "none			/proc		proc		defaults	0 0" >> ${ROOTFSTAB}
	dialog_init "/etc/fstab"
	dialog_msgbox "\nWrite /etc/fstab OK\n" 7 25
	dialog_launch
	# Write /init (initramfs)
	local ROOTINIT=${ROOT}/init
	echo "#!/bin/ash"                                             > ${ROOTINIT}
	echo "echo"                                                  >> ${ROOTINIT}
	echo "echo"                                                  >> ${ROOTINIT}
	echo "echo \" Welcome to Genroot\""                          >> ${ROOTINIT}
	echo "echo"                                                  >> ${ROOTINIT}
	echo "echo"                                                  >> ${ROOTINIT}
	echo ""                                                      >> ${ROOTINIT}
	echo "echo \" * Setting umask..\""                           >> ${ROOTINIT}
	echo "umask 022"                                             >> ${ROOTINIT}
	echo "echo \" * Mounting /proc..\""                          >> ${ROOTINIT}
	echo "mount -t proc none /proc"                              >> ${ROOTINIT}
	echo "echo \" * Starting init..\""                           >> ${ROOTINIT}
	echo "exec <dev/console >dev/console 2>&1"                   >> ${ROOTINIT}
	echo "exec chroot . /sbin/init"                              >> ${ROOTINIT}
	echo ""                                                      >> ${ROOTINIT}
	echo "echo \" *** Starting init failed! ***\""               >> ${ROOTINIT}
	echo "echo \" * Trying to start a shell..\""                 >> ${ROOTINIT}
	echo "exec /bin/ash"                                         >> ${ROOTINIT}
	chmod +x ${ROOTINIT}
	dialog_init "/init"
	dialog_msgbox "\nWrite /init OK\n" 7 20
	dialog_launch
	# Change /etc/inittab?
	# Change the timezone?

	# Create initramfs image
	cd ${ROOT} && find . | cpio -H newc -o | gzip -9 > ${SYSROOT}/genroot/initramfs_${CTARGET}.igz
	dialog_init "initramfs Image"
	dialog_msgbox "\ninitramfs_${CTARGET}.igz now in\n${SYSROOT}/genroot/\n" 8 55
	dialog_launch
}

# $1 = cat/pkg, $2 = file which contains the answer in ${GENCROSS_TMPDIR} dir
check_installed_version() {
	portageq match ${ROOT} ${1} 1>${GENCROSS_TMPDIR}/${2}
	local VERSION=`cat ${GENCROSS_TMPDIR}/${2}`
	VERSION=${VERSION#${1}-}
	[ -z ${VERSION} ] && VERSION=N/A
	echo ${VERSION} > ${GENCROSS_TMPDIR}/${2}
}

# Updated values: ${CTARGET}, ${SYSROOT}, ${ROOT}, ${PORTAGE_CONFIGROOT}, ${GENMERGE}, ${GENMAKE}
toolchain_package() {
	# Select a toolchain to configure.
	select_toolchain
	# "No toolchain select" || "No existing toolchain"
	[ -z ${TOOLCHAIN} ] && return

	CTARGET=${TOOLCHAIN}
	SYSROOT=/usr/${CTARGET}
	ROOT=${SYSROOT}/genroot/rootfs
	[ -d ${ROOT} ] || mkdir -p ${ROOT}
	PORTAGE_CONFIGROOT=${SYSROOT}
	GENMERGE="/usr/${CTARGET}/genroot/xmerge_${CTARGET}"
	GENMAKE="/usr/${CTARGET}/genroot/xkmake_${CTARGET}"

	# Select and install packages
	dialog_init "Select Packages"
	dialog_extraopts "--no-cancel --separate-output"
	dialog_checklist "Please selects packages to be installed" 15 60 8
	case ${CTARGET##*-} in
		gnu)
			check_installed_version "sys-libs/glibc" "VERSION"
			dialog_tag_item "sys-libs/glibc \"`cat ${GENCROSS_TMPDIR}/VERSION`\" on";;
		klibc)
			check_installed_version "dev-libs/klibc" "VERSION"
			dialog_tag_item "dev-libs/klibc \"`cat ${GENCROSS_TMPDIR}/VERSION`\" on";;
		uclibc)
			check_installed_version "sys-libs/uclibc" "VERSION"
			dialog_tag_item "sys-libs/uclibc \"`cat ${GENCROSS_TMPDIR}/VERSION`\" on";;
	esac
	# The following packages can be compiled successfully in the following target:
	# i386-gentoo-linux-uclibc
	check_installed_version "sys-apps/baselayout-lite" "VERSION"
	dialog_tag_item "sys-apps/baselayout-lite \"`cat ${GENCROSS_TMPDIR}/VERSION`\" on"
	check_installed_version "sys-apps/busybox" "VERSION"
	dialog_tag_item "sys-apps/busybox \"`cat ${GENCROSS_TMPDIR}/VERSION`\" on"
	check_installed_version "net-misc/udhcp" "VERSION"
	dialog_tag_item "net-misc/udhcp \"`cat ${GENCROSS_TMPDIR}/VERSION`\" off"
	check_installed_version "net-misc/dropbear" "VERSION"
	dialog_tag_item "net-misc/dropbear \"`cat ${GENCROSS_TMPDIR}/VERSION`\" off"
	check_installed_version "www-client/lynx" "VERSION"
	dialog_tag_item "www-client/lynx \"`cat ${GENCROSS_TMPDIR}/VERSION`\" off"
	check_installed_version "net-irc/scrollz" "VERSION"
	dialog_tag_item "net-irc/scrollz \"`cat ${GENCROSS_TMPDIR}/VERSION`\" off"
	check_installed_version "sys-apps/net-tools" "VERSION"
	dialog_tag_item "sys-apps/net-tools \"`cat ${GENCROSS_TMPDIR}/VERSION`\" off"
	check_installed_version "net-misc/iputils" "VERSION"
	dialog_tag_item "net-misc/iputils \"`cat ${GENCROSS_TMPDIR}/VERSION`\" off"
#	check_installed_version "app-misc/screen" "VERSION"
#	dialog_tag_item "app-misc/screen \"`cat ${GENCROSS_TMPDIR}/VERSION`\" off"
#	check_installed_version "sys-apps/coreutils" "VERSION"
#	dialog_tag_item "sys-apps/coreutils \"`cat ${GENCROSS_TMPDIR}/VERSION`\" off"
#	check_installed_version "app-shells/bash" "VERSION"
#	dialog_tag_item "app-shells/bash \"`cat ${GENCROSS_TMPDIR}/VERSION`\" off"
#	dialog_tag_item "system \"\" off"
	#check_installed_version "sys-libs/glibc" "VERSION"
	#dialog_tag_item " \"`cat ${GENCROSS_TMPDIR}/VERSION`\" off"
	dialog_save_output "PACKAGES"
	dialog_launch

	parse_and_install `cat ${GENCROSS_TMPDIR}/PACKAGES`
	config_rootfs
}

install_kernel() {
	# Install kernel with respect to /
	ROOT=/
	dialog_init "Select Kernel"
	dialog_menu "Please select a kernel for\n${CTARGET}" 14 45 6
	check_installed_version "sys-kernel/gentoo-sources" "VERSION"
	dialog_tag_item "gentoo-sources \"`cat ${GENCROSS_TMPDIR}/VERSION`\""
	check_installed_version "sys-kernel/hppa-sources" "VERSION"
	dialog_tag_item "hppa-sources \"`cat ${GENCROSS_TMPDIR}/VERSION`\""
	check_installed_version "sys-kernel/mips-sources" "VERSION"
	dialog_tag_item "mips-sources \"`cat ${GENCROSS_TMPDIR}/VERSION`\""
	check_installed_version "sys-kernel/sh-sources" "VERSION"
	dialog_tag_item "sh-sources \"`cat ${GENCROSS_TMPDIR}/VERSION`\""
	check_installed_version "sys-kernel/sparc-sources" "VERSION"
	dialog_tag_item "sparc-sources \"`cat ${GENCROSS_TMPDIR}/VERSION`\""
	check_installed_version "sys-kernel/vanilla-sources" "VERSION"
	dialog_tag_item "vanilla-sources \"`cat ${GENCROSS_TMPDIR}/VERSION`\""
	dialog_save_output "KERNEL"
	dialog_launch
	# Check the version of selected kernel source
	check_installed_version "sys-kernel/`cat ${GENCROSS_TMPDIR}/KERNEL`" "VERSION"
	# Recover ${ROOT}
	ROOT=${SYSROOT}/genroot/rootfs

	if [ `cat ${GENCROSS_TMPDIR}/VERSION` != "N/A" ] ; then
		# The kernel is installed
		# Ask users whether to install anyway
		dialog_init "Already Installed"
		dialog_extraopts "--defaultno"
		dialog_yesno "\nSources: sys-kernel/`cat ${GENCROSS_TMPDIR}/KERNEL`\nVersion: `cat ${GENCROSS_TMPDIR}/VERSION`\n\nDo you want to install anyway?" 10 40
		dialog_launch
		if [ $? = "0" ] ; then
			# Users choose to re-merge the kernel
			clear
			#${GENMERGE} --root / -av `cat ${GENCROSS_TMPDIR}/KERNEL`
			USE="symlink -doc" emerge -av `cat ${GENCROSS_TMPDIR}/KERNEL`
		fi
	else
		# The kernerl is not installed
		# Install it now!
		clear
		#${GENMERGE} --root / -av `cat ${GENCROSS_TMPDIR}/KERNEL`
		USE="symlink -doc" emerge -av `cat ${GENCROSS_TMPDIR}/KERNEL`
	fi
}

manipulate_kernel() {
	ROOT=${SYSROOT}/genroot/rootfs
	cd /usr/src/linux
	if [ $? != "0" ] ; then
		dialog_init "Cannot Enter Kernel Dir"
		dialog_msgbox "\nCannot Enter Kernel Directory\n/usr/src/linux\n" 8 35
		dialog_launch
	fi
	case ${1} in
		config)
			if [ -f ${SYSROOT}/genroot/config_${CTARGET} ] ; then
				if [ ! -f /usr/src/linux/.config ] ; then
					dialog_init "Restore Configuration"
					dialog_extraopts "--defaultno"
					dialog_yesno "\nDo you want to restore kernel configuration from\n${SYSROOT}/genroot?" 8 52
					dialog_launch
					[ $? = "0" ] && cp ${SYSROOT}/genroot/config_${CTARGET} /usr/src/linux/.config
				fi
			fi
			${GENMAKE} menuconfig
			if [ -f "/usr/src/linux/.config" ] ; then
				dialog_init "Backup Configuration"
				dialog_extraopts "--defaultno"
				dialog_yesno "\nDo you want to copy kernel configuration to\n${SYSROOT}/genroot?" 8 48
				dialog_launch
				[ $? = "0" ] && cp /usr/src/linux/.config ${SYSROOT}/genroot/config_${CTARGET}
			fi
			;;
		compile)
			rm -f /usr/src/linux/usr/.initramfs_*
			rm -f .built-in.o.cmd .gen_init_cpio.cmd
			rm -f built-in.o gen_init_cpio initramfs_data.cpio.gz initramfs_data.o
			${GENMAKE}
			echo; echo "Build End"; echo "Press <Enter> to continue"; read
			;;
		insmod)
			[ -d "${ROOT}/lib/modules" ] && rm -rf ${ROOT}/lib/modules
			${GENMAKE} modules_install
			echo; echo "Installation End"; echo "Press <Enter> to continue"; read
			;;
		image)
			dialog_init "Build Image"
			dialog_extraopts "--defaultno"
			dialog_yesno "Please enable initramfs (Device Drivers->Block Devices) and \nSpecify rootfs directory (General setup, default rootfs: \n${SYSROOT}/genroot/rootfs)\nPS: only 2.6 kernel support initramfs\n\nDo you want to proceed to build the image?" 10 65
			dialog_launch
			[ $? != "0" ] && return
			rm -f /usr/src/linux/usr/.initramfs_*
			rm -f .built-in.o.cmd .gen_init_cpio.cmd
			rm -f built-in.o gen_init_cpio initramfs_data.cpio.gz initramfs_data.o
			${GENMAKE}
			[ -d "${ROOT}/lib/modules" ] && rm -rf ${ROOT}/lib/modules
			${GENMAKE} modules_install
			rm -f /usr/src/linux/usr/.initramfs_*
			rm -f .built-in.o.cmd .gen_init_cpio.cmd
			rm -f built-in.o gen_init_cpio initramfs_data.cpio.gz initramfs_data.o
			${GENMAKE}
			echo; echo "Build End"; echo "Press <Enter> to continue"; read
			;;
	esac
}

toolchain_kernel() {
	# Select a toolchain to configure.
	select_toolchain
	# "No toolchain select" || "No existing toolchain"
	[ -z ${TOOLCHAIN} ] && return

	CTARGET=${TOOLCHAIN}
	SYSROOT=/usr/${CTARGET}
	ROOT=${SYSROOT}/genroot/rootfs
	[ -d ${ROOT} ] || mkdir -p ${ROOT}
	PORTAGE_CONFIGROOT=${SYSROOT}
	GENMERGE="/usr/${CTARGET}/genroot/xmerge_${CTARGET}"
	GENMAKE="/usr/${CTARGET}/genroot/xkmake_${CTARGET}"

	local DEFAULTITEM="2"
	while [ 1 ] ; do
		dialog_init "Operation on Kernel"
		dialog_extraopts "--default-item ${DEFAULTITEM}"
		dialog_menu "What do you want to do?" 12 50 5
		dialog_tag_item "1 \"Install Kernel\""
		dialog_tag_item "2 \"Configure Kernel\""
		dialog_tag_item "3 \"Compile Kernel and Modules\""
		dialog_tag_item "4 \"Install Modules to Rootfs\""
		dialog_tag_item "5 \"Build a single image (Kernel+Rootfs)\""
		dialog_save_output "ANS"
		dialog_launch

		case `cat ${GENCROSS_TMPDIR}/ANS` in
			1) DEFAULTITEM="1"; install_kernel;;
			2) DEFAULTITEM="2"; manipulate_kernel "config" ;;
			3) DEFAULTITEM="3"; manipulate_kernel "compile";;
			4) DEFAULTITEM="4"; manipulate_kernel "insmod" ;;
			5) DEFAULTITEM="5"; manipulate_kernel "image"  ;;
			*) return;;
		esac
	done
}

main_menu() {
	check_portage_overlay
	local DFTITEM=Build
	while [ 1 ] ; do
		# Launch main menu (main box)
		dialog_init "Main Menu"
		dialog_extraopts "--cancel-label \"Exit\" --default-item \"${DFTITEM}\""
		dialog_menu "What do you want to do?" 12 55 5
		dialog_tag_item "Build \"Build a toolchain\""
		dialog_tag_item "Remove \"Remove a toolchain\""
		dialog_tag_item "Config \"Config a toolchain\""
		dialog_tag_item "Package \"select a toolchain to build package\""
		dialog_tag_item "Kernel \"select a toolchain to build kernel\""
		dialog_save_output "ANS"
		dialog_launch

		local ANS=`cat ${GENCROSS_TMPDIR}/ANS`
		case ${ANS} in
			Build)   DFTITEM=Build   ; build_toolchain        ;;
			Remove)  DFTITEM=Remove  ; remove_toolchain       ;;
			Config)  DFTITEM=Config  ; config_toolchain "yes" ;;
			Package) DFTITEM=Package ; toolchain_package      ;;
			Kernel)  DFTITEM=Kernel  ; toolchain_kernel       ;;
			*) exit 0 ;;
		esac
	done
}

[ -d ${GENCROSS_TMPDIR} ] && rm -rf ${GENCROSS_TMPDIR}
mkdir -p ${GENCROSS_TMPDIR}

main_menu

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-09-23 16:29 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-09-22 22:20 [gentoo-embedded] bash script for building toolchain and images using crossdev Siong-Ui Te
  -- strict thread matches above, loose matches on Subject: below --
2006-09-23 16:28 Siong-Ui Te

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox