This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: RFD: cygwin + *native* MinGW compiler


Danny Smith wrote:
> The reasons I use "--build=mingw32 --host=mingw32 --target=mingw32" 
> when building gcc are
> 1) I have, perhaps mistakenly, assumed that "--build=" referred to the OS of the compiler,
> not the ethnicity of the shell.

I've assumed it was describing the entire build environment: compiler,
yes, linker, yes, but also the surrounding utilities involved in the
configuration/compilation process. That's why config.guess uses uname,
not $CC -version.

I guess that's the nub of the discussion we're having right now: what
does it mean when the $build compiler/toolchain is A, but all the other
$build tools are B? In seems fragile to assume /either/ build==A, /or/
build==B.

> 2) my build gcc is a mingw32 gcc, and unlike a cygwin-hosted gcc, doesn't understand
> symlinks.  "--build=cygwin32"  would suggest that the native gcc understands symlinks.
> Ditto for my binutil and gdb apps which do not depend on cygwin.

Good point. See next para.

> 3) specifying "--host=mingw32 --target=mingw32" usually works just fine too (within a
> cygwin bash shell), for most projects, as long as there are no assumptions about symlinks.

Hmmm. When you specify host and target (obviously we're now talking
about configuring/building a compiler or part of a compiler toolchain,
and not simply Q.Random.Utility.Package; those don't have --target),
$build is set implicitly by analyzing the current OS (c.f. config.guess,
uname, etc).  So, in effect, you're saying that --build=cygwin
--host=mingw32 --target=mingw32 works?

Again hmmm. So that must mean that (legions of slaving GCC developers)
have already set things up in the gcc tree so that symlinks aren't
used...ever? Even when $build supports them?

> 4) "--build=mingw32 --host=mingw32 --target=mingw32"  always seemed to be a natural way to
> do a bootstrap.

Certainly. If *everything* about the build environment was, in fact,
"mingw" (or, actually, msys in its normal "don't mind me; I'm
mingw...really, I am!" mode).

But when the toolchain is mingw, but the rest of the $build env is
cygwin? Not quite so natural.

> I don't set any special environment variables before I "bash ./config.sh" from a DOS
> prompt (my everday path just put C:/mingw/bin in front of C:/cygwin/bin) and I don't cross
> my fingers because I know it has worked for 10 years or so.

Yes, I know: you're one of the first people I thought of when this
subject came up on the libtool list. I *really* want to make sure that
things keep working for you, in the way you expect them to (with maybe
only a small tweak to your build.sh <g>)

But I worry that things are (or will soon be) broken already.  gcc
currently has a snapshot of development libtool from 2007-03-18, with
several fixes backported from more recent git. So, presently, the
libtool used by gcc does the following, when building an exe that
depends on an uninstalled shared library [*]:
 1) creates both a wrapper script foo and wrapper exe foo.exe in the
build directory, and also (?) a copy of the wrapper script in .libs/
 2) the wrapper exe execs the wrapper script via $SHELL
 3) the wrapper script handles all the $PATH manipulations, and
locates/execs the "real" exe

[*] Doesn't this description apply to most of the tools, and many of the
testsuite apps?  Now, if libtool is only used to build the libs, and
gcc's Makefiles/test harnesses handle everything else without the use of
libtool or its wrapper script/wrapper exe system...then whew! maybe we
dodged a bullet!

[**] Note the context switches involved in old libtool (current gcc
libtool): you're in $build, and you launch the $host wrapper exe, which
launches the $build $SHELL, which executes the wrapper script in a
$build context, which launches the $host "real" exe.

This 1-2-3 step process works fine in all the scenarios mentioned;
mainly because the "difficult bits" are handled by $SHELL (of whatever
flavor) and its underlying runtime (be it cygwin [***], or msys[****],
or whatever).

[***] cygwin's exec() implementation translates many environment
variables from posix to win32 format, when the target of the exec() is a
non-cygwin application. So, when //bash// execs the real exe, under the
hood cygwin translates $PATH. Also, cygwin's exec() implementation
translates the unix path-to-real.exe before (eventually) invoking
CreateProcess with a win32 path-to-real.exe.

[****] msys's bash works similarly to cygwin, expecially its interaction
with the underlying posix dll's exec implementation.

But...this 1-2-3 process never worked in cygwin-1.5 if
CYGWIN=transparent_exe (more at the link, below).

However, in cygwin-1.7 this has significant problems; the old (optional)
transparent_exe behavior is now the default. This means that having both
a wrapper script 'foo' and a wrapper exe 'foo.exe' in the same directory
 is very bad news.
See this thread:
libtool vs. transparent_exe [Was: [ITP] util-linux]
http://sources.redhat.com/ml/cygwin/2006-03/msg00148.html

And this one a year later:
.exe magic
http://sources.redhat.com/ml/cygwin/2007-04/msg00515.html

Which eventually led to the behavior that libtool 2.2.0+ exhibits: it
now generates only the wrapper .exe (there's still a version of the
wrapper script in .libs/, but that's only used internally by libtool --
"sourced" back in). The wrapper .exe now directly execs the "real"
executable -- and manipulates **env itself.  However:

The wrapper .exe is a $host (not $build) application, just like the
"real" .exe. This means that libtool must be smart enough to convert new
$PATH settings from $build format to $host format, when writing the
source code for the wrapper exe. It also must convert the
path/to/real/exe from $build format to $host format, so that exec("")
has "the right stuff" for $host's exec() implementation -- or, in the
case of $host=mingw, _spawn().  In short, libtool has to manually
perform all the grunt work that used to be handled (or, with gcc's
current libtool, is now handled) by exec("$SHELL wrapper.script") via
the magic of the $SHELL and its posix runtime library (cygwin, msys) on
$build.

And that's the problem. I have a hunch that *right now*, if we dropped
in git-master-ToT libtool into gcc, your configure incantation would
fall over dead, because every executable's wrapper script (if built
using libtool) would have the "wrong" format of path/to/real/exe inside
_spawn("...") -- unless we dodged the bullet, as described above.

But even if we dodged the bullet for gcc, other packages which use
--build=mingw32 --host=mingw32 when $build is actually cygwin will NOT
be so lucky. So, *something* has to be fixed...

--
Chuck

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]