r12494: Support loading modules from .so files for most subsystems.
[samba.git] / source4 / build / smb_build / output.pm
index f6c4a78274c8e161d90043879ccd9ca7dee5236b..2fa8e0207a9808a6d3248d1def525190933dc9ba 100644 (file)
@@ -1,15 +1,29 @@
-###########################################################
-### SMB Build System                                   ###
-### - the output generating functions                  ###
-###                                                    ###
-###  Copyright (C) Stefan (metze) Metzmacher 2004      ###
-###  Copyright (C) Jelmer Vernooij 2004        ###
-###  Released under the GNU GPL                                ###
-###########################################################
+# SMB Build System
+# - the output generating functions
+#
+#  Copyright (C) Stefan (metze) Metzmacher 2004
+#  Copyright (C) Jelmer Vernooij 2004
+#  Released under the GNU GPL
 
 package output;
 use strict;
 
+sub add_dir($$)
+{
+       my ($dir,$files) = @_;
+       my @ret = ();
+
+       $dir =~ s/^\.\///g;
+       
+       foreach (@$files) {
+               $_ = "$dir/$_";
+               s/([^\/\.]+)\/\.\.\///g;
+               push (@ret, $_);
+       }
+       
+       return @ret;
+}
+
 sub generate_mergedobj($)
 {
        my $subsys = shift;
@@ -22,38 +36,48 @@ sub generate_objlist($)
        my $subsys = shift;
 
        $subsys->{TARGET} = "bin/.$subsys->{TYPE}_$subsys->{NAME}";
-       $subsys->{OUTPUT} = "\$($subsys->{TYPE}_$subsys->{NAME}_OBJS)";
+       $subsys->{OUTPUT} = "\$($subsys->{TYPE}_$subsys->{NAME}_OBJ_LIST)";
 }
 
 sub generate_shared_library($)
 {
        my $lib = shift;
+       my $link_name;
 
        @{$lib->{DEPEND_LIST}} = ();
-       @{$lib->{LINK_LIST}} = ("\$($lib->{TYPE}_$lib->{NAME}\_OBJS)");
-       $lib->{LIBRARY_NAME} = lc($lib->{NAME}).".so";
-       $lib->{TARGET} = "bin/lib$lib->{LIBRARY_NAME}";
+       @{$lib->{LINK_LIST}} = ("\$($lib->{TYPE}_$lib->{NAME}\_OBJ_LIST)");
+
+       $link_name = $lib->{NAME};
+       $link_name =~ s/^LIB//;
+       $link_name = lc($link_name);
+
+       $lib->{LIBRARY_REALNAME} = $lib->{LIBRARY_NAME} = "lib$link_name.\$(SHLIBEXT)";
+       $lib->{TARGET} = "bin/$lib->{LIBRARY_NAME}";
        if (defined($lib->{MAJOR_VERSION})) {
                $lib->{LIBRARY_SONAME} = $lib->{LIBRARY_NAME}.".$lib->{MAJOR_VERSION}";
                $lib->{LIBRARY_REALNAME} = $lib->{LIBRARY_SONAME}.".$lib->{MINOR_VERSION}.$lib->{RELEASE_VERSION}";
-               $lib->{TARGET} = "bin/lib$lib->{LIBRARY_REALNAME}";
+               $lib->{TARGET} = "bin/$lib->{LIBRARY_REALNAME}";
                @{$lib->{LINK_FLAGS}} = ("\$(SONAMEFLAG)$lib->{LIBRARY_SONAME}");
        }
-       $lib->{OUTPUT} = "-l".lc($lib->{NAME});
+       $lib->{OUTPUT} = "-l$link_name";
 }
 
 sub generate_static_library($)
 {
        my $lib = shift;
+       my $link_name;
 
        @{$lib->{DEPEND_LIST}} = ();
 
-       $lib->{LIBRARY_NAME} = lc($lib->{NAME}).".a";
-       @{$lib->{LINK_LIST}} = ("\$($lib->{TYPE}_$lib->{NAME}\_OBJS)");
+       $link_name = $lib->{NAME};
+       $link_name =~ s/^LIB//;
+
+       $lib->{LIBRARY_NAME} = "lib".lc($link_name).".a";
+       @{$lib->{LINK_LIST}} = ("\$($lib->{TYPE}_$lib->{NAME}\_OBJ_LIST)");
        @{$lib->{LINK_FLAGS}} = ();
 
-       $lib->{TARGET} = "bin/lib$lib->{LIBRARY_NAME}";
-       $lib->{OUTPUT} = "-l".lc($lib->{NAME});
+       $lib->{TARGET} = "bin/$lib->{LIBRARY_NAME}";
+       $lib->{OUTPUT} = "-l".lc($link_name);
 }
 
 sub generate_binary($)
