[llvm-dev] Trying to cross-compile LLVM runtimes to Windows
Martin Storsjö via llvm-dev
llvm-dev at lists.llvm.org
Tue Nov 6 05:42:30 PST 2018
On Mon, 5 Nov 2018, Petr Hosek via llvm-dev wrote:
> I've tried building libc++ for Windows on Linux by setting clang-cl as
> the compiler and lld-link as the linker, but I immediately hit
> roadblocks. The first issue seems to be the fact that CMake appears to
> ignore the value of CMAKE_RC_COMPILER variable and hardcodes "rc" as
> the resource compiler. This got resolved in upstream 12 days ago
> (https://github.com/Kitware/CMake/commit/bd9bfc644954a48b1bf7ea18fc260a1231840671)
>
> I managed to workaround this issue by symlinking llvm-rc as rc.
> However, that's not sufficient because CMake uses following invocation
> (https://github.com/Kitware/CMake/blob/master/Source/cmcmd.cxx#L1815):
>
> rc /foCMakeFiles/cmTC_2c376.dir/manifest.res
> CMakeFiles/cmTC_2c376.dir/manifest.rc
>
> llvm-rc option parses requires /fo option argument to be separate.
> I've modified the flag to support both joined and separate value which
> helped getting past that error,
Please send that patch for review (add me, zturner, amccarth and thakis as
reviewers) - it's probably useful irrespective of the other issues you're
running into.
> but I immediately hit another error: https://reviews.llvm.org/P8113
>
> The problem seems to be that the .rc file generated by CMake contains
> an absolute path to the resource, but llvm-rc expects the path to be
> always relative. However, I couldn't fine any documentation that would
> explain whether that's a requirement and it's CMake's fault or whether
> llvm-rc should be handling absolute paths as well. Is anyone familiar
> with Windows resource file semantics?
As the existing cmake behaviour works with rc.exe, llvm-rc should adapt to
handle it as well.
It seems like we look in the INCLUDE environment for files included in
resource files, but as that assert points out, doing that doesn't makse
sense if the file name looked for actually turns out to be an absolute
path. I'd just add an "if (!path::is_absolute(FileName))" before the
FindInEnvPath call.
> All of these errors seem to suggest that this cross-compiling for
> Windows with Clang using CMake isn't a well explored area. Has anyone
> had more success with cross-compiling LLVM runtimes (libc++,
> compiler-rt) to Windows?
I do this, successfully - see https://github.com/mstorsjo/llvm-mingw (as
Jean-Michaël already linked). I do this in a mingw setup though, so cmake
doesn't use llvm-rc directly, but instead I wrap llvm-rc in a GNU windres
like frontend, that takes care of preprocessing (in case there are
#include etc) and option handling (wrangling options from GNU windres
style to what llvm-rc expects).
It's definitely not a well-explored area though - as build-compiler-rt.sh
and build-libcxx.sh in my repo shows, I go through quite a bit of manual
fiddling to get it all to build in a bootstrap setup. There might be
opportunities for simplifying all of it somewhat, but this setup works for
me at least.
// Martin
More information about the llvm-dev
mailing list