This is the mail archive of the crossgcc@sourceware.org mailing list for the crossgcc project.

See crosstool-NG for lots more information.


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: [PATCH] Replace mingw32 by mingw-w64 for generating 32/64 bits Windows cross compiler


Yann, All,

Sorry to come back late on this, past week has been pretty busy in
Barcelona, during LinuxCon and ELC-E.
Back to a more normal schedule, now.

On Thursday 25 October 2012 Yann Diorcet wrote:
> # HG changeset patch
> # User Yann Diorcet <diorcet.yann@gmail.com>
> # Date 1351158411 -7200
> # Node ID 0b819b844f8fbf72a2a85db438e09d66ab495d3e
> # Parent  946d6d133a90935465e3582b54b60c0d7e4e6397
> Replace mingw32 by mingw-w64 for generating 32/64 bits Windows cross compiler

OK, basically this builds both toolchains OK on my machine. That's a
good start, for sure! ;-)

Here are a few comments, though.

Commit message: what about something like:

    kernel/mingw: replace mingw32 with generic mingw

    Replace the 32-bit-only mingw32 with mingw64 that is capable
    of building toolchains for both 32- and 64-bit mingw.

    kernel/mingw32: Remove this kernel for a generic one
    kernel/mingw: New mingw kernel supporting 32 and 64 bit arch
    libc/mingw: Remove old options
    patches: Remove old mingw libc options' patches

[--SNIP--]
> diff -r 946d6d133a90 -r 0b819b844f8f config/libc/mingw.in
> --- a/config/libc/mingw.in	Mon Oct 22 22:40:01 2012 +0200
> +++ b/config/libc/mingw.in	Thu Oct 25 11:46:51 2012 +0200
> @@ -1,33 +1,7 @@
>  # mingw options
>  
> -## depends on MINGW32
> +## depends on MINGW
>  ##
>  ## select LIBC_SUPPORT_WIN32THREADS
>  ##
>  ## help The de-facto standard for Mingw distributions.
> -
> -choice
> -    bool
> -    prompt "Mingw runtime version"
> -
> -# Don't remove next line
> -# CT_INSERT_VERSION_BELOW
> -config MINGWRT_V_3_18
> -    bool
> -    prompt "3.18"
> -
> -config MINGWRT_V_select
> -    bool
> -    prompt "Other version"
> -
> -endchoice
> -
> -config MINGWRT_VERSION
> -    string
> -    prompt "Mingw runtime version" if MINGWRT_V_select
> -# Don't remove next line
> -# CT_INSERT_VERSION_STRING_BELOW
> -    default "3.18" if MINGWRT_V_3_18
> -    help
> -      Enter the version number of the mingw runtime files to use
> -

