1 ###########################################################
2 ### SMB Build System ###
3 ### - the input checking functions ###
5 ### Copyright (C) Stefan (metze) Metzmacher 2004 ###
6 ### Copyright (C) Jelmer Vernooij 2004 ###
7 ### Released under the GNU GPL ###
8 ###########################################################
11 package smb_build::input;
13 use vars qw($library_output_type $subsystem_output_type);
15 $library_output_type = "OBJ_LIST";
16 $subsystem_output_type = "OBJ_LIST";
34 return () if (length($_)==0);
35 return split /[ \t\n]/;
38 sub check_subsystem($$)
40 my ($INPUT, $subsys) = @_;
41 if ($subsys->{ENABLE} ne "YES") {
42 printf("Subsystem: %s disabled!\n",$subsys->{NAME});
46 unless(defined($subsys->{OUTPUT_TYPE})) {
47 $subsys->{OUTPUT_TYPE} = $subsystem_output_type;
53 my ($INPUT, $mod) = @_;
55 die("Module $mod->{NAME} does not have a SUBSYSTEM set") if not defined($mod->{SUBSYSTEM});
58 ($mod->{DEFAULT_BUILD} = "STATIC") if not defined($mod->{DEFAULT_BUILD});
62 if (!(defined($INPUT->{$mod->{SUBSYSTEM}}))) {
63 $mod->{BUILD} = "NOT";
64 $mod->{ENABLE} = "NO";
65 printf("Module: %s...PARENT SUBSYSTEM ($mod->{SUBSYSTEM}) DISABLED\n",$mod->{NAME});
69 if (($mod->{ENABLE} eq "STATIC") or
70 ($mod->{ENABLE} eq "NOT") or
71 ($mod->{ENABLE} eq "SHARED")) {
72 $mod->{DEFAULT_BUILD} = $mod->{ENABLE};
73 } elsif ($mod->{ENABLE} ne "YES")
75 $mod->{CHOSEN_BUILD} = "NOT";
78 if (not defined($mod->{CHOSEN_BUILD}) or $mod->{CHOSEN_BUILD} eq "DEFAULT")
80 $mod->{CHOSEN_BUILD} = $mod->{DEFAULT_BUILD};
83 if ($mod->{CHOSEN_BUILD} eq "SHARED") {
84 $mod->{ENABLE} = "YES";
85 $mod->{OUTPUT_TYPE} = "SHARED_LIBRARY";
86 push (@{$mod->{REQUIRED_SUBSYSTEMS}}, $mod->{SUBSYSTEM});
87 printf("Module: %s...shared\n",$mod->{NAME});
88 } elsif ($mod->{CHOSEN_BUILD} eq "STATIC") {
89 $mod->{ENABLE} = "YES";
90 push (@{$INPUT->{$mod->{SUBSYSTEM}}{REQUIRED_SUBSYSTEMS}}, $mod->{NAME});
91 printf("Module: %s...static\n",$mod->{NAME});
92 $mod->{OUTPUT_TYPE} = $subsystem_output_type;
94 $mod->{ENABLE} = "NO";
95 printf("Module: %s...not\n",$mod->{NAME});
100 sub check_library($$)
102 my ($INPUT, $lib) = @_;
104 if ($lib->{ENABLE} ne "YES") {
105 printf("Library: %s...disabled\n",$lib->{NAME});
109 $lib->{OUTPUT_TYPE} = $library_output_type;
114 my ($INPUT, $bin) = @_;
116 if ($bin->{ENABLE} ne "YES") {
117 printf("Binary: %s...disabled\n",$bin->{NAME});
121 ($bin->{BINARY} = (lc $bin->{NAME})) if not defined($bin->{BINARY});
123 $bin->{OUTPUT_TYPE} = "BINARY";
126 sub calc_unique_deps($$)
128 sub calc_unique_deps($$);
129 my ($deps, $udeps) = @_;
131 foreach my $dep (@{$deps}) {
132 if (not defined($udeps->{$$dep->{NAME}})) {
133 $udeps->{$$dep->{NAME}} = "BUSY";
134 calc_unique_deps($$dep->{DEPENDENCIES}, $udeps);
135 $udeps->{$$dep->{NAME}} = $$dep;
140 ###########################################################
141 # This function checks the input from the configure script
143 # check_input($INPUT)
145 # $INPUT - the global INPUT context
146 # $enabled - list of enabled subsystems/libs
149 my ($INPUT, $enabled) = @_;
151 foreach my $part (values %$INPUT) {
152 if (defined($enabled->{$part->{NAME}})) {
153 $part->{ENABLE} = $enabled->{$part->{NAME}};
157 unless(defined($part->{ENABLE})) {
158 $part->{ENABLE} = "YES";
162 foreach my $k (keys %$INPUT) {
163 my $part = $INPUT->{$k};
165 check_subsystem($INPUT, $part) if ($part->{TYPE} eq "SUBSYSTEM");
166 check_module($INPUT, $part) if ($part->{TYPE} eq "MODULE");
167 check_library($INPUT, $part) if ($part->{TYPE} eq "LIBRARY");
168 check_binary($INPUT, $part) if ($part->{TYPE} eq "BINARY");
171 my %depend = %$INPUT;
173 foreach my $part (values %depend) {
175 # Generate list of dependencies
176 $part->{DEPENDENCIES} = [];
178 foreach my $key (@{$part->{REQUIRED_SUBSYSTEMS}}) {
179 die("$part->{NAME} has undefined dependency $key\n") if not defined($depend{$key});
180 push (@{$part->{DEPENDENCIES}}, \$depend{$key});
183 delete ($part->{REQUIRED_SUBSYSTEMS});
186 foreach my $part (values %depend) {
187 $part->{UNIQUE_DEPENDENCIES} = {};
188 calc_unique_deps($part->{DEPENDENCIES}, $part->{UNIQUE_DEPENDENCIES});