Menu

[r10367]: / branches / 8.0.1 / nanobsd / common  Maximize  Restore  History

Download this file

356 lines (320 with data), 10.6 kB

# $FreeBSD$

#-
# Copyright (c) 2010, 2011 iXsystems, Inc., All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL Jordan Hubbard OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
#
# This file is heavily derived from both Sam Leffler's Avilia config,
# as well as the BSDRP project's config file.  Neither of these have
# an explicit copyright/license statement, but are implicitly BSDL.
#

NANO_PMAKE="make -j8"					# NB: disable -j 3

# Where cust_pkg() finds packages to install
#XXX: Is this the right place?
NANO_PORTS=${NANO_SRC}/../ports
NANO_PACKAGE_DIR=${NANO_SRC}/${NANO_TOOLS}/Pkg
NANO_DATADIR=${NANO_OBJ}/_.data
NANO_DATASIZE=40960
NANO_INIT_IMG2=0
unset MAKEOBJDIRPREFIX

# Python version needs to be known when we are picking port vs package.  However,
# we've not yet created the make.conf.build file, nor setup things so that the nano
# vars for that are even defined.  To cope, export this globally.  We may be able
# to remove it from make.conf.build, but it doesn't hurt to have it there and
# may help.
export PYTHON_DEFAULT_VERSION=python2.7

# Defeat the python auto versioning goo that contaminates the build slightly
# with the host's python version rather than the version that's inside the
# port tree we're building.  We do this by adding PYTHON_CMD=/bin/true to the
# make package-name invocation.
PKGNAME_HACK=PYTHON_CMD=/bin/true

# this to go into nanobsd.sh
NANO_PORTS=${NANO_PORTS:-/usr/ports}

customize_cmd cust_allow_ssh_root

add_etc_make_conf()
{
	touch ${NANO_WORLDDIR}/etc/make.conf
}
customize_cmd add_etc_make_conf

clean_usr_local()
{
	LOCAL_DIR=${NANO_WORLDDIR}/usr/local
	pprint 2 "Clean and create world directory (${LOCAL_DIR})"
	if rm -rf ${LOCAL_DIR}/ > /dev/null 2>&1 ; then
		true
	else
		chflags -R noschg ${LOCAL_DIR}/
		rm -rf ${LOCAL_DIR}/
	fi
	for f in bin etc lib libdata libexec sbin share; do
		mkdir -p ${LOCAL_DIR}/$f
	done
}
customize_cmd clean_usr_local

cust_install_machine_files()
{
	echo "cd ${NANO_CFG_BASE}/Files"
	cd ${NANO_CFG_BASE}/Files
	find . -print | grep -Ev '/(CVS|\.svn)' | cpio -dumpv ${NANO_WORLDDIR}
}
customize_cmd cust_install_files
customize_cmd cust_install_machine_files 

buildenv()
{
	cd ${NANO_SRC}
	env __MAKE_CONF=${NANO_MAKE_CONF_BUILD} DESTDIR=${NANO_WORLDDIR} make buildenv
}

NANO_MAKEFS="makefs -B big \
	-o bsize=4096,fsize=512,density=8192,optimization=space"
export NANO_MAKEFS

# NB: leave c++ enabled so devd can be built
CONF_BUILD="
WITHOUT_ACPI=true
WITHOUT_ATM=true
WITHOUT_AUDIT=true
WITHOUT_BIND_DNSSEC=true
WITHOUT_BIND_ETC=true
WITHOUT_BIND_LIBS_LWRES=true
WITHOUT_BLUETOOTH=true
WITHOUT_CALENDAR=true
WITHOUT_CVS=true
WITHOUT_DICT=true
WITHOUT_EXAMPLES=true
WITHOUT_FORTRAN=true
WITHOUT_GAMES=true
WITHOUT_GCOV=true
WITHOUT_GPIB=true
WITHOUT_HTML=true
WITHOUT_I4B=true
WITHOUT_IPFILTER=true
WITHOUT_IPX=true
WITHOUT_LIBKSE=true
WITHOUT_LOCALES=true
WITHOUT_LPR=true
WITHOUT_MAN=true
WITHOUT_NIS=true
WITHOUT_NLS=true
WITHOUT_NS_CACHING=true
WITHOUT_OBJC=true
WITHOUT_PROFILE=true
WITHOUT_RCMDS=true
WITHOUT_SENDMAIL=true
WITHOUT_SHAREDOCS=true
WITHOUT_SSP=true
WITHOUT_SYSCONS=true
WITHOUT_SYSINSTALL=true
WITHOUT_LIB32=true
PYTHON_DEFAULT_VERSION=python2.7
"
CONF_INSTALL="$CONF_BUILD
INSTALL_NODEBUG=t
NOPORTDOCS=t
NO_INSTALL_MANPAGES=t
"
# The following would help...
# WITHOUT_TOOLCHAIN=true		can't build ports
# WITHOUT_INSTALLLIB=true		libgcc.a
#
# from the build
# WITHOUT_INFO=true			makeinfo
# WITHOUT_RCS=true
PKG_ONLY_MAKE_CONF="
WITHOUT_TOOLCHAIN=true
WITHOUT_INSTALLLIB=true
WITHOUT_INFO=true
WITHOUT_RCS=true
"

