r11377: Add support for building LIBRARY elements as shared libraries:
[bbaumbach/samba-autobuild/.git] / source4 / 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 smb_build::input;
12
13 use vars qw($library_output_type $subsystem_output_type);
14
15 $library_output_type = "OBJ_LIST";
16 $subsystem_output_type = "OBJ_LIST";
17 my $srcdir = ".";
18
19 sub strtrim($)
20 {
21         $_ = shift;
22         s/^[\t\n ]*//g;
23         s/[\t\n ]*$//g;
24         return $_;
25 }
26
27 sub str2array($)
28 {
29         $_ = shift;
30         s/^[\t\n ]*//g;
31         s/[\t\n ]*$//g;
32         s/([\t\n ]+)/ /g;
33
34         return () if (length($_)==0);
35         return split /[ \t\n]/;
36 }
37
38 sub check_subsystem($$)
39 {
40         my ($INPUT, $subsys) = @_;
41         if ($subsys->{ENABLE} ne "YES") {
42                 printf("Subsystem `%s' disabled\n",$subsys->{NAME});
43                 return;
44         }
45         
46         unless(defined($subsys->{OUTPUT_TYPE})) {
47                 $subsys->{OUTPUT_TYPE} = $subsystem_output_type;
48         }
49 }
50
51 sub check_module($$)
52 {
53         my ($INPUT, $mod) = @_;
54
55         die("Module $mod->{NAME} does not have a SUBSYSTEM set") if not defined($mod->{SUBSYSTEM});
56
57         ($mod->{DEFAULT_BUILD} = "STATIC") if not defined($mod->{DEFAULT_BUILD});
58         
59         my $use_default = 0;
60
61         if (!(defined($INPUT->{$mod->{SUBSYSTEM}}))) {
62                 $mod->{BUILD} = "NOT";
63                 $mod->{ENABLE} = "NO";
64                 return;
65         }
66
67         if (($mod->{ENABLE} eq "STATIC") or 
68                 ($mod->{ENABLE} eq "NOT") or 
69                 ($mod->{ENABLE} eq "SHARED")) {
70                 $mod->{DEFAULT_BUILD} = $mod->{ENABLE};
71         } elsif ($mod->{ENABLE} ne "YES")
72         {
73                 $mod->{CHOSEN_BUILD} = "NOT";
74         }
75
76         if (not defined($mod->{CHOSEN_BUILD}) or $mod->{CHOSEN_BUILD} eq "DEFAULT") 
77         {
78                 $mod->{CHOSEN_BUILD} = $mod->{DEFAULT_BUILD};
79         }
80
81         if ($mod->{CHOSEN_BUILD} eq "SHARED") {
82                 $mod->{ENABLE} = "YES";
83                 $mod->{OUTPUT_TYPE} = "SHARED_LIBRARY";
84                 $mod->{INSTALLDIR} = "LIBDIR/$mod->{SUBSYSTEM}";
85                 push (@{$mod->{REQUIRED_SUBSYSTEMS}}, $mod->{SUBSYSTEM});
86         } elsif ($mod->{CHOSEN_BUILD} eq "STATIC") {
87                 $mod->{ENABLE} = "YES";
88                 push (@{$INPUT->{$mod->{SUBSYSTEM}}{REQUIRED_SUBSYSTEMS}}, $mod->{NAME});
89                 $mod->{OUTPUT_TYPE} = $subsystem_output_type;
90         } else {
91                 $mod->{ENABLE} = "NO";
92                 printf("Module `%s' disabled\n",$mod->{NAME});
93                 return;
94         }
95 }
96
97 sub check_library($$)
98 {
99         my ($INPUT, $lib) = @_;
100
101         if ($lib->{ENABLE} ne "YES") {
102                 printf("Library `%s' disabled\n",$lib->{NAME});
103                 return;
104         }
105
106
107         $lib->{OUTPUT_TYPE} = $library_output_type;
108
109         unless (defined($lib->{MAJOR_VERSION})) {
110                 print "$lib->{NAME}: Please specify MAJOR_VERSION\n";
111                 return;
112         }
113
114         $lib->{INSTALLDIR} = "LIBDIR";
115 }
116
117 sub check_binary($$)
118 {
119         my ($INPUT, $bin) = @_;
120
121         if ($bin->{ENABLE} ne "YES") {
122                 printf("Binary `%s' disabled\n",$bin->{NAME});
123                 return;
124         }
125
126         ($bin->{BINARY} = (lc $bin->{NAME})) if not defined($bin->{BINARY});
127
128         $bin->{OUTPUT_TYPE} = "BINARY";
129 }
130
131 sub calc_unique_deps($$)
132 {
133         sub calc_unique_deps($$);
134         my ($deps, $udeps) = @_;
135
136         foreach my $dep (@{$deps}) {
137                 if (not defined($udeps->{$$dep->{NAME}})) {
138                    if (defined ($$dep->{OUTPUT_TYPE}) && (($$dep->{OUTPUT_TYPE} eq "OBJ_LIST")
139                             or ($$dep->{OUTPUT_TYPE} eq "MERGEDOBJ"))) {
140                                 $udeps->{$$dep->{NAME}} = "BUSY";
141                                 calc_unique_deps($$dep->{DEPENDENCIES}, $udeps);
142                         }
143                         $udeps->{$$dep->{NAME}} = $$dep;
144                 }
145         }
146 }
147
148 ###########################################################
149 # This function checks the input from the configure script 
150 #
151 # check_input($INPUT)
152 #
153 # $INPUT -      the global INPUT context
154 # $enabled - list of enabled subsystems/libs
155 sub check($$)
156 {
157         my ($INPUT, $enabled) = @_;
158
159         foreach my $part (values %$INPUT) {
160                 if (defined($enabled->{$part->{NAME}})) { 
161                         $part->{ENABLE} = $enabled->{$part->{NAME}};
162                         next;
163                 }
164                 
165                 unless(defined($part->{ENABLE})) {
166                         $part->{ENABLE} = "YES";
167                 }
168         }
169
170         foreach my $k (keys %$INPUT) {
171                 my $part = $INPUT->{$k};
172
173                 check_subsystem($INPUT, $part) if ($part->{TYPE} eq "SUBSYSTEM");
174                 check_module($INPUT, $part) if ($part->{TYPE} eq "MODULE");
175                 check_library($INPUT, $part) if ($part->{TYPE} eq "LIBRARY");
176                 check_binary($INPUT, $part) if ($part->{TYPE} eq "BINARY");
177         }
178
179         my %depend = %$INPUT;
180
181         foreach my $part (values %depend) {
182                 
183                 # Generate list of dependencies
184                 $part->{DEPENDENCIES} = [];
185
186                 foreach my $key (@{$part->{REQUIRED_SUBSYSTEMS}}) {
187                         die("$part->{NAME} has undefined dependency $key\n") if not defined($depend{$key});
188                         push (@{$part->{DEPENDENCIES}}, \$depend{$key});
189                 }
190
191                 delete ($part->{REQUIRED_SUBSYSTEMS});
192         }
193
194         foreach my $part (values %depend) {
195                 $part->{UNIQUE_DEPENDENCIES} = {};
196                 calc_unique_deps($part->{DEPENDENCIES}, $part->{UNIQUE_DEPENDENCIES});
197         }
198
199         return \%depend;
200 }
201
202 1;