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.