r8955: Move a bit more of the build process to the Makefile
[sfrench/samba-autobuild/.git] / source4 / build / smb_build / makefile.pm
1 ###########################################################
2 ### SMB Build System                                    ###
3 ### - create output for Makefile                        ###
4 ###                                                     ###
5 ###  Copyright (C) Stefan (metze) Metzmacher 2004       ###
6 ###  Released under the GNU GPL                         ###
7 ###########################################################
8
9 package makefile;
10 use config qw(%config);
11 use strict;
12
13 sub _prepare_command_interpreters($)
14 {
15         my $ctx = shift;
16
17         return << '__EOD__';
18 SHELL=/bin/sh
19 PERL=@PERL@
20
21 __EOD__
22 }
23
24 sub _prepare_path_vars($)
25 {
26         my $ctx = shift;
27         my $output;
28
29         $output = << '__EOD__';
30 prefix=@prefix@
31 exec_prefix=@exec_prefix@
32 VPATH=@srcdir@
33 srcdir=@srcdir@
34 builddir=@builddir@
35
36 BASEDIR= @prefix@
37 BINDIR = @bindir@
38 SBINDIR = @sbindir@
39 LIBDIR = @libdir@
40 CONFIGDIR = @configdir@
41 localstatedir = @localstatedir@
42 SWATDIR = @swatdir@
43 VARDIR = @localstatedir@
44
45 # The permissions to give the executables
46 INSTALLPERMS = 0755
47
48 # set these to where to find various files
49 # These can be overridden by command line switches (see smbd(8))
50 # or in smb.conf (see smb.conf(5))
51 LOGFILEBASE = @logfilebase@
52 CONFIGFILE = $(CONFIGDIR)/smb.conf
53 LMHOSTSFILE = $(CONFIGDIR)/lmhosts
54 NCALRPCDIR = @localstatedir@/ncalrpc
55
56 # This is where smbpasswd et al go
57 PRIVATEDIR = @privatedir@
58 SMB_PASSWD_FILE = $(PRIVATEDIR)/smbpasswd
59
60 # the directory where lock files go
61 LOCKDIR = @lockdir@
62
63 # the directory where pid files go
64 PIDDIR = @piddir@
65
66 MANDIR = @mandir@
67
68 PATH_FLAGS = -DCONFIGFILE=\"$(CONFIGFILE)\"  -DSBINDIR=\"$(SBINDIR)\" \
69          -DBINDIR=\"$(BINDIR)\" -DLMHOSTSFILE=\"$(LMHOSTSFILE)\" \
70          -DLOCKDIR=\"$(LOCKDIR)\" -DPIDDIR=\"$(PIDDIR)\" -DLIBDIR=\"$(LIBDIR)\" \
71          -DLOGFILEBASE=\"$(LOGFILEBASE)\" -DSHLIBEXT=\"@SHLIBEXT@\" \
72          -DCONFIGDIR=\"$(CONFIGDIR)\" -DNCALRPCDIR=\"$(NCALRPCDIR)\" \
73          -DSWATDIR=\"$(SWATDIR)\" -DSMB_PASSWD_FILE=\"$(SMB_PASSWD_FILE)\" \
74          -DPRIVATE_DIR=\"$(PRIVATEDIR)\"
75 __EOD__
76
77         return $output;
78 }
79
80 sub _prepare_compiler_linker($)
81 {
82         my $ctx = shift;
83
84         return << '__EOD__';
85 CC=@CC@
86 CFLAGS=-Iinclude -I. -I$(srcdir)/include -I$(srcdir) -D_SAMBA_BUILD_ -DHAVE_CONFIG_H -Ilib @CFLAGS@ @CPPFLAGS@
87
88 LD=@LD@
89 LD_FLAGS=@LDFLAGS@ @CFLAGS@ -Lbin
90
91 STLD=ar
92 STLD_FLAGS=-rc
93
94 SHLD=@CC@
95 SHLD_FLAGS=@LDSHFLAGS@ @LDFLAGS@ -Lbin
96
97 XSLTPROC=@XSLTPROC@
98
99 LEX=@LEX@
100 YACC=@YACC@
101
102 __EOD__
103 }
104
105 sub _prepare_default_rule($)
106 {
107         my $ctx = shift;
108         my $output;
109
110         $output = << '__EOD__';
111 default: all
112
113 __EOD__
114
115         return $output;
116 }
117
118 sub _prepare_SUFFIXES($)
119 {
120         my $ctx = shift;
121         my $output;
122
123         $output = << '__EOD__';
124 .SUFFIXES:
125 .SUFFIXES: .c .et .y .l .d .o .h .h.gch .a .so .1 .1.xml .3 .3.xml .5 .5.xml .7 .7.xml
126
127 __EOD__
128
129         return $output;
130 }
131
132 sub _prepare_IDL($)
133 {
134         my $ctx = shift;
135
136         return << '__EOD__';
137 idl_full: build/pidl/Parse/Pidl/IDL.pm
138         CPP="@CPP@" PERL="$(PERL)" script/build_idl.sh FULL @PIDL_ARGS@
139
140 idl: build/pidl/Parse/Pidl/IDL.pm
141         @CPP="@CPP@" PERL="$(PERL)" script/build_idl.sh PARTIAL @PIDL_ARGS@
142
143 build/pidl/Parse/Pidl/IDL.pm: build/pidl/idl.yp
144         -yapp -s -m 'Parse::Pidl::IDL' -o build/pidl/Parse/Pidl/IDL.pm build/pidl/idl.yp 
145
146 smb_interfaces: build/pidl/smb_interfaces.pm
147         $(PERL) -Ibuild/pidl script/build_smb_interfaces.pl \
148                 include/smb_interfaces.h
149
150 build/pidl/smb_interfaces.pm: build/pidl/smb_interfaces.yp
151         -yapp -s -m 'smb_interfaces' -o build/pidl/smb_interfaces.pm build/pidl/smb_interfaces.yp 
152
153 pch: proto include/includes.h.gch
154
155 pch_clean:
156         -rm -f include/includes.h.gch
157
158 basics: idl proto_exists HEIMDAL_EXTERNAL
159
160 test: @DEFAULT_TEST_TARGET@
161
162 test-swrap: all
163         ./script/tests/selftest.sh @selftest_prefix@/st all SOCKET_WRAPPER
164
165 test-noswrap: all
166         ./script/tests/selftest.sh @selftest_prefix@/st all
167
168 quicktest: all
169         ./script/tests/selftest.sh @selftest_prefix@/st quick SOCKET_WRAPPER
170
171 valgrindtest: all
172         SMBD_VALGRIND="xterm -n smbd -e valgrind -q --db-attach=yes --num-callers=30" \
173         ./script/tests/selftest.sh @selftest_prefix@/st quick SOCKET_WRAPPER
174
175 __EOD__
176 }
177
178 sub _prepare_man_rule($)
179 {
180         my $suffix = shift;
181
182         return << "__EOD__";
183 .$suffix.xml.$suffix:
184         \$(XSLTPROC) -o \$@ http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl \$<
185
186 __EOD__
187 }
188
189 sub _prepare_manpages($)
190 {
191         my $ctx = shift;
192
193         my @mp_list = ();
194
195         foreach (values %$ctx) {
196                 if (defined($_->{MANPAGE}) and $_->{MANPAGE} ne "") {
197                         push (@mp_list, $_->{MANPAGE});
198                 }
199         }
200         
201         my $mp = join(' ', @mp_list);
202         return << "__EOD__";
203 MANPAGES = $mp
204
205 manpages: \$(MANPAGES)
206
207 __EOD__
208 }
209
210 sub _prepare_dummy_MAKEDIR()
211 {
212         my $ctx = shift;
213
214         return  << '__EOD__';
215 bin/.dummy:
216         @: >> $@ || : > $@
217
218 dynconfig.o: dynconfig.c Makefile
219         @echo Compiling $*.c
220         @$(CC) $(CFLAGS) @PICFLAG@ $(PATH_FLAGS) -c $< -o $@
221 @BROKEN_CC@     -mv `echo $@ | sed 's%^.*/%%g'` $@
222
223 __EOD__
224 }
225
226 sub _prepare_et_rule()
227 {
228         return << '__EOD__';
229
230 .et.c: 
231         $(MAKE) bin/compile_et
232         ./bin/compile_et $<
233         mv `basename $@` $@
234
235 __EOD__
236 }
237
238 sub _prepare_yacc_rule()
239 {
240         return << '__EOD__';
241 .y.c:
242         $(YACC) -d -o $@ $<     
243         
244 __EOD__
245 }
246
247 sub _prepare_lex_rule()
248 {
249         return << '__EOD__';
250 .l.c:
251         $(LEX) -o $@ $<
252
253 __EOD__
254 }
255
256 sub _prepare_depend_CC_rule()
257 {
258         return << '__EOD__';
259
260 .c.d:
261         @echo "Generating dependencies for $<"
262         @$(CC) -MM -MG -MT $(<:.c=.o) -MF $@ $(CFLAGS) $<
263
264 __EOD__
265 }
266
267 ###########################################################
268 # This function creates a standard make rule which is using $(CC)
269 #
270 # $output = _prepare_std_CC_rule($srcext,$destext,$flags,$message,$comment)
271 #
272 # $srcext -     sourcefile extension
273 #
274 # $destext -    destinationfile extension
275 #
276 # $flags -      additional compiler flags
277 #
278 # $message -    logmessage which is echoed while running this rule
279 #
280 # $comment -    just a comment what this rule should do
281 #
282 # $output -             the resulting output buffer
283 sub _prepare_std_CC_rule($$$$$)
284 {
285         my $src = shift;
286         my $dst = shift;
287         my $flags = shift;
288         my $message = shift;
289         my $comment = shift;
290         my $flagsstr = "";
291         my $output;
292
293         $output = << "__EOD__";
294 # $comment
295 .$src.$dst:
296         \@echo $message \$\*.$src
297         \@\$(CC) `script/cflags.sh \$\@` \$(CFLAGS) $flags -c \$< -o \$\@
298 \@BROKEN_CC\@   -mv `echo \$\@ | sed 's%^.*/%%g'` \$\@
299
300 __EOD__
301
302         return $output;
303 }
304
305 sub array2oneperline($)
306 {
307         my $array = shift;
308         my $output = "";
309
310         foreach (@$array) {
311                 next unless defined($_);
312
313                 $output .= " \\\n\t\t$_";
314         }
315
316         return $output;
317 }
318
319 sub array2oneline($)
320 {
321         my $array = shift;
322         my $i;
323         my $output = "";
324
325         foreach (@{$array}) {
326                 next unless defined($_);
327
328                 $output .= "$_ ";
329         }
330
331         return $output;
332 }
333
334 ###########################################################
335 # This function creates a object file list
336 #
337 # $output = _prepare_var_obj_list($var, $var_ctx)
338 #
339 # $var_ctx -            the subsystem context
340 #
341 # $var_ctx->{NAME}      -       the <var> name
342 # $var_ctx->{OBJ_LIST}  -       the list of objectfiles which sould be linked to this <var>
343 #
344 # $output -             the resulting output buffer
345 sub _prepare_obj_list($$)
346 {
347         my ($var,$ctx) = @_;
348
349         my $tmplist = array2oneperline($ctx->{OBJ_LIST});
350
351         return << "__EOD__";
352 # $var $ctx->{NAME} OBJ LIST
353 $var\_$ctx->{NAME}_OBJS =$tmplist
354
355 __EOD__
356 }
357
358 sub _prepare_cflags($$)
359 {
360         my ($var,$ctx) = @_;
361
362         my $tmplist = array2oneperline($ctx->{CFLAGS});
363
364         return << "__EOD__";
365 $var\_$ctx->{NAME}_CFLAGS =$tmplist
366
367 __EOD__
368 }
369
370 ###########################################################
371 # This function creates a make rule for linking a library
372 #
373 # $output = _prepare_shared_library_rule($library_ctx)
374 #
375 # $library_ctx -                the library context
376 #
377 # $library_ctx->{NAME} -                the library name
378 #
379 # $library_ctx->{DEPEND_LIST} -         the list of rules on which this library depends
380 #
381 # $library_ctx->{LIBRARY_NAME} -        the shared library name
382 # $library_ctx->{LIBRARY_REALNAME} -    the shared library real name
383 # $library_ctx->{LIBRARY_SONAME} - the shared library soname
384 # $library_ctx->{LINK_LIST} -   the list of objectfiles and external libraries
385 #                                       which sould be linked to this shared library
386 # $library_ctx->{LINK_FLAGS} -  linker flags used by this shared library
387 #
388 # $output -             the resulting output buffer
389 sub _prepare_shared_library_rule($)
390 {
391         my $ctx = shift;
392         my $tmpdepend;
393         my $tmpstlink;
394         my $tmpstflag;
395         my $tmpshlink;
396         my $tmpshflag;
397         my $tmprules;
398         my $output;
399
400         $tmpdepend = array2oneperline($ctx->{DEPEND_LIST});
401         $tmpshlink = array2oneperline($ctx->{LINK_LIST});
402         $tmpshflag = array2oneperline($ctx->{LINK_FLAGS});
403
404         $output = << "__EOD__";
405 LIBRARY_$ctx->{NAME}_DEPEND_LIST =$tmpdepend
406 #
407 LIBRARY_$ctx->{NAME}_SHARED_LINK_LIST =$tmpshlink
408 LIBRARY_$ctx->{NAME}_SHARED_LINK_FLAGS =$tmpshflag
409 #
410
411 $ctx->{TARGET}: \$(LIBRARY_$ctx->{NAME}_DEPEND_LIST) \$(LIBRARY_$ctx->{NAME}_OBJS) bin/.dummy
412         \@echo Linking \$\@
413         \@\$(SHLD) \$(SHLD_FLAGS) -o \$\@ \\
414                 \$(LIBRARY_$ctx->{NAME}_SHARED_LINK_FLAGS) \\
415                 \$(LIBRARY_$ctx->{NAME}_SHARED_LINK_LIST)
416
417 __EOD__
418
419         if (defined($ctx->{LIBRARY_SONAME})) {
420             $output .= << "__EOD__";
421 # Symlink $ctx->{LIBRARY_SONAME}
422 bin/$ctx->{LIBRARY_SONAME}: bin/$ctx->{LIBRARY_REALNAME} bin/.dummy
423         \@echo Symlink \$\@
424         \@ln -sf $ctx->{LIBRARY_REALNAME} \$\@
425 # Symlink $ctx->{LIBRARY_NAME}
426 bin/$ctx->{LIBRARY_NAME}: bin/$ctx->{LIBRARY_SONAME} bin/.dummy
427         \@echo Symlink \$\@
428         \@ln -sf $ctx->{LIBRARY_SONAME} \$\@
429
430 __EOD__
431         }
432
433 $output .= << "__EOD__";
434 library_$ctx->{NAME}: basics bin/lib$ctx->{LIBRARY_NAME}
435
436 __EOD__
437
438         return $output;
439 }
440
441 sub _prepare_mergedobj_rule($)
442 {
443         my $ctx = shift;
444
445         return "" unless $ctx->{TARGET};
446
447         my $output = "";
448
449         my $tmpdepend = array2oneperline($ctx->{DEPEND_LIST});
450
451         $output .= "$ctx->{TYPE}_$ctx->{NAME}_DEPEND_LIST = $tmpdepend\n";
452
453         $output .= "$ctx->{TARGET}: \$($ctx->{TYPE}_$ctx->{NAME}_DEPEND_LIST) \$($ctx->{TYPE}_$ctx->{NAME}_OBJS)\n";
454
455         $output .= "\t\@echo \"Linking subsystem $ctx->{NAME}\"\n";
456         $output .= "\t@\$(LD) -r \$($ctx->{TYPE}_$ctx->{NAME}_OBJS) -o $ctx->{TARGET}\n";
457         $output .= "\n";
458
459         return $output;
460 }
461
462 sub _prepare_objlist_rule($)
463 {
464         my $ctx = shift;
465         my $tmpdepend = array2oneperline($ctx->{DEPEND_LIST});
466         my $output;
467
468         return "" unless $ctx->{TARGET};
469
470         $output = "$ctx->{TYPE}_$ctx->{NAME}_DEPEND_LIST = $tmpdepend\n";
471         $output .= "$ctx->{TARGET}: ";
472         $output .= "\$($ctx->{TYPE}_$ctx->{NAME}_DEPEND_LIST) \$($ctx->{TYPE}_$ctx->{NAME}_OBJS)\n";
473         $output .= "\t\@touch $ctx->{TARGET}\n";
474
475         return $output;
476 }
477
478 ###########################################################
479 # This function creates a make rule for linking a library
480 #
481 # $output = _prepare_static_library_rule($library_ctx)
482 #
483 # $library_ctx -                the library context
484 #
485 # $library_ctx->{NAME} -                the library name
486 #
487 # $library_ctx->{DEPEND_LIST} -         the list of rules on which this library depends
488 #
489 # $library_ctx->{LIBRARY_NAME} -        the static library name
490 # $library_ctx->{LINK_LIST} -   the list of objectfiles which sould be linked
491 #                                       to this static library
492 # $library_ctx->{LINK_FLAGS} -  linker flags used by this static library
493 #
494 # $output -             the resulting output buffer
495 sub _prepare_static_library_rule($)
496 {
497         my $ctx = shift;
498         my $tmpdepend;
499         my $tmpstlink;
500         my $tmpstflag;
501         my $tmpshlink;
502         my $tmpshflag;
503         my $tmprules;
504         my $output;
505
506         $tmpdepend = array2oneperline($ctx->{DEPEND_LIST});
507         $tmpstlink = array2oneperline($ctx->{LINK_LIST});
508         $tmpstflag = array2oneperline($ctx->{LINK_FLAGS});
509
510         $output = << "__EOD__";
511 LIBRARY_$ctx->{NAME}_DEPEND_LIST =$tmpdepend
512 #
513 LIBRARY_$ctx->{NAME}_STATIC_LINK_LIST =$tmpstlink
514 #
515 $ctx->{TARGET}: \$(LIBRARY_$ctx->{NAME}_DEPEND_LIST) \$(LIBRARY_$ctx->{NAME}_OBJS) bin/.dummy
516         \@echo Linking \$@
517         \@\$(STLD) \$(STLD_FLAGS) \$@ \\
518                 \$(LIBRARY_$ctx->{NAME}_STATIC_LINK_LIST)
519
520 library_$ctx->{NAME}: basics $ctx->{TARGET}
521
522 __EOD__
523
524         return $output;
525 }
526
527 ###########################################################
528 # This function creates a make rule for linking a binary
529 #
530 # $output = _prepare_binary_rule($binary_ctx)
531 #
532 # $binary_ctx -         the binary context
533 #
534 # $binary_ctx->{NAME} -         the binary name
535 # $binary_ctx->{BINARY} -       the binary binary name
536 #
537 # $binary_ctx->{DEPEND_LIST} -  the list of rules on which this binary depends
538 # $binary_ctx->{LINK_LIST} -    the list of objectfiles and external libraries
539 #                               which sould be linked to this binary
540 # $binary_ctx->{LINK_FLAGS} -   linker flags used by this binary
541 #
542 # $output -             the resulting output buffer
543 sub _prepare_binary_rule($)
544 {
545         my $ctx = shift;
546         my $tmpdepend;
547         my $tmplink;
548         my $tmpflag;
549         my $output;
550
551         $tmpdepend = array2oneperline($ctx->{DEPEND_LIST});
552         $tmplink = array2oneperline($ctx->{LINK_LIST});
553         $tmpflag = array2oneperline($ctx->{LINK_FLAGS});
554
555         $output = << "__EOD__";
556 #
557 BINARY_$ctx->{NAME}_DEPEND_LIST =$tmpdepend
558 BINARY_$ctx->{NAME}_LINK_LIST =$tmplink
559 BINARY_$ctx->{NAME}_LINK_FLAGS =$tmpflag
560 #
561 bin/$ctx->{BINARY}: bin/.dummy \$(BINARY_$ctx->{NAME}_DEPEND_LIST) \$(BINARY_$ctx->{NAME}_OBJS)
562         \@echo Linking \$\@
563         \@\$(CC) \$(LD_FLAGS) -o \$\@ \\
564                 \$\(BINARY_$ctx->{NAME}_LINK_FLAGS) \\
565                 \$\(BINARY_$ctx->{NAME}_LINK_LIST) \\
566                 \$\(BINARY_$ctx->{NAME}_LINK_FLAGS)
567 binary_$ctx->{BINARY}: basics bin/$ctx->{BINARY}
568
569 __EOD__
570
571         return $output;
572 }
573
574 sub _prepare_custom_rule($)
575 {
576         my $ctx = shift;
577         return "
578 $ctx->{NAME}: bin/.TARGET_$ctx->{NAME}
579
580 bin/.TARGET_$ctx->{NAME}:
581         $ctx->{CMD}
582         touch bin/.TARGET_$ctx->{NAME}
583 ";
584 }
585
586 sub _prepare_proto_rules()
587 {
588         my $output = "";
589
590         $output .= << '__EOD__';
591 # Making this target will just make sure that the prototype files
592 # exist, not necessarily that they are up to date.  Since they're
593 # removed by 'make clean' this will always be run when you do anything
594 # afterwards.
595 proto_exists: include/proto.h
596
597 delheaders: pch_clean
598         -rm -f $(builddir)/include/proto.h
599
600 include/proto.h:
601         @cd $(srcdir) && $(SHELL) script/mkproto.sh "$(PERL)" \
602           -h _PROTO_H_ $(builddir)/include/proto.h \
603           $(PROTO_PROTO_OBJS)
604
605 # 'make headers' or 'make proto' calls a subshell because we need to
606 # make sure these commands are executed in sequence even for a
607 # parallel make.
608 headers: delheaders proto_exists
609
610 proto: idl headers
611
612 proto_test:
613         @[ -f $(builddir)/include/proto.h ] || $(MAKE) proto
614
615 clean: delheaders
616         @echo Removing objects
617         @-find . -name '*.o' -exec rm -f '{}' \;
618         @echo Removing binaries
619         @-rm -f bin/*
620         @echo Removing dummy targets
621         @-rm -f bin/.*_*
622         @echo Removing generated files
623         @-rm -rf librpc/gen_*
624         @echo Removing generated ASN1 files
625         @-find heimdal/lib/asn1 -name 'asn1_*.[xc]' -exec rm -f '{}' \;
626         @-find heimdal/lib/gssapi -name 'asn1_*.[xc]' -exec rm -f '{}' \;
627         @-find heimdal/lib/hdb -name 'asn1_*.[xc]' -exec rm -f '{}' \;
628
629 distclean: clean
630         -rm -f bin/.dummy
631         -rm -f include/config.h include/smb_build.h
632         -rm -f Makefile*
633         -rm -f config.status
634         -rm -f config.log config.cache
635         -rm -f samba4-deps.dot
636         -rm -f config.pm config.mk
637         -rm -f lib/registry/winregistry.pc
638 __EOD__
639
640         if ($config{developer} eq "yes") {
641                 $output .= "\t@-rm -f \$(_ALL_OBJS_OBJS:.o=.d)\n";
642         }
643
644         $output .= << '__EOD__';
645
646 removebackup:
647         -rm -f *.bak *~ */*.bak */*~ */*/*.bak */*/*~ */*/*/*.bak */*/*/*~
648
649 realdistclean: distclean removebackup
650         -rm -f include/config.h.in
651         -rm -f include/version.h
652         -rm -f configure
653         -rm -f $(MANPAGES)
654 __EOD__
655
656         return $output;
657 }
658
659 sub _prepare_make_target($)
660 {
661         my $ctx = shift;
662         my $tmpdepend;
663         my $output;
664
665         $tmpdepend = array2oneperline($ctx->{DEPEND_LIST});
666
667         return << "__EOD__";
668 $ctx->{TARGET}: basics $tmpdepend
669
670 __EOD__
671 }
672
673 sub _prepare_target_settings($)
674 {
675         my $CTX = shift;
676         my $output = "";
677
678         foreach my $key (values %$CTX) {
679                 if (defined($key->{OBJ_LIST})) {
680                         $output .= _prepare_obj_list($key->{TYPE}, $key);
681                 }
682
683                 if (defined($key->{OBJ_LIST})) {
684                         $output .= _prepare_cflags($key->{TYPE}, $key);
685                 }
686         }
687
688         return $output;
689 }
690
691 sub _prepare_install_rules($)
692 {
693         my $CTX = shift;
694         my $output = "";
695
696         $output .= << '__EOD__';
697
698 showlayout: 
699         @echo "Samba will be installed into:"
700         @echo "  basedir: $(BASEDIR)"
701         @echo "  bindir:  $(BINDIR)"
702         @echo "  sbindir: $(SBINDIR)"
703         @echo "  libdir:  $(LIBDIR)"
704         @echo "  vardir:  $(VARDIR)"
705         @echo "  privatedir:  $(PRIVATEDIR)"
706         @echo "  piddir:   $(PIDDIR)"
707         @echo "  lockdir:  $(LOCKDIR)"
708         @echo "  swatdir:  $(SWATDIR)"
709         @echo "  mandir:   $(MANDIR)"
710
711 showflags:
712         @echo "Samba will be compiled with flags:"
713         @echo "  CFLAGS = $(CFLAGS)"
714         @echo "  LD_FLAGS = $(LD_FLAGS)"
715         @echo "  STLD_FLAGS = $(STLD_FLAGS)"
716         @echo "  SHLD_FLAGS = $(SHLD_FLAGS)"
717
718 SBIN_PROGS = bin/smbd
719
720 BIN_PROGS = bin/smbclient \
721                 bin/net \
722                 bin/nmblookup \
723                 bin/smbscript \
724                 bin/ntlm_auth
725
726 TORTURE_PROGS = bin/smbtorture \
727                 bin/gentest \
728                 bin/locktest \
729                 bin/masktest \
730                 bin/ndrdump
731
732 LDB_PROGS =     bin/ldbadd \
733                 bin/ldbdel \
734                 bin/ldbmodify \
735                 bin/ldbedit \
736                 bin/ldbsearch
737
738 REG_PROGS =     bin/regpatch \
739                 bin/regshell \
740                 bin/regtree \
741                 bin/regdiff
742
743 GTK_PROGS = bin/gregedit \
744                 bin/gwsam \
745                 bin/gepdump
746
747 install: showlayout installbin installtorture installldb installreg installdat installswat installmisc installgtk
748
749 # DESTDIR is used here to prevent packagers wasting their time
750 # duplicating the Makefile. Remove it and you will have the privilege
751 # of package each samba release for multiple versions of multiple
752 # distributions and operating systems, or at least supplying patches
753 # to all the packaging files required for this, prior to committing
754 # the removal of DESTDIR. Do not remove it even though you think it
755 # is not used.
756
757 installdirs:
758         @$(SHELL) $(srcdir)/script/installdirs.sh $(DESTDIR)$(BASEDIR) $(DESTDIR)$(BINDIR) $(DESTDIR)$(SBINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(VARDIR) $(DESTDIR)$(PRIVATEDIR) $(DESTDIR)$(PIDDIR) $(DESTDIR)$(LOCKDIR) $(DESTDIR)$(PRIVATEDIR)/tls
759
760 installbin: all installdirs
761         @$(SHELL) $(srcdir)/script/installbin.sh $(INSTALLPERMS) $(DESTDIR)$(BASEDIR) $(DESTDIR)$(SBINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(VARDIR) $(SBIN_PROGS)
762         @$(SHELL) $(srcdir)/script/installbin.sh $(INSTALLPERMS) $(DESTDIR)$(BASEDIR) $(DESTDIR)$(BINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(VARDIR) $(BIN_PROGS)
763
764 installtorture: all installdirs
765         @$(SHELL) $(srcdir)/script/installbin.sh $(INSTALLPERMS) $(DESTDIR)$(BASEDIR) $(DESTDIR)$(BINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(VARDIR) $(TORTURE_PROGS)
766
767 installldb: all installdirs
768         @$(SHELL) $(srcdir)/script/installbin.sh $(INSTALLPERMS) $(DESTDIR)$(BASEDIR) $(DESTDIR)$(BINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(VARDIR) $(LDB_PROGS)
769
770 installreg: all installdirs
771         @$(SHELL) $(srcdir)/script/installbin.sh $(INSTALLPERMS) $(DESTDIR)$(BASEDIR) $(DESTDIR)$(BINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(VARDIR) $(REG_PROGS)
772
773 installgtk: all installdirs
774         @$(SHELL) $(srcdir)/script/installbin.sh $(INSTALLPERMS) $(DESTDIR)$(BASEDIR) $(DESTDIR)$(BINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(VARDIR) $(GTK_PROGS)
775
776 installdat: installdirs
777         @$(SHELL) $(srcdir)/script/installdat.sh $(DESTDIR)$(LIBDIR) $(srcdir)
778
779 installswat: installdirs
780         @$(SHELL) $(srcdir)/script/installswat.sh $(DESTDIR)$(SWATDIR) $(srcdir) $(DESTDIR)$(LIBDIR)
781
782 installmisc: installdirs
783         @$(SHELL) $(srcdir)/script/installmisc.sh $(srcdir) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(BINDIR)
784
785 installman: installdirs
786         @$(SHELL) $(srcdir)/script/installman.sh $(DESTDIR)$(MANDIR) $(MANPAGES)
787
788 uninstall: uninstallbin uninstalltorture uninstallldb uninstallreg uninstallgtk
789
790 uninstallbin:
791         @$(SHELL) $(srcdir)/script/uninstallbin.sh $(INSTALLPERMS) $(DESTDIR)$(BASEDIR) $(DESTDIR)$(SBINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(VARDIR) $(DESTDIR)$(SBIN_PROGS)
792
793 uninstalltorture:
794         @$(SHELL) $(srcdir)/script/uninstallbin.sh $(INSTALLPERMS) $(DESTDIR)$(BASEDIR) $(DESTDIR)$(BINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(VARDIR) $(DESTDIR)$(TORTURE_PROGS)
795
796 uninstallldb:
797         @$(SHELL) $(srcdir)/script/uninstallbin.sh $(INSTALLPERMS) $(DESTDIR)$(BASEDIR) $(DESTDIR)$(BINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(VARDIR) $(DESTDIR)$(LDB_PROGS)
798
799 uninstallreg:
800         @$(SHELL) $(srcdir)/script/uninstallbin.sh $(INSTALLPERMS) $(DESTDIR)$(BASEDIR) $(DESTDIR)$(BINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(VARDIR) $(DESTDIR)$(REG_PROGS)
801
802 uninstallgtk:
803         @$(SHELL) $(srcdir)/script/uninstallbin.sh $(INSTALLPERMS) $(DESTDIR)$(BASEDIR) $(DESTDIR)$(BINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(VARDIR) $(DESTDIR)$(GTK_PROGS)
804
805 uninstallman:
806         @$(SHELL) $(srcdir)/script/uninstallman.sh $(DESTDIR)$(MANDIR) $(MANPAGES)
807
808 # Swig extensions
809
810 swig: scripting/swig/_tdb.so scripting/swig/_dcerpc.so
811
812 scripting/swig/tdb_wrap.c: scripting/swig/tdb.i
813         swig -python scripting/swig/tdb.i
814
815 scripting/swig/_tdb.so: scripting/swig/tdb_wrap.o $(LIBRARY_swig_tdb_DEPEND_LIST)
816         $(SHLD) $(SHLD_FLAGS) -o scripting/swig/_tdb.so scripting/swig/tdb_wrap.o \
817                 $(LIBRARY_swig_tdb_SHARED_LINK_LIST) $(LIBRARY_swig_tdb_SHARED_LINK_FLAGS)
818
819 SWIG_INCLUDES = librpc/gen_ndr/samr.i librpc/gen_ndr/lsa.i librpc/gen_ndr/spoolss.i
820
821 scripting/swig/dcerpc_wrap.c: scripting/swig/dcerpc.i scripting/swig/samba.i scripting/swig/status_codes.i $(SWIG_INCLUDES)
822         swig -python scripting/swig/dcerpc.i
823
824 scripting/swig/_dcerpc.so: scripting/swig/dcerpc_wrap.o $(LIBRARY_swig_dcerpc_DEPEND_LIST)
825         $(SHLD) $(SHLD_FLAGS) -o scripting/swig/_dcerpc.so scripting/swig/dcerpc_wrap.o $(LIBRARY_swig_dcerpc_SHARED_LINK_LIST) $(LIBRARY_swig_dcerpc_SHARED_LINK_FLAGS)
826
827 swig_clean:
828         -rm -f scripting/swig/_tdb.so scripting/swig/tdb.pyc \
829                 scripting/swig/tdb.py scripting/swig/tdb_wrap.c \
830                 scripting/swig/tdb_wrap.o
831
832 everything: all
833
834 etags:
835         etags `find $(srcdir) -name "*.[ch]"`
836
837 ctags:
838         ctags `find $(srcdir) -name "*.[ch]"`
839
840 __EOD__
841
842         return $output;
843 }
844
845 sub _prepare_rule_lists($)
846 {
847         my $depend = shift;
848         my $output = "";
849
850         foreach my $key (values %{$depend}) {
851                 next unless defined $key->{OUTPUT_TYPE};
852
853                 ($output .= _prepare_mergedobj_rule($key)) if $key->{OUTPUT_TYPE} eq "MERGEDOBJ";
854                 ($output .= _prepare_objlist_rule($key)) if $key->{OUTPUT_TYPE} eq "OBJLIST";
855                 ($output .= _prepare_static_library_rule($key)) if $key->{OUTPUT_TYPE} eq "STATIC_LIBRARY";
856                 ($output .= _prepare_shared_library_rule($key)) if $key->{OUTPUT_TYPE} eq "SHARED_LIBRARY";
857                 ($output .= _prepare_binary_rule($key)) if $key->{OUTPUT_TYPE} eq "BINARY";
858                 ($output .= _prepare_custom_rule($key) ) if $key->{TYPE} eq "TARGET";
859         }
860
861         my $idl_ctx;
862         $output .= _prepare_IDL($idl_ctx);
863         $output .= _prepare_proto_rules();
864         $output .= _prepare_install_rules($depend);
865
866         return $output;
867 }
868
869 ###########################################################
870 # This function prepares the output for Makefile
871 #
872 # $output = _prepare_makefile_in($OUTPUT)
873 #
874 # $OUTPUT -     the global OUTPUT context
875 #
876 # $output -             the resulting output buffer
877 sub _prepare_makefile_in($)
878 {
879         my ($CTX) = @_;
880         my $output;
881
882         $output  = "########################################\n";
883         $output .= "# Autogenerated by config.smb_build.pl #\n";
884         $output .= "########################################\n";
885         $output .= "\n";
886
887         my $cmd_ctx;
888         $output .= _prepare_command_interpreters($cmd_ctx);
889
890         my $path_ctx;
891         $output .= _prepare_path_vars($path_ctx);
892
893         my $compiler_ctx;
894         $output .= _prepare_compiler_linker($compiler_ctx);
895
896         my $rules_ctx;
897         $output .= _prepare_default_rule($rules_ctx);
898
899         my $suffix_ctx;
900         $output .= _prepare_SUFFIXES($suffix_ctx);
901
902         $output .= _prepare_dummy_MAKEDIR();
903         $output .= _prepare_std_CC_rule("c","o",'@PICFLAG@',"Compiling","Rule for std objectfiles");
904         $output .= _prepare_std_CC_rule("h","h.gch",'@PICFLAG@',"Precompiling","Rule for precompiled headerfiles");
905         $output .= _prepare_lex_rule();
906         $output .= _prepare_yacc_rule();
907         $output .= _prepare_et_rule();
908
909         $output .= _prepare_depend_CC_rule();
910         
911         $output .= _prepare_man_rule("1");
912         $output .= _prepare_man_rule("3");
913         $output .= _prepare_man_rule("5");
914         $output .= _prepare_man_rule("7");
915         $output .= _prepare_manpages($CTX);
916         $output .= _prepare_target_settings($CTX);
917         $output .= _prepare_rule_lists($CTX);
918
919         my @all = ();
920         
921         foreach my $part (values %{$CTX}) {
922                 push (@all, $part->{TARGET}) if defined ($part->{OUTPUT_TYPE}) and $part->{OUTPUT_TYPE} eq "BINARY";    
923         }
924         
925         $output .= _prepare_make_target({ TARGET => "all", DEPEND_LIST => \@all });
926
927         if ($config{developer} eq "yes") {
928                 $output .= <<__EOD__
929 #-include \$(_ALL_OBJS_OBJS:.o=.d)
930 IDL_FILES = \$(wildcard librpc/idl/*.idl)
931 \$(patsubst librpc/idl/%.idl,librpc/gen_ndr/ndr_%.c,\$(IDL_FILES)) \\
932 \$(patsubst librpc/idl/%.idl,librpc/gen_ndr/ndr_\%_c.c,\$(IDL_FILES)) \\
933 \$(patsubst librpc/idl/%.idl,librpc/gen_ndr/ndr_%.h,\$(IDL_FILES)): idl
934 __EOD__
935         }
936
937         return $output;
938 }
939
940 ###########################################################
941 # This function creates Makefile.in from the OUTPUT 
942 # context
943 #
944 # create_makefile_in($OUTPUT)
945 #
946 # $OUTPUT       -       the global OUTPUT context
947 #
948 # $output -             the resulting output buffer
949 sub create_makefile_in($$)
950 {
951         my ($CTX, $file) = @_;
952
953         open(MAKEFILE_IN,">$file") || die ("Can't open $file\n");
954         print MAKEFILE_IN _prepare_makefile_in($CTX);
955         close(MAKEFILE_IN);
956
957         print "config.smb_build.pl: creating $file\n";
958         return; 
959 }
960
961 1;
962