r3465: fix SMB_SUBSYSTEM_NOPROTO()
[sfrench/samba-autobuild/.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                 if ($CTX->{INPUT}{SUBSYSTEMS}{$key}{NOPROTO} ne "YES") {
44                         push(@{$CTX->{OUTPUT}{PROTO}{OBJ_LIST}},"\$(SUBSYSTEM_$key\_OBJS)");
45                 }
46
47                 #
48                 # set the lists
49                 #
50                 $CTX->{OUTPUT}{SUBSYSTEMS}{$key}{NAME} = $NAME;
51                 @{$CTX->{OUTPUT}{SUBSYSTEMS}{$key}{OBJ_LIST}} = @OBJ_LIST;
52         }
53
54         return; 
55 }
56
57 sub _generate_shared_modules($)
58 {
59         my $CTX = shift;
60
61         #
62         # loop over all shared modules
63         #
64         foreach my $key (sort keys %{$CTX->{DEPEND}{SHARED_MODULES}}) {
65                 my $NAME = $CTX->{INPUT}{MODULES}{$key}{NAME};
66                 my @OBJ_LIST = ();
67                 #
68                 my $MODULE = $NAME.".so";
69                 my @DEPEND_LIST = ("\$(MODULE_$NAME\_OBJS)");
70                 my @LINK_LIST = ("\$(MODULE_$NAME\_OBJS)");
71                 my @LINK_FLAGS = ();
72
73                 push(@{$CTX->{OUTPUT}{PROTO}{OBJ_LIST}},"\$(MODULE_$key\_OBJS)");
74                 push(@{$CTX->{OUTPUT}{TARGETS}{ALL}{DEPEND_LIST}},"bin/$MODULE");
75
76                 push(@OBJ_LIST,@{$CTX->{INPUT}{MODULES}{$key}{INIT_OBJ_FILES}});
77                 push(@OBJ_LIST,@{$CTX->{INPUT}{MODULES}{$key}{ADD_OBJ_FILES}});
78
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");
82                         }
83                         push(@DEPEND_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
84                         push(@LINK_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
85                 }
86
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");
90                         }
91                         push(@LINK_LIST,@{$CTX->{DEPEND}{EXT_LIBS}{$elem}{LIBS}});
92                         push(@LINK_FLAGS,@{$CTX->{DEPEND}{EXT_LIBS}{$elem}{LDFLAGS}});
93                 }
94
95                 #
96                 # set the lists
97                 #
98                 $CTX->{OUTPUT}{SHARED_MODULES}{$key}{NAME} = $NAME;
99                 @{$CTX->{OUTPUT}{SHARED_MODULES}{$key}{OBJ_LIST}} = @OBJ_LIST;
100                 #
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;
105         }
106
107         return; 
108 }
109
110 sub _generate_libraries($)
111 {
112         my $CTX = shift;
113
114         #
115         # loop over all binaries
116         #
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};
123                 #
124                 my @DEPEND_LIST = ("\$(LIBRARY_$NAME\_OBJS)");
125
126                 my $STATIC_LIBRARY_NAME = $NAME.".a";
127                 my @STATIC_LINK_LIST = ("\$(LIBRARY_$NAME\_OBJS)");
128                 my @STATIC_LINK_FLAGS = ();
129
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");
135
136                 push(@{$CTX->{OUTPUT}{PROTO}{OBJ_LIST}},"\$(LIBRARY_$key\_OBJS)");
137                 
138                 #
139                 # not add to 'make all' for now
140                 #
141
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");
145                         }
146                         push(@DEPEND_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
147                         push(@STATIC_LINK_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
148                         push(@SHARED_LINK_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
149                 }
150
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");
154                         }
155                         push(@SHARED_LINK_LIST,@{$CTX->{DEPEND}{EXT_LIBS}{$elem}{LIBS}});
156                         push(@SHARED_LINK_FLAGS,@{$CTX->{DEPEND}{EXT_LIBS}{$elem}{LDFLAGS}});
157                 }
158
159                 #
160                 # set the lists
161                 #
162                 $CTX->{OUTPUT}{LIBRARIES}{$key}{NAME} = $NAME;
163                 @{$CTX->{OUTPUT}{LIBRARIES}{$key}{OBJ_LIST}} = @OBJ_LIST;
164                 #
165                 @{$CTX->{OUTPUT}{LIBRARIES}{$key}{DEPEND_LIST}} = @DEPEND_LIST;
166
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;
170
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;
176         }
177
178         return;
179 }
180
181 sub _generate_binaries($)
182 {
183         my $CTX = shift;
184
185         #
186         # loop over all binaries
187         #
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}};
191                 #
192                 my $BINARY = $NAME;
193                 my @DEPEND_LIST = ("\$(BINARY_$NAME\_OBJS)");
194                 my @LINK_LIST = ("\$(BINARY_$NAME\_OBJS)");
195                 my @LINK_FLAGS = ();
196
197                 push(@{$CTX->{OUTPUT}{PROTO}{OBJ_LIST}},"\$(BINARY_$key\_OBJS)");
198                 push(@{$CTX->{OUTPUT}{TARGETS}{ALL}{DEPEND_LIST}},"bin/$BINARY");
199
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");
203                         }
204                         push(@DEPEND_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
205                         push(@LINK_LIST,"\$(SUBSYSTEM_$elem\_OBJS)");
206                 }
207
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");
211                         }
212                         push(@LINK_LIST,@{$CTX->{DEPEND}{EXT_LIBS}{$elem}{LIBS}});
213                         push(@LINK_FLAGS,@{$CTX->{DEPEND}{EXT_LIBS}{$elem}{LDFLAGS}});
214                 }
215
216                 # Export all symbols...
217                 push(@LINK_FLAGS,@{$CTX->{BUILD_ENV}{LD}{DYNEXP}});
218
219                 #
220                 # set the lists
221                 #
222                 $CTX->{OUTPUT}{BINARIES}{$key}{NAME} = $NAME;
223                 @{$CTX->{OUTPUT}{BINARIES}{$key}{OBJ_LIST}} = @OBJ_LIST;
224                 #
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;
229         }
230
231         return; 
232 }
233
234 ###########################################################
235 # This function generates the output 
236 #
237 # create_output($SMB_BUILD_CTX)
238 #
239 # $SMB_BUILD_CTX -      the global SMB_BUILD context
240 sub create_output($)
241 {
242         my $CTX = shift;
243
244         $CTX->{OUTPUT}{PROTO} = ();
245         @{$CTX->{OUTPUT}{PROTO}{OBJ_LIST}} = ();
246
247         $CTX->{OUTPUT}{TARGETS}{ALL} = ();
248         $CTX->{OUTPUT}{TARGETS}{ALL}{TARGET} = "all";
249         @{$CTX->{OUTPUT}{TARGETS}{ALL}{DEPEND_LIST}} = ();
250
251         _generate_ext_libs($CTX);
252
253         _generate_subsystems($CTX);
254
255         _generate_shared_modules($CTX);
256
257         _generate_libraries($CTX);
258
259         _generate_binaries($CTX);
260
261         return;
262 }