Announcement

Collapse
No announcement yet.

Free COMPILERS and CROSS-COMPILERS for Linux and Windows.

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Free COMPILERS and CROSS-COMPILERS for Linux and Windows.

    My knowledge of compilers is not that extensive and my knowledge of cross-compiling, even less.

    My first question is: How much of the following article is "the way" it should be done?

    Second question: What extra steps do you need to take to successfully cross-compile? For example:

    Do you need extra DirectX libraries? Where do you get them from?

    Free Compilers and Cross-Compilers
    for Linux and Windows.


    From http://linuxhelp.150m.com/
    and http://linux.50webs.org

    Yesterday's release of gcc, version 4.3.0, was a shock. The compilation of the Fortran compiler failed. The compilation of the Win32 (mingw32) cross compiler failed. This was incredibly shoddy for a major release. I imagined people having significant problems figuring what was going on, so, I wrote this article to try and help out. Of course, in this article, I will not use version 4.3.0, but its immediate predecessor, version 4.2.3.

    Well, it turns out that both of these problems go away, if you do the build in directories separate from the sources. Since this is non-traditional, it might have been nice for people to point out that the build will not work, in certain cases, unless you build in separate directories. For projects like gcc, compiling in separate directories is actually a great idea.

    Although the original problems with 4.3.0 have been solved, I ran into more difficulties later in the program, so, at least for the time being, I have stuck with version 4.2.3. Below, I have repeated the original program using separate build directories. If you do this, all the compilers and cross-compilers, are able to compile, at least, C, C++, Fortran and Java code. I made no attempt to incorporate ADA into the mix.

    This is an outline of what we will do:

    (1) compile a C,C++,Java,Fortran,ObjC,ObjC++,treelang compiler for Linux
    (2) compile a C cross-compiler for Linux (needed to compile system libraries)
    (3) compile a C,C++,Java,Fortran,ObjC,ObjC++ cross-compiler for Linux
    (4) compile a C,C++,Java,Fortran,ObjC,ObjC++ compiler for Windows
    (5) compile a C,C++,Java,Fortran cross-compiler for Windows

    Compiler (1) runs on a Linux box and produces binaries that will run under Linux
    Compiler (3) runs on a Linux box and produces binaries that will run under Windows
    Compiler (4) runs on a Windows box and produces binaries that will run under Windows
    Compiler (5) runs on a Windows box and produces binaries that will run under Linux

    I have recently added some extra sections:

    (6) How to use the Cross-Compiler(s) you built in step 3.
    (7) Adding the language ADA to the mix.
    (8) Using the Compiler(s) you built in step 1.
    (9) General Remarks.

    Make sure that you have the following programs and packages installed.

    For SuSE 10.0: gcc libgcc glibc glibc-devel glib2 glib2-devel ncurses ncurses-devel gcc-c++ libstdc++ libstdc++-devel.

    For Debian: emacs21 bzip2 gcc libncurses5-dev libc6-dev libc6-dev-i386 lib32gcc1 g++ libstdc++6-4.1-dev (and gnat if you want ADA).

    You may also need to install autoconf and automake.

    You will need at least 5 Gigabytes of free space. The compilation of part (1) took nearly 4 hours. The rest took just under 2 hours.

    Download the following to the directory /gcc/:

    binutils-2.18.50.tar.bz2 (16M)
    gcc-4.2.3.tar.bz2 (43M) from www.gnu.org/

    You can also obtain gcc-4.2.3.tar.bz2 in smaller pieces. Note, that in order to compile the ADA compiler, you need a working ADA compiler (GNAT 3.14, or later) on your system.

    You need the following Win32 API and runtime files:

    w32api-3.11-src.tar.gz
    mingw-runtime-3.14-src.tar.gz from www.mingw.org

    By the way, mingw.org exists to mislead and hinder, rather than help.

    It is best to upgrade your version of gmp and mpfr:

    mpfr-2.3.1.tar.bz2 from www.mpfr.org
    gmp-4.2.2.tar.bz2 from gmplib.org

    It is assumed that you are the root user.

    (1) Compile a C,C++,Java,Fortran,ObjC,ObjC++,treelang compiler for Linux.

    We do this to have an up-to-date compiler (actually, a collection of compilers) with which to compile the cross-compilers of steps 2 and 3. Beginning with an older compiler can lead to some complications. I did the build on a SuSE 10.0 Linux box. Using the installed compiler (version 4.0.2) worked for all steps except parts of (4) and all of (5). Using version 4.2.3 means that most things work.

    Save all the packages to the directory /gcc/. Go there and unpack everything:

    Code:
    mkdir /gcc; cd /gcc 
    for a in *.tar.*; do tar xf $a; done
    (unpacks everything)

    Code:
    mkdir binutils-linux-linux binutils-linux-win32 binutils-win32-win32 binutils-win32-linux
    Code:
    cd /gcc/binutils-linux-linux 
    /gcc/binutils-2.18.50/configure 
    make 
    make install
    Code:
    cd /gcc; mkdir gmp-linux gmp-win32
    Code:
    cd /gcc/gmp-linux 
    /gcc/gmp-4.2.2/configure 
    make 
    make install
    The make install script runs the command ldconfig -n /usr/local/lib. It turns out that this is not sufficient, you need to run ldconfig (as root). This updates the ld.so.cache file so that it knows to use the newly installed gmp library, rather than some older, pre-existing, gmp library. In particular, you want the compilation of the mpfr library to use the correct version of gmp.

    Code:
    ldconfig
    Code:
    cd /gcc; mkdir mpfr-linux mpfr-win32
    Code:
    cd /gcc/mpfr-linux 
    /gcc/mpfr-2.3.1/configure 
    make 
    make install
    Similarly, if you have some pre-existing version of the mpfr library, then you need to run ldconfig again. You should probably run ldconfig again, in any case, just to be on the safe side.

    Code:
    ldconfig
    Code:
    cd /gcc; mkdir gcc-linux-linux gcc-linux-win32 gcc-win32-win32 gcc-win32-linux
    Code:
    cd /gcc/gcc-linux-linux 
    /gcc/gcc-4.2.3/configure --enable-languages=c,c++,fortran,java,objc,obj-c++,treelang 
    make 
    make install
    So that version 4.2.3 does not interfere with your older installed compiler, it will be installed in /usr/local/. To use it, instead of the installed compiler, you need to have /usr/local/bin first on your path. You arrange this with:

    Code:
    export PATH=/usr/local/bin:$PATH; echo $PATH
    (2) Compile a C cross-compiler for Linux.

    This C cross-compiler will run on your Linux system and create binaries, from Linux C code, that will run on a Windows system. We need to use this cross-compiler to compile the Win32 API and runtime libraries.

    Code:
    cd /gcc/binutils-linux-win32 
    /gcc/binutils-2.18.50/configure --target=i686-pc-mingw32 
    make 
    make install
    Code:
    cp -r /gcc/{mingw-runtime-3.14,w32api-3.11}/include /usr/local/i686-pc-mingw32 
    ln -s w32api-3.11 w32api
    Code:
    cd /gcc/gcc-linux-win32/ 
    /gcc/gcc-4.2.3/configure --target=i686-pc-mingw32 \ 
                --with-headers=/usr/local/i686-pc-mingw32/include \ 
                --enable-languages=c 
    make 
    make install
    Code:
    cd /gcc/w32api-3.11 
    ./configure --build=i686-pc-linux-gnu \ 
                --host=i686-pc-mingw32 \ 
                --prefix=/usr/local/i686-pc-mingw32 
    make 
    make install
    Code:
    cd /gcc/mingw-runtime-3.14 
    ./configure --build=i686-pc-linux-gnu \ 
                --host=i686-pc-mingw32 \ 
                --prefix=/usr/local/i686-pc-mingw32 
    make 
    make install
    The files in /usr/local/i686-pc-mingw32, will be used for cross-compiling Linux programs to run on Windows.

    (3) Compile a C,C++,Java,Fortran,ObjC,ObjC++ cross-compiler for Linux.

    The C cross-compiler is compiled again, along with the other languages. This cross-compiler is run on your Linux box and compiles binaries, from Linux code, that will run on a Windows system. That is, it compiles Linux source code, so that the resulting binaries will run, unaltered, on Windows.

    Code:
    rm -fr /gcc/gcc-linux-win32 
    mkdir /gcc/gcc-linux-win32 
    cd /gcc/gcc-linux-win32
    Code:
    /gcc/gcc-4.2.3/configure --target=i686-pc-mingw32 \ 
                --with-headers=/usr/local/i686-pc-mingw32/include \ 
                --enable-languages=c,c++,fortran,java,objc,obj-c++ 
    make 
    make install
    Know you need to run ldconfig to tell all the other programs where to find the necessary libraries:

    Code:
    ldconfig
    Last edited by Jade; 04 May 2008, 10:57 AM.

  • #2
    (4) Compile a C,C++,Java,Fortran,ObjC,ObjC++ compiler for Windows.

    This compiler is a native Windows compiler. That is, it runs on a Windows box. It compiles Windows source code and the resulting binaries will run on Windows. When compiling C++, this compiler will do the same job as Visual C++ or C++ Builder.

    Code:
    export CC="i686-pc-mingw32-gcc"; echo $CC
    Code:
    mkdir /mingw 
    cp -r /usr/local/i686-pc-mingw32/{include,lib} /mingw
    The configure script expects to find the system headers and libraries in /mingw, so we have arranged for them to be there.

    Code:
    cd /gcc/binutils-win32-win32 
    /gcc/binutils-2.18.50/configure --build=i686-pc-linux-gnu \ 
                --host=i686-pc-mingw32 \ 
                --target=i686-pc-mingw32 \ 
                --prefix=/mingw 
    make 
    make install
    Code:
    cd /gcc/gmp-win32 
    /gcc/gmp-4.2.2/configure --build=i686-pc-linux-gnu \ 
                --host=i686-pc-mingw32 \ 
                --prefix=/usr/local/i686-pc-mingw32 
    make 
    make install 
    /gcc/gmp-4.2.2/configure --build=i686-pc-linux-gnu \ 
                --host=i686-pc-mingw32 \ 
                --prefix=/mingw 
    make 
    make install
    Code:
    cd /gcc/mpfr-win32 
    /gcc/mpfr-2.3.1/configure --build=i686-pc-linux-gnu \ 
                --host=i686-pc-mingw32 \ 
                --prefix=/usr/local/i686-pc-mingw32 
    make 
    make install 
    /gcc/mpfr-2.3.1/configure --build=i686-pc-linux-gnu \ 
                --host=i686-pc-mingw32 \ 
                --prefix=/mingw 
    make 
    make install
    The reason for the second installs into /mingw, is that the libtool libraries, i.e., the .la files, have their destination directory hard-coded into them, so you can not simply copy them from /usr/local/i686-pc-mingw32/lib to /mingw/lib.

    The files that end up in /mingw will be transfered to C:\mingw on your Windows box.

    Code:
    cd /gcc/gcc-win32-win32 
    /gcc/gcc-4.2.3/configure --build=i686-pc-linux-gnu \ 
                --target=i686-pc-mingw32 \ 
                --host=i686-pc-mingw32 \ 
                --enable-languages=c,c++,fortran,java,objc,obj-c++ \ 
                --prefix=/mingw 
    make 
    make install
    (5) Compile a C,C++,Java,Fortran cross-compiler for Windows.

    This compiler runs on a Windows box. It compiles Windows source code and the resulting binaries will run unaltered on Linux. Ever wanted to compile VirtualDub so that it runs on Linux? This avoids having to port the source code.

    Code:
    cd /gcc/binutils-win32-linux 
    /gcc/binutils-2.18.50/configure --build=i686-pc-linux-gnu \ 
                --host=i686-pc-mingw32 \ 
                --target=i686-pc-linux-gnu \ 
                --prefix=/mingw 
    make 
    make install
    Code:
    cd /gcc/gcc-win32-linux 
    /gcc/gcc-4.2.3/configure --build=i686-pc-linux-gnu \ 
                --host=i686-pc-mingw32 \ 
                --target=i686-pc-linux-gnu \ 
                --enable-languages=c,c++,fortran,java \ 
                --disable-libgomp \ 
                --prefix=/mingw 
    make 
    make install
    Now you copy everything in /mingw to C:\mingw on a Windows box and start compiling there. After you have compiled your Windows program, say VirtualDub, on your Windows computer, you transfer the resulting executable back to Linux and run it there. Of course, for most compilations you will also need to compile a version of the make program for Windows. You can compile the make program for Windows, on your Linux box, by using the cross-compiler you built in step (3).

    (6) How to use the cross-compiler you built in step 3.

    As a quick example of how to use the cross-compiler you built in step 3. Download the Linux make program to /gcc/:

    make-3.81.tar.bz2 from www.gnu.org/

    Code:
    export CC="i686-pc-mingw32-gcc"; echo $CC 
    cd /gcc; tar xf make-3.81.tar.bz2; cd /gcc/make-3.81 
    ./configure --build=i686-pc-linux-gnu \ 
                --host=i686-pc-mingw32 \ 
                --prefix=/mingw 
    make 
    make install
    Now copy make.exe to C:\mingw\bin on your Windows box. Easy, isn't it?

    (7) Adding the language ADA to the mix.

    Download the following binary gnat package to /gcc/:

    gnat-3.15p-i686-pc-redhat71-gnu-bin.tar.bz2 (12M) from linuxfromscratch.org

    Code:
    tar xf gnat-3.15p-i686-pc-redhat71-gnu-bin.tar.bz2 
    cd /gcc/gnat-3.15p-i686-pc-linux-gnu-bin/
    Run the script doconfig entering /gcc/gnat for the installation directory. Then run doinstall.

    Code:
    ./doconfig; ./doinstall
    Follow the instructions of section (1), until the compilation of the compiler itself.

    Then set your PATH variable so that you use the ADA-understanding compiler that you have just installed.

    Code:
    export PATH=/gcc/gnat/bin:$PATH; echo $PATH
    Now compile the compiler of section (1), with one small change. Namely, add ada to the --enable-languages option.

    Code:
    cd /gcc/gcc-linux-linux 
    /gcc/gcc-4.2.3/configure \ 
                --enable-languages=c,ada,c++,fortran,java,objc,obj-c++,treelang 
    make 
    make install
    Then reset you PATH variable and continue from section (2), as above, except adding ada to the --enable-languages option.

    Code:
    export PATH=/usr/local/bin:$PATH; echo $PATH
    You could also try the compiler in gnat-gpl-2007-i686-gnu-linux-libc2.3-bin.tar.gz (75M) from libre.adacore.com. Unfortunately, gcc-4.2.3 does not compile at all and gcc-4.3.0 does not compile outside the sources.

    If at any time you need to know which compiler you are using, just enter the command:

    Code:
    gcc -v
    Using built-in specs.
    Target: i686-pc-linux-gnu
    Configured with: /gcc/gcc-4.2.3/configure --enable-languages=c,ada,c++,fortran,java,objc,obj-c++,treelang
    Thread model: posix
    gcc version 4.2.3

    The compiler in the gnat package is gcc version 2.8.1. Ancient, but worked like a charm.

    (8) Using the Compiler you built in step 1.

    The first thing to note, is that the "obvious"
    Code:
    gcc program.f
    and
    Code:
    gcc program.java
    do not work.

    The Fortran front-end is gfortran. It is used as
    Code:
    gfortran program.f
    Code:
    gcc -lgfortranbegin -lgfortran program.f
    also works.

    The Java front-end is gcj. The following incantations can be used to compile Java code:

    Code:
    gcj --main=program program.java
    (compile to C++ object file, a.out)
    Code:
    ./a.out
    (execute the C++ object file, a.out)
    Code:
    gcj -C program.java
    (compile to Java bytecode file, program.class)
    Code:
    gij program
    (execute the bytecode, program.class, with the GCC Java Virtual Machine)

    To compile ObjC code, use
    Code:
    gcc -lobjc program.m
    If you mix ObjC code and C++ code in the same files, you call the resulting mixture, ObjC++ code. It is apparently compiled in the same way as ObjC code. You are totally on your own for treelang.

    To compile ADA code, use
    Code:
    gnat make program.adb
    (9) General Remarks.

    Since it is difficult to cut and paste many of the above commands, here is the script I used for the project.

    If you are building on an older PC, replace i686 by i386, everywhere in the above.

    For AMD-64, the script config.guess, gives x86_64-unknown-linux-gnu. It seems you can put any word in place of unknown, or no word at all. So configure with something like:

    Code:
    ./configure --build=x86_64-linux-gnu \ 
                --host=x86_64-linux-gnu \ 
                --target=i686-pc-mingw32
    I actually used x86_64-pc-linux-gnu and am assuming that x86_64-linux-gnu will work.

    If you have a multilib system, like Debian, you may want to compile both 32-bit and 64-bit libraries for gcc. You need to have all the standard 32-bit libraries installed. On Debian, make sure you have the links:

    Code:
    ln -s /lib /lib64 
    ln -s /emul/ia32-linux/lib /lib32 
    ln -s /usr/lib /usr/lib64 
    ln -s /emul/ia32-linux/usr/lib /usr/lib32
    The compilation will fail, for gcc-4.2.3, unless you use the --disable-multilib configuration option, or you create the (secret) link:

    Code:
    ln -s /emul/ia32-linux/lib /usr/local/x86_64-pc-linux-gnu/lib/32
    For gcc-4.3.0 the above link appears to be unnecessary (4.3.0 has other problems).

    I have been running short on space and over time have deleted all my Windows partitions. As soon as I get around to reinstalling Windows, I will let you know how the Windows compilers work. I have now done this. There are weird problems with the Fortran compiler and the Java Virtual Machine, gij, is mysteriously missing. C C++ ObjC and ObjC++ seem OK, at least for simple programs. The compilers were run from an XP cmd window. I only looked at the native Windows compilers. I will look at the cross compilers at some later date.

    By the way, if you wish to both watch, and record, the output of the compilation, you can do this:

    Code:
    ./configure 2>&1 | tee log.configure 
    make 2>&1 | tee log.make 
    make install 2>&1 | tee log.install
    Last edited by Jade; 30 May 2008, 09:21 AM.

    Comment


    • #3
      Originally posted by Jade
      Does anyone have any idea about all this?
      Very nice summary.

      Why anyone would want to use windows to compile for linux is beyond me ;-)

      However, have a look at Gentoo's 'crossdev' tool. For example, to get all cross-compilers I need at work:

      for I in "sh4 mipsel-softfloat-linux-gnu arm-unknown-linux-gnueabi mingw32" ; do crossdev -t ${I} -v -b --b 2.18-r1 --g 4.2.3 --k 2.6.24 --l 2.7-r1 ; done
      This gets me linux-hosted, linux-targetting cross-compilers for all arches I have. As a bonus, on Gentoo multiple version of gcc and binutils for every arch can be installed side-by-side.

      Comment


      • #4
        Originally posted by mlau View Post
        Why anyone would want to use windows to compile for linux is beyond me ;-)
        Yeah,... but it DOES save porting the application to Linux. Which is very useful.

        Comment


        • #5
          Well at the moment I'm using Gentoo's crossdev to compile for Linux/FreeBSD/Windows (i686 only).
          It works quite great. Looking at your instructions, it seems pretty much what portage does for you.

          Thanks, a nice starting point, If I need to do cross-compiling from a non-gentoo system.

          Comment


          • #6
            Originally posted by Jade View Post
            Yeah,... but it DOES save porting the application to Linux. Which is very useful.
            windows and glibc/POSIX apis are very different; unless source has been written with mingw in mind (and even then there are suble, annoying differences between OSs)

            Comment


            • #7
              For a NATIVE build on an AMD-64 box:

              On AMD-64, config.guess gives x86_64-unknown-linux-gnu

              I didn't check to see if x86_64-unknown-linux-gnu compiles, but just changed it to x86_64-linux-gnu through the configuration.

              First make sure you have links from /lib32 and /lib64 to wherever your 32-bit and 64-bit libraries actually are.

              For example, on Debian:

              Code:
              ln -s /emul/ia32-linux/lib /lib32
              ln -s /lib /lib64 (this link probably already exists)
              
              ln -s /emul/ia32-linux/usr/lib /usr/lib32
              ln -s /usr/lib /usr/lib64
              Code:
              cd binutils-2.18.50
              ./configure --build=x86_64-linux-gnu
                          --host=x86_64-linux-gnu
              make
              make install
              
              cd gcc-4.2.3
              ./configure --build=x86_64-linux-gnu
                          --host=x86_64-linux-gnu
                          --target=x86_64-linux-gnu
                          --disable-multilib
                          --enable-languages=c,c++,fortran,java,objc,obj-c++,treelang
              make
              make install
              Last edited by Jade; 13 April 2008, 10:40 PM.

              Comment


              • #8
                Well, it turns out that both of these problems go away, if you do the build in directories separate from the sources. Since this is non-traditional, it might have been nice for people to point out that the build will not work, in certain cases, unless you build in separate directories.
                Building outside the tree has been standard practice with GCC for as long as I can remember, and is pretty clearly noted in the install instructions:

                First, we highly recommend that GCC be built into a separate directory than the sources which does not reside within the source tree. This is how we generally build GCC; building where srcdir == objdir should still work, but doesn't get extensive testing; building where objdir is a subdirectory of srcdir is unsupported.
                Granted, the srcdir = objdir case should work, and it's not as though GCC is ideal in any case. A wise man once said: "gcc is the holy cow of compilers, not the holy grail".

                Comment


                • #9
                  Note that http://linuxhelp.150m.com/compile/gcc-compilers.htm has been up-dated.

                  Comment


                  • #10
                    As noted above, some things, like the WINDOWS Java compiler, don't really work with 4.2.3. Although the WINDOWS Java compiler compiles, many ancillary programs and libraries, like the Java Virtual Machine, gij, are missing. To compile these, one needs to add the configuration option --enable-libgcj, to part 3, giving:

                    Code:
                    cd /gcc/gcc-win32-win32 
                    /gcc/gcc-4.2.3/configure --build=i686-pc-linux-gnu \ 
                                --target=i686-pc-mingw32 \ 
                                --host=i686-pc-mingw32 \ 
                                --enable-languages=c,c++,fortran,java,objc,obj-c++ \ 
                                --enable-libgcj \
                                --prefix=/mingw 
                    make 
                    make install
                    however, the compilation fails once the option is added.

                    Anyone know of a patch?

                    Comment

                    Working...
                    X