r6839: Add support for building subsystems as shared libraries. This can be
[samba.git] / source / build / smb_build / input.pm
1 ###########################################################
2 ### SMB Build System                                    ###
3 ### - the input checking functions                      ###
4 ###                                                     ###
5 ###  Copyright (C) Stefan (metze) Metzmacher 2004       ###
6 ###  Copyright (C) Jelmer Vernooij 2004 ###
7 ###  Released under the GNU GPL                         ###
8 ###########################################################
9
10 use strict;
11 package input;
12
13 my $subsystem_default_output_type = "OBJLIST";
14 my $srcdir = ".";
15
16 sub strtrim($)
17 {
18         my $str = shift;
19         my @ar = ();
20
21         $str =~ s/^[\t\n ]*//g;
22
23         $str =~ s/[\t\n ]*$//g;
24
25         return $str;
26 }
27
28 sub str2array($)
29 {
30         my $str = shift;
31         my @ar = ();
32
33         $str =~ s/^[\t\n ]*//g;
34
35         $str =~ s/[\t\n ]*$//g;
36
37         $str =~ s/([\t\n ]+)/ /g;
38
39         if (length($str)==0) {
40                 return ();
41         }
42
43         @ar = split(/[ \t\n]/,$str);
44
45         return @ar;
46 }
47
48 sub check_subsystem($$)
49 {
50         my $CTX = shift;
51         my $subsys = shift;
52         if ($subsys->{ENABLE} ne "YES") {
53                 printf("Subsystem: %s disabled!\n",$subsys->{NAME});
54                 return;
55         }
56         
57         unless(defined($subsys->{OUTPUT_TYPE})) {
58                 $subsys->{OUTPUT_TYPE} = $subsystem_default_output_type;
59         } else {
60                 $subsys->{OUTPUT_TYPE} = join('', @{$subsys->{OUTPUT_TYPE}});
61         }
62 }
63
64 sub check_module($$)
65 {
66         my $CTX = shift;
67         my $mod = shift;
68
69         die("Module $mod->{NAME} does not have a SUBSYSTEM set") if not defined($mod->{SUBSYSTEM});
70
71         ($mod->{DEFAULT_BUILD} = "STATIC") if not defined($mod->{DEFAULT_BUILD});
72         
73         my $use_default = 0;
74
75         $mod->{SUBSYSTEM} = join(' ', @{$mod->{SUBSYSTEM}});
76
77         if (!(defined($CTX->{INPUT}{$mod->{SUBSYSTEM}}))) {
78                 $mod->{BUILD} = "NOT";
79                 $mod->{ENABLE} = "NO";
80                 printf("Module: %s...PARENT SUBSYSTEM ($mod->{SUBSYSTEM}) DISABLED\n",$mod->{NAME});
81                 return;
82         }
83
84         if ($mod->{ENABLE} ne "YES")
85         {
86                 $mod->{CHOSEN_BUILD} = "NOT";
87         }
88
89         if (not defined($mod->{CHOSEN_BUILD}) or $mod->{CHOSEN_BUILD} eq "DEFAULT") {
90                 $mod->{CHOSEN_BUILD} = $mod->{DEFAULT_BUILD};
91         }
92
93         if ($mod->{CHOSEN_BUILD} eq "SHARED") {
94                 $mod->{ENABLE} = "YES";
95                 $mod->{OUTPUT_TYPE} = "SHARED_LIBRARY";
96                 push (@{$mod->{REQUIRED_SUBSYSTEMS}}, $mod->{SUBSYSTEM});
97                 printf("Module: %s...shared\n",$mod->{NAME});
98         } elsif ($mod->{CHOSEN_BUILD} eq "STATIC") {
99                 $mod->{ENABLE} = "YES";
100                 push (@{$CTX->{INPUT}{$mod->{SUBSYSTEM}}{REQUIRED_SUBSYSTEMS}}, $mod->{NAME});
101                 printf("Module: %s...static\n",$mod->{NAME});
102                 $mod->{OUTPUT_TYPE} = $subsystem_default_output_type;
103         } else {
104                 $mod->{ENABLE} = "NO";
105                 printf("Module: %s...not\n",$mod->{NAME});
106                 return;
107         }
108 }
109
110 sub check_library($$)
111 {
112         my $CTX = shift;
113         my $lib = shift;
114
115         if ($lib->{ENABLE} ne "YES") {
116                 printf("Library: %s...disabled\n",$lib->{NAME});
117                 return;
118         }
119
120         $lib->{OUTPUT_TYPE} = "SHARED_LIBRARY";
121
122         if (defined($lib->{MAJOR_VERSION})) {
123             $lib->{MAJOR_VERSION} = join('', @{$lib->{MAJOR_VERSION}});
124         }
125         if (defined($lib->{MINOR_VERSION})) {
126             $lib->{MINOR_VERSION} = join('', @{$lib->{MINOR_VERSION}});
127         }
128         if (defined($lib->{RELEASE_VERSION})) {
129             $lib->{RELEASE_VERSION} = join('', @{$lib->{RELEASE_VERSION}});
130         }
131 }
132
133 sub check_binary($$)
134 {
135         my $CTX = shift;
136         my $bin = shift;
137
138         if ($bin->{ENABLE} ne "YES") {
139                 printf("Binary: %s...disabled\n",$bin->{NAME});
140                 return;
141         }
142
143         ($bin->{BINARY} = (lc $bin->{NAME})) if not defined($bin->{BINARY});
144
145         $bin->{OUTPUT_TYPE} = "BINARY";
146 }
147
148 sub calc_unique_deps
149 {
150         my $deps = shift;
151         my $udeps = shift;
152
153         foreach my $dep (@{$deps}) {
154                 if (not defined($udeps->{$$dep->{NAME}})) {
155                         $udeps->{$$dep->{NAME}} = "BUSY";
156                         calc_unique_deps($$dep->{DEPENDENCIES}, $udeps);
157                         $udeps->{$$dep->{NAME}} = $$dep;
158                 }
159         }
160 }
161
162
163
164 ###########################################################
165 # This function checks the input from the configure script 
166 #
167 # check_input($SMB_BUILD_CTX)
168 #
169 # $SMB_BUILD_CTX -      the global SMB_BUILD context
170 sub check($)
171 {
172         my $CTX = shift;
173
174         ($subsystem_default_output_type = $ENV{SUBSYSTEM_OUTPUT_TYPE}) if (defined($ENV{"SUBSYSTEM_OUTPUT_TYPE"}));
175
176         foreach my $part (values %{$CTX->{INPUT}}) {
177                 ($part->{ENABLE} = "YES") if not defined($part->{ENABLE});
178         }
179
180         foreach my $k (keys %{$CTX->{INPUT}}) {
181                 my $part = $CTX->{INPUT}->{$k};
182                 if (not defined($part->{TYPE})) {
183                         print STDERR "$k does not have a type set.. Perhaps it's only mentioned in a .m4 but not in a .mk file?\n";
184                         next;
185                 }
186                 check_subsystem($CTX, $part) if ($part->{TYPE} eq "SUBSYSTEM");
187                 check_module($CTX, $part) if ($part->{TYPE} eq "MODULE");
188                 check_library($CTX, $part) if ($part->{TYPE} eq "LIBRARY");
189                 check_binary($CTX, $part) if ($part->{TYPE} eq "BINARY");
190
191                 #FIXME: REQUIRED_LIBRARIES needs to go
192                 if (defined($part->{REQUIRED_LIBRARIES})) {
193                         push(@{$part->{REQUIRED_SUBSYSTEMS}}, @{$part->{REQUIRED_LIBRARIES}});
194                         delete ($part->{REQUIRED_LIBRARIES});
195                 }
196         }
197
198         my %depend = %{$CTX->{INPUT}};
199
200         foreach my $part (values %depend) {
201                 
202                 # Generate list of dependencies
203                 $part->{DEPENDENCIES} = [];
204
205                 foreach my $key (@{$part->{REQUIRED_SUBSYSTEMS}}) {
206                         die("$part->{NAME} has undefined dependency $key\n") if not defined($depend{$key});
207                         push (@{$part->{DEPENDENCIES}}, \$depend{$key});
208                 }
209
210                 delete ($part->{REQUIRED_SUBSYSTEMS});
211         }
212
213         foreach my $part (values %depend) {
214                 $part->{UNIQUE_DEPENDENCIES} = {};
215                 calc_unique_deps($part->{DEPENDENCIES}, $part->{UNIQUE_DEPENDENCIES});
216         }
217
218         return %depend;
219 }
220
221 1;