common revision 265166
1# $FreeBSD: stable/10/tools/tools/nanobsd/dhcpd/common 265166 2014-05-01 00:31:19Z imp $
2
3#-
4# Copyright (c) 2014 Warner Losh. All Rights Reserved.
5# Copyright (c) 2010 iXsystems, Inc., All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions
9# are met:
10# 1. Redistributions of source code must retain the above copyright
11#    notice, this list of conditions and the following disclaimer.
12# 2. Redistributions in binary form must reproduce the above copyright
13#    notice, this list of conditions and the following disclaimer in the
14#    documentation and/or other materials provided with the distribution.
15#
16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19# ARE DISCLAIMED.  IN NO EVENT SHALL iXsystems, Inc OR CONTRIBUTORS BE LIABLE
20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26# SUCH DAMAGE.
27#
28#
29# This file is heavily derived from both Sam Leffler's Avilia config,
30# as well as the BSDRP project's config file.  Neither of these have
31# an explicit copyright/license statement, but are implicitly BSDL. This
32# example has been taken from the FreeNAS project (an early version) and
33# simplified to meet the needs of the example.
34#
35
36# NB: You want the other file
37
38NANO_PMAKE="make -j $(sysctl -n hw.ncpu)"
39
40NANO_CFG_BASE=$(pwd)
41NANO_CFG_BASE=${NANO_CFG_BASE%/dhcpd}
42NANO_SRC=$(pwd)
43NANO_SRC=${NANO_SRC%/tools/tools/nanobsd/dhcpd}
44NANO_OBJ=${NANO_SRC}/../dhcpd/obj
45# Where cust_pkg() finds packages to install
46#XXX: Is this the right place?
47#NANO_PORTS=$(realpath ${NANO_SRC}/../ports)
48NANO_PORTS=/usr/ports
49NANO_PACKAGE_DIR=${NANO_SRC}/${NANO_TOOLS}/Pkg
50NANO_DATADIR=${NANO_OBJ}/_.data
51NANO_DATASIZE=40960
52NANO_INIT_IMG2=0
53unset MAKEOBJDIRPREFIX
54
55# this to go into nanobsd.sh
56NANO_PORTS=${NANO_PORTS:-/usr/ports}
57
58customize_cmd cust_allow_ssh_root
59
60add_etc_make_conf()
61{
62	touch ${NANO_WORLDDIR}/etc/make.conf
63}
64customize_cmd add_etc_make_conf
65
66clean_usr_local()
67{
68	LOCAL_DIR=${NANO_WORLDDIR}/usr/local
69	pprint 2 "Clean and create world directory (${LOCAL_DIR})"
70	if rm -rf ${LOCAL_DIR}/ > /dev/null 2>&1 ; then
71		true
72	else
73		chflags -R noschg ${LOCAL_DIR}/
74		rm -rf ${LOCAL_DIR}/
75	fi
76	for f in bin etc lib libdata libexec sbin share; do
77		mkdir -p ${LOCAL_DIR}/$f
78	done
79}
80customize_cmd clean_usr_local
81
82cust_install_machine_files()
83{
84	echo "cd ${NANO_CFG_BASE}/Files"
85	cd ${NANO_CFG_BASE}/Files
86	find . -print | grep -Ev '/(CVS|\.svn)' | cpio -dumpv ${NANO_WORLDDIR}
87}
88customize_cmd cust_install_files
89customize_cmd cust_install_machine_files 
90
91buildenv()
92{
93	cd ${NANO_SRC}
94	env __MAKE_CONF=${NANO_MAKE_CONF_BUILD} DESTDIR=${NANO_WORLDDIR} make buildenv
95}
96
97NANO_MAKEFS="makefs -B big \
98	-o bsize=4096,fsize=512,density=8192,optimization=space"
99export NANO_MAKEFS
100
101# NB: leave c++ enabled so devd can be built
102CONF_BUILD="
103WITHOUT_ACPI=true
104WITHOUT_ATM=true
105WITHOUT_AUDIT=true
106WITHOUT_BIND_DNSSEC=true
107WITHOUT_BIND_ETC=true
108WITHOUT_BIND_LIBS_LWRES=true
109WITHOUT_BLUETOOTH=true
110WITHOUT_CALENDAR=true
111WITHOUT_CVS=true
112WITHOUT_DICT=true
113WITHOUT_EXAMPLES=true
114WITHOUT_FORTRAN=true
115WITHOUT_GAMES=true
116WITHOUT_GCOV=true
117WITHOUT_GPIB=true
118WITHOUT_HTML=true
119WITHOUT_I4B=true
120WITHOUT_IPFILTER=true
121WITHOUT_IPX=true
122WITHOUT_LIBKSE=true
123WITHOUT_LOCALES=true
124WITHOUT_LPR=true
125WITHOUT_MAN=true
126WITHOUT_NETCAT=true
127WITHOUT_NIS=true
128WITHOUT_NLS=true
129WITHOUT_NS_CACHING=true
130WITHOUT_OBJC=true
131WITHOUT_PROFILE=true
132WITHOUT_RCMDS=true
133WITHOUT_SENDMAIL=true
134WITHOUT_SHAREDOCS=true
135WITHOUT_SYSCONS=true
136WITHOUT_LIB32=true
137"
138CONF_INSTALL="$CONF_BUILD
139INSTALL_NODEBUG=t
140NOPORTDOCS=t
141NO_INSTALL_MANPAGES=t
142"
143# The following would help...
144# WITHOUT_TOOLCHAIN=true		can't build ports
145# WITHOUT_INSTALLLIB=true		libgcc.a
146#
147# from the build
148# WITHOUT_INFO=true			makeinfo
149# WITHOUT_RCS=true
150PKG_ONLY_MAKE_CONF="
151WITHOUT_TOOLCHAIN=true
152WITHOUT_INSTALLLIB=true
153WITHOUT_INFO=true
154WITHOUT_RCS=true
155"
156
157NANO_PACKAGE_ONLY=1
158
159# install a package from a pre-built binary
160do_add_pkg ()
161{
162	# Need to create ${NANO_OBJ}/ports in this add_pkg_${port} function
163	set -x
164	mkdir -p ${NANO_OBJ}/ports/distfiles
165	mkdir -p ${NANO_OBJ}/ports/packages
166	mkdir -p ${NANO_WORLDDIR}/usr/ports/packages
167	mkdir -p ${NANO_WORLDDIR}/usr/ports/distfiles
168	mount -t nullfs -o noatime ${NANO_OBJ}/ports/packages \
169	    ${NANO_WORLDDIR}/usr/ports/packages
170	mount -t nullfs -o noatime ${NANO_OBJ}/ports/distfiles \
171	    ${NANO_WORLDDIR}/usr/ports/distfiles
172	CR env ASSUME_ALWAYS_YES=YES SIGNATURE_TYPE=none /usr/sbin/pkg add /usr/ports/packages/All/$1.txz
173	umount ${NANO_WORLDDIR}/usr/ports/distfiles
174	umount ${NANO_WORLDDIR}/usr/ports/packages
175	rmdir ${NANO_WORLDDIR}/usr/ports/packages
176	rmdir ${NANO_WORLDDIR}/usr/ports/distfiles
177	rmdir ${NANO_WORLDDIR}/usr/ports
178	set +x
179}
180
181# Build a port (with the side effect of creating a package)
182do_add_port ()
183{
184	local port_path
185	port_path=$1
186	shift
187	set -x
188	# Need to create ${NANO_OBJ}/ports in this add_port_${port} function
189	mkdir -p ${NANO_OBJ}/ports/distfiles
190	mkdir -p ${NANO_OBJ}/ports/packages
191	mkdir -p ${NANO_PORTS}/packages
192	mkdir -p ${NANO_PORTS}/distfiles
193	mkdir -p ${NANO_WORLDDIR}/usr/src
194	mkdir -p ${NANO_WORLDDIR}/usr/ports
195      	mount -t nullfs -o noatime ${NANO_SRC} ${NANO_WORLDDIR}/usr/src
196	mount -t nullfs -o noatime ${NANO_PORTS} ${NANO_WORLDDIR}/usr/ports
197	mount -t nullfs -o noatime ${NANO_OBJ}/ports/packages \
198	    ${NANO_WORLDDIR}/usr/ports/packages
199	mount -t nullfs -o noatime ${NANO_OBJ}/ports/distfiles \
200	    ${NANO_WORLDDIR}/usr/ports/distfiles
201	mkdir -p ${NANO_WORLDDIR}/dev
202	mount -t devfs devfs ${NANO_WORLDDIR}/dev
203	mkdir -p ${NANO_WORLDDIR}/usr/workdir
204	cp /etc/resolv.conf ${NANO_WORLDDIR}/etc/resolv.conf
205	# OK, a little inefficient, but likely not enough to worry about.
206	CR ldconfig /lib /usr/lib /usr/local/lib
207	CR ldconfig -R
208	CR ldconfig -r
209# Improvement: Don't know why package-recursive don't works here
210	CR "env UNAME_p=${NANO_ARCH} TARGET=${NANO_ARCH} \
211	    TARGET_ARCH=${NANO_ARCH} PORTSDIR=${NANO_PORTS} make \
212	    __MAKE_CONF=${NANO_MAKE_CONF_BUILD} \
213	    WRKDIRPREFIX=/usr/workdir -C /usr/ports/$port_path \
214	    package-recursive BATCH=yes $* clean FORCE_PKG_REGISTER=t"
215	rm ${NANO_WORLDDIR}/etc/resolv.conf
216	rm -rf ${NANO_WORLDDIR}/usr/obj
217	rm -rf ${NANO_WORLDDIR}/usr/workdir
218	umount ${NANO_WORLDDIR}/dev
219	umount ${NANO_WORLDDIR}/usr/ports/packages
220	umount ${NANO_WORLDDIR}/usr/ports/distfiles
221	umount ${NANO_WORLDDIR}/usr/ports
222	umount ${NANO_WORLDDIR}/usr/src
223	set +x
224}
225
226# Need to check if this function works with cross-compiling architecture!!!!
227# Recursive complex fonction: Generate one function for each ports
228add_port () {
229    local port_path=$1
230    local port=`echo $1 | sed -e 's/\//_/'`
231    shift
232    # Check if package allready exist
233    # Need to:
234    # 1. check ARCH of this package!
235    # 2. Add a trap
236    cd ${NANO_PORTS}/${port_path}
237    PKG_NAME=`env PORTSDIR=${NANO_PORTS} make __MAKE_CONF=${NANO_MAKE_CONF_BUILD} package-name` 
238    if [ -f ${NANO_OBJ}/ports/packages/All/${PKG_NAME}.txz ]; then
239	# Pkg file found: Generate add_pkg_NAME function
240	eval "
241	    add_pkg_${port} () {
242	        do_add_pkg ${PKG_NAME}
243	    }
244            customize_cmd add_pkg_${port}
245            "
246    else
247	# No pkg file: Generate add_port_NAME function
248        eval "
249            add_port_${port} () {
250	        do_add_port ${port_path} $*
251	    }
252	    customize_cmd add_port_${port}
253	"
254	NANO_PACKAGE_ONLY=0
255    fi
256}
257
258die()
259{
260	echo "$*"
261	exit 1
262}
263
264create_amd64_diskimage()
265{
266	create_i386_diskimage "$*"
267}
268
269# Automatically include the packaging port here so it is always first so it
270# builds the port and adds the package so we can add other packages.
271add_port ports-mgmt/pkg
272
273rp=$(realpath ${NANO_OBJ}/)
274__a=`mount | grep ${rp} | awk '{print length($3), $3;}' | sort -rn | awk '{$1=""; print;}'`
275if [ -n "$__a" ]; then
276    echo "unmounting $__a"
277    umount $__a
278fi
279
280NANO_BOOTLOADER="boot/boot0"
281