Sure there is no option for the C library part of mingw?
At least, add a comment that the version is the same as the one from the
mingw kernel (I mean, a #-comment, not a kconfig comment).

> diff -r 946d6d133a90 -r 0b819b844f8f config/libc/mingw.in.2
> --- a/config/libc/mingw.in.2	Mon Oct 22 22:40:01 2012 +0200
> +++ b/config/libc/mingw.in.2	Thu Oct 25 11:46:51 2012 +0200
> @@ -1,72 +1,1 @@
>  # Part-2 of mingw C library options: development libraries
> -
> -config MINGW_DIRECTX
[--SNIP--]
> -config MINGW_OPENGL
[--SNIP--]
> -config MINGW_PDCURSES
[--SNIP--]
> -choice
[--SNIP--]
> -config MINGW_PDCURSES_V_3_4
[--SNIP--]

In the first place, I was not too happy having those target libraries be
built as part of the toolchain, but people argued they were part of the
expected 'SDK' (or API, call it whatever you want) of mingw / Windows (TM).

So, if those get remove, I'm afraid those same people will come back
whinning, unless you can prove either:
  - it is *not* part of the Windows API/SDK, or
  - the new ming64 build provides a replacement for those libs.

> diff -r 946d6d133a90 -r 0b819b844f8f samples/i686-unknown-mingw32/reported.by
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/samples/i686-unknown-mingw32/reported.by	Thu Oct 25 11:46:51 2012 +0200
> @@ -0,0 +1,3 @@
> +reporter_name="Yann Diorcet <diorcet.yann@gmail.com>"
> +reporter_url=""
> +reporter_comment="Config to build cross-compiler with mingw as kernel type for 32 bits Windows target"

Nit-picking: please, fold your comments at less than 80-chars.

> diff -r 946d6d133a90 -r 0b819b844f8f samples/x86_64-unknown-mingw32/reported.by
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/samples/x86_64-unknown-mingw32/reported.by	Thu Oct 25 11:46:51 2012 +0200
> @@ -0,0 +1,3 @@
> +reporter_name="Yann Diorcet <diorcet.yann@gmail.com>"
> +reporter_url=""
> +reporter_comment="Config to build cross-compiler with mingw as kernel type for 64 bits Windows target"

Ditto.

> diff -r 946d6d133a90 -r 0b819b844f8f scripts/build/kernel/mingw.sh
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/scripts/build/kernel/mingw.sh	Thu Oct 25 11:46:51 2012 +0200
> @@ -0,0 +1,54 @@
> +# This file declares functions to install the kernel headers for mingw64
> +# Copyright 2012 Yann Diorcet
> +# Licensed under the GPL v2. See COPYING in the root of this package
> +
> +CT_DoKernelTupleValues() {
> +    CT_TARGET_KERNEL="mingw32" #yes it's correct

I know we discussed this already, and that -mingw32 is indeed the correct
kernel part, but could you add a comment that is a bit more elaborate?

> +    CT_TARGET_SYS=
> +}
> +
> +do_kernel_get() {
> +    CT_GetFile "mingw-w64-v${CT_WINAPI_VERSION}" \
> +        http://downloads.sourceforge.net/sourceforge/mingw-w64
> +}
> +
> +do_kernel_extract() {
> +    CT_Extract "mingw-w64-v${CT_WINAPI_VERSION}"

Even if no patch for now, you have to call CT_Patch anyway (see below, too).

> +}
> +
> +do_kernel_headers() {

sdk_opt is a local variable, you have to declare it. Usually, we use bash
arrays for options. Here, it is not really important, as you only have one
option, but nonetheless, I'd rather have consistent code:
    local -a sdk_opts

and then, to add a configure option:

    sdk_opts+=( "option" )

> +    CT_DoStep INFO "Installing kernel headers"
> +
> +    mkdir -p "${CT_HEADERS_DIR}"
> +
> +    case "${CT_MINGW_DIRECTX}:${CT_MINGW_DDK}" in
> +        y:y)    sdk_opt="--enable-sdk=all";;
> +        y:)     sdk_opt="--enable-sdk=directx";;
> +        :y)     sdk_opt="--enable-sdk=ddk";;
> +        :)      sdk_opt="";;

Empty statement for the ':' case:
        :)  ;;

> +    esac
> +
> +    CT_mkdir_pushd "${CT_BUILD_DIR}/build-header-build-${CT_BUILD}"
> +
> +    CT_DoLog EXTRA "Configuring Headers"
> +
> +    CT_DoExecLog CFG                                \
> +    "${CT_SRC_DIR}/mingw-w64-v${CT_WINAPI_VERSION}/mingw-w64-headers/configure" \
> +	--build=${CT_BUILD}			    \

Space-damage:
  - no leading tabs,
  - trailing '\' are not aligned; it is OK for single-word lines (like
    the ./configure line) to be longer than 80 chars, but other '\'
    should all be aligned together, preferably to the longest line;
    something like:

    CT_DoExecLog CFG              \
        "veeeeeeeeerrrryyyyy-loooooooooooooong-configure-line"  \
            --option1="value1"    \
            --option2="value2"    \
            ${options}

> +        --host=${CT_TARGET}                              \
> +        --prefix="${CT_SYSROOT_DIR}"                        \

Any reason why you do not use --prefix=/usr, and pass DESTDIR=${SYSROOT_DIR}
at install time?

--prefix is for run-time, so the sysroot directory (where target stuff
gets installed) does not exist at runtime, while DESTDIR is for where to
install stuff.

> +        "${sdk_opt}"

> +    CT_DoLog EXTRA "Compile Headers"
> +    CT_DoExecLog ALL make
> +
> +    CT_DoLog EXTRA "Installing Headers"
> +    CT_DoExecLog ALL make install

make DESTDIR="${CT_SYSROOT_DIR}" install

> +    CT_Popd
> +
> +    CT_DoExecLog ALL cp -r "${CT_SYSROOT_DIR}/${CT_TARGET}/include/"*   \
> +                     "${CT_HEADERS_DIR}"

