ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/staticperl/perl/lib/ExtUtils/Command.pm
Revision: 1.1
Committed: Thu Jun 30 14:27:10 2005 UTC (21 years, 3 months ago) by root
Branch: MAIN
CVS Tags: PERL-5-8-7, HEAD
Branch point for: PERL
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 package ExtUtils::Command;
2    
3     use 5.00503;
4     use strict;
5     use Carp;
6     use File::Copy;
7     use File::Compare;
8     use File::Basename;
9     use File::Path qw(rmtree);
10     require Exporter;
11     use vars qw(@ISA @EXPORT $VERSION);
12     @ISA = qw(Exporter);
13     @EXPORT = qw(cp rm_f rm_rf mv cat eqtime mkpath touch test_f);
14     $VERSION = '1.05';
15    
16     my $Is_VMS = $^O eq 'VMS';
17    
18     =head1 NAME
19    
20     ExtUtils::Command - utilities to replace common UNIX commands in Makefiles etc.
21    
22     =head1 SYNOPSIS
23    
24     perl -MExtUtils::Command -e cat files... > destination
25     perl -MExtUtils::Command -e mv source... destination
26     perl -MExtUtils::Command -e cp source... destination
27     perl -MExtUtils::Command -e touch files...
28     perl -MExtUtils::Command -e rm_f files...
29     perl -MExtUtils::Command -e rm_rf directories...
30     perl -MExtUtils::Command -e mkpath directories...
31     perl -MExtUtils::Command -e eqtime source destination
32     perl -MExtUtils::Command -e test_f file
33     perl -MExtUtils::Command=chmod -e chmod mode files...
34    
35     =head1 DESCRIPTION
36    
37     The module is used to replace common UNIX commands. In all cases the
38     functions work from @ARGV rather than taking arguments. This makes
39     them easier to deal with in Makefiles.
40    
41     perl -MExtUtils::Command -e some_command some files to work on
42    
43     I<NOT>
44    
45     perl -MExtUtils::Command -e 'some_command qw(some files to work on)'
46    
47     Filenames with * and ? will be glob expanded.
48    
49     =over 4
50    
51     =cut
52    
53     # VMS uses % instead of ? to mean "one character"
54     my $wild_regex = $Is_VMS ? '*%' : '*?';
55     sub expand_wildcards
56     {
57     @ARGV = map(/[$wild_regex]/o ? glob($_) : $_,@ARGV);
58     }
59    
60    
61     =item cat
62    
63     Concatenates all files mentioned on command line to STDOUT.
64    
65     =cut
66    
67     sub cat ()
68     {
69     expand_wildcards();
70     print while (<>);
71     }
72    
73     =item eqtime src dst
74    
75     Sets modified time of dst to that of src
76    
77     =cut
78    
79     sub eqtime
80     {
81     my ($src,$dst) = @ARGV;
82     local @ARGV = ($dst); touch(); # in case $dst doesn't exist
83     utime((stat($src))[8,9],$dst);
84     }
85    
86     =item rm_rf files....
87    
88     Removes directories - recursively (even if readonly)
89    
90     =cut
91    
92     sub rm_rf
93     {
94     expand_wildcards();
95     rmtree([grep -e $_,@ARGV],0,0);
96     }
97    
98     =item rm_f files....
99    
100     Removes files (even if readonly)
101    
102     =cut
103    
104     sub rm_f
105     {
106     expand_wildcards();
107     foreach (@ARGV)
108     {
109     next unless -f $_;
110     next if unlink($_);
111     chmod(0777,$_);
112     next if unlink($_);
113     carp "Cannot delete $_:$!";
114     }
115     }
116    
117     =item touch files ...
118    
119     Makes files exist, with current timestamp
120    
121     =cut
122    
123     sub touch {
124     my $t = time;
125     expand_wildcards();
126     foreach my $file (@ARGV) {
127     open(FILE,">>$file") || die "Cannot write $file:$!";
128     close(FILE);
129     utime($t,$t,$file);
130     }
131     }
132    
133     =item mv source... destination
134    
135     Moves source to destination.
136     Multiple sources are allowed if destination is an existing directory.
137    
138     =cut
139    
140     sub mv {
141     my $dst = pop(@ARGV);
142     expand_wildcards();
143     croak("Too many arguments") if (@ARGV > 1 && ! -d $dst);
144     foreach my $src (@ARGV) {
145     move($src,$dst);
146     }
147     }
148    
149     =item cp source... destination
150    
151     Copies source to destination.
152     Multiple sources are allowed if destination is an existing directory.
153    
154     =cut
155    
156     sub cp {
157     my $dst = pop(@ARGV);
158     expand_wildcards();
159     croak("Too many arguments") if (@ARGV > 1 && ! -d $dst);
160     foreach my $src (@ARGV) {
161     copy($src,$dst);
162     }
163     }
164    
165     =item chmod mode files...
166    
167     Sets UNIX like permissions 'mode' on all the files. e.g. 0666
168    
169     =cut
170    
171     sub chmod {
172     my $mode = shift(@ARGV);
173     expand_wildcards();
174     chmod(oct $mode,@ARGV) || die "Cannot chmod ".join(' ',$mode,@ARGV).":$!";
175     }
176    
177     =item mkpath directory...
178    
179     Creates directory, including any parent directories.
180    
181     =cut
182    
183     sub mkpath
184     {
185     expand_wildcards();
186     File::Path::mkpath([@ARGV],0,0777);
187     }
188    
189     =item test_f file
190    
191     Tests if a file exists
192    
193     =cut
194    
195     sub test_f
196     {
197     exit !-f shift(@ARGV);
198     }
199    
200    
201     1;
202     __END__
203    
204     =back
205    
206     =head1 BUGS
207    
208     Should probably be Auto/Self loaded.
209    
210     =head1 SEE ALSO
211    
212     ExtUtils::MakeMaker, ExtUtils::MM_Unix, ExtUtils::MM_Win32
213    
214     =head1 AUTHOR
215    
216     Nick Ing-Simmons <F<nick@ni-s.u-net.com>>.
217    
218     =cut
219