r18215: use a shorter version
[bbaumbach/samba-autobuild/.git] / source4 / build / smb_build / output.pm
1 # SMB Build System
2 # - the output generating functions
3 #
4 #  Copyright (C) Stefan (metze) Metzmacher 2004
5 #  Copyright (C) Jelmer Vernooij 2004
6 #  Released under the GNU GPL
7
8 package output;
9 use strict;
10
11 sub add_dir($$)
12 {
13         my ($dir,$files) = @_;
14         my @ret = ();
15
16         $dir =~ s/^\.\///g;
17         
18         foreach (@$files) {
19                 if (substr($_, 0, 1) ne "\$") {
20                         $_ = "$dir/$_";
21                         s/([^\/\.]+)\/\.\.\///g;
22                         s/([^\/\.]+)\/\.\.\///g;
23                 }
24                 push (@ret, $_);
25         }
26         
27         return @ret;
28 }
29
30 sub generate_shared_library($)
31 {
32         my $lib = shift;
33         my $link_name;
34         my $lib_name;
35
36         $lib->{DEPEND_LIST} = [];
37         push(@{$lib->{LINK_FLAGS}}, "\$($lib->{TYPE}_$lib->{NAME}\_FULL_OBJ_LIST)");
38
39         $link_name = lc($lib->{NAME});
40         $lib_name = $link_name;
41
42         if ($lib->{TYPE} eq "LIBRARY") {
43                 $link_name = $lib->{NAME};
44                 $link_name =~ s/^LIB//;
45                 $link_name = lc($link_name);
46                 $lib_name = "lib$link_name";
47         }
48
49         if (defined($lib->{LIBRARY_REALNAME})) {
50                 $lib->{BASEDIR} =~ s/^\.\///g;
51                 $lib->{LIBRARY_REALNAME} = "$lib->{LIBRARY_REALNAME}";
52                 $lib->{DEBUGDIR} = $lib->{RELEASEDIR} = $lib->{BASEDIR};
53         } else {
54                 if ($lib->{TYPE} eq "MODULE") {
55                         $lib->{DEBUGDIR} = "bin/modules/$lib->{SUBSYSTEM}";
56                         $lib->{RELEASEDIR} = "bin/install/modules/$lib->{SUBSYSTEM}";
57                         $lib->{LIBRARY_REALNAME} = $link_name;
58                         $lib->{LIBRARY_REALNAME} =~ s/^$lib->{SUBSYSTEM}_//g;
59                         $lib->{LIBRARY_REALNAME}.= ".\$(SHLIBEXT)";
60                 } else {
61                         $lib->{DEBUGDIR} = "bin";
62                         $lib->{RELEASEDIR} = "bin/install";
63                         $lib->{LIBRARY_REALNAME} = "$lib_name.\$(SHLIBEXT)";
64                 }
65         }
66
67         if (defined($lib->{VERSION})) {
68                 $lib->{LIBRARY_SONAME} = "$lib->{LIBRARY_REALNAME}.$lib->{SO_VERSION}";
69                 $lib->{LIBRARY_REALNAME} = "$lib->{LIBRARY_REALNAME}.$lib->{VERSION}";
70         } 
71         
72         $lib->{TARGET} = "$lib->{DEBUGDIR}/$lib->{LIBRARY_REALNAME}";
73         $lib->{OUTPUT} = $lib->{TARGET};
74 }
75
76 sub generate_static_library($)
77 {
78         my $lib = shift;
79         my $link_name;
80
81         $lib->{DEPEND_LIST} = [];
82
83         $link_name = $lib->{NAME};
84         $link_name =~ s/^LIB//;
85
86         $lib->{LIBRARY_NAME} = "lib".lc($link_name).".a";
87         push(@{$lib->{LINK_FLAGS}}, "\$($lib->{TYPE}_$lib->{NAME}\_OBJ_LIST)");
88
89         if (defined($lib->{OBJ_FILES})) {
90                 $lib->{TARGET} = "bin/$lib->{LIBRARY_NAME}";
91         } else {
92                 $lib->{TARGET} = "";
93         }
94         $lib->{OUTPUT} = $lib->{TARGET};
95 }
96
97 sub generate_binary($)
98 {
99         my $bin = shift;
100
101         $bin->{DEPEND_LIST} = [];
102         push(@{$bin->{LINK_FLAGS}}, "\$($bin->{TYPE}_$bin->{NAME}\_OBJ_LIST)");
103
104         $bin->{RELEASEDIR} = "bin/install";
105         $bin->{DEBUGDIR} = "bin/";
106         $bin->{TARGET} = $bin->{OUTPUT} = "$bin->{DEBUGDIR}/$bin->{NAME}";
107         $bin->{BINARY} = $bin->{NAME};
108 }
109
110
111 sub create_output($$)
112 {
113         my ($depend, $config) = @_;
114         my $part;
115
116         foreach $part (values %{$depend}) {
117                 next unless(defined($part->{OUTPUT_TYPE}));
118
119                 # Combine object lists
120                 push(@{$part->{OBJ_LIST}}, add_dir($part->{BASEDIR}, $part->{OBJ_FILES})) if defined($part->{OBJ_FILES});
121
122                 generate_binary($part) if $part->{OUTPUT_TYPE} eq "BINARY";
123                 generate_shared_library($part) if $part->{OUTPUT_TYPE} eq "SHARED_LIBRARY";
124                 generate_static_library($part) if $part->{OUTPUT_TYPE} eq "STATIC_LIBRARY";
125
126         }
127
128         foreach $part (values %{$depend}) {
129                 next if not defined($part->{OUTPUT_TYPE});
130
131                 foreach (@{$part->{UNIQUE_DEPENDENCIES_ALL}}) {
132                         my $elem = $depend->{$_};
133                         next if $elem == $part;
134
135                         push(@{$part->{PUBLIC_CFLAGS}}, @{$elem->{CPPFLAGS}}) if (defined(@{$elem->{CPPFLAGS}}))
136                                                                               and ($#{$elem->{CPPFLAGS}} > 0);
137
138                         next if not defined($elem->{CFLAGS});
139                         next if $elem->{CFLAGS} eq "";
140                         my $found = 0;
141                         foreach my $line (@{$part->{PUBLIC_CFLAGS}}) {
142                                 $found = 1 if ($line eq $elem->{CFLAGS});
143                         }
144                         next if ($found == 1);
145                         push(@{$part->{PUBLIC_CFLAGS}}, $elem->{CFLAGS});
146                 }
147
148
149                 # Always import the CFLAGS and CPPFLAGS of the unique dependencies
150                 foreach (@{$part->{UNIQUE_DEPENDENCIES}}) {
151                         my $elem = $depend->{$_};
152                         next if $elem == $part;
153
154                         push(@{$part->{LINK_FLAGS}}, $elem->{OUTPUT}) if defined($elem->{OUTPUT});
155                         push(@{$part->{LINK_FLAGS}}, @{$elem->{LIBS}}) if defined($elem->{LIBS});
156                         push(@{$part->{LINK_FLAGS}},@{$elem->{LDFLAGS}}) if defined($elem->{LDFLAGS});
157                         push(@{$part->{DEPEND_LIST}}, $elem->{TARGET}) if defined($elem->{TARGET});
158                 }
159         }
160
161         foreach $part (values %{$depend}) {
162                 $part->{CFLAGS} .= " " . join(' ', @{$part->{PUBLIC_CFLAGS}}) if defined($part->{PUBLIC_CFLAGS});
163                 $part->{CFLAGS} .= " " . join(' ', @{$part->{CPPFLAGS}}) if defined($part->{CPPFLAGS});
164                 if (($part->{STANDARD_VISIBILITY} ne "default") and 
165                         ($config->{visibility_attribute} eq "yes")) {
166                         $part->{CFLAGS} .=  " -fvisibility=$part->{STANDARD_VISIBILITY}";
167                 }
168         }
169
170
171         return $depend;
172 }
173
174 1;