Commit 74e285e7 74e285e77d204d15ef2dedd40483003c3d5746a7 by Sergey Poznyakoff

Require bison and flex

These are needed only during development cycle, as the created sources
are included in the tarball.

* am/bison.m4: New file.
* am/flex.m4: New file.
* configure.ac: Use MU_PROG_BISON and MU_PROG_FLEX
* mu-aux/gylwrap: Drop support for alternative command line syntax
and the --stdout option.
1 parent 7ae106db
1 # bison.m4 serial 1
2 AC_DEFUN([MU_PROG_BISON],
3 [
4 if test "x$ac_cv_prog_YACC" = x; then
5 AC_PROG_YACC
6 if ! $YACC --version 2>/dev/null | grep -q '^bison '; then
7 YACC="$SHELL $missing_dir/missing bison"
8 fi
9 fi
10 ])
11
1 # flex.m4 serial 1
2 AC_DEFUN([MU_PROG_FLEX],
3 [
4 if test "x$LEX" = x; then
5 AC_PROG_LEX
6 if ! $LEX --version 2>/dev/null | grep -q '^flex '; then
7 LEX="$SHELL $missing_dir/missing flex"
8 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
9 AC_SUBST([LEXLIB], [''])
10 fi
11 ])
12
...@@ -72,7 +72,7 @@ AC_SUBST(MU_LIB_COMMON_INCLUDES,'-I${top_builddir} -I${top_srcdir}/include -I${ ...@@ -72,7 +72,7 @@ AC_SUBST(MU_LIB_COMMON_INCLUDES,'-I${top_builddir} -I${top_srcdir}/include -I${
72 AC_SUBST(MU_APP_COMMON_INCLUDES,'-I${srcdir} -I${top_srcdir}/include -I${top_srcdir}/lib -I${top_srcdir}/lib/gnu -I${top_builddir}/lib/gnu -I${top_builddir} -I${top_builddir}/include') 72 AC_SUBST(MU_APP_COMMON_INCLUDES,'-I${srcdir} -I${top_srcdir}/include -I${top_srcdir}/lib -I${top_srcdir}/lib/gnu -I${top_builddir}/lib/gnu -I${top_builddir} -I${top_builddir}/include')
73 73
74 # Use our replacement for the ylwrap tool 74 # Use our replacement for the ylwrap tool
75 AC_SUBST([MU_YLWRAP],'$(mu_aux_dir)/gylwrap --compatibility --') 75 AC_SUBST([MU_YLWRAP],'$(mu_aux_dir)/gylwrap --')
76 76
77 dnl Check for programs 77 dnl Check for programs
78 AC_PROG_CC 78 AC_PROG_CC
...@@ -83,8 +83,8 @@ AC_PROG_INSTALL ...@@ -83,8 +83,8 @@ AC_PROG_INSTALL
83 AC_PROG_LN_S 83 AC_PROG_LN_S
84 AC_LIBTOOL_DLOPEN 84 AC_LIBTOOL_DLOPEN
85 AC_PROG_LIBTOOL 85 AC_PROG_LIBTOOL
86 AC_PROG_YACC 86 MU_PROG_BISON
87 AM_PROG_LEX 87 MU_PROG_LEX
88 AM_PROG_LIBTOOL 88 AM_PROG_LIBTOOL
89 89
90 ## Predefine several variables used to display configuration status 90 ## Predefine several variables used to display configuration status
......
...@@ -149,8 +149,13 @@ typedef unsigned int mu_debug_level_t; ...@@ -149,8 +149,13 @@ typedef unsigned int mu_debug_level_t;
149 149
150 #define MU_DEFAULT_RECORD _MU_DEFAULT_RECORD_ 150 #define MU_DEFAULT_RECORD _MU_DEFAULT_RECORD_
151 151
152 /* The use of this structure and associated ioctl is deprecated. This 152 /* This structure used to be called mu_locus in mailutils up to
153 definition is provided for transition period */ 153 3.2.91-46 [release-3.2-71-g719e64a]. It is superseded by
154 structs mu_locus_point and mu_locus_range, defined in
155 <mailutils/locus.h>.
156
157 This definition is provided for backward compatibility. Authors are
158 urged to switch to the new API as soon as their time permits. */
154 struct mu_locus_DEPRECATED 159 struct mu_locus_DEPRECATED
155 { 160 {
156 char *mu_file; 161 char *mu_file;
......
...@@ -35,22 +35,9 @@ gylwrap - wrapper for yacc, lex and similar programs ...@@ -35,22 +35,9 @@ gylwrap - wrapper for yacc, lex and similar programs
35 =head1 SYNOPSIS 35 =head1 SYNOPSIS
36 36
37 B<gylwrap> 37 B<gylwrap>
38 [B<-c?>]
39 [B<--compatibility>]
40 [B<--yyrepl=>I<PREFIX>]
41 [B<--yysym=>I<STRING>]
42 [B<--stdout>]
43 [B<--help>]
44 [B<--version>]
45 I<COMMAND>
46 I<INPUT>
47 I<OUTPUT> I<DESIRED>...
48
49 B<ylwrap>
50 [B<-?>] 38 [B<-?>]
51 [B<--yyrepl=>I<PREFIX>] 39 [B<--yyrepl=>I<PREFIX>]
52 [B<--yysym=>I<STRING>] 40 [B<--yysym=>I<STRING>]
53 [B<--stdout>]
54 [B<--help>] 41 [B<--help>]
55 [B<--version>] 42 [B<--version>]
56 I<INPUT> 43 I<INPUT>
...@@ -66,9 +53,9 @@ symbols to avoid clashes when multiple parsers and/or lexers are ...@@ -66,9 +53,9 @@ symbols to avoid clashes when multiple parsers and/or lexers are
66 linked in a single executable. 53 linked in a single executable.
67 54
68 To achieve this, B<gylwrap> creates a temporary directory, changes 55 To achieve this, B<gylwrap> creates a temporary directory, changes
69 to it, and runs I<COMMAND> (which may contain arguments and options) 56 to it, and runs I<PROGRAM>, with I<ARGS> and I<INPUT> as its arguments.
70 with I<INPUT> as its last argument. Upon successful exit, it processes 57 Upon successful exit from I<PROGRAM>, B<gylwrap> processes the
71 the I<OUTPUT> I<DESIRED> pairs. Each I<OUTPUT> file is then renamed 58 I<OUTPUT>-I<DESIRED> pairs. Each I<OUTPUT> file is then renamed
72 to the file I<DESIRED>, taking care to fix up any eventual B<#line> 59 to the file I<DESIRED>, taking care to fix up any eventual B<#line>
73 directives. 60 directives.
74 61
...@@ -78,18 +65,11 @@ For a list of symbols that are subject for replacement, inspect the ...@@ -78,18 +65,11 @@ For a list of symbols that are subject for replacement, inspect the
78 B<@sym> variable at the start of the script. Additional names can be 65 B<@sym> variable at the start of the script. Additional names can be
79 added to this list using the B<--yysym> option. 66 added to this list using the B<--yysym> option.
80 67
81 If given the B<--compatibility> option or if invoked as B<ylwrap>, 68 Prior to running the I<PROGRAM>, B<gylwrap> program checks whether the
82 the tool runs in compatibility mode, mimicking the behavior of the 69 file named B<gylwrap.conf> exists in directory of the I<INPUT> file.
83 standard B<ylwrap> utility from GNU Automake. Command line arguments 70 If found, it is parsed as follows. Empty lines and comments (introduced
84 consist of two lists, separated by B<-->. The left-hand side list 71 by the hash sign) are ignored. Rest of lines are either option
85 supplies the I<OUTPUT>,I<DESIRED> pairs, and the right-hand side one 72 assignements, or section headings.
86 supplies the command and its arguments.
87
88 In both modes, prior to running the command, the program looks for file
89 B<gylwrap.conf> in the same directory as the I<INPUT> file. If found,
90 the file is sourced. Empty lines and comments (introduced by the hash
91 sign) are ignored. Rest of lines are either option assignements, or
92 section headings.
93 73
94 Option assignements have the form B<I<OPTION> = I<VALUE>>, and generally, 74 Option assignements have the form B<I<OPTION> = I<VALUE>>, and generally,
95 have the same meaning as the corresponding command line option without 75 have the same meaning as the corresponding command line option without
...@@ -101,10 +81,6 @@ the leading two dashes: ...@@ -101,10 +81,6 @@ the leading two dashes:
101 81
102 Replace the B<yy> prefix with I<PREFIX> in the identifiers. 82 Replace the B<yy> prefix with I<PREFIX> in the identifiers.
103 83
104 =item B<stdout = 1>
105
106 Enable the B<--stdout> option.
107
108 =item B<yysym => I<NAME> 84 =item B<yysym => I<NAME>
109 85
110 Add I<NAME> to the list of symbols suitable for prefix replacement. 86 Add I<NAME> to the list of symbols suitable for prefix replacement.
...@@ -126,14 +102,6 @@ command line argument. ...@@ -126,14 +102,6 @@ command line argument.
126 102
127 =over 4 103 =over 4
128 104
129 =item B<-c>, B<--compatibility>
130
131 Run in compatibility mode.
132
133 =item B<--stdout>
134
135 Redirect I<COMMAND>'s standard output to the first I<OUTPUT>.
136
137 =item B<--yyrepl=>I<PREFIX> 105 =item B<--yyrepl=>I<PREFIX>
138 106
139 Replace the B<yy> prefix in global symbols with I<PREFIX>. 107 Replace the B<yy> prefix in global symbols with I<PREFIX>.
...@@ -233,9 +201,6 @@ my $yyrx; ...@@ -233,9 +201,6 @@ my $yyrx;
233 # String to replace the "yy" prefix with. 201 # String to replace the "yy" prefix with.
234 my $yyrepl; 202 my $yyrepl;
235 203
236 # If set, redirect the stdout from the command to the first output file.
237 my $stdout;
238
239 # Input directory with special characters escaped, for "#line" directive 204 # Input directory with special characters escaped, for "#line" directive
240 # fixup. 205 # fixup.
241 my $input_rx; 206 my $input_rx;
...@@ -244,14 +209,12 @@ my $input_rx; ...@@ -244,14 +209,12 @@ my $input_rx;
244 # input file name. Default entry is ''. 209 # input file name. Default entry is ''.
245 my %config; 210 my %config;
246 211
247 # Name of the first output file. This is used in compatibility mode to 212 # Name of the first output file. This is used to avoid bailing out if
248 # avoid bailing out if one of the output files (except the principal one) 213 # one of the output files (except the principal one) does not exist.
249 # does not exist.
250 my $parser; 214 my $parser;
251 215
252 # Name this program was invoked as. 216 # Name this program was invoked as.
253 my $progname = basename($0); 217 my $progname = basename($0);
254 my $compat = $progname eq 'ylwrap'; # True if running in compatibility mode
255 218
256 # List of files created during the run, for cleanup purposes. 219 # List of files created during the run, for cleanup purposes.
257 my @created; 220 my @created;
...@@ -261,9 +224,7 @@ sub filter { ...@@ -261,9 +224,7 @@ sub filter {
261 my $target = basename($to); 224 my $target = basename($to);
262 my $ifd; 225 my $ifd;
263 unless (open($ifd, '<', $from)) { 226 unless (open($ifd, '<', $from)) {
264 if ($compat) { 227 return if $from ne $parser;
265 return if $from ne $parser;
266 }
267 die "can't open input file $from: $!"; 228 die "can't open input file $from: $!";
268 } 229 }
269 open(my $ofd, '>', $to) 230 open(my $ofd, '>', $to)
...@@ -296,8 +257,8 @@ sub readconf { ...@@ -296,8 +257,8 @@ sub readconf {
296 } elsif (/^\[(.+)\]/) { 257 } elsif (/^\[(.+)\]/) {
297 $key = $1; 258 $key = $1;
298 } elsif (m/(.+?)\s*=\s*(.+)$/) { 259 } elsif (m/(.+?)\s*=\s*(.+)$/) {
299 if ($1 eq 'yysym') { 260 if ($1 eq 'yysym' || $1 eq 'flags') {
300 push @{$config{$key}{$1}}, $2; 261 push @{$config{$key}{$1}}, (split /\s+/, $2);
301 } else { 262 } else {
302 $config{$key}{$1} = $2; 263 $config{$key}{$1} = $2;
303 } 264 }
...@@ -308,28 +269,20 @@ sub readconf { ...@@ -308,28 +269,20 @@ sub readconf {
308 close($fd); 269 close($fd);
309 } 270 }
310 271
311 my ($command, $input, @output); 272 my $input;
273 my @output;
312 274
313 GetOptions("yyrepl=s" => \$yyrepl, 275 GetOptions("yyrepl=s" => \$yyrepl,
314 "yysym=s@" => \@yysym, 276 "yysym=s@" => \@yysym,
315 "stdout" => \$stdout,
316 "compatibility|c" => \$compat,
317 "help|?" => sub { 277 "help|?" => sub {
318 pod2usage(-exitstatus => 0, -verbose => 2); 278 pod2usage(-exitstatus => 0, -verbose => 2);
319 } 279 }
320 ) or exit(1); 280 ) or exit(1);
321 281
322 if ($compat) { 282 $input = shift @ARGV;
323 $input = shift @ARGV; 283 while (my $arg = shift @ARGV) {
324 while (my $arg = shift @ARGV) { 284 last if ($arg eq '--');
325 last if ($arg eq '--'); 285 push @output, $arg;
326 push @output, $arg;
327 }
328 $command = join(' ', @ARGV);
329 } else {
330 pod2usage(-exitstatus => 1, -verbose => 0, -output => \*STDERR)
331 unless @ARGV >= 2;
332 ($command, $input, @output) = @ARGV;
333 } 286 }
334 287
335 pod2usage(-exitstatus => 1, -verbose => 0, -output => \*STDERR) 288 pod2usage(-exitstatus => 1, -verbose => 0, -output => \*STDERR)
...@@ -345,9 +298,6 @@ my $confile = "$input_dir/gylwrap.conf"; ...@@ -345,9 +298,6 @@ my $confile = "$input_dir/gylwrap.conf";
345 readconf($confile) if -r $confile; 298 readconf($confile) if -r $confile;
346 299
347 my $input_base = basename($input); 300 my $input_base = basename($input);
348 unless ($stdout) {
349 $stdout = $config{$input_base}{stdout} || $config{''}{stdout};
350 }
351 unless ($yyrepl) { 301 unless ($yyrepl) {
352 $yyrepl = $config{$input_base}{yyrepl} || $config{''}{yyrepl}; 302 $yyrepl = $config{$input_base}{yyrepl} || $config{''}{yyrepl};
353 } 303 }
...@@ -361,20 +311,13 @@ if ($yyrepl) { ...@@ -361,20 +311,13 @@ if ($yyrepl) {
361 } 311 }
362 } 312 }
363 313
364 my $prog = $command;
365 $prog =~ s/\s.*$//;
366
367 if (my $flags = $config{$input_base}{flags} || $config{''}{flags}) { 314 if (my $flags = $config{$input_base}{flags} || $config{''}{flags}) {
368 $command .= ' ' . $flags; 315 push @ARGV, @$flags;
369 } 316 }
317 push @ARGV, $input;
370 318
371 $parser = $output[0]; 319 $parser = $output[0];
372 320
373 $command .= ' '.$input;
374 if ($stdout) {
375 $command .= '>'.$parser;
376 }
377
378 # Create working directory 321 # Create working directory
379 my $wd = tempdir("ylXXXXXX", DIR => '.', CLEANUP => 1) 322 my $wd = tempdir("ylXXXXXX", DIR => '.', CLEANUP => 1)
380 or die "cannot create temporary directory"; 323 or die "cannot create temporary directory";
...@@ -387,12 +330,12 @@ END { ...@@ -387,12 +330,12 @@ END {
387 chdir ".."; 330 chdir "..";
388 } 331 }
389 332
390 system($command); 333 system(@ARGV);
391 if ($? == -1) { 334 if ($? == -1) {
392 print STDERR "$prog: $!\n"; 335 print STDERR "$ARGV[0]: $!\n";
393 exit(127); 336 exit(127);
394 } elsif ($? & 127) { 337 } elsif ($? & 127) {
395 print STDERR "$prog died with signal ".($? & 127)."\n"; 338 print STDERR "$ARGV[0] died with signal ".($? & 127)."\n";
396 exit(127); 339 exit(127);
397 } else { 340 } else {
398 my $code = $? >> 8; 341 my $code = $? >> 8;
......