NANO_PACKAGE_ONLY=1

CR()
{
	chroot ${NANO_WORLDDIR} /bin/sh -exc "$*"
}

# install a package from a pre-built binary
do_add_pkg ()
{
	# Need to create ${NANO_OBJ}/ports in this add_pkg_${port} function
	set -x
	mkdir -p ${NANO_OBJ}/ports/distfiles
	mkdir -p ${NANO_OBJ}/ports/packages
	mkdir -p ${NANO_WORLDDIR}/usr/ports/packages
	mkdir -p ${NANO_WORLDDIR}/usr/ports/distfiles
	mount -t nullfs -o noatime ${NANO_OBJ}/ports/packages \
	    ${NANO_WORLDDIR}/usr/ports/packages
	mount -t nullfs -o noatime ${NANO_OBJ}/ports/distfiles \
	    ${NANO_WORLDDIR}/usr/ports/distfiles
	CR "cd /usr/ports/packages/All;pkg_add -F $1.tbz"
	umount ${NANO_WORLDDIR}/usr/ports/distfiles
	umount ${NANO_WORLDDIR}/usr/ports/packages
	rmdir ${NANO_WORLDDIR}/usr/ports/packages
	rmdir ${NANO_WORLDDIR}/usr/ports/distfiles
	rmdir ${NANO_WORLDDIR}/usr/ports
	set +x
}

# Build a port (with the side effect of creating a package)
do_add_port ()
{
	local port_path
	port_path=$1
	shift
	set -x
	# Need to create ${NANO_OBJ}/ports in this add_port_${port} function
	mkdir -p ${NANO_OBJ}/ports/distfiles
	mkdir -p ${NANO_OBJ}/ports/packages
	mkdir -p ${NANO_PORTS}/packages
	mkdir -p ${NANO_PORTS}/distfiles
	mkdir -p ${NANO_WORLDDIR}/usr/src
	mkdir -p ${NANO_WORLDDIR}/usr/ports
      	mount -t nullfs -o noatime ${NANO_SRC} ${NANO_WORLDDIR}/usr/src
	mount -t nullfs -o noatime ${NANO_PORTS} ${NANO_WORLDDIR}/usr/ports
	mount -t nullfs -o noatime ${NANO_OBJ}/ports/packages \
	    ${NANO_WORLDDIR}/usr/ports/packages
	mount -t nullfs -o noatime ${NANO_OBJ}/ports/distfiles \
	    ${NANO_WORLDDIR}/usr/ports/distfiles
	mkdir -p ${NANO_WORLDDIR}/dev
	mount -t devfs devfs ${NANO_WORLDDIR}/dev
	mkdir -p ${NANO_WORLDDIR}/usr/workdir
	cp /etc/resolv.conf ${NANO_WORLDDIR}/etc/resolv.conf
# Improvement: Don't know why package-recursive don't works here
	CR "env UNAME_p=${NANO_ARCH} TARGET=${NANO_ARCH} \
	    TARGET_ARCH=${NANO_ARCH} make \
	    __MAKE_CONF=${NANO_MAKE_CONF_BUILD} \
	    WRKDIRPREFIX=/usr/workdir -C /usr/ports/$port_path \
	    package BATCH=yes $* clean FORCE_PKG_REGISTER=t"
	rm ${NANO_WORLDDIR}/etc/resolv.conf
	rm -rf ${NANO_WORLDDIR}/usr/obj
	rm -rf ${NANO_WORLDDIR}/usr/workdir
	umount ${NANO_WORLDDIR}/dev
	umount ${NANO_WORLDDIR}/usr/ports/packages
	umount ${NANO_WORLDDIR}/usr/ports/distfiles
	umount ${NANO_WORLDDIR}/usr/ports
	umount ${NANO_WORLDDIR}/usr/src
	set +x
}

