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 8package output; 9use strict; 10 11sub 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 58sub 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 70sub 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 88sub 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 101sub 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 116sub 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 1721; 173