1 package ExtUtils::Installed;
6 use ExtUtils::Packlist;
7 use ExtUtils::MakeMaker;
13 my $Is_VMS = $^O eq 'VMS';
14 my $DOSISH = ($^O =~ /^(MSWin\d\d|os2|dos|mint)$/);
16 require VMS::Filespec if $Is_VMS;
18 use vars qw($VERSION);
22 my ($self, $path, $prefix) = @_;
23 return unless defined $prefix && defined $path;
26 $prefix = VMS::Filespec::unixify($prefix);
27 $path = VMS::Filespec::unixify($path);
29 return 1 if substr($path, 0, length($prefix)) eq $prefix;
34 return 1 if $path =~ m{^\Q$prefix\E}i;
40 my ($self, $path) = @_;
41 my $man1dir = $Config{man1direxp};
42 my $man3dir = $Config{man3direxp};
43 return(($man1dir && $self->_is_prefix($path, $man1dir))
45 ($man3dir && $self->_is_prefix($path, $man3dir))
50 my ($self, $path, $type) = @_;
51 return 1 if $type eq "all";
53 return($self->_is_doc($path)) if $type eq "doc";
55 if ($type eq "prog") {
56 return($self->_is_prefix($path, $Config{prefix} || $Config{prefixexp})
58 !($self->_is_doc($path))
65 my ($self, $path, @under) = @_;
66 $under[0] = "" if (! @under);
67 foreach my $dir (@under) {
68 return(1) if ($self->_is_prefix($path, $dir));
76 $class = ref($class) || $class;
79 my $archlib = $Config{archlibexp};
80 my $sitearch = $Config{sitearchexp};
82 # File::Find does not know how to deal with VMS filepaths.
84 $archlib = VMS::Filespec::unixify($archlib);
85 $sitearch = VMS::Filespec::unixify($sitearch);
90 $sitearch =~ s|\\|/|g;
93 # Read the core packlist
94 $self->{Perl}{packlist} =
95 ExtUtils::Packlist->new( File::Spec->catfile($archlib, '.packlist') );
96 $self->{Perl}{version} = $Config{version};
98 # Read the module packlists
100 # Only process module .packlists
101 return if $_ ne ".packlist" || $File::Find::dir eq $archlib;
103 # Hack of the leading bits of the paths & convert to a module name
104 my $module = $File::Find::name;
106 $module =~ s!\Q$archlib\E/?auto/(.*)/.packlist!$1!s or
107 $module =~ s!\Q$sitearch\E/?auto/(.*)/.packlist!$1!s;
108 my $modfile = "$module.pm";
111 # Find the top-level module file in @INC
112 $self->{$module}{version} = '';
113 foreach my $dir (@INC) {
114 my $p = File::Spec->catfile($dir, $modfile);
116 $module = _module_name($p, $module) if $Is_VMS;
118 require ExtUtils::MM;
119 $self->{$module}{version} = MM->parse_version($p);
125 $self->{$module}{packlist} =
126 ExtUtils::Packlist->new($File::Find::name);
129 my(@dirs) = grep { -e } ($archlib, $sitearch);
130 find($sub, @dirs) if @dirs;
132 return(bless($self, $class));
135 # VMS's non-case preserving file-system means the package name can't
136 # be reconstructed from the filename.
138 my($file, $orig_module) = @_;
141 if (open PACKFH, $file) {
143 if (/package\s+(\S+)\s*;/) {
145 # Make a sanity check, that lower case $module
146 # is identical to lowercase $pack before
148 if (lc($pack) eq lc($orig_module)) {
157 print STDERR "Couldn't figure out the package name for $file\n"
168 # Bug/feature of sort in scalar context requires this.
169 return wantarray ? sort keys %$self : keys %$self;
173 my ($self, $module, $type, @under) = @_;
176 Carp::croak("$module is not installed") if (! exists($self->{$module}));
177 $type = "all" if (! defined($type));
178 Carp::croak('type must be "all", "prog" or "doc"')
179 if ($type ne "all" && $type ne "prog" && $type ne "doc");
182 foreach my $file (keys(%{$self->{$module}{packlist}})) {
184 if ($self->_is_type($file, $type) &&
185 $self->_is_under($file, @under));
191 my ($self, $module, $type, @under) = @_;
193 foreach my $file ($self->files($module, $type, @under)) {
194 $dirs{dirname($file)}++;
196 return sort keys %dirs;
200 my ($self, $module, $type, @under) = @_;
202 foreach my $dir ($self->directories($module, $type, @under)) {
205 while ($last ne $dir) {
207 $dir = dirname($dir);
208 last if !$self->_is_under($dir, @under);
212 return(sort(keys(%dirs)));
216 my ($self, $module, $remove) = @_;
217 Carp::croak("$module is not installed") if (! exists($self->{$module}));
218 return($self->{$module}{packlist}->validate($remove));
222 my ($self, $module) = @_;
223 Carp::croak("$module is not installed") if (! exists($self->{$module}));
224 return($self->{$module}{packlist});
228 my ($self, $module) = @_;
229 Carp::croak("$module is not installed") if (! exists($self->{$module}));
230 return($self->{$module}{version});
240 ExtUtils::Installed - Inventory management of installed modules
244 use ExtUtils::Installed;
245 my ($inst) = ExtUtils::Installed->new();
246 my (@modules) = $inst->modules();
247 my (@missing) = $inst->validate("DBI");
248 my $all_files = $inst->files("DBI");
249 my $files_below_usr_local = $inst->files("DBI", "all", "/usr/local");
250 my $all_dirs = $inst->directories("DBI");
251 my $dirs_below_usr_local = $inst->directory_tree("DBI", "prog");
252 my $packlist = $inst->packlist("DBI");
256 ExtUtils::Installed provides a standard way to find out what core and module
257 files have been installed. It uses the information stored in .packlist files
258 created during installation to provide this information. In addition it
259 provides facilities to classify the installed files and to extract directory
260 information from the .packlist files.
264 The new() function searches for all the installed .packlists on the system, and
265 stores their contents. The .packlists can be queried with the functions
274 This takes no parameters, and searches for all the installed .packlists on the
275 system. The packlists are read using the ExtUtils::packlist module.
279 This returns a list of the names of all the installed modules. The perl 'core'
280 is given the special name 'Perl'.
284 This takes one mandatory parameter, the name of a module. It returns a list of
285 all the filenames from the package. To obtain a list of core perl files, use
286 the module name 'Perl'. Additional parameters are allowed. The first is one
287 of the strings "prog", "doc" or "all", to select either just program files,
288 just manual files or all files. The remaining parameters are a list of
289 directories. The filenames returned will be restricted to those under the
290 specified directories.
294 This takes one mandatory parameter, the name of a module. It returns a list of
295 all the directories from the package. Additional parameters are allowed. The
296 first is one of the strings "prog", "doc" or "all", to select either just
297 program directories, just manual directories or all directories. The remaining
298 parameters are a list of directories. The directories returned will be
299 restricted to those under the specified directories. This method returns only
300 the leaf directories that contain files from the specified module.
302 =item directory_tree()
304 This is identical in operation to directories(), except that it includes all the
305 intermediate directories back up to the specified directories.
309 This takes one mandatory parameter, the name of a module. It checks that all
310 the files listed in the modules .packlist actually exist, and returns a list of
311 any missing files. If an optional second argument which evaluates to true is
312 given any missing files will be removed from the .packlist
316 This returns the ExtUtils::Packlist object for the specified module.
320 This returns the version number for the specified module.
326 See the example in L<ExtUtils::Packlist>.
330 Alan Burlison <Alan.Burlison@uk.sun.com>