r9587: Fix SWAT data dir for --with-fhs
[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 ###  Copyright (C) Jelmer Vernooij 2005                 ###
7 ###  Released under the GNU GPL                         ###
8 ###########################################################
9
10 package makefile;
11 use config qw(%config);
12 use strict;
13
14 sub _prepare_path_vars()
15 {
16         my $output;
17
18         $output = << '__EOD__';
19 prefix = @prefix@
20 exec_prefix = @exec_prefix@
21 selftest_prefix = @selftest_prefix@
22 VPATH = @srcdir@
23 srcdir = @srcdir@
24 builddir = @builddir@
25
26 BASEDIR = @prefix@
27 BINDIR = @bindir@
28 SBINDIR = @sbindir@
29 datadir = @datadir@
30 LIBDIR = @libdir@
31 CONFIGDIR = @configdir@
32 localstatedir = @localstatedir@
33 SWATDIR = @swatdir@
34 VARDIR = @localstatedir@
35
36 # The permissions to give the executables
37 INSTALLPERMS = 0755
38
39 # set these to where to find various files
40 # These can be overridden by command line switches (see smbd(8))
41 # or in smb.conf (see smb.conf(5))
42 LOGFILEBASE = @logfilebase@
43 CONFIGFILE = $(CONFIGDIR)/smb.conf
44 LMHOSTSFILE = $(CONFIGDIR)/lmhosts
45 NCALRPCDIR = @localstatedir@/ncalrpc
46
47 # This is where smbpasswd et al go
48 PRIVATEDIR = @privatedir@
49 SMB_PASSWD_FILE = $(PRIVATEDIR)/smbpasswd
50
51 # the directory where lock files go
52 LOCKDIR = @lockdir@
53
54 # the directory where pid files go
55 PIDDIR = @piddir@
56
57 MANDIR = @mandir@
58
59 PATH_FLAGS = -DCONFIGFILE=\"$(CONFIGFILE)\"  -DSBINDIR=\"$(SBINDIR)\" \
60          -DBINDIR=\"$(BINDIR)\" -DLMHOSTSFILE=\"$(LMHOSTSFILE)\" \
61          -DLOCKDIR=\"$(LOCKDIR)\" -DPIDDIR=\"$(PIDDIR)\" -DLIBDIR=\"$(LIBDIR)\" \
62          -DLOGFILEBASE=\"$(LOGFILEBASE)\" -DSHLIBEXT=\"@SHLIBEXT@\" \
63          -DCONFIGDIR=\"$(CONFIGDIR)\" -DNCALRPCDIR=\"$(NCALRPCDIR)\" \
64          -DSWATDIR=\"$(SWATDIR)\" -DSMB_PASSWD_FILE=\"$(SMB_PASSWD_FILE)\" \
65          -DPRIVATE_DIR=\"$(PRIVATEDIR)\"
66 __EOD__
67
68         return $output;
69 }
70
71 sub _prepare_compiler_linker()
72 {
73         return << "__EOD__";
74 SHELL=$config{SHELL}
75 PERL=$config{PERL}
76 CC=$config{CC}
77 CFLAGS=-I\$(srcdir)/include -I\$(srcdir) -D_SAMBA_BUILD_ -DHAVE_CONFIG_H -I\$(srcdir)/lib $config{CFLAGS} $config{CPPFLAGS}
78
79 LD=$config{LD}
80 LD_FLAGS=$config{LDFLAGS} -Lbin
81
82 STLD=$config{AR}
83 STLD_FLAGS=-rc
84
85 SHLD=$config{CC}
86 SHLD_FLAGS=$config{LDSHFLAGS} -Lbin
87
88 XSLTPROC=$config{XSLTPROC}
89
90 LEX=$config{LEX}
91 YACC=$config{YACC}
92
93 CPP=$config{CPP}
94
95 DEFAULT_TEST_TARGET=$config{DEFAULT_TEST_TARGET}
96
97 __EOD__
98 }
99
100 sub _prepare_default_rule()
101 {
102         return << '__EOD__';
103 default: all
104
105 __EOD__
106 }
107
108 sub _prepare_SUFFIXES()
109 {
110         return << '__EOD__';
111 .SUFFIXES: .x .c .et .y .l .d .o .h .h.gch .a .so .1 .1.xml .3 .3.xml .5 .5.xml .7 .7.xml
112
113 __EOD__
114 }
115
116 sub _prepare_man_rule($)
117 {
118         my $suffix = shift;
119
120         return << "__EOD__";
121 .$suffix.xml.$suffix:
122         \$(XSLTPROC) -o \$@ http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl \$<
123
124 __EOD__
125 }
126
127 sub _prepare_config_status()
128 {
129         my @parsed_files = @smb_build::config_mk::parsed_files;
130         my $deps = "";
131         
132         foreach (@parsed_files) {
133                 /^([^ |]+)/;
134                 $deps.= " $1";
135         }
136
137         return "
138
139 Makefile: config.status $deps
140         ./config.status
141
142 ";
143 }
144
145 sub _prepare_binaries($)
146 {
147         my $ctx = shift;
148
149         my @bbn_list = ();
150         my @sbn_list = ();
151
152         foreach (values %$ctx) {
153                 next unless defined $_->{OUTPUT_TYPE};
154                 next unless ($_->{OUTPUT_TYPE} eq "BINARY");
155
156                 push(@sbn_list, $_->{OUTPUT}) if ($_->{INSTALLDIR} eq "SBINDIR");
157                 push(@bbn_list, $_->{OUTPUT}) if ($_->{INSTALLDIR} eq "BINDIR");
158         }
159
160         my $bbn = array2oneperline(\@bbn_list);
161         my $sbn = array2oneperline(\@sbn_list);
162         return << "__EOD__";
163 BIN_PROGS = $bbn
164 SBIN_PROGS = $sbn
165 __EOD__
166 }
167
168 sub _prepare_manpages($)
169 {
170         my $ctx = shift;
171
172         my @mp_list = ();
173
174         foreach (values %$ctx) {
175                 push (@mp_list, $_->{MANPAGE}) if (defined($_->{MANPAGE}) and $_->{MANPAGE} ne "");
176         }
177         
178         my $mp = array2oneperline(\@mp_list);
179         return << "__EOD__";
180 MANPAGES = $mp
181
182 __EOD__
183 }
184
185 sub _prepare_dummy_MAKEDIR()
186 {
187         my $ctx = shift;
188
189         return  << '__EOD__';
190 bin/.dummy:
191         @: >> $@ || : > $@
192
193 dynconfig.o: dynconfig.c Makefile
194         @echo Compiling $*.c
195         @$(CC) $(CFLAGS) @PICFLAG@ $(PATH_FLAGS) -c $< -o $@
196 @BROKEN_CC@     -mv `echo $@ | sed 's%^.*/%%g'` $@
197
198 __EOD__
199 }
200
201 sub _prepare_depend_CC_rule()
202 {
203         return << '__EOD__';
204
205 .c.d:
206         @echo "Generating dependencies for $<"
207         @$(CC) -MM -MG -MT $(<:.c=.o) -MF $@ $(CFLAGS) $<
208
209 __EOD__
210 }
211
212 ###########################################################
213 # This function creates a standard make rule which is using $(CC)
214 #
215 # $output = _prepare_std_CC_rule($srcext,$destext,$flags,$message,$comment)
216 #
217 # $srcext -     sourcefile extension
218 #
219 # $destext -    destinationfile extension
220 #
221 # $flags -      additional compiler flags
222 #
223 # $message -    logmessage which is echoed while running this rule
224 #
225 # $comment -    just a comment what this rule should do
226 #
227 # $output -             the resulting output buffer
228 sub _prepare_std_CC_rule($$$$$)
229 {
230         my ($src,$dst,$flags,$message,$comment) = @_;
231
232         return << "__EOD__";
233 # $comment
234 .$src.$dst:
235         \@echo $message \$\*.$src
236         \@\$(CC) `script/cflags.sh \$\@` \$(CFLAGS) $flags -c \$< -o \$\@
237 \@BROKEN_CC\@   -mv `echo \$\@ | sed 's%^.*/%%g'` \$\@
238
239 __EOD__
240 }
241
242 sub array2oneperline($)
243 {
244         my $array = shift;
245         my $output = "";
246
247         foreach (@$array) {
248                 next unless defined($_);
249
250                 $output .= " \\\n\t\t$_";
251         }
252
253         return $output;
254 }
255
256 ###########################################################
257 # This function creates a object file list
258 #
259 # $output = _prepare_var_obj_list($var, $var_ctx)
260 #
261 # $var_ctx -            the subsystem context
262 #
263 # $var_ctx->{NAME}      -       the <var> name
264 # $var_ctx->{OBJ_LIST}  -       the list of objectfiles which sould be linked to this <var>
265 #
266 # $output -             the resulting output buffer
267 sub _prepare_obj_list($$)
268 {
269         my ($var,$ctx) = @_;
270
271         my $tmplist = array2oneperline($ctx->{OBJ_LIST});
272         return "" if ($tmplist eq "");
273
274         return << "__EOD__";
275 $var\_$ctx->{NAME}_OBJS =$tmplist
276 __EOD__
277 }
278
279 sub _prepare_cflags($$)
280 {
281         my ($var,$ctx) = @_;
282
283         my $tmplist = array2oneperline($ctx->{CFLAGS});
284         return "" if ($tmplist eq "");
285
286         return << "__EOD__";
287 $var\_$ctx->{NAME}_CFLAGS =$tmplist
288
289 __EOD__
290 }
291
292 ###########################################################
293 # This function creates a make rule for linking a library
294 #
295 # $output = _prepare_shared_library_rule($library_ctx)
296 #
297 # $library_ctx -                the library context
298 #
299 # $library_ctx->{NAME} -                the library name
300 #
301 # $library_ctx->{DEPEND_LIST} -         the list of rules on which this library depends
302 #
303 # $library_ctx->{LIBRARY_NAME} -        the shared library name
304 # $library_ctx->{LIBRARY_REALNAME} -    the shared library real name
305 # $library_ctx->{LIBRARY_SONAME} - the shared library soname
306 # $library_ctx->{LINK_LIST} -   the list of objectfiles and external libraries
307 #                                       which sould be linked to this shared library
308 # $library_ctx->{LINK_FLAGS} -  linker flags used by this shared library
309 #
310 # $output -             the resulting output buffer
311 sub _prepare_shared_library_rule($)
312 {
313         my $ctx = shift;
314         my $output;
315
316         my $tmpdepend = array2oneperline($ctx->{DEPEND_LIST});
317         my $tmpshlink = array2oneperline($ctx->{LINK_LIST});
318         my $tmpshflag = array2oneperline($ctx->{LINK_FLAGS});
319
320         $output = << "__EOD__";
321 LIBRARY_$ctx->{NAME}_DEPEND_LIST =$tmpdepend
322 LIBRARY_$ctx->{NAME}_SHARED_LINK_LIST =$tmpshlink
323 LIBRARY_$ctx->{NAME}_SHARED_LINK_FLAGS =$tmpshflag
324 #
325
326 $ctx->{TARGET}: \$(LIBRARY_$ctx->{NAME}_DEPEND_LIST) \$(LIBRARY_$ctx->{NAME}_OBJS) bin/.dummy
327         \@echo Linking \$\@
328         \@\$(SHLD) \$(SHLD_FLAGS) -o \$\@ \\
329                 \$(LIBRARY_$ctx->{NAME}_SHARED_LINK_FLAGS) \\
330                 \$(LIBRARY_$ctx->{NAME}_SHARED_LINK_LIST)
331
332 __EOD__
333
334         if (defined($ctx->{LIBRARY_SONAME})) {
335             $output .= << "__EOD__";
336 # Symlink $ctx->{LIBRARY_SONAME}
337 bin/$ctx->{LIBRARY_SONAME}: bin/$ctx->{LIBRARY_REALNAME} bin/.dummy
338         \@echo Symlink \$\@
339         \@ln -sf $ctx->{LIBRARY_REALNAME} \$\@
340 # Symlink $ctx->{LIBRARY_NAME}
341 bin/$ctx->{LIBRARY_NAME}: bin/$ctx->{LIBRARY_SONAME} bin/.dummy
342         \@echo Symlink \$\@
343         \@ln -sf $ctx->{LIBRARY_SONAME} \$\@
344
345 __EOD__
346         }
347
348 $output .= << "__EOD__";
349 library_$ctx->{NAME}: basics bin/lib$ctx->{LIBRARY_NAME}
350
351 __EOD__
352
353         return $output;
354 }
355
356 sub _prepare_mergedobj_rule($)
357 {
358         my $ctx = shift;
359
360         return "" unless $ctx->{TARGET};
361
362         my $tmpdepend = array2oneperline($ctx->{DEPEND_LIST});
363
364         my $output = "$ctx->{TYPE}_$ctx->{NAME}_DEPEND_LIST = $tmpdepend\n";
365
366         $output .= "$ctx->{TARGET}: \$($ctx->{TYPE}_$ctx->{NAME}_DEPEND_LIST) \$($ctx->{TYPE}_$ctx->{NAME}_OBJS)\n";
367
368         $output .= "\t\@echo \"Pre-Linking $ctx->{TYPE} $ctx->{NAME}\"\n";
369         $output .= "\t@\$(LD) -r \$($ctx->{TYPE}_$ctx->{NAME}_OBJS) -o $ctx->{TARGET}\n";
370         $output .= "\n";
371
372         return $output;
373 }
374
375 sub _prepare_objlist_rule($)
376 {
377         my $ctx = shift;
378         my $tmpdepend = array2oneperline($ctx->{DEPEND_LIST});
379
380         return "" unless $ctx->{TARGET};
381
382         my $output = "$ctx->{TYPE}_$ctx->{NAME}_DEPEND_LIST = $tmpdepend\n";
383         $output .= "$ctx->{TARGET}: ";
384         $output .= "\$($ctx->{TYPE}_$ctx->{NAME}_DEPEND_LIST) \$($ctx->{TYPE}_$ctx->{NAME}_OBJS)\n";
385         $output .= "\t\@touch $ctx->{TARGET}\n";
386
387         return $output;
388 }
389
390 ###########################################################
391 # This function creates a make rule for linking a library
392 #
393 # $output = _prepare_static_library_rule($library_ctx)
394 #
395 # $library_ctx -                the library context
396 #
397 # $library_ctx->{NAME} -                the library name
398 #
399 # $library_ctx->{DEPEND_LIST} -         the list of rules on which this library depends
400 #
401 # $library_ctx->{LIBRARY_NAME} -        the static library name
402 # $library_ctx->{LINK_LIST} -   the list of objectfiles which sould be linked
403 #                                       to this static library
404 # $library_ctx->{LINK_FLAGS} -  linker flags used by this static library
405 #
406 # $output -             the resulting output buffer
407 sub _prepare_static_library_rule($)
408 {
409         my $ctx = shift;
410         my $output;
411
412         my $tmpdepend = array2oneperline($ctx->{DEPEND_LIST});
413         my $tmpstlink = array2oneperline($ctx->{LINK_LIST});
414         my $tmpstflag = array2oneperline($ctx->{LINK_FLAGS});
415
416         $output = << "__EOD__";
417 LIBRARY_$ctx->{NAME}_DEPEND_LIST =$tmpdepend
418 #
419 LIBRARY_$ctx->{NAME}_STATIC_LINK_LIST =$tmpstlink
420 #
421 $ctx->{TARGET}: \$(LIBRARY_$ctx->{NAME}_DEPEND_LIST) \$(LIBRARY_$ctx->{NAME}_OBJS) bin/.dummy
422         \@echo Linking \$@
423         \@\$(STLD) \$(STLD_FLAGS) \$@ \\
424                 \$(LIBRARY_$ctx->{NAME}_STATIC_LINK_LIST)
425
426 library_$ctx->{NAME}: basics $ctx->{TARGET}
427
428 __EOD__
429
430         return $output;
431 }
432
433 ###########################################################
434 # This function creates a make rule for linking a binary
435 #
436 # $output = _prepare_binary_rule($binary_ctx)
437 #
438 # $binary_ctx -         the binary context
439 #
440 # $binary_ctx->{NAME} -         the binary name
441 # $binary_ctx->{BINARY} -       the binary binary name
442 #
443 # $binary_ctx->{DEPEND_LIST} -  the list of rules on which this binary depends
444 # $binary_ctx->{LINK_LIST} -    the list of objectfiles and external libraries
445 #                               which sould be linked to this binary
446 # $binary_ctx->{LINK_FLAGS} -   linker flags used by this binary
447 #
448 # $output -             the resulting output buffer
449 sub _prepare_binary_rule($)
450 {
451         my $ctx = shift;
452
453         my $tmpdepend = array2oneperline($ctx->{DEPEND_LIST});
454         my $tmplink = array2oneperline($ctx->{LINK_LIST});
455         my $tmpflag = array2oneperline($ctx->{LINK_FLAGS});
456
457         my $output = << "__EOD__";
458 #
459 BINARY_$ctx->{NAME}_DEPEND_LIST =$tmpdepend
460 BINARY_$ctx->{NAME}_LINK_LIST =$tmplink
461 BINARY_$ctx->{NAME}_LINK_FLAGS =$tmpflag
462 #
463 bin/$ctx->{BINARY}: bin/.dummy \$(BINARY_$ctx->{NAME}_DEPEND_LIST) \$(BINARY_$ctx->{NAME}_OBJS)
464         \@echo Linking \$\@
465         \@\$(CC) \$(LD_FLAGS) -o \$\@ \\
466                 \$\(BINARY_$ctx->{NAME}_LINK_FLAGS) \\
467                 \$\(BINARY_$ctx->{NAME}_LINK_LIST) \\
468                 \$\(BINARY_$ctx->{NAME}_LINK_FLAGS)
469 binary_$ctx->{BINARY}: basics bin/$ctx->{BINARY}
470
471 __EOD__
472
473         return $output;
474 }
475
476 sub _prepare_custom_rule($)
477 {
478         my $ctx = shift;
479         return "
480 $ctx->{NAME}: bin/.TARGET_$ctx->{NAME}
481
482 bin/.TARGET_$ctx->{NAME}:
483         $ctx->{CMD}
484         touch bin/.TARGET_$ctx->{NAME}
485 ";
486 }
487
488 sub _prepare_clean_rules()
489 {
490         my $output = << '__EOD__';
491 clean: heimdal_clean
492         @echo Removing headers
493         @-rm -f include/proto.h
494         @echo Removing objects
495         @-find . -name '*.o' -exec rm -f '{}' \;
496         @echo Removing binaries
497         @-rm -f $(BIN_PROGS) $(SBIN_PROGS)
498         @echo Removing dummy targets
499         @-rm -f bin/.*_*
500         @echo Removing generated files
501         @-rm -rf librpc/gen_*
502
503 distclean: clean
504         -rm -f bin/.dummy
505         -rm -f include/config.h include/smb_build.h
506         -rm -f Makefile Makefile.in
507         -rm -f config.status
508         -rm -f config.log config.cache
509         -rm -f samba4-deps.dot
510         -rm -f config.pm config.mk
511         -rm -f lib/registry/winregistry.pc
512 __EOD__
513
514         if ($config{developer} eq "yes") {
515                 $output .= "\t\@-rm -f \$(_ALL_OBJS_OBJS:.o=.d)\n";
516         }
517
518         $output .= << '__EOD__';
519
520 removebackup:
521         -rm -f *.bak *~ */*.bak */*~ */*/*.bak */*/*~ */*/*/*.bak */*/*/*~
522
523 realdistclean: distclean removebackup
524         -rm -f include/config.h.in
525         -rm -f include/version.h
526         -rm -f configure
527         -rm -f $(MANPAGES)
528 __EOD__
529
530         return $output;
531 }
532
533 sub _prepare_make_target($)
534 {
535         my $ctx = shift;
536         my $tmpdepend;
537
538         $tmpdepend = array2oneperline($ctx->{DEPEND_LIST});
539
540         return << "__EOD__";
541 $ctx->{TARGET}: basics $tmpdepend
542
543 __EOD__
544 }
545
546 sub _prepare_target_settings($)
547 {
548         my $CTX = shift;
549         my $output = "";
550
551         foreach my $key (values %$CTX) {
552                 if (defined($key->{OBJ_LIST})) {
553                         $output .= _prepare_obj_list($key->{TYPE}, $key);
554                         $output .= _prepare_cflags($key->{TYPE}, $key);
555                 }
556         }
557
558         return $output;
559 }
560
561 sub _prepare_rule_lists($)
562 {
563         my $depend = shift;
564         my $output = "";
565
566         foreach my $key (values %{$depend}) {
567                 next unless defined $key->{OUTPUT_TYPE};
568
569                 ($output .= _prepare_mergedobj_rule($key)) if $key->{OUTPUT_TYPE} eq "MERGEDOBJ";
570                 ($output .= _prepare_objlist_rule($key)) if $key->{OUTPUT_TYPE} eq "OBJLIST";
571                 ($output .= _prepare_static_library_rule($key)) if $key->{OUTPUT_TYPE} eq "STATIC_LIBRARY";
572                 ($output .= _prepare_shared_library_rule($key)) if $key->{OUTPUT_TYPE} eq "SHARED_LIBRARY";
573                 ($output .= _prepare_binary_rule($key)) if $key->{OUTPUT_TYPE} eq "BINARY";
574                 ($output .= _prepare_custom_rule($key) ) if $key->{TYPE} eq "TARGET";
575         }
576
577         $output .= _prepare_clean_rules();
578
579         return $output;
580 }
581
582 ###########################################################
583 # This function prepares the output for Makefile
584 #
585 # $output = _prepare_makefile_in($OUTPUT)
586 #
587 # $OUTPUT -     the global OUTPUT context
588 #
589 # $output -             the resulting output buffer
590 sub _prepare_makefile_in($)
591 {
592         my ($CTX) = @_;
593         my $output;
594
595         $output  = "############################################\n";
596         $output .= "# Autogenerated by build/smb_build/main.pl #\n";
597         $output .= "############################################\n";
598         $output .= "\n";
599
600         $output .= _prepare_path_vars();
601         $output .= _prepare_compiler_linker();
602         $output .= _prepare_default_rule();
603         $output .= _prepare_SUFFIXES();
604         $output .= _prepare_dummy_MAKEDIR();
605         $output .= _prepare_std_CC_rule("c","o",$config{PICFLAG},"Compiling","Rule for std objectfiles");
606         $output .= _prepare_std_CC_rule("h","h.gch",$config{PICFLAG},"Precompiling","Rule for precompiled headerfiles");
607
608         $output .= _prepare_depend_CC_rule();
609         
610         $output .= _prepare_man_rule("1");
611         $output .= _prepare_man_rule("3");
612         $output .= _prepare_man_rule("5");
613         $output .= _prepare_man_rule("7");
614         $output .= _prepare_manpages($CTX);
615         $output .= _prepare_binaries($CTX);
616         $output .= _prepare_target_settings($CTX);
617         $output .= _prepare_rule_lists($CTX);
618         $output .= _prepare_config_status();
619
620         if ($config{developer} eq "yes") {
621                 $output .= <<__EOD__
622 #-include \$(_ALL_OBJS_OBJS:.o=.d)
623 IDL_FILES = \$(wildcard librpc/idl/*.idl)
624 \$(patsubst librpc/idl/%.idl,librpc/gen_ndr/ndr_%.c,\$(IDL_FILES)) \\
625 \$(patsubst librpc/idl/%.idl,librpc/gen_ndr/ndr_\%_c.c,\$(IDL_FILES)) \\
626 \$(patsubst librpc/idl/%.idl,librpc/gen_ndr/ndr_%.h,\$(IDL_FILES)): idl
627 __EOD__
628         }
629
630         return $output;
631 }
632
633 ###########################################################
634 # This function creates Makefile.in from the OUTPUT 
635 # context
636 #
637 # create_makefile_in($OUTPUT)
638 #
639 # $OUTPUT       -       the global OUTPUT context
640 #
641 # $output -             the resulting output buffer
642 sub create_makefile_in($$$)
643 {
644         my ($CTX, $mk, $file) = @_;
645
646         open(MAKEFILE_IN,">$file") || die ("Can't open $file\n");
647         print MAKEFILE_IN _prepare_makefile_in($CTX) . $mk;
648         close(MAKEFILE_IN);
649
650         print "build/smb_build/main.pl: creating $file\n";
651         return; 
652 }
653
654 1;