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