diff options
Diffstat (limited to 'usr/src/tools/ctf/scripts/ctfcvtptbl.pl')
| -rw-r--r-- | usr/src/tools/ctf/scripts/ctfcvtptbl.pl | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/usr/src/tools/ctf/scripts/ctfcvtptbl.pl b/usr/src/tools/ctf/scripts/ctfcvtptbl.pl new file mode 100644 index 0000000000..cc2de05c3a --- /dev/null +++ b/usr/src/tools/ctf/scripts/ctfcvtptbl.pl @@ -0,0 +1,222 @@ +#!/bin/perl -w +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (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 +# +# +# ident "%Z%%M% %I% %E% SMI" +# +# Copyright 2002 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ctfcvtptbl [-o outfile] patch-makeup-table +# +# Given a path to a patch makeup table, this script converts that table to +# machine-optimal format and deposits it in the file specified by the -o option +# or on stdout depending on whether or not -o is specified. +# +# The user-supplied patch makeup table is in the following format: +# +# # +# # comment +# # +# +# genunix_archive=/path/to/genunix/archive +# +# patch 100001-01 kureq 100002-01 +# usr/src/uts/sparc/sd/debug32/sd +# module2 +# +# patch 100003-08 +# module3 +# +# The machine-optimal format for the above looks like this: +# +# GENUNIX_ARCHIVE=/path/to/genunix/archive +# module1 100001-01 100002-01 +# module2 100001-01 100002-01 +# module3 100003-08 +# +# +# Macros and other time-savers: +# +# * $RELEASE and $MACH in the genunix archive path will be replaced by the +# values of the RELEASE and MACH environment variables, respectively, as +# set by the program calling this one. +# +# * BUILD, BUILD32, and BUILD64 will, when used in the path for the module, +# will be match as follows: +# +# BUILD debug32, debug64, obj32, obj64 +# BUILD32 debug32, obj32 +# BUILD64 debug64, obj64 +# +# * The presence of `usr/src' at the beginning of each module path will be +# assumed, and is not required to be specified. +# + +use strict; +use Getopt::Std; +use File::Basename; + +my $PROGNAME = basename($0); + +my $genunix_archive; +my %moddata; +my %typehash = ( + BUILD => [ "debug32", "debug64", "obj32", "obj64" ], + BUILD32 => [ "debug32", "obj32" ], + BUILD64 => [ "debug64", "obj64" ] +); + +my %opts; +my $err = 0; +$err = 1 unless getopts("ho:", \%opts); +if ($opts{"o"}) { + close(STDOUT); + open(STDOUT, ">" . $opts{"o"}) || do { + print STDERR "Couldn't open " . $opts{"o"} . ": $!\n"; + exit(1); + } +} +if ($opts{"h"}) { + &usage; + exit(2); +} + +if (@ARGV != 1) { + $err = 1; +} + +if ($err) { + &usage; + exit(2); +} + +$::table = $ARGV[0]; + +if (!open(TABLE, "<$::table")) { + print STDERR "Couldn't open $::table: $!\n"; + exit(1); +} + +if (!&read_table) { + exit(1); +} + +&sub_vars; + +&dump_table; + +exit(0); + +sub usage { + print STDERR "Usage: $PROGNAME [-o outfile] table\n"; +} + +sub read_table { + my $patchid = ""; + my $kureq = ""; + my $kuprev = ""; + + $genunix_archive = ""; + undef %moddata; + + while (<TABLE>) { + chop; + s/\#.*$//; # Strip comments + s/^\s+//; + + if (!$patchid && /^genunix_archive=(\S+)\s*$/) { + $genunix_archive = $1; + next; + } + + while ($_) { + if (s/^patch\s+(\d{6}-\d{2}) + (\s+ku(req|prev)\s+(\d{6}-\d{2}|fcs))?//x && + (!$_ || /^\s/)) { + $patchid = $1; + $kureq = (defined $4 ? $4 : "fcs"); + $kuprev = (defined $3 && $3 eq "prev" ? 1 : 0); + } elsif ($patchid && s/^(\S+)//) { + my $module = $1; + + if (($module =~ m:/genunix/:) && !$kuprev) { + &parseerror("No kuprev supplied " . + "for entry including genunix"); + } + + if (($module !~ m:^usr/src/:)) { + $module = "usr/src/" . $module; + } + + if (($module =~ + m:^(.*)\$(BUILD|BUILD32|BUILD64)(/.*)$:)) { + foreach my $type (@{$typehash{$2}}) { + $moddata{$1 . $type . $3} = + [$patchid, $kureq]; + } + } else { + $moddata{$module} = [$patchid, $kureq]; + } + } else { + &parseerror("Cannot parse table"); + } + + s/^\s+//; + } + } + + if (!$genunix_archive) { + print STDERR "No genunix_archive line in table\n"; + return (0); + } + + if (!%moddata) { + print STDERR "No module information read\n"; + return (0); + } + + return (1); +} + +sub parseerror { + my $msg = $_[0]; + + print STDERR "$msg at line $.\n"; + exit(1); +} + +sub sub_vars { + my $release = $ENV{"RELEASE"}; + my $mach = $ENV{"MACH"}; + + $genunix_archive =~ s/\$RELEASE/$release/ if defined $release; + $genunix_archive =~ s/\$MACH/$mach/ if defined $mach; +} + +sub dump_table { + print "GENUNIX_ARCHIVE=" . $genunix_archive . "\n"; + + foreach my $mod (sort keys %moddata) { + print join(" ", ($mod, @{$moddata{$mod}})) . "\n"; + } +} |
