Date: Mon, 6 Apr 2009 11:15:28 +0000 (UTC) From: Luigi Rizzo <luigi@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org Subject: svn commit: r190762 - stable/7/release/picobsd/build Message-ID: <200904061115.n36BFS1R069583@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: luigi Date: Mon Apr 6 11:15:28 2009 New Revision: 190762 URL: http://svn.freebsd.org/changeset/base/190762 Log: MFC: bring in recent fixes to the picobsd script Approved by: re (blanket on picobsd) Modified: stable/7/release/picobsd/build/picobsd Modified: stable/7/release/picobsd/build/picobsd ============================================================================== --- stable/7/release/picobsd/build/picobsd Mon Apr 6 11:14:30 2009 (r190761) +++ stable/7/release/picobsd/build/picobsd Mon Apr 6 11:15:28 2009 (r190762) @@ -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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200904061115.n36BFS1R069583>