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