Merge branch 'v4-0-test' of ssh://git.samba.org/data/git/samba into v4-0-gmake3
[bbaumbach/samba-autobuild/.git] / source4 / build / smb_build / output.pm
index 15ce5a78b0b59aeecbe9005350eaa26e61e4ec8b..f9f12c3a7326717a63fa9e8b419cd343ffc00d4f 100644 (file)
@@ -8,45 +8,13 @@
 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;
-
-       $subsys->{OUTPUT} = $subsys->{TARGET} = "bin/subsystems/$subsys->{TYPE}_$subsys->{NAME}.o";
-}
-
-sub generate_objlist($)
-{
-       my $subsys = shift;
-
-       $subsys->{TARGET} = "bin/.$subsys->{TYPE}_$subsys->{NAME}";
-       $subsys->{OUTPUT} = "\$($subsys->{TYPE}_$subsys->{NAME}_OBJ_LIST)";
-}
-
 sub generate_shared_library($)
 {
        my $lib = shift;
        my $link_name;
        my $lib_name;
 
-       @{$lib->{DEPEND_LIST}} = ();
-       @{$lib->{LINK_LIST}} = ("\$($lib->{TYPE}_$lib->{NAME}\_OBJ_LIST)");
+       $lib->{DEPEND_LIST} = [];
 
        $link_name = lc($lib->{NAME});
        $lib_name = $link_name;
@@ -58,18 +26,45 @@ sub generate_shared_library($)
                $lib_name = "lib$link_name";
        }
 
-       $lib->{BUILDDIR} = "bin";
-       $lib->{INSTALLDIR} = "bin/install";
-       $lib->{LIBRARY_REALNAME} = $lib->{LIBRARY_NAME} = "$lib_name.\$(SHLIBEXT)";
-
-       if (defined($lib->{VERSION})) {
-               $lib->{LIBRARY_SONAME} = $lib->{LIBRARY_NAME}.".$lib->{SO_VERSION}";
-               $lib->{LIBRARY_REALNAME} = $lib->{LIBRARY_NAME}.".$lib->{VERSION}";
-       } elsif ($lib->{TYPE} eq "MODULE") {
-               $lib->{BUILDDIR} = "bin/modules/$lib->{SUBSYSTEM}";
+       if ($lib->{TYPE} eq "PYTHON") {
+               $lib->{SHAREDDIR} = "bin/python";
+       } elsif (defined($lib->{LIBRARY_REALNAME})) {
+               $lib->{BASEDIR} =~ s/^\.\///g;
+               $lib->{SHAREDDIR} = $lib->{BASEDIR};
+       } else {
+               if ($lib->{TYPE} eq "MODULE") {
+                       my $sane_subsystem = lc($lib->{SUBSYSTEM});
+                       $sane_subsystem =~ s/^lib//;
+                       $lib->{SHAREDDIR} = "bin/modules/$sane_subsystem";
+                       $lib->{LIBRARY_REALNAME} = $link_name;
+                       $lib->{LIBRARY_REALNAME} =~ s/^$sane_subsystem\_//g;
+                       $lib->{LIBRARY_REALNAME}.= ".\$(SHLIBEXT)";
+               } else {
+                       $lib->{SHAREDDIR} = "bin/shared";
+                       $lib->{LIBRARY_REALNAME} = "$lib_name.\$(SHLIBEXT)";
+               }
        }
-       $lib->{TARGET} = "$lib->{BUILDDIR}/$lib->{LIBRARY_REALNAME}";
-       $lib->{OUTPUT} = $lib->{TARGET};
+
+       $lib->{LIBRARY_DEBUGNAME} = $lib->{LIBRARY_REALNAME};
+
+       $lib->{LIBRARY_SONAME} = "\$(if \$($lib->{NAME}_SOVERSION),$lib->{LIBRARY_REALNAME}.\$($lib->{NAME}_SOVERSION),$lib->{LIBRARY_REALNAME})";
+       $lib->{LIBRARY_REALNAME} = "\$(if \$($lib->{NAME}_VERSION),$lib->{LIBRARY_REALNAME}.\$($lib->{NAME}_VERSION),$lib->{LIBRARY_REALNAME})";
+       
+       $lib->{RESULT_SHARED_LIBRARY} = "$lib->{SHAREDDIR}/$lib->{LIBRARY_REALNAME}";
+       $lib->{OUTPUT_SHARED_LIBRARY} = "-l$link_name";
+       $lib->{TARGET_SHARED_LIBRARY} = $lib->{RESULT_SHARED_LIBRARY};
+}
+
+sub generate_merged_obj($)
+{
+       my $lib = shift;
+
+       my $link_name = $lib->{NAME};
+       $link_name =~ s/^LIB//;
+
+       $lib->{MERGED_OBJNAME} = lc($link_name).".o";
+       $lib->{RESULT_MERGED_OBJ} = $lib->{OUTPUT_MERGED_OBJ} = "bin/mergedobj/$lib->{MERGED_OBJNAME}";
+       $lib->{TARGET_MERGED_OBJ} = $lib->{RESULT_MERGED_OBJ};
 }
 
 sub generate_static_library($)
@@ -77,82 +72,97 @@ sub generate_static_library($)
        my $lib = shift;
        my $link_name;
 
-       @{$lib->{DEPEND_LIST}} = ();
+       $lib->{DEPEND_LIST} = [];
 
        $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->{LIBRARY_NAME}";
