# Cross-compile using MinGW and test using Wine. # # Steps: # # 1. Install MinGW; 64-bit target seems to work best. # # 2. Install Wine. # # 3. Run command: # # wine cmd /c echo "Hello world"' # # This will confirm that Wine works and will trigger standard # Wine setup, which is slow. # # 4. Confirm that drive 'z:' is mapped to your root filesystem. # (This is supposed to be a default but it helps to # double-check.) To confirm, run: # # wine cmd /c dir 'z:\\' # # This should give you a DOS-style equivalent of 'ls /'. If not, # you'll need to fix that with winecfg or by adding a symlink to # '~/.wine/dosdevices'. # # 5. You will likely need to tweak the settings below to work with # your configuration unless it is exactly like one of the platforms # I've tested on (Ubuntu 20.04 or macOS using brew.) # # 6. Run the build command: # # MRUBY_CONFIG=build_config/cross-mingw-winetest.rb rake test # # If all goes well, you should now have Windows executables and a # set of passing tests. # # # Caveats: # # 1. This works by using a helper script that rewrites test output # to make it look *nix-like and then handing it back to the test # cases. Some of the existing tests were (slightly) modified to # make this easier but only for the 'full-core' gembox. Other # gems' bintests may or may not work with the helper script and # may or may not be fixable by extending the script. # # 2. MinGW and Wine are both complex and not very consistent so you # will likely need to do some fiddling to get things to work. # # 3. This script assumes you are running it on a *nix-style OS. # # 4. I recommend building 64-bit targets only. Building a 32-bit # Windows binary with i686-w64-mingw32 seems to work (at least, # it did for me) but the resulting executable failed a number of # unit tests due to small errors in some floating-point # operations. It's unclear if this indicates more serious problems. # MRuby::CrossBuild.new("cross-mingw-winetest") do |conf| conf.toolchain :gcc conf.host_target = "x86_64-w64-mingw32" # Ubuntu 20 conf.cc.command = "#{conf.host_target}-gcc-posix" # macOS+Wine from brew #conf.cc.command = "#{conf.host_target}-gcc" conf.linker.command = conf.cc.command conf.archiver.command = "#{conf.host_target}-gcc-ar" conf.exts.executable = ".exe" # By default, we compile as static as possible to remove runtime # MinGW dependencies; they are probably fixable but it gets # complicated. conf.cc.flags = ['-static'] conf.linker.flags += ['-static'] conf.test_runner do |t| thisdir = File.absolute_path( File.dirname(__FILE__) ) t.command = File.join(thisdir, * %w{ helpers wine_runner.rb}) end conf.gembox "full-core" conf.enable_bintest conf.enable_test end