package Grid::GPT::MatchNode; use strict; use Carp; require Exporter; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS %binary_dependencies); use Data::Dumper; require Grid::GPT::BaseNode; require Grid::GPT::DepIndexes; use Grid::GPT::V1::Version; use Grid::GPT::V1::BinaryDependency; use Grid::GPT::V1::SourceDependency; # set the version for version checking $VERSION = 0.01; @ISA = qw(Exporter Grid::GPT::BaseNode); my %depenv2deptypes = ( Setup => ['Setup'], BuildStatic => ['Compile', 'Build_Link'], Build => ['Compile', 'Build_Link', 'Runtime_Link'], BuildandSetup => ['Compile', 'Build_Link', 'Runtime_Link', 'Setup'], BuildStaticandSetup => ['Compile', 'Build_Link', 'Setup'], RuntimeStatic => ['Runtime'], Runtime => ['Runtime','Runtime_Link'], RuntimeandSetup => ['Runtime','Runtime_Link', 'Setup'], RuntimeStaticandSetup => ['Runtime','Setup'], ); my %bin2srcdeptypes = ( 'Compile' => ['compile'], 'Runtime_Link' => ['pgm_link','lib_link'], 'Build_Link' => ['pgm_link','lib_link'], 'Runtime' => ['data_runtime', 'doc_runtime', 'lib_runtime', 'pgm_runtime' ], 'Setup' => ['Setup'], ); sub _init { my ($me, %args) = @_; $me->{'frompkg'} = $args{'frompkg'}; $me->{'topkg'} = $args{'topkg'}; $me->{'dep'} = $args{'dep'}; $me->{'dups'} = $args{'dups'}; $me->_add_deptype(defined $args{'deptype'} ? $args{'deptype'} : $me->{'dep'}->deptype()); $me->_add_pkgname(defined $args{'pkgname'} ? $args{'pkgname'} : $me->{'dep'}->pkgname()); $me->_add_flavor(defined $args{'flavor'} ? $args{'flavor'} : $me->{'dep'}->flavor()); $me->_add_pkgtype(defined $args{'pkgtype'} ? $args{'pkgtype'} : $me->{'dep'}->pkgtype()); } sub is_same { my ($me, $other) = @_; return 0 if ! $me->{'frompkg'}->is_same($other->{'frompkg'}); return 0 if ! $me->{'dep'}->is_same($other->{'dep'}); $me->{'topkg'}->is_same($other->{'topkg'}); } sub printnode { my($me, %args) = @_; my $pretty = defined $args{'to'} ? 'to' : undef; $pretty = defined $args{'from'} ? 'from' : $pretty; if (defined $pretty) { if (defined $args{'html'}) { print $me->{"$ {pretty}pkg"}->label(href=>1), "
\n"; if (defined $args{'to'}) { for my $m (@{$me->{'dups'}}) { print $m->label(href=>1), "
\n"; print "
\n"; } } } else { print $me->{"$ {pretty}pkg"}->label(), "\n"; if (defined $args{'to'}) { for my $m (@{$me->{'dups'}}) { print $m->label(), "\n"; } } } return; } print "/from=",$me->{'frompkg'}->label(); print "/dep=",$me->{'dep'}->label(); print "/to=",$me->{'topkg'}->label(),"/tag="; $me->Grid::GPT::BaseNode::printnode(); } sub formnode { my($me, %args) = @_; my $msg = "/from=" . $me->{'frompkg'}->label(); $msg .= "/dep=" . $me->{'dep'}->label(); $msg .= "/to=" . $me->{'topkg'}->label() . "/tag="; $msg .= $me->Grid::GPT::BaseNode::label(); return $msg; } sub AUTOLOAD { use vars qw($AUTOLOAD); my $self = shift; my $type = ref($self) || croak "$self is not an obj"; my $name = $AUTOLOAD; $name =~ s/.*://; # strip fully-qualified portion unless (exists $self->{$name} ) { croak "Can't access `$name' field in obj of class $type"; } if (@_) { return $self->{$name} = shift; } else { return $self->{$name}; } } sub DESTROY {} END { } # module clean-up code here (global destructor) 1; __END__ # Below is the stub of documentation for your module. You better edit it! =head1 NAME Grid::GPT::DepNode - Perl extension for managing the dependencies in binary packages =head1 SYNOPSIS use Grid::GPT::DepNode; my $dep = new Grid::GPT::DepNode(versions => \@versions, name => $name, type => $type, pkg_type => $pkg_type, my_pkg_type => $my_pkg_type); my $result = $dep->fulfills_dependency($name, $version, $pkg_type); =head1 DESCRIPTION I is used to encapsulate a dependency that one binary package has to another dependency. These dependencies are seperated into the following types: =over 4 =item Compile Dependency occurs when the package is used for compiling. Usually caused by header files including headers from other packages. =item Build_Link Dependency occurs when the package is linked to other applications. This commonly known as dependent libraries. =item Regeneration Dependency occurs when a statically built package needs to be rebuilt because of updates to dependent packages. This results in a new binary package even though nothing inside the package has changed and the version number has not been updated. =item Runtime_Link Dependency occurs when a package needs to load another package's binary at run-time. =item Runtime Dependency occurs when a package needs to read a file or execute a program from another package. =back =head1 Methods =over 4 =item new Create a new I obj. The function has the following named objs: =over 4 =item versions Reference to an array of L objs. =item name Name of the dependent package. =item type The type of dependency. =item pkg_type The binary package type of the dependent package. =item my_pkg_type The binary package type of the package owning this dependency. =back =item fulfills_dependency(name, version, pkg_type) Returns a 1 if the arguments met the requirements of the dependency. Returns a 0 if not. Note that package types pgm and pgm_static are considered equivalent. =item write_tag(xml_obj) Adds dependency contents into an L obj. =item convert_dependency_hash2xml(dependency_hash_reference, xml_obj) Class function which adds the contents of all dependency objs in a hash reference to an L obj. =item create_dependency_hash(xml_obj, package_type_of_dependency_owner) This is a class function which creates a hash of I objs out of an L obj. The key to each hash entry is of the form _. =back =head1 ToDo =over 4 =item The internal validate function has not been tested. =back =head1 AUTHOR Eric Blau Michael Bletzinger =head1 SEE ALSO perl(1) Grid::GPT::XML(1) Grid::GPT::V1::Version(1). =cut