1 ###########################################################
2 ### SMB Build System ###
3 ### - the output generating functions ###
5 ### Copyright (C) Stefan (metze) Metzmacher 2004 ###
6 ### Released under the GNU GPL ###
7 ###########################################################
9 sub _generate_ext_libs($)
14 # loop over all binaries
16 foreach my $key (sort keys %{$CTX->{DEPEND}{EXT_LIBS}}) {
17 my $NAME = $CTX->{INPUT}{EXT_LIBS}{$key}{NAME};
22 $CTX->{OUTPUT}{EXT_LIBS}{$key}{NAME} = $NAME;
23 @{$CTX->{OUTPUT}{EXT_LIBS}{$key}{LIBS}} = @{$CTX->{DEPEND}{EXT_LIBS}{$key}{LIBS}};
24 @{$CTX->{OUTPUT}{EXT_LIBS}{$key}{CFLAGS}} = @{$CTX->{DEPEND}{EXT_LIBS}{$key}{CFLAGS}};
25 @{$CTX->{OUTPUT}{EXT_LIBS}{$key}{CPPFLAGS}} = @{$CTX->{DEPEND}{EXT_LIBS}{$key}{CPPFLAGS}};
26 @{$CTX->{OUTPUT}{EXT_LIBS}{$key}{LDFLAGS}} = @{$CTX->{DEPEND}{EXT_LIBS}{$key}{LDFLAGS}};
32 sub _generate_subsystems($)
37 # loop over all subsystems
39 foreach my $key (sort keys %{$CTX->{DEPEND}{SUBSYSTEMS}}) {
40 my $NAME = $CTX->{INPUT}{SUBSYSTEMS}{$key}{NAME};
41 my @OBJ_LIST = @{$CTX->{DEPEND}{SUBSYSTEMS}{$key}{OBJ_LIST}};
43 if ($CTX->{INPUT}{SUBSYSTEMS}{$key}{NOPROTO} ne "YES") {
44 push(@{$CTX->{OUTPUT}{PROTO}{OBJ_LIST}},"\$(SUBSYSTEM_$key\_OBJS)");
50 $CTX->{OUTPUT}{SUBSYSTEMS}{$key}{NAME} = $NAME;
51 @{$CTX->{OUTPUT}{SUBSYSTEMS}{$key}{OBJ_LIST}} = @OBJ_LIST;
57 sub _generate_shared_modules($)
62 # loop over all shared modules
64 foreach my $key (sort keys %{$CTX->{DEPEND}{SHARED_MODULES}}) {
65 my $NAME = $CTX->{INPUT}{MODULES}{$key}{NAME};
68 my $MODULE = $NAME.".so";
69 my @DEPEND_LIST = ("\$(MODULE_$NAME\_OBJS)");
70 my @LINK_LIST = ("\$(MODULE_$NAME\_OBJS)");
73 push(@{$CTX->{OUTPUT}{PROTO}{OBJ_LIST}},"\$(MODULE_$key\_OBJS)");
74 push(@{$CTX->{OUTPUT}{TARGETS}{ALL}{DEPEND_LIST}},"bin/$MODULE");
76 push(@OBJ_LIST,@{$CTX->{INPUT}{MODULES}{$key}{INIT_OBJ_FILES}});
77 push(@OBJ_LIST,@{$CTX->{INPUT}{MODULES}{$key}{ADD_OBJ_FILES}});
79 foreach my $elem (@{$CTX->{DEPEND}{SHARED_MODULES}{$key}{SUBSYSTEMS_LIST}}) {
80 if (!defined($CTX->{DEPEND}{SUBSYSTEMS}{$elem})) {
81 die("Shared Module[$NAME] depends on unknown Subsystem[$elem]!\n");
83 push(@DEPEND_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
84 push(@LINK_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
87 foreach my $elem (@{$CTX->{DEPEND}{SHARED_MODULES}{$key}{LIBRARIES_LIST}}) {
88 if (!defined($CTX->{DEPEND}{EXT_LIBS}{$elem})) {
89 die("Share Module[$NAME] depends on unknown External Library[$elem]!\n");
91 push(@LINK_LIST,@{$CTX->{DEPEND}{EXT_LIBS}{$elem}{LIBS}});
92 push(@LINK_FLAGS,@{$CTX->{DEPEND}{EXT_LIBS}{$elem}{LDFLAGS}});
98 $CTX->{OUTPUT}{SHARED_MODULES}{$key}{NAME} = $NAME;
99 @{$CTX->{OUTPUT}{SHARED_MODULES}{$key}{OBJ_LIST}} = @OBJ_LIST;
101 $CTX->{OUTPUT}{SHARED_MODULES}{$key}{MODULE} = $MODULE;
102 @{$CTX->{OUTPUT}{SHARED_MODULES}{$key}{DEPEND_LIST}} = @DEPEND_LIST;
103 @{$CTX->{OUTPUT}{SHARED_MODULES}{$key}{LINK_LIST}} = @LINK_LIST;
104 @{$CTX->{OUTPUT}{SHARED_MODULES}{$key}{LINK_FLAGS}} = @LINK_FLAGS;
110 sub _generate_libraries($)
115 # loop over all binaries
117 foreach my $key (sort keys %{$CTX->{DEPEND}{LIBRARIES}}) {
118 my $NAME = $CTX->{INPUT}{LIBRARIES}{$key}{NAME};
119 my @OBJ_LIST = @{$CTX->{INPUT}{LIBRARIES}{$key}{OBJ_FILES}};
120 my $MAJOR_VERSION = $CTX->{INPUT}{LIBRARIES}{$key}{MAJOR_VERSION};
121 my $MINOR_VERSION = $CTX->{INPUT}{LIBRARIES}{$key}{MINOR_VERSION};
122 my $RELEASE_VERSION = $CTX->{INPUT}{LIBRARIES}{$key}{RELEASE_VERSION};
124 my @DEPEND_LIST = ("\$(LIBRARY_$NAME\_OBJS)");
126 my $STATIC_LIBRARY_NAME = $NAME.".a";
127 my @STATIC_LINK_LIST = ("\$(LIBRARY_$NAME\_OBJS)");
128 my @STATIC_LINK_FLAGS = ();
130 my $SHARED_LIBRARY_NAME = $NAME.".so";
131 my $SHARED_LIBRARY_SONAME = $SHARED_LIBRARY_NAME.".$MAJOR_VERSION";
132 my $SHARED_LIBRARY_REALNAME = $SHARED_LIBRARY_SONAME.".$MINOR_VERSION.$RELEASE_VERSION";
133 my @SHARED_LINK_LIST = ("\$(LIBRARY_$NAME\_OBJS)");
134 my @SHARED_LINK_FLAGS = ("\@SONAMEFLAG\@$SHARED_LIBRARY_SONAME");
136 push(@{$CTX->{OUTPUT}{PROTO}{OBJ_LIST}},"\$(LIBRARY_$key\_OBJS)");
139 # not add to 'make all' for now
142 foreach my $elem (@{$CTX->{DEPEND}{LIBRARIES}{$key}{SUBSYSTEMS_LIST}}) {
143 if (!defined($CTX->{DEPEND}{SUBSYSTEMS}{$elem})) {
144 die("Library[$NAME] depends on unknown Subsystem[$elem]!\n");
146 push(@DEPEND_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
147 push(@STATIC_LINK_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
148 push(@SHARED_LINK_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
151 foreach my $elem (@{$CTX->{DEPEND}{LIBRARIES}{$key}{LIBRARIES_LIST}}) {
152 if (!defined($CTX->{DEPEND}{EXT_LIBS}{$elem})) {
153 die("Library[$NAME] depends on unknown External Library[$elem]!\n");
155 push(@SHARED_LINK_LIST,@{$CTX->{DEPEND}{EXT_LIBS}{$elem}{LIBS}});
156 push(@SHARED_LINK_FLAGS,@{$CTX->{DEPEND}{EXT_LIBS}{$elem}{LDFLAGS}});
162 $CTX->{OUTPUT}{LIBRARIES}{$key}{NAME} = $NAME;
163 @{$CTX->{OUTPUT}{LIBRARIES}{$key}{OBJ_LIST}} = @OBJ_LIST;
165 @{$CTX->{OUTPUT}{LIBRARIES}{$key}{DEPEND_LIST}} = @DEPEND_LIST;
167 $CTX->{OUTPUT}{LIBRARIES}{$key}{STATIC_LIBRARY_NAME} = $STATIC_LIBRARY_NAME;
168 @{$CTX->{OUTPUT}{LIBRARIES}{$key}{STATIC_LINK_LIST}} = @STATIC_LINK_LIST;
169 @{$CTX->{OUTPUT}{LIBRARIES}{$key}{STATIC_LINK_FLAGS}} = @STATIC_LINK_FLAGS;
171 $CTX->{OUTPUT}{LIBRARIES}{$key}{SHARED_LIBRARY_NAME} = $SHARED_LIBRARY_NAME;
172 $CTX->{OUTPUT}{LIBRARIES}{$key}{SHARED_LIBRARY_REALNAME} = $SHARED_LIBRARY_REALNAME;
173 $CTX->{OUTPUT}{LIBRARIES}{$key}{SHARED_LIBRARY_SONAME} = $SHARED_LIBRARY_SONAME;
174 @{$CTX->{OUTPUT}{LIBRARIES}{$key}{SHARED_LINK_LIST}} = @SHARED_LINK_LIST;
175 @{$CTX->{OUTPUT}{LIBRARIES}{$key}{SHARED_LINK_FLAGS}} = @SHARED_LINK_FLAGS;
181 sub _generate_binaries($)
186 # loop over all binaries
188 foreach my $key (sort keys %{$CTX->{DEPEND}{BINARIES}}) {
189 my $NAME = $CTX->{INPUT}{BINARIES}{$key}{NAME};
190 my @OBJ_LIST = @{$CTX->{INPUT}{BINARIES}{$key}{OBJ_FILES}};
193 my @DEPEND_LIST = ("\$(BINARY_$NAME\_OBJS)");
194 my @LINK_LIST = ("\$(BINARY_$NAME\_OBJS)");
197 push(@{$CTX->{OUTPUT}{PROTO}{OBJ_LIST}},"\$(BINARY_$key\_OBJS)");
198 push(@{$CTX->{OUTPUT}{TARGETS}{ALL}{DEPEND_LIST}},"bin/$BINARY");
200 foreach my $elem (@{$CTX->{DEPEND}{BINARIES}{$key}{SUBSYSTEMS_LIST}}) {
201 if (!defined($CTX->{DEPEND}{SUBSYSTEMS}{$elem})) {
202 die("Binary[$NAME] depends on unknown Subsystem[$elem]!\n");
204 push(@DEPEND_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
205 push(@LINK_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
208 foreach my $elem (@{$CTX->{DEPEND}{BINARIES}{$key}{LIBRARIES_LIST}}) {
209 if (!defined($CTX->{DEPEND}{EXT_LIBS}{$elem})) {
210 die("Binary[$NAME] depends on unknown External Library[$elem]!\n");
212 push(@LINK_LIST,@{$CTX->{DEPEND}{EXT_LIBS}{$elem}{LIBS}});
213 push(@LINK_FLAGS,@{$CTX->{DEPEND}{EXT_LIBS}{$elem}{LDFLAGS}});
216 # Export all symbols...
217 push(@LINK_FLAGS,@{$CTX->{BUILD_ENV}{LD}{DYNEXP}});
222 $CTX->{OUTPUT}{BINARIES}{$key}{NAME} = $NAME;
223 @{$CTX->{OUTPUT}{BINARIES}{$key}{OBJ_LIST}} = @OBJ_LIST;
225 $CTX->{OUTPUT}{BINARIES}{$key}{BINARY} = $BINARY;
226 @{$CTX->{OUTPUT}{BINARIES}{$key}{DEPEND_LIST}} = @DEPEND_LIST;
227 @{$CTX->{OUTPUT}{BINARIES}{$key}{LINK_LIST}} = @LINK_LIST;
228 @{$CTX->{OUTPUT}{BINARIES}{$key}{LINK_FLAGS}} = @LINK_FLAGS;
234 ###########################################################
235 # This function generates the output
237 # create_output($SMB_BUILD_CTX)
239 # $SMB_BUILD_CTX - the global SMB_BUILD context
244 $CTX->{OUTPUT}{PROTO} = ();
245 @{$CTX->{OUTPUT}{PROTO}{OBJ_LIST}} = ();
247 $CTX->{OUTPUT}{TARGETS}{ALL} = ();
248 $CTX->{OUTPUT}{TARGETS}{ALL}{TARGET} = "all";
249 @{$CTX->{OUTPUT}{TARGETS}{ALL}{DEPEND_LIST}} = ();
251 _generate_ext_libs($CTX);
253 _generate_subsystems($CTX);
255 _generate_shared_modules($CTX);
257 _generate_libraries($CTX);
259 _generate_binaries($CTX);