+ EFI-based. It can use IA32 (aka x86, i386, or other things), X64 (aka
+ x86-64, AMD64, or EM64T), or AA64 (aka AARCH64 or ARM64), but unless you
+ use a cross-compiler, it must use the same CPU type and bit depth as your
+ EFI implementation. (Normally that means 64-bit X64.) If you don't
+ normally run Linux, you can run it in a VirtualBox or similar virtual
+ machine. (I describe some unsupported non-Linux build options shortly.)
+
+* A standard set of Linux development tools, based on GCC. (I've tried
+ using clang 3.4 under Ubuntu, with partial success. The main rEFInd
+ binary, gptsync, and some drivers compile successfully; but only gptsync
+ runs normally. The drivers I've tried and the main rEFInd binary crash.)
+
+* One of the following:
+
+ * The TianoCore EDK2 package
+ (http://sourceforge.net/projects/tianocore/). I initially used the
+ UDK2010 package and others in that series, but beginning with rEFInd
+ 0.8.2, I've been using UDK2014
+ (http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=UDK2014).
+ All of the UDK are "frozen," rather than the main EDK2 development
+ branch, which is changing as the developers add features, fix bugs, and
+ so on. See below for TianoCore setup instructions.
+
+ * The GNU-EFI package (http://sourceforge.net/projects/gnu-efi/). You can
+ install this from a package called "gnu-efi"; however, rEFInd relies on
+ features that were added sometime between version 3.0s and 3.0u, so I
+ recommend using 3.0u (or conceivably later). You should check your
+ GNU-EFI version number; you may need to download the latest source
+ code, compile it, and install it locally. The Makefiles assume a
+ GNU-EFI package installed via a package manager. If you install from
+ source code, you may need to adjust those Makefiles' paths.
+
+Of the two toolkits, I prefer to use TianoCore because it produces binaries
+that are about 5-30KiB smaller than those made by GNU-EFI, and I can easily
+build 32-bit binaries on my 64-bit Linux installations. Also, I've had
+problems on a 32-bit Mac Mini with the drivers produced by GNU-EFI hanging
+the system. (I haven't encountered this problem on UEFI-based PCs.) That
+said, the TianoCore EDK2 package is much harder to install, so you may
+prefer to use GNU-EFI unless you have a specific need for the TianoCore
+toolkit. Automated build tools like the OpenSUSE Build Service (OBS) and
+the Ubuntu Personal Package Archive (PPA) mechanism don't yet support
+TianoCore.
+
+It's possible to use a non-Linux platform to compile rEFInd. To the best of
+my knowledge, the rEFInd code doesn't rely on anything Linux-specific in
+its build requirements, and GNU-EFI's Sourceforge page indicates that it
+works under Windows and OS X, too; however, my one attempt to compile
+GNU-EFI under OS X failed. I've received one report that rEFInd compiles
+successfully with Clang and the TianoCore toolkit under OS X by adding the
+refind.inf file to a .dsc file that you use for your own projects. You can
+find brief instructions here (note that this is not my documentation):
+
+https://github.com/snarez/refind-edk2
+
+Under Windows, you would need to either create a project or Makefile for
+your non-GCC compiler or use a GCC port, such as MinGW
+(http://www.mingw.org). You'd probably need to adjust the Makefiles in the
+latter case. A procedure similar to that used under OS X might work using
+GCC or Microsoft's C compiler, but I haven't tested this.
+
+
+Preparing Your Development Kit
+==============================
+
+If you're using Linux, GNU-EFI is the easiest way to compile rEFInd. I
+don't describe GNU-EFI's setup here because it's likely to be fairly easy.
+If your distribution provides a recent enough version, you should be able
+to install a package called gnu-efi and be done with it. If not, you'll
+need to download the source code tarball, build it, and install it. This
+process is fairly typical of Linux packages. Read the GNU-EFI documentation
+if you need help. If you're using GNU-EFI, you can skip the rest of this
+section.
+
+You might want to use the TianoCore toolkit if you have problems with
+GNU-EFI or if you want to build rEFInd on a non-Linux platform.
+Unfortunately, the TianoCore toolkit is weird by Linux programming
+standards. It's also quite large -- it's intended as a means to develop a
+complete EFI firmware implementation, so it contains much more code than is
+needed to develop standalone EFI applications. I don't know of any Linux
+distribution packages for it in RPM, Debian package file, or other formats;
+you MUST install the kit from source code using its own unusual compilation
+procedure. The installation documentation also omits at least one step and
+is a bit unclear about others. Here's how I installed the toolkit:
+
+1) Download UDK2014.SR1.UP1.P1 from
+ https://sourceforge.net/apps/mediawiki/tianocore/index.php?title=UDK2014.
+ Note that UDK2015 is now available, but I have not yet adapted rEFInd to
+ build with it. (UDK2015 has made changes that require matching changes
+ to rEFInd.)
+
+2) Type "mkdir /usr/local/UDK2014". You can use another directory, but the
+ rEFInd Makefile assumes this location. You'll need to edit the EDK2BASE
+ variable in the top-level Makefile if you install somewhere else.
+
+3) Type "cd /usr/local/UDK2014".
+
+4) Unzip the downloaded file (UDK2014.SR1.UP1.P1.Complete.MyWorkSpace.zip)
+ in the current directory (/usr/local/UDK2014). This creates a handful of
+ files, including a tarball and a couple of .zip files.
+
+5) Type "unzip UDK2014.SR1.UP1.MyWorkSpace.zip". This extracts the
+ platform-neutral portion of the development kit.
+
+6) Type "cd MyWorkSpace".
+
+7) Type "tar xvf ../BaseTools\(Unix\).tar". This extracts the
+ Linux/Unix-specific portions of the toolkit.
+
+8) Follow the build instructions at
+ https://sourceforge.net/apps/mediawiki/tianocore/index.php?title=Using_EDK_II_with_Native_GCC_4.4;
+ however, a few changes are required, as detailed below....
+
+9) Type "source edksetup.sh BaseTools". This sets up some environment
+ variables, so subsequent steps (NOT including compiling rEFInd or its
+ drivers) must be typed in the shell you use for this step.
+
+10) Edit Conf/target.txt and change the following:
+ - ACTIVE_PLATFORM = MdePkg/MdePkg.dsc
+ - TARGET = RELEASE (DEBUG might work, but I've not tested it).
+ - TARGET_ARCH = X64 (on x86-64; leave this as IA32 on x86 or change it
+ to AARCH64 on ARM64). If you plan to build multiple architectures,
+ you can set this to "IA32 X64" or some other combination.
+ - TOOL_CHAIN_TAG = GCC48 (or other value depending on your GCC version;
+ type "gcc -v" to learn your GCC version number). Note that support
+ for the latest GCC version takes a while to make it into the
+ TianoCore toolkit, so if you're using a very recent GCC, you may need
+ to specify an earlier version and hope for the best or modify
+ Conf/target.txt, as described shortly.
+ The TianoCore Makefiles read some of these variables from this file
+ and use them when accessing directories, so be sure to type these
+ entries in the case specified.
+
+11) The documentation refers to editing Conf/tools_def.txt in addition to
+ Conf/target.txt, but doesn't specify what to change in
+ Conf/tools_def.txt. I haven't found it necessary to make any changes in
+ Conf/tools_def.txt EXCEPT when using GCC 4.7 on a Fedora 17 system with
+ the original UDK2014. With this setup, GCC 4.7 was newer than the most
+ recent GCC that TianoCore supported at that time. With that setup, I
+ found it necessary to change the following line:
+ *_GCC46_X64_ASM_FLAGS = DEF(GCC46_ASM_FLAGS) -m64 -melf_x86_64
+ to:
+ *_GCC46_X64_ASM_FLAGS = DEF(GCC46_ASM_FLAGS) -m64
+ Something similar may be necessary if you're using a very recent
+ GCC or some other compiler.
+
+12) Type "make -C /usr/local/UDK2014/MyWorkSpace/BaseTools/Source/C".
+ (This step is not documented on the EDK Web page.) Note that this
+ requires the g++ compiler and UUID development libraries.
+
+13) Type "build" to build the main set of EDK2 files. This process is
+ likely to take a few minutes. This step requires Python 2; if you have
+ Python 3 installed, you may need to adjust the default python for this
+ build (for instance, by typing "eselect python set python2.7" in
+ Gentoo).
+
+If you installed in a location other than the one I've specified, you must
+edit the EDK2BASE variable in the top-level Makefile in the rEFInd source
+package. Once the toolkit is installed, you can build the filesystem
+drivers or rEFInd, as described below.