r8826: Make configure generate config.mk files (with the external libraries
[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 smb_build::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
55         ($mod->{DEFAULT_BUILD} = "STATIC") if not defined($mod->{DEFAULT_BUILD});
56         
57         my $use_default = 0;
58
59         if (!(defined($INPUT->{$mod->{SUBSYSTEM}}))) {
60                 $mod->{BUILD} = "NOT";
61                 $mod->{ENABLE} = "NO";
62                 printf("Module: %s...PARENT SUBSYSTEM ($mod->{SUBSYSTEM}) DISABLED\n",$mod->{NAME});
63                 return;
64         }
65
66         if (($mod->{ENABLE} eq "STATIC") or 
67                 ($mod->{ENABLE} eq "NOT") or 
68                 ($mod->{ENABLE} eq "SHARED")) {
69                 $mod->{DEFAULT_BUILD} = $mod->{ENABLE};
70         } elsif ($mod->{ENABLE} ne "YES")
71         {
72                 $mod->{CHOSEN_BUILD} = "NOT";
73         }
74
75         if (not defined($mod->{CHOSEN_BUILD}) or $mod->{CHOSEN_BUILD} eq "DEFAULT") 
76         {
77                 $mod->{CHOSEN_BUILD} = $mod->{DEFAULT_BUILD};
78         }
79
80         if ($mod->{CHOSEN_BUILD} eq "SHARED") {
81                 $mod->{ENABLE} = "YES";
82                 $mod->{OUTPUT_TYPE} = "SHARED_LIBRARY";
83                 push (@{$mod->{REQUIRED_SUBSYSTEMS}}, $mod->{SUBSYSTEM});
84                 printf("Module: %s...shared\n",$mod->{NAME});
85         } elsif ($mod->{CHOSEN_BUILD} eq "STATIC") {
86                 $mod->{ENABLE} = "YES";
87                 push (@{$INPUT->{$mod->{SUBSYSTEM}}{REQUIRED_SUBSYSTEMS}}, $mod->{NAME});
88                 printf("Module: %s...static\n",$mod->{NAME});
89                 $mod->{OUTPUT_TYPE} = $subsystem_default_output_type;
90         } else {
91                 $mod->{ENABLE} = "NO";
92                 printf("Module: %s...not\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         $lib->{OUTPUT_TYPE} = "SHARED_LIBRARY";
107 }
108
109 sub check_target($$)
110 {
111         my ($INPUT, $bin) = @_;
112
113         if (!defined($bin->{CMD})) {
114                 print "CMD not defined for target!\n";
115         }
116
117         $bin->{OUTPUT_TYPE} = "CUSTOM";
118 }
119
120 sub check_binary($$)
121 {
122         my ($INPUT, $bin) = @_;
123
124         if ($bin->{ENABLE} ne "YES") {
125                 printf("Binary: %s...disabled\n",$bin->{NAME});
126                 return;
127         }
128
129         ($bin->{BINARY} = (lc $bin->{NAME})) if not defined($bin->{BINARY});
130
131         $bin->{OUTPUT_TYPE} = "BINARY";
132 }
133
134 sub calc_unique_deps($$)
135 {
136         sub calc_unique_deps($$);
137         my ($deps, $udeps) = @_;
138
139         foreach my $dep (@{$deps}) {
140                 if (not defined($udeps->{$$dep->{NAME}})) {
141                         $udeps->{$$dep->{NAME}} = "BUSY";
142                         calc_unique_deps($$dep->{DEPENDENCIES}, $udeps);
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         ($subsystem_default_output_type = $ENV{SUBSYSTEM_OUTPUT_TYPE}) if (defined($ENV{"SUBSYSTEM_OUTPUT_TYPE"}));
160
161         foreach my $part (values %$INPUT) {
162                 if (defined($enabled->{$part->{NAME}})) { 
163                         $part->{ENABLE} = $enabled->{$part->{NAME}};
164                         next;
165                 }
166                 
167                 unless(defined($part->{ENABLE})) {
168                         $part->{ENABLE} = "YES";
169                 }
170         }
171
172         foreach my $k (keys %$INPUT) {
173                 my $part = $INPUT->{$k};
174                 if (not defined($part->{TYPE})) {
175                         print STDERR "$k does not have a type set.. Perhaps it's only mentioned in a .m4 but not in a .mk file?\n";
176                         next;
177                 }
178                 check_subsystem($INPUT, $part) if ($part->{TYPE} eq "SUBSYSTEM");
179                 check_module($INPUT, $part) if ($part->{TYPE} eq "MODULE");
180                 check_library($INPUT, $part) if ($part->{TYPE} eq "LIBRARY");
181                 check_binary($INPUT, $part) if ($part->{TYPE} eq "BINARY");
182                 check_target($INPUT, $part) if ($part->{TYPE} eq "TARGET");
183         }
184
185         my %depend = %$INPUT;
186
187         foreach my $part (values %depend) {
188                 
189                 # Generate list of dependencies
190                 $part->{DEPENDENCIES} = [];
191
192                 foreach my $key (@{$part->{REQUIRED_SUBSYSTEMS}}) {
193                         die("$part->{NAME} has undefined dependency $key\n") if not defined($depend{$key});
194                         push (@{$part->{DEPENDENCIES}}, \$depend{$key});
195                 }
196
197                 delete ($part->{REQUIRED_SUBSYSTEMS});
198         }
199
200         foreach my $part (values %depend) {
201                 $part->{UNIQUE_DEPENDENCIES} = {};
202                 calc_unique_deps($part->{DEPENDENCIES}, $part->{UNIQUE_DEPENDENCIES});
203         }
204
205         return \%depend;
206 }
207
208 1;