r12620: Get rid of automatically generated lists of init functions of subsystems.
[samba.git] / source / build / smb_build / config_mk.pm
1 # Samba Build System
2 # - config.mk parsing functions
3 #
4 #  Copyright (C) Stefan (metze) Metzmacher 2004
5 #  Copyright (C) Jelmer Vernooij 2005
6 #  Released under the GNU GPL
7 #
8
9 package smb_build::config_mk;
10 use smb_build::input;
11 use File::Basename;
12
13 use strict;
14
15 my $section_types = {
16         "EXT_LIB" => {
17                 "LIBS"                  => "list",
18                 "CFLAGS"                => "list",
19                 "CPPFLAGS"              => "list",
20                 "LDFLAGS"               => "list",
21                 },
22         "SUBSYSTEM" => {
23                 "OBJ_FILES"             => "list",
24
25                 "REQUIRED_SUBSYSTEMS"   => "list",
26
27                 "ENABLE"                => "bool",
28                 "NOPROTO"               => "bool",
29
30                 "MANPAGE"               => "string",
31
32                 "PUBLIC_PROTO_HEADER" => "string",
33                 "PRIVATE_PROTO_HEADER" => "string"
34                 },
35         "MODULE" => {
36                 "SUBSYSTEM"             => "string",
37
38                 "INIT_FUNCTION"         => "string",
39                 "OBJ_FILES"             => "list",
40
41                 "REQUIRED_SUBSYSTEMS"   => "list",
42
43                 "ENABLE"                => "bool",
44                 "NOPROTO"               => "bool",
45
46                 "MANPAGE"               => "string",
47                 "PRIVATE_PROTO_HEADER" => "string"
48                 },
49         "BINARY" => {
50                 "OBJ_FILES"             => "list",
51
52                 "REQUIRED_SUBSYSTEMS"   => "list",
53
54                 "ENABLE"                => "bool",
55                 "NOPROTO"               => "bool",
56
57                 "MANPAGE"               => "string",
58                 "INSTALLDIR"            => "string",
59                 "PRIVATE_PROTO_HEADER" => "string"
60                 },
61         "LIBRARY" => {
62                 "MAJOR_VERSION"         => "string",
63                 "MINOR_VERSION"         => "string",
64                 "RELEASE_VERSION"       => "string",
65
66                 "OBJ_FILES"             => "list",
67
68                 "DESCRIPTION" => "string",
69
70                 "REQUIRED_SUBSYSTEMS"   => "list",
71
72                 "ENABLE"                => "bool",
73                 "NOPROTO"               => "bool",
74
75                 "MANPAGE"               => "string",
76
77                 "PUBLIC_HEADERS" => "list",
78
79                 "PUBLIC_PROTO_HEADER" => "string",
80                 "PRIVATE_PROTO_HEADER" => "string"
81                 }
82 };
83
84 use vars qw(@parsed_files);
85
86 @parsed_files = ();
87
88 ###########################################################
89 # The parsing function which parses the file
90 #
91 # $result = _parse_config_mk($filename)
92 #
93 # $filename -   the path of the config.mk file
94 #               which should be parsed
95 sub run_config_mk($$$)
96 {
97         sub run_config_mk($$$);
98         my ($input, $srcdir, $filename) = @_;
99         my $result;
100         my $linenum = -1;
101         my $infragment = 0;
102         my $section = "GLOBAL";
103         my $makefile = "";
104
105         push (@parsed_files, $srcdir."/".$filename);
106         
107         open(CONFIG_MK, $srcdir."/".$filename) or die("Can't open `$srcdir/$filename'\n");
108         my @lines = <CONFIG_MK>;
109         close(CONFIG_MK);
110
111         my $line = "";
112         my $prev = "";
113
114         foreach (@lines) {
115                 $linenum++;
116
117                 # lines beginning with '#' are ignored
118                 next if (/^\#.*$/);
119                 
120                 if (/^(.*)\\$/) {
121                         $prev .= $1;
122                         next;
123                 } else {
124                         $line = "$prev$_";
125                         $prev = "";
126                 }
127
128                 if ($line =~ /^\[([a-zA-Z0-9_:]+)\][\t ]*$/) 
129                 {
130                         $section = $1;
131                         $infragment = 0;
132                         next;
133                 }
134
135                 # include
136                 if ($line =~ /^include (.*)$/) {
137                         $makefile .= run_config_mk($input, $srcdir, dirname($filename)."/$1");
138                         next;
139                 }
140
141                 # empty line
142                 if ($line =~ /^[ \t]*$/) {
143                         $section = "GLOBAL";
144                         if ($infragment) { $makefile.="\n"; }
145                         next;
146                 }
147
148                 # global stuff is considered part of the makefile
149                 if ($section eq "GLOBAL") {
150                         $makefile .= $line;
151                         $infragment = 1;
152                         next;
153                 }
154
155                 
156                 # Assignment
157                 if ($line =~ /^([a-zA-Z0-9_]+)[\t ]*=(.*)$/) {
158                         $result->{$section}{$1}{VAL} = $2;
159                         $result->{$section}{$1}{KEY} = $1;
160                 
161                         next;
162                 }
163
164                 die("$srcdir."/".$filename:$linenum: Bad line while parsing $srcdir."/".$filename");
165         }
166
167         foreach my $section (keys %{$result}) {
168                 my ($type, $name) = split(/::/, $section, 2);
169
170                 my $sectype = $section_types->{$type};
171                 if (not defined($sectype)) {
172                         die($srcdir."/".$filename.":[".$section."] unknown section type \"".$type."\"!");
173                 }
174
175                 $input->{$name}{NAME} = $name;
176                 $input->{$name}{TYPE} = $type;
177                 $input->{$name}{BASEDIR} = $srcdir."/".dirname($filename);
178
179                 foreach my $key (values %{$result->{$section}}) {
180                         $key->{VAL} = smb_build::input::strtrim($key->{VAL});
181                         my $vartype = $sectype->{$key->{KEY}};
182                         if (not defined($vartype)) {
183                                 die($srcdir."/".$filename.":[".$section."]: unknown attribute type \"$key->{KEY}\"!");
184                         }
185                         if ($vartype eq "string") {
186                                 $input->{$name}{$key->{KEY}} = $key->{VAL};
187                         } elsif ($vartype eq "list") {
188                                 $input->{$name}{$key->{KEY}} = [smb_build::input::str2array($key->{VAL})];
189                         } elsif ($vartype eq "bool") {
190                                 if (($key->{VAL} ne "YES") and ($key->{VAL} ne "NO")) {
191                                         die("Invalid value for bool attribute $key->{KEY}: $key->{VAL} in section $section");
192                                 }
193                                 $input->{$name}{$key->{KEY}} = $key->{VAL};
194                         }
195                 }
196         }
197
198         return $makefile;
199 }
200
201 1;