r12680: Support setting the environment variable SMB_BUILD_VERBOSE to
[ira/wip.git] / source / build / smb_build / input.pm
1 # Samba Build System
2 # - the input checking functions
3 #
4 #  Copyright (C) Stefan (metze) Metzmacher 2004
5 #  Copyright (C) Jelmer Vernooij 2004
6 #  Released under the GNU GPL
7
8 use config;
9 use strict;
10 package smb_build::input;
11
12 my $srcdir = $config::config{srcdir};
13
14 sub strtrim($)
15 {
16         $_ = shift;
17         s/^[\t\n ]*//g;
18         s/[\t\n ]*$//g;
19         return $_;
20 }
21
22 sub str2array($)
23 {
24         $_ = shift;
25         s/^[\t\n ]*//g;
26         s/[\t\n ]*$//g;
27         s/([\t\n ]+)/ /g;
28
29         return () if (length($_)==0);
30         return split /[ \t\n]/;
31 }
32
33 sub check_subsystem($$$)
34 {
35         my ($INPUT, $subsys, $default_ot) = @_;
36         if ($subsys->{ENABLE} ne "YES") {
37                 printf("Subsystem `%s' disabled\n",$subsys->{NAME});
38                 return;
39         }
40         
41         unless(defined($subsys->{OUTPUT_TYPE})) {
42                 $subsys->{OUTPUT_TYPE} = $default_ot;
43         }
44 }
45
46 sub check_module($$$)
47 {
48         my ($INPUT, $mod, $default_ot) = @_;
49
50         die("Module $mod->{NAME} does not have a SUBSYSTEM set") if not defined($mod->{SUBSYSTEM});
51
52         my $use_default = 0;
53         
54         if (not exists($INPUT->{$mod->{SUBSYSTEM}}{INIT_FUNCTIONS})) {
55                 $INPUT->{$mod->{SUBSYSTEM}}{INIT_FUNCTIONS} = [];
56         }
57
58         if (!(defined($INPUT->{$mod->{SUBSYSTEM}}))) {
59                 $mod->{ENABLE} = "NO";
60                 return;
61         }
62
63         if ($mod->{ENABLE} ne "YES")
64         {
65                 printf("Module `%s' disabled\n",$mod->{NAME});
66                 return;
67         }
68
69         if (defined($mod->{CHOSEN_BUILD}) and $mod->{CHOSEN_BUILD} ne "DEFAULT") 
70         {
71                 $mod->{OUTPUT_TYPE} = $mod->{CHOSEN_BUILD};
72         } elsif (not defined($mod->{OUTPUT_TYPE})) {
73                 $mod->{OUTPUT_TYPE} = $default_ot;
74         }
75
76         if ($mod->{OUTPUT_TYPE} eq "SHARED_LIBRARY") {
77                 $mod->{INSTALLDIR} = "MODULESDIR/$mod->{SUBSYSTEM}";
78         } else {
79                 push (@{$INPUT->{$mod->{SUBSYSTEM}}{REQUIRED_SUBSYSTEMS}}, $mod->{NAME});
80                 push (@{$INPUT->{$mod->{SUBSYSTEM}}{INIT_FUNCTIONS}}, $mod->{INIT_FUNCTION}) if defined($mod->{INIT_FUNCTION});
81         }
82 }
83
84 sub check_library($$$)
85 {
86         my ($INPUT, $lib, $default_ot) = @_;
87
88         if ($lib->{ENABLE} ne "YES") {
89                 printf("Library `%s' disabled\n",$lib->{NAME});
90                 return;
91         }
92
93         $lib->{OUTPUT_TYPE} = $default_ot;
94
95         unless (defined($lib->{MAJOR_VERSION})) {
96                 print "$lib->{NAME}: Please specify MAJOR_VERSION\n";
97                 return;
98         }
99
100         $lib->{INSTALLDIR} = "LIBDIR";
101 }
102
103 sub check_binary($$)
104 {
105         my ($INPUT, $bin) = @_;
106
107         if ($bin->{ENABLE} ne "YES") {
108                 printf("Binary `%s' disabled\n",$bin->{NAME});
109                 return;
110         }
111
112         ($bin->{BINARY} = (lc $bin->{NAME})) if not defined($bin->{BINARY});
113
114         $bin->{OUTPUT_TYPE} = "BINARY";
115 }
116
117 my $level = "";
118
119 sub calc_unique_deps($$$)
120 {
121         sub calc_unique_deps($$$);
122         my ($name, $deps, $udeps) = @_;
123
124         print "$level-> $name\n" if ($ENV{SMB_BUILD_VERBOSE});
125         $level.=" ";
126
127         foreach my $dep (@{$deps}) {
128                 if (not defined($udeps->{$$dep->{NAME}})) {
129                    if (defined ($$dep->{OUTPUT_TYPE}) && (($$dep->{OUTPUT_TYPE} eq "OBJ_LIST")
130                             or ($$dep->{OUTPUT_TYPE} eq "MERGEDOBJ"))) {
131                                 $udeps->{$$dep->{NAME}} = "BUSY";
132                                 calc_unique_deps($$dep->{NAME}, $$dep->{DEPENDENCIES}, $udeps);
133                         }
134                         $udeps->{$$dep->{NAME}} = $$dep;
135                 }
136         }
137         
138         $level = substr($level, 1);
139 }
140
141 sub check($$$$$)
142 {
143         my ($INPUT, $enabled, $subsys_ot, $lib_ot, $module_ot) = @_;
144
145         foreach my $part (values %$INPUT) {
146                 unless(defined($part->{NOPROTO})) {
147                         $part->{NOPROTO} = "NO";
148                 }
149
150                 if (defined($part->{PRIVATE_PROTO_HEADER})) {
151                         $part->{NOPROTO} = "YES";
152                 }
153                 
154                 if (defined($part->{PUBLIC_PROTO_HEADER})) {
155                         $part->{NOPROTO} = "YES";
156                         push (@{$part->{PUBLIC_HEADERS}}, $part->{PUBLIC_PROTO_HEADER});
157                 }
158
159                 if (defined($enabled->{$part->{NAME}})) { 
160                         $part->{ENABLE} = $enabled->{$part->{NAME}};
161                         next;
162                 }
163                 
164                 unless(defined($part->{ENABLE})) {
165                         $part->{ENABLE} = "YES";
166                 }
167         }
168
169         foreach my $k (keys %$INPUT) {
170                 my $part = $INPUT->{$k};
171
172                 check_subsystem($INPUT, $part, $subsys_ot) if ($part->{TYPE} eq "SUBSYSTEM");
173                 check_module($INPUT, $part, $module_ot) if ($part->{TYPE} eq "MODULE");
174                 check_library($INPUT, $part, $lib_ot) if ($part->{TYPE} eq "LIBRARY");
175                 check_binary($INPUT, $part) if ($part->{TYPE} eq "BINARY");
176         }
177
178         my %depend = %$INPUT;
179
180         foreach my $part (values %depend) {
181                 
182                 # Generate list of dependencies
183                 $part->{DEPENDENCIES} = [];
184
185                 foreach my $key (@{$part->{REQUIRED_SUBSYSTEMS}}) {
186                         die("$part->{NAME} has undefined dependency $key\n") if not defined($depend{$key});
187                         push (@{$part->{DEPENDENCIES}}, \$depend{$key});
188                 }
189
190                 delete ($part->{REQUIRED_SUBSYSTEMS});
191         }
192
193         foreach my $part (values %depend) {
194                 $part->{UNIQUE_DEPENDENCIES} = {};
195                 calc_unique_deps($part->{NAME}, $part->{DEPENDENCIES}, $part->{UNIQUE_DEPENDENCIES});
196         }
197
198         return \%depend;
199 }
200
201 1;