@@ -61,7 +85,7 @@ sub generate_binary($)
        my $bin = shift;
 
        @{$bin->{DEPEND_LIST}} = ();
-       @{$bin->{LINK_LIST}} = ("\$($bin->{TYPE}_$bin->{NAME}\_OBJS)");
+       @{$bin->{LINK_LIST}} = ("\$($bin->{TYPE}_$bin->{NAME}\_OBJ_LIST)");
        @{$bin->{LINK_FLAGS}} = ();
 
        $bin->{TARGET} = $bin->{OUTPUT} = "bin/$bin->{NAME}";
@@ -73,29 +97,13 @@ sub create_output($)
        my $depend = shift;
        my $part;
 
-       $depend->{PROTO} = {
-               OUTPUT_TYPE => "OBJLIST",
-               TYPE => "PROTO",
-               NAME => "PROTO",
-               OBJ_LIST => []
-       };
-
-       $depend->{ALL_OBJS} = {
-               OUTPUT_TYPE => "OBJLIST",
-               TYPE => "",
-               NAME => "ALL_OBJS",
-               OBJ_LIST => []
-       };
-
        foreach $part (values %{$depend}) {
-               next if $part->{NAME} eq "PROTO";
-               next if $part->{NAME} eq "ALL_OBJS";
                next if not defined($part->{OUTPUT_TYPE});
 
                # Combine object lists
-               push(@{$part->{OBJ_LIST}}, @{$part->{INIT_OBJ_FILES}}) if defined($part->{INIT_OBJ_FILES});
-               push(@{$part->{OBJ_LIST}}, @{$part->{ADD_OBJ_FILES}}) if defined($part->{ADD_OBJ_FILES});
-               push(@{$part->{OBJ_LIST}}, @{$part->{OBJ_FILES}}) if defined($part->{OBJ_FILES});
+               push(@{$part->{OBJ_LIST}}, add_dir($part->{BASEDIR}, $part->{INIT_OBJ_FILES})) if defined($part->{INIT_OBJ_FILES});
+               push(@{$part->{OBJ_LIST}}, add_dir($part->{BASEDIR}, $part->{ADD_OBJ_FILES})) if defined($part->{ADD_OBJ_FILES});
+               push(@{$part->{OBJ_LIST}}, add_dir($part->{BASEDIR}, $part->{OBJ_FILES})) if defined($part->{OBJ_FILES});
 
                if ((not defined($part->{OBJ_LIST}) or 
                        scalar(@{$part->{OBJ_LIST}}) == 0) and 
@@ -109,12 +117,6 @@ sub create_output($)
                generate_shared_library($part) if $part->{OUTPUT_TYPE} eq "SHARED_LIBRARY";
                generate_static_library($part) if $part->{OUTPUT_TYPE} eq "STATIC_LIBRARY";
 
-
-               push(@{$depend->{ALL_OBJS}->{OBJ_LIST}}, @{$part->{OBJ_LIST}}) if (defined(@{$part->{OBJ_LIST}}));
-               
-               if ((not defined ($part->{NOPROTO})) or ($part->{NOPROTO} eq "NO")) {
-                       push(@{$depend->{PROTO}->{OBJ_LIST}}, @{$part->{OBJ_LIST}}) if (defined(@{$part->{OBJ_LIST}}));
-               }
        }
 
        foreach $part (values %{$depend}) {
@@ -129,12 +131,14 @@ sub create_output($)
                        push(@{$part->{LINK_LIST}}, $elem->{OUTPUT}) if defined($elem->{OUTPUT});
                        push(@{$part->{LINK_FLAGS}}, @{$elem->{LIBS}}) if defined($elem->{LIBS});
                        push(@{$part->{LINK_FLAGS}},@{$elem->{LDFLAGS}}) if defined($elem->{LDFLAGS});
-                       push(@{$part->{DEPEND_LIST}}, $elem->{TARGET}) if defined($elem->{TARGET});
-
+                       if (defined($elem->{OUTPUT_TYPE}) and ($elem->{OUTPUT_TYPE} eq "SHARED_LIBRARY")) {
+                           push(@{$part->{DEPEND_LIST}}, "bin/$elem->{LIBRARY_NAME}");                     
+                       } else { 
+                           push(@{$part->{DEPEND_LIST}}, $elem->{TARGET}) if defined($elem->{TARGET});
+                       }
                        push(@{$part->{SUBSYSTEM_INIT_FUNCTIONS}}, $elem->{INIT_FUNCTION}) if 
-                               $part->{OUTPUT_TYPE} eq "BINARY" and 
                                defined($elem->{INIT_FUNCTION}) and 
-                               $elem->{INIT_FUNCTION} ne "" and
+                               $elem->{TYPE} ne "MODULE" and 
                                $part->{OUTPUT_TYPE} ne "SHARED_LIBRARY";
                }
        }