add Module::Build 0.27_08
[p5sagit/p5-mst-13.2.git] / lib / Module / Build / ConfigData.pm
1 package Module::Build::ConfigData;
2 use strict;
3 my $arrayref = eval do {local $/; <DATA>}
4   or die "Couldn't load ConfigData data: $@";
5 close DATA;
6 my ($config, $features, $auto_features) = @$arrayref;
7
8 sub config { $config->{$_[1]} }
9
10 sub set_config { $config->{$_[1]} = $_[2] }
11 sub set_feature { $features->{$_[1]} = 0+!!$_[2] }  # Constrain to 1 or 0
12
13 sub auto_feature_names { grep !exists $features->{$_}, keys %$auto_features }
14
15 sub feature_names {
16   my @features = (keys %$features, auto_feature_names());
17   @features;
18 }
19
20 sub config_names  { keys %$config }
21
22 sub write {
23   my $me = __FILE__;
24   require IO::File;
25   require Data::Dumper;
26
27   my $mode_orig = (stat $me)[2] & 07777;
28   chmod($mode_orig | 0222, $me); # Make it writeable
29   my $fh = IO::File->new($me, 'r+') or die "Can't rewrite $me: $!";
30   seek($fh, 0, 0);
31   while (<$fh>) {
32     last if /^__DATA__$/;
33   }
34   die "Couldn't find __DATA__ token in $me" if eof($fh);
35
36   local $Data::Dumper::Terse = 1;
37   seek($fh, tell($fh), 0);
38   $fh->print( Data::Dumper::Dumper([$config, $features, $auto_features]) );
39   truncate($fh, tell($fh));
40   $fh->close;
41
42   chmod($mode_orig, $me)
43     or warn "Couldn't restore permissions on $me: $!";
44 }
45
46 sub feature {
47   my ($package, $key) = @_;
48   return $features->{$key} if exists $features->{$key};
49   
50   my $info = $auto_features->{$key} or return 0;
51   
52   # Under perl 5.005, each(%$foo) isn't working correctly when $foo
53   # was reanimated with Data::Dumper and eval().  Not sure why, but
54   # copying to a new hash seems to solve it.
55   my %info = %$info;
56   
57   require Module::Build;  # XXX should get rid of this
58   while (my ($type, $prereqs) = each %info) {
59     next if $type eq 'description' || $type eq 'recommends';
60     
61     my %p = %$prereqs;  # Ditto here.
62     while (my ($modname, $spec) = each %p) {
63       my $status = Module::Build->check_installed_status($modname, $spec);
64       if ((!$status->{ok}) xor ($type =~ /conflicts$/)) { return 0; }
65     }
66   }
67   return 1;
68 }
69
70
71 =head1 NAME
72
73 Module::Build::ConfigData - Configuration for Module::Build
74
75
76 =head1 SYNOPSIS
77
78   use Module::Build::ConfigData;
79   $value = Module::Build::ConfigData->config('foo');
80   $value = Module::Build::ConfigData->feature('bar');
81   
82   @names = Module::Build::ConfigData->config_names;
83   @names = Module::Build::ConfigData->feature_names;
84   
85   Module::Build::ConfigData->set_config(foo => $new_value);
86   Module::Build::ConfigData->set_feature(bar => $new_value);
87   Module::Build::ConfigData->write;  # Save changes
88
89
90 =head1 DESCRIPTION
91
92 This module holds the configuration data for the C<Module::Build>
93 module.  It also provides a programmatic interface for getting or
94 setting that configuration data.  Note that in order to actually make
95 changes, you'll have to have write access to the C<Module::Build::ConfigData>
96 module, and you should attempt to understand the repercussions of your
97 actions.
98
99
100 =head1 METHODS
101
102 =over 4
103
104 =item config($name)
105
106 Given a string argument, returns the value of the configuration item
107 by that name, or C<undef> if no such item exists.
108
109 =item feature($name)
110
111 Given a string argument, returns the value of the feature by that
112 name, or C<undef> if no such feature exists.
113
114 =item set_config($name, $value)
115
116 Sets the configuration item with the given name to the given value.
117 The value may be any Perl scalar that will serialize correctly using
118 C<Data::Dumper>.  This includes references, objects (usually), and
119 complex data structures.  It probably does not include transient
120 things like filehandles or sockets.
121
122 =item set_feature($name, $value)
123
124 Sets the feature with the given name to the given boolean value.  The
125 value will be converted to 0 or 1 automatically.
126
127 =item config_names()
128
129 Returns a list of all the names of config items currently defined in
130 C<Module::Build::ConfigData>, or in scalar context the number of items.
131
132 =item feature_names()
133
134 Returns a list of all the names of features currently defined in
135 C<Module::Build::ConfigData>, or in scalar context the number of features.
136
137 =item auto_feature_names()
138
139 Returns a list of all the names of features whose availability is
140 dynamically determined, or in scalar context the number of such
141 features.  Does not include such features that have later been set to
142 a fixed value.
143
144 =item write()
145
146 Commits any changes from C<set_config()> and C<set_feature()> to disk.
147 Requires write access to the C<Module::Build::ConfigData> module.
148
149 =back
150
151
152 =head1 AUTHOR
153
154 C<Module::Build::ConfigData> was automatically created using C<Module::Build>.
155 C<Module::Build> was written by Ken Williams, but he holds no
156 authorship claim or copyright claim to the contents of C<Module::Build::ConfigData>.
157
158 =cut
159
160 __DATA__
161
162 [
163           {},
164           {},
165           {
166             'YAML_support' => {
167                                 'requires' => {
168                                                 'YAML' => ' >= 0.35, != 0.49_01 '
169                                               },
170                                 'description' => 'Can write fully-functional META.yml files'
171                               },
172             'manpage_support' => {
173                                    'requires' => {
174                                                    'Pod::Man' => 0
175                                                  },
176                                    'description' => 'Can create Unix man pages'
177                                  },
178             'C_support' => {
179                              'requires' => {
180                                              'ExtUtils::CBuilder' => '0.15'
181                                            },
182                              'recommends' => {
183                                                'ExtUtils::ParseXS' => '1.02'
184                                              },
185                              'description' => 'Can compile/link C & XS code'
186                            },
187             'HTML_support' => {
188                                 'requires' => {
189                                                 'Pod::Html' => 0
190                                               },
191                                 'description' => 'Can create HTML documentation'
192                               }
193           }
194         ]