diff -rpuN genkernel/gen_compile.sh genkernel-unionfscb/gen_compile.sh --- genkernel/gen_compile.sh 2006-11-10 02:12:54.000000000 -0500 +++ genkernel-unionfscb/gen_compile.sh 2006-11-22 19:44:29.000000000 -0500 @@ -1,5 +1,7 @@ #!/bin/bash +. gen_unionfs_helpers.sh + compile_kernel_args() { local ARGS @@ -318,95 +320,29 @@ } compile_unionfs_modules() { + # This sets ${UNIONFS_VERSION} to the correct value. + get_unionfs_version + UNIONFS_MODULES_BINCACHE=${UNIONFS_MODULES_BINCACHE/UNIONFS_VER/${UNIONFS_VERSION}} + UNIONFS_BINCACHE=${UNIONFS_BINCACHE/UNIONFS_VER/${UNIONFS_VERSION}} + # subsitute source tarball here. + # the user can override this functionality by changing + # ${UNIONFS_SRCTAR} in /etc/genkernel.conf. genkernel can + # print a warning if the two versions do not match. + UNIONFS_SRCTAR=${UNIONFS_SRCTAR/UNIONFS_VER/${UNIONFS_VERSION}} + UNIONFS_DIR="unionfs-${UNIONFS_VERSION}" if [ ! -f "${UNIONFS_MODULES_BINCACHE}" ] then - [ -f "${UNIONFS_SRCTAR}" ] || - gen_die "Could not find unionfs source tarball: ${UNIONFS_SRCTAR}!" - cd "${TEMP}" - rm -rf ${UNIONFS_DIR} > /dev/null - rm -rf unionfs > /dev/null - mkdir -p unionfs - /bin/tar -zxpf ${UNIONFS_SRCTAR} || - gen_die 'Could not extract unionfs source tarball!' - [ -d "${UNIONFS_DIR}" ] || - gen_die 'Unionfs directory ${UNIONFS_DIR} is invalid!' - cd "${UNIONFS_DIR}" - print_info 1 'unionfs modules: >> Compiling...' - echo "LINUXSRC=${KERNEL_DIR}" >> fistdev.mk - echo 'TOPINC=-I$(LINUXSRC)/include' >> fistdev.mk - echo "MODDIR= /lib/modules/${KV}" >> fistdev.mk - echo "KERNELVERSION=${KV}" >> fistdev.mk - # Fix for hardened/selinux systems to have extened attributes - # per r2d2's request. Also add -DUNIONFS_UNSUPPORTED for 2.6.16 - echo "EXTRACFLAGS=-DUNIONFS_XATTR -DFIST_SETXATTR_CONSTVOID -DUNIONFS_UNSUPPORTED" \ - >> fistdev.mk - # Here we do something really nasty and disable debugging, along with - # change our default CFLAGS - echo "UNIONFS_DEBUG_CFLAG=-DUNIONFS_NDEBUG" >> fistdev.mk - echo "UNIONFS_OPT_CFLAG= -O2 -pipe" >> fistdev.mk - - if [ "${PAT}" -ge '6' ] - then - cd "${TEMP}" - cd "${UNIONFS_DIR}" - # Compile unionfs module within the unionfs - # environment not within the kernelsrc dir - make unionfs.ko || gen_die 'failed to compile unionfs' - else - gen_die 'unionfs is only supported on 2.6 targets' - fi - print_info 1 'unionfs: >> Copying to cache...' - - mkdir -p ${TEMP}/unionfs/lib/modules/${KV}/kernel/fs/unionfs - - if [ -f unionfs.ko ] - then - cp -f unionfs.ko ${TEMP}/unionfs/lib/modules/${KV}/kernel/fs/unionfs - else - cp -f unionfs.o ${TEMP}/unionfs/lib/modules/${KV}/kernel/fs/unionfs - fi - - cd ${TEMP}/unionfs - /bin/tar -cjf "${UNIONFS_MODULES_BINCACHE}" . || - gen_die 'Could not create unionfs modules binary cache' - - cd "${TEMP}" - rm -rf "${UNIONFS_DIR}" > /dev/null - rm -rf unionfs > /dev/null + print_info 1 "UNIONFS: ${UNIONFS_VERSION} ${UNIONFS_SRCTAR}" + print_info 1 "UNIONFS callback: ${UNIONFS_COMPILE_FUNC}" + ${UNIONFS_COMPILE_FUNC} fi } compile_unionfs_utils() { if [ ! -f "${UNIONFS_BINCACHE}" ] then - [ -f "${UNIONFS_SRCTAR}" ] || - gen_die "Could not find unionfs source tarball: ${UNIONFS_SRCTAR}!" - cd "${TEMP}" - rm -rf ${UNIONFS_DIR} > /dev/null - rm -rf unionfs > /dev/null - mkdir -p unionfs/sbin - /bin/tar -zxpf ${UNIONFS_SRCTAR} || - gen_die 'Could not extract unionfs source tarball!' - [ -d "${UNIONFS_DIR}" ] || - gen_die 'Unionfs directory ${UNIONFS_DIR} is invalid!' - cd "${UNIONFS_DIR}" - print_info 1 'unionfs tools: >> Compiling...' - sed -i Makefile -e 's|${CC} -o|${CC} -static -o|g' - compile_generic utils utils - - print_info 1 'unionfs: >> Copying to cache...' - strip uniondbg unionctl - cp uniondbg ${TEMP}/unionfs/sbin/ || - gen_die 'Could not copy the uniondbg binary to the tmp directory' - cp unionctl ${TEMP}/unionfs/sbin/ || - gen_die 'Could not copy the unionctl binary to the tmp directory' - cd ${TEMP}/unionfs - /bin/tar -cjf "${UNIONFS_BINCACHE}" . || - gen_die 'Could not create unionfs tools binary cache' - - cd "${TEMP}" - rm -rf "${UNIONFS_DIR}" > /dev/null - rm -rf unionfs > /dev/null + print_info 1 "unionfs tools callback: ${UNIONFS_COMPILE_UTILS_FUNC}" + ${UNIONFS_COMPILE_UTILS_FUNC} fi } diff -urpN genkernel/gen_unionfs_helpers.sh genkernel-unionfscb/gen_unionfs_helpers.sh --- genkernel/gen_unionfs_helpers.sh 1969-12-31 19:00:00.000000000 -0500 +++ genkernel-unionfscb/gen_unionfs_helpers.sh 2006-11-22 19:45:16.000000000 -0500 @@ -0,0 +1,297 @@ +#!/bin/bash +# Daniel Casimiro +# + +# Emulates: hash[key]=value +# * This function is from: +# http://tldp.org/LDP/abs/html/contributed-scripts.html#HASHLIB +# +# Params: +# 1 - hash +# 2 - key +# 3 - value +function hash_set { + eval "${Hash_config_varname_prefix}${1}_${2}=\"${3}\"" +} + +# Emulates something similar to: +# foreach($hash as $key => $value) { fun($key,$value); } +# * This function is from: +# http://tldp.org/LDP/abs/html/contributed-scripts.html#HASHLIB +# +# It is possible to write different variations of this function. +# Here we use a function call to make it as "generic" as possible. +# +# Params: +# 1 - hash +# 2 - function name +function hash_foreach { + local keyname oldIFS="$IFS" + IFS=' ' + for i in $(eval "echo \${!${Hash_config_varname_prefix}${1}_*}"); do + keyname=$(eval "echo \${i##${Hash_config_varname_prefix}${1}_}") + eval "$2 $keyname \"\$$i\"" + done + IFS="$oldIFS" +} + +# UnionFS requires different versions for different kernels. +# This list is as of 27 October 2006. +# Kernel Version Compatibility: +# Kernel Version Unionfs Version +# 2.4.x (x>19) 1.0.14 +# 2.6.x (x<9) Not Supported +# 2.6.9 - 2.6.15 1.1.5 +# 2.6.16 1.2 +# 2.6.17 1.3 +# 2.6.18 1.4 +# 2.6.newer CVS Snapshots + +# $1 unionfs version +# $2 kernel version regular expression +test_unionfs_version() { + MYKV=`expr match "${KV}" $2` + # this test can be improved... + if [ ${MYKV} -gt 0 ]; then + # The keys cannot contain '.', so underscores are substituted here. + UNIONFS_VERSION=${1//_/.} + fi +} + +# set kernel versions regular expressions and unionfs versions in config file +# build a hash that maps kernel version re's to unionfs version +# for each hash key, use the value when the key regular expression evals +# true when compared to ${BASEKV} +get_unionfs_version() { + # Do not support 2.4 kernels yet; just need another RE. + # The hash is hard coded here, but it could be built from variables defined + # in /etc/genkernel.conf + hash_set unionfsversions 1_1_5 "2\.6\.\(\<1[0-5]\>\|9\)" + hash_set unionfsversions 1_2 "2\.6\.16" + hash_set unionfsversions 1_3 "2\.6\.17" + hash_set unionfsversions 1_4 "2\.6\.18" + + # Unset the UNIONFS_VERSION that was set in /etc/genkernel.conf + # This function could check if the variable is set, and then break + # Or, it could use a different variable name + UNIONFS_VERSION= + hash_foreach unionfsversions test_unionfs_version + + if [ -z ${UNIONFS_VERSION} ]; then + gen_die "${KV} is an invalid kernel for UNIONFS!" + fi + + tmpunion=${UNIONFS_VERSION//./_} + UNIONFS_COMPILE_FUNC=compile_unionfs_modules_${tmpunion:0:3} + UNIONFS_COMPILE_UTILS_FUNC=compile_unionfs_utils_${tmpunion:0:3} +} + +compile_unionfs_modules_1_1() { + [ -f "${UNIONFS_SRCTAR}" ] || + gen_die "Could not find unionfs source tarball: ${UNIONFS_SRCTAR}!" + + cd "${TEMP}" + rm -rf ${UNIONFS_DIR} > /dev/null + rm -rf unionfs > /dev/null + mkdir -p unionfs + /bin/tar -zxpf ${UNIONFS_SRCTAR} || + gen_die 'Could not extract unionfs source tarball!' + + [ -d "${UNIONFS_DIR}" ] || + gen_die 'Unionfs directory ${UNIONFS_DIR} is invalid!' + cd "${UNIONFS_DIR}" + print_info 1 'unionfs modules: >> Compiling...' + echo "LINUXSRC=${KERNEL_DIR}" >> fistdev.mk + echo 'TOPINC=-I$(LINUXSRC)/include' >> fistdev.mk + echo "MODDIR= /lib/modules/${KV}" >> fistdev.mk + echo "KERNELVERSION=${KV}" >> fistdev.mk + # Fix for hardened/selinux systems to have extened attributes + # per r2d2's request. Also add -DUNIONFS_UNSUPPORTED for 2.6.16 + echo "EXTRACFLAGS=-DUNIONFS_XATTR -DFIST_SETXATTR_CONSTVOID -DUNIONFS_UNSUPPORTED" \ + >> fistdev.mk + # Here we do something really nasty and disable debugging, along with + # change our default CFLAGS + echo "UNIONFS_DEBUG_CFLAG=-DUNIONFS_NDEBUG" >> fistdev.mk + echo "UNIONFS_OPT_CFLAG= -O2 -pipe" >> fistdev.mk + + if [ "${PAT}" -ge '6' ] + then + cd "${TEMP}" + cd "${UNIONFS_DIR}" + sed -i Makefile -e 's|-Werror||g' + # Compile unionfs module within the unionfs + # environment not within the kernelsrc dir + make unionfs.ko || gen_die 'failed to compile unionfs' + else + gen_die 'unionfs is only supported on 2.6 targets' + fi + print_info 1 'unionfs: >> Copying to cache...' + + mkdir -p ${TEMP}/unionfs/lib/modules/${KV}/kernel/fs/unionfs + + if [ -f unionfs.ko ] + then + cp -f unionfs.ko ${TEMP}/unionfs/lib/modules/${KV}/kernel/fs/unionfs + else + cp -f unionfs.o ${TEMP}/unionfs/lib/modules/${KV}/kernel/fs/unionfs + fi + + cd ${TEMP}/unionfs + /bin/tar -cjf "${UNIONFS_MODULES_BINCACHE}" . || + gen_die 'Could not create unionfs modules binary cache' + + cd "${TEMP}" + rm -rf "${UNIONFS_DIR}" > /dev/null + rm -rf unionfs > /dev/null +} + +compile_unionfs_modules_1_2() { + compile_unionfs_modules_1_1 +} + +compile_unionfs_modules_1_3() { + [ -f "${UNIONFS_SRCTAR}" ] || + gen_die "Could not find unionfs source tarball: ${UNIONFS_SRCTAR}!" + + cd "${TEMP}" + rm -rf ${UNIONFS_DIR} > /dev/null + rm -rf unionfs* > /dev/null + mkdir unionfs + /bin/tar xzpf ${UNIONFS_SRCTAR} || + gen_die 'Could not extract unionfs source tarball!' + + [ -d "${UNIONFS_DIR}" ] || + gen_die 'Unionfs directory ${UNIONFS_DIR} is invalid!' + cd "${UNIONFS_DIR}" + print_info 1 'unionfs modules: >> Compiling...' + echo "LINUXSRC=${KERNEL_DIR}" >> fistdev.mk + echo 'TOPINC=-I$(LINUXSRC)/include' >> fistdev.mk + echo "MODDIR= /lib/modules/${KV}" >> fistdev.mk + echo "KVERS=${KV}" >> fistdev.mk + echo "KERNELVERSION=${KV}" >> fistdev.mk + # Fix for hardened/selinux systems to have extened attributes + # per r2d2's request. Also add -DUNIONFS_UNSUPPORTED for 2.6.16 + echo "EXTRACFLAGS=-DUNIONFS_XATTR -DFIST_SETXATTR_CONSTVOID -DUNIONFS_UNSUPPORTED" \ + >> fistdev.mk + # Here we do something really nasty and disable debugging, along with + # change our default CFLAGS + echo "UNIONFS_DEBUG_CFLAG=-DUNIONFS_NDEBUG" >> fistdev.mk + echo "UNIONFS_OPT_CFLAG= -O2 -pipe" >> fistdev.mk + + if [ "${PAT}" -ge '6' ] + then + # ARCH is used by unionfs - and conflicts with genkernel + ARCH_PUSH=${ARCH} + unset ARCH + #sed -i Makefile -e 's|-Werror||g' + # Compile unionfs module within the unionfs + # environment not within the kernelsrc dir + make unionfs.ko || gen_die 'failed to compile unionfs' + ARCH=${ARCH_PUSH} + else + gen_die 'unionfs is only supported on 2.6 targets' + fi + print_info 1 'unionfs: >> Copying to cache...' + + mkdir -p ${TEMP}/unionfs/lib/modules/${KV}/kernel/fs/unionfs + + if [ -f unionfs.ko ] + then + cp -f unionfs.ko ${TEMP}/unionfs/lib/modules/${KV}/kernel/fs/unionfs + else + cp -f unionfs.o ${TEMP}/unionfs/lib/modules/${KV}/kernel/fs/unionfs + fi + + cd ${TEMP}/unionfs + /bin/tar -cjf "${UNIONFS_MODULES_BINCACHE}" . || + gen_die 'Could not create unionfs modules binary cache' + + cd "${TEMP}" + rm -rf "${UNIONFS_DIR}" > /dev/null + rm -rf unionfs* > /dev/null +} + +compile_unionfs_modules_1_4() { + compile_unionfs_modules_1_3 +} + +# uniofs_utils +compile_unionfs_utils_1_1() { + if [ ! -f "${UNIONFS_BINCACHE}" ] + then + [ -f "${UNIONFS_SRCTAR}" ] || + gen_die "Could not find unionfs source tarball: ${UNIONFS_SRCTAR}!" + cd "${TEMP}" + rm -rf ${UNIONFS_DIR} > /dev/null + rm -rf unionfs > /dev/null + mkdir -p unionfs/sbin + /bin/tar -zxpf ${UNIONFS_SRCTAR} || + gen_die 'Could not extract unionfs source tarball!' + [ -d "${UNIONFS_DIR}" ] || + gen_die 'Unionfs directory ${UNIONFS_DIR} is invalid!' + cd "${UNIONFS_DIR}" + print_info 1 'unionfs tools: >> Compiling...' + sed -i Makefile -e 's|${CC} -o|${CC} -static -o|g' + compile_generic utils utils + + print_info 1 'unionfs: >> Copying to cache...' + strip uniondbg unionctl + cp uniondbg ${TEMP}/unionfs/sbin/ || + gen_die 'Could not copy the uniondbg binary to the tmp directory' + cp unionctl ${TEMP}/unionfs/sbin/ || + gen_die 'Could not copy the unionctl binary to the tmp directory' + cd ${TEMP}/unionfs + /bin/tar -cjf "${UNIONFS_BINCACHE}" . || + gen_die 'Could not create unionfs tools binary cache' + + cd "${TEMP}" + rm -rf "${UNIONFS_DIR}" > /dev/null + rm -rf unionfs > /dev/null + fi +} + +compile_unionfs_utils_1_2() { + compile_unionfs_utils_1_1 +} + +compile_unionfs_utils_1_3() { + if [ ! -f "${UNIONFS_BINCACHE}" ] + then + [ -f "${UNIONFS_SRCTAR}" ] || + gen_die "Could not find unionfs source tarball: ${UNIONFS_SRCTAR}!" + cd "${TEMP}" + rm -rf ${UNIONFS_DIR} > /dev/null + rm -rf unionfs > /dev/null + mkdir -p unionfs/sbin + /bin/tar -zxpf ${UNIONFS_SRCTAR} || + gen_die 'Could not extract unionfs source tarball!' + [ -d "${UNIONFS_DIR}" ] || + gen_die 'Unionfs directory ${UNIONFS_DIR} is invalid!' + cd "${UNIONFS_DIR}" + print_info 1 'unionfs tools: >> Compiling...' + sed -i utils/Makefile -e 's|${CC} -o|${CC} -static -o|g' + sed -i Makefile -e 's|${CC} -o|${CC} -static -o|g' + compile_generic utils utils + + print_info 1 'moving into utils directory...' + cd utils + + print_info 1 'unionfs: >> Copying to cache...' + strip uniondbg unionctl + cp uniondbg ${TEMP}/unionfs/sbin/ || + gen_die 'Could not copy the uniondbg binary to the tmp directory' + cp unionctl ${TEMP}/unionfs/sbin/ || + gen_die 'Could not copy the unionctl binary to the tmp directory' + cd ${TEMP}/unionfs + /bin/tar -cjf "${UNIONFS_BINCACHE}" . || + gen_die 'Could not create unionfs tools binary cache' + + cd "${TEMP}" + rm -rf "${UNIONFS_DIR}" > /dev/null + rm -rf unionfs > /dev/null + fi +} + +compile_unionfs_utils_1_4() { + compile_unionfs_utils_1_3 +}