blob: 981874be887988d6cc85f6ebd344750335512578 [file] [log] [blame] [edit]
eval 'exec perl -S $0 ${1+"$@"}'
if 0;
##
## -------------------------------------------------------------
## Copyright 2004-2008 Synopsys, Inc.
## All Rights Reserved Worldwide
##
## Licensed under the Apache License, Version 2.0 (the
## "License"); you may not use this file except in
## compliance with the License. You may obtain a copy of
## the License at
##
## http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in
## writing, software distributed under the License is
## distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
## CONDITIONS OF ANY KIND, either express or implied. See
## the License for the specific language governing
## permissions and limitations under the License.
## -------------------------------------------------------------
##
$vmm = $0;
$vmm =~ s|([^/]*)$||;
$me = $1;
sub usage
{
print STDERR <<USAGE;
Usage: $me [-d] [-p distdir] [vcs_home]
Move the VMM source distribution that contains this script
onto a VCS installation.
If a VCS installation is not explicitly defined, \$VCS_HOME is used.
If the -p option is used, the specified directory is used as VMM
source distribution instead of the directory where this script is
found.
The '-d' option displays the command that would normally be executed
during the patching process but does not execute them.
USAGE
exit(1);
}
#
# Parse the command-line options
#
require "getopts.pl";
&usage if !&Getopts("dhp:") || $opt_h;
$vmm = $opt_p if $opt_p;
$vcs = shift(@ARGV);
$vcs = $ENV{'VCS_HOME'} unless $vcs;
&usage() unless $vcs;
$| = 1;
# Make sure the VMM patch area is a valid one
if (! -e "$vmm/sv/std_lib/vmm.sv") {
print STDERR "ERROR: Cannot patch from \"$vmm\": Not a VMM patch distribution\n";
exit(-1);
}
# Make sure VCS_HOME exists
if (! -e "$vcs/etc/rvm/vmm.sv") {
print STDERR "ERROR: Cannot patch \"$vcs\": Not a suitable VCS installation\n";
exit(-1);
}
# Make sure VCS_HOME is writeable!
if (! -w "$vcs/etc") {
print STDERR "ERROR: Cannot patch \"$vcs\": No write permission\n";
exit(-1) unless $opt_d;
}
print "\nPatching the VCS installation located at \"$vcs\"\n";
print "with the VMM OpenSource distribution located at \"$vmm\"\n\n";
# Check if the patch contains SvOv interop code
$interop = system("grep -q VMM_OV_INTEROP $vmm/sv/std_lib/vmm.sv");
if ($interop) {
print "\033[41m";
print "******************** WARNING *********************\n";
print "This will disable RVM-OV/VMM-SV interoperability!!\n";
print "******************** WARNING *********************";
print "\033[0m\n\n";
}
if ($opt_d) {
print "<DEBUG : WILL NOT PATCH> Proceed (y/n) ? [n] ";
} else {
print "Proceed (y/n) ? [n] ";
}
$answer = <STDIN>;
if ($answer !~ m/^\s*[yY]/) {
print "Patching operation ABORTED.\n";
exit(1);
}
print "Patching...\n";
($sec, $min, $hour, $mday, $mon, $year, $junk) = localtime($^T);
$stamp = sprintf("%4d.%02d.%02d.%02d.%02d.%02d",
$year+1900, $mon, $mday, $hour, $min, $sec);
sub patch {
print "$cmd\n";
return if $opt_d;
$rc = system($cmd);
if ($rc) {
print STDERR "Error while executing \"$cmd\": $!\n";
print STDERR "Patching aborted.\n\n";
print STDERR "** WARNING ** Your VCS installation may be corrupted!\n\n";
exit($rc);
}
}
$cmd = "echo \"Patched on $stamp from $vmm\" >$vcs/VMM_PATCHED.$stamp";
&patch;
$cmd = "mv $vcs/etc/rvm $vcs/etc/rvm.$stamp";
&patch;
$cmd = "mkdir $vcs/etc/rvm";
&patch;
@bins = ();
foreach $bin (<$vmm/shared/bin/*/ralgen>) {
$bin =~ m#([^/]+)/ralgen#;
$bin = $1;
push(@bins, $bin);
}
%os = ();
foreach $bin (@bins) {
next if (! -e "$vcs/$bin");
$os{$bin} = 1;
$cmd = "cp $vcs/$bin/bin/ralgen.binary $vcs/etc/rvm.$stamp/ralgen.$bin";
&patch;
$cmd = "chmod u+w $vcs/$bin/bin/ralgen.binary";
&patch;
$cmd = "cp $vmm/shared/bin/$bin/ralgen $vcs/$bin/bin/ralgen.binary";
&patch;
}
@not_os = ();
foreach $bin (<$vcs/*/bin/ralgen.binary>) {
$bin =~ m#([^/]+)/bin/ralgen#;
$bin = $1;
if (!$os{$bin}) {
push(@not_os, $bin);
}
}
$cmd = "cp $vcs/bin/vmmgen $vcs/etc/rvm.$stamp/vmmgen";
&patch;
$cmd = "chmod u+w $vcs/bin/vmmgen $vcs/bin/rvmgen";
&patch;
$cmd = "cp $vmm/shared/bin/vmmgen $vcs/bin/vmmgen";
&patch;
$cmd = "cp $vmm/shared/bin/vmmgen $vcs/bin/rvmgen";
&patch;
$cmd = "mkdir $vcs/etc/rvm/shared";
&patch;
$cmd = "cp -r $vmm/shared/lib $vcs/etc/rvm/shared";
&patch;
$cmd = "cp -r $vmm/shared/src $vcs/etc/rvm/shared";
&patch;
$cmd = "cp -r $vmm/sv/* $vcs/etc/rvm";
&patch;
$cmd = "sed -e s/vmm_std_lib/_vcs_vmm/ <$vmm/sv/std_lib/vmm.sv >$vcs/etc/rvm/std_lib/vmm.sv";
&patch;
$cmd = "mkdir $vcs/etc/rvm/sv";
&patch;
$cmd = "mkdir $vcs/etc/rvm/sv/RAL";
&patch;
$cmd = "ln -s ../../RAL/tests $vcs/etc/rvm/sv/RAL";
&patch;
# Bring back the OV stuff
$cmd = "cp $vcs/etc/rvm.$stamp/*.vrp $vcs/etc/rvm";
&patch;
$cmd = "cp -r $vcs/etc/rvm.$stamp/ov $vcs/etc/rvm";
&patch;
$cmd = "cp -r $vcs/etc/rvm.$stamp/shared/lib/templates/*.vr $vcs/etc/rvm/shared/lib/templates";
&patch;
$cmd = "cp -r $vcs/etc/rvm.$stamp/shared/lib/templates/ov.* $vcs/etc/rvm/shared/lib/templates";
&patch;
if (@not_os) {
print STDERR "\n\033[43m";
print STDERR "******************** WARNING *********************\n";
print STDERR "'ralgen' was not patched for the following OS:\n";
foreach $os (@not_os) {
print STDERR " $os\n";
}
print STDERR "******************** WARNING *********************";
print STDERR "\033[0m\n\n";
}
if (%os) {
print STDERR "\n\033[42m";
print STDERR "'ralgen' was patched for the following OS:\n";
foreach $os (keys(%os)) {
print STDERR " $os\n";
}
print STDERR "\033[0m\n\n";
} else {
print STDERR "\n\033[41m";
print STDERR "******************** WARNING *********************\n";
print STDERR "'ralgen' was not patched!!\n";
print STDERR "******************** WARNING *********************";
print STDERR "\033[0m\n\n";
}
print STDERR "\033[42m";
print STDERR "The VMM library and applications were patched for all OS\n";
print STDERR "because they are OS-independent\n";
print STDERR "\033[0m\n\n";
print STDERR "Patch completed...\n\n";
exit(0);