# Need to check if this function works with cross-compiling architecture!!!!
# Recursive complex fonction: Generate one function for each ports
#
# Note: most nano variables aren't set yet, especially NANO_MAKE_CONF_BUILD, so
# we can't use that here.  Instead, use no MAKE_CONF to avoid host contamination.
add_port () {
    local port_path=$1
    local port=`echo $1 | sed -e 's/\//_/'`
    shift
    # Check if package already exist
    # Need to:
    # 1. check ARCH of this package!
    # 2. Add a trap
    cd ${NANO_PORTS}/${port_path}
    PKG_NAME=`make ${PKGNAME_HACK} PORTSDIR=${NANO_PORTS} __MAKE_CONF= package-name` 
    if [ -f ${NANO_OBJ}/ports/packages/All/${PKG_NAME}.tbz ]; then
	# Pkg file found: Generate add_pkg_NAME function
	eval "
	    add_pkg_${port} () {
	        do_add_pkg ${PKG_NAME}
	    }
            customize_cmd add_pkg_${port}
            "
    else
	# No pkg file: Generate add_port_NAME function
	echo "Package is not yet built: $port"
        eval "
            add_port_${port} () {
	        do_add_port ${port_path} $*
	    }
	    customize_cmd add_port_${port}
	"
	NANO_PACKAGE_ONLY=0
    fi
}

die()
{
	echo "$*"
	exit 1
}

create_amd64_diskimage()
{
	create_i386_diskimage "$*"
}

compress_ko()
{
	if [ -f ${NANO_WORLDDIR}/boot/kernel/$1 ]
	then
		gzip -v9 ${NANO_WORLDDIR}/boot/kernel/$1
	fi
}

freenas_custom()
{
	# Compress the kernel and preloaded modules
	compress_ko kernel
	compress_ko geom_mirror.ko
	compress_ko geom_stripe.ko
	compress_ko geom_raid3.ko
	compress_ko geom_gate.ko
	compress_ko ntfs.ko
	compress_ko smbfs.ko

	# kill docs (saves 22MB)
	rm -rf ${NANO_WORLDDIR}/usr/local/share/doc

	# and info (2MB)
	rm -rf ${NANO_WORLDDIR}/usr/local/info

	# and man pages (4.4MB)
	rm -rf ${NANO_WORLDDIR}/usr/local/man

	# and examples (1.7M)
	rm -rf ${NANO_WORLDDIR}/usr/local/share/examples

	# and groff_fonts junk (3MB)
	rm -rf ${NANO_WORLDDIR}/usr/share/groff_font
	rm -rf ${NANO_WORLDDIR}/usr/share/tmac
	rm -rf ${NANO_WORLDDIR}/usr/share/me

	# Perl seems to be needed for build, but nothing after the
	# build.  cope with bad dependencies (or misunderstood) and
	# blow it away (saves 43MB)
	if [ ! "${DEBUG}" -eq "1" ]; then
		rm -rf ${NANO_WORLDDIR}/usr/local/lib/perl5
	fi


	# Kill all .a's that are installed (15MB)
	find ${NANO_WORLDDIR} -name \*.a -delete

	# magic.mgc is just a speed optimization.  Kill it for 1.7MB
	rm -f ${NANO_WORLDDIR}/usr/share/misc/magic.mgc

	# strip binaries for ports (saves 10MB)
	(strip ${NANO_WORLDDIR}/usr/local/*bin/* > /dev/null 2>&1) || true

	# Last second tweaks
	chown -R root:wheel ${NANO_WORLDDIR}/root
	chmod 0755 ${NANO_WORLDDIR}/root/*
	chmod 0755 ${NANO_WORLDDIR}/*
	chown -R root:wheel ${NANO_WORLDDIR}/etc
	chown -R root:wheel ${NANO_WORLDDIR}/boot
	chown root:wheel ${NANO_WORLDDIR}/
	chown root:wheel ${NANO_WORLDDIR}/usr
        find ${NANO_WORLDDIR} -type f -name "*~" -delete
        find ${NANO_WORLDDIR}/usr/local -type f -name "*.po" -delete
	mkdir ${NANO_WORLDDIR}/data/zfs
        ln -s /usr/local/bin/bash ${NANO_WORLDDIR}/bin/bash
	ln -s /data/zfs/zpool.cache ${NANO_WORLDDIR}/boot/zfs/zpool.cache
	mv ${NANO_WORLDDIR}/sbin/mount_ntfs ${NANO_WORLDDIR}/sbin/mount_ntfs-kern
	ln -s /usr/sbin/mount_ntfs-fuse ${NANO_WORLDDIR}/sbin/mount_ntfs
}
late_customize_cmd freenas_custom

__a=`mount | grep ${NANO_OBJ}/ | awk '{print length($3), $3;}' | sort -rn | awk '{$1=""; print;}'`
if [ -n "$__a" ]; then
    echo "unmounting $__a"
    umount $__a
fi

NANO_BOOTLOADER="boot/boot0"
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.