diff options
| author | Jerry Jelinek <jerry.jelinek@joyent.com> | 2020-01-27 12:32:37 +0000 |
|---|---|---|
| committer | Jerry Jelinek <jerry.jelinek@joyent.com> | 2020-01-27 12:32:37 +0000 |
| commit | 531f6e0494c75ea1e5b1f86f5dc336587440f0c5 (patch) | |
| tree | 8ceac8e1d0175cf4aeaed71ff9d18a028e921de8 /usr/src/tools/scripts/bldenv | |
| parent | 3e1df384f9e21a6998ea827eee151e8953bb3147 (diff) | |
| parent | 5ca82e6914c4162ba9b7028b19c9d77d3eadaf17 (diff) | |
| download | illumos-joyent-531f6e0494c75ea1e5b1f86f5dc336587440f0c5.tar.gz | |
[illumos-gate merge]
commit 5ca82e6914c4162ba9b7028b19c9d77d3eadaf17
11224 nightly and bldenv should be usable directly
commit e90dc2b3580db8c2b04f138bba39aef292972dd2
12248 libdscp no longer needs to link with libnsl
commit c60a820f97f4b84a182cb6e21fe8a25ff0ad3c4f
12239 chk4ubin: smatch errors
commit 12661a24a0babe84d0a1b8d1fe46fb61dcc5011e
12238 stabs: smatch errors
commit d851c23803d14c57f342f6cca648ec3bfb5ea9d1
12246 pci_get_irq_routing_table() leaks under UEFI
commit 54cceed6fe59abfe2b58b5b1ef5bb12e652048fa
12144 Convert Intro(7) to mandoc
12145 Convert cpr(7) to mandoc
12146 Convert ibmf(7) to mandoc
12147 Convert FSS(7) to mandoc
commit 9f9c12cd25ff2bda305600e1620ad2eecad4ef19
12243 too many NFS threads actually hurts performance
commit 17a06589f9735e8864d445426faac16505b5d072
12184 SPARC build fails due to missing 64-bit libdhcpagent
commit 8c4f148689a42031a168cdc4c81062735db025e0
12193 zonestatd: Wrong indentation in zsd_usage_cache_update()
Diffstat (limited to 'usr/src/tools/scripts/bldenv')
| -rwxr-xr-x | usr/src/tools/scripts/bldenv | 421 |
1 files changed, 421 insertions, 0 deletions
diff --git a/usr/src/tools/scripts/bldenv b/usr/src/tools/scripts/bldenv new file mode 100755 index 0000000000..85999e5b77 --- /dev/null +++ b/usr/src/tools/scripts/bldenv @@ -0,0 +1,421 @@ +#!/usr/bin/ksh93 +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# + +# +# Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright 2011 Nexenta Systems, Inc. All rights reserved. +# Copyright 2014 Garrett D'Amore <garrett@damore.org> +# Copyright 2020 Joyent, Inc. +# +# Uses supplied "env" file, based on /opt/onbld/etc/env, to set shell variables +# before spawning a shell for doing a release-style builds interactively +# and incrementally. +# + +function fatal_error +{ + print -u2 "${progname}: $*" + exit 1 +} + +function usage +{ + OPTIND=0 + getopts -a "${progname}" "${USAGE}" OPT '-?' + exit 2 +} + +typeset -r USAGE=$'+ +[-?\n@(#)\$Id: bldenv (OS/Net) 2008-04-06 \$\n] +[-author?OS/Net community <tools-discuss@opensolaris.org>] +[+NAME?bldenv - spawn shell for interactive incremental OS-Net + consolidation builds] +[+DESCRIPTION?bldenv is a useful companion to the nightly(1) script for + doing interactive and incremental builds in a workspace + already built with nightly(1). bldenv spawns a shell set up + with the same environment variables taken from an env_file, + as prepared for use with nightly(1).] +[+?In addition to running a shell for interactive use, bldenv + can optionally run a single command in the given environment, + in the vein of sh -c or su -c. This is useful for + scripting, when an interactive shell would not be. If the + command is composed of multiple shell words or contains + other shell metacharacters, it must be quoted appropriately.] +[+?bldenv is particularly useful for testing Makefile targets + like clobber, install and _msg, which otherwise require digging + through large build logs to figure out what is being + done.] +[+?By default, bldenv will invoke the shell specified in + $SHELL. If $SHELL is not set or is invalid, csh will be + used.] +[c?force the use of csh, regardless of the value of $SHELL.] +[f?invoke csh with the -f (fast-start) option. This option is valid + only if $SHELL is unset or if it points to csh.] +[d?set up environment for doing DEBUG builds. The default is non-DEBUG, + unless the -F flag is specified in the nightly file.] +[t?set up environment to use the tools in usr/src/tools (this is the + default, use +t to use the tools from /opt/onbld)] + +<env_file> [command] + +[+EXAMPLES]{ + [+?Example 1: Interactive use]{ + [+?Use bldenv to spawn a shell to perform a DEBUG build and + testing of the Makefile targets clobber and install for + usr/src/cmd/true.] + [+\n% rlogin wopr-2 -l gk +{root::wopr-2::49} bldenv -d /export0/jg/on10-se.env +Build type is DEBUG +RELEASE is 5.10 +VERSION is wopr-2::on10-se::11/01/2001 +RELEASE_DATE is May 2004 +The top-level `setup\' target is available to build headers +and tools. +Using /usr/bin/tcsh as shell. +{root::wopr-2::49} +{root::wopr-2::49} cd $SRC/cmd/true +{root::wopr-2::50} make +{root::wopr-2::51} make clobber +/usr/bin/rm -f true true.po +{root::wopr-2::52} make +/usr/bin/rm -f true +cat true.sh > true +chmod +x true +{root::wopr-2::53} make install +install -s -m 0555 -u root -g bin -f /export0/jg/on10-se/proto/root_sparc/usr/bin true +`install\' is up to date.] + } + [+?Example 2: Non-interactive use]{ + [+?Invoke bldenv to create SUNWonbld with a single command:] + [+\nexample% bldenv onnv_06 \'cd $SRC/tools && make pkg\'] + } +} +[+SEE ALSO?\bnightly\b(1)] +' + +# main +builtin basename + +# boolean flags (true/false) +typeset flags=( + typeset c=false + typeset f=false + typeset d=false + typeset O=false + typeset o=false + typeset t=true + typeset s=( + typeset e=false + typeset h=false + typeset d=false + typeset o=false + ) + typeset d_set=false + typeset DF_build=false +) + +typeset progname="$(basename -- "${0}")" + +OPTIND=1 + +while getopts -a "${progname}" "${USAGE}" OPT ; do + case ${OPT} in + c) flags.c=true ;; + +c) flags.c=false ;; + f) flags.f=true ;; + +f) flags.f=false ;; + d) flags.d=true ; flags.d_set=true ;; + +d) flags.d=false ; flags.d_set=true ;; + t) flags.t=true ;; + +t) flags.t=false ;; + \?) usage ;; + esac +done +shift $((OPTIND-1)) + +# test that the path to the environment-setting file was given +if (( $# < 1 )) ; then + usage +fi + +# force locale to C +export \ + LANG=C \ + LC_ALL=C \ + LC_COLLATE=C \ + LC_CTYPE=C \ + LC_MESSAGES=C \ + LC_MONETARY=C \ + LC_NUMERIC=C \ + LC_TIME=C + +# clear environment variables we know to be bad for the build +unset \ + LD_OPTIONS \ + LD_LIBRARY_PATH \ + LD_AUDIT \ + LD_BIND_NOW \ + LD_BREADTH \ + LD_CONFIG \ + LD_DEBUG \ + LD_FLAGS \ + LD_LIBRARY_PATH_64 \ + LD_NOVERSION \ + LD_ORIGIN \ + LD_LOADFLTR \ + LD_NOAUXFLTR \ + LD_NOCONFIG \ + LD_NODIRCONFIG \ + LD_NOOBJALTER \ + LD_PRELOAD \ + LD_PROFILE \ + CONFIG \ + GROUP \ + OWNER \ + REMOTE \ + ENV \ + ARCH \ + CLASSPATH + +# +# Setup environment variables +# +if [[ -f /etc/nightly.conf ]]; then + source /etc/nightly.conf +fi + +if [[ -f "$1" ]]; then + if [[ "$1" == */* ]]; then + source "$1" + else + source "./$1" + fi +else + if [[ -f "/opt/onbld/env/$1" ]]; then + source "/opt/onbld/env/$1" + else + printf \ + 'Cannot find env file as either %s or /opt/onbld/env/%s\n' \ + "$1" "$1" + exit 1 + fi +fi +shift + +# Check if we have sufficient data to continue... +[[ -v CODEMGR_WS ]] || fatal_error "Error: Variable CODEMGR_WS not set." +[[ -d "${CODEMGR_WS}" ]] || fatal_error "Error: ${CODEMGR_WS} is not a directory." +[[ -f "${CODEMGR_WS}/usr/src/Makefile" ]] || fatal_error "Error: ${CODEMGR_WS}/usr/src/Makefile not found." + +# must match the getopts in nightly +OPTIND=1 +NIGHTLY_OPTIONS="-${NIGHTLY_OPTIONS#-}" +while getopts '+0ABCDdFfGIilMmNnpRrtUuwW' FLAG $NIGHTLY_OPTIONS +do + case "$FLAG" in + t) flags.t=true ;; + +t) flags.t=false ;; + F) flags.DF_build=true ;; + *) ;; + esac +done + +# DEBUG is a little bit complicated. First, bldenv -d/+d over-rides +# the env file. Otherwise, we'll default to DEBUG iff we are *not* +# building non-DEBUG bits at all. +if [ "${flags.d_set}" != "true" ] && "${flags.DF_build}"; then + flags.d=true +fi + +POUND_SIGN="#" +# have we set RELEASE_DATE in our env file? +if [ -z "$RELEASE_DATE" ]; then + RELEASE_DATE=$(LC_ALL=C date +"%B %Y") +fi +BUILD_DATE=$(LC_ALL=C date +%Y-%b-%d) +BASEWSDIR=$(basename -- "${CODEMGR_WS}") +DEV_CM="\"@(#)SunOS Internal Development: $LOGNAME $BUILD_DATE [$BASEWSDIR]\"" +export DEV_CM RELEASE_DATE POUND_SIGN + +print 'Build type is \c' +if ${flags.d} ; then + print 'DEBUG' + SUFFIX="" + unset RELEASE_BUILD + unset EXTRA_OPTIONS + unset EXTRA_CFLAGS + + if [ -n "$DEBUG_CONSOLE_COLOR" ]; then + export DEFAULT_CONSOLE_COLOR="$DEBUG_CONSOLE_COLOR" + fi +else + # default is a non-DEBUG build + print 'non-DEBUG' + SUFFIX="-nd" + export RELEASE_BUILD= + unset EXTRA_OPTIONS + unset EXTRA_CFLAGS + + if [ -n "$RELEASE_CONSOLE_COLOR" ]; then + export DEFAULT_CONSOLE_COLOR="$RELEASE_CONSOLE_COLOR" + fi +fi + +# update build-type variables +PKGARCHIVE="${PKGARCHIVE}${SUFFIX}" + +# Set PATH for a build +PATH="/opt/onbld/bin:/opt/onbld/bin/${MACH}:/opt/SUNWspro/bin:/usr/ccs/bin:/usr/bin:/usr/sbin:/usr/ucb:/usr/etc:/usr/openwin/bin:/usr/sfw/bin:/opt/sfw/bin:." +if [[ "${SUNWSPRO}" != "" ]]; then + export PATH="${SUNWSPRO}/bin:$PATH" +fi + +if [[ -n "${MAKE}" ]]; then + if [[ -x "${MAKE}" ]]; then + export PATH="$(dirname -- "${MAKE}"):$PATH" + else + print "\$MAKE (${MAKE}) is not a valid executible" + exit 1 + fi +fi + +TOOLS="${SRC}/tools" +TOOLS_PROTO="${TOOLS}/proto/root_${MACH}-nd" ; export TOOLS_PROTO + +if "${flags.t}" ; then + export ONBLD_TOOLS="${ONBLD_TOOLS:=${TOOLS_PROTO}/opt/onbld}" + + export STABS="${TOOLS_PROTO}/opt/onbld/bin/${MACH}/stabs" + export CTFSTABS="${TOOLS_PROTO}/opt/onbld/bin/${MACH}/ctfstabs" + export GENOFFSETS="${TOOLS_PROTO}/opt/onbld/bin/genoffsets" + + export CTFCONVERT="${TOOLS_PROTO}/opt/onbld/bin/${MACH}/ctfconvert" + export CTFMERGE="${TOOLS_PROTO}/opt/onbld/bin/${MACH}/ctfmerge" + export NDRGEN="${TOOLS_PROTO}/opt/onbld/bin/${MACH}/ndrgen" + + PATH="${TOOLS_PROTO}/opt/onbld/bin/${MACH}:${PATH}" + PATH="${TOOLS_PROTO}/opt/onbld/bin:${PATH}" + export PATH +fi + +export DMAKE_MODE=${DMAKE_MODE:-parallel} + +# +# Work around folks who have historically used GCC_ROOT and convert it to +# GNUC_ROOT. We leave GCC_ROOT in the environment for now (though this could +# mess up the case where multiple different gcc versions are being used to +# shadow). +# +if [[ -n "${GCC_ROOT}" ]]; then + export GNUC_ROOT=${GCC_ROOT} +fi + +DEF_STRIPFLAG="-s" + +TMPDIR="/tmp" + +export \ + PATH TMPDIR \ + POUND_SIGN \ + DEF_STRIPFLAG \ + RELEASE_DATE +unset \ + CFLAGS \ + LD_LIBRARY_PATH + +# a la ws +ENVLDLIBS1= +ENVLDLIBS2= +ENVLDLIBS3= +ENVCPPFLAGS1= +ENVCPPFLAGS2= +ENVCPPFLAGS3= +ENVCPPFLAGS4= +PARENT_ROOT= +PARENT_TOOLS_ROOT= + +if [[ "$MULTI_PROTO" != "yes" && "$MULTI_PROTO" != "no" ]]; then + printf \ + 'WARNING: invalid value for MULTI_PROTO (%s); setting to "no".\n' \ + "$MULTI_PROTO" + export MULTI_PROTO="no" +fi + +[[ "$MULTI_PROTO" == "yes" ]] && export ROOT="${ROOT}${SUFFIX}" + +ENVLDLIBS1="-L$ROOT/lib -L$ROOT/usr/lib" +ENVCPPFLAGS1="-I$ROOT/usr/include" +MAKEFLAGS=e + +export \ + ENVLDLIBS1 \ + ENVLDLIBS2 \ + ENVLDLIBS3 \ + ENVCPPFLAGS1 \ + ENVCPPFLAGS2 \ + ENVCPPFLAGS3 \ + ENVCPPFLAGS4 \ + MAKEFLAGS \ + PARENT_ROOT \ + PARENT_TOOLS_ROOT + +printf 'RELEASE is %s\n' "$RELEASE" +printf 'VERSION is %s\n' "$VERSION" +printf 'RELEASE_DATE is %s\n\n' "$RELEASE_DATE" + +if [[ -f "$SRC/Makefile" ]] && egrep -s '^setup:' "$SRC/Makefile" ; then + print "The top-level 'setup' target is available \c" + print "to build headers and tools." + print "" + +elif "${flags.t}" ; then + printf \ + 'The tools can be (re)built with the install target in %s.\n\n' \ + "${TOOLS}" +fi + +# +# place ourselves in a new task, respecting BUILD_PROJECT if set. +# +/usr/bin/newtask -c $$ ${BUILD_PROJECT:+-p$BUILD_PROJECT} + +if [[ "${flags.c}" == "false" && -x "$SHELL" && \ + "$(basename -- "${SHELL}")" != "csh" ]]; then + # $SHELL is set, and it's not csh. + + if "${flags.f}" ; then + print 'WARNING: -f is ignored when $SHELL is not csh' + fi + + printf 'Using %s as shell.\n' "$SHELL" + exec "$SHELL" ${@:+-c "$@"} + +elif "${flags.f}" ; then + print 'Using csh -f as shell.' + exec csh -f ${@:+-c "$@"} + +else + print 'Using csh as shell.' + exec csh ${@:+-c "$@"} +fi + +# not reached |
