99a0eddb435cffe50fa4e60d8695e168b54cbde7
[samba.git] / source4 / build / smb_build / output.pl
1 ###########################################################
2 ### SMB Build System                                    ###
3 ### - the output generating functions                   ###
4 ###                                                     ###
5 ###  Copyright (C) Stefan (metze) Metzmacher 2004       ###
6 ###  Released under the GNU GPL                         ###
7 ###########################################################
8
9 sub _generate_ext_libs($)
10 {
11         my $CTX = shift;
12
13         #
14         # loop over all binaries
15         #
16         foreach my $key (sort keys %{$CTX->{DEPEND}{EXT_LIBS}}) {
17                 my $NAME = $CTX->{INPUT}{EXT_LIBS}{$key}{NAME};
18
19                 #
20                 # set the lists
21                 #
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}};
27         }
28
29         return; 
30 }
31
32 sub _generate_subsystems($)
33 {
34         my $CTX = shift;
35
36         #
37         # loop over all subsystems
38         #
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}};
42
43                 push(@{$CTX->{OUTPUT}{PROTO}{OBJ_LIST}},"\$(SUBSYSTEM_$key\_OBJS)");
44
45                 #
46                 # set the lists
47                 #
48                 $CTX->{OUTPUT}{SUBSYSTEMS}{$key}{NAME} = $NAME;
49                 @{$CTX->{OUTPUT}{SUBSYSTEMS}{$key}{OBJ_LIST}} = @OBJ_LIST;
50         }
51
52         return; 
53 }
54
55 sub _generate_shared_modules($)
56 {
57         my $CTX = shift;
58
59         #
60         # loop over all shared modules
61         #
62         foreach my $key (sort keys %{$CTX->{DEPEND}{SHARED_MODULES}}) {
63                 my $NAME = $CTX->{INPUT}{MODULES}{$key}{NAME};
64                 my @OBJ_LIST = ();
65                 #
66                 my $MODULE = $NAME.".so";
67                 my @DEPEND_LIST = ("\$(MODULE_$NAME\_OBJS)");
68                 my @LINK_LIST = ("\$(MODULE_$NAME\_OBJS)");
69                 my @LINK_FLAGS = ();
70
71                 push(@{$CTX->{OUTPUT}{PROTO}{OBJ_LIST}},"\$(MODULE_$key\_OBJS)");
72                 push(@{$CTX->{OUTPUT}{TARGETS}{ALL}{DEPEND_LIST}},"bin/$MODULE");
73
74                 push(@OBJ_LIST,@{$CTX->{INPUT}{MODULES}{$key}{INIT_OBJ_FILES}});
75                 push(@OBJ_LIST,@{$CTX->{INPUT}{MODULES}{$key}{ADD_OBJ_FILES}});
76
77                 foreach my $elem (@{$CTX->{DEPEND}{SHARED_MODULES}{$key}{SUBSYSTEMS_LIST}}) {
78                         if (!defined($CTX->{DEPEND}{SUBSYSTEMS}{$elem})) {
79                                 die("Shared Module[$NAME] depends on unknown Subsystem[$elem]!\n");
80                         }
81                         push(@DEPEND_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
82                         push(@LINK_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
83                 }
84
85                 foreach my $elem (@{$CTX->{DEPEND}{SHARED_MODULES}{$key}{LIBRARIES_LIST}}) {
86                         if (!defined($CTX->{DEPEND}{EXT_LIBS}{$elem})) {
87                                 die("Share Module[$NAME] depends on unknown External Library[$elem]!\n");
88                         }
89                         push(@LINK_LIST,@{$CTX->{DEPEND}{EXT_LIBS}{$elem}{LIBS}});
90                         push(@LINK_FLAGS,@{$CTX->{DEPEND}{EXT_LIBS}{$elem}{LDFLAGS}});
91                 }
92
93                 #
94                 # set the lists
95                 #
96                 $CTX->{OUTPUT}{SHARED_MODULES}{$key}{NAME} = $NAME;
97                 @{$CTX->{OUTPUT}{SHARED_MODULES}{$key}{OBJ_LIST}} = @OBJ_LIST;
98                 #
99                 $CTX->{OUTPUT}{SHARED_MODULES}{$key}{MODULE} = $MODULE;
100                 @{$CTX->{OUTPUT}{SHARED_MODULES}{$key}{DEPEND_LIST}} = @DEPEND_LIST;
101                 @{$CTX->{OUTPUT}{SHARED_MODULES}{$key}{LINK_LIST}} = @LINK_LIST;
102                 @{$CTX->{OUTPUT}{SHARED_MODULES}{$key}{LINK_FLAGS}} = @LINK_FLAGS;
103         }
104
105         return; 
106 }
107
108 sub _generate_libraries($)
109 {
110         my $CTX = shift;
111
112         #
113         # loop over all binaries
114         #
115         foreach my $key (sort keys %{$CTX->{DEPEND}{LIBRARIES}}) {
116                 my $NAME = $CTX->{INPUT}{LIBRARIES}{$key}{NAME};
117                 my @OBJ_LIST = @{$CTX->{INPUT}{LIBRARIES}{$key}{OBJ_FILES}};
118                 my $MAJOR_VERSION = $CTX->{INPUT}{LIBRARIES}{$key}{MAJOR_VERSION};
119                 my $MINOR_VERSION = $CTX->{INPUT}{LIBRARIES}{$key}{MINOR_VERSION};
120                 my $RELEASE_VERSION = $CTX->{INPUT}{LIBRARIES}{$key}{RELEASE_VERSION};
121                 #
122                 my @DEPEND_LIST = ("\$(LIBRARY_$NAME\_OBJS)");
123
124                 my $STATIC_LIBRARY_NAME = $NAME.".a";
125                 my @STATIC_LINK_LIST = ("\$(LIBRARY_$NAME\_OBJS)");
126                 my @STATIC_LINK_FLAGS = ();
127
128                 my $SHARED_LIBRARY_NAME = $NAME.".so";
129                 my $SHARED_LIBRARY_SONAME = $SHARED_LIBRARY_NAME.".$MAJOR_VERSION";
130                 my $SHARED_LIBRARY_REALNAME = $SHARED_LIBRARY_SONAME.".$MINOR_VERSION.$RELEASE_VERSION";
131                 my @SHARED_LINK_LIST = ("\$(LIBRARY_$NAME\_OBJS)");
132                 my @SHARED_LINK_FLAGS = ("\@SONAMEFLAG\@$SHARED_LIBRARY_SONAME");
133
134                 push(@{$CTX->{OUTPUT}{PROTO}{OBJ_LIST}},"\$(LIBRARY_$key\_OBJS)");
135                 
136                 #
137                 # not add to 'make all' for now
138                 #
139
140                 foreach my $elem (@{$CTX->{DEPEND}{LIBRARIES}{$key}{SUBSYSTEMS_LIST}}) {
141                         if (!defined($CTX->{DEPEND}{SUBSYSTEMS}{$elem})) {
142                                 die("Library[$NAME] depends on unkown Subsystem[$elem]!\n");
143                         }
144                         push(@DEPEND_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
145                         push(@STATIC_LINK_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
146                         push(@SHARED_LINK_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
147                 }
148
149                 foreach my $elem (@{$CTX->{DEPEND}{LIBRARIES}{$key}{LIBRARIES_LIST}}) {
150                         if (!defined($CTX->{DEPEND}{EXT_LIBS}{$elem})) {
151                                 die("Library[$NAME] depends on unkown External Library[$elem]!\n");
152                         }
153                         push(@SHARED_LINK_LIST,@{$CTX->{DEPEND}{EXT_LIBS}{$elem}{LIBS}});
154                         push(@SHARED_LINK_FLAGS,@{$CTX->{DEPEND}{EXT_LIBS}{$elem}{LDFLAGS}});
155                 }
156
157                 #
158                 # set the lists
159                 #
160                 $CTX->{OUTPUT}{LIBRARIES}{$key}{NAME} = $NAME;
161                 @{$CTX->{OUTPUT}{LIBRARIES}{$key}{OBJ_LIST}} = @OBJ_LIST;
162                 #
163                 @{$CTX->{OUTPUT}{LIBRARIES}{$key}{DEPEND_LIST}} = @DEPEND_LIST;
164
165                 $CTX->{OUTPUT}{LIBRARIES}{$key}{STATIC_LIBRARY_NAME} = $STATIC_LIBRARY_NAME;
166                 @{$CTX->{OUTPUT}{LIBRARIES}{$key}{STATIC_LINK_LIST}} = @STATIC_LINK_LIST;
167                 @{$CTX->{OUTPUT}{LIBRARIES}{$key}{STATIC_LINK_FLAGS}} = @STATIC_LINK_FLAGS;
168
169                 $CTX->{OUTPUT}{LIBRARIES}{$key}{SHARED_LIBRARY_NAME} = $SHARED_LIBRARY_NAME;
170                 $CTX->{OUTPUT}{LIBRARIES}{$key}{SHARED_LIBRARY_REALNAME} = $SHARED_LIBRARY_REALNAME;
171                 $CTX->{OUTPUT}{LIBRARIES}{$key}{SHARED_LIBRARY_SONAME} = $SHARED_LIBRARY_SONAME;
172                 @{$CTX->{OUTPUT}{LIBRARIES}{$key}{SHARED_LINK_LIST}} = @SHARED_LINK_LIST;
173                 @{$CTX->{OUTPUT}{LIBRARIES}{$key}{SHARED_LINK_FLAGS}} = @SHARED_LINK_FLAGS;
174         }
175
176         return;
177 }
178
179 sub _generate_binaries($)
180 {
181         my $CTX = shift;
182
183         #
184         # loop over all binaries
185         #
186         foreach my $key (sort keys %{$CTX->{DEPEND}{BINARIES}}) {
187                 my $NAME = $CTX->{INPUT}{BINARIES}{$key}{NAME};
188                 my @OBJ_LIST = @{$CTX->{INPUT}{BINARIES}{$key}{OBJ_FILES}};
189                 #
190                 my $BINARY = $NAME;
191                 my @DEPEND_LIST = ("\$(BINARY_$NAME\_OBJS)");
192                 my @LINK_LIST = ("\$(BINARY_$NAME\_OBJS)");
193                 my @LINK_FLAGS = ();
194
195                 push(@{$CTX->{OUTPUT}{PROTO}{OBJ_LIST}},"\$(BINARY_$key\_OBJS)");
196                 push(@{$CTX->{OUTPUT}{TARGETS}{ALL}{DEPEND_LIST}},"bin/$BINARY");
197
198                 foreach my $elem (@{$CTX->{DEPEND}{BINARIES}{$key}{SUBSYSTEMS_LIST}}) {
199                         if (!defined($CTX->{DEPEND}{SUBSYSTEMS}{$elem})) {
200                                 die("Binary[$NAME] depends on unknown Subsystem[$elem]!\n");
201                         }
202                         push(@DEPEND_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
203                         push(@LINK_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
204                 }
205
206                 foreach my $elem (@{$CTX->{DEPEND}{BINARIES}{$key}{LIBRARIES_LIST}}) {
207                         if (!defined($CTX->{DEPEND}{EXT_LIBS}{$elem})) {
208                                 die("Binary[$NAME] depends on unknown External Library[$elem]!\n");
209                         }
210                         push(@LINK_LIST,@{$CTX->{DEPEND}{EXT_LIBS}{$elem}{LIBS}});
211                         push(@LINK_FLAGS,@{$CTX->{DEPEND}{EXT_LIBS}{$elem}{LDFLAGS}});
212                 }
213
214                 # Export all symbols...
215                 push(@LINK_FLAGS,"\@DYNEXP\@");
216
217                 #
218                 # set the lists
219                 #
220                 $CTX->{OUTPUT}{BINARIES}{$key}{NAME} = $NAME;
221                 @{$CTX->{OUTPUT}{BINARIES}{$key}{OBJ_LIST}} = @OBJ_LIST;
222                 #
223                 $CTX->{OUTPUT}{BINARIES}{$key}{BINARY} = $BINARY;
224                 @{$CTX->{OUTPUT}{BINARIES}{$key}{DEPEND_LIST}} = @DEPEND_LIST;
225                 @{$CTX->{OUTPUT}{BINARIES}{$key}{LINK_LIST}} = @LINK_LIST;
226                 @{$CTX->{OUTPUT}{BINARIES}{$key}{LINK_FLAGS}} = @LINK_FLAGS;
227         }
228
229         return; 
230 }
231
232 ###########################################################
233 # This function generates the output 
234 #
235 # create_output($SMB_BUILD_CTX)
236 #
237 # $SMB_BUILD_CTX -      the global SMB_BUILD context
238 sub create_output($)
239 {
240         my $CTX = shift;
241
242         $CTX->{OUTPUT}{PROTO} = ();
243         @{$CTX->{OUTPUT}{PROTO}{OBJ_LIST}} = ();
244
245         $CTX->{OUTPUT}{TARGETS}{ALL} = ();
246         $CTX->{OUTPUT}{TARGETS}{ALL}{TARGET} = "all";
247         @{$CTX->{OUTPUT}{TARGETS}{ALL}{DEPEND_LIST}} = ();
248
249         _generate_ext_libs($CTX);
250
251         _generate_subsystems($CTX);
252
253         _generate_shared_modules($CTX);
254
255         _generate_libraries($CTX);
256
257         _generate_binaries($CTX);
258
259         return;
260 }