That's what is weird with mingw and the way you install the headers: they
are installed in sysroot/tuple/include, when we want them in
sysroot/usr/include (and by the way, your code only copies them , so they
still are present in the original place. What path will the pre-processor
search for?

I'll do a few tests here to see if --prefix=/usr and DESTDIR=${sysroot_dir}
can make a difference. If you can also look into this, that'd be great, too.

> diff -r 946d6d133a90 -r 0b819b844f8f scripts/build/libc/mingw.sh
> --- a/scripts/build/libc/mingw.sh	Mon Oct 22 22:40:01 2012 +0200
> +++ b/scripts/build/libc/mingw.sh	Thu Oct 25 11:46:51 2012 +0200
[--SNIP--]
>  do_libc_extract() {
> -    CT_Extract "mingwrt-${CT_MINGWRT_VERSION}-mingw32-src"
> -
> -    if [ -n "${CT_MINGW_PDCURSES}" ]; then
> -        CT_Extract "PDCurses-${CT_MINGW_PDCURSES_VERSION}"
> -        CT_Patch "PDCurses" "${CT_MINGW_PDCURSES_VERSION}"
> -    fi
> -    if [ -n "${CT_MINGW_GNURX}" ]; then
> -        CT_Extract "mingw-libgnurx-${CT_MINGW_GNURX_VERSION}-src"
> -        CT_Patch "mingw-libgnurx" "${CT_MINGW_GNURX_VERSION}-src"
> -    fi
> +    CT_Extract "mingw-w64-v${CT_WINAPI_VERSION}"

Even if there are no patches for now, you still have to call CT_Patch,
so it is in-line with the rest of the components.

If there is no patch, CT_Patch will just do nothing.

>  }
>  
>  do_libc_check_config() {
> @@ -40,117 +14,36 @@
>  do_libc_start_files() {
>      CT_DoStep INFO "Installing C library headers"
>  
> -    CT_DoLog EXTRA "Installing MinGW Runtime headers"
> -    mkdir -p "${CT_HEADERS_DIR}"
> -    cp -r ${CT_SRC_DIR}/mingwrt-${CT_MINGWRT_VERSION}-mingw32-src/include/* \
> -          ${CT_HEADERS_DIR}
> -
>      # It seems mingw is strangely set up to look into /mingw instead of
>      # /usr (notably when looking for the headers). This symlink is
>      # here to workaround this, and seems to be here to last... :-/
> -    CT_DoExecLog ALL ln -sv "usr" "${CT_SYSROOT_DIR}/mingw"
> +    CT_DoExecLog ALL ln -sv "${CT_TARGET}" "${CT_SYSROOT_DIR}/mingw"

And this change should no longer be needed if we use the proper prefix at
configure time. Also, the headers are installed by the 'kernel', so it
should be the 'kernel' script that does the symlink.

Which makes me think... For MingW, do we really have a 'kernel' per-say, or
can't we just build everything in the libc steps? It seems to me that would
be much cleaner.

Note: the do_libc_start_files step is run just after the kernel_headers step.

>      CT_EndStep
>  }
>  
>  do_libc() {
> -    CT_DoStep INFO "Building MinGW files"
> +    CT_DoStep INFO "Building mingw32-w64 files"
>  
> -    CT_DoLog EXTRA "Configuring W32-API"
> +    CT_DoLog EXTRA "Configuring mingw-w64-crt"
>  
> -    mkdir -p "${CT_BUILD_DIR}/build-w32api"
> -    cd "${CT_BUILD_DIR}/build-w32api"
> +    mkdir -p "${CT_BUILD_DIR}/build-w64crt"
> +    cd "${CT_BUILD_DIR}/build-w64crt"
>  
>      CT_DoExecLog CFG                                                  \
> -    CFLAGS="-I${CT_HEADERS_DIR}"                                      \
> -    LDFLAGS="-L${CT_SYSROOT_DIR}/lib"                                 \
> -    "${CT_SRC_DIR}/w32api-${CT_W32API_VERSION}-mingw32-src/configure" \
> +    "${CT_SRC_DIR}/mingw-w64-v${CT_WINAPI_VERSION}/mingw-w64-crt/configure" \
>          --prefix=${CT_SYSROOT_DIR}                                    \

Again, prefix=/usr (yes, that's old code, let use that new stuff to fix it
at the same time) ...

> -        --includedir=${CT_HEADERS_DIR}                                \
>          --host=${CT_TARGET}
>  
> -    CT_DoLog EXTRA "Building W32-API"
> +    CT_DoLog EXTRA "Building mingw-w64-crt"
>      CT_DoExecLog ALL make ${JOBSFLAGS}
>  
> -    CT_DoLog EXTRA "Installing W32-API"
> -    CT_DoExecLog ALL make install
> -
> -    CT_DoLog EXTRA "Configuring MinGW Runtime"
> -
> -    mkdir -p "${CT_BUILD_DIR}/build-mingwrt"
> -    cd "${CT_BUILD_DIR}/build-mingwrt"
> -
> -    CT_DoExecLog CFG                                                    \
> -    CFLAGS="-I${CT_HEADERS_DIR}"                                        \
> -    LDFLAGS="-L${CT_SYSROOT_DIR}/lib"                                   \
> -    "${CT_SRC_DIR}/mingwrt-${CT_MINGWRT_VERSION}-mingw32-src/configure" \
> -        --prefix=${CT_SYSROOT_DIR}/                                     \
> -        --includedir=${CT_HEADERS_DIR}                                  \
> -        --host=${CT_TARGET}
> -
> -    CT_DoLog EXTRA "Building MinGW Runtime"
> -    CT_DoExecLog ALL make ${JOBSFLAGS}
> -
> -    CT_DoLog EXTRA "Installing MinGW Runtime"
> +    CT_DoLog EXTRA "Installing mingw-w64-crt"
>      CT_DoExecLog ALL make install

... and, DESTDIR=${CT_SYSROOT_DIR}

>      CT_EndStep
>  }
>  
>  do_libc_finish() {
> -    CT_DoStep INFO "Installing MinGW Development libraries"
> -
> -    CT_Pushd "${CT_SYSROOT_DIR}"
> -    if [ -n "${CT_MINGW_DIRECTX}" ]; then
> -        CT_DoLog EXTRA "Installing DirectX development package"
> -        CT_Extract nochdir "directx-devel"
> -    fi
> -    if [ -n "${CT_MINGW_OPENGL}" ]; then
> -        CT_DoLog EXTRA "Installing OpenGL development package"
> -        CT_Extract nochdir "opengl-devel"
> -    fi
> -    CT_Popd
> -
> -    if [ -n "${CT_MINGW_PDCURSES}" ]; then
> -        CT_DoLog EXTRA "Building PDCurses development files"
> -        mkdir -p "${CT_BUILD_DIR}/build-pdcurses"
> -        cd "${CT_BUILD_DIR}/build-pdcurses"
> -
> -        make -f ${CT_SRC_DIR}/PDCurses-${CT_MINGW_PDCURSES_VERSION}/win32/mingwin32.mak libs \
> -            PDCURSES_SRCDIR=${CT_SRC_DIR}/PDCurses-${CT_MINGW_PDCURSES_VERSION} \
> -            CROSS_COMPILE=${CT_TARGET}-
> -
> -        CT_DoLog EXTRA "Installing PDCurses development files"
> -        chmod a+r ${CT_SRC_DIR}/PDCurses-${CT_MINGW_PDCURSES_VERSION}/*.h
> -        cp ${CT_SRC_DIR}/PDCurses-${CT_MINGW_PDCURSES_VERSION}/*.h \
> -           ${CT_HEADERS_DIR}/
> -        cp pdcurses.a ${CT_SYSROOT_DIR}/lib/libpdcurses.a
> -        cp pdcurses.a ${CT_SYSROOT_DIR}/lib/libncurses.a
> -    fi
> -
> -    if [ -n "${CT_MINGW_GNURX}" ]; then
> -        CT_DoLog EXTRA "Configuring GnuRX development files"
> -
> -        mkdir -p "${CT_BUILD_DIR}/build-gnurx"
> -        cd "${CT_BUILD_DIR}/build-gnurx"
> -
> -        CT_DoExecLog CFG                                                        \
> -        CFLAGS="${CT_CFLAGS_FOR_TARGET}"                                        \
> -        "${CT_SRC_DIR}/mingw-libgnurx-${CT_MINGW_GNURX_VERSION}-src/configure"  \
> -            --build=${CT_BUILD}                                                 \
> -            --host=${CT_TARGET}                                                 \
> -            --prefix=${CT_SYSROOT_DIR}                                          \
> -            --includedir=${CT_HEADERS_DIR}                                      \
> -            --enable-shared                                                     \
> -            --enable-static
> -
> -        CT_DoLog EXTRA "Building GnuRX development files"
> -        CT_DoExecLog ALL make ${JOBSFLAGS}
> -
> -        CT_DoLog EXTRA "Installing GnuRX development files"
> -        CT_DoExecLog ALL make install-dev
> -    fi
> -
> -    CT_EndStep
> +    :
>  }

Yeah! We get rid of libc_finish for MingW! Hurray! \o/
Let's bash on newlib, the last offender now. ;-)

[--SNIP--]

Now we have a working base that is able to build toolchains, can you look
at the comments above, so we can have a clean implementation?

Thank you for this overall good work so far! :-)

Regards,
Yann E. MORIN.

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'

--
For unsubscribe information see http://sourceware.org/lists.html#faq


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