2 # - config.mk parsing functions
4 # Copyright (C) Stefan (metze) Metzmacher 2004
5 # Copyright (C) Jelmer Vernooij 2005
6 # Released under the GNU GPL
9 package smb_build::config_mk;
23 "OBJ_FILES" => "list",
25 "PRIVATE_DEPENDENCIES" => "list",
26 "PUBLIC_DEPENDENCIES" => "list",
30 "MANPAGE" => "string",
32 "PUBLIC_PROTO_HEADER" => "string",
33 "PRIVATE_PROTO_HEADER" => "string",
35 "PUBLIC_HEADERS" => "list",
39 "STANDARD_VISIBILITY" => "string"
42 "SUBSYSTEM" => "string",
44 "INIT_FUNCTION" => "string",
45 "OBJ_FILES" => "list",
47 "PUBLIC_DEPENDENCIES" => "list",
48 "PRIVATE_DEPENDENCIES" => "list",
54 "OUTPUT_TYPE" => "string",
56 "MANPAGE" => "string",
57 "PRIVATE_PROTO_HEADER" => "string",
58 "PUBLIC_PROTO_HEADER" => "string",
61 "PUBLIC_HEADERS" => "list",
66 "OBJ_FILES" => "list",
68 "PRIVATE_DEPENDENCIES" => "list",
72 "MANPAGE" => "string",
73 "INSTALLDIR" => "string",
74 "PRIVATE_PROTO_HEADER" => "string",
75 "PUBLIC_PROTO_HEADER" => "string",
76 "PUBLIC_HEADERS" => "list",
79 "STANDARD_VISIBILITY" => "string",
81 "USE_HOSTCC" => "bool"
84 "VERSION" => "string",
85 "SO_VERSION" => "string",
86 "LIBRARY_REALNAME" => "string",
88 "INIT_FUNCTION_TYPE" => "string",
90 "OBJ_FILES" => "list",
92 "DESCRIPTION" => "string",
94 "PRIVATE_DEPENDENCIES" => "list",
95 "PUBLIC_DEPENDENCIES" => "list",
99 "MANPAGE" => "string",
101 "PUBLIC_HEADERS" => "list",
103 "PUBLIC_PROTO_HEADER" => "string",
104 "PRIVATE_PROTO_HEADER" => "string",
108 "STANDARD_VISIBILITY" => "string"
112 use vars qw(@parsed_files);
116 ###########################################################
117 # The parsing function which parses the file
119 # $result = _parse_config_mk($filename)
121 # $filename - the path of the config.mk file
122 # which should be parsed
123 sub run_config_mk($$$$)
125 sub run_config_mk($$$$);
126 my ($input, $srcdir, $builddir, $filename) = @_;
130 my $section = "GLOBAL";
133 my $parsing_file = $builddir."/".$filename;
135 $ENV{samba_builddir} = $builddir;
136 $ENV{samba_srcdir} = $srcdir;
138 if (!open(CONFIG_MK, $parsing_file)) {
139 $parsing_file = $srcdir."/".$filename;
140 open(CONFIG_MK, $parsing_file) or
141 die("Can't open neither `$builddir."/".$filename' nor `$srcdir/$filename'\n");
144 push (@parsed_files, $parsing_file);
147 my @lines = <CONFIG_MK>;
156 # lines beginning with '#' are ignored
167 if ($line =~ /^\[([-a-zA-Z0-9_:]+)\][\t ]*$/)
175 if ($line =~ /^include (.*)$/) {
176 $makefile .= run_config_mk($input, $srcdir, $builddir, dirname($filename)."/$1");
181 if ($line =~ /^[ \t]*$/) {
183 if ($infragment) { $makefile.="\n"; }
187 # global stuff is considered part of the makefile
188 if ($section eq "GLOBAL") {
189 if (!$infragment) { $makefile.="\n"; }
197 if ($line =~ /^([a-zA-Z0-9_]+)[\t ]*=(.*)$/) {
198 $result->{$section}{$1}{VAL} = $2;
199 $result->{$section}{$1}{KEY} = $1;
204 die("$parsing_file:$linenum: Bad line while parsing $parsing_file");
207 foreach my $section (keys %{$result}) {
208 my ($type, $name) = split(/::/, $section, 2);
210 my $sectype = $section_types->{$type};
211 if (not defined($sectype)) {
212 die($parsing_file.":[".$section."] unknown section type \"".$type."\"!");
215 $input->{$name}{NAME} = $name;
216 $input->{$name}{TYPE} = $type;
217 $input->{$name}{MK_FILE} = $parsing_file;
218 $input->{$name}{BASEDIR} = dirname($filename);
220 foreach my $key (values %{$result->{$section}}) {
221 $key->{VAL} = smb_build::input::strtrim($key->{VAL});
222 my $vartype = $sectype->{$key->{KEY}};
223 if (not defined($vartype)) {
224 die($parsing_file.":[".$section."]: unknown attribute type \"$key->{KEY}\"!");
226 if ($vartype eq "string") {
227 $input->{$name}{$key->{KEY}} = $key->{VAL};
228 } elsif ($vartype eq "list") {
229 $input->{$name}{$key->{KEY}} = [smb_build::input::str2array($key->{VAL})];
230 } elsif ($vartype eq "bool") {
231 if (($key->{VAL} ne "YES") and ($key->{VAL} ne "NO")) {
232 die("Invalid value for bool attribute $key->{KEY}: $key->{VAL} in section $section");
234 $input->{$name}{$key->{KEY}} = $key->{VAL};