xref: /haiku/ReadMe.Compiling.md (revision 958bf0977040254afe033b620f08988065a5be0b)
1b87e672aSAugustin CavalierBuilding Haiku
2b87e672aSAugustin Cavalier==========================
3b87e672aSAugustin CavalierThis is a overview into the process of building HAIKU from source.
4b87e672aSAugustin CavalierAn online version is available at <https://haiku-os.org/guides/building/>.
5b87e672aSAugustin Cavalier
6b87e672aSAugustin CavalierOfficial releases of Haiku are at <https://haiku-os.org/get-haiku>.
7b87e672aSAugustin CavalierThe (unstable) nightly builds are available at <https://download.haiku-os.org/>.
8b87e672aSAugustin Cavalier
9b87e672aSAugustin CavalierWe currently support the following platforms:
10b87e672aSAugustin Cavalier * Haiku
11b87e672aSAugustin Cavalier * Linux
12b87e672aSAugustin Cavalier * FreeBSD
13b87e672aSAugustin Cavalier * Mac OS X
14b87e672aSAugustin Cavalier
15b87e672aSAugustin CavalierRequired Software
16b87e672aSAugustin Cavalier----------------------------
17b87e672aSAugustin CavalierTools provided within Haiku's repositories:
18b87e672aSAugustin Cavalier * `jam` (Jam 2.5-haiku-20111222)
19b87e672aSAugustin Cavalier * Haiku's cross-compiler (needed only for non-Haiku platforms)
20b87e672aSAugustin Cavalier
21b87e672aSAugustin CavalierThe tools to compile Haiku will vary, depending on the platform that you are
22b87e672aSAugustin Cavalierusing to build Haiku. When building from Haiku, all of the necessary
23b87e672aSAugustin Cavalierdevelopment tools are included in official releases (e.g. R1 alpha4) and in the
24b87e672aSAugustin Cavaliernightly builds.
25b87e672aSAugustin Cavalier
26b87e672aSAugustin Cavalier * `git`
27b87e672aSAugustin Cavalier * `ssh` (for developers with commit access)
28b87e672aSAugustin Cavalier * `gcc`/`g++` and binutils (`as`, `ld`, etc., required by GCC)
29b87e672aSAugustin Cavalier * (GNU) `make`
30e37802d3SAugustin Cavalier * `bison` (2.4 or better)
31b87e672aSAugustin Cavalier * `flex` and `lex` (usually a mini shell script invoking `flex`)
32b87e672aSAugustin Cavalier * `makeinfo` (part of `texinfo`, only needed for building GCC 4)
33b87e672aSAugustin Cavalier * `autoheader` (part of `autoconf`, needed for building GCC)
34b87e672aSAugustin Cavalier * `automake`
35b87e672aSAugustin Cavalier * `gawk`
36b87e672aSAugustin Cavalier * `nasm`
37b87e672aSAugustin Cavalier * `wget`
38b87e672aSAugustin Cavalier * `[un]zip`
39b87e672aSAugustin Cavalier * `cdrtools` (**not** `genisoimage`!)
40b87e672aSAugustin Cavalier * case-sensitive file system
41b87e672aSAugustin Cavalier
42b87e672aSAugustin CavalierWhether they are installed can be tested by running them in a shell with
43b87e672aSAugustin Cavalierthe `--version` parameter.
44b87e672aSAugustin Cavalier
45b87e672aSAugustin CavalierThe following libraries (and their respective headers) are required:
46b87e672aSAugustin Cavalier * `curl`
47b87e672aSAugustin Cavalier * `zlib`
48b87e672aSAugustin Cavalier
49b87e672aSAugustin Cavalier### Haiku for ARM
50b87e672aSAugustin CavalierIf you want to compile Haiku for ARM, you will also need:
51b87e672aSAugustin Cavalier
52b87e672aSAugustin Cavalier * `mkimage` (<http://www.denx.de/wiki/U-Boot/WebHome>)
53b87e672aSAugustin Cavalier * Mtools (<https://gnu.org/software/mtools/intro.html>)
54b87e672aSAugustin Cavalier
55b87e672aSAugustin Cavalier### On Mac OS X
56b87e672aSAugustin Cavalier
57b87e672aSAugustin CavalierDisk Utility can create a case-sensitive disk image of at least 3 GiB in size.
58b87e672aSAugustin CavalierThe following ports need to be installed:
59b87e672aSAugustin Cavalier * `expat`
60b87e672aSAugustin Cavalier * `gawk`
61b87e672aSAugustin Cavalier * `gettext`
62b87e672aSAugustin Cavalier * `libiconv`
63b87e672aSAugustin Cavalier * `gnuregex`
64b87e672aSAugustin Cavalier * `gsed`
65b87e672aSAugustin Cavalier * `cdrtools`
66b87e672aSAugustin Cavalier * `nasm`
67b87e672aSAugustin Cavalier * `wget`
68b87e672aSAugustin Cavalier * `less`
69b87e672aSAugustin Cavalier * `mpfr`
70b87e672aSAugustin Cavalier * `gmp`
71b87e672aSAugustin Cavalier * `libmpc`
72*958bf097SHumdinger * `bison` (updated to the latest version)
73b87e672aSAugustin Cavalier
74b87e672aSAugustin CavalierMore information about individual distributions of Linux and BSD can be found
75b87e672aSAugustin Cavalierat <https://haiku-os.org/guides/building/pre-reqs>.
76b87e672aSAugustin Cavalier
77b87e672aSAugustin CavalierDownloading Haiku's sources
78b87e672aSAugustin Cavalier--------------------------------------------------
79b87e672aSAugustin CavalierThere are two parts to Haiku's sources &mdash; the code for Haiku itself and a set
80b87e672aSAugustin Cavalierof build tools for compiling Haiku on an operating system other than Haiku.
81b87e672aSAugustin CavalierThe buildtools are needed only for non-Haiku platforms.
82b87e672aSAugustin Cavalier
83b87e672aSAugustin CavalierAnonymous checkout:
84b87e672aSAugustin Cavalier```
85b87e672aSAugustin Cavaliergit clone https://git.haiku-os.org/haiku
86b87e672aSAugustin Cavaliergit clone https://git.haiku-os.org/buildtools
87b87e672aSAugustin Cavalier```
88b87e672aSAugustin Cavalier(You can also use the `git://` protocol, but it is not secure).
89b87e672aSAugustin Cavalier
90b87e672aSAugustin CavalierIf you have commit access:
91b87e672aSAugustin Cavalier```
92b87e672aSAugustin Cavaliergit clone ssh://git.haiku-os.org/haiku
93b87e672aSAugustin Cavaliergit clone ssh://git.haiku-os.org/buildtools
94b87e672aSAugustin Cavalier```
95b87e672aSAugustin Cavalier
96b87e672aSAugustin CavalierBuilding Jam
97b87e672aSAugustin Cavalier-------------------------------------------
98b87e672aSAugustin Cavalier(*This step applies only to non-Haiku platforms.*)
99b87e672aSAugustin Cavalier
100b87e672aSAugustin CavalierChange to the `buildtools` folder and run the following commands to
101b87e672aSAugustin Cavaliergenerate and install `jam`:
102b87e672aSAugustin Cavalier```
103b87e672aSAugustin Cavaliercd buildtools/jam
104b87e672aSAugustin Cavaliermake
105b87e672aSAugustin Cavaliersudo ./jam0 install
106b87e672aSAugustin Cavalier```
107b87e672aSAugustin CavalierOr,  if you don't want to install `jam` systemwide:
108b87e672aSAugustin Cavalier```
109b87e672aSAugustin Cavalier./jam0 -sBINDIR=$HOME/bin install
110b87e672aSAugustin Cavalier```
111b87e672aSAugustin Cavalier
112b87e672aSAugustin CavalierConfiguring the build
113b87e672aSAugustin Cavalier-------------------------------------
114b87e672aSAugustin CavalierThe `configure` script generates a file named `BuildConfig` in the
115b87e672aSAugustin Cavalier`generated/build` directory. As long as `configure` is not modified (!) and the
116b87e672aSAugustin Cavaliercross-compilation tools have not been updated, there is no need to call it again.
117b87e672aSAugustin CavalierFor rebuilding, you only need to invoke `jam` (see below). If you don't
118b87e672aSAugustin Cavalierupdate the source tree very frequently, you may want to execute `configure`
119b87e672aSAugustin Cavalierafter each update just to be on the safe side.
120b87e672aSAugustin Cavalier
121b87e672aSAugustin CavalierDepending on your goal, there are several different ways to configure Haiku.
122b87e672aSAugustin CavalierYou can either call configure from within your Haiku trunk folder. That will
123b87e672aSAugustin Cavalierprepare a folder named 'generated', which will contain the compiled objects.
124b87e672aSAugustin CavalierAnother option is to manually created one or more `generated.*` folders and run
125b87e672aSAugustin Cavalierconfigure from within them. For example, imagine the following directory setup:
126b87e672aSAugustin Cavalier```
127b87e672aSAugustin Cavalierbuildtools-trunk/
128b87e672aSAugustin Cavalierhaiku-trunk/
129b87e672aSAugustin Cavalierhaiku-trunk/generated.x86gcc2
130b87e672aSAugustin Cavalier```
131b87e672aSAugustin Cavalier
132b87e672aSAugustin Cavalier### Configure a GCC 2.95 Hybrid, from a non-Haiku platform
133b87e672aSAugustin Cavalier```bash
134b87e672aSAugustin Cavaliercd haiku-trunk/generated.x86gcc2
135b87e672aSAugustin Cavalier../configure --use-xattr-ref \
136b87e672aSAugustin Cavalier	--build-cross-tools x86_gcc2 ../../buildtools/ \
137b87e672aSAugustin Cavalier	--build-cross-tools x86
138b87e672aSAugustin Cavalier```
139b87e672aSAugustin Cavalier
140b87e672aSAugustin Cavalier### Configure a GCC 2.95 Hybrid, from Haiku
141b87e672aSAugustin Cavalier```
142b87e672aSAugustin Cavaliercd haiku-trunk/generated.x86gcc2
143b87e672aSAugustin Cavalier../configure --target-arch x86_gcc2 --target-arch x86
144b87e672aSAugustin Cavalier```
145b87e672aSAugustin Cavalier
146b87e672aSAugustin CavalierAdditional information about GCC Hybrids can be found on the website,
147b87e672aSAugustin Cavalier<https://haiku-os.org/guides/building/gcc-hybrid>.
148b87e672aSAugustin Cavalier
149b87e672aSAugustin Cavalier### Configure options
150b87e672aSAugustin CavalierThe various runtime options for configure are documented in its onscreen help
151b87e672aSAugustin Cavalier```bash
152b87e672aSAugustin Cavalier./configure --help
153b87e672aSAugustin Cavalier```
154b87e672aSAugustin Cavalier
155b87e672aSAugustin CavalierBuilding via Jam
156b87e672aSAugustin Cavalier----------------------------
157b87e672aSAugustin Cavalier
158b87e672aSAugustin CavalierHaiku can be built in either of two ways, as disk image file (e.g. for use
159b87e672aSAugustin Cavalierwith emulators, to be written directly to a usb stick, burned as a compact
160b87e672aSAugustin Cavalierdisc) or as installation in a directory.
161b87e672aSAugustin Cavalier
162b87e672aSAugustin Cavalier### Running Jam
163b87e672aSAugustin Cavalier
164b87e672aSAugustin CavalierThere are various ways in which you can run `jam`:
165b87e672aSAugustin Cavalier
166b87e672aSAugustin Cavalier * If you have a single generated folder, you can run 'jam' from the top level of Haiku's trunk.
167b87e672aSAugustin Cavalier * If you have one or more generated folders, (e.g. generated.x86gcc2),
168b87e672aSAugustin Cavalier   you can `cd` into that directory and run `jam`.
169b87e672aSAugustin Cavalier * In either case, you can `cd` into a certain folder in the source tree (e.g.
170b87e672aSAugustin Cavalier   src/apps/debugger) and run jam -sHAIKU_OUTPUT_DIR=<path to generated folder>
171b87e672aSAugustin Cavalier
172b87e672aSAugustin CavalierBe sure to read `build/jam/UserBuildConfig.ReadMe` and `UserBuildConfig.sample`,
173b87e672aSAugustin Cavalieras they contain information on customizing your build of Haiku.
174b87e672aSAugustin Cavalier
175b87e672aSAugustin Cavalier### Building a Haiku anyboot file
176b87e672aSAugustin Cavalier```
177b87e672aSAugustin Cavalierjam -q @anyboot-image
178b87e672aSAugustin Cavalier```
179b87e672aSAugustin Cavalier
180b87e672aSAugustin CavalierThis generates an image file named `haiku-anyboot.image` in your output
181b87e672aSAugustin Cavalierdirectory under `generated/`.
182b87e672aSAugustin Cavalier
183b87e672aSAugustin Cavalier### Building a VMware image file
184b87e672aSAugustin Cavalier```
185b87e672aSAugustin Cavalierjam -q @vmware-image
186b87e672aSAugustin Cavalier```
187b87e672aSAugustin CavalierThis generates an image file named `haiku.vmdk` in your output
188b87e672aSAugustin Cavalierdirectory under `generated/`.
189b87e672aSAugustin Cavalier
190b87e672aSAugustin Cavalier### Directory Installation
191b87e672aSAugustin Cavalier```
192b87e672aSAugustin CavalierHAIKU_INSTALL_DIR=/Haiku jam -q @install
193b87e672aSAugustin Cavalier```
194b87e672aSAugustin Cavalier
195b87e672aSAugustin CavalierInstalls all Haiku components into the volume mounted at "/Haiku" and
196b87e672aSAugustin Cavalierautomatically marks it as bootable. To create a partition in the first place
197b87e672aSAugustin Cavalieruse DriveSetup and initialize it to BFS.
198b87e672aSAugustin Cavalier
199b87e672aSAugustin CavalierNote that installing Haiku in a directory only works as expected under Haiku,
200b87e672aSAugustin Cavalierbut it is not yet supported under Linux and other non-Haiku platforms.
201b87e672aSAugustin Cavalier
202b87e672aSAugustin Cavalier### Building individual components
203b87e672aSAugustin CavalierIf you don't want to build the complete Haiku, but only a certain
204b87e672aSAugustin Cavalierapp/driver/etc. you can specify it as argument to jam, e.g.:
205b87e672aSAugustin Cavalier```
206b87e672aSAugustin Cavalierjam -q Debugger
207b87e672aSAugustin Cavalier```
208b87e672aSAugustin CavalierAlternatively, you can `cd` to the directory of the component you want to
209b87e672aSAugustin Cavalierbuild and run `jam` from there. **NOTE:** if your generated directory is named
210b87e672aSAugustin Cavaliersomething other than `generated/`, you will need to tell `jam` where it is:
211b87e672aSAugustin Cavalier```
212b87e672aSAugustin Cavalierjam -q -sHAIKU_OUTPUT_DIR=<path to generated folder>
213b87e672aSAugustin Cavalier```
214b87e672aSAugustin CavalierYou can also force the rebuild of a component by using the `-a` parameter:
215b87e672aSAugustin Cavalier```
216b87e672aSAugustin Cavalierjam -qa Debugger
217b87e672aSAugustin Cavalier```
218b87e672aSAugustin Cavalier
219b87e672aSAugustin CavalierRunning
220b87e672aSAugustin Cavalier----------------
221b87e672aSAugustin CavalierGenerally there are two ways of running Haiku: on real hardware using a
222b87e672aSAugustin Cavalierpartition, and on emulated hardware using an emulator (like VirtualBox, or QEMU).
223b87e672aSAugustin Cavalier
224b87e672aSAugustin Cavalier### On Real Hardware
225b87e672aSAugustin CavalierIf you have installed Haiku to its own partition you can include this
226b87e672aSAugustin Cavalierpartition in your bootmanager and try to boot Haiku like any other OS you
227b87e672aSAugustin Cavalierhave installed. To include a new partition in the Haiku bootmanager, start
228b87e672aSAugustin Cavalierthe BootManager configurator by running:
229b87e672aSAugustin Cavalier```
230b87e672aSAugustin CavalierBootManager
231b87e672aSAugustin Cavalier```
232b87e672aSAugustin Cavalier
233b87e672aSAugustin Cavalier### On Emulated Hardware
234b87e672aSAugustin CavalierFor emulated hardware you should build disk image (see above). How to set up
235b87e672aSAugustin Cavalierthis image depends on your emulator. If you use QEMU, you can usually just
236b87e672aSAugustin Cavalierprovide the path to the image as command line argument to the `qemu`
237b87e672aSAugustin Cavalierexecutable.
238