summaryrefslogtreecommitdiff
path: root/source4/build/smb_build/input.pm
diff options
context:
space:
mode:
Diffstat (limited to 'source4/build/smb_build/input.pm')
-rw-r--r--source4/build/smb_build/input.pm151
1 files changed, 95 insertions, 56 deletions
diff --git a/source4/build/smb_build/input.pm b/source4/build/smb_build/input.pm
index a6d5b25f41..c4a4052d8f 100644
--- a/source4/build/smb_build/input.pm
+++ b/source4/build/smb_build/input.pm
@@ -3,12 +3,15 @@
### - the input checking functions ###
### ###
### Copyright (C) Stefan (metze) Metzmacher 2004 ###
+### Copyright (C) Jelmer Vernooij 2004 ###
### Released under the GNU GPL ###
###########################################################
use strict;
package input;
+our $srcdir = ".";
+
sub strtrim($)
{
my $str = shift;
@@ -41,85 +44,95 @@ sub str2array($)
return @ar;
}
-sub _check_subsystems($)
+sub check_subsystem($$)
{
my $CTX = shift;
-
- foreach my $subsys (sort keys %{$CTX->{INPUT}{SUBSYSTEMS}}) {
- if ($CTX->{INPUT}{SUBSYSTEMS}{$subsys}{ENABLE} ne "YES") {
- printf("Subsystem: %s disabled!\n",$CTX->{INPUT}{SUBSYSTEMS}{$subsys}{NAME});
- next;
- }
+ my $subsys = shift;
+ if ($subsys->{ENABLE} ne "YES") {
+ printf("Subsystem: %s disabled!\n",$subsys->{NAME});
}
-
- return;
+
+ # FIXME: Make this configurable (so it can be STATIC_LIBRARY, for example)
+ $subsys->{OUTPUT_TYPE} = "OBJLIST";
}
-sub _check_modules($)
+sub check_module($$)
{
my $CTX = shift;
+ my $mod = shift;
- foreach my $mod (sort keys %{$CTX->{INPUT}{MODULES}}) {
- my $subsys = $CTX->{INPUT}{MODULES}{$mod}{SUBSYSTEM};
- my $default_build = $CTX->{INPUT}{MODULES}{$mod}{DEFAULT_BUILD};
- my $build = $CTX->{INPUT}{MODULES}{$mod}{CHOSEN_BUILD};
- my $use_default = 0;
-
- if (!(defined($CTX->{INPUT}{SUBSYSTEMS}{$subsys}))) {
- $CTX->{INPUT}{MODULES}{$mod}{BUILD} = "NOT";
- printf("Module: %s...PARENT SUBSYSTEM DISABLED\n",$mod);
- next;
- }
+ my $use_default = 0;
- if ($build eq "DEFAULT") {
- $build = $default_build;
- $use_default = 1;
- }
+ if (!(defined($CTX->{INPUT}{$mod->{SUBSYSTEM}}))) {
+ $mod->{BUILD} = "NOT";
+ $mod->{ENABLE} = "NO";
+ printf("Module: %s...PARENT SUBSYSTEM DISABLED\n",$mod->{NAME});
+ return;
+ }
- if ($build eq "SHARED") {
- $CTX->{INPUT}{MODULES}{$mod}{BUILD} = "SHARED";
- printf("Module: %s...shared\n",$mod);
- } elsif ($build eq "STATIC") {
- $CTX->{INPUT}{MODULES}{$mod}{BUILD} = "STATIC";
- printf("Module: %s...static\n",$mod);
- } else {
- $CTX->{INPUT}{MODULES}{$mod}{BUILD} = "NOT";
- printf("Module: %s...not\n",$mod);
- next;
- }
+ if ($mod->{CHOSEN_BUILD} eq "DEFAULT") {
+ $mod->{CHOSEN_BUILD} = $mod->{DEFAULT_BUILD};
}
- return;
+ if ($mod->{CHOSEN_BUILD} eq "SHARED") {
+ $mod->{ENABLE} = "YES";
+ $mod->{OUTPUT_TYPE} = "SHARED_LIBRARY";
+ push (@{$mod->{REQUIRED_SUBSYSTEMS}}, $mod->{SUBSYSTEM});
+ printf("Module: %s...shared\n",$mod->{NAME});
+ } elsif ($mod->{CHOSEN_BUILD} eq "STATIC") {
+ $mod->{ENABLE} = "YES";
+ push (@{$CTX->{INPUT}{$mod->{SUBSYSTEM}}{REQUIRED_SUBSYSTEMS}}, $mod->{NAME});
+ printf("Module: %s...static\n",$mod->{NAME});
+ $mod->{OUTPUT_TYPE} = "OBJLIST";
+ } else {
+ $mod->{ENABLE} = "NO";
+ printf("Module: %s...not\n",$mod->{NAME});
+ return;
+ }
}
-sub _check_libraries($)
+sub check_library($$)
{
my $CTX = shift;
+ my $lib = shift;
- foreach my $lib (sort keys %{$CTX->{INPUT}{LIBRARIES}}) {
- if ($CTX->{INPUT}{LIBRARIES}{$lib}{ENABLE} ne "YES") {
- printf("Library: %s...disabled\n",$CTX->{INPUT}{LIBRARIES}{$lib}{NAME});
- next;
- }
+ if ($lib->{ENABLE} ne "YES") {
+ printf("Library: %s...disabled\n",$lib->{NAME});
+ return;
}
- return;
+ $lib->{OUTPUT_TYPE} = "SHARED_LIBRARY";
}
-sub _check_binaries($)
+sub check_binary($$)
{
my $CTX = shift;
+ my $bin = shift;
- foreach my $bin (sort keys %{$CTX->{INPUT}{BINARIES}}) {
- if ($CTX->{INPUT}{BINARIES}{$bin}{ENABLE} ne "YES") {
- printf("Binary: %s...disabled\n",$CTX->{INPUT}{BINARIES}{$bin}{NAME});
- next;
- }
+ if ($bin->{ENABLE} ne "YES") {
+ printf("Binary: %s...disabled\n",$bin->{NAME});
+ return;
}
- return;
+ $bin->{OUTPUT_TYPE} = "BINARY";
+}
+
+sub calc_unique_deps
+{
+ my $deps = shift;
+ my $udeps = shift;
+
+ foreach my $dep (@{$deps}) {
+ if (not defined($udeps->{$$dep->{NAME}})) {
+ $udeps->{$$dep->{NAME}} = "BUSY";
+ calc_unique_deps($$dep->{DEPENDENCIES}, $udeps);
+ $udeps->{$$dep->{NAME}} = $$dep;
+ }
+ }
}
+
+
###########################################################
# This function checks the input from the configure script
#
@@ -130,14 +143,40 @@ sub check($)
{
my $CTX = shift;
- _check_subsystems($CTX);
+ foreach my $part (values %{$CTX->{INPUT}}) {
+ check_subsystem($CTX, $part) if ($part->{TYPE} eq "SUBSYSTEM");
+ check_module($CTX, $part) if ($part->{TYPE} eq "MODULE");
+ check_library($CTX, $part) if ($part->{TYPE} eq "LIBRARY");
+ check_binary($CTX, $part) if ($part->{TYPE} eq "BINARY");
+
+ #FIXME: REQUIRED_LIBRARIES needs to go
+ if (defined($part->{REQUIRED_LIBRARIES})) {
+ push(@{$part->{REQUIRED_SUBSYSTEMS}}, @{$part->{REQUIRED_LIBRARIES}});
+ delete ($part->{REQUIRED_LIBRARIES});
+ }
+ }
+
+ my %depend = %{$CTX->{INPUT}};
- _check_modules($CTX);
+ foreach my $part (values %depend) {
+
+ # Generate list of dependencies
+ $part->{DEPENDENCIES} = [];
- _check_libraries($CTX);
+ foreach my $key (@{$part->{REQUIRED_SUBSYSTEMS}}) {
+ die("$part->{NAME} has undefined dependency $key\n") if not defined($depend{$key});
+ push (@{$part->{DEPENDENCIES}}, \$depend{$key});
+ }
- _check_binaries($CTX);
+ delete ($part->{REQUIRED_SUBSYSTEMS});
+ }
- return;
+ foreach my $part (values %depend) {
+ $part->{UNIQUE_DEPENDENCIES} = {};
+ calc_unique_deps($part->{DEPENDENCIES}, $part->{UNIQUE_DEPENDENCIES});
+ }
+
+ return %depend;
}
+
1;