Problems building host tools when cross compiling LLVM

Hi All,

I recently ran into an issue that was posted several years back on LLVMdev [1].
A brief recap of the problem is that when cross-compiling LLVM itself the
configure/make scripts get confused when creating the needed build host tools.
For example, building and configuring like:

  CC_FOR_BUILD='i686-pc-linux-gnu-gcc' CXX_FOR_BUILD='i686-pc-linux-gnu-g++'
  CXX='i686-mingw32-g++' CC='i686-mingw32-gcc' LD='i686-mingw32-ld' /scratch
  /meadori/llvm-trunk/src/trunk/configure --host=i686-mingw32

  CC_FOR_BUILD='i686-pc-linux-gnu-gcc' CXX_FOR_BUILD='i686-pc-linux-gnu-g++'
  CXX='i686-mingw32-g++' CC='i686-mingw32-gcc' LD='i686-mingw32-ld' make

causes the following build break:

  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.

The 'config.log' shows that i686-mingw32-gcc is being used to create
executables for the build host:

  configure:2185: checking for C compiler default output file name
  configure:2212: i686-mingw32-gcc conftest.c >&5
  configure:2215: $? = 0
  configure:2261: result: a.exe
  configure:2266: checking whether the C compiler works
  configure:2276: ./a.exe
  run-detectors: unable to find an interpreter for ./a.exe
  configure:2279: $? = 2

The patch mentioned in [1] does fix the issue.

Is there any particular reason that patch was not applied or shouldn't be?

[1] http://lists.cs.uiuc.edu/pipermail/llvmdev/2010-November/036651.html

Hi All,

I recently ran into an issue that was posted several years back on LLVMdev [1].
A brief recap of the problem is that when cross-compiling LLVM itself the
configure/make scripts get confused when creating the needed build host tools.
For example, building and configuring like:

  CC_FOR_BUILD='i686-pc-linux-gnu-gcc' CXX_FOR_BUILD='i686-pc-linux-gnu-g++'
  CXX='i686-mingw32-g++' CC='i686-mingw32-gcc' LD='i686-mingw32-ld' /scratch
  /meadori/llvm-trunk/src/trunk/configure --host=i686-mingw32

  CC_FOR_BUILD='i686-pc-linux-gnu-gcc' CXX_FOR_BUILD='i686-pc-linux-gnu-g++'
  CXX='i686-mingw32-g++' CC='i686-mingw32-gcc' LD='i686-mingw32-ld' make

causes the following build break:

  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.

The 'config.log' shows that i686-mingw32-gcc is being used to create
executables for the build host:

  configure:2185: checking for C compiler default output file name
  configure:2212: i686-mingw32-gcc conftest.c >&5
  configure:2215: $? = 0
  configure:2261: result: a.exe
  configure:2266: checking whether the C compiler works
  configure:2276: ./a.exe
  run-detectors: unable to find an interpreter for ./a.exe
  configure:2279: $? = 2

The patch mentioned in [1] does fix the issue.

Is there any particular reason that patch was not applied or shouldn't be?

I missed it coming across the first time (and that's a long time ago).
I haven't had a chance to look at it and the archives don't have the
actual patch. Can you send it?

-eric

Sure. See attached. This is the same as the patch provided by Ekaterina
Sanina in the thread I linked.

I can build fine with this applied for the scenario I described and the changes
seem reasonable, but I am not all that familiar with the Makefile bits and
might be missing something.

Makefile-cross-build-tools.patch (453 Bytes)

This should work fine for the cross compiling case I think. It won't
help the "build the build tools with these compilers" but for native
that's not really helpful anyhow.

Feel free to commit and pay attention to any complaints if you don't mind :slight_smile:

-eric

Will do.

Thanks!