r15301: Use static libraries internally. This required a few hacks in the build
[jelmer/samba4-debian.git] / source / build / smb_build / input.pm
index c574b5d4a5529d361c5d5bbef21e388f82e6eb51..308438166156c6bb6d3ff927729db8a9e5371932 100644 (file)
-###########################################################
-### SMB Build System                                   ###
-### - the input checking functions                     ###
-###                                                    ###
-###  Copyright (C) Stefan (metze) Metzmacher 2004      ###
-###  Copyright (C) Jelmer Vernooij 2004        ###
-###  Released under the GNU GPL                                ###
-###########################################################
+# Samba Build System
+# - the input checking functions
+#
+#  Copyright (C) Stefan (metze) Metzmacher 2004
+#  Copyright (C) Jelmer Vernooij 2004
+#  Released under the GNU GPL
 
+use config;
 use strict;
-package input;
+package smb_build::input;
 
-my $subsystem_output_type = "OBJLIST";
-my $srcdir = ".";
+my $srcdir = $config::config{srcdir};
 
 sub strtrim($)
 {
-       my $str = shift;
-       my @ar = ();
-
-       $str =~ s/^[\t\n ]*//g;
-
-       $str =~ s/[\t\n ]*$//g;
-
-       return $str;
+       $_ = shift;
+       s/^[\t\n ]*//g;
+       s/[\t\n ]*$//g;
+       return $_;
 }
 
 sub str2array($)
 {
-       my $str = shift;
-       my @ar = ();
+       $_ = shift;
+       s/^[\t\n ]*//g;
+       s/[\t\n ]*$//g;
+       s/([\t\n ]+)/ /g;
 
-       $str =~ s/^[\t\n ]*//g;
-
-       $str =~ s/[\t\n ]*$//g;
-
-       $str =~ s/([\t\n ]+)/ /g;
-
-       if (length($str)==0) {
-               return ();
-       }
-
-       @ar = split(/[ \t\n]/,$str);
-
-       return @ar;
+       return () if (length($_)==0);
+       return split /[ \t\n]/;
 }
 
-sub check_subsystem($$)
+sub check_subsystem($$$)
 {
-       my $CTX = shift;
-       my $subsys = shift;
-       if ($subsys->{ENABLE} ne "YES") {
-               printf("Subsystem: %s disabled!\n",$subsys->{NAME});
-               return;
-       }
+       my ($INPUT, $subsys, $default_ot) = @_;
+       return if ($subsys->{ENABLE} ne "YES");
        
-       $subsys->{OUTPUT_TYPE} = $subsystem_output_type;
+       unless(defined($subsys->{OUTPUT_TYPE})) {
+               $subsys->{OUTPUT_TYPE} = $default_ot;
+       }
 }
 
