Since last week's post-YAPC hackathon I've been trying to write tests for
config/inter/lex.pm,
the package which governs Parrot configuration step inter::lex. Per the POD,
this step "[d]
etermines whether 'lex' is installed and if it's actually 'flex' of least the
user-specified
minimum version, defaulting to 2.5.33."
In the Phalanx-model of testing, we try to write enough tests to exercise every
statement in
the code and, within each statement, each branch and condition. One major
implication of
this is that we try to write tests to cover each 'return' statement from each
subroutine within
the code. In the case of config/inter/lex.pm, this is quite a challenge, since
its subroutine
'runstep()' has no fewer than *eight* return statements, i.e., eight different
possible
outcomes for running this configuration step. (This is also true of
config/inter/yacc.pm.)
I anticipate writing a series of posts to this RT ticket about different
aspects of config/inter/
lex.pm. To start, let me ask about the '--maintainer' option to Configure.pl.
This
configuration option was added four years ago "to work around imcc
dependencies." When
set, its most important effect appears to come in config/auto/gcc.pm later in
the
configuration process when it causes Parrot to be compiled with "
-Wlarger-than-4096".
Two years ago, however, Configure.pl and config/inter/lex.pm were modified such
that:
(a) If either of the '--lex' or '--yacc' options to Configure.pl were set, the
'--maintainer'
option would be set as well.
(b) If the '--maintainer' option was *not* set (either explicitly or implicitly
by setting '--lex'
or '--yacc'), then configuration step inter::lex immediately short-circuits.
It makes no further
attempt to determine whether you have a 'lex'-like program on disk or whether
you have a
sufficient version of 'flex'. You are not prompted to provide input on STDIN.
A result of
'skipped' is set; 'runstep()' exits; and configuration goes on to the next step.
unless ( $conf->options->get('maintainer') ) {
$conf->data->set( $util => 'echo' ); # here, $util = 'lex'
$self->set_result('skipped');
return $self;
}
Since you have to explicitly set certain options to Configure.pl to get past
this point in
inter::lex, Parrot's configuration by default does not attempt to determine
whether you have
a 'lex'-like program available.
My question is this: Is this a good thing?
In other words, is it good that, by default, Parrot's configuration does *not*
attempt to
determine whether you have a 'lex'-like or 'yacc'-like program on disk? Are we
depriving the
Makefile of any significant information by customarily sidestepping this probe?
Shouldn't
Parrot's default configuration behavior be to seek out information rather than
to skip that
search?
Thank you very much.
kid51