]> code.delx.au - refind/blob - BUILDING.txt
Improved TianoCore build procedure; can now build both x86-64 and x86
[refind] / BUILDING.txt
1 From rEFIt to rEFInd
2 ====================
3
4 rEFInd is derived from rEFIt (http://refit.sourceforge.net), but the two
5 programs support different build environments. rEFIt was created with
6 Intel's EFI Application Toolkit
7 (http://www.intel.com/technology/efi/toolkit_overview.htm) or TianoCore's
8 EFI Toolkit (https://efi-toolkit.tianocore.org), along with Microsoft's
9 Visual C compiler.
10
11 Compiling the source code provided on the rEFIt site under Linux never
12 worked for me, although the documentation claimed it would. Apparently
13 other Linux developers have run into the same problem; Debian provides a
14 rEFIt package (http://packages.debian.org/sid/refit) that includes
15 extensive patches to enable the program to compile under Linux using the
16 GNU-EFI package (http://sourceforge.net/projects/gnu-efi/). Although
17 GNU-EFI is less sophisticated than recent versions of TianoCore's toolkit,
18 GNU-EFI is my preferred environment because it's provided with many Linux
19 distributions and it was easy to get started with rEFInd development by
20 using GNU-EFI and the Debian rEFIt package as a starting point.
21
22 Over time, though, I've found that the recent TianoCore EDK2 toolkit has
23 its advantages. Two features, in particular, require the TianoCore EDK2
24 toolkit:
25
26 - The EFI filesystem drivers, added with rEFInd 0.4.0. This requirement is
27 a consequence of the derivation of the drivers, which is via VirtualBox
28 and the Clover boot loader, both of which are based on EDK2.
29
30 - The legacy BIOS boot feature for UEFI-based PCs. EDK2 is needed in this
31 case because of features unique to that environment. Note that the legacy
32 BIOS boot feature for Macs works when rEFInd is built via either GNU-EFI
33 or the TianoCore EDK2.
34
35 For these reasons, effective with rEFInd 0.4.6, I've switched the primary
36 build environment from GNU-EFI to TianoCore EDK2. The rEFInd binary itself
37 still builds via GNU-EFI, but you must pass the "gnuefi" build target to
38 make in order to build in this way, and the resulting binary can't boot
39 BIOS-based OSes on UEFI PCs.
40
41 I've dropped ancillary programs, such as the gptsync program, from rEFInd.
42 You can still use these tools with rEFInd, but you'll need to install them
43 separately.
44
45
46 Requirements
47 ============
48
49 To compile rEFInd, you'll need the following:
50
51 * A Linux installation. Note that this installation does NOT need to be
52 EFI-based. It can be 32- or 64-bit, but unless you use a cross-compiler
53 (which I've not tested), it must be the appropriate bit width for your
54 EFI implementation. (Normally that means 64-bit.) If you don't normally
55 run Linux, you can run it in a VirtualBox or similar virtual machine. (I
56 describe some unsupported non-Linux build options shortly.)
57
58 * A standard set of Linux development tools, based on GCC.
59
60 * One of the following:
61
62 * The TianoCore EDK2 package
63 (http://sourceforge.net/projects/tianocore/). I've tested using the
64 UDK2010.SR1 and UDK2010.SR1.UP1 variants
65 (http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=UDK2010),
66 which are "frozen," rather than the main EDK2 development branch, which
67 is changing as the developers add features, fix bugs, and so on. Using
68 TianoCore EDK2 is supported in rEFInd version 0.4.3 and later (0.4.0
69 and later for the filesystem drivers only). See below for TianoCore
70 setup instructions.
71
72 * The GNU-EFI package (http://sourceforge.net/projects/gnu-efi/). You can
73 install this from a package called "gnu-efi"; however, rEFInd relies on
74 features that were added in (I think) 3.0l to provide driver-loading
75 capabilities. The versions I've used and that work are 3.0p and 3.0q.
76 As of 5/2012, most Linux distributions seem to deliver rather elderly
77 versions of GNU-EFI, so you may need to download the latest source
78 code, compile it, and install it locally. Since rEFInd version 0.2.7,
79 the Makefiles assume this (see below). The legacy BIOS boot support on
80 UEFI-based PCs doesn't work when GNU-EFI is compiled under GNU-EFI, so
81 as of rEFInd 0.4.6, GNU-EFI is no longer the primary build environment,
82 although it's easier to set up on a Linux system.
83
84 It's possible to use a non-Linux platform to compile rEFInd. To the best of
85 my knowledge, the rEFInd code doesn't rely on anything Linux-specific in
86 its build requirements, and GNU-EFI's Sourceforge page indicates that it
87 works under Windows and OS X, too; however, my one attempt to compile
88 GNU-EFI under OS X failed. I've received one report that rEFInd compiles
89 successfully with Clang and the TianoCore toolkit under OS X by adding the
90 refind.inf file to a .dsc file that you use for your own projects. You can
91 find brief instructions here (note that this is not my documentation):
92
93 https://github.com/snarez/refind-edk2
94
95 Under Windows, you would need to either create a project or Makefile for
96 your non-GCC compiler or use a GCC port, such as MinGW
97 (http://www.mingw.org). You'd probably need to adjust the Makefiles in the
98 latter case. A procedure similar to that used under OS X might work using
99 GCC or Microsoft's C compiler, but I haven't tested this.
100
101
102 Preparing Your Development Kit
103 ==============================
104
105 If you want to build the rEFInd binary but not the drivers, if you don't
106 care about booting BIOS-based OSes on UEFI PCs, and if you're using Linux,
107 GNU-EFI is the easiest way to do the job. I don't describe its setup here
108 because it's likely to be fairly easy. If your distribution provides a
109 recent enough version, you should be able to install a package called
110 gnu-efi and be done with it. If not, you'll need to download the source
111 code tarball, build it, and install it. This process is fairly typical of
112 Linux packages. Read the GNU-EFI documentation if you need help. If you're
113 using GNU-EFI, you can skip the rest of this section.
114
115 To build the EFI drivers, or if you want support for booting BIOS-based
116 OSes on UEFI PCs, the TianoCore toolkit is required. You might also want to
117 use it if you have problems with GNU-EFI or if you want to build rEFInd on
118 a non-Linux platform. Unfortunately, the TianoCore toolkit is weird by
119 Linux programming standards. It's also quite large -- it's intended as a
120 means to develop a complete EFI firmware implementation, so it contains
121 much more code than is needed to develop standalone EFI applications. I
122 don't know of any Linux distribution packages for it in RPM, Debian package
123 file, or other formats; you MUST install the kit from source code using its
124 own unusual compilation procedure. The installation documentation also
125 omits at least one step and is a bit unclear about others. Here's how I
126 installed the toolkit:
127
128 1) Download UDK2010.SR1.UP1 from
129 https://sourceforge.net/apps/mediawiki/tianocore/index.php?title=UDK2010.
130
131 2) Type "mkdir /usr/local/UDK2010". You can use another directory, but the
132 Makefile for rEFInd's EFI drivers assumes this location. You'll need to
133 edit the EDK2BASE line in the Make.common file if you install somewhere
134 else.
135
136 3) Type "cd /usr/local/UDK2010".
137
138 3) Unzip the downloaded file (UDK2010.SR1.UP1.Complete.MyWorkSpace.zip) in
139 the current directory (/usr/local/UDK2010). This creates a handful of
140 files, including a tarball and a couple of .zip files.
141
142 4) Type "unzip UDK2010.SR1.UP1.MyWorkSpace.zip". This extracts the
143 platform-neutral portion of the development kit.
144
145 5) Type "cd MyWorkSpace".
146
147 6) Type "tar xvf ../BaseTools\(Unix\).tar". This extracts the
148 Linux/Unix-specific portions of the toolkit.
149
150 7) Follow the build instructions at
151 https://sourceforge.net/apps/mediawiki/tianocore/index.php?title=Using_EDK_II_with_Native_GCC_4.4;
152 however, a few changes are required, as detailed below....
153
154 8) Type "source edksetup.sh BaseTools". This sets up some environment
155 variables, so subsequent steps (NOT including compiling the rEFInd EFI
156 drivers) must be typed in the shell you use for this step.
157
158 9) Edit Conf/target.txt and change the following:
159 - ACTIVE_PLATFORM = MdePkg/MdePkg.dsc
160 - TARGET = RELEASE (DEBUG might work, but I've not tested it).
161 - TARGET_ARCH = X64 (on x86-64; leave this as IA32 on x86). If you plan
162 to build both architectures, you can set this to "IA32 X64".
163 - TOOL_CHAIN_TAG = GCC46 (or other value depending on your GCC version;
164 type "gcc -v" to learn your GCC version number). Note that GCC 4.7
165 doesn't have its own entry, so use GCC46 for GCC 4.7.
166 The TianoCore Makefiles read some of these variables from this file
167 and use them when accessing directories, so be sure to type these
168 entries in the case specified.
169
170 10) The documentation refers to editing Conf/tools_def.txt in addition to
171 Conf/target.txt, but doesn't specify what to change in
172 Conf/tools_def.txt. I haven't found it necessary to make any changes in
173 Conf/tools_def.txt EXCEPT when using GCC 4.7 on a Fedora 17 system.
174 (I haven't used GCC 4.7 on other platforms, so this may well be
175 necessary on other systems, too.) With that setup, I found it
176 necessary to change the following line:
177 *_GCC46_X64_ASM_FLAGS = DEF(GCC46_ASM_FLAGS) -m64 -melf_x86_64
178 to:
179 *_GCC46_X64_ASM_FLAGS = DEF(GCC46_ASM_FLAGS) -m64
180
181 11) Type "make -C /usr/local/UDK2010/MyWorkSpace/BaseTools/Source/C".
182 (This step is not documented on the EDK Web page.) Note that this
183 requires the g++ compiler and UUID development libraries.
184
185 10) Type "build" to build the main set of EDK2 files. This process is
186 likely to take a few minutes.
187
188 If you installed in a location other than the one I've specified, you must
189 edit the EDK2BASE variable in the Make.tiano and filesystems/Make.tiano
190 files in the rEFInd source package. Once the toolkit is installed, you can
191 build the filesystem drivers or rEFInd, as described below.
192
193
194 Compiling rEFInd
195 ================
196
197 With your development system set up, you can compile rEFInd as follows:
198
199 1) Download and uncompress the rEFInd source code archive. (If you're
200 reading this file, you've probably already done this task.)
201
202 2) Open a Linux shell prompt
203
204 3) Change into the archive's main directory. You should see several files
205 including this BUILDING.txt file and several subdirectories such as
206 "refind", "libeg", and "include".
207
208 4) Type "make gnuefi" to build with GNU-EFI, or either "make" alone or
209 "make tiano" to build with TianoCore EDK2. With any luck, rEFInd will
210 compile without error, leaving the "refind_ia32.efi" or "refind_x64.efi"
211 file, depending on your platform, in the "refind" subdirectory. If you
212 want to build IA32 binaries on an x86-64 (X64) system, type "ARCH=ia32
213 make". This works only if you're using the TianoCore build kit, and only
214 if you set TARGET_ARCH to either "IA32" or "IA32 X64" in target.txt when
215 you set up the TianoCore.
216
217 5) The default build process does NOT build the filesystem drivers. If you
218 want to build them, you must type "make fs" in the main rEFInd source
219 directory. The result is filesystem drivers in the filesystems
220 subdirectory, and also copies placed in the drivers subdirectory. You
221 must install the TianoCore EDK2 to build the drivers.
222
223 If rEFInd doesn't compile correctly, you'll need to track down the source
224 of the problem. Double-check that you've got all the necessary development
225 tools installed, including GCC, make, and either GNU-EFI or TianoCore EDK2.
226 You may also need to adjust the Makefile, Make.common file, or Make.tiano
227 file for your system. (The main Makefile controls the process for both
228 toolkits, while Make.common holds GNU-EFI options and Make.tiano holds
229 TianoCore options.) The most likely thing you'll need to change is the path
230 to the various GNU-EFI include files and libraries. Since rEFInd 0.2.7, the
231 default Make.common file includes the following definitions:
232
233 EFIINC = /usr/local/include/efi
234 GNUEFILIB = /usr/local/lib
235 EFILIB = /usr/local/lib
236 EFICRT0 = /usr/local/lib
237
238 If you've installed GNU-EFI from a distribution's package, you may need to
239 remove "local" from those paths, and perhaps change references to "lib" to
240 "lib64". As noted earlier, though, as of 5/2012, most distributions provide
241 out-of-date GNU-EFI implementations that will not work with rEFInd 0.2.7
242 and later.
243
244 If you're using TianoCore's EDK2, as noted earlier, you may need to adjust
245 the EDK2BASE variable in Make.tiano and filesystems/Make.tiano.
246
247 When I tried to compile rEFInd under Ubuntu 12.04 (i386) using GNU-EFI,
248 even with a locally-compiled GNU-EFI 3.0p or 3.0q, I got errors like this:
249
250 main.o: In function `StartLegacy.isra.0':
251 main.c:(.text+0x8b1): undefined reference to `__stack_chk_fail_local'
252 lib.o: In function `ScanVolumeBootcode.part.3':
253 lib.c:(.text+0xf2f): undefined reference to `__stack_chk_fail_local'
254 lib.o: In function `ScanExtendedPartition.isra.4':
255
256 The solution was to recompile GNU-EFI with the -fno-stack-protector GCC
257 flag. In GNU-EFI, this can be added to the CFLAGS line in Make.defaults.
258
259
260 Installing rEFInd
261 =================
262
263 With rEFInd compiled, you can install it. The easiest way to do this is
264 with the install.sh script, which works on both Linux and Mac OS X.
265 Alternatively, you can type "make install" to install using this script.
266 Note that this installation copies files to the ESP and uses "efibootmgr"
267 (on Linux) or "bless" (on OS X) to add rEFInd to the firmware's boot loader
268 list. The docs/refind/installing.html file provides more details on this
269 script and its use.
270
271 If install.sh doesn't work for you or if you prefer to do the job manually,
272 you may. On a UEFI-based system, you'll want to copy files on the ESP as
273 follows:
274
275 * Create a directory for rEFInd, such as EFI/refind.
276 * Copy refind/refind_ia32.efi or refind_x64.efi to the ESP's EFI/refind
277 directory.
278 * Copy refind.conf-sample to the EFI/refind directory as refind.conf.
279 * Copy the icons subdirectory, including all its files, to EFI/refind.
280
281 You'll then need to activate rEFInd in your EFI. This can be done with
282 tools such as "efibootmgr" under Linux or "bless" under OS X. See the
283 docs/refind/installing.html file for details.
284
285
286 Note to Distribution Maintainers
287 ================================
288
289 The install.sh script, and therefore the "install" target in the Makefile,
290 installs the program directly to the ESP and it modifies the *CURRENT
291 COMPUTER's* NVRAM. Thus, you should *NOT* use this target as part of the
292 build process for your binary packages (RPMs, Debian packages, etc.).
293 (Gentoo could use it in an ebuild, though....) You COULD, however, install
294 the files to a directory somewhere (/usr/share/refind or whatever) and then
295 call install.sh as part of the binary package installation process. Placing
296 the files directly in /boot/efi/EFI/{distname}/refind and then having a
297 post-install script call efibootmgr is probably the better way to go,
298 but this assumes that the ESP is mounted at /boot/efi.
299
300
301 Compiling the EFI Filesystem Drivers
302 ====================================
303
304 To build all the drivers, you can type "make fs" from the main directory,
305 which builds the drivers and places copies in both the filesystems and
306 drivers subdirectories. If you want to build just one driver, you can
307 change into the "filesystems" directory and type "make {fsname}", where
308 {fsname} is a filesystem name -- "ext2", "reiserfs", "iso9660", or "hfs".
309
310 To install drivers, you can type "make install" in the "filesystems"
311 directory. This copies all the drivers to the
312 "/boot/efi/EFI/refind/drivers" directory. Alternatively, you can copy the
313 files you want manually.
314
315 *CAUTION:* Install drivers for your system's architecture *ONLY*.
316 Installing drivers for the wrong architecture causes some systems to hang
317 at boot time.
318
319 The drivers all rely on filesystem wrapper code created by rEFIt's author,
320 Christoph Phisterer. Most of the drivers seem to have passed through
321 Oracle's VirtualBox project (https://www.virtualbox.org) and the Clover
322 boot loader project (https://sourceforge.net/projects/cloverefiboot/),
323 which I used as the source for this build.