-sub check_module($$)
+sub check_module($$$)
 {
-       my $CTX = shift;
-       my $mod = shift;
+       my ($INPUT, $mod, $default_ot) = @_;
 
        die("Module $mod->{NAME} does not have a SUBSYSTEM set") if not defined($mod->{SUBSYSTEM});
 
-       ($mod->{DEFAULT_BUILD} = "STATIC") if not defined($mod->{DEFAULT_BUILD});
-       
        my $use_default = 0;
+       
+       if (not exists($INPUT->{$mod->{SUBSYSTEM}}{INIT_FUNCTIONS})) {
+               $INPUT->{$mod->{SUBSYSTEM}}{INIT_FUNCTIONS} = [];
+       }
 
-       $mod->{SUBSYSTEM} = join(' ', @{$mod->{SUBSYSTEM}});
-
-       if (!(defined($CTX->{INPUT}{$mod->{SUBSYSTEM}}))) {
-               $mod->{BUILD} = "NOT";
+       if (!(defined($INPUT->{$mod->{SUBSYSTEM}}))) {
                $mod->{ENABLE} = "NO";
-               printf("Module: %s...PARENT SUBSYSTEM ($mod->{SUBSYSTEM}) DISABLED\n",$mod->{NAME});
                return;
        }
 
-       if ($mod->{ENABLE} ne "YES")
-       {
-               $mod->{CHOSEN_BUILD} = "NOT";
+       return if ($mod->{ENABLE} ne "YES");
+
+       if (exists($INPUT->{$mod->{SUBSYSTEM}}{INIT_FUNCTION_TYPE})) {
+               $mod->{INIT_FUNCTION_TYPE} = $INPUT->{$mod->{SUBSYSTEM}}{INIT_FUNCTION_TYPE};
+       } else {
+               $mod->{INIT_FUNCTION_TYPE} = "NTSTATUS (*) (void)";
        }
 
-       if (not defined($mod->{CHOSEN_BUILD}) or $mod->{CHOSEN_BUILD} eq "DEFAULT") {
-               $mod->{CHOSEN_BUILD} = $mod->{DEFAULT_BUILD};
+       if (not defined($mod->{OUTPUT_TYPE})) {
+               $mod->{OUTPUT_TYPE} = $default_ot;
        }
 
-       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} = $subsystem_output_type;
-       } else {
-               $mod->{ENABLE} = "NO";
-               printf("Module: %s...not\n",$mod->{NAME});
-               return;
+       if ($mod->{OUTPUT_TYPE} eq "SHARED_LIBRARY") {
+               $mod->{INSTALLDIR} = "MODULESDIR/$mod->{SUBSYSTEM}";
+               push (@{$mod->{PRIVATE_DEPENDENCIES}}, $mod->{SUBSYSTEM}) unless 
+                       $INPUT->{$mod->{SUBSYSTEM}}->{TYPE} eq "BINARY";
+       } else { 
+               push (@{$INPUT->{$mod->{SUBSYSTEM}}{INIT_FUNCTIONS}}, $mod->{INIT_FUNCTION}) if defined($mod->{INIT_FUNCTION});
        }
 }
 
-sub check_library($$)
+sub check_library($$$)
 {
-       my $CTX = shift;
-       my $lib = shift;
+       my ($INPUT, $lib, $default_ot) = @_;
 
-       if ($lib->{ENABLE} ne "YES") {
-               printf("Library: %s...disabled\n",$lib->{NAME});
+       return if ($lib->{ENABLE} ne "YES");
+
+       $lib->{OUTPUT_TYPE} = $default_ot;
+
+       if (defined($lib->{VERSION}) and not defined($lib->{SO_VERSION})) {
+               print "$lib->{NAME}: Please specify SO_VERSION when specifying VERSION\n";
                return;
        }
 
-       $lib->{OUTPUT_TYPE} = "SHARED_LIBRARY";
-       $lib->{MAJOR_VERSION} = join('', @{$lib->{MAJOR_VERSION}});
-       $lib->{MINOR_VERSION} = join('', @{$lib->{MINOR_VERSION}});
-       $lib->{RELEASE_VERSION} = join('', @{$lib->{RELEASE_VERSION}});
+       if (defined($lib->{SO_VERSION}) and not defined($lib->{VERSION})) {
+               print "$lib->{NAME}: Please specify VERSION when specifying SO_VERSION\n";
+               return;
+       }
+
+       unless (defined($lib->{INIT_FUNCTION_TYPE})) {
+               $lib->{INIT_FUNCTION_TYPE} = "NTSTATUS (*) (void)";
+       }
+
+       $lib->{INSTALLDIR} = "LIBDIR";
 }
 
 sub check_binary($$)
 {
-       my $CTX = shift;
-       my $bin = shift;
+       my ($INPUT, $bin) = @_;
 
-       if ($bin->{ENABLE} ne "YES") {
-               printf("Binary: %s...disabled\n",$bin->{NAME});
-               return;
-       }
+       return if ($bin->{ENABLE} ne "YES");
 
        ($bin->{BINARY} = (lc $bin->{NAME})) if not defined($bin->{BINARY});
 
        $bin->{OUTPUT_TYPE} = "BINARY";
 }
 
-sub calc_unique_deps
+
+sub import_integrated($$)
 {
-       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;
-               }
-       }
-}
+       my ($lib, $depend) = @_;
 
+       foreach my $mod (values %$depend) {
+               next if(not defined($mod->{SUBSYSTEM}));
+               next if($mod->{SUBSYSTEM} ne $lib->{NAME});
+               next if($mod->{ENABLE} ne "YES");
 
+               push (@{$lib->{FULL_OBJ_LIST}}, "\$($mod->{TYPE}_$mod->{NAME}_FULL_OBJ_LIST)");
+               push (@{$lib->{LINK_FLAGS}}, "\$($mod->{TYPE}_$mod->{NAME}_LINK_FLAGS)");
+               push (@{$lib->{PRIVATE_DEPENDENCIES}}, @{$mod->{PUBLIC_DEPENDENCIES}}) if defined($mod->{PUBLIC_DEPENDENCIES});
+               push (@{$lib->{PRIVATE_DEPENDENCIES}}, @{$mod->{PRIVATE_DEPENDENCIES}}) if defined($mod->{PRIVATE_DEPENDENCIES});
 
-###########################################################
-# This function checks the input from the configure script 
-#
-# check_input($SMB_BUILD_CTX)
-#
-# $SMB_BUILD_CTX -     the global SMB_BUILD context
-sub check($)
+               $mod->{ENABLE} = "NO";
+       }
+}
+
+sub calc_unique_deps($$$$$$)
 {
-       my $CTX = shift;
+       sub calc_unique_deps($$$$$$);
+       my ($name, $INPUT, $deps, $udeps, $withlibs, $busy) = @_;
+
+       foreach my $n (@$deps) {
+               die("Dependency unknown: $n") unless (defined($INPUT->{$n}));
+               die("Recursive dependency: $n, list: " . join(',', @$busy)) if (grep (/^$n$/, @$busy));
+               next if (grep /^$n$/, @$udeps);
+               my $dep = $INPUT->{$n};
+
+               if (defined ($dep->{OUTPUT_TYPE}) && 
+                       ($withlibs or 
+                       ($dep->{OUTPUT_TYPE} eq "INTEGRATED") or 
+                       ($dep->{OUTPUT_TYPE} eq "STATIC_LIBRARY"))) {
+                               push (@$busy, $dep->{NAME});
+                               calc_unique_deps($dep->{NAME}, $INPUT, $dep->{PUBLIC_DEPENDENCIES}, $udeps, $withlibs, $busy);
+                               calc_unique_deps($dep->{NAME}, $INPUT, $dep->{PRIVATE_DEPENDENCIES}, $udeps, $withlibs, $busy);
+                               pop (@$busy);
+               }
+
+               unshift (@{$udeps}, $dep->{NAME});
+       }
+}
 
