1 package ExtUtils::Installed;
6 use ExtUtils::Packlist;
7 use ExtUtils::MakeMaker;
12 require VMS::Filespec if $^O eq 'VMS';
14 use vars qw($VERSION);
17 my $DOSISH = ($^O =~ /^(MSWin\d\d|os2|dos|mint)$/);
20 my ($self, $path, $prefix) = @_;
21 return unless defined $prefix && defined $path;
24 $prefix = VMS::Filespec::unixify($prefix);
25 $path = VMS::Filespec::unixify($path);
27 return 1 if substr($path, 0, length($prefix)) eq $prefix;
32 return 1 if $path =~ m{^\Q$prefix\E}i;
38 my ($self, $path) = @_;
39 my $man1dir = $Config{man1direxp};
40 my $man3dir = $Config{man3direxp};
41 return(($man1dir && $self->_is_prefix($path, $man1dir))
43 ($man3dir && $self->_is_prefix($path, $man3dir))
48 my ($self, $path, $type) = @_;
49 return 1 if $type eq "all";
51 return($self->_is_doc($path)) if $type eq "doc";
53 if ($type eq "prog") {
54 return($self->_is_prefix($path, $Config{prefix} || $Config{prefixexp})
56 !($self->_is_doc($path))
63 my ($self, $path, @under) = @_;
64 $under[0] = "" if (! @under);
65 foreach my $dir (@under) {
66 return(1) if ($self->_is_prefix($path, $dir));
74 $class = ref($class) || $class;
77 my $archlib = $Config{archlibexp};
78 my $sitearch = $Config{sitearchexp};
80 # File::Find does not know how to deal with VMS filepaths.
82 $archlib = VMS::Filespec::unixify($archlib);
83 $sitearch = VMS::Filespec::unixify($sitearch);
88 $sitearch =~ s|\\|/|g;
91 # Read the core packlist
92 $self->{Perl}{packlist} =
93 ExtUtils::Packlist->new( File::Spec->catfile($archlib, '.packlist') );
94 $self->{Perl}{version} = $Config{version};
96 # Read the module packlists
98 # Only process module .packlists
99 return if ($_) ne ".packlist" || $File::Find::dir eq $archlib;
101 # Hack of the leading bits of the paths & convert to a module name
102 my $module = $File::Find::name;
104 $module =~ s!\Q$archlib\E/?auto/(.*)/.packlist!$1!s or
105 $module =~ s!\Q$sitearch\E/?auto/(.*)/.packlist!$1!s;
106 my $modfile = "$module.pm";
109 # Find the top-level module file in @INC
110 $self->{$module}{version} = '';
111 foreach my $dir (@INC) {
112 my $p = File::Spec->catfile($dir, $modfile);
114 require ExtUtils::MM;
115 $self->{$module}{version} = MM->parse_version($p);
121 $self->{$module}{packlist} =
122 ExtUtils::Packlist->new($File::Find::name);
125 my(@dirs) = grep { -e } ($archlib, $sitearch);
126 find($sub, @dirs) if @dirs;
128 return(bless($self, $class));
133 return sort keys %$self;
137 my ($self, $module, $type, @under) = @_;
140 Carp::croak("$module is not installed") if (! exists($self->{$module}));
141 $type = "all" if (! defined($type));
142 Carp::croak('type must be "all", "prog" or "doc"')
143 if ($type ne "all" && $type ne "prog" && $type ne "doc");
146 foreach my $file (keys(%{$self->{$module}{packlist}})) {
148 if ($self->_is_type($file, $type) &&
149 $self->_is_under($file, @under));
155 my ($self, $module, $type, @under) = @_;
157 foreach my $file ($self->files($module, $type, @under)) {
158 $dirs{dirname($file)}++;
160 return sort keys %dirs;
164 my ($self, $module, $type, @under) = @_;
166 foreach my $dir ($self->directories($module, $type, @under)) {
169 while ($last ne $dir) {
171 $dir = dirname($dir);
172 last if !$self->_is_under($dir, @under);
176 return(sort(keys(%dirs)));
180 my ($self, $module, $remove) = @_;
181 Carp::croak("$module is not installed") if (! exists($self->{$module}));
182 return($self->{$module}{packlist}->validate($remove));
186 my ($self, $module) = @_;
187 Carp::croak("$module is not installed") if (! exists($self->{$module}));
188 return($self->{$module}{packlist});
192 my ($self, $module) = @_;
193 Carp::croak("$module is not installed") if (! exists($self->{$module}));
194 return($self->{$module}{version});
204 ExtUtils::Installed - Inventory management of installed modules
208 use ExtUtils::Installed;
209 my ($inst) = ExtUtils::Installed->new();
210 my (@modules) = $inst->modules();
211 my (@missing) = $inst->validate("DBI");
212 my $all_files = $inst->files("DBI");
213 my $files_below_usr_local = $inst->files("DBI", "all", "/usr/local");
214 my $all_dirs = $inst->directories("DBI");
215 my $dirs_below_usr_local = $inst->directory_tree("DBI", "prog");
216 my $packlist = $inst->packlist("DBI");
220 ExtUtils::Installed provides a standard way to find out what core and module
221 files have been installed. It uses the information stored in .packlist files
222 created during installation to provide this information. In addition it
223 provides facilities to classify the installed files and to extract directory
224 information from the .packlist files.
228 The new() function searches for all the installed .packlists on the system, and
229 stores their contents. The .packlists can be queried with the functions
238 This takes no parameters, and searches for all the installed .packlists on the
239 system. The packlists are read using the ExtUtils::packlist module.
243 This returns a list of the names of all the installed modules. The perl 'core'
244 is given the special name 'Perl'.
248 This takes one mandatory parameter, the name of a module. It returns a list of
249 all the filenames from the package. To obtain a list of core perl files, use
250 the module name 'Perl'. Additional parameters are allowed. The first is one
251 of the strings "prog", "doc" or "all", to select either just program files,
252 just manual files or all files. The remaining parameters are a list of
253 directories. The filenames returned will be restricted to those under the
254 specified directories.
258 This takes one mandatory parameter, the name of a module. It returns a list of
259 all the directories from the package. Additional parameters are allowed. The
260 first is one of the strings "prog", "doc" or "all", to select either just
261 program directories, just manual directories or all directories. The remaining
262 parameters are a list of directories. The directories returned will be
263 restricted to those under the specified directories. This method returns only
264 the leaf directories that contain files from the specified module.
266 =item directory_tree()
268 This is identical in operation to directories(), except that it includes all the
269 intermediate directories back up to the specified directories.
273 This takes one mandatory parameter, the name of a module. It checks that all
274 the files listed in the modules .packlist actually exist, and returns a list of
275 any missing files. If an optional second argument which evaluates to true is
276 given any missing files will be removed from the .packlist
280 This returns the ExtUtils::Packlist object for the specified module.
284 This returns the version number for the specified module.
290 See the example in L<ExtUtils::Packlist>.
294 Alan Burlison <Alan.Burlison@uk.sun.com>