r11254: Remove support for [TARGET:foo]-like .mk-file entries
[ira/wip.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 smb_build::input;
12
13 my $subsystem_default_output_type = "MERGEDOBJ";
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_binary($$)
110 {
111         my ($INPUT, $bin) = @_;
112
113         if ($bin->{ENABLE} ne "YES") {
114                 printf("Binary: %s...disabled\n",$bin->{NAME});
115                 return;
116         }
117
118         ($bin->{BINARY} = (lc $bin->{NAME})) if not defined($bin->{BINARY});
119
120         $bin->{OUTPUT_TYPE} = "BINARY";
121 }
122
123 sub calc_unique_deps($$)
124 {
125         sub calc_unique_deps($$);
126         my ($deps, $udeps) = @_;
127
128         foreach my $dep (@{$deps}) {
129                 if (not defined($udeps->{$$dep->{NAME}})) {
130                         $udeps->{$$dep->{NAME}} = "BUSY";
131                         calc_unique_deps($$dep->{DEPENDENCIES}, $udeps);
132                         $udeps->{$$dep->{NAME}} = $$dep;
133                 }
134         }
135 }
136
137 ###########################################################
138 # This function checks the input from the configure script 
139 #
140 # check_input($INPUT)
141 #
142 # $INPUT -      the global INPUT context
143 # $enabled - list of enabled subsystems/libs
144 sub check($$)
145 {
146         my ($INPUT, $enabled) = @_;
147
148         ($subsystem_default_output_type = $ENV{SUBSYSTEM_OUTPUT_TYPE}) if (defined($ENV{"SUBSYSTEM_OUTPUT_TYPE"}));
149
150         foreach my $part (values %$INPUT) {
151                 if (defined($enabled->{$part->{NAME}})) { 
152                         $part->{ENABLE} = $enabled->{$part->{NAME}};
153                         next;
154                 }
155                 
156                 unless(defined($part->{ENABLE})) {
157                         $part->{ENABLE} = "YES";
158                 }
159         }
160
161         foreach my $k (keys %$INPUT) {
162                 my $part = $INPUT->{$k};
163                 if (not defined($part->{TYPE})) {
164                         print STDERR "$k does not have a type set.. Perhaps it's only mentioned in a .m4 but not in a .mk file?\n";
165                         next;
166                 }
167                 check_subsystem($INPUT, $part) if ($part->{TYPE} eq "SUBSYSTEM");
168                 check_module($INPUT, $part) if ($part->{TYPE} eq "MODULE");
169                 check_library($INPUT, $part) if ($part->{TYPE} eq "LIBRARY");
170                 check_binary($INPUT, $part) if ($part->{TYPE} eq "BINARY");
171         }
172
173         my %depend = %$INPUT;
174
175         foreach my $part (values %depend) {
176                 
177                 # Generate list of dependencies
178                 $part->{DEPENDENCIES} = [];
179
180                 foreach my $key (@{$part->{REQUIRED_SUBSYSTEMS}}) {
181                         die("$part->{NAME} has undefined dependency $key\n") if not defined($depend{$key});
182                         push (@{$part->{DEPENDENCIES}}, \$depend{$key});
183                 }
184
185                 delete ($part->{REQUIRED_SUBSYSTEMS});
186         }
187
188         foreach my $part (values %depend) {
189                 $part->{UNIQUE_DEPENDENCIES} = {};
190                 calc_unique_deps($part->{DEPENDENCIES}, $part->{UNIQUE_DEPENDENCIES});
191         }
192
193         return \%depend;
194 }
195
196 1;