[LLVMdev] Does someone has experience with Canadian cross build of LLVM compiler?

Ekaterina Sanina ekaterina.sanina at gmail.com
Mon Nov 29 12:51:52 PST 2010


Hi,

Does anyone have experience with doing Canadian cross-builds of LLVM
compiler? I need some help here... I'm a new with LLVM, so please don't be
too harsh on me.

I am building LLVM cross-compiler (and as I mentioned I'm doing it via
canadian cross-build):
Build platform = Linux,
Host platform = Windows
Target platform = Linux

I'm using mingw32 compiler toolchain to cross-build LLVM cross-compiler.
(My CC=i386-mingw32-gcc, CXX=i386-mingw32-g++, LD=i386-mingw32-ld, etc)

During the build, configure complains that it can't run C compiled program
on build platform (which makes sense, since mingw32 compiler creates an
executable that cannot be run
on build platform (linux)).

SRC_DIR="/home/ksanina"; export SRC_DIR;
BUILD_DIR="/home/ksanina/build/mx-debug-llvm-all"; export BUILD_DIR;
PWD="/home/ksanina"; export PWD; PATH="/usr/local/bin:/bin:/usr/bin"; export
PATH; BUILD_DIR=/home/ksanina/build/mx-debug-llvm ; export BUILD_DIR ;
INSTALL_DIR=/home/ksanina/install/mx-debug ; export INSTALL_DIR ;
AR="i386-mingw32-ar"; export AR; AS="i386-mingw32-as"; export AS;
CC="i386-mingw32-gcc"; export CC; CXX="i386-mingw32-g++"; export CXX;
LD="i386-mingw32-ld"; export LD; CFLAGS="-m32 -g"; export CFLAGS;
CXXFLAGS="-m32 -g"; export CXXFLAGS; LDFLAGS=""; export LDFLAGS;
CFLAGS="-std=gnu89 $CFLAGS"
make -f /home/ksanina/Makefile.llvm -C $BUILD_DIR all
CONFIG_FLAGS="--host=i386-mingw32
--build=x86_64-linux-gnu --target=i386-linux
--prefix=/home/ksanina/install/mx-debug --enable-validation"
MAKE_FLAGS="VERBOSE=1 " TESTSUITE=
make[1]: Entering directory `/home/ksanina/build/mx-debug-llvm'
make VERBOSE=1
make[2]: Entering directory `/home/ksanina/build/mx-debug-llvm'
if [ ! -f BuildTools/Makefile ]; then \
          /home/ksanina/llvm/autoconf/mkinstalldirs BuildTools; \
      cd BuildTools ; \
      unset CFLAGS ; \
      unset CXXFLAGS ; \
      /home/ksanina/llvm/configure --build=x86_64-pc-linux-gnu \
        --host=x86_64-pc-linux-gnu --target=x86_64-pc-linux-gnu; \
      cd .. ; \
    fi; \
    (unset SDKROOT; \
     make -C BuildTools \
      BUILD_DIRS_ONLY=1 \
      UNIVERSAL= \
      ENABLE_OPTIMIZED=1 \
      ENABLE_PROFILING= \
      ENABLE_COVERAGE= \
      DISABLE_ASSERTIONS=1 \
      ENABLE_EXPENSIVE_CHECKS= \
      CFLAGS= \
      CXXFLAGS= \
    ) || exit 1;
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking target system type... x86_64-pc-linux-gnu
checking type of operating system we're going to host on... Linux
checking type of operating system we're going to target... Linux
checking target architecture... x86_64
checking for x86_64-pc-linux-gnu-gcc... i386-mingw32-gcc
checking for C compiler default output file name... a.exe
checking whether the C compiler works... configure: error: cannot run C
compiled programs.
If you meant to cross compile, use `--host'.
See `config.log' for more details.
make[3]: Entering directory `/home/ksanina/build/mx-debug-llvm/BuildTools'
make[3]: *** No targets specified and no makefile found.  Stop.
make[3]: Leaving directory `/home/ksanina/build/mx-debug-llvm/BuildTools'
make[2]: *** [cross-compile-build-tools] Error 1
make[2]: Leaving directory `/home/ksanina/build/mx-debug-llvm'
make[1]: *** [make] Error 2
make[1]: Leaving directory `/home/ksanina/build/mx-debug-llvm'
make: *** [mx-debug-llvm-all] Error 2
rm /home/ksanina/build/mx-debug-llvm/.dir




To resolve this issue, I end up setting up additional environment variables,
BUILD_CC=gcc BUILD_CXX=g++  BUILD_AR =ar BUILD_LD=ld etc.
Also, I modified llvm/Makefile to use my BUILD_CC, BUILD_AS, BUILD_LD, etc
instead of CC, AS, LD, etc.
for cross-compile-build-tools target.

cross-compile-build-tools:
        $(Verb) if [ ! -f BuildTools/Makefile ]; then \
          $(MKDIR) BuildTools; \
          cd BuildTools ; \
          unset CFLAGS ; \
          unset CXXFLAGS ; \
+         AR=$(BUILD_AR) ;\
+         AS=$(BUILD_AS) ;\
+         LD=$(BUILD_LD) ;\
+         CC=$(BUILD_CC) ;\
+         CXX=$(BUILD_CXX) ;\
          $(PROJ_SRC_DIR)/configure --build=$(BUILD_TRIPLE) \
                --host=$(BUILD_TRIPLE) --target=$(BUILD_TRIPLE); \
          cd .. ; \


This workaround worked. But I'm sure there is some other,  more elegant way
of doing it (without actually changing llvm/Makefile). I'm sure other people
have done Canadian cross build and resolve this issue some other way. If
you've done it before, please advise on how better to do it.

Thanks a lot!

Ekaterina.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20101129/0cbb0e47/attachment.html>


More information about the llvm-dev mailing list