Cross-compile to Linux from OS X

Viewed 5296

I want to compile binaries for a Linux server from an OS X 10.7 + Eclipse build system. This means a GCC cross-compiler. I'm starting from native 4.7.1 and shooting for a host 4.7.1.

Most online instructions are specific to embedded development. I want to use libstdc++-v3 and glibc, which make it a little different.

What succeeds:

  1. Install packages

    port install gcc47
    export CC=gcc-mp-47
    export LD=ld-mp-47
    export CXX=g++-mp-47
    export CPP=cpp-mp-47
    
    port install gmake
    ln /opt/local/bin/gmake /opt/local/bin/make
    
    port install gsed
    ln /opt/local/bin/gsed /opt/local/bin/sed
    
    port install gawk
    port install autoconf
    port install msgfmt
    
  2. Make and install binutils-2.22

  3. make all-gcc and make install-gcc

    Used the following config:

    $ ../gcc/configure --enable-languages=c,c++,objc,obj-c++ --with-gmp=/opt/local --with-mpfr=/opt/local --with-mpc=/opt/local --prefix=/usr/local/cross/linux --target=x86_64-pc-linux-gnu --disable-nls

  4. Point the build environment at the cross-compiler

    export CC=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-gcc
    export LD=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-ld
    export AR=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-ar
    export CXX=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-g++
    export CPP=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-cpp
    
  5. Build glibc-2.16 using the config

    ../glibc/configure --host=x86_64-pc-linux-gnu --build=x86_64-apple-darwin11 --prefix=/usr/local/cross/linux/ --with-binutils=/usr/local/cross/linux/bin/ --with-headers=/usr/local/cross/linux/include/ libc_cv_forced_unwind=yes libc_cv_ctors_header=yes libc_cv_c_cleanup=yes

The failure:

glibc build fails before long. This message appears many times:

In file included from ./sysdeps/unix/sysdep.h:20:0,
                 from ./sysdeps/unix/x86_64/sysdep.h:18,
                 from sysdeps/unix/sysv/linux/x86_64/sysdep.h:22,
                 from <stdin>:1:
sysdeps/unix/sysv/linux/sys/syscall.h:24:24: fatal error: asm/unistd.h: No such file or directory
compilation terminated.

This may be normal, though.

Then it fails to produce stdio_lim.h. With make -d, I get this:

          Successfully remade target file `/Users/dkrauss/Documents/work/glibc-build/csu/abi-tag.h'.
          Considering target file `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'.
           File `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h' does not exist.
           Looking for an implicit rule for `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'.
           Trying pattern rule with stem `lim'.
           Trying implicit prerequisite `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st'.
           Found an implicit rule for `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'.
            Considering target file `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st'.
            Recently tried and failed to update file `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st'.
make[2]: *** No rule to make target `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st', needed by `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'.  Stop.

This is the first header it attempts to build in bits. There is a file stdio_lim.h.in, which is the only .in file in its directory. Should some rule be connecting .st to .in?

1 Answers
Related