1 #!/usr/bin/ksh93
2 #
3 # CDDL HEADER START
4 #
5 # The contents of this file are subject to the terms of the
6 # Common Development and Distribution License (the "License").
7 # You may not use this file except in compliance with the License.
8 #
9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 # or http://www.opensolaris.org/os/licensing.
11 # See the License for the specific language governing permissions
12 # and limitations under the License.
13 #
14 # When distributing Covered Code, include this CDDL HEADER in each
15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 # If applicable, add the following below this CDDL HEADER, with the
17 # fields enclosed by brackets "[]" replaced with your own identifying
18 # information: Portions Copyright [yyyy] [name of copyright owner]
19 #
20 # CDDL HEADER END
21 #
22
23 #
24 # Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
25 # Copyright 2011 Nexenta Systems, Inc. All rights reserved.
26 # Copyright 2014 Garrett D'Amore <garrett@damore.org>
27 # Copyright 2018 Joyent, Inc.
28 #
29 # Uses supplied "env" file, based on /opt/onbld/etc/env, to set shell variables
30 # before spawning a shell for doing a release-style builds interactively
31 # and incrementally.
32 #
33
34 function fatal_error
35 {
36 print -u2 "${progname}: $*"
37 exit 1
38 }
39
40 function usage
41 {
42 OPTIND=0
43 getopts -a "${progname}" "${USAGE}" OPT '-?'
44 exit 2
45 }
46
47 typeset -r USAGE=$'+
48 [-?\n@(#)\$Id: bldenv (OS/Net) 2008-04-06 \$\n]
49 [-author?OS/Net community <tools-discuss@opensolaris.org>]
50 [+NAME?bldenv - spawn shell for interactive incremental OS-Net
51 consolidation builds]
52 [+DESCRIPTION?bldenv is a useful companion to the nightly(1) script for
53 doing interactive and incremental builds in a workspace
54 already built with nightly(1). bldenv spawns a shell set up
55 with the same environment variables taken from an env_file,
56 as prepared for use with nightly(1).]
57 [+?In addition to running a shell for interactive use, bldenv
58 can optionally run a single command in the given environment,
59 in the vein of sh -c or su -c. This is useful for
60 scripting, when an interactive shell would not be. If the
61 command is composed of multiple shell words or contains
62 other shell metacharacters, it must be quoted appropriately.]
63 [+?bldenv is particularly useful for testing Makefile targets
64 like clobber, install and _msg, which otherwise require digging
65 through large build logs to figure out what is being
66 done.]
67 [+?By default, bldenv will invoke the shell specified in
68 $SHELL. If $SHELL is not set or is invalid, csh will be
69 used.]
70 [c?force the use of csh, regardless of the value of $SHELL.]
71 [f?invoke csh with the -f (fast-start) option. This option is valid
72 only if $SHELL is unset or if it points to csh.]
73 [d?set up environment for doing DEBUG builds. The default is non-DEBUG,
74 unless the -F flag is specified in the nightly file.]
75 [t?set up environment to use the tools in usr/src/tools (this is the
76 default, use +t to use the tools from /opt/onbld)]
77
78 <env_file> [command]
79
80 [+EXAMPLES]{
81 [+?Example 1: Interactive use]{
82 [+?Use bldenv to spawn a shell to perform a DEBUG build and
83 testing of the Makefile targets clobber and install for
84 usr/src/cmd/true.]
85 [+\n% rlogin wopr-2 -l gk
86 {root::wopr-2::49} bldenv -d /export0/jg/on10-se.env
87 Build type is DEBUG
88 RELEASE is 5.10
89 VERSION is wopr-2::on10-se::11/01/2001
90 RELEASE_DATE is May 2004
91 The top-level `setup\' target is available to build headers
92 and tools.
93 Using /usr/bin/tcsh as shell.
94 {root::wopr-2::49}
95 {root::wopr-2::49} cd $SRC/cmd/true
96 {root::wopr-2::50} make
97 {root::wopr-2::51} make clobber
98 /usr/bin/rm -f true true.po
99 {root::wopr-2::52} make
100 /usr/bin/rm -f true
101 cat true.sh > true
102 chmod +x true
103 {root::wopr-2::53} make install
104 install -s -m 0555 -u root -g bin -f /export0/jg/on10-se/proto/root_sparc/usr/bin true
105 `install\' is up to date.]
106 }
107 [+?Example 2: Non-interactive use]{
108 [+?Invoke bldenv to create SUNWonbld with a single command:]
109 [+\nexample% bldenv onnv_06 \'cd $SRC/tools && make pkg\']
110 }
111 }
112 [+SEE ALSO?\bnightly\b(1)]
113 '
114
115 # main
116 builtin basename
117
118 # boolean flags (true/false)
119 typeset flags=(
120 typeset c=false
121 typeset f=false
122 typeset d=false
123 typeset O=false
124 typeset o=false
125 typeset t=true
126 typeset s=(
127 typeset e=false
128 typeset h=false
129 typeset d=false
130 typeset o=false
131 )
132 typeset d_set=false
133 typeset DF_build=false
134 )
135
136 typeset progname="$(basename -- "${0}")"
137
138 OPTIND=1
139
140 while getopts -a "${progname}" "${USAGE}" OPT ; do
141 case ${OPT} in
142 c) flags.c=true ;;
143 +c) flags.c=false ;;
144 f) flags.f=true ;;
145 +f) flags.f=false ;;
146 d) flags.d=true ; flags.d_set=true ;;
147 +d) flags.d=false ; flags.d_set=true ;;
148 t) flags.t=true ;;
149 +t) flags.t=false ;;
150 \?) usage ;;
151 esac
152 done
153 shift $((OPTIND-1))
154
155 # test that the path to the environment-setting file was given
156 if (( $# < 1 )) ; then
157 usage
158 fi
159
160 # force locale to C
161 export \
162 LANG=C \
163 LC_ALL=C \
164 LC_COLLATE=C \
165 LC_CTYPE=C \
166 LC_MESSAGES=C \
167 LC_MONETARY=C \
168 LC_NUMERIC=C \
169 LC_TIME=C
170
171 # clear environment variables we know to be bad for the build
172 unset \
173 LD_OPTIONS \
174 LD_LIBRARY_PATH \
175 LD_AUDIT \
176 LD_BIND_NOW \
177 LD_BREADTH \
178 LD_CONFIG \
179 LD_DEBUG \
180 LD_FLAGS \
181 LD_LIBRARY_PATH_64 \
182 LD_NOVERSION \
183 LD_ORIGIN \
184 LD_LOADFLTR \
185 LD_NOAUXFLTR \
186 LD_NOCONFIG \
187 LD_NODIRCONFIG \
188 LD_NOOBJALTER \
189 LD_PRELOAD \
190 LD_PROFILE \
191 CONFIG \
192 GROUP \
193 OWNER \
194 REMOTE \
195 ENV \
196 ARCH \
197 CLASSPATH
198
199 #
200 # Setup environment variables
201 #
202 if [[ -f /etc/nightly.conf ]]; then
203 source /etc/nightly.conf
204 fi
205
206 if [[ -f "$1" ]]; then
207 if [[ "$1" == */* ]]; then
208 source "$1"
209 else
210 source "./$1"
211 fi
212 else
213 if [[ -f "/opt/onbld/env/$1" ]]; then
214 source "/opt/onbld/env/$1"
215 else
216 printf \
217 'Cannot find env file as either %s or /opt/onbld/env/%s\n' \
218 "$1" "$1"
219 exit 1
220 fi
221 fi
222 shift
223
224 # contents of stdenv.sh inserted after next line:
225 # STDENV_START
226 # STDENV_END
227
228 # Check if we have sufficient data to continue...
229 [[ -v CODEMGR_WS ]] || fatal_error "Error: Variable CODEMGR_WS not set."
230 [[ -d "${CODEMGR_WS}" ]] || fatal_error "Error: ${CODEMGR_WS} is not a directory."
231 [[ -f "${CODEMGR_WS}/usr/src/Makefile" ]] || fatal_error "Error: ${CODEMGR_WS}/usr/src/Makefile not found."
232
233 # must match the getopts in nightly.sh
234 OPTIND=1
235 NIGHTLY_OPTIONS="-${NIGHTLY_OPTIONS#-}"
236 while getopts '+0ABCDdFfGIilMmNnpRrtUuwW' FLAG $NIGHTLY_OPTIONS
237 do
238 case "$FLAG" in
239 t) flags.t=true ;;
240 +t) flags.t=false ;;
241 F) flags.DF_build=true ;;
242 *) ;;
243 esac
244 done
245
246 # DEBUG is a little bit complicated. First, bldenv -d/+d over-rides
247 # the env file. Otherwise, we'll default to DEBUG iff we are *not*
248 # building non-DEBUG bits at all.
249 if [ "${flags.d_set}" != "true" ] && "${flags.DF_build}"; then
250 flags.d=true
251 fi
252
253 POUND_SIGN="#"
254 # have we set RELEASE_DATE in our env file?
255 if [ -z "$RELEASE_DATE" ]; then
256 RELEASE_DATE=$(LC_ALL=C date +"%B %Y")
257 fi
258 BUILD_DATE=$(LC_ALL=C date +%Y-%b-%d)
259 BASEWSDIR=$(basename -- "${CODEMGR_WS}")
260 DEV_CM="\"@(#)SunOS Internal Development: $LOGNAME $BUILD_DATE [$BASEWSDIR]\""
261 export DEV_CM RELEASE_DATE POUND_SIGN
262
263 print 'Build type is \c'
264 if ${flags.d} ; then
265 print 'DEBUG'
266 SUFFIX=""
267 unset RELEASE_BUILD
268 unset EXTRA_OPTIONS
269 unset EXTRA_CFLAGS
270
271 if [ -n "$DEBUG_CONSOLE_COLOR" ]; then
272 export DEFAULT_CONSOLE_COLOR="$DEBUG_CONSOLE_COLOR"
273 fi
274 else
275 # default is a non-DEBUG build
276 print 'non-DEBUG'
277 SUFFIX="-nd"
278 export RELEASE_BUILD=
279 unset EXTRA_OPTIONS
280 unset EXTRA_CFLAGS
281
282 if [ -n "$RELEASE_CONSOLE_COLOR" ]; then
283 export DEFAULT_CONSOLE_COLOR="$RELEASE_CONSOLE_COLOR"
284 fi
285 fi
286
287 # update build-type variables
288 PKGARCHIVE="${PKGARCHIVE}${SUFFIX}"
289
290 # Set PATH for a build
291 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:."
292 if [[ "${SUNWSPRO}" != "" ]]; then
293 export PATH="${SUNWSPRO}/bin:$PATH"
294 fi
295
296 if [[ -n "${MAKE}" ]]; then
297 if [[ -x "${MAKE}" ]]; then
298 export PATH="$(dirname -- "${MAKE}"):$PATH"
299 else
300 print "\$MAKE (${MAKE}) is not a valid executible"
301 exit 1
302 fi
303 fi
304
305 TOOLS="${SRC}/tools"
306 TOOLS_PROTO="${TOOLS}/proto/root_${MACH}-nd" ; export TOOLS_PROTO
307
308 if "${flags.t}" ; then
309 export ONBLD_TOOLS="${ONBLD_TOOLS:=${TOOLS_PROTO}/opt/onbld}"
310
311 export STABS="${TOOLS_PROTO}/opt/onbld/bin/${MACH}/stabs"
312 export CTFSTABS="${TOOLS_PROTO}/opt/onbld/bin/${MACH}/ctfstabs"
313 export GENOFFSETS="${TOOLS_PROTO}/opt/onbld/bin/genoffsets"
314
315 export CTFCONVERT="${TOOLS_PROTO}/opt/onbld/bin/${MACH}/ctfconvert"
316 export CTFMERGE="${TOOLS_PROTO}/opt/onbld/bin/${MACH}/ctfmerge"
317 export NDRGEN="${TOOLS_PROTO}/opt/onbld/bin/${MACH}/ndrgen"
318
319 PATH="${TOOLS_PROTO}/opt/onbld/bin/${MACH}:${PATH}"
320 PATH="${TOOLS_PROTO}/opt/onbld/bin:${PATH}"
321 export PATH
322 fi
323
324 export DMAKE_MODE=${DMAKE_MODE:-parallel}
325
326 #
327 # Work around folks who have historically used GCC_ROOT and convert it to
328 # GNUC_ROOT. We leave GCC_ROOT in the environment for now (though this could
329 # mess up the case where multiple different gcc versions are being used to
330 # shadow).
331 #
332 if [[ -n "${GCC_ROOT}" ]]; then
333 export GNUC_ROOT=${GCC_ROOT}
334 fi
335
336 DEF_STRIPFLAG="-s"
337
338 TMPDIR="/tmp"
339
340 export \
341 PATH TMPDIR \
342 POUND_SIGN \
343 DEF_STRIPFLAG \
344 RELEASE_DATE
345 unset \
346 CFLAGS \
347 LD_LIBRARY_PATH
348
349 # a la ws
350 ENVLDLIBS1=
351 ENVLDLIBS2=
352 ENVLDLIBS3=
353 ENVCPPFLAGS1=
354 ENVCPPFLAGS2=
355 ENVCPPFLAGS3=
356 ENVCPPFLAGS4=
357 PARENT_ROOT=
358 PARENT_TOOLS_ROOT=
359
360 if [[ "$MULTI_PROTO" != "yes" && "$MULTI_PROTO" != "no" ]]; then
361 printf \
362 'WARNING: invalid value for MULTI_PROTO (%s); setting to "no".\n' \
363 "$MULTI_PROTO"
364 export MULTI_PROTO="no"
365 fi
366
367 [[ "$MULTI_PROTO" == "yes" ]] && export ROOT="${ROOT}${SUFFIX}"
368
369 ENVLDLIBS1="-L$ROOT/lib -L$ROOT/usr/lib"
370 ENVCPPFLAGS1="-I$ROOT/usr/include"
371 MAKEFLAGS=e
372
373 export \
374 ENVLDLIBS1 \
375 ENVLDLIBS2 \
376 ENVLDLIBS3 \
377 ENVCPPFLAGS1 \
378 ENVCPPFLAGS2 \
379 ENVCPPFLAGS3 \
380 ENVCPPFLAGS4 \
381 MAKEFLAGS \
382 PARENT_ROOT \
383 PARENT_TOOLS_ROOT
384
385 printf 'RELEASE is %s\n' "$RELEASE"
386 printf 'VERSION is %s\n' "$VERSION"
387 printf 'RELEASE_DATE is %s\n\n' "$RELEASE_DATE"
388
389 if [[ -f "$SRC/Makefile" ]] && egrep -s '^setup:' "$SRC/Makefile" ; then
390 print "The top-level 'setup' target is available \c"
391 print "to build headers and tools."
392 print ""
393
394 elif "${flags.t}" ; then
395 printf \
396 'The tools can be (re)built with the install target in %s.\n\n' \
397 "${TOOLS}"
398 fi
399
400 #
401 # place ourselves in a new task, respecting BUILD_PROJECT if set.
402 #
403 /usr/bin/newtask -c $$ ${BUILD_PROJECT:+-p$BUILD_PROJECT}
404
405 if [[ "${flags.c}" == "false" && -x "$SHELL" && \
406 "$(basename -- "${SHELL}")" != "csh" ]]; then
407 # $SHELL is set, and it's not csh.
408
409 if "${flags.f}" ; then
410 print 'WARNING: -f is ignored when $SHELL is not csh'
411 fi
412
413 printf 'Using %s as shell.\n' "$SHELL"
414 exec "$SHELL" ${@:+-c "$@"}
415
416 elif "${flags.f}" ; then
417 print 'Using csh -f as shell.'
418 exec csh -f ${@:+-c "$@"}
419
420 else
421 print 'Using csh as shell.'
422 exec csh ${@:+-c "$@"}
423 fi
424
425 # not reached