On Tue, Oct 08, 2019 at 01:44:14PM +0200, Jeremie Courreges-Anglas wrote:
> On Tue, Oct 08 2019, Christopher Zimmermann <madro...@gmerlin.de> wrote:
> > On Mon, Oct 07, 2019 at 09:09:50PM +0100, Stuart Henderson wrote:
> >> On 2019/10/07 21:37, Christopher Zimmermann wrote:
> >> > How is an arbitrary piece of software supposed to
> >> > discover /usr/local/include and /usr/local/lib?
> >> 
> >> The same way it will discover /opt/include and /opt/lib on a linux box -
> >> you tell it to look there.
> >
> > - What's the preferred way to teach a build system our search paths ?
> > - What's the preferred / most portable way for a piece of software to
> >   discover the search paths?
> >
> > Is it pkg-config, $CPATH / $LIBRARY_PATH, autoconf, something else?
> 
> Many build systems have support for pkg-config (eg pkg.m4 for autoconf).
> autoconf honours (at least) CPPFLAGS/CFLAGS/LDFLAGS.
> CPATH and LIBRARY_PATH are OCaml idioms AFAIK.

Quite contrary CPATH and LIBRARY_PATH are variables heeded by gcc and
clang compiler and linker.
I did some experiments:

$ echo '#include<bzlib.h>' >incl_test.c
$ CPATH= cc -E -Wp,-v incl_test.c >/dev/null
clang -cc1 version 8.0.1 based upon LLVM 8.0.1 default target 
amd64-unknown-openbsd6.6
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/clang/8.0.1/include
 /usr/include
End of search list.
incl_test.c:1:9: fatal error: 'bzlib.h' file not found
#include<bzlib.h>
        ^~~~~~~~~
1 error generated.
$ CPATH=/usr/local/include cc -E -Wp,-v incl_test.c >/dev/null 
clang -cc1 version 8.0.1 based upon LLVM 8.0.1 default target 
amd64-unknown-openbsd6.6
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/clang/8.0.1/include
 /usr/include

But this is _really_ unexpected:

$ CPATH= echo '#include<bzlib.h>' |cc -E -Wp,-v - >/dev/null           
clang -cc1 version 8.0.1 based upon LLVM 8.0.1 default target 
amd64-unknown-openbsd6.6
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/X11R6/include
 /usr/lib/clang/8.0.1/include
 /usr/include
End of search list.nd of search list

This tells me that the preprocessor has a decent idea of our search
path, but forgets about /usr/local and /usr/X11R6 includes when a file
is passed as argument instead of run in a pipe.

The heck why does it do that?

> There's no single answer.

Of course not.

> Can opam simply inject -I/usr/local/include and -L/usr/local/lib in the
> dune build system used by ocaml-lmdb?

Since the C compiler/linkers heed CPATH and LIBRARY_PATH, I can simply
set those variables to inject the standard search path.
But why do I even have to do that? The preprocessor seems to know the
correct search path, but seems to forget it under some circumstances.


Christopher



-- 
http://gmerlin.de
OpenPGP: http://gmerlin.de/christopher.pub
CB07 DA40 B0B6 571D 35E2  0DEF 87E2 92A7 13E5 DEE1

Attachment: signature.asc
Description: PGP signature

Reply via email to