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 generate_shared_library($)
|
---|
12 | {
|
---|
13 | my $lib = shift;
|
---|
14 | my $link_name;
|
---|
15 | my $lib_name;
|
---|
16 |
|
---|
17 | $lib->{DEPEND_LIST} = [];
|
---|
18 |
|
---|
19 | $link_name = lc($lib->{NAME});
|
---|
20 | $lib_name = $link_name;
|
---|
21 |
|
---|
22 | if ($lib->{TYPE} eq "LIBRARY") {
|
---|
23 | $link_name = $lib->{NAME};
|
---|
24 | $link_name =~ s/^LIB//;
|
---|
25 | $link_name = lc($link_name);
|
---|
26 | $lib_name = "lib$link_name";
|
---|
27 | }
|
---|
28 |
|
---|
29 | if ($lib->{TYPE} eq "PYTHON") {
|
---|
30 | $lib->{SHAREDDIR} = "bin/python";
|
---|
31 | } elsif (defined($lib->{LIBRARY_REALNAME})) {
|
---|
32 | $lib->{BASEDIR} =~ s/^\.\///g;
|
---|
33 | $lib->{SHAREDDIR} = $lib->{BASEDIR};
|
---|
34 | } else {
|
---|
35 | if ($lib->{TYPE} eq "MODULE") {
|
---|
36 | my $sane_subsystem = lc($lib->{SUBSYSTEM});
|
---|
37 | $sane_subsystem =~ s/^lib//;
|
---|
38 | $lib->{SHAREDDIR} = "bin/modules/$sane_subsystem";
|
---|
39 | $lib->{LIBRARY_REALNAME} = $link_name;
|
---|
40 | $lib->{LIBRARY_REALNAME} =~ s/^$sane_subsystem\_//g;
|
---|
41 | $lib->{LIBRARY_REALNAME}.= ".\$(SHLIBEXT)";
|
---|
42 | } else {
|
---|
43 | $lib->{SHAREDDIR} = "\$(shliboutputdir)";
|
---|
44 | $lib->{LIBRARY_REALNAME} = "$lib_name.\$(SHLIBEXT)";
|
---|
45 | }
|
---|
46 | }
|
---|
47 |
|
---|
48 | $lib->{LIBRARY_DEBUGNAME} = $lib->{LIBRARY_REALNAME};
|
---|
49 |
|
---|
50 | $lib->{LIBRARY_SONAME} = "\$(if \$($lib->{NAME}_SOVERSION),$lib->{LIBRARY_REALNAME}.\$($lib->{NAME}_SOVERSION),$lib->{LIBRARY_REALNAME})";
|
---|
51 | $lib->{LIBRARY_REALNAME} = "\$(if \$($lib->{NAME}_VERSION),$lib->{LIBRARY_REALNAME}.\$($lib->{NAME}_VERSION),$lib->{LIBRARY_REALNAME})";
|
---|
52 |
|
---|
53 | $lib->{RESULT_SHARED_LIBRARY} = "$lib->{SHAREDDIR}/$lib->{LIBRARY_REALNAME}";
|
---|
54 | $lib->{OUTPUT_SHARED_LIBRARY} = "-l$link_name";
|
---|
55 | $lib->{TARGET_SHARED_LIBRARY} = "$lib->{SHAREDDIR}/$lib->{LIBRARY_DEBUGNAME}";
|
---|
56 | }
|
---|
57 |
|
---|
58 | sub generate_merged_obj($)
|
---|
59 | {
|
---|
60 | my $lib = shift;
|
---|
61 |
|
---|
62 | my $link_name = $lib->{NAME};
|
---|
63 | $link_name =~ s/^LIB//;
|
---|
64 |
|
---|
65 | $lib->{MERGED_OBJNAME} = lc($link_name).".o";
|
---|
66 | $lib->{RESULT_MERGED_OBJ} = $lib->{OUTPUT_MERGED_OBJ} = "bin/mergedobj/$lib->{MERGED_OBJNAME}";
|
---|
67 | $lib->{TARGET_MERGED_OBJ} = $lib->{RESULT_MERGED_OBJ};
|
---|
68 | }
|
---|
69 |
|
---|
70 | sub generate_static_library($)
|
---|
71 | {
|
---|
72 | my $lib = shift;
|
---|
73 | my $link_name;
|
---|
74 |
|
---|
75 | $lib->{DEPEND_LIST} = [];
|
---|
76 |
|
---|
77 | $link_name = $lib->{NAME};
|
---|
78 | $link_name =~ s/^LIB//;
|
---|
79 |
|
---|
80 | $lib->{LIBRARY_NAME} = "lib".lc($link_name).".a";
|
---|
81 |
|
---|
82 | $lib->{RESULT_STATIC_LIBRARY} = "bin/static/$lib->{LIBRARY_NAME}";
|
---|
83 | $lib->{TARGET_STATIC_LIBRARY} = $lib->{RESULT_STATIC_LIBRARY};
|
---|
84 | $lib->{STATICDIR} = 'bin/static';
|
---|
85 | $lib->{OUTPUT_STATIC_LIBRARY} = "-l".lc($link_name);
|
---|
86 | }
|
---|
87 |
|
---|
88 | sub generate_binary($)
|
---|
89 | {
|
---|
90 | my $bin = shift;
|
---|
91 |
|
---|
92 | $bin->{DEPEND_LIST} = [];
|
---|
93 | push(@{$bin->{LINK_FLAGS}}, "\$($bin->{NAME}\_FULL_OBJ_LIST)");
|
---|
94 |
|
---|
95 | $bin->{DEBUGDIR} = "bin";
|
---|
96 | $bin->{RESULT_BINARY} = $bin->{OUTPUT_BINARY} = "$bin->{DEBUGDIR}/$bin->{NAME}";
|
---|
97 | $bin->{TARGET_BINARY} = $bin->{RESULT_BINARY};
|
---|
98 | $bin->{BINARY} = $bin->{NAME};
|
---|
99 | }
|
---|
100 |
|
---|
101 | sub merge_array($$)
|
---|
102 | {
|
---|
103 | # $dest is a reference to an array
|
---|
104 | # $src is an array
|
---|
105 | my ($dest, $src) = @_;
|
---|
106 |
|
---|
107 | return unless defined($src);
|
---|
108 | return unless ($#{$src} >= 0);
|
---|
109 |
|
---|
110 | foreach my $line (@{$src}) {
|
---|
111 | next if (grep /^$line$/, @{$$dest});
|
---|
112 | push(@{$$dest}, $line);
|
---|
113 | }
|
---|
114 | }
|
---|
115 |
|
---|
116 | sub create_output($$)
|
---|
117 | {
|
---|
118 | my ($depend, $config) = @_;
|
---|
119 | my $part;
|
---|
120 |
|
---|
121 | foreach $part (values %{$depend}) {
|
---|
122 | next unless(defined($part->{OUTPUT_TYPE}));
|
---|
123 |
|
---|
124 | generate_binary($part) if grep(/BINARY/, @{$part->{OUTPUT_TYPE}});
|
---|
125 | generate_shared_library($part) if grep(/SHARED_LIBRARY/, @{$part->{OUTPUT_TYPE}});
|
---|
126 | generate_static_library($part) if grep(/STATIC_LIBRARY/, @{$part->{OUTPUT_TYPE}});
|
---|
127 | generate_merged_obj($part) if grep(/MERGED_OBJ/, @{$part->{OUTPUT_TYPE}});
|
---|
128 | $part->{OUTPUT} = $part->{"OUTPUT_" . @{$part->{OUTPUT_TYPE}}[0]};
|
---|
129 | $part->{TARGET} = $part->{"TARGET_" . @{$part->{OUTPUT_TYPE}}[0]};
|
---|
130 | }
|
---|
131 |
|
---|
132 | foreach $part (values %{$depend}) {
|
---|
133 | next if not defined($part->{OUTPUT_TYPE});
|
---|
134 |
|
---|
135 | merge_array(\$part->{FINAL_CFLAGS}, $part->{CPPFLAGS});
|
---|
136 | merge_array(\$part->{FINAL_CFLAGS}, $part->{CFLAGS});
|
---|
137 |
|
---|
138 | foreach (@{$part->{UNIQUE_DEPENDENCIES_ALL}}) {
|
---|
139 | my $elem = $depend->{$_};
|
---|
140 | next if $elem == $part;
|
---|
141 |
|
---|
142 | merge_array(\$part->{FINAL_CFLAGS}, $elem->{CPPFLAGS});
|
---|
143 | merge_array(\$part->{FINAL_CFLAGS}, $elem->{CFLAGS});
|
---|
144 | }
|
---|
145 |
|
---|
146 | # Always import the link options of the unique dependencies
|
---|
147 | foreach (@{$part->{UNIQUE_DEPENDENCIES_LINK}}) {
|
---|
148 | my $elem = $depend->{$_};
|
---|
149 | next if $elem == $part;
|
---|
150 |
|
---|
151 | push(@{$part->{LINK_FLAGS}}, @{$elem->{LIBS}}) if defined($elem->{LIBS});
|
---|
152 | push(@{$part->{LINK_FLAGS}}, @{$elem->{LDFLAGS}}) if defined($elem->{LDFLAGS});
|
---|
153 | if (defined($elem->{OUTPUT_TYPE}) and @{$elem->{OUTPUT_TYPE}}[0] eq "MERGED_OBJ") {
|
---|
154 | push (@{$part->{FULL_OBJ_LIST}}, $elem->{TARGET});
|
---|
155 | } else {
|
---|
156 | push(@{$part->{LINK_FLAGS}}, "\$($elem->{NAME}_OUTPUT)") if defined($elem->{OUTPUT});
|
---|
157 | push(@{$part->{DEPEND_LIST}}, $elem->{TARGET}) if (defined($elem->{TARGET}));
|
---|
158 | }
|
---|
159 | }
|
---|
160 | }
|
---|
161 |
|
---|
162 | foreach $part (values %{$depend}) {
|
---|
163 | if (defined($part->{STANDARD_VISIBILITY}) and ($part->{STANDARD_VISIBILITY} ne "default") and
|
---|
164 | ($config->{visibility_attribute} eq "yes")) {
|
---|
165 | push(@{$part->{FINAL_CFLAGS}}, "-fvisibility=$part->{STANDARD_VISIBILITY}");
|
---|
166 | }
|
---|
167 | }
|
---|
168 |
|
---|
169 | return $depend;
|
---|
170 | }
|
---|
171 |
|
---|
172 | 1;
|
---|