[PATCH] Replace mingw32 by mingw-w64 for generating 32/64 bits Windows cross compiler

Diorcet Yann diorcet.yann@gmail.com
Wed Nov 14 11:46:00 GMT 2012


Le 13/11/12 21:10, Diorcet Yann a écrit :
> Le 13/11/2012 19:57, Yann E. MORIN a écrit :
>> 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
> As you want :)
>> [--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).
> The issue is that in mingw-w64 there is no seperation between 
> "kernel"/"libc" they come from same archive. I don't know what i have 
> to do
>>
>>> 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.
> PDCurses is only a wrapper for use curses function with the DOS 
> console. Nothing to do with Windows API/SDK.
> For opengl
Correction opengl is included too (but not glut)
> Directx is replaced (btw the old provided includes are incomplete)
> There is new important enhancement: DDK
>>> 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.
> ok
>>
>>> 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.
> ok
>>
>>> 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?
> ok
>>
>>> +    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).
> i forgot
>>
>>> +}
>>> +
>>> +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
> ok
>>
>> 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:
>>          :)  ;;
> ok
>>> +    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}"                        \
> ok
>> 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.
> No there is no reason. I will try that way
>>
>>> +        "${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.
> I will try to simplify all this stuff
>>> 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.
> ok
>> 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. ;-)
>>
I have remove all code/configuration from kernel stuff. All is in mingw 
libc now. I will send you patch soon.
>> [--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.
>>
>


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



More information about the crossgcc mailing list