Tony Kelman via llvm-dev
2016-Feb-10 04:21 UTC
[llvm-dev] Guidance on cross compiling LLVM with mingw-w64 and cmake
I need to build libLLVM (individual static libraries are fine at the moment) using mingw-w64 cross compilers, i686-w64-mingw32-gcc and (separately) x86_64-w64-mingw32-gcc. I'd like this to work from both Linux and Cygwin build environments. With autotools, this worked fine: ../configure --host=i686-w64-mingw32 and that's it (with mingw32-gcc-c++ installed on Fedora 23, also works fine on Ubuntu, Cygwin, etc). I'm trying to recreate this with cmake so we don't get stuck on 3.8 indefinitely. Here's what I've got so far: cmake .. -DCMAKE_C_COMPILER=/usr/bin/i686-w64-mingw32-gcc \ -DCMAKE_CXX_COMPILER=/usr/bin/i686-w64-mingw32-g++ \ -DCMAKE_SYSTEM_NAME=Windows \ -DCMAKE_RC_COMPILER=/usr/bin/i686-w64-mingw32-windres # (some older versions of cmake have issues if you don't # specify an absolute path to windres) When this gets to "Configuring NATIVE targets" it calls cmake again trying to use the same mingw compilers, but without CMAKE_SYSTEM_NAME set so it doesn't succeed in configuring. During the build I then get a "No rule to make target 'LLVMSupport'. Stop." Full build log is at http://sprunge.us/bCUU I'd like to go with the default behavior of building a native version of TableGen, but the way that's currently set up in cmake isn't working here. I'm looking at cmake/modules/CrossCompile.cmake (and I think "toochain" on the first line is a typo?) and trying to figure out how to make its call to execute_process(COMMAND ${CMAKE_COMMAND} ...) not inherit the top-level settings for CMAKE_C_COMPILER etc from the cross build. Any ideas? I've tried moving my mingw settings from the command line to a toolchain file but that hasn't done anything different so far. I've also tried specifically creating a native toolchain file and tweaking the call to llvm_create_cross_target_internal at the end of CrossCompile.cmake to use it, but that hasn't worked either - keeps giving Could not find toolchain file: "/home/llvm/cmake/platforms/NATIVE.cmake" Is this a configuration anyone else has gotten working with cmake? Thanks, Tony
Mike Edwards via llvm-dev
2016-Feb-10 14:20 UTC
[llvm-dev] Guidance on cross compiling LLVM with mingw-w64 and cmake
Hi Tony, I don't have experience with your specific circumstance, so sorry I can't be much help there. Thank you though for pointing out what appears to be a typo. CC'ing Chris Bieneman as he may be able to verify if this is correct. Chris, I have attached a patch which should fix the typo. Would you mind having a look and committing if you think it is all good? Hope you both have a good day. Thanks, Mike Edwards On Tue, Feb 9, 2016 at 8:21 PM, Tony Kelman via llvm-dev < llvm-dev at lists.llvm.org> wrote:> I need to build libLLVM (individual static libraries are fine at the > moment) using mingw-w64 cross compilers, i686-w64-mingw32-gcc and > (separately) x86_64-w64-mingw32-gcc. I'd like this to work from both > Linux and Cygwin build environments. With autotools, this worked fine: > ../configure --host=i686-w64-mingw32 and that's it (with mingw32-gcc-c++ > installed on Fedora 23, also works fine on Ubuntu, Cygwin, etc). > I'm trying to recreate this with cmake so we don't get stuck on 3.8 > indefinitely. Here's what I've got so far: > > cmake .. -DCMAKE_C_COMPILER=/usr/bin/i686-w64-mingw32-gcc \ > -DCMAKE_CXX_COMPILER=/usr/bin/i686-w64-mingw32-g++ \ > -DCMAKE_SYSTEM_NAME=Windows \ > -DCMAKE_RC_COMPILER=/usr/bin/i686-w64-mingw32-windres > # (some older versions of cmake have issues if you don't > # specify an absolute path to windres) > > When this gets to "Configuring NATIVE targets" it calls cmake again > trying to use the same mingw compilers, but without CMAKE_SYSTEM_NAME > set so it doesn't succeed in configuring. During the build I then get > a "No rule to make target 'LLVMSupport'. Stop." Full build log is at > http://sprunge.us/bCUU > > I'd like to go with the default behavior of building a native version > of TableGen, but the way that's currently set up in cmake isn't working > here. I'm looking at cmake/modules/CrossCompile.cmake (and I think > "toochain" on the first line is a typo?) and trying to figure out how > to make its call to execute_process(COMMAND ${CMAKE_COMMAND} ...) not > inherit the top-level settings for CMAKE_C_COMPILER etc from the cross > build. Any ideas? I've tried moving my mingw settings from the command > line to a toolchain file but that hasn't done anything different so far. > I've also tried specifically creating a native toolchain file and > tweaking the call to llvm_create_cross_target_internal at the end of > CrossCompile.cmake to use it, but that hasn't worked either - keeps giving > Could not find toolchain file: "/home/llvm/cmake/platforms/NATIVE.cmake" > > Is this a configuration anyone else has gotten working with cmake? > Thanks, > Tony > > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160210/cef1bd6b/attachment.html> -------------- next part -------------- diff --git a/cmake/modules/CrossCompile.cmake b/cmake/modules/CrossCompile.cmake index c136dfa..9c598a6 100644 --- a/cmake/modules/CrossCompile.cmake +++ b/cmake/modules/CrossCompile.cmake @@ -1,4 +1,4 @@ -function(llvm_create_cross_target_internal target_name toochain buildtype) +function(llvm_create_cross_target_internal target_name toolchain buildtype) if(NOT DEFINED LLVM_${target_name}_BUILD) set(LLVM_${target_name}_BUILD "${CMAKE_BINARY_DIR}/${target_name}")
ChrisBieneman via llvm-dev
2016-Feb-11 07:09 UTC
[llvm-dev] Guidance on cross compiling LLVM with mingw-w64 and cmake
The CrossCompile module is in a perpetual state of "when I get a chance...", and desperately needs some cleanup. The problem you are hitting is caused by setting CMAKE_SYSTEM_NAME. When you set that CMake sets a variable CMAKE_CROSS_COMPILING. That variable should only be set when your host OS doesn't match your target OS. Since LLVM needs to build host-capable tools there is some goop to call out and configure a new CMake build directory to target the host. -Chris> On Feb 10, 2016, at 6:20 AM, Mike Edwards <mike at sqlby.me> wrote: > > Hi Tony, > I don't have experience with your specific circumstance, so sorry I can't be much help there. Thank you though for pointing out what appears to be a typo. CC'ing Chris Bieneman as he may be able to verify if this is correct. > > Chris, > I have attached a patch which should fix the typo. Would you mind having a look and committing if you think it is all good? > > Hope you both have a good day. > > Thanks, > Mike Edwards > >> On Tue, Feb 9, 2016 at 8:21 PM, Tony Kelman via llvm-dev <llvm-dev at lists.llvm.org> wrote: >> I need to build libLLVM (individual static libraries are fine at the >> moment) using mingw-w64 cross compilers, i686-w64-mingw32-gcc and >> (separately) x86_64-w64-mingw32-gcc. I'd like this to work from both >> Linux and Cygwin build environments. With autotools, this worked fine: >> ../configure --host=i686-w64-mingw32 and that's it (with mingw32-gcc-c++ >> installed on Fedora 23, also works fine on Ubuntu, Cygwin, etc). >> I'm trying to recreate this with cmake so we don't get stuck on 3.8 >> indefinitely. Here's what I've got so far: >> >> cmake .. -DCMAKE_C_COMPILER=/usr/bin/i686-w64-mingw32-gcc \ >> -DCMAKE_CXX_COMPILER=/usr/bin/i686-w64-mingw32-g++ \ >> -DCMAKE_SYSTEM_NAME=Windows \ >> -DCMAKE_RC_COMPILER=/usr/bin/i686-w64-mingw32-windres >> # (some older versions of cmake have issues if you don't >> # specify an absolute path to windres) >> >> When this gets to "Configuring NATIVE targets" it calls cmake again >> trying to use the same mingw compilers, but without CMAKE_SYSTEM_NAME >> set so it doesn't succeed in configuring. During the build I then get >> a "No rule to make target 'LLVMSupport'. Stop." Full build log is at >> http://sprunge.us/bCUU >> >> I'd like to go with the default behavior of building a native version >> of TableGen, but the way that's currently set up in cmake isn't working >> here. I'm looking at cmake/modules/CrossCompile.cmake (and I think >> "toochain" on the first line is a typo?) and trying to figure out how >> to make its call to execute_process(COMMAND ${CMAKE_COMMAND} ...) not >> inherit the top-level settings for CMAKE_C_COMPILER etc from the cross >> build. Any ideas? I've tried moving my mingw settings from the command >> line to a toolchain file but that hasn't done anything different so far. >> I've also tried specifically creating a native toolchain file and >> tweaking the call to llvm_create_cross_target_internal at the end of >> CrossCompile.cmake to use it, but that hasn't worked either - keeps giving >> Could not find toolchain file: "/home/llvm/cmake/platforms/NATIVE.cmake" >> >> Is this a configuration anyone else has gotten working with cmake? >> Thanks, >> Tony >> >> >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > > <patch.txt>-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160210/b5f876f7/attachment.html>
Justin Bogner via llvm-dev
2016-Feb-11 19:55 UTC
[llvm-dev] Guidance on cross compiling LLVM with mingw-w64 and cmake
Tony Kelman via llvm-dev <llvm-dev at lists.llvm.org> writes:> I need to build libLLVM (individual static libraries are fine at the > moment) using mingw-w64 cross compilers, i686-w64-mingw32-gcc and > (separately) x86_64-w64-mingw32-gcc. I'd like this to work from both > Linux and Cygwin build environments. With autotools, this worked fine: > ../configure --host=i686-w64-mingw32 and that's it (with mingw32-gcc-c++ > installed on Fedora 23, also works fine on Ubuntu, Cygwin, etc). > I'm trying to recreate this with cmake so we don't get stuck on 3.8 > indefinitely. Here's what I've got so far: > > cmake .. -DCMAKE_C_COMPILER=/usr/bin/i686-w64-mingw32-gcc \ > -DCMAKE_CXX_COMPILER=/usr/bin/i686-w64-mingw32-g++ \ > -DCMAKE_SYSTEM_NAME=Windows \ > -DCMAKE_RC_COMPILER=/usr/bin/i686-w64-mingw32-windres > # (some older versions of cmake have issues if you don't > # specify an absolute path to windres) > > When this gets to "Configuring NATIVE targets" it calls cmake again > trying to use the same mingw compilers, but without CMAKE_SYSTEM_NAME > set so it doesn't succeed in configuring. During the build I then get > a "No rule to make target 'LLVMSupport'. Stop." Full build log is at > http://sprunge.us/bCUU > > I'd like to go with the default behavior of building a native version > of TableGen, but the way that's currently set up in cmake isn't working > here. I'm looking at cmake/modules/CrossCompile.cmake (and I think > "toochain" on the first line is a typo?) and trying to figure out how > to make its call to execute_process(COMMAND ${CMAKE_COMMAND} ...) not > inherit the top-level settings for CMAKE_C_COMPILER etc from the cross > build. Any ideas? I've tried moving my mingw settings from the command > line to a toolchain file but that hasn't done anything different so far. > I've also tried specifically creating a native toolchain file and > tweaking the call to llvm_create_cross_target_internal at the end of > CrossCompile.cmake to use it, but that hasn't worked either - keeps giving > Could not find toolchain file: "/home/llvm/cmake/platforms/NATIVE.cmake"Looks like the (unreachable due to the toochain typo) cmake code to set the native toolchain file is buggy - it's failing to find the file because it thinks the quotes are part of the file name. This: set(CROSS_TOOLCHAIN_FLAGS_${target_name} -DCMAKE_TOOLCHAIN_FILE=\"${LLVM_MAIN_SRC_DIR}/cmake/platforms/${toolchain}.cmake\" should probably say this: set(CROSS_TOOLCHAIN_FLAGS_${target_name} -DCMAKE_TOOLCHAIN_FILE=${LLVM_MAIN_SRC_DIR}/cmake/platforms/${toolchain}.cmake You could probably also try out your native toolchain file without changing CrossCompile.cmake by setting CROSS_TOOLCHAIN_FLAGS_NATIVE on your cmake command line: cmake .. -DCMAKE_C_COMPILER=/usr/bin/i686-w64-mingw32-gcc \ -DCMAKE_CXX_COMPILER=/usr/bin/i686-w64-mingw32-g++ \ -DCMAKE_SYSTEM_NAME=Windows \ -DCMAKE_RC_COMPILER=/usr/bin/i686-w64-mingw32-windres \ -DCROSS_TOOLCHAIN_FLAGS_NATIVE=-DCMAKE_TOOLCHAIN_FILE=/path/to/NATIVE.cmake If that helps, we should probably figure out a more general way to pass in or find the native toolchain - it's kind of haphazard right now. Finally, if you need a workaround to get things going you can probably configure and build tablegen in another build directory (just run cmake like you're building for the host and build the llvm-tblgen target). This can then be passed in with -DLLVM_NATIVE_BUILD=/path/to/builddir and the cross build *should* pick up the tablegen from there.> Is this a configuration anyone else has gotten working with cmake? > Thanks, > Tony > > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
via llvm-dev
2016-Feb-11 20:51 UTC
[llvm-dev] Guidance on cross compiling LLVM with mingw-w64 and cmake
> -DCROSS_TOOLCHAIN_FLAGS_NATIVE=-DCMAKE_TOOLCHAIN_FILE=/path/to/NATIVE.cmakeBrilliant. That worked, and was apparently all I was missing. I could have sworn I tried something like this, but apparently not. For completeness, my NATIVE.cmake toolchain file is just: set(CMAKE_C_COMPILER cc) set(CMAKE_CXX_COMPILER c++) Thanks Justin! On Thu, Feb 11, 2016 at 11:55 AM -0800, "Justin Bogner" <mail at justinbogner.com> wrote: Tony Kelman via llvm-dev <llvm-dev at lists.llvm.org> writes:> I need to build libLLVM (individual static libraries are fine at the > moment) using mingw-w64 cross compilers, i686-w64-mingw32-gcc and > (separately) x86_64-w64-mingw32-gcc. I'd like this to work from both > Linux and Cygwin build environments. With autotools, this worked fine: > ../configure --host=i686-w64-mingw32 and that's it (with mingw32-gcc-c++ > installed on Fedora 23, also works fine on Ubuntu, Cygwin, etc). > I'm trying to recreate this with cmake so we don't get stuck on 3.8 > indefinitely. Here's what I've got so far: > > cmake .. -DCMAKE_C_COMPILER=/usr/bin/i686-w64-mingw32-gcc \ > -DCMAKE_CXX_COMPILER=/usr/bin/i686-w64-mingw32-g++ \ > -DCMAKE_SYSTEM_NAME=Windows \ > -DCMAKE_RC_COMPILER=/usr/bin/i686-w64-mingw32-windres > # (some older versions of cmake have issues if you don't > # specify an absolute path to windres) > > When this gets to "Configuring NATIVE targets" it calls cmake again > trying to use the same mingw compilers, but without CMAKE_SYSTEM_NAME > set so it doesn't succeed in configuring. During the build I then get > a "No rule to make target 'LLVMSupport'. Stop." Full build log is at > http://sprunge.us/bCUU > > I'd like to go with the default behavior of building a native version > of TableGen, but the way that's currently set up in cmake isn't working > here. I'm looking at cmake/modules/CrossCompile.cmake (and I think > "toochain" on the first line is a typo?) and trying to figure out how > to make its call to execute_process(COMMAND ${CMAKE_COMMAND} ...) not > inherit the top-level settings for CMAKE_C_COMPILER etc from the cross > build. Any ideas? I've tried moving my mingw settings from the command > line to a toolchain file but that hasn't done anything different so far. > I've also tried specifically creating a native toolchain file and > tweaking the call to llvm_create_cross_target_internal at the end of > CrossCompile.cmake to use it, but that hasn't worked either - keeps giving > Could not find toolchain file: "/home/llvm/cmake/platforms/NATIVE.cmake"Looks like the (unreachable due to the toochain typo) cmake code to set the native toolchain file is buggy - it's failing to find the file because it thinks the quotes are part of the file name. This: set(CROSS_TOOLCHAIN_FLAGS_${target_name} -DCMAKE_TOOLCHAIN_FILE=\"${LLVM_MAIN_SRC_DIR}/cmake/platforms/${toolchain}.cmake\" should probably say this: set(CROSS_TOOLCHAIN_FLAGS_${target_name} -DCMAKE_TOOLCHAIN_FILE=${LLVM_MAIN_SRC_DIR}/cmake/platforms/${toolchain}.cmake You could probably also try out your native toolchain file without changing CrossCompile.cmake by setting CROSS_TOOLCHAIN_FLAGS_NATIVE on your cmake command line: cmake .. -DCMAKE_C_COMPILER=/usr/bin/i686-w64-mingw32-gcc \ -DCMAKE_CXX_COMPILER=/usr/bin/i686-w64-mingw32-g++ \ -DCMAKE_SYSTEM_NAME=Windows \ -DCMAKE_RC_COMPILER=/usr/bin/i686-w64-mingw32-windres \ -DCROSS_TOOLCHAIN_FLAGS_NATIVE=-DCMAKE_TOOLCHAIN_FILE=/path/to/NATIVE.cmake If that helps, we should probably figure out a more general way to pass in or find the native toolchain - it's kind of haphazard right now. Finally, if you need a workaround to get things going you can probably configure and build tablegen in another build directory (just run cmake like you're building for the host and build the llvm-tblgen target). This can then be passed in with -DLLVM_NATIVE_BUILD=/path/to/builddir and the cross build *should* pick up the tablegen from there.> Is this a configuration anyone else has gotten working with cmake? > Thanks, > Tony > > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160211/319556e8/attachment.html>