Print this page
9231 nightly should create a log/latest/ symlink
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/tools/scripts/nightly.sh
+++ new/usr/src/tools/scripts/nightly.sh
1 1 #!/bin/ksh -p
2 2 #
3 3 # CDDL HEADER START
4 4 #
5 5 # The contents of this file are subject to the terms of the
6 6 # Common Development and Distribution License (the "License").
7 7 # You may not use this file except in compliance with the License.
8 8 #
9 9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 10 # or http://www.opensolaris.org/os/licensing.
11 11 # See the License for the specific language governing permissions
12 12 # and limitations under the License.
13 13 #
14 14 # When distributing Covered Code, include this CDDL HEADER in each
15 15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 16 # If applicable, add the following below this CDDL HEADER, with the
17 17 # fields enclosed by brackets "[]" replaced with your own identifying
18 18 # information: Portions Copyright [yyyy] [name of copyright owner]
19 19 #
20 20 # CDDL HEADER END
21 21 #
22 22
23 23 #
24 24 # Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
25 25 # Copyright 2008, 2010, Richard Lowe
26 26 # Copyright 2011 Nexenta Systems, Inc. All rights reserved.
27 27 # Copyright 2012 Joshua M. Clulow <josh@sysmgr.org>
28 28 # Copyright (c) 2017 by Delphix. All rights reserved.
29 29 #
30 30 # Based on the nightly script from the integration folks,
31 31 # Mostly modified and owned by mike_s.
32 32 # Changes also by kjc, dmk.
33 33 #
34 34 # BRINGOVER_WS may be specified in the env file.
35 35 # The default is the old behavior of CLONE_WS
36 36 #
37 37 # -i on the command line, means fast options, so when it's on the
38 38 # command line (only), lint and check builds are skipped no matter what
39 39 # the setting of their individual flags are in NIGHTLY_OPTIONS.
40 40 #
41 41 # LINTDIRS can be set in the env file, format is a list of:
42 42 #
43 43 # /dirname-to-run-lint-on flag
44 44 #
45 45 # Where flag is: y - enable lint noise diff output
46 46 # n - disable lint noise diff output
47 47 #
48 48 # For example: LINTDIRS="$SRC/uts n $SRC/stand y $SRC/psm y"
49 49 #
50 50 # OPTHOME may be set in the environment to override /opt
51 51 #
52 52
53 53 #
54 54 # The CDPATH variable causes ksh's `cd' builtin to emit messages to stdout
55 55 # under certain circumstances, which can really screw things up; unset it.
56 56 #
57 57 unset CDPATH
58 58
59 59 # Get the absolute path of the nightly script that the user invoked. This
60 60 # may be a relative path, and we need to do this before changing directory.
61 61 nightly_path=`whence $0`
62 62
63 63 #
64 64 # Keep track of where we found nightly so we can invoke the matching
65 65 # which_scm script. If that doesn't work, don't go guessing, just rely
66 66 # on the $PATH settings, which will generally give us either /opt/onbld
67 67 # or the user's workspace.
68 68 #
69 69 WHICH_SCM=$(dirname $nightly_path)/which_scm
70 70 if [[ ! -x $WHICH_SCM ]]; then
71 71 WHICH_SCM=which_scm
72 72 fi
73 73
74 74 function fatal_error
75 75 {
76 76 print -u2 "nightly: $*"
77 77 exit 1
78 78 }
79 79
80 80 #
81 81 # Function to do a DEBUG and non-DEBUG build. Needed because we might
82 82 # need to do another for the source build, and since we only deliver DEBUG or
83 83 # non-DEBUG packages.
84 84 #
85 85 # usage: normal_build
86 86 #
87 87 function normal_build {
88 88
89 89 typeset orig_p_FLAG="$p_FLAG"
90 90 typeset crypto_signer="$CODESIGN_USER"
91 91
92 92 suffix=""
93 93
94 94 # non-DEBUG build begins
95 95
96 96 if [ "$F_FLAG" = "n" ]; then
97 97 set_non_debug_build_flags
98 98 CODESIGN_USER="$crypto_signer" \
99 99 build "non-DEBUG" "$suffix-nd" "-nd" "$MULTI_PROTO"
100 100 else
101 101 echo "\n==== No non-DEBUG $open_only build ====\n" >> "$LOGFILE"
102 102 fi
103 103
104 104 # non-DEBUG build ends
105 105
106 106 # DEBUG build begins
107 107
108 108 if [ "$D_FLAG" = "y" ]; then
109 109 set_debug_build_flags
110 110 CODESIGN_USER="$crypto_signer" \
111 111 build "DEBUG" "$suffix" "" "$MULTI_PROTO"
112 112 else
113 113 echo "\n==== No DEBUG $open_only build ====\n" >> "$LOGFILE"
114 114 fi
115 115
116 116 # DEBUG build ends
117 117
118 118 p_FLAG="$orig_p_FLAG"
119 119 }
120 120
121 121 #
122 122 # usage: run_hook HOOKNAME ARGS...
123 123 #
124 124 # If variable "$HOOKNAME" is defined, insert a section header into
125 125 # our logs and then run the command with ARGS
126 126 #
127 127 function run_hook {
128 128 HOOKNAME=$1
129 129 eval HOOKCMD=\$$HOOKNAME
130 130 shift
131 131
132 132 if [ -n "$HOOKCMD" ]; then
133 133 (
134 134 echo "\n==== Running $HOOKNAME command: $HOOKCMD ====\n"
135 135 ( $HOOKCMD "$@" 2>&1 )
136 136 if [ "$?" -ne 0 ]; then
137 137 # Let exit status propagate up
138 138 touch $TMPDIR/abort
139 139 fi
140 140 ) | tee -a $mail_msg_file >> $LOGFILE
141 141
142 142 if [ -f $TMPDIR/abort ]; then
143 143 build_ok=n
144 144 echo "\nAborting at request of $HOOKNAME" |
145 145 tee -a $mail_msg_file >> $LOGFILE
146 146 exit 1
147 147 fi
148 148 fi
149 149 }
150 150
151 151 # Return library search directive as function of given root.
152 152 function myldlibs {
153 153 echo "-L$1/lib -L$1/usr/lib"
154 154 }
155 155
156 156 # Return header search directive as function of given root.
157 157 function myheaders {
158 158 echo "-I$1/usr/include"
159 159 }
160 160
161 161 #
162 162 # Function to do the build, including package generation.
163 163 # usage: build LABEL SUFFIX ND MULTIPROTO
164 164 # - LABEL is used to tag build output.
165 165 # - SUFFIX is used to distinguish files (e.g., DEBUG vs non-DEBUG,
166 166 # open-only vs full tree).
167 167 # - ND is "-nd" (non-DEBUG builds) or "" (DEBUG builds).
168 168 # - If MULTIPROTO is "yes", it means to name the proto area according to
169 169 # SUFFIX. Otherwise ("no"), (re)use the standard proto area.
170 170 #
171 171 function build {
172 172 LABEL=$1
173 173 SUFFIX=$2
174 174 ND=$3
175 175 MULTIPROTO=$4
176 176 INSTALLOG=install${SUFFIX}-${MACH}
177 177 NOISE=noise${SUFFIX}-${MACH}
178 178 PKGARCHIVE=${PKGARCHIVE_ORIG}${SUFFIX}
179 179
180 180 ORIGROOT=$ROOT
181 181 [ $MULTIPROTO = no ] || export ROOT=$ROOT$SUFFIX
182 182
183 183 export ENVLDLIBS1=`myldlibs $ROOT`
184 184 export ENVCPPFLAGS1=`myheaders $ROOT`
185 185
186 186 this_build_ok=y
187 187 #
188 188 # Build OS-Networking source
189 189 #
190 190 echo "\n==== Building OS-Net source at `date` ($LABEL) ====\n" \
191 191 >> $LOGFILE
192 192
193 193 rm -f $SRC/${INSTALLOG}.out
194 194 cd $SRC
195 195 /bin/time $MAKE -e install 2>&1 | \
196 196 tee -a $SRC/${INSTALLOG}.out >> $LOGFILE
197 197
198 198 echo "\n==== Build errors ($LABEL) ====\n" >> $mail_msg_file
199 199 egrep ":" $SRC/${INSTALLOG}.out |
200 200 egrep -e "(^${MAKE}:|[ ]error[: \n])" | \
201 201 egrep -v "Ignoring unknown host" | \
202 202 egrep -v "cc .* -o error " | \
203 203 egrep -v "warning" | tee $TMPDIR/build_errs${SUFFIX} \
204 204 >> $mail_msg_file
205 205 sed -n "/^Undefined[ ]*first referenced$/,/^ld: fatal:/p" \
206 206 < $SRC/${INSTALLOG}.out >> $mail_msg_file
207 207 if [[ -s $TMPDIR/build_errs${SUFFIX} ]]; then
208 208 build_ok=n
209 209 this_build_ok=n
210 210 fi
211 211 grep "bootblock image is .* bytes too big" $SRC/${INSTALLOG}.out \
212 212 >> $mail_msg_file
213 213 if [ "$?" = "0" ]; then
214 214 build_ok=n
215 215 this_build_ok=n
216 216 fi
217 217
218 218 echo "\n==== Build warnings ($LABEL) ====\n" >>$mail_msg_file
219 219 egrep -i warning: $SRC/${INSTALLOG}.out \
220 220 | egrep -v '^tic:' \
221 221 | egrep -v "symbol (\`|')timezone' has differing types:" \
222 222 | egrep -v "parameter <PSTAMP> set to" \
223 223 | egrep -v "Ignoring unknown host" \
224 224 | egrep -v "redefining segment flags attribute for" \
225 225 | tee $TMPDIR/build_warnings${SUFFIX} >> $mail_msg_file
226 226 if [[ -s $TMPDIR/build_warnings${SUFFIX} ]]; then
227 227 build_ok=n
228 228 this_build_ok=n
229 229 fi
230 230
231 231 echo "\n==== Ended OS-Net source build at `date` ($LABEL) ====\n" \
232 232 >> $LOGFILE
233 233
234 234 echo "\n==== Elapsed build time ($LABEL) ====\n" >>$mail_msg_file
235 235 tail -3 $SRC/${INSTALLOG}.out >>$mail_msg_file
236 236
237 237 if [ "$i_FLAG" = "n" ]; then
238 238 rm -f $SRC/${NOISE}.ref
239 239 if [ -f $SRC/${NOISE}.out ]; then
240 240 mv $SRC/${NOISE}.out $SRC/${NOISE}.ref
241 241 fi
242 242 grep : $SRC/${INSTALLOG}.out \
243 243 | egrep -v '^/' \
244 244 | egrep -v '^(Start|Finish|real|user|sys|./bld_awk)' \
245 245 | egrep -v '^tic:' \
246 246 | egrep -v '^mcs' \
247 247 | egrep -v '^LD_LIBRARY_PATH=' \
248 248 | egrep -v 'ar: creating' \
249 249 | egrep -v 'ar: writing' \
250 250 | egrep -v 'conflicts:' \
251 251 | egrep -v ':saved created' \
252 252 | egrep -v '^stty.*c:' \
253 253 | egrep -v '^mfgname.c:' \
254 254 | egrep -v '^uname-i.c:' \
255 255 | egrep -v '^volumes.c:' \
256 256 | egrep -v '^lint library construction:' \
257 257 | egrep -v 'tsort: INFORM:' \
258 258 | egrep -v 'stripalign:' \
259 259 | egrep -v 'chars, width' \
260 260 | egrep -v "symbol (\`|')timezone' has differing types:" \
261 261 | egrep -v 'PSTAMP' \
262 262 | egrep -v '^Manifying' \
263 263 | egrep -v 'Ignoring unknown host' \
264 264 | egrep -v 'Processing method:' \
265 265 | egrep -v '^Writing' \
266 266 | egrep -v 'spellin1:' \
267 267 | egrep -v '^adding:' \
268 268 | egrep -v "^echo 'msgid" \
269 269 | egrep -v '^echo ' \
270 270 | egrep -v '\.c:$' \
271 271 | egrep -v '^Adding file:' \
272 272 | egrep -v 'CLASSPATH=' \
273 273 | egrep -v '\/var\/mail\/:saved' \
274 274 | egrep -v -- '-DUTS_VERSION=' \
275 275 | egrep -v '^Running Mkbootstrap' \
276 276 | egrep -v '^Applet length read:' \
277 277 | egrep -v 'bytes written:' \
278 278 | egrep -v '^File:SolarisAuthApplet.bin' \
279 279 | egrep -v -i 'jibversion' \
280 280 | egrep -v '^Output size:' \
281 281 | egrep -v '^Solo size statistics:' \
282 282 | egrep -v '^Using ROM API Version' \
283 283 | egrep -v '^Zero Signature length:' \
284 284 | egrep -v '^Note \(probably harmless\):' \
285 285 | egrep -v '::' \
286 286 | egrep -v -- '-xcache' \
287 287 | egrep -v '^\+' \
288 288 | egrep -v '^cc1: note: -fwritable-strings' \
289 289 | egrep -v 'svccfg-native -s svc:/' \
290 290 | sort | uniq >$SRC/${NOISE}.out
291 291 if [ ! -f $SRC/${NOISE}.ref ]; then
292 292 cp $SRC/${NOISE}.out $SRC/${NOISE}.ref
293 293 fi
294 294 echo "\n==== Build noise differences ($LABEL) ====\n" \
295 295 >>$mail_msg_file
296 296 diff $SRC/${NOISE}.ref $SRC/${NOISE}.out >>$mail_msg_file
297 297 fi
298 298
299 299 #
300 300 # Re-sign selected binaries using signing server
301 301 # (gatekeeper builds only)
302 302 #
303 303 if [ -n "$CODESIGN_USER" -a "$this_build_ok" = "y" ]; then
304 304 echo "\n==== Signing proto area at `date` ====\n" >> $LOGFILE
305 305 signing_file="${TMPDIR}/signing"
306 306 rm -f ${signing_file}
307 307 export CODESIGN_USER
308 308 signproto $SRC/tools/codesign/creds 2>&1 | \
309 309 tee -a ${signing_file} >> $LOGFILE
310 310 echo "\n==== Finished signing proto area at `date` ====\n" \
311 311 >> $LOGFILE
312 312 echo "\n==== Crypto module signing errors ($LABEL) ====\n" \
313 313 >> $mail_msg_file
314 314 egrep 'WARNING|ERROR' ${signing_file} >> $mail_msg_file
315 315 if (( $? == 0 )) ; then
316 316 build_ok=n
317 317 this_build_ok=n
318 318 fi
319 319 fi
320 320
321 321 #
322 322 # Building Packages
323 323 #
324 324 if [ "$p_FLAG" = "y" -a "$this_build_ok" = "y" ]; then
325 325 if [ -d $SRC/pkg ]; then
326 326 echo "\n==== Creating $LABEL packages at `date` ====\n" \
327 327 >> $LOGFILE
328 328 echo "Clearing out $PKGARCHIVE ..." >> $LOGFILE
329 329 rm -rf $PKGARCHIVE >> "$LOGFILE" 2>&1
330 330 mkdir -p $PKGARCHIVE >> "$LOGFILE" 2>&1
331 331
332 332 rm -f $SRC/pkg/${INSTALLOG}.out
333 333 cd $SRC/pkg
334 334 /bin/time $MAKE -e install 2>&1 | \
335 335 tee -a $SRC/pkg/${INSTALLOG}.out >> $LOGFILE
336 336
337 337 echo "\n==== package build errors ($LABEL) ====\n" \
338 338 >> $mail_msg_file
339 339
340 340 egrep "${MAKE}|ERROR|WARNING" $SRC/pkg/${INSTALLOG}.out | \
341 341 grep ':' | \
342 342 grep -v PSTAMP | \
343 343 egrep -v "Ignoring unknown host" | \
344 344 tee $TMPDIR/package >> $mail_msg_file
345 345 if [[ -s $TMPDIR/package ]]; then
346 346 build_extras_ok=n
347 347 this_build_ok=n
348 348 fi
349 349 else
350 350 #
351 351 # Handle it gracefully if -p was set but there so
352 352 # no pkg directory.
353 353 #
354 354 echo "\n==== No $LABEL packages to build ====\n" \
355 355 >> $LOGFILE
356 356 fi
357 357 else
358 358 echo "\n==== Not creating $LABEL packages ====\n" >> $LOGFILE
359 359 fi
360 360
361 361 ROOT=$ORIGROOT
362 362 }
363 363
364 364 # Usage: dolint /dir y|n
365 365 # Arg. 2 is a flag to turn on/off the lint diff output
366 366 function dolint {
367 367 if [ ! -d "$1" ]; then
368 368 echo "dolint error: $1 is not a directory"
369 369 exit 1
370 370 fi
371 371
372 372 if [ "$2" != "y" -a "$2" != "n" ]; then
373 373 echo "dolint internal error: $2 should be 'y' or 'n'"
374 374 exit 1
375 375 fi
376 376
377 377 lintdir=$1
378 378 dodiff=$2
379 379 base=`basename $lintdir`
380 380 LINTOUT=$lintdir/lint-${MACH}.out
381 381 LINTNOISE=$lintdir/lint-noise-${MACH}
382 382 export ENVLDLIBS1=`myldlibs $ROOT`
383 383 export ENVCPPFLAGS1=`myheaders $ROOT`
384 384
385 385 set_debug_build_flags
386 386
387 387 #
388 388 # '$MAKE lint' in $lintdir
389 389 #
390 390 echo "\n==== Begin '$MAKE lint' of $base at `date` ====\n" >> $LOGFILE
391 391
392 392 # remove old lint.out
393 393 rm -f $lintdir/lint.out $lintdir/lint-noise.out
394 394 if [ -f $lintdir/lint-noise.ref ]; then
395 395 mv $lintdir/lint-noise.ref ${LINTNOISE}.ref
396 396 fi
397 397
398 398 rm -f $LINTOUT
399 399 cd $lintdir
400 400 #
401 401 # Remove all .ln files to ensure a full reference file
402 402 #
403 403 rm -f Nothing_to_remove \
404 404 `find . \( -name SCCS -o -name .hg -o -name .svn -o -name .git \) \
405 405 -prune -o -type f -name '*.ln' -print `
406 406
407 407 /bin/time $MAKE -ek lint 2>&1 | \
408 408 tee -a $LINTOUT >> $LOGFILE
409 409
410 410 echo "\n==== '$MAKE lint' of $base ERRORS ====\n" >> $mail_msg_file
411 411
412 412 grep "$MAKE:" $LINTOUT |
413 413 egrep -v "Ignoring unknown host" | \
414 414 tee $TMPDIR/lint_errs >> $mail_msg_file
415 415 if [[ -s $TMPDIR/lint_errs ]]; then
416 416 build_extras_ok=n
417 417 fi
418 418
419 419 echo "\n==== Ended '$MAKE lint' of $base at `date` ====\n" >> $LOGFILE
420 420
421 421 echo "\n==== Elapsed time of '$MAKE lint' of $base ====\n" \
422 422 >>$mail_msg_file
423 423 tail -3 $LINTOUT >>$mail_msg_file
424 424
425 425 rm -f ${LINTNOISE}.ref
426 426 if [ -f ${LINTNOISE}.out ]; then
427 427 mv ${LINTNOISE}.out ${LINTNOISE}.ref
428 428 fi
429 429 grep : $LINTOUT | \
430 430 egrep -v '^(real|user|sys)' |
431 431 egrep -v '(library construction)' | \
432 432 egrep -v ': global crosschecks' | \
433 433 egrep -v 'Ignoring unknown host' | \
434 434 egrep -v '\.c:$' | \
435 435 sort | uniq > ${LINTNOISE}.out
436 436 if [ ! -f ${LINTNOISE}.ref ]; then
437 437 cp ${LINTNOISE}.out ${LINTNOISE}.ref
438 438 fi
439 439
440 440 if [ "$dodiff" != "n" ]; then
441 441 echo "\n==== lint warnings $base ====\n" \
442 442 >>$mail_msg_file
443 443 # should be none, though there are a few that were filtered out
444 444 # above
445 445 egrep -i '(warning|lint):' ${LINTNOISE}.out \
446 446 | sort | uniq | tee $TMPDIR/lint_warns >> $mail_msg_file
447 447 if [[ -s $TMPDIR/lint_warns ]]; then
448 448 build_extras_ok=n
449 449 fi
450 450 echo "\n==== lint noise differences $base ====\n" \
451 451 >> $mail_msg_file
452 452 diff ${LINTNOISE}.ref ${LINTNOISE}.out \
453 453 >> $mail_msg_file
454 454 fi
455 455 }
456 456
457 457 #
458 458 # Build and install the onbld tools.
459 459 #
460 460 # usage: build_tools DESTROOT
461 461 #
462 462 # returns non-zero status if the build was successful.
463 463 #
464 464 function build_tools {
465 465 DESTROOT=$1
466 466
467 467 INSTALLOG=install-${MACH}
468 468
469 469 echo "\n==== Building tools at `date` ====\n" \
470 470 >> $LOGFILE
471 471
472 472 rm -f ${TOOLS}/${INSTALLOG}.out
473 473 cd ${TOOLS}
474 474 /bin/time $MAKE TOOLS_PROTO=${DESTROOT} -e install 2>&1 | \
475 475 tee -a ${TOOLS}/${INSTALLOG}.out >> $LOGFILE
476 476
477 477 echo "\n==== Tools build errors ====\n" >> $mail_msg_file
478 478
479 479 egrep ":" ${TOOLS}/${INSTALLOG}.out |
480 480 egrep -e "(${MAKE}:|[ ]error[: \n])" | \
481 481 egrep -v "Ignoring unknown host" | \
482 482 egrep -v warning | tee $TMPDIR/tools_errors >> $mail_msg_file
483 483
484 484 if [[ -s $TMPDIR/tools_errors ]]; then
485 485 return 1
486 486 fi
487 487 return 0
488 488 }
489 489
490 490 function staffer {
491 491 if [ $ISUSER -ne 0 ]; then
492 492 "$@"
493 493 else
494 494 arg="\"$1\""
495 495 shift
496 496 for i
497 497 do
498 498 arg="$arg \"$i\""
499 499 done
500 500 eval su $STAFFER -c \'$arg\'
501 501 fi
502 502 }
503 503
504 504 #
505 505 # Verify that the closed bins are present
506 506 #
507 507 function check_closed_bins {
508 508 if [[ -n "$ON_CLOSED_BINS" && ! -d "$ON_CLOSED_BINS" ]]; then
509 509 echo "ON_CLOSED_BINS must point to the closed binaries tree."
510 510 build_ok=n
511 511 exit 1
512 512 fi
513 513 }
514 514
515 515 #
516 516 # wrapper over wsdiff.
517 517 # usage: do_wsdiff LABEL OLDPROTO NEWPROTO
518 518 #
519 519 function do_wsdiff {
520 520 label=$1
521 521 oldproto=$2
522 522 newproto=$3
523 523
524 524 wsdiff="wsdiff"
525 525 [ "$t_FLAG" = y ] && wsdiff="wsdiff -t"
526 526
527 527 echo "\n==== Getting object changes since last build at `date`" \
528 528 "($label) ====\n" | tee -a $LOGFILE >> $mail_msg_file
529 529 $wsdiff -s -r ${TMPDIR}/wsdiff.results $oldproto $newproto 2>&1 | \
530 530 tee -a $LOGFILE >> $mail_msg_file
531 531 echo "\n==== Object changes determined at `date` ($label) ====\n" | \
532 532 tee -a $LOGFILE >> $mail_msg_file
533 533 }
534 534
535 535 #
536 536 # Functions for setting build flags (DEBUG/non-DEBUG). Keep them
537 537 # together.
538 538 #
539 539
540 540 function set_non_debug_build_flags {
541 541 export RELEASE_BUILD ; RELEASE_BUILD=
542 542 unset EXTRA_OPTIONS
543 543 unset EXTRA_CFLAGS
544 544 }
545 545
546 546 function set_debug_build_flags {
547 547 unset RELEASE_BUILD
548 548 unset EXTRA_OPTIONS
549 549 unset EXTRA_CFLAGS
550 550 }
551 551
552 552
553 553 MACH=`uname -p`
554 554
555 555 if [ "$OPTHOME" = "" ]; then
556 556 OPTHOME=/opt
557 557 export OPTHOME
558 558 fi
559 559
560 560 USAGE='Usage: nightly [-in] [+t] [-V VERS ] <env_file>
561 561
562 562 Where:
563 563 -i Fast incremental options (no clobber, lint, check)
564 564 -n Do not do a bringover
565 565 +t Use the build tools in $ONBLD_TOOLS/bin
566 566 -V VERS set the build version string to VERS
567 567
568 568 <env_file> file in Bourne shell syntax that sets and exports
569 569 variables that configure the operation of this script and many of
570 570 the scripts this one calls. If <env_file> does not exist,
571 571 it will be looked for in $OPTHOME/onbld/env.
572 572
573 573 non-DEBUG is the default build type. Build options can be set in the
574 574 NIGHTLY_OPTIONS variable in the <env_file> as follows:
575 575
576 576 -A check for ABI differences in .so files
577 577 -C check for cstyle/hdrchk errors
578 578 -D do a build with DEBUG on
579 579 -F do _not_ do a non-DEBUG build
580 580 -G gate keeper default group of options (-au)
581 581 -I integration engineer default group of options (-ampu)
582 582 -M do not run pmodes (safe file permission checker)
583 583 -N do not run protocmp
584 584 -R default group of options for building a release (-mp)
585 585 -U update proto area in the parent
586 586 -V VERS set the build version string to VERS
587 587 -f find unreferenced files
588 588 -i do an incremental build (no "make clobber")
589 589 -l do "make lint" in $LINTDIRS (default: $SRC y)
590 590 -m send mail to $MAILTO at end of build
591 591 -n do not do a bringover
592 592 -p create packages
593 593 -r check ELF runtime attributes in the proto area
594 594 -t build and use the tools in $SRC/tools (default setting)
595 595 +t Use the build tools in $ONBLD_TOOLS/bin
596 596 -u update proto_list_$MACH and friends in the parent workspace;
597 597 when used with -f, also build an unrefmaster.out in the parent
598 598 -w report on differences between previous and current proto areas
599 599 '
600 600 #
601 601 # A log file will be generated under the name $LOGFILE
602 602 # for partially completed build and log.`date '+%F'`
603 603 # in the same directory for fully completed builds.
604 604 #
605 605
606 606 # default values for low-level FLAGS; G I R are group FLAGS
607 607 A_FLAG=n
608 608 C_FLAG=n
609 609 D_FLAG=n
610 610 F_FLAG=n
611 611 f_FLAG=n
612 612 i_FLAG=n; i_CMD_LINE_FLAG=n
613 613 l_FLAG=n
614 614 M_FLAG=n
615 615 m_FLAG=n
616 616 N_FLAG=n
617 617 n_FLAG=n
618 618 p_FLAG=n
619 619 r_FLAG=n
620 620 t_FLAG=y
621 621 U_FLAG=n
622 622 u_FLAG=n
623 623 V_FLAG=n
624 624 w_FLAG=n
625 625 W_FLAG=n
626 626 #
627 627 build_ok=y
628 628 build_extras_ok=y
629 629
630 630 #
631 631 # examine arguments
632 632 #
633 633
634 634 OPTIND=1
635 635 while getopts +intV:W FLAG
636 636 do
637 637 case $FLAG in
638 638 i ) i_FLAG=y; i_CMD_LINE_FLAG=y
639 639 ;;
640 640 n ) n_FLAG=y
641 641 ;;
642 642 +t ) t_FLAG=n
643 643 ;;
644 644 V ) V_FLAG=y
645 645 V_ARG="$OPTARG"
646 646 ;;
647 647 W ) W_FLAG=y
648 648 ;;
649 649 \? ) echo "$USAGE"
650 650 exit 1
651 651 ;;
652 652 esac
653 653 done
654 654
655 655 # correct argument count after options
656 656 shift `expr $OPTIND - 1`
657 657
658 658 # test that the path to the environment-setting file was given
659 659 if [ $# -ne 1 ]; then
660 660 echo "$USAGE"
661 661 exit 1
662 662 fi
663 663
664 664 # check if user is running nightly as root
665 665 # ISUSER is set non-zero if an ordinary user runs nightly, or is zero
666 666 # when root invokes nightly.
667 667 /usr/bin/id | grep '^uid=0(' >/dev/null 2>&1
668 668 ISUSER=$?; export ISUSER
669 669
670 670 #
671 671 # force locale to C
672 672 LANG=C; export LANG
673 673 LC_ALL=C; export LC_ALL
674 674 LC_COLLATE=C; export LC_COLLATE
675 675 LC_CTYPE=C; export LC_CTYPE
676 676 LC_MESSAGES=C; export LC_MESSAGES
677 677 LC_MONETARY=C; export LC_MONETARY
678 678 LC_NUMERIC=C; export LC_NUMERIC
679 679 LC_TIME=C; export LC_TIME
680 680
681 681 # clear environment variables we know to be bad for the build
682 682 unset LD_OPTIONS
683 683 unset LD_AUDIT LD_AUDIT_32 LD_AUDIT_64
684 684 unset LD_BIND_NOW LD_BIND_NOW_32 LD_BIND_NOW_64
685 685 unset LD_BREADTH LD_BREADTH_32 LD_BREADTH_64
686 686 unset LD_CONFIG LD_CONFIG_32 LD_CONFIG_64
687 687 unset LD_DEBUG LD_DEBUG_32 LD_DEBUG_64
688 688 unset LD_DEMANGLE LD_DEMANGLE_32 LD_DEMANGLE_64
689 689 unset LD_FLAGS LD_FLAGS_32 LD_FLAGS_64
690 690 unset LD_LIBRARY_PATH LD_LIBRARY_PATH_32 LD_LIBRARY_PATH_64
691 691 unset LD_LOADFLTR LD_LOADFLTR_32 LD_LOADFLTR_64
692 692 unset LD_NOAUDIT LD_NOAUDIT_32 LD_NOAUDIT_64
693 693 unset LD_NOAUXFLTR LD_NOAUXFLTR_32 LD_NOAUXFLTR_64
694 694 unset LD_NOCONFIG LD_NOCONFIG_32 LD_NOCONFIG_64
695 695 unset LD_NODIRCONFIG LD_NODIRCONFIG_32 LD_NODIRCONFIG_64
696 696 unset LD_NODIRECT LD_NODIRECT_32 LD_NODIRECT_64
697 697 unset LD_NOLAZYLOAD LD_NOLAZYLOAD_32 LD_NOLAZYLOAD_64
698 698 unset LD_NOOBJALTER LD_NOOBJALTER_32 LD_NOOBJALTER_64
699 699 unset LD_NOVERSION LD_NOVERSION_32 LD_NOVERSION_64
700 700 unset LD_ORIGIN LD_ORIGIN_32 LD_ORIGIN_64
701 701 unset LD_PRELOAD LD_PRELOAD_32 LD_PRELOAD_64
702 702 unset LD_PROFILE LD_PROFILE_32 LD_PROFILE_64
703 703
704 704 unset CONFIG
705 705 unset GROUP
706 706 unset OWNER
707 707 unset REMOTE
708 708 unset ENV
709 709 unset ARCH
710 710 unset CLASSPATH
711 711 unset NAME
712 712
713 713 #
714 714 # To get ONBLD_TOOLS from the environment, it must come from the env file.
715 715 # If it comes interactively, it is generally TOOLS_PROTO, which will be
716 716 # clobbered before the compiler version checks, which will therefore fail.
717 717 #
718 718 unset ONBLD_TOOLS
719 719
720 720 #
721 721 # Setup environmental variables
722 722 #
723 723 if [ -f /etc/nightly.conf ]; then
724 724 . /etc/nightly.conf
725 725 fi
726 726
727 727 if [ -f $1 ]; then
728 728 if [[ $1 = */* ]]; then
729 729 . $1
730 730 else
731 731 . ./$1
732 732 fi
733 733 else
734 734 if [ -f $OPTHOME/onbld/env/$1 ]; then
735 735 . $OPTHOME/onbld/env/$1
736 736 else
737 737 echo "Cannot find env file as either $1 or $OPTHOME/onbld/env/$1"
738 738 exit 1
739 739 fi
740 740 fi
741 741
742 742 # contents of stdenv.sh inserted after next line:
743 743 # STDENV_START
744 744 # STDENV_END
745 745
746 746 # Check if we have sufficient data to continue...
747 747 [[ -v CODEMGR_WS ]] || fatal_error "Error: Variable CODEMGR_WS not set."
748 748 if [[ "${NIGHTLY_OPTIONS}" == ~(F)n ]] ; then
749 749 # Check if the gate data are valid if we don't do a "bringover" below
750 750 [[ -d "${CODEMGR_WS}" ]] || \
751 751 fatal_error "Error: ${CODEMGR_WS} is not a directory."
752 752 [[ -f "${CODEMGR_WS}/usr/src/Makefile" ]] || \
753 753 fatal_error "Error: ${CODEMGR_WS}/usr/src/Makefile not found."
754 754 fi
755 755
756 756 #
757 757 # place ourselves in a new task, respecting BUILD_PROJECT if set.
758 758 #
759 759 if [ -z "$BUILD_PROJECT" ]; then
760 760 /usr/bin/newtask -c $$
761 761 else
762 762 /usr/bin/newtask -c $$ -p $BUILD_PROJECT
763 763 fi
764 764
765 765 ps -o taskid= -p $$ | read build_taskid
766 766 ps -o project= -p $$ | read build_project
767 767
768 768 #
769 769 # See if NIGHTLY_OPTIONS is set
770 770 #
771 771 if [ "$NIGHTLY_OPTIONS" = "" ]; then
772 772 NIGHTLY_OPTIONS="-aBm"
773 773 fi
774 774
775 775 #
776 776 # If BRINGOVER_WS was not specified, let it default to CLONE_WS
777 777 #
778 778 if [ "$BRINGOVER_WS" = "" ]; then
779 779 BRINGOVER_WS=$CLONE_WS
780 780 fi
781 781
782 782 #
783 783 # If BRINGOVER_FILES was not specified, default to usr
784 784 #
785 785 if [ "$BRINGOVER_FILES" = "" ]; then
786 786 BRINGOVER_FILES="usr"
787 787 fi
788 788
789 789 check_closed_bins
790 790
791 791 #
792 792 # Note: changes to the option letters here should also be applied to the
793 793 # bldenv script. `d' is listed for backward compatibility.
794 794 #
795 795 NIGHTLY_OPTIONS=-${NIGHTLY_OPTIONS#-}
796 796 OPTIND=1
797 797 while getopts +ABCDdFfGIilMmNnpRrtUuwW FLAG $NIGHTLY_OPTIONS
798 798 do
799 799 case $FLAG in
800 800 A ) A_FLAG=y
801 801 ;;
802 802 B ) D_FLAG=y
803 803 ;; # old version of D
804 804 C ) C_FLAG=y
805 805 ;;
806 806 D ) D_FLAG=y
807 807 ;;
808 808 F ) F_FLAG=y
809 809 ;;
810 810 f ) f_FLAG=y
811 811 ;;
812 812 G ) u_FLAG=y
813 813 ;;
814 814 I ) m_FLAG=y
815 815 p_FLAG=y
816 816 u_FLAG=y
817 817 ;;
818 818 i ) i_FLAG=y
819 819 ;;
820 820 l ) l_FLAG=y
821 821 ;;
822 822 M ) M_FLAG=y
823 823 ;;
824 824 m ) m_FLAG=y
825 825 ;;
826 826 N ) N_FLAG=y
827 827 ;;
828 828 n ) n_FLAG=y
829 829 ;;
830 830 p ) p_FLAG=y
831 831 ;;
832 832 R ) m_FLAG=y
833 833 p_FLAG=y
834 834 ;;
835 835 r ) r_FLAG=y
836 836 ;;
837 837 +t ) t_FLAG=n
838 838 ;;
839 839 U ) if [ -z "${PARENT_ROOT}" ]; then
840 840 echo "PARENT_ROOT must be set if the U flag is" \
841 841 "present in NIGHTLY_OPTIONS."
842 842 exit 1
843 843 fi
844 844 NIGHTLY_PARENT_ROOT=$PARENT_ROOT
845 845 if [ -n "${PARENT_TOOLS_ROOT}" ]; then
846 846 NIGHTLY_PARENT_TOOLS_ROOT=$PARENT_TOOLS_ROOT
847 847 fi
848 848 U_FLAG=y
849 849 ;;
850 850 u ) u_FLAG=y
851 851 ;;
852 852 w ) w_FLAG=y
853 853 ;;
854 854 W ) W_FLAG=y
855 855 ;;
856 856 \? ) echo "$USAGE"
857 857 exit 1
858 858 ;;
859 859 esac
860 860 done
861 861
862 862 if [ $ISUSER -ne 0 ]; then
863 863 # Set default value for STAFFER, if needed.
864 864 if [ -z "$STAFFER" -o "$STAFFER" = "nobody" ]; then
865 865 STAFFER=`/usr/xpg4/bin/id -un`
866 866 export STAFFER
867 867 fi
868 868 fi
869 869
870 870 if [ -z "$MAILTO" -o "$MAILTO" = "nobody" ]; then
871 871 MAILTO=$STAFFER
872 872 export MAILTO
873 873 fi
874 874
875 875 PATH="$OPTHOME/onbld/bin:$OPTHOME/onbld/bin/${MACH}:/usr/ccs/bin"
876 876 PATH="$PATH:$OPTHOME/SUNWspro/bin:/usr/bin:/usr/sbin:/usr/ucb"
877 877 PATH="$PATH:/usr/openwin/bin:/usr/sfw/bin:/opt/sfw/bin:."
878 878 export PATH
879 879
880 880 # roots of source trees, both relative to $SRC and absolute.
881 881 relsrcdirs="."
882 882 abssrcdirs="$SRC"
883 883
884 884 PROTOCMPTERSE="protocmp.terse -gu"
885 885 POUND_SIGN="#"
886 886 # have we set RELEASE_DATE in our env file?
887 887 if [ -z "$RELEASE_DATE" ]; then
888 888 RELEASE_DATE=$(LC_ALL=C date +"%B %Y")
889 889 fi
890 890 BUILD_DATE=$(LC_ALL=C date +%Y-%b-%d)
891 891 BASEWSDIR=$(basename $CODEMGR_WS)
892 892 DEV_CM="\"@(#)SunOS Internal Development: $LOGNAME $BUILD_DATE [$BASEWSDIR]\""
893 893
894 894 # we export POUND_SIGN, RELEASE_DATE and DEV_CM to speed up the build process
895 895 # by avoiding repeated shell invocations to evaluate Makefile.master
896 896 # definitions.
897 897 export POUND_SIGN RELEASE_DATE DEV_CM
898 898
899 899 maketype="distributed"
900 900 if [[ -z "$MAKE" ]]; then
901 901 MAKE=dmake
902 902 elif [[ ! -x "$MAKE" ]]; then
903 903 echo "\$MAKE is set to garbage in the environment"
904 904 exit 1
905 905 fi
906 906 export PATH
907 907 export MAKE
908 908
909 909 if [ "${SUNWSPRO}" != "" ]; then
910 910 PATH="${SUNWSPRO}/bin:$PATH"
911 911 export PATH
912 912 fi
913 913
914 914 hostname=$(uname -n)
915 915 if [[ $DMAKE_MAX_JOBS != +([0-9]) || $DMAKE_MAX_JOBS -eq 0 ]]
916 916 then
917 917 maxjobs=
918 918 if [[ -f $HOME/.make.machines ]]
919 919 then
920 920 # Note: there is a hard tab and space character in the []s
921 921 # below.
922 922 egrep -i "^[ ]*$hostname[ \.]" \
923 923 $HOME/.make.machines | read host jobs
924 924 maxjobs=${jobs##*=}
925 925 fi
926 926
927 927 if [[ $maxjobs != +([0-9]) || $maxjobs -eq 0 ]]
928 928 then
929 929 # default
930 930 maxjobs=4
931 931 fi
932 932
933 933 export DMAKE_MAX_JOBS=$maxjobs
934 934 fi
935 935
936 936 DMAKE_MODE=parallel;
937 937 export DMAKE_MODE
938 938
939 939 if [ -z "${ROOT}" ]; then
940 940 echo "ROOT must be set."
941 941 exit 1
942 942 fi
943 943
944 944 #
945 945 # if -V flag was given, reset VERSION to V_ARG
946 946 #
947 947 if [ "$V_FLAG" = "y" ]; then
948 948 VERSION=$V_ARG
949 949 fi
950 950
951 951 TMPDIR="/tmp/nightly.tmpdir.$$"
952 952 export TMPDIR
953 953 rm -rf ${TMPDIR}
954 954 mkdir -p $TMPDIR || exit 1
955 955 chmod 777 $TMPDIR
956 956
957 957 #
958 958 # Tools should only be built non-DEBUG. Keep track of the tools proto
959 959 # area path relative to $TOOLS, because the latter changes in an
960 960 # export build.
961 961 #
962 962 # TOOLS_PROTO is included below for builds other than usr/src/tools
963 963 # that look for this location. For usr/src/tools, this will be
964 964 # overridden on the $MAKE command line in build_tools().
965 965 #
966 966 TOOLS=${SRC}/tools
967 967 TOOLS_PROTO_REL=proto/root_${MACH}-nd
968 968 TOOLS_PROTO=${TOOLS}/${TOOLS_PROTO_REL}; export TOOLS_PROTO
969 969
970 970 unset CFLAGS LD_LIBRARY_PATH LDFLAGS
971 971
972 972 # create directories that are automatically removed if the nightly script
973 973 # fails to start correctly
974 974 function newdir {
975 975 dir=$1
976 976 toadd=
977 977 while [ ! -d $dir ]; do
978 978 toadd="$dir $toadd"
979 979 dir=`dirname $dir`
980 980 done
981 981 torm=
982 982 newlist=
983 983 for dir in $toadd; do
984 984 if staffer mkdir $dir; then
985 985 newlist="$ISUSER $dir $newlist"
986 986 torm="$dir $torm"
987 987 else
988 988 [ -z "$torm" ] || staffer rmdir $torm
989 989 return 1
990 990 fi
991 991 done
992 992 newdirlist="$newlist $newdirlist"
993 993 return 0
994 994 }
995 995 newdirlist=
996 996
997 997 [ -d $CODEMGR_WS ] || newdir $CODEMGR_WS || exit 1
998 998
999 999 # since this script assumes the build is from full source, it nullifies
1000 1000 # variables likely to have been set by a "ws" script; nullification
1001 1001 # confines the search space for headers and libraries to the proto area
1002 1002 # built from this immediate source.
1003 1003 ENVLDLIBS1=
1004 1004 ENVLDLIBS2=
1005 1005 ENVLDLIBS3=
1006 1006 ENVCPPFLAGS1=
1007 1007 ENVCPPFLAGS2=
1008 1008 ENVCPPFLAGS3=
1009 1009 ENVCPPFLAGS4=
1010 1010 PARENT_ROOT=
1011 1011
1012 1012 export ENVLDLIBS3 ENVCPPFLAGS1 ENVCPPFLAGS2 ENVCPPFLAGS3 ENVCPPFLAGS4 \
1013 1013 ENVLDLIBS1 ENVLDLIBS2 PARENT_ROOT
1014 1014
1015 1015 PKGARCHIVE_ORIG=$PKGARCHIVE
↓ open down ↓ |
1015 lines elided |
↑ open up ↑ |
1016 1016
1017 1017 #
1018 1018 # Juggle the logs and optionally send mail on completion.
1019 1019 #
1020 1020
1021 1021 function logshuffle {
1022 1022 LLOG="$ATLOG/log.`date '+%F.%H:%M'`"
1023 1023 if [ -f $LLOG -o -d $LLOG ]; then
1024 1024 LLOG=$LLOG.$$
1025 1025 fi
1026 - mkdir $LLOG
1026 +
1027 + rm -f "$ATLOG/latest" 2>/dev/null
1028 + mkdir -p $LLOG
1027 1029 export LLOG
1028 1030
1029 1031 if [ "$build_ok" = "y" ]; then
1030 1032 mv $ATLOG/proto_list_${MACH} $LLOG
1031 1033
1032 1034 if [ -f $ATLOG/proto_list_tools_${MACH} ]; then
1033 1035 mv $ATLOG/proto_list_tools_${MACH} $LLOG
1034 1036 fi
1035 1037
1036 1038 if [ -f $TMPDIR/wsdiff.results ]; then
1037 1039 mv $TMPDIR/wsdiff.results $LLOG
1038 1040 fi
1039 1041
1040 1042 if [ -f $TMPDIR/wsdiff-nd.results ]; then
1041 1043 mv $TMPDIR/wsdiff-nd.results $LLOG
1042 1044 fi
1043 1045 fi
1044 1046
1045 1047 #
1046 1048 # Now that we're about to send mail, it's time to check the noise
1047 1049 # file. In the event that an error occurs beyond this point, it will
1048 1050 # be recorded in the nightly.log file, but nowhere else. This would
1049 1051 # include only errors that cause the copying of the noise log to fail
1050 1052 # or the mail itself not to be sent.
1051 1053 #
1052 1054
1053 1055 exec >>$LOGFILE 2>&1
1054 1056 if [ -s $build_noise_file ]; then
1055 1057 echo "\n==== Nightly build noise ====\n" |
1056 1058 tee -a $LOGFILE >>$mail_msg_file
1057 1059 cat $build_noise_file >>$LOGFILE
1058 1060 cat $build_noise_file >>$mail_msg_file
1059 1061 echo | tee -a $LOGFILE >>$mail_msg_file
1060 1062 fi
1061 1063 rm -f $build_noise_file
1062 1064
1063 1065 case "$build_ok" in
1064 1066 y)
1065 1067 state=Completed
1066 1068 ;;
1067 1069 i)
1068 1070 state=Interrupted
1069 1071 ;;
1070 1072 *)
1071 1073 state=Failed
1072 1074 ;;
1073 1075 esac
1074 1076
1075 1077 if [[ $state != "Interrupted" && $build_extras_ok != "y" ]]; then
1076 1078 state=Failed
1077 1079 fi
1078 1080
1079 1081 NIGHTLY_STATUS=$state
1080 1082 export NIGHTLY_STATUS
1081 1083
1082 1084 run_hook POST_NIGHTLY $state
1083 1085 run_hook SYS_POST_NIGHTLY $state
1084 1086
1085 1087 #
1086 1088 # mailx(1) sets From: based on the -r flag
1087 1089 # if it is given.
1088 1090 #
1089 1091 mailx_r=
1090 1092 if [[ -n "${MAILFROM}" ]]; then
1091 1093 mailx_r="-r ${MAILFROM}"
1092 1094 fi
1093 1095
1094 1096 cat $build_time_file $build_environ_file $mail_msg_file \
1095 1097 > ${LLOG}/mail_msg
1096 1098 if [ "$m_FLAG" = "y" ]; then
1097 1099 cat ${LLOG}/mail_msg | /usr/bin/mailx ${mailx_r} -s \
↓ open down ↓ |
61 lines elided |
↑ open up ↑ |
1098 1100 "Nightly ${MACH} Build of `basename ${CODEMGR_WS}` ${state}." \
1099 1101 ${MAILTO}
1100 1102 fi
1101 1103
1102 1104 if [ "$u_FLAG" = "y" -a "$build_ok" = "y" ]; then
1103 1105 staffer cp ${LLOG}/mail_msg $PARENT_WS/usr/src/mail_msg-${MACH}
1104 1106 staffer cp $LOGFILE $PARENT_WS/usr/src/nightly-${MACH}.log
1105 1107 fi
1106 1108
1107 1109 mv $LOGFILE $LLOG
1110 +
1111 + ln -s "$LLOG" "$ATLOG/latest"
1108 1112 }
1109 1113
1110 1114 #
1111 1115 # Remove the locks and temporary files on any exit
1112 1116 #
1113 1117 function cleanup {
1114 1118 logshuffle
1115 1119
1116 1120 [ -z "$lockfile" ] || staffer rm -f $lockfile
1117 1121 [ -z "$atloglockfile" ] || rm -f $atloglockfile
1118 1122 [ -z "$ulockfile" ] || staffer rm -f $ulockfile
1119 1123 [ -z "$Ulockfile" ] || rm -f $Ulockfile
1120 1124
1121 1125 set -- $newdirlist
1122 1126 while [ $# -gt 0 ]; do
1123 1127 ISUSER=$1 staffer rmdir $2
1124 1128 shift; shift
1125 1129 done
1126 1130 rm -rf $TMPDIR
1127 1131 }
1128 1132
1129 1133 function cleanup_signal {
1130 1134 build_ok=i
1131 1135 # this will trigger cleanup(), above.
1132 1136 exit 1
1133 1137 }
1134 1138
1135 1139 trap cleanup 0
1136 1140 trap cleanup_signal 1 2 3 15
1137 1141
1138 1142 #
1139 1143 # Generic lock file processing -- make sure that the lock file doesn't
1140 1144 # exist. If it does, it should name the build host and PID. If it
1141 1145 # doesn't, then make sure we can create it. Clean up locks that are
1142 1146 # known to be stale (assumes host name is unique among build systems
1143 1147 # for the workspace).
1144 1148 #
1145 1149 function create_lock {
1146 1150 lockf=$1
1147 1151 lockvar=$2
1148 1152
1149 1153 ldir=`dirname $lockf`
1150 1154 [ -d $ldir ] || newdir $ldir || exit 1
1151 1155 eval $lockvar=$lockf
1152 1156
1153 1157 while ! staffer ln -s $hostname.$STAFFER.$$ $lockf 2> /dev/null; do
1154 1158 basews=`basename $CODEMGR_WS`
1155 1159 ls -l $lockf | nawk '{print $NF}' | IFS=. read host user pid
1156 1160 if [ "$host" != "$hostname" ]; then
1157 1161 echo "$MACH build of $basews apparently" \
1158 1162 "already started by $user on $host as $pid."
1159 1163 exit 1
1160 1164 elif kill -s 0 $pid 2>/dev/null; then
1161 1165 echo "$MACH build of $basews already started" \
1162 1166 "by $user as $pid."
1163 1167 exit 1
1164 1168 else
1165 1169 # stale lock; clear it out and try again
1166 1170 rm -f $lockf
1167 1171 fi
1168 1172 done
1169 1173 }
1170 1174
1171 1175 #
1172 1176 # Return the list of interesting proto areas, depending on the current
1173 1177 # options.
1174 1178 #
1175 1179 function allprotos {
1176 1180 typeset roots="$ROOT"
1177 1181
1178 1182 if [[ "$F_FLAG" = n && "$MULTI_PROTO" = yes ]]; then
1179 1183 roots="$roots $ROOT-nd"
1180 1184 fi
1181 1185
1182 1186 echo $roots
1183 1187 }
1184 1188
1185 1189 # Ensure no other instance of this script is running on this host.
1186 1190 # LOCKNAME can be set in <env_file>, and is by default, but is not
1187 1191 # required due to the use of $ATLOG below.
1188 1192 if [ -n "$LOCKNAME" ]; then
1189 1193 create_lock /tmp/$LOCKNAME "lockfile"
1190 1194 fi
1191 1195 #
1192 1196 # Create from one, two, or three other locks:
1193 1197 # $ATLOG/nightly.lock
1194 1198 # - protects against multiple builds in same workspace
1195 1199 # $PARENT_WS/usr/src/nightly.$MACH.lock
1196 1200 # - protects against multiple 'u' copy-backs
1197 1201 # $NIGHTLY_PARENT_ROOT/nightly.lock
1198 1202 # - protects against multiple 'U' copy-backs
1199 1203 #
1200 1204 # Overriding ISUSER to 1 causes the lock to be created as root if the
1201 1205 # script is run as root. The default is to create it as $STAFFER.
1202 1206 ISUSER=1 create_lock $ATLOG/nightly.lock "atloglockfile"
1203 1207 if [ "$u_FLAG" = "y" ]; then
1204 1208 create_lock $PARENT_WS/usr/src/nightly.$MACH.lock "ulockfile"
1205 1209 fi
1206 1210 if [ "$U_FLAG" = "y" ]; then
1207 1211 # NIGHTLY_PARENT_ROOT is written as root if script invoked as root.
1208 1212 ISUSER=1 create_lock $NIGHTLY_PARENT_ROOT/nightly.lock "Ulockfile"
1209 1213 fi
1210 1214
1211 1215 # Locks have been taken, so we're doing a build and we're committed to
1212 1216 # the directories we may have created so far.
1213 1217 newdirlist=
1214 1218
1215 1219 #
1216 1220 # Create mail_msg_file
1217 1221 #
1218 1222 mail_msg_file="${TMPDIR}/mail_msg"
1219 1223 touch $mail_msg_file
1220 1224 build_time_file="${TMPDIR}/build_time"
1221 1225 build_environ_file="${TMPDIR}/build_environ"
1222 1226 touch $build_environ_file
1223 1227 #
1224 1228 # Move old LOGFILE aside
1225 1229 # ATLOG directory already made by 'create_lock' above
1226 1230 #
1227 1231 if [ -f $LOGFILE ]; then
1228 1232 mv -f $LOGFILE ${LOGFILE}-
1229 1233 fi
1230 1234 #
1231 1235 # Build OsNet source
1232 1236 #
1233 1237 START_DATE=`date`
1234 1238 SECONDS=0
1235 1239 echo "\n==== Nightly $maketype build started: $START_DATE ====" \
1236 1240 | tee -a $LOGFILE > $build_time_file
1237 1241
1238 1242 echo "\nBuild project: $build_project\nBuild taskid: $build_taskid" | \
1239 1243 tee -a $mail_msg_file >> $LOGFILE
1240 1244
1241 1245 # make sure we log only to the nightly build file
1242 1246 build_noise_file="${TMPDIR}/build_noise"
1243 1247 exec </dev/null >$build_noise_file 2>&1
1244 1248
1245 1249 run_hook SYS_PRE_NIGHTLY
1246 1250 run_hook PRE_NIGHTLY
1247 1251
1248 1252 echo "\n==== list of environment variables ====\n" >> $LOGFILE
1249 1253 env >> $LOGFILE
1250 1254
1251 1255 echo "\n==== Nightly argument issues ====\n" | tee -a $mail_msg_file >> $LOGFILE
1252 1256
1253 1257 if [ "$N_FLAG" = "y" ]; then
1254 1258 if [ "$p_FLAG" = "y" ]; then
1255 1259 cat <<EOF | tee -a $mail_msg_file >> $LOGFILE
1256 1260 WARNING: the p option (create packages) is set, but so is the N option (do
1257 1261 not run protocmp); this is dangerous; you should unset the N option
1258 1262 EOF
1259 1263 else
1260 1264 cat <<EOF | tee -a $mail_msg_file >> $LOGFILE
1261 1265 Warning: the N option (do not run protocmp) is set; it probably shouldn't be
1262 1266 EOF
1263 1267 fi
1264 1268 echo "" | tee -a $mail_msg_file >> $LOGFILE
1265 1269 fi
1266 1270
1267 1271 if [ "$D_FLAG" = "n" -a "$l_FLAG" = "y" ]; then
1268 1272 #
1269 1273 # In the past we just complained but went ahead with the lint
1270 1274 # pass, even though the proto area was built non-DEBUG. It's
1271 1275 # unlikely that non-DEBUG headers will make a difference, but
1272 1276 # rather than assuming it's a safe combination, force the user
1273 1277 # to specify a DEBUG build.
1274 1278 #
1275 1279 echo "WARNING: DEBUG build not requested; disabling lint.\n" \
1276 1280 | tee -a $mail_msg_file >> $LOGFILE
1277 1281 l_FLAG=n
1278 1282 fi
1279 1283
1280 1284 if [ "$f_FLAG" = "y" ]; then
1281 1285 if [ "$i_FLAG" = "y" ]; then
1282 1286 echo "WARNING: the -f flag cannot be used during incremental" \
1283 1287 "builds; ignoring -f\n" | tee -a $mail_msg_file >> $LOGFILE
1284 1288 f_FLAG=n
1285 1289 fi
1286 1290 if [ "${l_FLAG}${p_FLAG}" != "yy" ]; then
1287 1291 echo "WARNING: the -f flag requires -l, and -p;" \
1288 1292 "ignoring -f\n" | tee -a $mail_msg_file >> $LOGFILE
1289 1293 f_FLAG=n
1290 1294 fi
1291 1295 fi
1292 1296
1293 1297 if [ "$w_FLAG" = "y" -a ! -d $ROOT ]; then
1294 1298 echo "WARNING: -w specified, but $ROOT does not exist;" \
1295 1299 "ignoring -w\n" | tee -a $mail_msg_file >> $LOGFILE
1296 1300 w_FLAG=n
1297 1301 fi
1298 1302
1299 1303 case $MULTI_PROTO in
1300 1304 yes|no) ;;
1301 1305 *)
1302 1306 echo "WARNING: MULTI_PROTO is \"$MULTI_PROTO\"; " \
1303 1307 "should be \"yes\" or \"no\"." | tee -a $mail_msg_file >> $LOGFILE
1304 1308 echo "Setting MULTI_PROTO to \"no\".\n" | \
1305 1309 tee -a $mail_msg_file >> $LOGFILE
1306 1310 export MULTI_PROTO=no
1307 1311 ;;
1308 1312 esac
1309 1313
1310 1314 echo "\n==== Build version ====\n" | tee -a $mail_msg_file >> $LOGFILE
1311 1315 echo $VERSION | tee -a $mail_msg_file >> $LOGFILE
1312 1316
1313 1317 # Save the current proto area if we're comparing against the last build
1314 1318 if [ "$w_FLAG" = "y" -a -d "$ROOT" ]; then
1315 1319 if [ -d "$ROOT.prev" ]; then
1316 1320 rm -rf $ROOT.prev
1317 1321 fi
1318 1322 mv $ROOT $ROOT.prev
1319 1323 fi
1320 1324
1321 1325 # Same for non-DEBUG proto area
1322 1326 if [ "$w_FLAG" = "y" -a "$MULTI_PROTO" = yes -a -d "$ROOT-nd" ]; then
1323 1327 if [ -d "$ROOT-nd.prev" ]; then
1324 1328 rm -rf $ROOT-nd.prev
1325 1329 fi
1326 1330 mv $ROOT-nd $ROOT-nd.prev
1327 1331 fi
1328 1332
1329 1333 #
1330 1334 # Echo the SCM type of the parent workspace, this can't just be which_scm
1331 1335 # as that does not know how to identify various network repositories.
1332 1336 #
1333 1337 function parent_wstype {
1334 1338 typeset scm_type junk
1335 1339
1336 1340 CODEMGR_WS="$BRINGOVER_WS" "$WHICH_SCM" 2>/dev/null \
1337 1341 | read scm_type junk
1338 1342 if [[ -z "$scm_type" || "$scm_type" == unknown ]]; then
1339 1343 # Probe BRINGOVER_WS to determine its type
1340 1344 if [[ $BRINGOVER_WS == ssh://* ]]; then
1341 1345 scm_type="mercurial"
1342 1346 elif [[ $BRINGOVER_WS == http://* ]] && \
1343 1347 wget -q -O- --save-headers "$BRINGOVER_WS/?cmd=heads" | \
1344 1348 egrep -s "application/mercurial" 2> /dev/null; then
1345 1349 scm_type="mercurial"
1346 1350 else
1347 1351 scm_type="none"
1348 1352 fi
1349 1353 fi
1350 1354
1351 1355 # fold both unsupported and unrecognized results into "none"
1352 1356 case "$scm_type" in
1353 1357 mercurial)
1354 1358 ;;
1355 1359 *) scm_type=none
1356 1360 ;;
1357 1361 esac
1358 1362
1359 1363 echo $scm_type
1360 1364 }
1361 1365
1362 1366 # Echo the SCM types of $CODEMGR_WS and $BRINGOVER_WS
1363 1367 function child_wstype {
1364 1368 typeset scm_type junk
1365 1369
1366 1370 # Probe CODEMGR_WS to determine its type
1367 1371 if [[ -d $CODEMGR_WS ]]; then
1368 1372 $WHICH_SCM | read scm_type junk || exit 1
1369 1373 fi
1370 1374
1371 1375 case "$scm_type" in
1372 1376 none|git|mercurial)
1373 1377 ;;
1374 1378 *) scm_type=none
1375 1379 ;;
1376 1380 esac
1377 1381
1378 1382 echo $scm_type
1379 1383 }
1380 1384
1381 1385 SCM_TYPE=$(child_wstype)
1382 1386
1383 1387 #
1384 1388 # Decide whether to clobber
1385 1389 #
1386 1390 if [ "$i_FLAG" = "n" -a -d "$SRC" ]; then
1387 1391 echo "\n==== Make clobber at `date` ====\n" >> $LOGFILE
1388 1392
1389 1393 cd $SRC
1390 1394 # remove old clobber file
1391 1395 rm -f $SRC/clobber.out
1392 1396 rm -f $SRC/clobber-${MACH}.out
1393 1397
1394 1398 # Remove all .make.state* files, just in case we are restarting
1395 1399 # the build after having interrupted a previous 'make clobber'.
1396 1400 find . \( -name SCCS -o -name .hg -o -name .svn -o -name .git \
1397 1401 -o -name 'interfaces.*' \) -prune \
1398 1402 -o -name '.make.*' -print | xargs rm -f
1399 1403
1400 1404 $MAKE -ek clobber 2>&1 | tee -a $SRC/clobber-${MACH}.out >> $LOGFILE
1401 1405 echo "\n==== Make clobber ERRORS ====\n" >> $mail_msg_file
1402 1406 grep "$MAKE:" $SRC/clobber-${MACH}.out |
1403 1407 egrep -v "Ignoring unknown host" | \
1404 1408 tee $TMPDIR/clobber_errs >> $mail_msg_file
1405 1409
1406 1410 if [[ -s $TMPDIR/clobber_errs ]]; then
1407 1411 build_extras_ok=n
1408 1412 fi
1409 1413
1410 1414 if [[ "$t_FLAG" = "y" ]]; then
1411 1415 echo "\n==== Make tools clobber at `date` ====\n" >> $LOGFILE
1412 1416 cd ${TOOLS}
1413 1417 rm -f ${TOOLS}/clobber-${MACH}.out
1414 1418 $MAKE TOOLS_PROTO=$TOOLS_PROTO -ek clobber 2>&1 | \
1415 1419 tee -a ${TOOLS}/clobber-${MACH}.out >> $LOGFILE
1416 1420 echo "\n==== Make tools clobber ERRORS ====\n" \
1417 1421 >> $mail_msg_file
1418 1422 grep "$MAKE:" ${TOOLS}/clobber-${MACH}.out \
1419 1423 >> $mail_msg_file
1420 1424 if (( $? == 0 )); then
1421 1425 build_extras_ok=n
1422 1426 fi
1423 1427 rm -rf ${TOOLS_PROTO}
1424 1428 mkdir -p ${TOOLS_PROTO}
1425 1429 fi
1426 1430
1427 1431 typeset roots=$(allprotos)
1428 1432 echo "\n\nClearing $roots" >> "$LOGFILE"
1429 1433 rm -rf $roots
1430 1434
1431 1435 # Get back to a clean workspace as much as possible to catch
1432 1436 # problems that only occur on fresh workspaces.
1433 1437 # Remove all .make.state* files, libraries, and .o's that may
1434 1438 # have been omitted from clobber. A couple of libraries are
1435 1439 # under source code control, so leave them alone.
1436 1440 # We should probably blow away temporary directories too.
1437 1441 cd $SRC
1438 1442 find $relsrcdirs \( -name SCCS -o -name .hg -o -name .svn \
1439 1443 -o -name .git -o -name 'interfaces.*' \) -prune -o \
1440 1444 \( -name '.make.*' -o -name 'lib*.a' -o -name 'lib*.so*' -o \
1441 1445 -name '*.o' \) -print | \
1442 1446 grep -v 'tools/ctf/dwarf/.*/libdwarf' | xargs rm -f
1443 1447 else
1444 1448 echo "\n==== No clobber at `date` ====\n" >> $LOGFILE
1445 1449 fi
1446 1450
1447 1451 type bringover_mercurial > /dev/null 2>&1 || function bringover_mercurial {
1448 1452 typeset -x PATH=$PATH
1449 1453
1450 1454 # If the repository doesn't exist yet, then we want to populate it.
1451 1455 if [[ ! -d $CODEMGR_WS/.hg ]]; then
1452 1456 staffer hg init $CODEMGR_WS
1453 1457 staffer echo "[paths]" > $CODEMGR_WS/.hg/hgrc
1454 1458 staffer echo "default=$BRINGOVER_WS" >> $CODEMGR_WS/.hg/hgrc
1455 1459 touch $TMPDIR/new_repository
1456 1460 fi
1457 1461
1458 1462 typeset -x HGMERGE="/bin/false"
1459 1463
1460 1464 #
1461 1465 # If the user has changes, regardless of whether those changes are
1462 1466 # committed, and regardless of whether those changes conflict, then
1463 1467 # we'll attempt to merge them either implicitly (uncommitted) or
1464 1468 # explicitly (committed).
1465 1469 #
1466 1470 # These are the messages we'll use to help clarify mercurial output
1467 1471 # in those cases.
1468 1472 #
1469 1473 typeset mergefailmsg="\
1470 1474 ***\n\
1471 1475 *** nightly was unable to automatically merge your changes. You should\n\
1472 1476 *** redo the full merge manually, following the steps outlined by mercurial\n\
1473 1477 *** above, then restart nightly.\n\
1474 1478 ***\n"
1475 1479 typeset mergepassmsg="\
1476 1480 ***\n\
1477 1481 *** nightly successfully merged your changes. This means that your working\n\
1478 1482 *** directory has been updated, but those changes are not yet committed.\n\
1479 1483 *** After nightly completes, you should validate the results of the merge,\n\
1480 1484 *** then use hg commit manually.\n\
1481 1485 ***\n"
1482 1486
1483 1487 #
1484 1488 # For each repository in turn:
1485 1489 #
1486 1490 # 1. Do the pull. If this fails, dump the output and bail out.
1487 1491 #
1488 1492 # 2. If the pull resulted in an extra head, do an explicit merge.
1489 1493 # If this fails, dump the output and bail out.
1490 1494 #
1491 1495 # Because we can't rely on Mercurial to exit with a failure code
1492 1496 # when a merge fails (Mercurial issue #186), we must grep the
1493 1497 # output of pull/merge to check for attempted and/or failed merges.
1494 1498 #
1495 1499 # 3. If a merge failed, set the message and fail the bringover.
1496 1500 #
1497 1501 # 4. Otherwise, if a merge succeeded, set the message
1498 1502 #
1499 1503 # 5. Dump the output, and any message from step 3 or 4.
1500 1504 #
1501 1505
1502 1506 typeset HG_SOURCE=$BRINGOVER_WS
1503 1507 if [ ! -f $TMPDIR/new_repository ]; then
1504 1508 HG_SOURCE=$TMPDIR/open_bundle.hg
1505 1509 staffer hg --cwd $CODEMGR_WS incoming --bundle $HG_SOURCE \
1506 1510 -v $BRINGOVER_WS > $TMPDIR/incoming_open.out
1507 1511
1508 1512 #
1509 1513 # If there are no incoming changesets, then incoming will
1510 1514 # fail, and there will be no bundle file. Reset the source,
1511 1515 # to allow the remaining logic to complete with no false
1512 1516 # negatives. (Unlike incoming, pull will return success
1513 1517 # for the no-change case.)
1514 1518 #
1515 1519 if (( $? != 0 )); then
1516 1520 HG_SOURCE=$BRINGOVER_WS
1517 1521 fi
1518 1522 fi
1519 1523
1520 1524 staffer hg --cwd $CODEMGR_WS pull -u $HG_SOURCE \
1521 1525 > $TMPDIR/pull_open.out 2>&1
1522 1526 if (( $? != 0 )); then
1523 1527 printf "%s: pull failed as follows:\n\n" "$CODEMGR_WS"
1524 1528 cat $TMPDIR/pull_open.out
1525 1529 if grep "^merging.*failed" $TMPDIR/pull_open.out > /dev/null 2>&1; then
1526 1530 printf "$mergefailmsg"
1527 1531 fi
1528 1532 touch $TMPDIR/bringover_failed
1529 1533 return
1530 1534 fi
1531 1535
1532 1536 if grep "not updating" $TMPDIR/pull_open.out > /dev/null 2>&1; then
1533 1537 staffer hg --cwd $CODEMGR_WS merge \
1534 1538 >> $TMPDIR/pull_open.out 2>&1
1535 1539 if (( $? != 0 )); then
1536 1540 printf "%s: merge failed as follows:\n\n" \
1537 1541 "$CODEMGR_WS"
1538 1542 cat $TMPDIR/pull_open.out
1539 1543 if grep "^merging.*failed" $TMPDIR/pull_open.out \
1540 1544 > /dev/null 2>&1; then
1541 1545 printf "$mergefailmsg"
1542 1546 fi
1543 1547 touch $TMPDIR/bringover_failed
1544 1548 return
1545 1549 fi
1546 1550 fi
1547 1551
1548 1552 printf "updated %s with the following results:\n" "$CODEMGR_WS"
1549 1553 cat $TMPDIR/pull_open.out
1550 1554 if grep "^merging" $TMPDIR/pull_open.out >/dev/null 2>&1; then
1551 1555 printf "$mergepassmsg"
1552 1556 fi
1553 1557 printf "\n"
1554 1558
1555 1559 #
1556 1560 # Per-changeset output is neither useful nor manageable for a
1557 1561 # newly-created repository.
1558 1562 #
1559 1563 if [ -f $TMPDIR/new_repository ]; then
1560 1564 return
1561 1565 fi
1562 1566
1563 1567 printf "\nadded the following changesets to open repository:\n"
1564 1568 cat $TMPDIR/incoming_open.out
1565 1569 }
1566 1570
1567 1571 type bringover_none > /dev/null 2>&1 || function bringover_none {
1568 1572 echo "Couldn't figure out what kind of SCM to use for $BRINGOVER_WS."
1569 1573 touch $TMPDIR/bringover_failed
1570 1574 }
1571 1575
1572 1576 #
1573 1577 # Decide whether to bringover to the codemgr workspace
1574 1578 #
1575 1579 if [ "$n_FLAG" = "n" ]; then
1576 1580 PARENT_SCM_TYPE=$(parent_wstype)
1577 1581
1578 1582 if [[ $SCM_TYPE != none && $SCM_TYPE != $PARENT_SCM_TYPE ]]; then
1579 1583 echo "cannot bringover from $PARENT_SCM_TYPE to $SCM_TYPE, " \
1580 1584 "quitting at `date`." | tee -a $mail_msg_file >> $LOGFILE
1581 1585 exit 1
1582 1586 fi
1583 1587
1584 1588 run_hook PRE_BRINGOVER
1585 1589
1586 1590 echo "\n==== bringover to $CODEMGR_WS at `date` ====\n" >> $LOGFILE
1587 1591 echo "\n==== BRINGOVER LOG ====\n" >> $mail_msg_file
1588 1592
1589 1593 eval "bringover_${PARENT_SCM_TYPE}" 2>&1 |
1590 1594 tee -a $mail_msg_file >> $LOGFILE
1591 1595
1592 1596 if [ -f $TMPDIR/bringover_failed ]; then
1593 1597 rm -f $TMPDIR/bringover_failed
1594 1598 build_ok=n
1595 1599 echo "trouble with bringover, quitting at `date`." |
1596 1600 tee -a $mail_msg_file >> $LOGFILE
1597 1601 exit 1
1598 1602 fi
1599 1603
1600 1604 #
1601 1605 # It's possible that we used the bringover above to create
1602 1606 # $CODEMGR_WS. If so, then SCM_TYPE was previously "none,"
1603 1607 # but should now be the same as $BRINGOVER_WS.
1604 1608 #
1605 1609 [[ $SCM_TYPE = none ]] && SCM_TYPE=$PARENT_SCM_TYPE
1606 1610
1607 1611 run_hook POST_BRINGOVER
1608 1612
1609 1613 check_closed_bins
1610 1614
1611 1615 else
1612 1616 echo "\n==== No bringover to $CODEMGR_WS ====\n" >> $LOGFILE
1613 1617 fi
1614 1618
1615 1619 # Safeguards
1616 1620 [[ -v CODEMGR_WS ]] || fatal_error "Error: Variable CODEMGR_WS not set."
1617 1621 [[ -d "${CODEMGR_WS}" ]] || fatal_error "Error: ${CODEMGR_WS} is not a directory."
1618 1622 [[ -f "${CODEMGR_WS}/usr/src/Makefile" ]] || fatal_error "Error: ${CODEMGR_WS}/usr/src/Makefile not found."
1619 1623
1620 1624 if [[ "$t_FLAG" = "y" ]]; then
1621 1625 echo "\n==== Bootstrapping cw ====\n" >> $LOGFILE
1622 1626 ( cd ${TOOLS}
1623 1627 set_non_debug_build_flags
1624 1628 rm -f $TMPDIR/make-state
1625 1629 $MAKE -K $TMPDIR/make-state -e TARGET=install cw 2>&1 >> $LOGFILE
1626 1630 [[ "$?" -ne 0 ]] && fatal_error "Error: could not bootstrap cw"
1627 1631 )
1628 1632
1629 1633 # Switch ONBLD_TOOLS early if -t is specified so that
1630 1634 # we could use bootstrapped cw for compiler checks.
1631 1635 ONBLD_TOOLS=${TOOLS_PROTO}/opt/onbld
1632 1636 export ONBLD_TOOLS
1633 1637 fi
1634 1638
1635 1639 echo "\n==== Build environment ====\n" | tee -a $build_environ_file >> $LOGFILE
1636 1640
1637 1641 # System
1638 1642 whence uname | tee -a $build_environ_file >> $LOGFILE
1639 1643 uname -a 2>&1 | tee -a $build_environ_file >> $LOGFILE
1640 1644 echo | tee -a $build_environ_file >> $LOGFILE
1641 1645
1642 1646 # make
1643 1647 whence $MAKE | tee -a $build_environ_file >> $LOGFILE
1644 1648 $MAKE -v | tee -a $build_environ_file >> $LOGFILE
1645 1649 echo "number of concurrent jobs = $DMAKE_MAX_JOBS" |
1646 1650 tee -a $build_environ_file >> $LOGFILE
1647 1651
1648 1652 #
1649 1653 # Report the compiler versions.
1650 1654 #
1651 1655
1652 1656 if [[ ! -f $SRC/Makefile ]]; then
1653 1657 build_ok=n
1654 1658 echo "\nUnable to find \"Makefile\" in $SRC." | \
1655 1659 tee -a $build_environ_file >> $LOGFILE
1656 1660 exit 1
1657 1661 fi
1658 1662
1659 1663 ( cd $SRC
1660 1664 for target in cc-version cc64-version java-version; do
1661 1665 echo
1662 1666 #
1663 1667 # Put statefile somewhere we know we can write to rather than trip
1664 1668 # over a read-only $srcroot.
1665 1669 #
1666 1670 rm -f $TMPDIR/make-state
1667 1671 export SRC
1668 1672 if $MAKE -K $TMPDIR/make-state -e $target 2>/dev/null; then
1669 1673 continue
1670 1674 fi
1671 1675 touch $TMPDIR/nocompiler
1672 1676 done
1673 1677 echo
1674 1678 ) | tee -a $build_environ_file >> $LOGFILE
1675 1679
1676 1680 if [ -f $TMPDIR/nocompiler ]; then
1677 1681 rm -f $TMPDIR/nocompiler
1678 1682 build_ok=n
1679 1683 echo "Aborting due to missing compiler." |
1680 1684 tee -a $build_environ_file >> $LOGFILE
1681 1685 exit 1
1682 1686 fi
1683 1687
1684 1688 # as
1685 1689 whence as | tee -a $build_environ_file >> $LOGFILE
1686 1690 as -V 2>&1 | head -1 | tee -a $build_environ_file >> $LOGFILE
1687 1691 echo | tee -a $build_environ_file >> $LOGFILE
1688 1692
1689 1693 # Check that we're running a capable link-editor
1690 1694 whence ld | tee -a $build_environ_file >> $LOGFILE
1691 1695 LDVER=`ld -V 2>&1`
1692 1696 echo $LDVER | tee -a $build_environ_file >> $LOGFILE
1693 1697 LDVER=`echo $LDVER | sed -e "s/.*-1\.\([0-9]*\).*/\1/"`
1694 1698 if [ `expr $LDVER \< 422` -eq 1 ]; then
1695 1699 echo "The link-editor needs to be at version 422 or higher to build" | \
1696 1700 tee -a $build_environ_file >> $LOGFILE
1697 1701 echo "the latest stuff. Hope your build works." | \
1698 1702 tee -a $build_environ_file >> $LOGFILE
1699 1703 fi
1700 1704
1701 1705 #
1702 1706 # Build and use the workspace's tools if requested
1703 1707 #
1704 1708 if [[ "$t_FLAG" = "y" ]]; then
1705 1709 set_non_debug_build_flags
1706 1710
1707 1711 build_tools ${TOOLS_PROTO}
1708 1712 if (( $? != 0 )); then
1709 1713 build_ok=n
1710 1714 else
1711 1715 STABS=${TOOLS_PROTO}/opt/onbld/bin/${MACH}/stabs
1712 1716 export STABS
1713 1717 CTFSTABS=${TOOLS_PROTO}/opt/onbld/bin/${MACH}/ctfstabs
1714 1718 export CTFSTABS
1715 1719 GENOFFSETS=${TOOLS_PROTO}/opt/onbld/bin/genoffsets
1716 1720 export GENOFFSETS
1717 1721
1718 1722 CTFCONVERT=${TOOLS_PROTO}/opt/onbld/bin/${MACH}/ctfconvert
1719 1723 export CTFCONVERT
1720 1724 CTFMERGE=${TOOLS_PROTO}/opt/onbld/bin/${MACH}/ctfmerge
1721 1725 export CTFMERGE
1722 1726
1723 1727 PATH="${TOOLS_PROTO}/opt/onbld/bin/${MACH}:${PATH}"
1724 1728 PATH="${TOOLS_PROTO}/opt/onbld/bin:${PATH}"
1725 1729 export PATH
1726 1730
1727 1731 echo "\n==== New environment settings. ====\n" >> $LOGFILE
1728 1732 echo "STABS=${STABS}" >> $LOGFILE
1729 1733 echo "CTFSTABS=${CTFSTABS}" >> $LOGFILE
1730 1734 echo "CTFCONVERT=${CTFCONVERT}" >> $LOGFILE
1731 1735 echo "CTFMERGE=${CTFMERGE}" >> $LOGFILE
1732 1736 echo "PATH=${PATH}" >> $LOGFILE
1733 1737 echo "ONBLD_TOOLS=${ONBLD_TOOLS}" >> $LOGFILE
1734 1738 fi
1735 1739 fi
1736 1740
1737 1741 # timestamp the start of the normal build; the findunref tool uses it.
1738 1742 touch $SRC/.build.tstamp
1739 1743
1740 1744 normal_build
1741 1745
1742 1746 ORIG_SRC=$SRC
1743 1747 BINARCHIVE=${CODEMGR_WS}/bin-${MACH}.cpio.Z
1744 1748
1745 1749
1746 1750 #
1747 1751 # There are several checks that need to look at the proto area, but
1748 1752 # they only need to look at one, and they don't care whether it's
1749 1753 # DEBUG or non-DEBUG.
1750 1754 #
1751 1755 if [[ "$MULTI_PROTO" = yes && "$D_FLAG" = n ]]; then
1752 1756 checkroot=$ROOT-nd
1753 1757 else
1754 1758 checkroot=$ROOT
1755 1759 fi
1756 1760
1757 1761 if [ "$build_ok" = "y" ]; then
1758 1762 echo "\n==== Creating protolist system file at `date` ====" \
1759 1763 >> $LOGFILE
1760 1764 protolist $checkroot > $ATLOG/proto_list_${MACH}
1761 1765 echo "==== protolist system file created at `date` ====\n" \
1762 1766 >> $LOGFILE
1763 1767
1764 1768 if [ "$N_FLAG" != "y" ]; then
1765 1769
1766 1770 E1=
1767 1771 f1=
1768 1772 for f in $f1; do
1769 1773 if [ -f "$f" ]; then
1770 1774 E1="$E1 -e $f"
1771 1775 fi
1772 1776 done
1773 1777
1774 1778 E2=
1775 1779 f2=
1776 1780 if [ -d "$SRC/pkg" ]; then
1777 1781 f2="$f2 exceptions/packaging"
1778 1782 fi
1779 1783
1780 1784 for f in $f2; do
1781 1785 if [ -f "$f" ]; then
1782 1786 E2="$E2 -e $f"
1783 1787 fi
1784 1788 done
1785 1789 fi
1786 1790
1787 1791 if [ "$N_FLAG" != "y" -a -d $SRC/pkg ]; then
1788 1792 echo "\n==== Validating manifests against proto area ====\n" \
1789 1793 >> $mail_msg_file
1790 1794 ( cd $SRC/pkg ; $MAKE -e protocmp ROOT="$checkroot" ) | \
1791 1795 tee $TMPDIR/protocmp_noise >> $mail_msg_file
1792 1796 if [[ -s $TMPDIR/protocmp_noise ]]; then
1793 1797 build_extras_ok=n
1794 1798 fi
1795 1799 fi
1796 1800
1797 1801 if [ "$N_FLAG" != "y" -a -f "$REF_PROTO_LIST" ]; then
1798 1802 echo "\n==== Impact on proto area ====\n" >> $mail_msg_file
1799 1803 if [ -n "$E2" ]; then
1800 1804 ELIST=$E2
1801 1805 else
1802 1806 ELIST=$E1
1803 1807 fi
1804 1808 $PROTOCMPTERSE \
1805 1809 "Files in yesterday's proto area, but not today's:" \
1806 1810 "Files in today's proto area, but not yesterday's:" \
1807 1811 "Files that changed between yesterday and today:" \
1808 1812 ${ELIST} \
1809 1813 -d $REF_PROTO_LIST \
1810 1814 $ATLOG/proto_list_${MACH} \
1811 1815 >> $mail_msg_file
1812 1816 fi
1813 1817 fi
1814 1818
1815 1819 if [[ "$u_FLAG" == "y" && "$build_ok" == "y" && \
1816 1820 "$build_extras_ok" == "y" ]]; then
1817 1821 staffer cp $ATLOG/proto_list_${MACH} \
1818 1822 $PARENT_WS/usr/src/proto_list_${MACH}
1819 1823 fi
1820 1824
1821 1825 # Update parent proto area if necessary. This is done now
1822 1826 # so that the proto area has either DEBUG or non-DEBUG kernels.
1823 1827 # Note that this clears out the lock file, so we can dispense with
1824 1828 # the variable now.
1825 1829 if [ "$U_FLAG" = "y" -a "$build_ok" = "y" ]; then
1826 1830 echo "\n==== Copying proto area to $NIGHTLY_PARENT_ROOT ====\n" | \
1827 1831 tee -a $LOGFILE >> $mail_msg_file
1828 1832 rm -rf $NIGHTLY_PARENT_ROOT/*
1829 1833 unset Ulockfile
1830 1834 mkdir -p $NIGHTLY_PARENT_ROOT
1831 1835 if [[ "$MULTI_PROTO" = no || "$D_FLAG" = y ]]; then
1832 1836 ( cd $ROOT; tar cf - . |
1833 1837 ( cd $NIGHTLY_PARENT_ROOT; umask 0; tar xpf - ) ) 2>&1 |
1834 1838 tee -a $mail_msg_file >> $LOGFILE
1835 1839 fi
1836 1840 if [[ "$MULTI_PROTO" = yes && "$F_FLAG" = n ]]; then
1837 1841 rm -rf $NIGHTLY_PARENT_ROOT-nd/*
1838 1842 mkdir -p $NIGHTLY_PARENT_ROOT-nd
1839 1843 cd $ROOT-nd
1840 1844 ( tar cf - . |
1841 1845 ( cd $NIGHTLY_PARENT_ROOT-nd; umask 0; tar xpf - ) ) 2>&1 |
1842 1846 tee -a $mail_msg_file >> $LOGFILE
1843 1847 fi
1844 1848 if [ -n "${NIGHTLY_PARENT_TOOLS_ROOT}" ]; then
1845 1849 echo "\n==== Copying tools proto area to $NIGHTLY_PARENT_TOOLS_ROOT ====\n" | \
1846 1850 tee -a $LOGFILE >> $mail_msg_file
1847 1851 rm -rf $NIGHTLY_PARENT_TOOLS_ROOT/*
1848 1852 mkdir -p $NIGHTLY_PARENT_TOOLS_ROOT
1849 1853 if [[ "$MULTI_PROTO" = no || "$D_FLAG" = y ]]; then
1850 1854 ( cd $TOOLS_PROTO; tar cf - . |
1851 1855 ( cd $NIGHTLY_PARENT_TOOLS_ROOT;
1852 1856 umask 0; tar xpf - ) ) 2>&1 |
1853 1857 tee -a $mail_msg_file >> $LOGFILE
1854 1858 fi
1855 1859 fi
1856 1860 fi
1857 1861
1858 1862 #
1859 1863 # ELF verification: ABI (-A) and runtime (-r) checks
1860 1864 #
1861 1865 if [[ ($build_ok = y) && (($A_FLAG = y) || ($r_FLAG = y)) ]]; then
1862 1866 # Directory ELF-data.$MACH holds the files produced by these tests.
1863 1867 elf_ddir=$SRC/ELF-data.$MACH
1864 1868
1865 1869 # If there is a previous ELF-data backup directory, remove it. Then,
1866 1870 # rotate current ELF-data directory into its place and create a new
1867 1871 # empty directory
1868 1872 rm -rf $elf_ddir.ref
1869 1873 if [[ -d $elf_ddir ]]; then
1870 1874 mv $elf_ddir $elf_ddir.ref
1871 1875 fi
1872 1876 mkdir -p $elf_ddir
1873 1877
1874 1878 # Call find_elf to produce a list of the ELF objects in the proto area.
1875 1879 # This list is passed to check_rtime and interface_check, preventing
1876 1880 # them from separately calling find_elf to do the same work twice.
1877 1881 find_elf -fr $checkroot > $elf_ddir/object_list
1878 1882
1879 1883 if [[ $A_FLAG = y ]]; then
1880 1884 echo "\n==== Check versioning and ABI information ====\n" | \
1881 1885 tee -a $LOGFILE >> $mail_msg_file
1882 1886
1883 1887 # Produce interface description for the proto. Report errors.
1884 1888 interface_check -o -w $elf_ddir -f object_list \
1885 1889 -i interface -E interface.err
1886 1890 if [[ -s $elf_ddir/interface.err ]]; then
1887 1891 tee -a $LOGFILE < $elf_ddir/interface.err \
1888 1892 >> $mail_msg_file
1889 1893 build_extras_ok=n
1890 1894 fi
1891 1895
1892 1896 # If ELF_DATA_BASELINE_DIR is defined, compare the new interface
1893 1897 # description file to that from the baseline gate. Issue a
1894 1898 # warning if the baseline is not present, and keep going.
1895 1899 if [[ "$ELF_DATA_BASELINE_DIR" != '' ]]; then
1896 1900 base_ifile="$ELF_DATA_BASELINE_DIR/interface"
1897 1901
1898 1902 echo "\n==== Compare versioning and ABI information" \
1899 1903 "to baseline ====\n" | \
1900 1904 tee -a $LOGFILE >> $mail_msg_file
1901 1905 echo "Baseline: $base_ifile\n" >> $LOGFILE
1902 1906
1903 1907 if [[ -f $base_ifile ]]; then
1904 1908 interface_cmp -d -o $base_ifile \
1905 1909 $elf_ddir/interface > $elf_ddir/interface.cmp
1906 1910 if [[ -s $elf_ddir/interface.cmp ]]; then
1907 1911 echo | tee -a $LOGFILE >> $mail_msg_file
1908 1912 tee -a $LOGFILE < \
1909 1913 $elf_ddir/interface.cmp \
1910 1914 >> $mail_msg_file
1911 1915 build_extras_ok=n
1912 1916 fi
1913 1917 else
1914 1918 echo "baseline not available. comparison" \
1915 1919 "skipped" | \
1916 1920 tee -a $LOGFILE >> $mail_msg_file
1917 1921 fi
1918 1922
1919 1923 fi
1920 1924 fi
1921 1925
1922 1926 if [[ $r_FLAG = y ]]; then
1923 1927 echo "\n==== Check ELF runtime attributes ====\n" | \
1924 1928 tee -a $LOGFILE >> $mail_msg_file
1925 1929
1926 1930 # If we're doing a DEBUG build the proto area will be left
1927 1931 # with debuggable objects, thus don't assert -s.
1928 1932 if [[ $D_FLAG = y ]]; then
1929 1933 rtime_sflag=""
1930 1934 else
1931 1935 rtime_sflag="-s"
1932 1936 fi
1933 1937 check_rtime -i -m -v $rtime_sflag -o -w $elf_ddir \
1934 1938 -D object_list -f object_list -E runtime.err \
1935 1939 -I runtime.attr.raw
1936 1940 if (( $? != 0 )); then
1937 1941 build_extras_ok=n
1938 1942 fi
1939 1943
1940 1944 # check_rtime -I output needs to be sorted in order to
1941 1945 # compare it to that from previous builds.
1942 1946 sort $elf_ddir/runtime.attr.raw > $elf_ddir/runtime.attr
1943 1947 rm $elf_ddir/runtime.attr.raw
1944 1948
1945 1949 # Report errors
1946 1950 if [[ -s $elf_ddir/runtime.err ]]; then
1947 1951 tee -a $LOGFILE < $elf_ddir/runtime.err \
1948 1952 >> $mail_msg_file
1949 1953 build_extras_ok=n
1950 1954 fi
1951 1955
1952 1956 # If there is an ELF-data directory from a previous build,
1953 1957 # then diff the attr files. These files contain information
1954 1958 # about dependencies, versioning, and runpaths. There is some
1955 1959 # overlap with the ABI checking done above, but this also
1956 1960 # flushes out non-ABI interface differences along with the
1957 1961 # other information.
1958 1962 echo "\n==== Diff ELF runtime attributes" \
1959 1963 "(since last build) ====\n" | \
1960 1964 tee -a $LOGFILE >> $mail_msg_file >> $mail_msg_file
1961 1965
1962 1966 if [[ -f $elf_ddir.ref/runtime.attr ]]; then
1963 1967 diff $elf_ddir.ref/runtime.attr \
1964 1968 $elf_ddir/runtime.attr \
1965 1969 >> $mail_msg_file
1966 1970 fi
1967 1971 fi
1968 1972
1969 1973 # If -u set, copy contents of ELF-data.$MACH to the parent workspace.
1970 1974 if [[ "$u_FLAG" = "y" ]]; then
1971 1975 p_elf_ddir=$PARENT_WS/usr/src/ELF-data.$MACH
1972 1976
1973 1977 # If parent lacks the ELF-data.$MACH directory, create it
1974 1978 if [[ ! -d $p_elf_ddir ]]; then
1975 1979 staffer mkdir -p $p_elf_ddir
1976 1980 fi
1977 1981
1978 1982 # These files are used asynchronously by other builds for ABI
1979 1983 # verification, as above for the -A option. As such, we require
1980 1984 # the file replacement to be atomic. Copy the data to a temp
1981 1985 # file in the same filesystem and then rename into place.
1982 1986 (
1983 1987 cd $elf_ddir
1984 1988 for elf_dfile in *; do
1985 1989 staffer cp $elf_dfile \
1986 1990 ${p_elf_ddir}/${elf_dfile}.new
1987 1991 staffer mv -f ${p_elf_ddir}/${elf_dfile}.new \
1988 1992 ${p_elf_ddir}/${elf_dfile}
1989 1993 done
1990 1994 )
1991 1995 fi
1992 1996 fi
1993 1997
1994 1998 # DEBUG lint of kernel begins
1995 1999
1996 2000 if [ "$i_CMD_LINE_FLAG" = "n" -a "$l_FLAG" = "y" ]; then
1997 2001 if [ "$LINTDIRS" = "" ]; then
1998 2002 # LINTDIRS="$SRC/uts y $SRC/stand y $SRC/psm y"
1999 2003 LINTDIRS="$SRC y"
2000 2004 fi
2001 2005 set $LINTDIRS
2002 2006 while [ $# -gt 0 ]; do
2003 2007 dolint $1 $2; shift; shift
2004 2008 done
2005 2009 else
2006 2010 echo "\n==== No '$MAKE lint' ====\n" >> $LOGFILE
2007 2011 fi
2008 2012
2009 2013 # "make check" begins
2010 2014
2011 2015 if [ "$i_CMD_LINE_FLAG" = "n" -a "$C_FLAG" = "y" ]; then
2012 2016 # remove old check.out
2013 2017 rm -f $SRC/check.out
2014 2018
2015 2019 rm -f $SRC/check-${MACH}.out
2016 2020 cd $SRC
2017 2021 $MAKE -ek check ROOT="$checkroot" 2>&1 | tee -a $SRC/check-${MACH}.out \
2018 2022 >> $LOGFILE
2019 2023 echo "\n==== cstyle/hdrchk errors ====\n" >> $mail_msg_file
2020 2024
2021 2025 grep ":" $SRC/check-${MACH}.out |
2022 2026 egrep -v "Ignoring unknown host" | \
2023 2027 sort | uniq | tee $TMPDIR/check_errors >> $mail_msg_file
2024 2028
2025 2029 if [[ -s $TMPDIR/check_errors ]]; then
2026 2030 build_extras_ok=n
2027 2031 fi
2028 2032 else
2029 2033 echo "\n==== No '$MAKE check' ====\n" >> $LOGFILE
2030 2034 fi
2031 2035
2032 2036 echo "\n==== Find core files ====\n" | \
2033 2037 tee -a $LOGFILE >> $mail_msg_file
2034 2038
2035 2039 find $abssrcdirs -name core -a -type f -exec file {} \; | \
2036 2040 tee -a $LOGFILE >> $mail_msg_file
2037 2041
2038 2042 if [ "$f_FLAG" = "y" -a "$build_ok" = "y" ]; then
2039 2043 echo "\n==== Diff unreferenced files (since last build) ====\n" \
2040 2044 | tee -a $LOGFILE >>$mail_msg_file
2041 2045 rm -f $SRC/unref-${MACH}.ref
2042 2046 if [ -f $SRC/unref-${MACH}.out ]; then
2043 2047 mv $SRC/unref-${MACH}.out $SRC/unref-${MACH}.ref
2044 2048 fi
2045 2049
2046 2050 findunref -S $SCM_TYPE -t $SRC/.build.tstamp -s usr $CODEMGR_WS \
2047 2051 ${TOOLS}/findunref/exception_list 2>> $mail_msg_file | \
2048 2052 sort > $SRC/unref-${MACH}.out
2049 2053
2050 2054 if [ ! -f $SRC/unref-${MACH}.ref ]; then
2051 2055 cp $SRC/unref-${MACH}.out $SRC/unref-${MACH}.ref
2052 2056 fi
2053 2057
2054 2058 diff $SRC/unref-${MACH}.ref $SRC/unref-${MACH}.out >>$mail_msg_file
2055 2059 fi
2056 2060
2057 2061 # Verify that the usual lists of files, such as exception lists,
2058 2062 # contain only valid references to files. If the build has failed,
2059 2063 # then don't check the proto area.
2060 2064 CHECK_PATHS=${CHECK_PATHS:-y}
2061 2065 if [ "$CHECK_PATHS" = y -a "$N_FLAG" != y ]; then
2062 2066 echo "\n==== Check lists of files ====\n" | tee -a $LOGFILE \
2063 2067 >>$mail_msg_file
2064 2068 arg=-b
2065 2069 [ "$build_ok" = y ] && arg=
2066 2070 checkpaths $arg $checkroot > $SRC/check-paths.out 2>&1
2067 2071 if [[ -s $SRC/check-paths.out ]]; then
2068 2072 tee -a $LOGFILE < $SRC/check-paths.out >> $mail_msg_file
2069 2073 build_extras_ok=n
2070 2074 fi
2071 2075 fi
2072 2076
2073 2077 if [ "$M_FLAG" != "y" -a "$build_ok" = y ]; then
2074 2078 echo "\n==== Impact on file permissions ====\n" \
2075 2079 >> $mail_msg_file
2076 2080
2077 2081 abspkg=
2078 2082 for d in $abssrcdirs; do
2079 2083 if [ -d "$d/pkg" ]; then
2080 2084 abspkg="$abspkg $d"
2081 2085 fi
2082 2086 done
2083 2087
2084 2088 if [ -n "$abspkg" ]; then
2085 2089 for d in "$abspkg"; do
2086 2090 ( cd $d/pkg ; $MAKE -e pmodes ) >> $mail_msg_file
2087 2091 done
2088 2092 fi
2089 2093 fi
2090 2094
2091 2095 if [ "$w_FLAG" = "y" -a "$build_ok" = "y" ]; then
2092 2096 if [[ "$MULTI_PROTO" = no || "$D_FLAG" = y ]]; then
2093 2097 do_wsdiff DEBUG $ROOT.prev $ROOT
2094 2098 fi
2095 2099
2096 2100 if [[ "$MULTI_PROTO" = yes && "$F_FLAG" = n ]]; then
2097 2101 do_wsdiff non-DEBUG $ROOT-nd.prev $ROOT-nd
2098 2102 fi
2099 2103 fi
2100 2104
2101 2105 END_DATE=`date`
2102 2106 echo "==== Nightly $maketype build completed: $END_DATE ====" | \
2103 2107 tee -a $LOGFILE >> $build_time_file
2104 2108
2105 2109 typeset -i10 hours
2106 2110 typeset -Z2 minutes
2107 2111 typeset -Z2 seconds
2108 2112
2109 2113 elapsed_time=$SECONDS
2110 2114 ((hours = elapsed_time / 3600 ))
2111 2115 ((minutes = elapsed_time / 60 % 60))
2112 2116 ((seconds = elapsed_time % 60))
2113 2117
2114 2118 echo "\n==== Total build time ====" | \
2115 2119 tee -a $LOGFILE >> $build_time_file
2116 2120 echo "\nreal ${hours}:${minutes}:${seconds}" | \
2117 2121 tee -a $LOGFILE >> $build_time_file
2118 2122
2119 2123 if [ "$u_FLAG" = "y" -a "$f_FLAG" = "y" -a "$build_ok" = "y" ]; then
2120 2124 staffer cp ${SRC}/unref-${MACH}.out $PARENT_WS/usr/src/
2121 2125
2122 2126 #
2123 2127 # Produce a master list of unreferenced files -- ideally, we'd
2124 2128 # generate the master just once after all of the nightlies
2125 2129 # have finished, but there's no simple way to know when that
2126 2130 # will be. Instead, we assume that we're the last nightly to
2127 2131 # finish and merge all of the unref-${MACH}.out files in
2128 2132 # $PARENT_WS/usr/src/. If we are in fact the final ${MACH} to
2129 2133 # finish, then this file will be the authoritative master
2130 2134 # list. Otherwise, another ${MACH}'s nightly will eventually
2131 2135 # overwrite ours with its own master, but in the meantime our
2132 2136 # temporary "master" will be no worse than any older master
2133 2137 # which was already on the parent.
2134 2138 #
2135 2139
2136 2140 set -- $PARENT_WS/usr/src/unref-*.out
2137 2141 cp "$1" ${TMPDIR}/unref.merge
2138 2142 shift
2139 2143
2140 2144 for unreffile; do
2141 2145 comm -12 ${TMPDIR}/unref.merge "$unreffile" > ${TMPDIR}/unref.$$
2142 2146 mv ${TMPDIR}/unref.$$ ${TMPDIR}/unref.merge
2143 2147 done
2144 2148
2145 2149 staffer cp ${TMPDIR}/unref.merge $PARENT_WS/usr/src/unrefmaster.out
2146 2150 fi
2147 2151
2148 2152 #
2149 2153 # All done save for the sweeping up.
2150 2154 # (whichever exit we hit here will trigger the "cleanup" trap which
2151 2155 # optionally sends mail on completion).
2152 2156 #
2153 2157 if [[ "$build_ok" == "y" ]]; then
2154 2158 if [[ "$W_FLAG" == "y" || "$build_extras_ok" == "y" ]]; then
2155 2159 exit 0
2156 2160 fi
2157 2161 fi
2158 2162
2159 2163 exit 1
↓ open down ↓ |
1042 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX