r8942: Move intermediate subsystem output files to bin/subsystems/
[sfrench/samba-autobuild/.git] / source4 / build / smb_build / output.pm
index 6972817ca9f0aa93fc8e9b0f9f3b793c5b9e521c..b126440dd444fa01251bebe3ad465eff57067064 100644 (file)
 package output;
 use strict;
 
+sub generate_mergedobj($)
+{
+       my $subsys = shift;
+
+       $subsys->{OUTPUT} = $subsys->{TARGET} = "bin/subsystems/$subsys->{TYPE}_$subsys->{NAME}.o";
+}
+
 sub generate_objlist($)
 {
        my $subsys = shift;
 
-       $subsys->{TARGET} = $subsys->{OUTPUT} = "\$($subsys->{TYPE}_$subsys->{NAME}_OBJS)";
+       $subsys->{TARGET} = "bin/.$subsys->{TYPE}_$subsys->{NAME}";
+       $subsys->{OUTPUT} = "\$($subsys->{TYPE}_$subsys->{NAME}_OBJS)";
 }
 
 sub generate_shared_library($)
 {
        my $lib = shift;
 
-       @{$lib->{DEPEND_LIST}} = ("\$($lib->{TYPE}_$lib->{NAME}\_OBJS)");
+       @{$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}";
@@ -38,7 +46,7 @@ sub generate_static_library($)
 {
        my $lib = shift;
 
-       @{$lib->{DEPEND_LIST}} = ("\$($lib->{TYPE}_$lib->{NAME}\_OBJS)");
+       @{$lib->{DEPEND_LIST}} = ();
 
        $lib->{LIBRARY_NAME} = lc($lib->{NAME}).".a";
        @{$lib->{LINK_LIST}} = ("\$($lib->{TYPE}_$lib->{NAME}\_OBJS)");
@@ -52,7 +60,7 @@ sub generate_binary($)
 {
        my $bin = shift;
 
-       @{$bin->{DEPEND_LIST}} = ("\$($bin->{TYPE}_$bin->{NAME}\_OBJS)");
+       @{$bin->{DEPEND_LIST}} = ();
        @{$bin->{LINK_LIST}} = ("\$($bin->{TYPE}_$bin->{NAME}\_OBJS)");
        @{$bin->{LINK_FLAGS}} = ();
 
@@ -63,39 +71,66 @@ sub generate_binary($)
 sub create_output($)
 {
        my $depend = shift;
-       my %output = ();
        my $part;
 
-       $depend->{PROTO}{OUTPUT_TYPE} = "OBJLIST";
-       $depend->{PROTO}{TYPE} = "PROTO";
-       $depend->{PROTO}{NAME} = "PROTO";
-       
+       $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});
+
+               if ((not defined($part->{OBJ_LIST}) or 
+                       scalar(@{$part->{OBJ_LIST}}) == 0) and 
+                       $part->{OUTPUT_TYPE} eq "MERGEDOBJ") {
+                       $part->{OUTPUT_TYPE} = "OBJLIST";
+               }
+
                generate_binary($part) if $part->{OUTPUT_TYPE} eq "BINARY";
+               generate_mergedobj($part) if $part->{OUTPUT_TYPE} eq "MERGEDOBJ";
                generate_objlist($part) if $part->{OUTPUT_TYPE} eq "OBJLIST";
                generate_shared_library($part) if $part->{OUTPUT_TYPE} eq "SHARED_LIBRARY";
                generate_static_library($part) if $part->{OUTPUT_TYPE} eq "STATIC_LIBRARY";
 
-               # 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(@{$depend->{PROTO}{OBJ_LIST}}, @{$part->{OBJ_LIST}}) if ((not defined ($part->{NOPROTO}) or $part->{NOPROTO} eq "NO") and defined(@{$part->{OBJ_LIST}}));
+               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}) {
                next if not defined($part->{OUTPUT_TYPE});
 
+               foreach (@{$part->{DEPENDENCIES}}) {
+                       my $elem = $$_;
+                       push(@{$part->{DEPEND_LIST}}, $elem->{TARGET}) if defined($elem->{TARGET});
+               }
+
                # Always import the CFLAGS and CPPFLAGS of the unique dependencies
                foreach my $elem (values %{$part->{UNIQUE_DEPENDENCIES}}) {
                        next if $elem == $part;
 
                        push(@{$part->{CPPFLAGS}}, @{$elem->{CPPFLAGS}}) if defined(@{$elem->{CPPFLAGS}});
                        push(@{$part->{CFLAGS}}, @{$elem->{CFLAGS}}) if defined(@{$elem->{CFLAGS}});
-                       push(@{$part->{DEPEND_LIST}}, $elem->{TARGET}) if defined($elem->{TARGET});
                        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});