1264656Simp# $FreeBSD$
2264656Simp
3264656Simp#-
4264656Simp# Copyright (c) 2014 Warner Losh. All Rights Reserved.
5264656Simp# Copyright (c) 2010 iXsystems, Inc., All rights reserved.
6264656Simp#
7264656Simp# Redistribution and use in source and binary forms, with or without
8264656Simp# modification, are permitted provided that the following conditions
9264656Simp# are met:
10264656Simp# 1. Redistributions of source code must retain the above copyright
11264656Simp#    notice, this list of conditions and the following disclaimer.
12264656Simp# 2. Redistributions in binary form must reproduce the above copyright
13264656Simp#    notice, this list of conditions and the following disclaimer in the
14264656Simp#    documentation and/or other materials provided with the distribution.
15264656Simp#
16264656Simp# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17264656Simp# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18264656Simp# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19264656Simp# ARE DISCLAIMED.  IN NO EVENT SHALL iXsystems, Inc OR CONTRIBUTORS BE LIABLE
20264656Simp# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21264656Simp# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22264656Simp# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23264656Simp# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24264656Simp# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25264656Simp# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26264656Simp# SUCH DAMAGE.
27264656Simp#
28264656Simp#
29264656Simp# This file is heavily derived from both Sam Leffler's Avilia config,
30264656Simp# as well as the BSDRP project's config file.  Neither of these have
31264656Simp# an explicit copyright/license statement, but are implicitly BSDL. This
32264656Simp# example has been taken from the FreeNAS project (an early version) and
33264656Simp# simplified to meet the needs of the example.
34264656Simp#
35264656Simp
36265166Simp# NB: You want the other file
37264656Simp
38265166SimpNANO_PMAKE="make -j $(sysctl -n hw.ncpu)"
39265166Simp
40264656SimpNANO_CFG_BASE=$(pwd)
41264656SimpNANO_CFG_BASE=${NANO_CFG_BASE%/dhcpd}
42264656SimpNANO_SRC=$(pwd)
43264656SimpNANO_SRC=${NANO_SRC%/tools/tools/nanobsd/dhcpd}
44264656SimpNANO_OBJ=${NANO_SRC}/../dhcpd/obj
45264656Simp# Where cust_pkg() finds packages to install
46264656Simp#XXX: Is this the right place?
47265166Simp#NANO_PORTS=$(realpath ${NANO_SRC}/../ports)
48265166SimpNANO_PORTS=/usr/ports
49264656SimpNANO_PACKAGE_DIR=${NANO_SRC}/${NANO_TOOLS}/Pkg
50264656SimpNANO_DATADIR=${NANO_OBJ}/_.data
51264656SimpNANO_DATASIZE=40960
52264656SimpNANO_INIT_IMG2=0
53264656Simpunset MAKEOBJDIRPREFIX
54264656Simp
55264656Simp# this to go into nanobsd.sh
56264656SimpNANO_PORTS=${NANO_PORTS:-/usr/ports}
57264656Simp
58264656Simpcustomize_cmd cust_allow_ssh_root
59264656Simp
60264656Simpadd_etc_make_conf()
61264656Simp{
62264656Simp	touch ${NANO_WORLDDIR}/etc/make.conf
63264656Simp}
64264656Simpcustomize_cmd add_etc_make_conf
65264656Simp
66264656Simpclean_usr_local()
67264656Simp{
68264656Simp	LOCAL_DIR=${NANO_WORLDDIR}/usr/local
69264656Simp	pprint 2 "Clean and create world directory (${LOCAL_DIR})"
70264656Simp	if rm -rf ${LOCAL_DIR}/ > /dev/null 2>&1 ; then
71264656Simp		true
72264656Simp	else
73264656Simp		chflags -R noschg ${LOCAL_DIR}/
74264656Simp		rm -rf ${LOCAL_DIR}/
75264656Simp	fi
76264656Simp	for f in bin etc lib libdata libexec sbin share; do
77264656Simp		mkdir -p ${LOCAL_DIR}/$f
78264656Simp	done
79264656Simp}
80264656Simpcustomize_cmd clean_usr_local
81264656Simp
82264656Simpcust_install_machine_files()
83264656Simp{
84264656Simp	echo "cd ${NANO_CFG_BASE}/Files"
85264656Simp	cd ${NANO_CFG_BASE}/Files
86264656Simp	find . -print | grep -Ev '/(CVS|\.svn)' | cpio -dumpv ${NANO_WORLDDIR}
87264656Simp}
88264656Simpcustomize_cmd cust_install_files
89264656Simpcustomize_cmd cust_install_machine_files 
90264656Simp
91264656Simpbuildenv()
92264656Simp{
93264656Simp	cd ${NANO_SRC}
94264656Simp	env __MAKE_CONF=${NANO_MAKE_CONF_BUILD} DESTDIR=${NANO_WORLDDIR} make buildenv
95264656Simp}
96264656Simp
97264656SimpNANO_MAKEFS="makefs -B big \
98264656Simp	-o bsize=4096,fsize=512,density=8192,optimization=space"
99264656Simpexport NANO_MAKEFS
100264656Simp
101264656Simp# NB: leave c++ enabled so devd can be built
102264656SimpCONF_BUILD="
103264656SimpWITHOUT_ACPI=true
104264656SimpWITHOUT_ATM=true
105264656SimpWITHOUT_AUDIT=true
106264656SimpWITHOUT_BIND_DNSSEC=true
107264656SimpWITHOUT_BIND_ETC=true
108264656SimpWITHOUT_BIND_LIBS_LWRES=true
109264656SimpWITHOUT_BLUETOOTH=true
110264656SimpWITHOUT_CALENDAR=true
111264656SimpWITHOUT_CVS=true
112264656SimpWITHOUT_DICT=true
113264656SimpWITHOUT_EXAMPLES=true
114264656SimpWITHOUT_FORTRAN=true
115264656SimpWITHOUT_GAMES=true
116264656SimpWITHOUT_GCOV=true
117264656SimpWITHOUT_GPIB=true
118264656SimpWITHOUT_HTML=true
119264656SimpWITHOUT_I4B=true
120264656SimpWITHOUT_IPFILTER=true
121264656SimpWITHOUT_IPX=true
122264656SimpWITHOUT_LIBKSE=true
123264656SimpWITHOUT_LOCALES=true
124264656SimpWITHOUT_LPR=true
125264656SimpWITHOUT_MAN=true
126264656SimpWITHOUT_NETCAT=true
127264656SimpWITHOUT_NIS=true
128264656SimpWITHOUT_NLS=true
129264656SimpWITHOUT_NS_CACHING=true
130264656SimpWITHOUT_OBJC=true
131264656SimpWITHOUT_PROFILE=true
132264656SimpWITHOUT_RCMDS=true
133264656SimpWITHOUT_SENDMAIL=true
134264656SimpWITHOUT_SHAREDOCS=true
135264656SimpWITHOUT_SYSCONS=true
136264656SimpWITHOUT_LIB32=true
137264656Simp"
138264656SimpCONF_INSTALL="$CONF_BUILD
139264656SimpINSTALL_NODEBUG=t
140264656SimpNOPORTDOCS=t
141264656SimpNO_INSTALL_MANPAGES=t
142264656Simp"
143264656Simp# The following would help...
144264656Simp# WITHOUT_TOOLCHAIN=true		can't build ports
145264656Simp# WITHOUT_INSTALLLIB=true		libgcc.a
146264656Simp#
147264656Simp# from the build
148264656Simp# WITHOUT_INFO=true			makeinfo
149264656Simp# WITHOUT_RCS=true
150264656SimpPKG_ONLY_MAKE_CONF="
151264656SimpWITHOUT_TOOLCHAIN=true
152264656SimpWITHOUT_INSTALLLIB=true
153264656SimpWITHOUT_INFO=true
154264656SimpWITHOUT_RCS=true
155264656Simp"
156264656Simp
157264656SimpNANO_PACKAGE_ONLY=1
158264656Simp
159264656Simp# install a package from a pre-built binary
160264656Simpdo_add_pkg ()
161264656Simp{
162264656Simp	# Need to create ${NANO_OBJ}/ports in this add_pkg_${port} function
163264656Simp	set -x
164264656Simp	mkdir -p ${NANO_OBJ}/ports/distfiles
165264656Simp	mkdir -p ${NANO_OBJ}/ports/packages
166264656Simp	mkdir -p ${NANO_WORLDDIR}/usr/ports/packages
167264656Simp	mkdir -p ${NANO_WORLDDIR}/usr/ports/distfiles
168264656Simp	mount -t nullfs -o noatime ${NANO_OBJ}/ports/packages \
169264656Simp	    ${NANO_WORLDDIR}/usr/ports/packages
170264656Simp	mount -t nullfs -o noatime ${NANO_OBJ}/ports/distfiles \
171264656Simp	    ${NANO_WORLDDIR}/usr/ports/distfiles
172265166Simp	CR env ASSUME_ALWAYS_YES=YES SIGNATURE_TYPE=none /usr/sbin/pkg add /usr/ports/packages/All/$1.txz
173264656Simp	umount ${NANO_WORLDDIR}/usr/ports/distfiles
174264656Simp	umount ${NANO_WORLDDIR}/usr/ports/packages
175264656Simp	rmdir ${NANO_WORLDDIR}/usr/ports/packages
176264656Simp	rmdir ${NANO_WORLDDIR}/usr/ports/distfiles
177264656Simp	rmdir ${NANO_WORLDDIR}/usr/ports
178264656Simp	set +x
179264656Simp}
180264656Simp
181264656Simp# Build a port (with the side effect of creating a package)
182264656Simpdo_add_port ()
183264656Simp{
184264656Simp	local port_path
185264656Simp	port_path=$1
186264656Simp	shift
187264656Simp	set -x
188264656Simp	# Need to create ${NANO_OBJ}/ports in this add_port_${port} function
189264656Simp	mkdir -p ${NANO_OBJ}/ports/distfiles
190264656Simp	mkdir -p ${NANO_OBJ}/ports/packages
191264656Simp	mkdir -p ${NANO_PORTS}/packages
192264656Simp	mkdir -p ${NANO_PORTS}/distfiles
193264656Simp	mkdir -p ${NANO_WORLDDIR}/usr/src
194264656Simp	mkdir -p ${NANO_WORLDDIR}/usr/ports
195264656Simp      	mount -t nullfs -o noatime ${NANO_SRC} ${NANO_WORLDDIR}/usr/src
196264656Simp	mount -t nullfs -o noatime ${NANO_PORTS} ${NANO_WORLDDIR}/usr/ports
197264656Simp	mount -t nullfs -o noatime ${NANO_OBJ}/ports/packages \
198264656Simp	    ${NANO_WORLDDIR}/usr/ports/packages
199264656Simp	mount -t nullfs -o noatime ${NANO_OBJ}/ports/distfiles \
200264656Simp	    ${NANO_WORLDDIR}/usr/ports/distfiles
201264656Simp	mkdir -p ${NANO_WORLDDIR}/dev
202264656Simp	mount -t devfs devfs ${NANO_WORLDDIR}/dev
203264656Simp	mkdir -p ${NANO_WORLDDIR}/usr/workdir
204264656Simp	cp /etc/resolv.conf ${NANO_WORLDDIR}/etc/resolv.conf
205265166Simp	# OK, a little inefficient, but likely not enough to worry about.
206265166Simp	CR ldconfig /lib /usr/lib /usr/local/lib
207265166Simp	CR ldconfig -R
208265166Simp	CR ldconfig -r
209264656Simp# Improvement: Don't know why package-recursive don't works here
210264656Simp	CR "env UNAME_p=${NANO_ARCH} TARGET=${NANO_ARCH} \
211265166Simp	    TARGET_ARCH=${NANO_ARCH} PORTSDIR=${NANO_PORTS} make \
212264656Simp	    __MAKE_CONF=${NANO_MAKE_CONF_BUILD} \
213264656Simp	    WRKDIRPREFIX=/usr/workdir -C /usr/ports/$port_path \
214265166Simp	    package-recursive BATCH=yes $* clean FORCE_PKG_REGISTER=t"
215264656Simp	rm ${NANO_WORLDDIR}/etc/resolv.conf
216264656Simp	rm -rf ${NANO_WORLDDIR}/usr/obj
217264656Simp	rm -rf ${NANO_WORLDDIR}/usr/workdir
218264656Simp	umount ${NANO_WORLDDIR}/dev
219264656Simp	umount ${NANO_WORLDDIR}/usr/ports/packages
220264656Simp	umount ${NANO_WORLDDIR}/usr/ports/distfiles
221264656Simp	umount ${NANO_WORLDDIR}/usr/ports
222264656Simp	umount ${NANO_WORLDDIR}/usr/src
223264656Simp	set +x
224264656Simp}
225264656Simp
226264656Simp# Need to check if this function works with cross-compiling architecture!!!!
227264656Simp# Recursive complex fonction: Generate one function for each ports
228264656Simpadd_port () {
229264656Simp    local port_path=$1
230264656Simp    local port=`echo $1 | sed -e 's/\//_/'`
231264656Simp    shift
232299826Spfg    # Check if package already exist
233264656Simp    # Need to:
234264656Simp    # 1. check ARCH of this package!
235264656Simp    # 2. Add a trap
236264656Simp    cd ${NANO_PORTS}/${port_path}
237265166Simp    PKG_NAME=`env PORTSDIR=${NANO_PORTS} make __MAKE_CONF=${NANO_MAKE_CONF_BUILD} package-name` 
238265166Simp    if [ -f ${NANO_OBJ}/ports/packages/All/${PKG_NAME}.txz ]; then
239264656Simp	# Pkg file found: Generate add_pkg_NAME function
240264656Simp	eval "
241264656Simp	    add_pkg_${port} () {
242264656Simp	        do_add_pkg ${PKG_NAME}
243264656Simp	    }
244264656Simp            customize_cmd add_pkg_${port}
245264656Simp            "
246264656Simp    else
247264656Simp	# No pkg file: Generate add_port_NAME function
248264656Simp        eval "
249264656Simp            add_port_${port} () {
250264656Simp	        do_add_port ${port_path} $*
251264656Simp	    }
252264656Simp	    customize_cmd add_port_${port}
253264656Simp	"
254264656Simp	NANO_PACKAGE_ONLY=0
255264656Simp    fi
256264656Simp}
257264656Simp
258264656Simpdie()
259264656Simp{
260264656Simp	echo "$*"
261264656Simp	exit 1
262264656Simp}
263264656Simp
264265166Simp# Automatically include the packaging port here so it is always first so it
265265166Simp# builds the port and adds the package so we can add other packages.
266265166Simpadd_port ports-mgmt/pkg
267265166Simp
268264656Simprp=$(realpath ${NANO_OBJ}/)
269264656Simp__a=`mount | grep ${rp} | awk '{print length($3), $3;}' | sort -rn | awk '{$1=""; print;}'`
270264656Simpif [ -n "$__a" ]; then
271264656Simp    echo "unmounting $__a"
272264656Simp    umount $__a
273264656Simpfi
274264656Simp
275264656SimpNANO_BOOTLOADER="boot/boot0"
276