r14327: Replace MAJOR_VERSION/MINOR_VERSION/RELEASE_VERSION with two parameters:
[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         return if ($subsys->{ENABLE} ne "YES");
37         
38         unless(defined($subsys->{OUTPUT_TYPE})) {
39                 $subsys->{OUTPUT_TYPE} = $default_ot;
40         }
41 }
42
43 sub check_module($$$)
44 {
45         my ($INPUT, $mod, $default_ot) = @_;
46
47         die("Module $mod->{NAME} does not have a SUBSYSTEM set") if not defined($mod->{SUBSYSTEM});
48
49         my $use_default = 0;
50         
51         if (not exists($INPUT->{$mod->{SUBSYSTEM}}{INIT_FUNCTIONS})) {
52                 $INPUT->{$mod->{SUBSYSTEM}}{INIT_FUNCTIONS} = [];
53         }
54
55         if (!(defined($INPUT->{$mod->{SUBSYSTEM}}))) {
56                 $mod->{ENABLE} = "NO";
57                 return;
58         }
59
60         return if ($mod->{ENABLE} ne "YES");
61
62         if (exists($INPUT->{$mod->{SUBSYSTEM}}{INIT_FUNCTION_TYPE})) {
63                 $mod->{INIT_FUNCTION_TYPE} = $INPUT->{$mod->{SUBSYSTEM}}{INIT_FUNCTION_TYPE};
64         } else {
65                 $mod->{INIT_FUNCTION_TYPE} = "NTSTATUS (*) (void)";
66         }
67
68         if (defined($mod->{CHOSEN_BUILD}) and $mod->{CHOSEN_BUILD} ne "DEFAULT") 
69         {
70                 $mod->{OUTPUT_TYPE} = $mod->{CHOSEN_BUILD};
71         } elsif (not defined($mod->{OUTPUT_TYPE})) {
72                 $mod->{OUTPUT_TYPE} = $default_ot;
73         }
74
75         if ($mod->{OUTPUT_TYPE} eq "SHARED_LIBRARY") {
76                 $mod->{INSTALLDIR} = "MODULESDIR/$mod->{SUBSYSTEM}";
77         } else {
78                 push (@{$INPUT->{$mod->{SUBSYSTEM}}{REQUIRED_SUBSYSTEMS}}, $mod->{NAME});
79                 push (@{$INPUT->{$mod->{SUBSYSTEM}}{INIT_FUNCTIONS}}, $mod->{INIT_FUNCTION}) if defined($mod->{INIT_FUNCTION});
80         }
81 }
82
83 sub check_library($$$)
84 {
85         my ($INPUT, $lib, $default_ot) = @_;
86
87         return if ($lib->{ENABLE} ne "YES");
88
89         $lib->{OUTPUT_TYPE} = $default_ot;
90
91         if (defined($lib->{VERSION}) and not defined($lib->{SO_VERSION})) {
92                 print "$lib->{NAME}: Please specify SO_VERSION when specifying VERSION\n";
93                 return;
94         }
95
96         if (defined($lib->{SO_VERSION}) and not defined($lib->{VERSION})) {
97                 print "$lib->{NAME}: Please specify VERSION when specifying SO_VERSION\n";
98                 return;
99         }
100
101         unless (defined($lib->{INIT_FUNCTION_TYPE})) {
102                 $lib->{INIT_FUNCTION_TYPE} = "NTSTATUS (*) (void)";
103         }
104
105         $lib->{INSTALLDIR} = "LIBDIR";
106 }
107
108 sub check_binary($$)
109 {
110         my ($INPUT, $bin) = @_;
111
112         return if ($bin->{ENABLE} ne "YES");
113
114         ($bin->{BINARY} = (lc $bin->{NAME})) if not defined($bin->{BINARY});
115
116         $bin->{OUTPUT_TYPE} = "BINARY";
117 }
118
119 my $level = "";
120
121 sub calc_unique_deps($$$)
122 {
123         sub calc_unique_deps($$$);
124         my ($name, $deps, $udeps) = @_;
125
126         print "$level-> $name\n" if ($ENV{SMB_BUILD_VERBOSE});
127         $level.=" ";
128
129         foreach my $dep (@{$deps}) {
130                 if (not defined($udeps->{$$dep->{NAME}})) {
131                    if (defined ($$dep->{OUTPUT_TYPE}) && (($$dep->{OUTPUT_TYPE} eq "OBJ_LIST")
132                             or ($$dep->{OUTPUT_TYPE} eq "MERGEDOBJ"))) {
133                                 $udeps->{$$dep->{NAME}} = "BUSY";
134                                 calc_unique_deps($$dep->{NAME}, $$dep->{DEPENDENCIES}, $udeps);
135                         }
136                         $udeps->{$$dep->{NAME}} = $$dep;
137                 }
138         }
139         
140         $level = substr($level, 1);
141 }
142
143 sub check($$$$$)
144 {
145         my ($INPUT, $enabled, $subsys_ot, $lib_ot, $module_ot) = @_;
146
147         foreach my $part (values %$INPUT) {
148                 unless(defined($part->{NOPROTO})) {
149                         if ($part->{TYPE} eq "MODULE" or $part->{TYPE} eq "BINARY") {
150                                 $part->{NOPROTO} = "YES";
151                         } else {
152                                 $part->{NOPROTO} = "NO";
153                         }
154                 }
155
156                 if (defined($part->{PRIVATE_PROTO_HEADER})) {
157                         $part->{NOPROTO} = "YES";
158                 }
159
160                 unless (defined($part->{STANDARD_VISIBILITY})) {
161                         if ($part->{TYPE} eq "MODULE" or $part->{TYPE} eq "BINARY") {
162                                 $part->{STANDARD_VISIBILITY} = "hidden";
163                         } else {
164                                 $part->{STANDARD_VISIBILITY} = "default";
165                         }
166                 }
167
168                 unless (defined($part->{EXTRA_CFLAGS})) {
169                         $part->{EXTRA_CFLAGS} = "";
170                 }
171                 
172                 if (defined($part->{PUBLIC_PROTO_HEADER})) {
173                         $part->{NOPROTO} = "YES";
174                         push (@{$part->{PUBLIC_HEADERS}}, $part->{PUBLIC_PROTO_HEADER});
175                 }
176
177                 if (defined($enabled->{$part->{NAME}})) { 
178                         $part->{ENABLE} = $enabled->{$part->{NAME}};
179                         next;
180                 }
181                 
182                 unless(defined($part->{ENABLE})) {
183                         if ($part->{TYPE} eq "EXT_LIB") {
184                                 $part->{ENABLE} = "NO";
185                         } else {
186                                 $part->{ENABLE} = "YES";
187                         }
188                 }
189         }
190
191         foreach my $k (keys %$INPUT) {
192                 my $part = $INPUT->{$k};
193
194                 check_subsystem($INPUT, $part, $subsys_ot) if ($part->{TYPE} eq "SUBSYSTEM");
195                 check_module($INPUT, $part, $module_ot) if ($part->{TYPE} eq "MODULE");
196                 check_library($INPUT, $part, $lib_ot) if ($part->{TYPE} eq "LIBRARY");
197                 check_binary($INPUT, $part) if ($part->{TYPE} eq "BINARY");
198         }
199
200         my %depend = %$INPUT;
201
202         foreach my $part (values %depend) {
203                 
204                 # Generate list of dependencies
205                 $part->{DEPENDENCIES} = [];
206
207                 foreach my $key (@{$part->{REQUIRED_SUBSYSTEMS}}) {
208                         die("$part->{NAME} has undefined dependency $key\n") if not defined($depend{$key});
209                         push (@{$part->{DEPENDENCIES}}, \$depend{$key});
210                 }
211
212                 delete ($part->{REQUIRED_SUBSYSTEMS});
213         }
214
215         foreach my $part (values %depend) {
216                 $part->{UNIQUE_DEPENDENCIES} = {};
217                 calc_unique_deps($part->{NAME}, $part->{DEPENDENCIES}, $part->{UNIQUE_DEPENDENCIES});
218         }
219
220         return \%depend;
221 }
222
223 1;