[prev in list] [next in list] [prev in thread] [next in thread]
List: autoconf
Subject: Re: Autotools lint tool
From: "David A. Wheeler" <dwheeler () dwheeler ! com>
Date: 2019-10-04 2:09:45
Message-ID: E1iGD2P-0002OR-SP () rmmprod07 ! runbox
[Download RAW message or body]
> On Oct 2, 2019, at 9:58 PM, Gabriel Lisaca <gabriel.lisaca@gmail.com> wrote:
> > Sorry, I may have made my question unclear. What I meant by a "lint" tool for \
> > autoconf (and the autotools in general) is to check rather trivial things like \
> > syntax and arguments to macros to conform to what the documentation intends \
> > (e.g., number of arguments to a macro).
On Wed, 2 Oct 2019 23:05:25 -0600, Warren Young <warren@etr-usa.com> wrote:
> That's the "better diagnostics" case I brought up in my reply. Give us a case \
> where one of the Autotools didn't detect incorrect syntax, and someone will likely \
> add a check for that case or explain why a check can't be written.
Typical "linters" usually don't look for *incorrect* syntax, since other tools \
already do that, and instead work to identify constructs that are likely wrong (even \
though they are syntactically correct).
That said, I completely agree that it'd be very wise to *first* create a list of some \
checks you'd like to implement, and then find the best way to implement them. Then \
you'll know what the linter will need to do. Also, although autoconf and automake are \
separate tools, they are often used together, and a linter needs to be prepared for \
that combination.
Here are some potential ideas of rules an autotools linter might check:
* Warn about non-empty macro arguments that are non-numbers and aren't surrounded by \
[...]. These are syntactically legal, but can lead to trouble, so my simple rule is \
to always surround non-numbers with [...].
* Warn about whitespace between a macro name and its following invoking '(".
* Warn about whitespace following an argument (after "," or before the closing ")").
* Require including this line: AC_CONFIG_AUX_DIR([build-aux])
* Require including this line: AC_CONFIG_MACRO_DIR([m4])
* If there's a "Makefile.am", require that it include ACLOCAL_AMFLAGS = -I m4 \
--install
* If there's a "Makefile.am", complain bitterly if it includes "SUBDIRS="; that \
suggests a recursive build, which is almost always a terrible idea that leads to \
endless trouble.
These are rules I follow and mention in https://www.youtube.com/watch?v=4q_inV9M_us
I would also consider this rule:
* Bitterly whine about any use of m4's changequote. Yes, it's syntactically allowed, \
but that will totally confuse many people & tools.
I strongly urge you to implement some way to disable the next warning
from a comment *within* the code, so that if a warning is a false positive
it's still possible to end up with a clean result.
Most modern linters (like shellcheck) can do this.
> The Autotools do detect many such cases already. For example, it'll yell at you if \
> you name the input to Autoconf "configure.in", its original name, replaced about 10 \
> years ago with "configure.ac".
Which is great! In those cases it's probably not worth implementing the same check \
in your linter (unless, of course, you worry some people will only be using old \
versions of autoconf). Conversely, if the check can be added to the autotools \
themselves, that might be worth doing.
> I'm not sure a macro language like M4 can be reliably syntax-checked, since it \
> intermixes two or more different languages. The higher level (M4) doesn't know the \
> rules of the lower level language, and the lower-level language (shell, in this \
> case) can't see the higher level, being already pre-processed.
> A "lint" tool for a given pairing could be written, but it'd need to understand \
> both languages' syntaxes and how they interact. Tricky.
Not really. In many cases a linter needs only understand the m4 syntax, so that it \
can figure out where the arguments begin & end. Instead of handling arbitrary \
lower-level syntax, it could simply check only certain arguments of certain macros to \
see if they meet certain rules.
A linter only needs to focus on detecting *common* mistakes and/or enforce a style. \
Hopefully the style rules themselves exist to help avoid common mistakes. As long as \
you only try to do that, the inability to handle everything is just fine.
--- David A. Wheeler
_______________________________________________
Autoconf mailing list
Autoconf@gnu.org
https://lists.gnu.org/mailman/listinfo/autoconf
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic