aboutsummaryrefslogtreecommitdiff
path: root/release
diff options
context:
space:
mode:
authorLuigi Rizzo <luigi@FreeBSD.org>2009-04-06 11:15:28 +0000
committerLuigi Rizzo <luigi@FreeBSD.org>2009-04-06 11:15:28 +0000
commitc335c9375df8352e0b7396d7763a152aa160f6e4 (patch)
treed2bdd42674091a293d3be435ea76caf331a5d339 /release
parent4c6d9dac8f5cc51d6c449e46f5e49c0391ef6b38 (diff)
downloadsrc-c335c9375df8352e0b7396d7763a152aa160f6e4.tar.gz
src-c335c9375df8352e0b7396d7763a152aa160f6e4.zip
Notes
Diffstat (limited to 'release')
-rwxr-xr-xrelease/picobsd/build/picobsd261
1 files changed, 177 insertions, 84 deletions
diff --git a/release/picobsd/build/picobsd b/release/picobsd/build/picobsd
index 85ed85aa326d..e5f58cd4c16f 100755
--- a/release/picobsd/build/picobsd
+++ b/release/picobsd/build/picobsd
@@ -3,17 +3,17 @@
# $FreeBSD$
# This file requires sysutils/makefs to run
#
-# The new PicoBSD build script. Invoked as
+# The PicoBSD build script. Invoked as
#
-# picobsd [options] floppy_type site_name
+# picobsd [options] image_type [site_name]
#
-# Where floppy_type is a directory where the picobsd config info
-# is held, and ${floppy_type}/floppy.tree.${site_name} contains
+# Where image_type is a directory with the picobsd config info,
+# and ${image_type}/floppy.tree.${site_name} contains
# optional site-specific configuration.
#
# For Options, see the bottom of the file where the processing is
# done. The picobsd(8) manpage might be of some help, but code and docs
-# tend to lose sync over time...
+# tend to lose sync over time.
#
# This script depends on the following files:
#
@@ -33,36 +33,42 @@
# floppy.tree/ local additions to ${PICO_TREE}/mfs_free
# floppy.tree.${site}/ same as above, site specific.
# mfs_tree/ local additions to the mfs_free
-# buildtree.mk optional makefile to build an extension for floppy tree
+# buildtree.mk optional Makefile to build an extension for floppy tree
# (generated in buildtree/ )
#
#--- The main entry point is at the end.
#
-# There are two set of initialization. The first one (set_defaults)
-# is done on entry to the script, and is used to set default values
-# for all variables which do not depend on floppy type and source tree.
+# There are two initialization functions:
#
-# The second set is done after command line parsing, e.g.
-# to resolve dependencies on the source tree.
+# + set_defaults
+# is run on entry to the script, and is used to set default values
+# for all variables that do not depend on image type and source tree.
#
-# Naming:
+# + set_build_parameters
+# is run after command line parsing
+#
+# VARIABLE NAMES:
# + variables that control operation (e.g. verbosity) and are generally
# set from the command line have o_ ("option") as a name prefix
#
-# + variables which contain pathnames and values that should not change
+# + variables that contain pathnames and values that should not change
# have c_ ("constant") as a name prefix
#
# + variables exported to Makefiles and subshells are CAPITAL
#
# + variables local to the script are lowercase, possibly with
-# an l_ ("local") prefix
+# an l_ ("local") prefix.
+#
+# There are unfortunately exceptions:
+# name, l_usrtree, l_objtree
# SRC points to your FreeBSD source tree.
# l_usrtree points to the /usr subdir for the source tree.
# Normally /usr or ${SRC}/../usr
# l_objtree points to the obj tree. Normally ${l_usrtree}/obj-pico
+# c_label is either bsdlabel or disklabel
# PICO_TREE is where standard picobsd stuff resides.
# Normally ${SRC}/release/picobsd
# You can set SRC with --src <directory>
@@ -71,28 +77,27 @@
# MY_TREE (set later) is where this floppy type resides.
# BUILDDIR is the build directory
-# set some default values for variables.
-# needs to be done as the first thing in the script.
-
# log something on stdout if verbose.
o_verbose=0 # this needs to be here!
-log() {
+log() { # message
local foo
[ ${o_verbose} -gt 0 ] && printf "\n*** %s\n" "$*"
[ ${o_verbose} -gt 1 ] && read -p "=== Press enter to continue" foo
return 0
}
-logverbose() {
+# unconditionally log and wait for input
+logverbose() { # message
local foo
printf "\n*** %s\n" "$*"
read -p "=== Press enter to continue" foo
return 0
}
-set_defaults() {
- # no way to use logging in this function, variable not set yet.
+# set some default values for variables.
+# needs to be done as the first thing in the script.
+set_defaults() { # no arguments
# EDITOR is the editor you use
# fd_size floppy size in KB (default to 1440). You can use 1480,
# 1720, 2880, etc. but beware that only 1440 and 1480 will boot
@@ -101,15 +106,20 @@ set_defaults() {
fd_size=${fd_size:-1440}
o_use_loader="yes" # use /boot/loader
- o_all_in_mfs="yes" # put all files in mfs so you can boot and run
- # the image via diskless boot.
- o_clean="" # do not clean
+ # You should not change it unless you are really short
+ # of space, and your kernel is small enough that the
+ # bootblocks manage to load it.
+
+ o_all_in_mfs="yes" # put all files in mfs so you can boot
+ # and run the image via diskless boot.
+ o_clean="" # set if you want to clean prev.builds.
o_interactive="" # default is interactive
o_verbose=0 # verbose level, 0 is silent
o_tarv="" # tar verbose flag, "" or "v"
- o_init_src="" # non "" if we need to init libs and includes.
+ o_init_src="" # set to build libs and includes.
o_makeopts=${MAKEOPTS:--s} # make options, be silent by default
- o_no_devfs=yes # we do not want devfs
+ o_no_devfs= # default is use devfs.
+ # You should only set it when building 4.x images
o_do_modules="" # do not build modules
SRC="/usr/src" # default location for sources
@@ -132,13 +142,13 @@ set_defaults() {
c_img=picobsd.bin # filename used for the picobsd image
generate_iso="NO" # don't generate the iso image
- # select the right memory disk name
+ # select the right disklabel program
case `uname -r` in
- 7.*|6.*|5.*)
- l_label="bsdlabel"
+ 4.*)
+ c_label="disklabel"
;;
*)
- l_label="disklabel"
+ c_label="bsdlabel"
;;
esac
@@ -150,8 +160,9 @@ set_defaults() {
trap fail 15
}
-# use the new build infrastructure
-create_includes_and_libraries2() {
+# use the new build infrastructure to create libraries
+# and also to build a specific target
+create_includes_and_libraries2() { # opt_dir opt_target
local no
log "create_includes_and_libraries2() for ${SRC}"
if [ ${OSVERSION} -ge 600000 ] ; then
@@ -163,7 +174,11 @@ create_includes_and_libraries2() {
export MAKEOBJDIRPREFIX
( cd ${SRC};
# make -DNOCLEAN -DNOPROFILE -DNOGAMES -DNOLIBC_R -DPICOBSD buildworld
- make _+_= $no toolchain _includes _libraries
+ if [ -d "$1" ] ; then
+ cd $1 ; make $2 # specific target, e.g. ld-elf.so
+ else
+ make _+_= $no toolchain _includes _libraries
+ fi
)
}
@@ -173,7 +188,7 @@ create_includes_and_libraries() {
log "create_includes_and_libraries() for ${SRC}"
# Optionally creates include directory and libraries.
- mkdir -p ${l_usrtree}/include # the include directory...
+ mkdir -p ${l_usrtree}/include # the include directory...
mkdir -p ${l_usrtree}/share/misc # a few things go here
mkdir -p ${l_usrtree}/lib # libraries
mkdir -p ${l_usrtree}/sbin # some binaries
@@ -210,11 +225,12 @@ create_includes_and_libraries() {
log "Libraries done"
}
-# set_type <type> looks in user or system directories for the floppy type
-# specified as first argument, and sets variables according to the config.
-# file. Also sets MY_TREE and BUILDDIR and SITE
+# set_type <the_type> [the_site] looks in user or system directories
+# for the directory named as the first argument, reads the configuration
+# files and sets variables according to the config.
+# Also sets MY_TREE and BUILDDIR and SITE
-set_type() {
+set_type() { # the_type the_site
local a i
log "set_type() : Type '$1' site '$2'"
@@ -242,7 +258,7 @@ set_type() {
clean_tree() {
log "clean_tree()"
- if [ "${name}" = "" ] ; then
+ if [ -z "${name}" ] ; then
echo "---> Wrong floppy type"
exit 3
fi
@@ -271,7 +287,7 @@ build_iso_image() {
# Main build procedure.
build_image() {
log "build_image() <${name}>"
- [ "${name}" != "" ] || fail $? bad_type
+ [ -n "${name}" ] || fail $? bad_type
clear
set_msgs
printf "${MSG}---> We'll use the sources living in ${SRC}\n\n"
@@ -281,12 +297,8 @@ build_image() {
# variables.
#
. ${PICO_TREE}/build/config
- if [ -f ${MY_TREE}/config ] ; then
- . ${MY_TREE}/config
- fi
- if [ -f ${o_additional_config} ] ; then
- . ${o_additional_config}
- fi
+ [ -f "${MY_TREE}/config" ] && . ${MY_TREE}/config
+ [ -f "${o_additional_config}" ] && . ${o_additional_config}
# location of the object directory
PICO_OBJ=${l_objtree}/picobsd/${THETYPE}
@@ -312,34 +324,13 @@ build_image() {
fill_floppy_image # copies everything into the floppy
}
-build_package() {
- local z msg
-
- log "build_package()"
- rm -rf build.status
- echo "##############################################" >>build.status
- echo "## `date` ">>build.status
- echo "##############################################" >>build.status
- for z in bridge dial router net isp ; do
- set_type ${z}
- echo "---------------------------------------------">>build.status
- echo "Building TYPE=${z}, SIZE=${MFS_SIZE}" >>build.status
- msg="(ok)" # error message
- build_image || msg="** FAILED! **"
- echo " ${msg}">>build.status
- # where do i put things ?
- # clean_tree
- done
- exit 0
-}
-
# Set build parameters interactively
main_dialog() {
local ans i l
log "main_dialog()"
- while [ true ] ; do
+ while true ; do
set_msgs
rm ${c_reply}
dialog --menu "PicoBSD build menu -- (29 sep 2001)" 19 70 12 \
@@ -547,7 +538,7 @@ do_copyfiles() { # rootdir varname
eval set "\${${2}}"
srcs=""
for dst in $* ; do
- [ x"$srcs" = x ] && srcs=$dst && continue
+ [ -z "$srcs" ] && srcs=$dst && continue
eval srcs="$srcs" # expand wildcard and vars
case x"$dst" in
*/ ) mkdir -p ${root}/${dst} ;;
@@ -558,6 +549,80 @@ do_copyfiles() { # rootdir varname
done
}
+# do_links is a helper function to create links between programs
+# in stand/
+# This is done reading the names and destination from variable
+# links in a config file, in the format
+# : dst names
+
+do_links() { # rootdir varname
+ local root=$1
+ local l i dst
+ eval l="\${${2}}"
+ dst=""
+ log "Create links for ${l}"
+ (cd ${root}/stand
+ for i in $l ; do
+ if [ "$dst" = ":" -o "$i" = ":" ] ; then
+ dst=$i
+ elif [ -n "${dst}" ] ; then
+ ln -s ${dst} ${i}
+ fi
+ done
+ )
+}
+
+# find_progs is a helper function to locate the named programs
+# or libraries in ${o_objdir} or ${_SHLIBDIRPREFIX},
+# and return the full pathnames.
+# Sets ${u_progs} to the list of programs, and ${u_libs}
+# to the list of shared libraries used.
+#
+# You can use it e.g. in a local configuration file by writing
+#
+# do_copyfiles_user() {
+# local dst=$1
+# find_progs nvi sed less grep
+# cp -p ${u_progs} ${dst}/bin
+# cp -p ${u_libs} ${dst}/lib
+# mkdir -p ${dst}/libexec
+# find_progs ld-elf.so.1
+# cp -p ${u_progs} ${dst}/libexec
+# }
+
+find_progs() { # programs
+ local i
+ u_progs="`find_progs_helper $*`"
+ local o=${o_objdir:-${_SHLIBDIRPREFIX}}
+ [ -z "${u_progs}" ] && return 1 # not found, error
+ i="`ldd ${u_progs} | grep -v '^/' | awk '{print $1}' | sort | uniq`"
+ u_libs="`find_progs_helper $i`"
+ return 0
+}
+
+find_progs_helper() { # programs
+ local progs="$*"
+ local i o places names
+ local subdirs="bin sbin usr.bin usr.sbin libexec lib \
+ gnu/usr.bin gnu/lib \
+ secure/usr.bin secure/usr.sbin secure/libexec secure/lib"
+ names="" # files to search
+ o=""
+ for i in $progs ; do
+ # plain programs come out verbatim
+ [ -f "$i" ] && echo $i && continue
+ names="${names} ${o} -name $i"
+ o="-o"
+ done
+ [ -z "${names}" ] && return 0
+ places="" # places to search
+ o=${o_objdir:-${_SHLIBDIRPREFIX}/..}
+ for i in $subdirs ; do
+ [ -d "${o}/${i}" ] && places="${places} ${o}/${i}"
+ done
+ find ${places} -type f \( ${names} \)
+}
+
# Populate the memory filesystem with binaries and non-variable
# configuration files.
# First do an mtree pass, then create directory links and device entries,
@@ -647,7 +712,7 @@ populate_mfs_tree() {
fi
# 4.x compatibility - create device nodes
- if [ "${o_no_devfs}" != "" ] ; then
+ if [ -n "${o_no_devfs}" ] ; then
# create device entries using MAKEDEV
(cd ${dst}/dev
ln -s ${SRC}/etc/MAKEDEV ; chmod 555 MAKEDEV
@@ -661,10 +726,21 @@ populate_mfs_tree() {
(cd ${dst}; chown -R root . )
fi
- if [ -n "${copy_files}" ] ; then
- do_copyfiles ${dst} copy_files
+ # If we are building a shared 'crunch', take the libraries
+ # and the dynamic loader as well
+ find_progs ${dst}/stand/crunch
+ if [ -n "${u_libs}" ] ; then
+ mkdir -p ${dst}/lib && cp -p ${u_libs} ${dst}/lib
+ mkdir -p ${dst}/libexec
+ create_includes_and_libraries2 libexec/rtld-elf
+ find_progs ld-elf.so.1 && cp -p ${u_progs} ${dst}/libexec
fi
+ [ -n "${copy_files}" ] && do_copyfiles ${dst} copy_files
+ do_copyfiles_user ${dst} || true
+ [ -n "${links}" ] && do_links ${dst} links
+ strip ${dst}/libexec/* ${dst}/lib/* ${dst}/stand/* 2> /dev/null || true
+
# The 'import_files' mechanism is deprecated, as it requires
# root permissions to follow the symlinks, and also does
# not let you rename the entries.
@@ -829,22 +905,22 @@ fill_floppy_image() {
(cd ${BUILDDIR}
makefs -t ffs -o bsize=4096 -o fsize=512 \
-s ${blocks}k -f 50 ${c_img} ${dst}
- # ${l_label} -f `pwd`/${c_img}
- ${l_label} -w -f `pwd`/${c_img} auto # write in a label
+
+ ${c_label} -w -f `pwd`/${c_img} auto # write in a label
# copy partition c: into a: with some sed magic
- ${l_label} -f `pwd`/${c_img} | sed -e '/ c:/{p;s/c:/a:/;}' | \
- ${l_label} -R -f `pwd`/${c_img} /dev/stdin
- ${l_label} -f `pwd`/${c_img}
+ ${c_label} -f `pwd`/${c_img} | sed -e '/ c:/{p;s/c:/a:/;}' | \
+ ${c_label} -R -f `pwd`/${c_img} /dev/stdin
+ ${c_label} -f `pwd`/${c_img}
ls -l ${c_img}
- ${l_label} -f `pwd`/${c_img}
+ ${c_label} -f `pwd`/${c_img}
logverbose "after disklabel"
)
echo "BUILDDIR ${BUILDDIR}"
if [ "${generate_iso}" = "YES" ]; then
echo "generate_iso ${generate_iso}"
- #build_iso_image()
+ # build_iso_image # XXX not implemented yet
exit 1
fi
@@ -872,7 +948,6 @@ fill_floppy_image() {
# needs to be done once).
set_build_parameters() {
- log "set_build_parameters() SRC is ${SRC}"
if [ "${SRC}" = "/usr/src" ] ; then
l_usrtree=${USR:-/usr}
else
@@ -899,6 +974,19 @@ set_build_parameters() {
CONFIG=${l_usrtree}/sbin/config
export CONFIG
fi
+
+ # if we have o_objdir, find where bin/ is
+ if [ ! -z "${o_objdir}" ] ; then
+ if [ -d ${o_objdir}/bin ] ; then
+ # fine
+ elif [ -d "${o_objdir}${SRC}/bin" ] ; then
+ o_objdir="${o_objdir}${SRC}"
+ log "Changing objdir to ${o_objdir}"
+ else
+ log "Cannot find objdir in ${o_objdir}, sorry"
+ o_objdir=""
+ fi
+ fi
}
#-------------------------------------------------------------------
@@ -907,9 +995,10 @@ set_build_parameters() {
set_defaults
while [ true ]; do
+ log "Parsing $1"
case $1 in
--src) # set the source path instead of /usr/src
- SRC=`(cd $2; pwd)`
+ SRC=`realpath $2`
shift
;;
--init)
@@ -961,6 +1050,12 @@ while [ true ]; do
shift
;;
+ --objdir) # Place with results of a previous buildworld
+ # useful if you want to copy shared binaries and libs
+ o_objdir=`realpath $2`
+ shift
+ ;;
+
*)
break
;;
@@ -968,12 +1063,10 @@ while [ true ]; do
esac
shift
done
+
set_build_parameters # things that depend on ${SRC}
set_type $1 $2 # type and site, respectively
-# If $1="package", it creates a neat set of floppies
-[ "$1" = "package" ] && build_package
-
[ "${o_interactive}" != "NO" ] && main_dialog
if [ "${o_clean}" = "YES" ] ; then