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 my $subsystem_default_output_type = "MERGEDOBJ";
31 return () if (length($_)==0);
32 return split /[ \t\n]/;
35 sub check_subsystem($$)
37 my ($INPUT, $subsys) = @_;
38 if ($subsys->{ENABLE} ne "YES") {
39 printf("Subsystem: %s disabled!\n",$subsys->{NAME});
43 unless(defined($subsys->{OUTPUT_TYPE})) {
44 $subsys->{OUTPUT_TYPE} = $subsystem_default_output_type;
50 my ($INPUT, $mod) = @_;
52 die("Module $mod->{NAME} does not have a SUBSYSTEM set") if not defined($mod->{SUBSYSTEM});
55 ($mod->{DEFAULT_BUILD} = "STATIC") if not defined($mod->{DEFAULT_BUILD});
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});
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")
72 $mod->{CHOSEN_BUILD} = "NOT";
75 if (not defined($mod->{CHOSEN_BUILD}) or $mod->{CHOSEN_BUILD} eq "DEFAULT")
77 $mod->{CHOSEN_BUILD} = $mod->{DEFAULT_BUILD};
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;
91 $mod->{ENABLE} = "NO";
92 printf("Module: %s...not\n",$mod->{NAME});
99 my ($INPUT, $lib) = @_;
101 if ($lib->{ENABLE} ne "YES") {
102 printf("Library: %s...disabled\n",$lib->{NAME});
106 $lib->{OUTPUT_TYPE} = "SHARED_LIBRARY";
111 my ($INPUT, $bin) = @_;
113 if ($bin->{ENABLE} ne "YES") {
114 printf("Binary: %s...disabled\n",$bin->{NAME});
118 ($bin->{BINARY} = (lc $bin->{NAME})) if not defined($bin->{BINARY});
120 $bin->{OUTPUT_TYPE} = "BINARY";
123 sub calc_unique_deps($$)
125 sub calc_unique_deps($$);
126 my ($deps, $udeps) = @_;
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;
137 ###########################################################
138 # This function checks the input from the configure script
140 # check_input($INPUT)
142 # $INPUT - the global INPUT context
143 # $enabled - list of enabled subsystems/libs
146 my ($INPUT, $enabled) = @_;
148 ($subsystem_default_output_type = $ENV{SUBSYSTEM_OUTPUT_TYPE}) if (defined($ENV{"SUBSYSTEM_OUTPUT_TYPE"}));
150 foreach my $part (values %$INPUT) {
151 if (defined($enabled->{$part->{NAME}})) {
152 $part->{ENABLE} = $enabled->{$part->{NAME}};
156 unless(defined($part->{ENABLE})) {
157 $part->{ENABLE} = "YES";
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";
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");
173 my %depend = %$INPUT;
175 foreach my $part (values %depend) {
177 # Generate list of dependencies
178 $part->{DEPENDENCIES} = [];
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});
185 delete ($part->{REQUIRED_SUBSYSTEMS});
188 foreach my $part (values %depend) {
189 $part->{UNIQUE_DEPENDENCIES} = {};
190 calc_unique_deps($part->{DEPENDENCIES}, $part->{UNIQUE_DEPENDENCIES});