Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.Sign up
MXE a great project to build the dependent libraries used by Shoes and other FOSS projects for Windows cross compiling. That build process has always been painful with Shoes. MXE can ease that pain and it enables some interesting options for the future. MXE runs on Linux and OSX. It's not tied to any particular Linux or package manager.
Of course, MXE has its own set of rules but we get benefits from those rules by giving up some our notions of what is correct. One gain to be explored in the future is cross building Shoes/Windows on OSX as well as Linux. It could be just as simple as the linux steps below - Simpler if we do some MXE work.
cd to where you want things. For me, it's a ~/Projects/shoesdeps which is a nfs export and a samba mount.
git clone https://github.com/mxe/mxe.git cd mxe
We want to default to just building 32 bit shared libraries - because that's what Shoes on Windows uses. Edit the settings.mk file and add the MXE_TARGETS setting. Mine looks like
# This variable controls the targets that will build. #MXE_TARGETS := i686-w64-mingw32.static i686-w64-mingw32.shared x86_64-w64-mingw32.static x86_64-w64-mingw32.shared MXE_TARGETS := i686-w64-mingw32.shared
Now build one of the some smallish dependencies used by Ruby - zlib and then we can poke around to see what's where.:
ccoupe@bronco:~/Projects/shoesdeps/mxe$ make zlib
The very first build of any MXE package is going to build the gcc cross compilers and that takes time. (10 to 30 minutes). Notice that it builds zlib for both the i686-w64-mingw32.shared arch and the build machine, x86_64-pc-linux-gnu, Lets find the dll.
find . -name 'zlib*' ./usr/i686-w64-mingw32.shared/bin/zlib1.dll ./usr/i686-w64-mingw32.shared/include/zlib.h ./usr/i686-w64-mingw32.shared/installed/zlib ./usr/i686-w64-mingw32.shared/lib/pkgconfig/zlib.pc ....
There it is: the dll, the .h and the .pc ! And log files and patches and source tar balls. Celebrate!
Now would be a good to fix up .bash_rc (or .bash_profile or ..) to put the MXE compilers in the PATH environmental variable as mentioned in the MXE instructions.
When you cloned Shoes from github you got a plugin-mxe subdirectory. It contains the mxe formulas for gdbm, openssl-1.0.2, yaml and ruby. Remember where that plugin-mxe directory is. We need to do one other thing to improve life and tell settings.mk about our plugin directory. Edit settings.mk and add a line:
# This variable controls which plugins are in use. # See plugins/README.md for further information. #override MXE_PLUGIN_DIRS += plugins/apps plugins/native override MXE_PLUGIN_DIRS += plugins/native /home/ccoupe/Projects/shoes3/plugin-mxe
Of course your location will be different.
OSX Note 1: Gettext locations can get confused between Apples version and Homebrew's version. Set the path before you build anything using gettext. In our case we need it in order to build some of the shoes deps. Sigh.
OSX Note 2: If you are using homebrew it may have installed the very latest automake/conf/tools and it may be too new for some packages (gdbm for one). The fine folks at MXE actually have an older version you can build an use inside mxe. After the above edit for MXE_PLUGIN_DIRS do
make autoconf make automake
Now it's going to get simple. Watch:
and watch the terminal. Thats it. You can install the packages individually if you like:
make bzip2 make libffi make gtk3 make librsvg make sqlite make giflib make MXE_PLUGIN_DIRS=~/Projects/shoes3/plugin-mxe openssl1.0 make MXE_PLUGIN_DIRS=~/Projects/shoes3/plugin-mxe yaml make MXE_PLUGIN_DIRS=~/Projects/shoes3/plugin-mxe gdbm make MXE_PLUGIN_DIRS=~/Projects/shoes3/plugin-mxe ruby make nsis
The Ruby build is pretty quiet for many minutes as is the gtk3 and nsis builds. In fact, all the package builds take time. Believe me, you'll get error messages if something fails. What to do if there is an error: There are log files for the download phase and the build phase in the mxe log/ directory.
Download errors can be checksums that don't match AND/OR use the wrong url. See the log file. You can delete the downloaded file in pkg/ if you need to try it again.
Build errors are harder to debug. The log file has a lot of build information to help. You may have to remove artifacts to trigger a rebuild. for example, if you want to rebuild gdbm after you changed the gdbm.mk file:
ccoupe@bronco:~/Projects/shoesdeps/mxe$ rm usr/i686-w64-mingw32.shared/installed/gdbm ccoupe@bronco:~/Projects/shoesdeps/mxe$ make MXE_PLUGIN_DIRS=~/Projects/shoes3/plugin-mxe gdbm [plugin] /home/ccoupe/Projects/shoes3/plugin-mxe/ [build] gdbm i686-w64-mingw32.shared [done] gdbm i686-w64-mingw32.shared 12220 KiB 0m15.360s
If you run into trouble building pango: There may be conflicting options on versions and patches. The plugin's pango.mk says 1.40.14 but there may be a pango.mk in mxe/src. Remove the one in src and the pango patch file in mxe/src and then do
make shoesdeps to continue.
You need a mxe-custom.yaml file to tell Shoes where the dependencies are and what gems you want. Mine looks like:
Deps: /home/ccoupe/Projects/shoesdeps/mxe/usr/i686-w64-mingw32.shared Ruby: /home/ccoupe/Projects/shoesdeps/mxe/usr/i686-w64-mingw32.shared Gemloc: /home/ccoupe/Projects/gems/rb23 InclGems: - chipmunk* - sqlite3* - nokogiri* - mini_portile2* - byebug* - rb-readline* - win32-shortcut* - ffi* # picky needs: - activesupport* - concurrent-ruby* - i18n* - multi_json* - picky* - rack_fast_escape* - thread_safe* - tzinfo* - url_escape* - yajl-ruby* # typhoeus - ethon* - typhoeus* # because #- bloopsaphone-0.4 MS-Theme: true Debug: true Deprecations: true Installer: nsis InstallerLoc: /home/ccoupe/Projects/nsis/nsis3/bin/makensis
The Shoes target, 'mxe' uses the mxe cross compiler to build Shoes for Windows. Note: there is an mxe_osx target for OSX which does the same thing (given an mxe_osx-custom.yaml)
rake linux:setup:mxe rake
rake osx:setup:mxe_osx rake
shoes.exe and cshoes.exe are in the mxe directory.
This is clever. MXE is very clever. In the mxe directory,
make nsis builds the native Linux (makensis) and the big bad makensis.exe. We can use the linux or osx version by changing our InstallerLoc: setting in the mxe-custom.yaml. Mine looks like
rake package will trundle off and create a Shoes installer, which only runs on Windows of course.