manpagez: man pages & more
info libtool
Home | html | info | man

File: libtool.info,  Node: Cygwin to MinGW Cross,  Prev: LT_CYGPATH,  Up: File name conversion

15.3.6.6 Cygwin to MinGW Cross
..............................

There are actually three different scenarios that could all legitimately
be called a "Cygwin to MinGW" cross compile.  The current (and standard)
definition is when there is a compiler that produces native Windows
libraries and applications, but which itself is a Cygwin application,
just as would be expected in any other cross compile setup.

   However, historically there were two other definitions, which we will
refer to as the _fake_ one, and the _lying_ one.

   In the _fake_ Cygwin to MinGW cross compile case, you actually use a
native MinGW compiler, but you do so from within a Cygwin environment:

     export PATH="/c/MinGW/bin:${PATH}"
     configure --build=i686-pc-cygwin \
     	--host=mingw32 \
     	NM=/c/MinGW/bin/nm.exe

   In this way, the build system "knows" that you are cross compiling,
and the file name conversion logic will be used.  However, because the
tools (‘mingw32-gcc’, ‘nm’, ‘ar’) used are actually native Windows
applications, they will not understand any Cygwin (that is, Unix-like)
absolute file names passed as command line arguments (and, unlike MSYS,
Cygwin does not automatically convert such arguments).  However, so long
as only relative file names are used in the build system, and
non-Windows-supported Unix idioms such as symlinks and mount points are
avoided, this scenario should work.

   If you must use absolute file names, you will have to force Libtool
to convert file names for the toolchain in this case, by doing the
following before you run configure:

     export lt_cv_to_tool_file_cmd=func_convert_file_cygwin_to_w32

   In the _lying_ Cygwin to MinGW cross compile case, you lie to the
build system:

     export PATH="/c/MinGW/bin:${PATH}"
     configure --build=i686-pc-mingw32 \
     	--host=i686-pc-mingw32 \
     	--disable-dependency-tracking

and claim that the build platform is MinGW, even though you are actually
running under _Cygwin_ and not MinGW. In this case, libtool does _not_
know that you are performing a cross compile, and thinks instead that
you are performing a native MinGW build.  However, as described in
(*note Native MinGW File Name Conversion::), that scenario triggers an
"MSYS to Windows" file name conversion.  This, of course, is the wrong
conversion since we are actually running under Cygwin.  Also, the
toolchain is expecting Windows file names (not Cygwin) but unless told
so Libtool will feed Cygwin file names to the toolchain in this case.
To force the correct file name conversions in this situation, you should
do the following _before_ running configure:

     export lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
     export lt_cv_to_tool_file_cmd=func_convert_file_cygwin_to_w32

   Note that this relies on internal implementation details of libtool,
and is subject to change.  Also, ‘--disable-dependency-tracking’ is
required, because otherwise the MinGW GCC will generate dependency files
that contain Windows file names.  This, in turn, will confuse the Cygwin
‘make’ program, which does not accept Windows file names:

     Makefile:1: *** target pattern contains no `%'.  Stop.

   There have also always been a number of other details required for
the _lying_ case to operate correctly, such as the use of so-called
“identity mounts”:

     # CYGWIN-ROOT/etc/fstab
     D:/foo    /foo     some_fs binary 0 0
     D:/bar    /bar     some_fs binary 0 0
     E:/grill  /grill   some_fs binary 0 0

   In this way, top-level directories of each drive are available using
identical names within Cygwin.

   Note that you also need to ensure that the standard Unix directories
(like ‘/bin’, ‘/lib’, ‘/usr’, ‘/etc’) appear in the root of a drive.
This means that you must install Cygwin itself into the ‘C:/’ root
directory (or ‘D:/’, or ‘E:/’, etc)--instead of the recommended
installation into ‘C:/cygwin/’.  In addition, all file names used in the
build system must be relative, symlinks should not be used within the
source or build directory trees, and all ‘-M*’ options to ‘gcc’ except
‘-MMD’ must be avoided.

   This is quite a fragile setup, but it has been in historical use, and
so is documented here.

© manpagez.com 2000-2025
Individual documents may contain additional copyright information.