#! /bin/sh # $NetBSD: bootstrap,v 1.240 2017/02/11 16:08:31 tron Exp $ # # Copyright (c) 2001-2011 Alistair Crooks # 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 ``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 THE AUTHOR 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. # #set -x # the following environment variables are honored: # compiler/linker flags: CFLAGS, CPPFLAGS, LDFLAGS, LIBS # tools: CP, GREP, ID, MKDIR, SH, TEST, TOUCH, XARGS BOOTSTRAP_VERSION=20060721 # Don't let the bootstrap program get confused by a pre-existing mk.conf # file. MAKECONF=/dev/null export MAKECONF # No vulnerability checks since there might be an incompatible checker installed NO_PKGTOOLS_REQD_CHECK=yes export NO_PKGTOOLS_REQD_CHECK unprivileged=no preserve_path=no # where the building takes place bootstrapdir=`dirname "$0"` bootstrapdir=`cd "${bootstrapdir}" && pwd` pkgsrcdir=`dirname "${bootstrapdir}"` wrkdir="`pwd`/work" usage="Usage: $0 "' [ --abi [32|64] ] [ --binary-kit ] [ --binary-macpkg ] [ --compiler ] [ --cwrappers ] [ --full ] [ --gzip-binary-kit ] [ --help ] [ --make-jobs ] [ --mk-fragment ] [ --pkgdbdir ] [ --pkginfodir ] [ --pkgmandir ] [ --prefer-pkgsrc ] [ --prefix ] [ --preserve-path ] [ --quiet ] [ --sysconfdir ] [ --unprivileged | --ignore-user-check ] [ --varbase ] [ --workdir ] ' # strip / for BSD/OS, strip - for HP-UX opsys=`uname -s | tr -d /-` mkbinarykit_macpkg() { local macdestdir macdestdir=${wrkdir}/macpkg-destdir rm -rf ${macdestdir} || die "cleanup destdir" mkdir -p ${macdestdir}${prefix} || die "mkdir destprefix" rmdir ${macdestdir}${prefix} || die "rmdir destprefix" cp -Rp ${prefix} ${macdestdir}${prefix} || die "copy prefix" if [ ! -d ${macdestdir}${pkgdbdir} ]; then mkdir -p ${macdestdir}${pkgdbdir} || die "mkdir destdbdir" rmdir ${macdestdir}${pkgdbdir} || die "rmdir destdbdir" cp -Rp ${pkgdbdir} ${macdestdir}${pkgdbdir} || die "copy dbdir" fi ${sedprog} -e "s|%WRKDIR%|${wrkdir}|g" \ -e "s|%TARGETDIR%|${targetdir}|g" -e "s|%DATE%|${date}|g" \ < macpkg.pmproj.in > ${wrkdir}/macpkg.pmproj ${packagemaker} -build -proj ${wrkdir}/macpkg.pmproj -p "${binary_macpkg}" } mkbinarykit_tar() { # in case tar was built by bootstrap PATH="$prefix/bin:$PATH"; export PATH cd / && tar -hcf "${binary_kit}" .$prefix .$pkgdbdir .$etc_mk_conf } mkbinarykit_tgz() { # in case tar was built by bootstrap PATH="$prefix/bin:$PATH"; export PATH cd / && tar -hcf - .$prefix .$pkgdbdir .$etc_mk_conf | gzip > "${binary_gzip_kit}" } die() { echo >&2 "$@" exit 1 } echo_msg() { echo "===> $@" } # see if we're using gcc. If so, set $compiler_is_gnu to '1'. get_compiler() { testcc="${CC}" # normally, we'd just use 'cc', but certain configure tools look # for gcc specifically, so we have to see if that comes first if [ -z "${testcc}" ]; then save_IFS="${IFS}" IFS=':' for dir in ${PATH}; do test -z "$dir" && dir=. if [ -x "$dir/gcc" ]; then testcc="$dir/gcc" break fi done IFS="${save_IFS}" fi # Clang compiler pretends to be GCC, so we have to check that cat >${wrkdir}/$$.c </dev/null | grep -c indeed` rm -f ${wrkdir}/$$.c cat >${wrkdir}/$$.c </dev/null | grep -c indeed` rm -f ${wrkdir}/$$.c } get_abi() { abi_opsys=$@ if [ -n "$abi" ]; then case "$abi_opsys" in IRIX) die "ERROR: $abi_opsys has special ABI handling, --abi not supported (yet)." ;; esac fi case "$abi_opsys" in IRIX) if [ `uname -r` -ge 6 ]; then abi=`sed -e 's/.*\(abi=\)\([on]*[36][24]\).*/\2/' /etc/compiler.defaults` isa=`sed -e 's/.*\(isa=mips\)\([1234]\).*/\2/' /etc/compiler.defaults` case "$abi" in o32) imakeopts="-DBuildO32 -DSgiISAo32=$isa" abi="" ;; n32) imakeopts="-DBuildN32 -DSgiISA32=$isa" abi="32" ;; 64 | n64) imakeopts="-DBuild64bit -DSgiISA64=$isa" abi="64" ;; esac else # IRIX before 6 abi=32 fi ;; esac } get_machine_arch_aix() { _cpuid=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El $_cpuid | grep ' POWER' >/dev/null 2>&1; then echo rs6000 else echo powerpc fi } get_machine_arch_darwin() { case `uname -p` in i386) # Returns "i386" or "x86_64" depending on CPU echo `uname -m` ;; powerpc) # sysctl mib exists on 64-bit hardware if [ -n "`sysctl -n hw.optional.64bitops 2>/dev/null`" ]; then echo "powerpc64" else echo "powerpc" fi ;; esac } check_prog() { _var="$1"; _name="$2" eval _tmp=\"\$$_var\" if [ "x$_tmp" != "x" ]; then # Variable is already set (by the user, for example) return 0 fi for _d in `echo $PATH | tr ':' ' '`; do if [ -f "$_d/$_name" ] && [ -x "$_d/$_name" ]; then # Program found eval $_var=\""$_d/$_name"\" return 1 fi done die "$_name not found in path." } opsys_finish() { case "$opsys" in IRIX) if [ -n "$imakeopts" ]; then echo "IMAKEOPTS+= $imakeopts" >> ${TARGET_MKCONF} fi if [ `uname -r` -lt 6 ]; then echo_msg "Installing fake ldd script" run_cmd "$install_sh -c -o $user -g $group -m 755 $pkgsrcdir/pkgtools/bootstrap-extras/files/fakeldd $prefix/sbin" need_extras=yes echo "LDD= $prefix/sbin/fakeldd" >> ${TARGET_MKCONF} fi ;; Haiku) need_extras=yes echo "LDD= $prefix/sbin/fakeldd" >> ${TARGET_MKCONF} ;; esac } is_root() { if [ `uname -s` = "IRIX" ]; then if [ `uname -r` -lt 6 -a -z "$ID" ]; then # older version of IRIX have an id command with limited features if [ "`$idprog`" != "uid=0(root) gid=0(sys)" ]; then return 1 fi return 0 fi fi if [ `$idprog -u` != 0 ]; then return 1 fi return 0 } # run a command, abort if it fails run_cmd() { echo_msg "running: $@" eval "$@" ret=$? if [ $ret -ne 0 ]; then echo_msg "exited with status $ret" die "aborted." fi } # Some versions of mkdir (notably SunOS) bail out too easily, so use the # install-sh wrapper instead. mkdir_p() { for dir in $@; do run_cmd "$install_sh -d -o $user -g $group $dir" done } mkdir_p_early() { [ -d "$1" ] && return 0 mkdir -p "$1" 2> /dev/null && return 0 parent=`dirname "$1"` mkdir_p_early "$parent" if [ ! -d "$1" ] && mkdir "$1"; then echo_msg "mkdir $1 exited with status $?" die "aborted." fi return 0 } copy_src() { _src="$1"; _dst="$2" if [ ! -d $wrkdir/$_dst ]; then mkdir_p $wrkdir/$_dst fi $cpprog -r $_src/* $wrkdir/$_dst if [ -f $wrkdir/$_dst/config.guess ]; then $cpprog $pkgsrcdir/mk/gnu-config/config.guess $wrkdir/$_dst/ fi if [ -f $wrkdir/$_dst/config.sub ]; then $cpprog $pkgsrcdir/mk/gnu-config/config.sub $wrkdir/$_dst/ fi } get_optarg() { expr "x$1" : "x[^=]*=\\(.*\\)" } checkarg_sane_absolute_path() { case "$1" in "") ;; # the default value will be used. *[!-A-Za-z0-9_./]*) die "ERROR: Invalid characters in path $1 (from $2)." ;; */) die "ERROR: The argument to $2 must not end in /." ;; /*) ;; *) die "ERROR: The argument to $2 must be an absolute path." ;; esac } checkarg_sane_relative_path() { case "$1" in "") ;; # the default value will be used. *[!-A-Za-z0-9_./]*) die "ERROR: Invalid characters in path $1 (from $2)." ;; /*) die "ERROR: The argument to $2 must be a relative path." ;; *) ;; esac } bootstrap_sh=${SH-/bin/sh} bootstrap_sh_set=${SH+set} case "$bootstrap_sh" in /*) ;; *) die "ERROR: The variable SH must contain an absolute path" ;; esac # On some newer Ubuntu installations, /bin/sh is a symlink to /bin/dash, # whose echo(1) is not BSD-compatible. # On all Debian GNU/kFreeBSD 7.0, /bin/sh is a symlink to /bin/dash, and # use /bin/bash. bootstrap forces /bin/bash is used. dash_echo_test=`$bootstrap_sh -c 'echo "\\100"'` if [ "$opsys" != "GNUkFreeBSD" ] && [ "$dash_echo_test" = "@" ]; then { echo "ERROR: Your shell's echo command is not BSD-compatible." echo "ERROR: Please select another shell by setting the environment" echo "ERROR: variable SH." } 1>&2 exit 1; fi if [ -n "$PKG_PATH" ]; then die "ERROR: Please unset PKG_PATH before running bootstrap." fi build_start=`date` echo_msg "bootstrap command: $0 $@" echo_msg "bootstrap started: $build_start" # ensure system locations are empty; we will set them later when we know # whether they will be system wide or user specific prefix= pkgdbdir= pkginfodir= pkgmandir= sysconfdir= varbase= compiler="" cwrappers=no full=no make_jobs=1 mk_fragment= quiet=no while [ $# -gt 0 ]; do case $1 in --workdir=*) wrkdir=`get_optarg "$1"` ;; --workdir) wrkdir="$2"; shift ;; --prefix=*) prefix=`get_optarg "$1"` ;; --prefix) prefix="$2"; shift ;; --pkgdbdir=*) pkgdbdir=`get_optarg "$1"` ;; --pkgdbdir) pkgdbdir="$2"; shift ;; --pkginfodir=*) pkginfodir=`get_optarg "$1"` ;; --pkginfodir) pkginfodir="$2"; shift ;; --pkgmandir=*) pkgmandir=`get_optarg "$1"` ;; --pkgmandir) pkgmandir="$2"; shift ;; --sysconfdir=*) sysconfdir=`get_optarg "$1"` ;; --sysconfdir) sysconfdir="$2"; shift ;; --varbase=*) varbase=`get_optarg "$1"` ;; --varbase) varbase="$2"; shift ;; --compiler=*) compiler=`get_optarg "$1"` ;; --compiler) compiler="$2"; shift ;; --abi=*) abi=`get_optarg "$1"` ;; --abi) abi="$2"; shift ;; --cwrappers) cwrappers=yes ;; --unprivileged | --ignore-user-check) unprivileged=yes ;; --prefer-pkgsrc=*) prefer_pkgsrc=`get_optarg "$1"` ;; --prefer-pkgsrc) prefer_pkgsrc="$2"; shift ;; --preserve-path) preserve_path=yes ;; --mk-fragment=*) mk_fragment=`get_optarg "$1"` ;; --mk-fragment) mk_fragment="$2"; shift ;; --binary-kit=*) binary_kit=`get_optarg "$1"` ;; --binary-kit) binary_kit="$2"; shift ;; --gzip-binary-kit=*) binary_gzip_kit=`get_optarg "$1"` ;; --gzip-binary-kit) binary_gzip_kit="$2"; shift ;; --binary-macpkg=*) binary_macpkg=`get_optarg "$1"` ;; --binary-macpkg) binary_macpkg="$2"; shift ;; --make-jobs=*) make_jobs=`get_optarg "$1"` ;; --make-jobs) make_jobs="$2"; shift ;; --full) full=yes ;; --quiet) quiet=yes ;; --help) echo "$usage"; exit ;; -h) echo "$usage"; exit ;; --*) echo "$usage"; exit 1 ;; esac shift done checkarg_sane_absolute_path "$wrkdir" "--workdir" checkarg_sane_absolute_path "$prefix" "--prefix" checkarg_sane_absolute_path "$pkgdbdir" "--pkgdbdir" checkarg_sane_absolute_path "$sysconfdir" "--sysconfdir" checkarg_sane_absolute_path "$varbase" "--varbase" checkarg_sane_relative_path "$pkginfodir" "--pkginfodir" checkarg_sane_relative_path "$pkgmandir" "--pkgmandir" # set defaults for system locations if not already set by the user wrkobjdir=${wrkdir}/pkgsrc if [ "$unprivileged" = "yes" ]; then [ -z "$prefix" ] && prefix=${HOME}/pkg elif [ -z "$prefix" -o "$prefix" = "/usr/pkg" ]; then prefix=/usr/pkg [ -z "$varbase" ] && varbase=/var fi [ -z "$varbase" ] && varbase=${prefix}/var [ -z "$pkgdbdir" ] && pkgdbdir=${prefix}/pkgdb if [ "$prefix" = "/usr" ]; then [ -z "$pkginfodir" ] && pkginfodir=share/info [ -z "$pkgmandir" ] && pkgmandir=share/man else [ -z "$pkginfodir" ] && pkginfodir=info [ -z "$pkgmandir" ] && pkgmandir=man fi infodir=${prefix}/${pkginfodir} mandir=${prefix}/${pkgmandir} [ -z "$sysconfdir" ] && sysconfdir=${prefix}/etc if [ "x$preserve_path" != "xyes" ]; then PATH="$PATH:/sbin:/usr/sbin" fi overpath="" root_user=root bmakexargs= need_extras=no use_bsdinstall= case "$opsys" in AIX) root_group=system need_bsd_install=yes need_awk=yes need_sed=yes need_ksh=yes need_fixed_strip=yes set_opsys=no machine_arch=`get_machine_arch_aix` ;; Bitrig) root_group=wheel need_bsd_install=no need_awk=no need_sed=no set_opsys=no machine_arch=`arch -s` check_compiler=yes ;; CYGWIN_*) is_root () { if id -nG | grep -q 'Administrators'; then return 0 fi return 1 } root_user=Administrators root_group=Administrators need_bsd_install=no opsys=`uname -o` need_awk=no need_sed=no need_xargs=no # only used for unprivileged builds. whoamiprog='id -u' groupsprog='id -g' ;; Darwin) root_group=wheel need_bsd_install=no need_awk=no need_sed=no set_opsys=no machine_arch=`get_machine_arch_darwin` CC=${CC:-"cc -isystem /usr/include"}; export CC check_compiler=yes osrev=`uname -r` macosx_version=`echo $osrev | awk -F . '{ print "10."$1-4; }'` case "$macosx_version" in 10.[7-9]) packagemaker=/Applications/PackageMaker.app/Contents/MacOS/PackageMaker ;; 10.[0-4]) packagemaker=/Developer/Tools/packagemaker ;; *) packagemaker=/Developer/usr/bin/packagemaker ;; esac case "$macosx_version" in 10.[8-9]|10.1[012]) need_awk=yes need_sed=yes ;; esac unset osrev macosx_version ;; DragonFly) root_group=wheel need_bsd_install=no need_awk=no need_sed=no set_opsys=no check_prog tarprog tar machine_arch=`uname -p` ;; FreeBSD) root_group=wheel need_bsd_install=no need_awk=no need_sed=no set_opsys=no machine_arch=`uname -p` check_compiler=yes ;; FreeMiNT) root_group=root need_bsd_install=no need_awk=no need_sed=no set_opsys=no machine_arch=m68k ;; GNUkFreeBSD) root_group=root need_bsd_install=no need_awk=yes need_sed=no set_opsys=no machine_arch=`uname -m` ;; Haiku) root_user=`id -un` root_group=root need_bsd_install=no need_awk=no need_sed=no set_opsys=no case `uname -m` in BeMac) machine_arch=powerpc ;; BePC) machine_arch=i386 ;; *) machine_arch=`uname -p` ;; esac ;; HPUX) root_group=sys need_bsd_install=yes need_awk=yes need_sed=yes set_opsys=no machine_arch=`uname -m | sed 's/^9000.*$/hppa/'` ;; Interix) is_root () { if id -G | grep -q 131616; then return 0 fi return 1 } mkdir_p () { mkdir -p "$@" # allows umask to take effect } default_install_mode=0775 root_user=`id -un` root_group=+Administrators case `uname -r` in 3.* | 5.*) need_bsd_install=yes need_awk=yes need_sed=yes set_opsys=no need_xargs=yes ;; *) need_bsd_install=no need_awk=no need_sed=no set_opsys=no need_xargs=no ;; esac # only used for unprivileged builds groupsprog="id -gn" # for bootstrap only; pkgsrc uses CPPFLAGS CC="gcc -D_ALL_SOURCE"; export CC ac_cv_header_poll_h=no; export ac_cv_header_poll_h ac_cv_func_poll=no; export ac_cv_func_poll ;; IRIX*) if [ -d "/usr/freeware/bin" ]; then overpath="/usr/freeware/bin:$overpath" fi if [ -d "/usr/bsd" ]; then overpath="/usr/bsd:$overpath" fi if [ -d "/usr/bsd/bin" ]; then overpath="/usr/bsd/bin:$overpath" fi root_group=sys need_bsd_install=yes get_abi "IRIX" opsys=IRIX need_awk=yes need_sed=yes set_opsys=yes machine_arch=mipseb check_compiler=yes if [ `uname -r` -lt 6 ]; then # IRIX 5's mkdir bails out with an error when trying to create with the -p # option an already existing directory need_mkdir=yes fi ;; Linux) if [ -f /etc/ssdlinux_version ]; then root_group=wheel else root_group=root fi need_bsd_install=no # Debian/Ubuntu's awk is mawk, and mawk does not understand # some regexp used in pkgsrc/mk. if [ -f /etc/debian_version ]; then need_awk=yes else need_awk=no fi need_sed=no set_opsys=no machine_arch=`uname -m` # Override machine_arch where required. case "$machine_arch" in i?86) machine_arch=i386 ;; ppc64le) machine_arch=powerpc64le ;; esac ;; Minix) root_group=operator need_bsd_install=yes need_awk=no need_sed=no set_opsys=no machine_arch=`uname -p` LDFLAGS="-lcompat_minix -lminlib" ;; MirBSD) root_group=wheel need_pax=yes need_mtree=no need_bsd_install=no need_awk=no need_sed=no set_opsys=no check_prog mtreeprog mtree machine_arch=`arch -s` # there is no /usr/bin/cc, so use mgcc if unset test -n "$CC" || { CC=mgcc; export CC; } # get some variables from the native make if unset for var in CFLAGS CPPFLAGS LDFLAGS; do # check if variable is already set eval _tmp=\"\$$var\" [ "x$_tmp" != x ] && continue # ask the native make (EXPERIMENTAL = don't add -Werror) # the -I${.CURDIR} dance is to prevent junk in CPPFLAGS _tmp=`printf '%s\nall:\n\t@%s %%s %s=${%s:M*:Q:Q}\n%s\n%s\n' \ $var'+=-I${.CURDIR}' printf $var $var':S/-I${.CURDIR}//' \ EXPERIMENTAL=yes '.include ' | \ (unset MAKECONF; /usr/bin/make -f - all 2>/dev/null) | \ sed 's/^x//'` eval $_tmp eval export $var done ;; NetBSD) root_group=wheel need_bsd_install=no need_awk=no need_sed=no set_opsys=no machine_arch=`uname -p` ;; OpenBSD) root_group=wheel need_bsd_install=no need_awk=no need_sed=no set_opsys=no machine_arch=`arch -s` ;; OSF1) root_group=system need_bsd_install=yes need_awk=yes need_sed=yes need_ksh=yes set_opsys=no ;; QNX) root_group=root need_bsd_install=yes need_awk=yes need_sed=yes set_opsys=no groupsprog="id -gn" whoamiprog="id -un" machine_arch=`uname -p | sed -e 's/x86/i386/'` ;; SCO_SV) root_group=root need_awk=yes need_bsd_install=yes need_sed=yes set_opsys=no whoamiprog='id -u' groupsprog='id -g' # /bin/sh under OpenServer 5.0.7/3.2 breaks bmake tests. #bmakexargs="$bmakexargs --with-defshell=/bin/ksh" ;; SunOS) root_group=root need_bsd_install=yes use_bsdinstall=yes if [ -x "/usr/gnu/bin/awk" ]; then need_awk=no else need_awk=yes fi if [ -x "/usr/gnu/bin/sed" ]; then need_sed=no else need_sed=yes fi if [ -x "/usr/bin/bash" ]; then bootstrap_sh=${SH:-/usr/bin/bash} bootstrap_sh_set=set else need_ksh=yes fi set_opsys=no idprog="/usr/xpg4/bin/id" groupsprog="${idprog} -gn" whoamiprog="${idprog} -un" machine_arch=`uname -p | sed -e 's/i86pc/i386/'` check_compiler=yes ;; UnixWare) root_group=sys need_bsd_install=no BSTRAP_ENV="INSTALL=/usr/ucb/install $BSTRAP_ENV" need_mkdir=yes need_awk=yes need_sed=yes whoamiprog=/usr/ucb/whoami set_opsys=no CC="gcc -DUNIXWARE"; export CC ;; *) echo "This platform ($opsys) is untried - good luck, and thanks for using pkgsrc" root_group=wheel need_bsd_install=yes need_awk=yes need_sed=yes set_opsys=no ;; esac # Fixup MACHINE_ARCH to use canonical pkgsrc variants, and support multiarch # systems via --abi, setting a default $abi based on MACHINE_ARCH if not set. # case "$machine_arch/$abi" in # "amd64" translates to "x86_64", defaults to 64-bit amd64/32) abi=32 machine_arch=i386 ;; amd64/*) abi=64 machine_arch=x86_64 ;; # XXX: hppa untested hppa/64) abi=64 machine_arch=hppa64 ;; hppa/*) abi=32 machine_arch=hppa ;; hppa64/32) abi=32 machine_arch=hppa ;; hppa64/*) abi=64 machine_arch=hppa64 ;; # "i386" can support 64-bit, e.g. SunOS, defaults to 32-bit. i386/64) abi=64 machine_arch=x86_64 ;; i386/*) abi=32 machine_arch=i386 ;; # XXX: powerpc untested powerpc/64) abi=64 machine_arch=powerpc64 ;; powerpc/*) abi=32 machine_arch=powerpc ;; powerpc64/32) abi=32 machine_arch=powerpc ;; powerpc64/*) abi=64 machine_arch=powerpc64 ;; powerpc64le/*) abi=64 machine_arch=powerpc64le;; # "sparc" can support 64-bit, e.g. SunOS, defaults to 32-bit. sparc/64) abi=64 machine_arch=sparc64 ;; sparc/*) abi=32 machine_arch=sparc ;; # x86_64 supports 32-bit/64-bit, defaults to 64-bit. x86_64/32) abi=32 machine_arch=i386 ;; x86_64/*) abi=64 machine_arch=x86_64 ;; esac # If "--full" is specified, then install all of the platform-independent # bootstrap software. # case "$full" in yes) need_bsd_install=yes need_awk=yes need_sed=yes need_ksh=yes ;; esac case "$quiet" in yes) configure_quiet_flags="--quiet" make_quiet_flags="-s" ;; no) configure_quiet_flags="" make_quiet_flags="" esac test ${make_jobs} -gt 0 2>/dev/null if [ $? -ne 0 ]; then die "ERROR: --make-jobs must be a positive integer argument" fi # export MACHINE_ARCH and OPSYS for bmake and pkg_install. MACHINE_ARCH=${machine_arch}; export MACHINE_ARCH OPSYS=${opsys}; export OPSYS if [ "x$preserve_path" != "xyes" ]; then PATH="$overpath:$PATH" fi check_prog awkprog awk check_prog chmodprog chmod if [ -n "$CP" ]; then cpprog="$CP" else check_prog cpprog cp fi if [ -n "$ID" ]; then idprog="$ID" else check_prog idprog id fi check_prog groupsprog groups check_prog lnprog ln check_prog lsprog ls check_prog rmdirprog rmdir check_prog sedprog sed check_prog shprog sh check_prog whoamiprog whoami if [ -d "${wrkdir}" ] || [ -f "${wrkdir}" ]; then die "\"${wrkdir}\" already exists, please remove it or use --workdir" fi if [ -f "${prefix}/share/mk/sys.mk" ]; then die "\"${prefix}\" already in use, remove it or use a different --prefix" fi if [ -d "${pkgdbdir}/bootstrap-mk-files-"* ]; then die "\"${pkgdbdir}\" already in use, remove it or use a different --pkgdbdir" fi mkdir_p_early ${wrkdir} if touch ${wrkdir}/.writeable; then : else die "\"${wrkdir}\" is not writeable. Try $0 -h" fi echo "Working directory is: ${wrkdir}" if [ "$compiler" = "" ] && [ x"$check_compiler" = x"yes" ]; then get_compiler # Clang pretends to be GCC, so we have to check it first. if [ $compiler_is_clang -gt 0 ]; then compiler="clang" elif [ $compiler_is_gnu -gt 0 ]; then compiler="gcc" else case "$opsys" in IRIX) if [ `uname -r` -ge 6 ]; then compiler="mipspro" else compiler="ido" fi test -n "$CC" || CC=cc ;; SunOS) compiler="sunpro" test -n "$CC" || CC=cc ;; esac fi fi mkdir_p_early ${wrkdir}/bin # build install-sh run_cmd "$sedprog -e 's|@DEFAULT_INSTALL_MODE@|'${default_install_mode-0755}'|' $pkgsrcdir/sysutils/install-sh/files/install-sh.in > $wrkdir/bin/install-sh" run_cmd "$chmodprog +x $wrkdir/bin/install-sh" install_sh="$shprog $wrkdir/bin/install-sh" if [ $unprivileged = "yes" ]; then user=`$whoamiprog` group=`$groupsprog | $awkprog '{print $1}'` echo_msg "building as unprivileged user $user/$group" # force bmake install target to use $user and $group echo "BINOWN=$user BINGRP=$group LIBOWN=$user LIBGRP=$group MANOWN=$user MANGRP=$group" > ${wrkdir}/Makefile.inc elif is_root; then user=$root_user group=$root_group else die "You must be either root to install bootstrap-pkgsrc or use the --unprivileged option." fi # export the proper environment PATH=$prefix/bin:$prefix/sbin:${PATH}; export PATH if [ -d /usr/ccs/bin -a -x /usr/ccs/bin/make ]; then PATH=${PATH}:/usr/ccs/bin; export PATH fi PKG_DBDIR=$pkgdbdir; export PKG_DBDIR LOCALBASE=$prefix; export LOCALBASE VARBASE=$varbase; export VARBASE # set up an example mk.conf file TARGET_MKCONF=${wrkdir}/mk.conf.example echo_msg "Creating default mk.conf in ${wrkdir}" echo "# Example ${sysconfdir}/mk.conf file produced by bootstrap-pkgsrc" > ${TARGET_MKCONF} echo "# `date`" >> ${TARGET_MKCONF} echo "" >> ${TARGET_MKCONF} echo ".ifdef BSD_PKG_MK # begin pkgsrc settings" >> ${TARGET_MKCONF} echo "" >> ${TARGET_MKCONF} # IRIX64 needs to be set to IRIX, for example if [ "$set_opsys" = "yes" ]; then echo "OPSYS= $opsys" >> ${TARGET_MKCONF} fi if [ -n "$abi" ]; then echo "ABI= $abi" >> ${TARGET_MKCONF} fi if [ "$compiler" != "" ]; then echo "PKGSRC_COMPILER= $compiler" >> ${TARGET_MKCONF} fi case "$compiler" in sunpro) echo "CC= cc" >> ${TARGET_MKCONF} echo "CXX= CC" >> ${TARGET_MKCONF} echo "CPP= \${CC} -E" >> ${TARGET_MKCONF} ;; clang) echo "CC= clang" >> ${TARGET_MKCONF} echo "CXX= clang++" >> ${TARGET_MKCONF} echo "CPP= \${CC} -E" >> ${TARGET_MKCONF} if [ -z "$CLANGBASE" -a -f "/usr/bin/clang" ]; then CLANGBASE="/usr" fi if [ -n "$CLANGBASE" -o -f "/bin/clang" ]; then echo "CLANGBASE= $CLANGBASE" >> ${TARGET_MKCONF} fi ;; esac if [ -n "$GCCBASE" ]; then echo "GCCBASE= $GCCBASE" >> ${TARGET_MKCONF} fi if [ -n "$SUNWSPROBASE" ]; then echo "SUNWSPROBASE= $SUNWSPROBASE" >> ${TARGET_MKCONF} fi echo "" >> ${TARGET_MKCONF} # enable unprivileged builds if not root if [ "$unprivileged" = "yes" ]; then echo "UNPRIVILEGED= yes" >> ${TARGET_MKCONF} fi # save environment in example mk.conf echo "PKG_DBDIR= $pkgdbdir" >> ${TARGET_MKCONF} echo "LOCALBASE= $prefix" >> ${TARGET_MKCONF} echo "VARBASE= $varbase" >> ${TARGET_MKCONF} if [ "${sysconfdir}" != "${prefix}/etc" ]; then echo "PKG_SYSCONFBASE= $sysconfdir" >> ${TARGET_MKCONF} fi echo "PKG_TOOLS_BIN= $prefix/sbin" >> ${TARGET_MKCONF} echo "PKGINFODIR= $pkginfodir" >> ${TARGET_MKCONF} echo "PKGMANDIR= $pkgmandir" >> ${TARGET_MKCONF} echo "" >> ${TARGET_MKCONF} if [ -n "$prefer_pkgsrc" ]; then echo "PREFER_PKGSRC= $prefer_pkgsrc" >> ${TARGET_MKCONF} echo "" >> ${TARGET_MKCONF} fi BOOTSTRAP_MKCONF=${wrkdir}/mk.conf cp ${TARGET_MKCONF} ${BOOTSTRAP_MKCONF} case "$cwrappers" in yes) echo "USE_CWRAPPERS= yes" >> ${TARGET_MKCONF} echo "" >> ${TARGET_MKCONF} ;; esac # On all Debian GNU/kFreeBSD 7, /bin/sh is a symlink to /bin/dash, and # use /bin/bash. if [ "$opsys" = "GNUkFreeBSD" -a "$bootstrap_sh_set" != "set" ]; then echo "TOOLS_PLATFORM.sh?= /bin/bash # instead of /bin/sh" >> ${TARGET_MKCONF} echo "TOOLS_PLATFORM.sh?= /bin/bash # instead of /bin/sh" >> ${BOOTSTRAP_MKCONF} echo $opsys fi # sbin is used by pkg_install, share/mk by bootstrap-mk-files mkdir_p $wrkdir/sbin $wrkdir/share/mk mkdir_p_early ${wrkdir} if [ "$need_bsd_install" = "yes" ]; then BSTRAP_ENV="INSTALL='$prefix/bin/install-sh -c' $BSTRAP_ENV" if [ "$use_bsdinstall" = "yes" ]; then echo "TOOLS_PLATFORM.install?= $prefix/bin/bsdinstall" >> ${TARGET_MKCONF} else echo "TOOLS_PLATFORM.install?= $prefix/bin/install-sh" >> ${TARGET_MKCONF} fi echo "TOOLS_PLATFORM.install?= $wrkdir/bin/install-sh" >> ${BOOTSTRAP_MKCONF} fi if [ "$need_fixed_strip" = "yes" ] ; then echo_msg "Installing fixed strip script" run_cmd "$install_sh -c -o $user -g $group -m 755 $pkgsrcdir/pkgtools/bootstrap-extras/files/strip-sh $wrkdir/bin/strip" echo "TOOLS_PLATFORM.strip?= $prefix/bin/strip" >> ${TARGET_MKCONF} echo "TOOLS_PLATFORM.strip?= $wrkdir/bin/strip" >> ${BOOTSTRAP_MKCONF} need_extras=yes fi if [ "$need_mkdir" = "yes" -a -z "$MKDIR" ]; then echo_msg "Installing fixed mkdir script \"mkdir-sh\"" run_cmd "$install_sh -c -o $user -g $group -m 755 $pkgsrcdir/pkgtools/bootstrap-extras/files/mkdir-sh $wrkdir/bin/mkdir-sh" echo "TOOLS_PLATFORM.mkdir?= $prefix/bin/mkdir-sh -p" >> ${TARGET_MKCONF} echo "TOOLS_PLATFORM.mkdir?= $wrkdir/bin/mkdir-sh -p" >> ${BOOTSTRAP_MKCONF} need_extras=yes fi if [ "$need_xargs" = "yes" ]; then echo_msg "Installing fixed xargs script" run_cmd "$install_sh -c -o $user -g $group -m 755 $pkgsrcdir/pkgtools/bootstrap-extras/files/xargs-sh $wrkdir/bin/xargs" echo "TOOLS_PLATFORM.xargs?= $prefix/bin/xargs" >> ${TARGET_MKCONF} echo "TOOLS_PLATFORM.xargs?= $wrkdir/bin/xargs" >> ${BOOTSTRAP_MKCONF} need_extras=yes fi echo_msg "Bootstrapping mk-files" run_cmd "(cd ${pkgsrcdir}/pkgtools/bootstrap-mk-files/files && env CP=${cpprog} \ OPSYS=${opsys} MK_DST=${wrkdir}/share/mk ROOT_GROUP=${root_group} \ ROOT_USER=${root_user} SED=${sedprog} SYSCONFDIR=${sysconfdir} \ $shprog ./bootstrap.sh)" bootstrap_bmake() { echo_msg "Bootstrapping bmake" copy_src $pkgsrcdir/devel/bmake/files bmake run_cmd "(cd $wrkdir/bmake && $shprog configure $configure_quiet_flags --prefix=$wrkdir --with-default-sys-path=$wrkdir/share/mk --with-machine-arch=${machine_arch} $bmakexargs)" run_cmd "(cd $wrkdir/bmake && $shprog make-bootstrap.sh)" run_cmd "$install_sh -c -o $user -g $group -m 755 $wrkdir/bmake/bmake $wrkdir/bin/bmake" } bootstrap_bmake bmake="$wrkdir/bin/bmake" # build libnbcompat echo_msg "Building libnbcompat" copy_src $pkgsrcdir/pkgtools/libnbcompat/files libnbcompat run_cmd "(cd $wrkdir/libnbcompat; $shprog ./configure $configure_quiet_flags -C --prefix=$prefix --infodir=$infodir --mandir=$mandir --sysconfdir=$sysconfdir --enable-bsd-getopt --enable-db && $bmake $make_quiet_flags -j$make_jobs)" # bootstrap ksh if necessary case "$need_ksh" in yes) echo_msg "Bootstrapping ksh" copy_src $pkgsrcdir/shells/pdksh/files ksh test -n "$CC" || CC=gcc # default to gcc if no compiler is specified run_cmd "(cd $wrkdir/ksh && env $BSTRAP_ENV $shprog ./configure $configure_quiet_flags --prefix=$prefix --infodir=$infodir --mandir=$mandir --sysconfdir=$sysconfdir && $bmake $make_quiet_flags -j$make_jobs)" run_cmd "$install_sh -c -o $user -g $group -m 755 $wrkdir/ksh/ksh $wrkdir/bin/pdksh" echo "TOOLS_PLATFORM.sh?= $prefix/bin/pdksh" >> ${TARGET_MKCONF} echo "TOOLS_PLATFORM.sh?= $wrkdir/bin/pdksh" >> ${BOOTSTRAP_MKCONF} echo "TOOLS_PLATFORM.ksh?= $prefix/bin/pdksh" >> ${TARGET_MKCONF} echo "TOOLS_PLATFORM.ksh?= $wrkdir/bin/pdksh" >> ${BOOTSTRAP_MKCONF} # Now rebootstrap bmake for ksh echo_msg "Rebootstrapping bmake for ksh" bmakexargs="$bmakexargs --with-defshell=$wrkdir/bin/pdksh" bootstrap_bmake ;; esac # bootstrap awk if necessary case "$need_awk" in yes) echo_msg "Bootstrapping awk" copy_src $pkgsrcdir/lang/nawk/files awk test -n "$CC" || CC=gcc # default to gcc if no compiler is specified run_cmd "(cd $wrkdir/awk && $bmake $make_quiet_flags -j$make_jobs -f Makefile CC=\"${CC}\" CFLAGS=\"${CFLAGS}\")" run_cmd "$install_sh -c -o $user -g $group -m 755 $wrkdir/awk/a.out $wrkdir/bin/nawk" echo "TOOLS_PLATFORM.awk?= $prefix/bin/nawk" >> ${TARGET_MKCONF} echo "TOOLS_PLATFORM.awk?= $wrkdir/bin/nawk" >> ${BOOTSTRAP_MKCONF} ;; esac # bootstrap sed if necessary case "$need_sed" in yes) echo_msg "Bootstrapping sed" copy_src $pkgsrcdir/textproc/nbsed/files sed run_cmd "(cd $wrkdir/sed; env $BSTRAP_ENV CPPFLAGS='$CPPFLAGS -I../libnbcompat' LDFLAGS='$LDFLAGS -L../libnbcompat' LIBS='$LIBS -lnbcompat' $shprog ./configure $configure_quiet_flags -C --prefix=$prefix --infodir=$infodir --mandir=$mandir --sysconfdir=$sysconfdir --program-transform-name='s,sed,nbsed,' && $bmake $make_quiet_flags -j$make_jobs)" run_cmd "$install_sh -c -o $user -g $group -m 755 $wrkdir/sed/sed $wrkdir/bin/sed" echo "TOOLS_PLATFORM.sed?= $prefix/bin/nbsed" >> ${TARGET_MKCONF} echo "TOOLS_PLATFORM.sed?= $wrkdir/bin/sed" >> ${BOOTSTRAP_MKCONF} ;; esac # bootstrap pkg_install echo_msg "Bootstrapping pkgtools" copy_src $pkgsrcdir/archivers/libarchive/files libarchive run_cmd "(cd $wrkdir/libarchive; env $BSTRAP_ENV \ $shprog ./configure $configure_quiet_flags --enable-static --disable-shared \ --disable-bsdtar --disable-bsdcpio --disable-posix-regex-lib --disable-xattr \ --disable-maintainer-mode --disable-acl --without-zlib --without-bz2lib \ --without-lzmadec --without-iconv --without-lzma --without-lzo2 --without-lz4 \ --without-nettle --without-openssl --without-xml2 --without-expat \ MAKE=$bmake && $bmake $make_quiet_flags -j$make_jobs)" copy_src $pkgsrcdir/pkgtools/pkg_install/files pkg_install run_cmd "(cd $wrkdir/pkg_install; env $BSTRAP_ENV \ CPPFLAGS='$CPPFLAGS -I${wrkdir}/libnbcompat -I${wrkdir}/libarchive/libarchive' \ LDFLAGS='$LDFLAGS -L${wrkdir}/libnbcompat' \ LIBS='$LIBS -lnbcompat' $shprog ./configure $configure_quiet_flags -C \ --enable-bootstrap --prefix=$prefix --sysconfdir=$sysconfdir \ --with-pkgdbdir=$pkgdbdir --infodir=$infodir \ --mandir=$mandir $pkg_install_args && \ STATIC_LIBARCHIVE=$wrkdir/libarchive/.libs/libarchive.a \ PKGSRC_MACHINE_ARCH="$machine_arch" $bmake $make_quiet_flags -j$make_jobs)" run_cmd "$install_sh -c -o $user -g $group -m 755 $wrkdir/pkg_install/add/pkg_add $wrkdir/sbin/pkg_add" run_cmd "$install_sh -c -o $user -g $group -m 755 $wrkdir/pkg_install/admin/pkg_admin $wrkdir/sbin/pkg_admin" run_cmd "$install_sh -c -o $user -g $group -m 755 $wrkdir/pkg_install/create/pkg_create $wrkdir/sbin/pkg_create" run_cmd "$install_sh -c -o $user -g $group -m 755 $wrkdir/pkg_install/info/pkg_info $wrkdir/sbin/pkg_info" echo "PKG_ADD_CMD?= $wrkdir/sbin/pkg_add" >> ${BOOTSTRAP_MKCONF} echo "PKG_ADMIN_CMD?= $wrkdir/sbin/pkg_admin" >> ${BOOTSTRAP_MKCONF} echo "PKG_CREATE_CMD?= $wrkdir/sbin/pkg_create" >> ${BOOTSTRAP_MKCONF} echo "PKG_INFO_CMD?= $wrkdir/sbin/pkg_info" >> ${BOOTSTRAP_MKCONF} MAKECONF=$wrkdir/mk.conf export MAKECONF if [ "$bootstrap_sh_set" = "set" ]; then echo "TOOLS_PLATFORM.sh?= ${bootstrap_sh}" >> ${TARGET_MKCONF} echo "TOOLS_PLATFORM.sh?= ${bootstrap_sh}" >> ${BOOTSTRAP_MKCONF} fi # preserve compiler and tool environment variables settings if test -n "$CP"; then echo "TOOLS_PLATFORM.cp?= $CP" >> ${TARGET_MKCONF} echo "TOOLS_PLATFORM.cp?= $CP" >> ${BOOTSTRAP_MKCONF} fi if test -n "$GREP"; then echo "TOOLS_PLATFORM.grep?= $GREP" >> ${TARGET_MKCONF} echo "TOOLS_PLATFORM.grep?= $GREP" >> ${BOOTSTRAP_MKCONF} fi if test -n "$ID"; then echo "TOOLS_PLATFORM.id?= $ID" >> ${TARGET_MKCONF} echo "TOOLS_PLATFORM.id?= $ID" >> ${BOOTSTRAP_MKCONF} fi if test -n "$MKDIR"; then echo "TOOLS_PLATFORM.mkdir?= $MKDIR" >> ${TARGET_MKCONF} echo "TOOLS_PLATFORM.mkdir?= $MKDIR" >> ${BOOTSTRAP_MKCONF} fi if test -n "$TEST"; then echo "TOOLS_PLATFORM.test?= $TEST" >> ${TARGET_MKCONF} echo "TOOLS_PLATFORM.test?= $TEST" >> ${BOOTSTRAP_MKCONF} fi if test -n "$TOUCH"; then echo "TOOLS_PLATFORM.touch?= $TOUCH" >> ${TARGET_MKCONF} echo "TOOLS_PLATFORM.touch?= $TOUCH" >> ${BOOTSTRAP_MKCONF} fi if test -n "$XARGS"; then echo "TOOLS_PLATFORM.xargs?= $XARGS" >> ${TARGET_MKCONF} echo "TOOLS_PLATFORM.xargs?= $XARGS" >> ${BOOTSTRAP_MKCONF} fi if test -n "$CFLAGS"; then echo "CFLAGS+= $CFLAGS" >> ${TARGET_MKCONF} echo "DBG= # prevent DBG from adding default optimizer flags" >> ${TARGET_MKCONF} echo "DBG= # prevent DBG from adding default optimizer flags" >> ${BOOTSTRAP_MKCONF} fi if test -n "$CPPFLAGS"; then echo "CPPFLAGS+= $CPPFLAGS" >> ${TARGET_MKCONF} fi if test -n "$LDFLAGS"; then echo "LDFLAGS+= $LDFLAGS" >> ${TARGET_MKCONF} fi if test -n "$LIBS"; then echo "LIBS+= $LIBS" >> ${TARGET_MKCONF} fi # opsys specific fiddling opsys_finish echo "WRKOBJDIR= ${wrkdir}/wrk" >> ${BOOTSTRAP_MKCONF} echo "" >> ${TARGET_MKCONF} echo "" >> ${BOOTSTRAP_MKCONF} if test -n "${mk_fragment}"; then cat "${mk_fragment}" >> ${TARGET_MKCONF} echo "" >> ${TARGET_MKCONF} fi echo ".endif # end pkgsrc settings" >> ${TARGET_MKCONF} echo ".endif # end pkgsrc settings" >> ${BOOTSTRAP_MKCONF} # build and register packages # usage: build_package build_package() { run_cmd "(cd $pkgsrcdir/$1 && $bmake $make_quiet_flags MAKE_JOBS=${make_jobs} PKG_COMPRESSION=none -DPKG_PRESERVE MAKECONF=${BOOTSTRAP_MKCONF} install)" } build_package_nopreserve() { run_cmd "(cd $pkgsrcdir/$1 && $bmake $make_quiet_flags MAKE_JOBS=${make_jobs} PKG_COMPRESSION=none MAKECONF=${BOOTSTRAP_MKCONF} install)" } # # cwrappers is special, we don't want to set it as a BOOTSTRAP_PKG but must # build it (if required) without -DPKG_PRESERVE set so that it can be deleted. # use_cwrappers=`(cd $pkgsrcdir/devel/bmake && $bmake show-var VARNAME=_USE_CWRAPPERS)` case "$use_cwrappers" in yes) build_package_nopreserve "pkgtools/cwrappers" ;; esac # # Please make sure that the following packages and # only the following packages set BOOTSTRAP_PKG=yes. # echo_msg "Installing packages" build_package "pkgtools/bootstrap-mk-files" case "$need_bsd_install" in yes) if [ "$use_bsdinstall" = "yes" ]; then build_package "sysutils/bsdinstall" else build_package "sysutils/install-sh" fi ;; esac case "$need_ksh" in yes) build_package "shells/pdksh";; esac build_package "devel/bmake" case "$need_awk" in yes) build_package "lang/nawk";; esac case "$need_sed" in yes) build_package "textproc/nbsed";; esac case "$need_extras" in yes) build_package "pkgtools/bootstrap-extras";; esac build_package "pkgtools/pkg_install" etc_mk_conf="$sysconfdir/mk.conf" # Install the example mk.conf so that it is used, but only if it doesn't # exist yet. This can happen with non-default sysconfdir settings. mkdir_p "$sysconfdir" if [ ! -f "$etc_mk_conf" ]; then cp "$TARGET_MKCONF" "$etc_mk_conf" TARGET_MKCONF="$etc_mk_conf" fi hline="===========================================================================" echo "" echo "$hline" echo "" echo "Please remember to add $prefix/bin to your PATH environment variable" echo "and $mandir to your MANPATH environment variable, if necessary." echo "" echo "An example mk.conf file with the settings you provided to \"bootstrap\"" echo "has been created for you. It can be found in:" echo "" echo " ${TARGET_MKCONF}" echo "" if [ "$TARGET_MKCONF" != "$etc_mk_conf" ]; then echo "Please copy it to $etc_mk_conf to use it." echo "" fi echo "You can find extensive documentation of the NetBSD Packages Collection" echo "in $pkgsrcdir/doc/pkgsrc.txt." echo "" echo "Hopefully everything is now complete." echo "Thank you for using pkgsrc!" echo "" echo "$hline" echo "" [ -n "${binary_kit}" ] && mkbinarykit_tar [ -n "${binary_gzip_kit}" ] && mkbinarykit_tgz [ -n "${binary_macpkg}" ] && mkbinarykit_macpkg echo_msg "bootstrap started: $build_start" echo_msg "bootstrap ended: `date`" exit 0