-       ($subsystem_output_type = $ENV{SUBSYSTEM_OUTPUT_TYPE}) if (defined($ENV{"SUBSYSTEM_OUTPUT_TYPE"}));
+sub check($$$$$)
+{
+       my ($INPUT, $enabled, $subsys_ot, $lib_ot, $module_ot) = @_;
+
+       foreach my $part (values %$INPUT) {
+               unless (defined($part->{STANDARD_VISIBILITY})) {
+                       if ($part->{TYPE} eq "MODULE" or $part->{TYPE} eq "BINARY") {
+                               $part->{STANDARD_VISIBILITY} = "hidden";
+                       } else {
+                               $part->{STANDARD_VISIBILITY} = "default";
+                       }
+               }
 
-       foreach my $part (values %{$CTX->{INPUT}}) {
-               ($part->{ENABLE} = "YES") if not defined($part->{ENABLE});
-       }
+               unless (defined($part->{CFLAGS})) {
+                       $part->{CFLAGS} = "";
+               }
 
-       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");
+               unless (defined($part->{PUBLIC_HEADERS})) {
+                       $part->{PUBLIC_HEADERS} = [];
+               }
+               
+               if (defined($part->{PUBLIC_PROTO_HEADER})) {
+                       push (@{$part->{PUBLIC_HEADERS}}, $part->{PUBLIC_PROTO_HEADER});
+               }
 
-               #FIXME: REQUIRED_LIBRARIES needs to go
-               if (defined($part->{REQUIRED_LIBRARIES})) {
-                       push(@{$part->{REQUIRED_SUBSYSTEMS}}, @{$part->{REQUIRED_LIBRARIES}});
-                       delete ($part->{REQUIRED_LIBRARIES});
+               if (defined($enabled->{$part->{NAME}})) { 
+                       $part->{ENABLE} = $enabled->{$part->{NAME}};
+                       next;
+               }
+               
+               unless(defined($part->{ENABLE})) {
+                       if ($part->{TYPE} eq "EXT_LIB") {
+                               $part->{ENABLE} = "NO";
+                       } else {
+                               $part->{ENABLE} = "YES";
+                       }
                }
        }
 
-       my %depend = %{$CTX->{INPUT}};
+       foreach my $k (keys %$INPUT) {
+               my $part = $INPUT->{$k};
 
-       foreach my $part (values %depend) {
-               
-               # Generate list of dependencies
-               $part->{DEPENDENCIES} = [];
+               $part->{FULL_OBJ_LIST} = ["\$($part->{TYPE}_$part->{NAME}_OBJ_LIST)"];
 
-               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_subsystem($INPUT, $part, $subsys_ot) if ($part->{TYPE} eq "SUBSYSTEM");
+               check_module($INPUT, $part, $module_ot) if ($part->{TYPE} eq "MODULE");
+               check_library($INPUT, $part, $lib_ot) if ($part->{TYPE} eq "LIBRARY");
+               check_binary($INPUT, $part) if ($part->{TYPE} eq "BINARY");
+       }
+
+       foreach my $part (values %$INPUT) {
+               import_integrated($part, $INPUT);
+       }
 
-               delete ($part->{REQUIRED_SUBSYSTEMS});
+       foreach my $part (values %$INPUT) {
+               $part->{UNIQUE_DEPENDENCIES} = [];
+               calc_unique_deps($part->{NAME}, $INPUT, $part->{PUBLIC_DEPENDENCIES}, $part->{UNIQUE_DEPENDENCIES}, 0, []);
+               calc_unique_deps($part->{NAME}, $INPUT, $part->{PRIVATE_DEPENDENCIES}, $part->{UNIQUE_DEPENDENCIES}, 0, []);
        }
 
-       foreach my $part (values %depend) {
-               $part->{UNIQUE_DEPENDENCIES} = {};
-               calc_unique_deps($part->{DEPENDENCIES}, $part->{UNIQUE_DEPENDENCIES});
+       foreach my $part (values %$INPUT) {
+               $part->{UNIQUE_DEPENDENCIES_ALL} = [];
+               calc_unique_deps($part->{NAME}, $INPUT, $part->{PUBLIC_DEPENDENCIES}, $part->{UNIQUE_DEPENDENCIES_ALL}, 1, []);
+               calc_unique_deps($part->{NAME}, $INPUT, $part->{PRIVATE_DEPENDENCIES}, $part->{UNIQUE_DEPENDENCIES_ALL}, 1, []);
        }
 
-       return %depend;
+       return $INPUT;
 }
 
 1;