-       $lib->{OUTPUT} = "-l".lc($link_name);
+       $lib->{RESULT_STATIC_LIBRARY} = "bin/static/$lib->{LIBRARY_NAME}";
+       $lib->{TARGET_STATIC_LIBRARY} = $lib->{RESULT_STATIC_LIBRARY};
+       $lib->{STATICDIR} = 'bin/static';
+       $lib->{OUTPUT_STATIC_LIBRARY} = "-l".lc($link_name);
 }
 
 sub generate_binary($)
 {
        my $bin = shift;
 
-       @{$bin->{DEPEND_LIST}} = ();
-       @{$bin->{LINK_LIST}} = ("\$($bin->{TYPE}_$bin->{NAME}\_OBJ_LIST)");
-       @{$bin->{LINK_FLAGS}} = ();
+       $bin->{DEPEND_LIST} = [];
+       push(@{$bin->{LINK_FLAGS}}, "\$($bin->{NAME}\_FULL_OBJ_LIST)");
 
-       $bin->{INSTALLDIR} = "bin/install";
-       $bin->{BUILDDIR} = "bin/";
-       $bin->{TARGET} = $bin->{OUTPUT} = "$bin->{BUILDDIR}/$bin->{NAME}";
+       $bin->{DEBUGDIR} = "bin";
+       $bin->{RESULT_BINARY} = $bin->{OUTPUT_BINARY} = "$bin->{DEBUGDIR}/$bin->{NAME}";
+       $bin->{TARGET_BINARY} = $bin->{RESULT_BINARY};
        $bin->{BINARY} = $bin->{NAME};
 }
 
+sub merge_array($$)
+{
+       # $dest is a reference to an array
+       # $src is an array
+       my ($dest, $src) = @_;
+
+       return unless defined($src);
+       return unless ($#{$src} >= 0);
+
+       foreach my $line (@{$src}) {
+               next if (grep /^$line$/, @{$$dest});
+               push(@{$$dest}, $line);
+       }
+}
+
 sub create_output($$)
 {
        my ($depend, $config) = @_;
        my $part;
 
+       foreach $part (values %{$depend}) {
+               next unless(defined($part->{OUTPUT_TYPE}));
+
+               generate_binary($part) if grep(/BINARY/, @{$part->{OUTPUT_TYPE}});
+               generate_shared_library($part) if grep(/SHARED_LIBRARY/, @{$part->{OUTPUT_TYPE}});
+               generate_static_library($part) if grep(/STATIC_LIBRARY/, @{$part->{OUTPUT_TYPE}});
+               generate_merged_obj($part) if grep(/MERGED_OBJ/, @{$part->{OUTPUT_TYPE}});
+               $part->{OUTPUT} = $part->{"OUTPUT_" . @{$part->{OUTPUT_TYPE}}[0]};
+               $part->{TARGET} = $part->{"TARGET_" . @{$part->{OUTPUT_TYPE}}[0]};
+       }
+
        foreach $part (values %{$depend}) {
                next if not defined($part->{OUTPUT_TYPE});
 
-               # Combine object lists
-               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});
+               merge_array(\$part->{FINAL_CFLAGS}, $part->{CPPFLAGS});
+               merge_array(\$part->{FINAL_CFLAGS}, $part->{CFLAGS});
 
-               if ((not defined($part->{OBJ_LIST}) or 
-                       scalar(@{$part->{OBJ_LIST}}) == 0) and 
-                       $part->{OUTPUT_TYPE} eq "MERGEDOBJ") {
-                       $part->{OUTPUT_TYPE} = "OBJLIST";
-               }
+               foreach (@{$part->{UNIQUE_DEPENDENCIES_ALL}}) {
+                       my $elem = $depend->{$_};
+                       next if $elem == $part;
 
-               if (($part->{STANDARD_VISIBILITY} ne "default") and 
-                       ($config->{visibility_attribute} eq "yes")) {
-                       $part->{EXTRA_CFLAGS} .= " -fvisibility=$part->{STANDARD_VISIBILITY}";
+                       merge_array(\$part->{FINAL_CFLAGS}, $elem->{CPPFLAGS});
+                       merge_array(\$part->{FINAL_CFLAGS}, $elem->{CFLAGS});
                }
 
-               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";
+               # Always import the link options of the unique dependencies
+               foreach (@{$part->{UNIQUE_DEPENDENCIES_LINK}}) {
+                       my $elem = $depend->{$_};
+                       next if $elem == $part;
 
+                       push(@{$part->{LINK_FLAGS}}, @{$elem->{LIBS}}) if defined($elem->{LIBS});
+                       push(@{$part->{LINK_FLAGS}}, @{$elem->{LDFLAGS}}) if defined($elem->{LDFLAGS});
+                       if (defined($elem->{OUTPUT_TYPE}) and @{$elem->{OUTPUT_TYPE}}[0] eq "MERGED_OBJ") {
+                               push (@{$part->{FULL_OBJ_LIST}}, $elem->{TARGET});
+                       } else {
+                               push(@{$part->{LINK_FLAGS}}, "\$($elem->{NAME}_OUTPUT)") if defined($elem->{OUTPUT});
+                               push(@{$part->{DEPEND_LIST}}, $elem->{TARGET}) if (defined($elem->{TARGET}));
+                       }
+               }
        }
 
        foreach $part (values %{$depend}) {
-               next if not defined($part->{OUTPUT_TYPE});
-
-               # 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->{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});
-                       push(@{$part->{SUBSYSTEM_INIT_FUNCTIONS}}, $elem->{INIT_FUNCTION}) if 
-                               defined($elem->{INIT_FUNCTION}) and 
-                               $elem->{TYPE} ne "MODULE" and 
-                               $part->{OUTPUT_TYPE} ne "SHARED_LIBRARY";
+               if (defined($part->{STANDARD_VISIBILITY}) and ($part->{STANDARD_VISIBILITY} ne "default") and 
+                       ($config->{visibility_attribute} eq "yes")) {
+                       push(@{$part->{FINAL_CFLAGS}}, "-fvisibility=$part->{STANDARD_VISIBILITY}");
                }
        }