5 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
10 @EXPORT_OK = qw($modules);
12 use vars qw($modules);
16 my $class = ref($proto) || $proto;
18 bless ($self, $class);
20 my $options = \${$self->{OPTIONS}};
21 my $output = \${$self->{OUTPUT}};
22 my $dir2spec_file = \%{$self->{DIR2SPEC_FILE}};
23 my $spec_file2dir = \%{$self->{SPEC_FILE2DIR}};
24 my $spec_file2module = \%{$self->{SPEC_FILE2MODULE}};
29 my $current_dir = shift;
30 my $file_type = shift;
31 my $module_file = shift;
33 $module_file =~ s/^\.\///;
35 my @all_spec_files = map {
37 if(&$file_type($_) eq "winelib") {
42 } split(/\n/, `find $wine_dir -name \\*.spec`);
45 foreach my $file (@all_spec_files) {
46 $all_spec_files{$file}++ ;
49 if($$options->progress) {
50 $$output->progress("modules.dat");
56 open(IN, "< $module_file");
59 s/^\s*?(.*?)\s*$/$1/; # remove whitespace at begining and end of line
60 s/^(.*?)\s*#.*$/$1/; # remove comments
61 /^$/ && next; # skip empty lines
66 if(!-f "$wine_dir/$spec_file") {
67 $$output->write("modules.dat: $spec_file: file ($spec_file) doesn't exist or is no file\n");
70 if($wine_dir eq ".") {
71 $all_spec_files{$spec_file}--;
73 $all_spec_files{"$wine_dir/$spec_file"}--;
75 $$dir2spec_file{""}{$spec_file}++; # FIXME: Kludge
79 $$spec_file2dir{$spec_file}{$allowed_dir}++;
81 $$dir2spec_file{$allowed_dir}{$spec_file}++;
83 if(!-d "$wine_dir/$allowed_dir") {
84 $$output->write("modules.dat: $spec_file: directory ($allowed_dir) doesn't exist or is no directory\n");
89 foreach my $spec_file (sort(keys(%all_spec_files))) {
90 if($all_spec_files{$spec_file} > 0) {
91 $$output->write("modules.dat: $spec_file: exists but is not specified\n");
103 my $module2spec_file = \%{$self->{MODULE2SPEC_FILE}};
105 return sort(keys(%$module2spec_file));
108 sub spec_file_module {
111 my $spec_file2module = \%{$self->{SPEC_FILE2MODULE}};
112 my $module2spec_file = \%{$self->{MODULE2SPEC_FILE}};
114 my $spec_file = shift;
115 $spec_file =~ s/^\.\///;
119 $$spec_file2module{$spec_file} = $module;
120 $$module2spec_file{$module} = $spec_file;
123 sub is_allowed_module_in_file {
126 my $dir2spec_file = \%{$self->{DIR2SPEC_FILE}};
127 my $spec_file2module = \%{$self->{SPEC_FILE2MODULE}};
134 $dir =~ s/\/[^\/]*$//;
136 if($dir =~ m%^include%) {
140 foreach my $spec_file (sort(keys(%{$$dir2spec_file{$dir}}))) {
141 if($$spec_file2module{$spec_file} eq $module) {
149 sub allowed_modules_in_file {
152 my $dir2spec_file = \%{$self->{DIR2SPEC_FILE}};
153 my $spec_file2module = \%{$self->{SPEC_FILE2MODULE}};
159 $dir =~ s/\/[^\/]*$//;
161 my %allowed_modules = ();
162 foreach my $spec_file (sort(keys(%{$$dir2spec_file{$dir}}))) {
163 my $module = $$spec_file2module{$spec_file};
164 $allowed_modules{$module}++;
167 return join(" & ", sort(keys(%allowed_modules)));
170 sub allowed_dirs_for_module {
173 my $module2spec_file = \%{$self->{MODULE2SPEC_FILE}};
174 my $spec_file2dir = \%{$self->{SPEC_FILE2DIR}};
178 my $spec_file = $$module2spec_file{$module};
180 return sort(keys(%{$$spec_file2dir{$spec_file}}));
183 sub allowed_spec_files {
186 my $options = \${$self->{OPTIONS}};
187 my $output = \${$self->{OUTPUT}};
188 my $dir2spec_file = \%{$self->{DIR2SPEC_FILE}};
190 my $wine_dir = shift;
191 my $current_dir = shift;
198 if($current_dir ne ".") {
204 } split(/\n/, `find . -type d ! -name CVS`);
206 my %allowed_spec_files = ();
207 foreach my $dir (sort(@dirs)) {
208 foreach my $spec_file (sort(keys(%{$$dir2spec_file{$dir}}))) {
209 $allowed_spec_files{$spec_file}++;
213 return sort(keys(%allowed_spec_files));
216 sub found_module_in_dir {
222 my $used_module_dirs = \%{$self->{USED_MODULE_DIRS}};
224 $$used_module_dirs{$module}{$dir}++;
230 my $output = \${$self->{OUTPUT}};
231 my $dir2spec_file = \%{$self->{DIR2SPEC_FILE}};
232 my $spec_file2module = \%{$self->{SPEC_FILE2MODULE}};
233 my $used_module_dirs = \%{$self->{USED_MODULE_DIRS}};
236 foreach my $dir (sort(keys(%$dir2spec_file))) {
237 if($dir eq "") { next; }
238 foreach my $spec_file (sort(keys(%{$$dir2spec_file{$dir}}))) {
239 my $module = $$spec_file2module{$spec_file};
240 if(!$$used_module_dirs{$module}{$dir}) {
241 push @messages, "modules.dat: $spec_file: directory ($dir) is not used\n";
246 foreach my $message (sort(@messages)) {
247 $$output->write($message);