From: Neil Jerram <neil@ossau.uklinux.net>
To: Bruno Haible <bruno@clisp.org>
Cc: bug-guile@gnu.org
Subject: Re: INSTALL matters
Date: Sun, 17 May 2009 18:39:33 +0100 [thread overview]
Message-ID: <87my9b1ve2.fsf@arudy.ossau.uklinux.net> (raw)
In-Reply-To: 200905102034.41116.bruno@clisp.org
Bruno Haible <bruno@clisp.org> writes:
> Hi Neil,
>
> Neil Jerram wrote in reply to
> <http://lists.gnu.org/archive/html/bug-guile/2008-05/msg00012.html>:
>> This issue, and the related (in
>> my mind) one about having multiple copies of a library installed in
>> different places
>
> Having multiple copies of a package installed in different places is
> the most normal thing of the world. That's what --prefix is for.
OK...
>> First, a couple of assumptions: as far as I understand,
>>
>> - in general, there is no portable way of telling the compiler and
>> linker to look in one set of prefixes for library A, and in a
>> different set of prefixes for library B
>
> There is. It consists in passing absolute file names for .h and .a or .so
> files to the linker. If the input you have is a _set_ of of prefixes,
> this means you need to search for the library in the same way as the
> compiler or linker would do, and then pass the absolute file names to the
> compiler or linker.
>
> It is a bit far-fetched, but the mentioned macros in gnulib actually do this.
Thanks for explaining. I've seen these macros in gnulib now.
> Correct. Even if you pass absolute filenames and '-rpath', on some systems,
> the information written into the executable by the linker does not contain
> sufficient information for choosing library A from /usr/lib (and not
> /usr/local/lib) while at the same time choosing library B from /usr/local/lib
> (and not /usr/lib).
I think you're saying here that the new gnulib macros don't work on all
platforms. Is that correct?
>> - worse (at least with the GNU toolchain), if you have multiple
>> versions of library A in /usr/lib and /usr/local/lib, you can't get
>> a consistent build at all, because gcc prefers /usr/include when
>> looking for headers, but ld and ld.so prefer /usr/local/lib when
>> linking. (Or perhaps the other way round.
>
> This is a problem on some BSD systems, IIRC. Also one specific GCC release
> had this problem on Linux systems, a couple of years ago, and it was fixed
> in the next GCC release. So I've come to view this as an inconsistency in
> the GCC installation. The workaround to this situation is to never use
> /usr/local, but rather pass a different --prefix always.
OK, that's good news. After looking at the latest GCC and binutils
docs, I agree that this old issue seems to be fixed now. (-I and -L
directories are now always searched before the system-standard ones.)
>> > I'm trying to install guile-1.8.5 on MacOS X 10.5. I've already installed
>> > gmp-4.2.2 with the same --prefix option as I use for guile,
>>
>> This suggests a possibility, of automatically adding $prefix/include
>> to CPPFLAGS and $prefix/lib to LDFLAGS.
>
> Yes. If I have installed gmp with the same --prefix option, then this
> is needed and desired. Autoconf does not do it automatically.
But you are happy for this to require saying `--with-gmp-prefix=/opt'
(or whatever) when configuring Guile, right?
>> In some specific contexts - e.g. an admin setting up a box with all
>> 3rd party software under /opt - I think that this would indeed be a
>> convenient option.
>
> I don't think so. The users of this admin will wonder why their programs
> behave differently when built with GCC than when built with the vendor's
> compiler. (The reason would be that GCC links with different versions of
> thirs-party libraries.)
In any case, this debate isn't at all Guile-specific; more on that
below.
>> I don't like these options because they seem bogus to me. Providing
>> `--with-libreadline-prefix' makes it sound like the build and runtime
>> will look specifically (and only) in that prefix when building/linking
>> readline, and in the default places for other libraries. And that is
>> not true
>
> It is correct that the option does not mean "hey configure, please
> look for libreadline *exactly* here". It means "hey configure, I have
> installed libreadline here".
>
> Yes there are weird cases which cannot be supported, like the case
> with libraries A and B in both /usr and /usr/local, which you mentioned
> before. But the majority of the cases is not so weird, and in these
> cases the --with-...-prefix options are helpful.
Now I'm confused. I thought that doing what the new gnulib macros do
(i.e. specifying full paths to the linker, and using rpath) means that
cases like these _can_ be supported - at least on the platforms where
the full paths are stored and respected.
>> Using CPPFLAGS and LDFLAGS is better, in my view, because it
>> corresponds to what the toolchain can actually do - i.e. search in one
>> global set of places for all headers, and in one global set of places
>> for all libraries.
>
> I find a configure option better, because when the user installs a
> package, he's not thinking at the level of linker details, but rather
> "I have installed gmp here. Now how do I tell mpfr or guile about it?"
OK, I agree now that that makes sense.
> Before I came to use --with-...-prefix options, I used CPPFLAGS and
> LDFLAGS like you say. And quite often, the build failed because
> - I had not been aware of all dependencies before building the package, or
> - I had used LDFLAGS="-L/opt/gnu", rather than LDFLAGS="-L/opt/gnu/lib",
> (Simple typo/thinko, but frustrating anyway.)
> - I had used LDFLAGS="-L/opt/gnu/lib" but the build needs the 64-bit libraries
> so I should have used LDFLAGS="-L/opt/gnu/lib64".
>
> The --with-...-prefix options do reduce frustration in these cases.
>
>> > As an installer, I'm not going to spend time trying to see which LDFLAGS I need
>> > to set for a package to recognize the libraries that I have installed. I expect
>> > the package to do this by itself.
>>
>> I don't get this last paragraph. You have to add a path either to
>> --with-xxx-prefix or to CPPFLAGS and LDFLAGS, so what difference does
>> it make?
>
> The difference that I meant is when I use the same --prefix for a couple of
> related packages. Suppose my goal is to install 'guile'. I learn that it needs
> 'gmp', so I download and install that, with the same expected prefix. Then I
> install guile with the same prefix and it refuses to acknowledge the previously
> installed packages, that it frustrating.
OK, so you _do_ think that $prefix/lib should be added to LDFLAGS by
default, and $prefix/include to CPPFLAGS. Is there an autoconf macro
to do that? If there is, does it support a ./configure option for
disabling it, for any cases where it isn't wanted?
Overall, then...
1. I think I agree now that using the gnulib macros to provide
--with-xxx-prefix options is a good idea. I'm nervous about adding a
build dependency on so much new code (e.g. AC_LIB_LINKFLAGS_BODY is
nearly 500 lines long), but I suppose that must be the right thing to
do for the GNU project as a whole, and that if there are problems
we'll just work through them.
2. There is a lot of subtlety involved in understanding how these
options work, and what can be relied on on different platforms, and
explaining that to users; and none of that is Guile-specific. So
rather than explaining bits of this in Guile's FAQ/web pages/whatever
it would be better to point to a reliable place where it's explained
more generally. Is there already such a place? If not, any
suggestions for where it should be? I'm happy to draft an initial
text, if nothing already exists.
(Ludovic, do you have a view on all this? Any one else?)
Many thanks again for your input on this stuff.
Regards,
Neil
next prev parent reply other threads:[~2009-05-17 17:39 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-15 23:46 INSTALL matters Bruno Haible
2009-05-09 8:24 ` Neil Jerram
2009-05-10 18:34 ` Bruno Haible
2009-05-17 17:39 ` Neil Jerram [this message]
2009-05-23 23:04 ` Bruno Haible
2009-06-15 19:40 ` Neil Jerram
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87my9b1ve2.fsf@arudy.ossau.uklinux.net \
--to=neil@ossau.uklinux.net \
--cc=bruno@clisp.org \
--cc=bug-guile@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).