Emacs is the closest thing to an Operating System that a simple text editor should ever be allowed to come, if we’re to maintain our sanity. It’s also my favorite IDE.
The easiest way to get Emacs for iPhone is through my Cydia repository. This will let you install a pre-built, pre-verified Emacs. However, if you want to know how to build it from scratch, read on.
You’ll need an on-iPhone development environment to build Emacs, because it does this freaky thing where it loads a built version of itself, loads a ton of Lisp files, and then dumps itself out. This can’t be done in a simple cross-compiler setup!
As always, you can contact me if you need help.
First, we need to install dependencies and fetch the Emacs sources and the patch file:
iphone:~ mobile$ sudo apt-get install ncurses
iphone:~ mobile$ wget http://ftp.gnu.org/pub/gnu/emacs/emacs-23.2.tar.bz2
iphone:~ mobile$ wget http://gammalevel.com/forever/emacs-23.2-iPad.patch
Next, we extract the sources and patch them:
iphone:~ mobile$ tar xjvf emacs-23.2.tar.bz2
iphone:~ mobile$ cd emacs-23.2
iphone:~/emacs-23.2 mobile$ patch -p1 < ../emacs-23.2-iPad.patch
Now, with the sources fully patched, we can build and install Emacs:
iphone:~/emacs-23.2 mobile$ ./configure
iphone:~/emacs-23.2 mobile$ make
iphone:~/emacs-23.2 mobile$ sudo make install
This compile can take a while on an iPad, and even longer on an iPhone. Go grab some coffee. Congratulations! You now have Emacs!
Here, I’ll actually guide you through editing the files by hand instead of using a patch. I’ve also included why you edit the files this way, in case the patch doesn’t work.
First, we need to tell Emacs that Darwin on ARM makes sense. Open up
configure
, and do a search for the string “*-apple-darwin*
“. This
will help you locate the block that checks machine types for Apple
Darwin systems. Right below the line that says
powerpc-* ) machine=macppc ;;
add a line below it that says:
arm-* ) machine=arm ;;
Also, we need to edit src/unexmacosx.c
. Search for the string
“nothing to do for prebound lazy pointer
“. Underneath this case in
the switch
statement, outside of the #if defined (__ppc__)
/
#endif
block, and before the default case, add in this case:
case GENERIC_RELOC_LOCAL_SECTDIFF:
/* no idea what this is, but we ignore it anyway */
break;
iPhone OS uses a Mach-O executable format section that Emacs doesn’t normally support, so it will yell at us when we try to compile. This fix will tell Emacs to ignore that section instead. I have no idea what this section does, but when it’s ignored, Emacs still runs fine, so it must not be too important.
Now, you can compile as above!