Some days ago, I gave a brief write-up on how to build the development version of Emacs on Windows under Cygwin. Cygwin is all well and nice, but some prefer the fully native mingw-w64 version, so here’s the howto for that.
The first four steps are identical with the previous recipe, so let’s just skip to 5):
5) Install msys2 by clicking the “Download the installer” link, and then going through the installer.
6) You can now go back to the sofa where you’re no doubt lounging with your Linux laptop (I may just be speaking for myself here), and ssh in:
You can copy and paste the rest of this into your ssh session:
c:\msys64\usr\bin\bash sed -i -E 's/^Match Group administrators|AuthorizedKeysFile __PROGRAMDATA__/#&/' c:/ProgramData/ssh/sshd_config powershell -command "restart-service sshd" pacman -Syu --noconfirm # Will exit, so restart: c:\msys64\usr\bin\bash pacman --noconfirm -Su pacman --noconfirm -S git make autoconf pacman --noconfirm -S --needed base-devel mingw-w64-x86_64-toolchain pacman --noconfirm -S `pacman -Si mingw-w64-i686-emacs | sed -E ':a ; $!N ; s/\n\s+/ / ; ta ; P ; D' | grep Dep | sed 's/^[^:]*://'` MSYSTEM=MINGW64 bash -l git clone https://git.savannah.gnu.org/git/emacs.git cd emacs make -j4 ./src/emacs
Man, that was painful to figure out, because apparently nobody has ever tried to build anything via ssh before, because all the recipes say “and then you start the mingw shell” (C:\msys64\mingw64.exe), which pops up a window on the Window machine, and is therefore useless. But the MSYSTEM=MINGW64 thing seems to work fine? I’m not sure, though — I don’t know nothing from no Windows.
In any case, a different way to start the shell in MINGW mode is:
c:\msys64\usr\bin\env MSYSTEM=MINGW64 c:\msys64\usr\bin\bash
OK, do this in Powershell:
$oldpath = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).path $newpath = "$oldpath;c:\msys64\mingw64\bin" Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $newPath
Now search for “runemacs.exe”, and click it, and then Emacs starts as it should, and you can edit c:\foo.bar. So I guess it worked! It’s a native Emacs.
That’s still a whole bunch of steps… anybody know a shorter recipe? I really can’t believe that pacman is this primitive… no equivalent of “apt build-dep”? All the build dependencies are kept in PKGBUILD scripts instead of a database?
Dude.
But look!
But more importantly, it works via ssh, too:
./src/emacs -nw
Thanks!
Yes, I also think that setting MSYSTEM is the correct way to start a specific shell. You can automate this by putting ‘AcceptEnv MSYSTEM’ into the sshd_config and then use ‘SendEnv MSYSTEM …’ into you local .ssh/config for the system.
And yes, pacman itself is pretty low-level and has no real equivalent for build-dep, you have to use one of the wrappers like makepkg. But if you ever point stuff like this out to Arch people they will vehemently tell you that this the CORRECT way to do this and everything else is STUPID (I did actually switch from Debian to Arch one time, but ruefully returned after two years of rolling release pain, which of course was ENTIRELY MY FAULT).