> Date: 2026-08-29 10:53:02+0200 > From: Alejandro Colomar <[email protected]> > > > Date: 2026-08-29 10:45:34+0200 > > From: Alejandro Colomar <[email protected]> > > > > > Date: 2026-08-29 10:42:14+0200 > > > From: Alejandro Colomar <[email protected]> > > > > > > Hi Larry, > > > > > > > Date: 2026-08-28 22:50:50-0400 > > > > From: Larry Kollar <[email protected]> > > > > > > > > > > > > Alejandro Colomar <[email protected]> wrote: > > > > > > > > > I believe that a set of makefiles that would handle all of the targets > > > > > of a project like groff wouldn't take much more than that. It might > > > > > be > > > > > a few hundred kB. If it's well organized, it can be maintainable. > > > > > > > > > > Because the makefile language is so simple, bugs are easy to spot and > > > > > fix, compared to autotools (possibly automake, but I can't distinguish > > > > > them enough). > > > > > > > > I don’t know. Can a Makefile check for the presence of certain libraries > > > > or other apps and fail gracefully (by which I mean exiting with a > > > > message > > > > like “You need app X, plus libraries Y and Z, installed to successfully > > > > compile this.”)? That’s one of the things that “makes" me appreciate > > > > taking > > > > that extra step of typing `.configure` before make. > > > > > > Yes, it can. Here's a trivial test for that: > > > > > > alx@devuan:~/tmp/testlib$ cat Makefile > > > HAS_LIBFOO := $(shell find /usr/include/foo.h >/dev/null && echo yes || > > > echo no) > > You can also trivially test with gcc(1) instead of find(1): > > $ echo '#include <foo.h>' | gcc -x c -E >/dev/null 2>&1 && echo yes || > echo no > no > > If you put that expression within $(shell ...), you can use it similarly.
Of course, I had some typos there.
Here's a fully working example:
alx@devuan:~/tmp/testlib$ cat Makefile
CC ::= cc
HAS_STDLIB ::= \
$(shell \
echo '#include <stdlib.h>' \
| $(CC) -x c - -E >/dev/null \
&& echo yes \
|| echo no; \
)
HAS_LIBFOO ::= \
$(shell \
echo '#include <foo.h>' \
| $(CC) -x c - -E >/dev/null \
&& echo yes \
|| echo no; \
)
ifeq ($(HAS_STDLIB),no)
$(error You need <stdlib.h> installed to successfully compile this)
endif
ifeq ($(HAS_LIBFOO),no)
$(error You need library FOO installed to successfully compile this)
endif
all:
echo Done
alx@devuan:~/tmp/testlib$ make
<stdin>:1:10: fatal error: foo.h: No such file or directory
compilation terminated.
Makefile:23: *** You need library FOO installed to successfully compile
this. Stop.
Cheers,
Alex
>
>
> Cheers,
> alex
>
> > >
> > > ifeq ($(HAS_LIBFOO),no)
> > > $(error You need library FOO installed to successfully compile this.)
> >
> > Oh, I didn't need the period here...
> >
> > > endif
> > >
> > > all:
> > > echo Done
> > > alx@devuan:~/tmp/testlib$ make
> > > find: ‘/usr/include/foo.h’: No such file or directory
> > > Makefile:4: *** You need library FOO installed to successfully compile
> > > this.. Stop.
> >
> > ... make(1) already appended one here.
> >
> > :)
> >
> > >
> > > You may of course write more complex tests if you need. Anything that
> > > you can do with a shell script, you can do it with a Makefile.
> > >
> > > That said, I personally prefer to fail compilation due to missing header
> > > files. It's simpler, and there's not much difference. After all, if
> > > compilation fails for <foo.h>, it's trivial to run
> > >
> > > $ apt-file find /include/foo.h
> > >
> > > But if you want the test, you can have it.
> > >
> > >
> > > Have a lovely day!
> > > Alex
> > >
> > > --
> > > <https://www.alejandro-colomar.es>
> >
> >
> >
> > --
> > <https://www.alejandro-colomar.es>
>
>
>
> --
> <https://www.alejandro-colomar.es>
--
<https://www.alejandro-colomar.es>
signature.asc
Description: PGP signature
