diff options
-rw-r--r-- | bitbake/doc/user-manual/user-manual-hello.xml | 321 |
1 files changed, 321 insertions, 0 deletions
diff --git a/bitbake/doc/user-manual/user-manual-hello.xml b/bitbake/doc/user-manual/user-manual-hello.xml new file mode 100644 index 0000000000..77869f80dd --- /dev/null +++ b/bitbake/doc/user-manual/user-manual-hello.xml | |||
@@ -0,0 +1,321 @@ | |||
1 | <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" | ||
2 | "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"> | ||
3 | |||
4 | <chapter id='hello'> | ||
5 | <title>A BitBake Hello World</title> | ||
6 | |||
7 | <section id='bitbake-hello-world'> | ||
8 | <title>BitBake Hello World</title> | ||
9 | |||
10 | <para> | ||
11 | The simplest example commonly used to demonstrate any new | ||
12 | programming language or tool is the | ||
13 | <ulink url="http://en.wikipedia.org/wiki/Hello_world_program">Hello World</ulink> | ||
14 | example. | ||
15 | This chapter demonstrates, in tutorial form, Hello | ||
16 | World within the context of BitBake. | ||
17 | This tutorial describes how to create a new Project | ||
18 | and the applicable metadata files necessary to allow | ||
19 | BitBake to build it. | ||
20 | </para> | ||
21 | </section> | ||
22 | |||
23 | <section id='obtaining-bitbake'> | ||
24 | <title>Obtaining BitBake</title> | ||
25 | |||
26 | <para> | ||
27 | Please refer to Chapter 1 Section 1.7 for the various methods to | ||
28 | obtain BitBake. | ||
29 | Once the source code is on your machine the BitBake directory will | ||
30 | appear as follows: | ||
31 | <literallayout class='monospaced'> | ||
32 | $ ls -al | ||
33 | total 100 | ||
34 | drwxrwxr-x. 9 wmat wmat 4096 Jan 31 13:44 . | ||
35 | drwxrwxr-x. 3 wmat wmat 4096 Feb 4 10:45 .. | ||
36 | -rw-rw-r--. 1 wmat wmat 365 Nov 26 04:55 AUTHORS | ||
37 | drwxrwxr-x. 2 wmat wmat 4096 Nov 26 04:55 bin | ||
38 | drwxrwxr-x. 4 wmat wmat 4096 Jan 31 13:44 build | ||
39 | -rw-rw-r--. 1 wmat wmat 16501 Nov 26 04:55 ChangeLog | ||
40 | drwxrwxr-x. 2 wmat wmat 4096 Nov 26 04:55 classes | ||
41 | drwxrwxr-x. 2 wmat wmat 4096 Nov 26 04:55 conf | ||
42 | drwxrwxr-x. 3 wmat wmat 4096 Nov 26 04:55 contrib | ||
43 | -rw-rw-r--. 1 wmat wmat 17987 Nov 26 04:55 COPYING | ||
44 | drwxrwxr-x. 3 wmat wmat 4096 Nov 26 04:55 doc | ||
45 | -rw-rw-r--. 1 wmat wmat 69 Nov 26 04:55 .gitignore | ||
46 | -rw-rw-r--. 1 wmat wmat 849 Nov 26 04:55 HEADER | ||
47 | drwxrwxr-x. 5 wmat wmat 4096 Jan 31 13:44 lib | ||
48 | -rw-rw-r--. 1 wmat wmat 195 Nov 26 04:55 MANIFEST.in | ||
49 | -rwxrwxr-x. 1 wmat wmat 3195 Jan 31 11:57 setup.py | ||
50 | -rw-rw-r--. 1 wmat wmat 2887 Nov 26 04:55 TODO | ||
51 | </literallayout> | ||
52 | </para> | ||
53 | |||
54 | <para> | ||
55 | At this point you should have BitBake extracted or cloned to | ||
56 | a directory and it should match the directory tree above. | ||
57 | Please note that you'll see your username wherever | ||
58 | "wmat" appears above. | ||
59 | </para> | ||
60 | </section> | ||
61 | |||
62 | <section id='setting-up-the-bitbake-environment'> | ||
63 | <title>Setting Up the BitBake Environment</title> | ||
64 | |||
65 | <para> | ||
66 | The recommended method to run BitBake is from a directory of your | ||
67 | choice. | ||
68 | The directory can be within your home directory or in | ||
69 | <filename>/usr/local</filename>, | ||
70 | depending on your preference. | ||
71 | Let's run BitBake now to make sure it's working. | ||
72 | </para> | ||
73 | |||
74 | <para> | ||
75 | From the BitBake source code directory, issue the following command: | ||
76 | <literallayout class='monospaced'> | ||
77 | $ ./bin/bitbake --version | ||
78 | BitBake Build Tool Core version 1.19.0, bitbake version | ||
79 | 1.19.0 | ||
80 | </literallayout> | ||
81 | You're now ready to use BitBake. | ||
82 | </para> | ||
83 | |||
84 | <para> | ||
85 | A final step to make development easier is to add the executable | ||
86 | binary to your environment <filename>PATH</filename>. | ||
87 | First, have a look at your current <filename>PATH</filename> variable. | ||
88 | If I check mine, I get: | ||
89 | <literallayout class='monospaced'> | ||
90 | $ echo $PATH | ||
91 | /home/wmat/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin: | ||
92 | /usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games | ||
93 | </literallayout> | ||
94 | Now add the directory location for the BitBake binary to the <filename>PATH</filename> | ||
95 | with: | ||
96 | <literallayout class='monospaced'> | ||
97 | $ export PATH={path to the bitbake executable}:$PATH | ||
98 | </literallayout> | ||
99 | This will add the directory to the beginning of your PATH environment | ||
100 | variable. | ||
101 | For example, on my machine: | ||
102 | <literallayout class='monospaced'> | ||
103 | $ export PATH=/media/wmat/Backups/dev/bitbake/bin:$PATH | ||
104 | /media/wmat/Backups/dev/bitbake/bin:/home/wmat/bin: | ||
105 | /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin: | ||
106 | /usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games | ||
107 | </literallayout> | ||
108 | Now, you should be able to simply enter the | ||
109 | <filename>bitbake</filename> | ||
110 | command at the command line to run bitbake. | ||
111 | For a more permanent solution and assuming you are running the BASH | ||
112 | shell, edit <filename>~/.bashrc</filename> and add the following to the end | ||
113 | of that file: | ||
114 | <literallayout class='monospaced'> | ||
115 | PATH={path to the bitbake executable}:$PATH | ||
116 | </literallayout> | ||
117 | </para> | ||
118 | |||
119 | <para> | ||
120 | Note that if you're a Vim user, you will find useful | ||
121 | Vim configuration contributions in the | ||
122 | <filename>contrib/vim</filename> directory. | ||
123 | Copy the files from that directory to your | ||
124 | <filename>/home/yourusername/.vim</filename> | ||
125 | directory. | ||
126 | If it doesn't exist, create it, and restart Vim. | ||
127 | </para> | ||
128 | </section> | ||
129 | |||
130 | <section id='the-hello-world-example'> | ||
131 | <title>The Hello World Example</title> | ||
132 | |||
133 | <para> | ||
134 | The following example leaps directly into how BitBake | ||
135 | works. | ||
136 | Every attempt is made to explain what is happening, | ||
137 | however, further information can be found in the | ||
138 | Metadata chapter. | ||
139 | </para> | ||
140 | |||
141 | <para> | ||
142 | The overall goal of this exercise is to create a Hello | ||
143 | World example utilizing concepts used to | ||
144 | build and construct a complete example application | ||
145 | including Tasks and Layers. | ||
146 | This is how modern projects such as OpenEmbedded and | ||
147 | the Yocto Project utilize BitBake, therefore it | ||
148 | provides an excellent starting point for understanding | ||
149 | BitBake. | ||
150 | </para> | ||
151 | |||
152 | <para> | ||
153 | It should be noted that this chapter was inspired by | ||
154 | and draws heavily from several sources: | ||
155 | <itemizedlist> | ||
156 | <listitem><para> | ||
157 | <ulink href="http://www.mail-archive.com/yocto@yoctoproject.org/msg09379.html">Mailing List post - The BitBake equivalent of "Hello, World!"</ulink> | ||
158 | </para></listitem> | ||
159 | <listitem><para> | ||
160 | <ulink href="http://hambedded.org/blog/2012/11/24/from-bitbake-hello-world-to-an-image/">Hambedded Linux blog post - From Bitbake Hello World to an Image</ulink> | ||
161 | </para></listitem> | ||
162 | </itemizedlist> | ||
163 | </para> | ||
164 | |||
165 | <section id='a-reverse-walkthrough'> | ||
166 | <title>A Reverse Walkthrough</title> | ||
167 | |||
168 | <para> | ||
169 | One of the best means to understand anything is to walk | ||
170 | through the steps to where we want to be by observing first | ||
171 | principles. | ||
172 | BitBake allows us to do this through the -D or Debug command | ||
173 | line parameter. | ||
174 | We know we want to eventually compile a HelloWorld example, but | ||
175 | we don't know what we need to do that. | ||
176 | Remember that BitBake utilizes three types of metadata files: | ||
177 | Configuration Files, Classes, and Recipes. | ||
178 | But where do they go, how does BitBake find them, etc. etc.? | ||
179 | Hopefully we can use BitBake's error messaging to figure this | ||
180 | out and better understand exactly what's going on. | ||
181 | </para> | ||
182 | |||
183 | <para> | ||
184 | First, let's begin by setting up a directory for our HelloWorld | ||
185 | project. | ||
186 | I'll do this in my home directory and change into that | ||
187 | directory: | ||
188 | <literallayout class='monospaced'> | ||
189 | $ mkdir ~/dev/hello && cd ~/dev/hello | ||
190 | </literallayout> | ||
191 | Within this new, empty directory, let's run BitBake with | ||
192 | Debugging output and see what happens: | ||
193 | <literallayout class='monospaced'> | ||
194 | $ bitbake -DDD | ||
195 | The BBPATH variable is not set | ||
196 | DEBUG: Removed the following variables from the environment: | ||
197 | GNOME_DESKTOP_SESSION_ID, LESSOPEN, WINDOWID, | ||
198 | GNOME_KEYRING_CONTROL, DISPLAY, SSH_AGENT_PID, LANG, | ||
199 | XDG_SESSION_PATH, XAUTHORITY, LANGUAGE, SESSION_MANAGER, | ||
200 | SHLVL, MANDATORY_PATH, COMPIZ_CONFIG_PROFILE, TEXTDOMAIN, | ||
201 | GPG_AGENT_INFO, SSH_AUTH_SOCK, XDG_RUNTIME_DIR, | ||
202 | COMPIZ_BIN_PATH, GDMSESSION, DEFAULTS_PATH, TEXTDOMAINDIR, | ||
203 | XDG_SEAT_PATH, XDG_CONFIG_DIRS, XDG_CURRENT_DESKTOP, | ||
204 | DBUS_SESSION_BUS_ADDRESS, _, XDG_SESSION_COOKIE, | ||
205 | DESKTOP_SESSION, LESSCLOSE, GNOME_KEYRING_PID, | ||
206 | UBUNTU_MENUPROXY, OLDPWD, GTK_MODULES, XDG_DATA_DIRS, | ||
207 | COLORTERM, LS_COLORS | ||
208 | </literallayout> | ||
209 | The majority of this output is specific to environment variables | ||
210 | that are not directly relevant to BitBake. | ||
211 | However, the very | ||
212 | first message <filename>The BBPATH variable is not set</filename> | ||
213 | is and needs to be rectified. | ||
214 | So how do we set the BBPATH | ||
215 | variable? | ||
216 | </para> | ||
217 | |||
218 | <para> | ||
219 | When BitBake is run it begins looking for metadata files. | ||
220 | The BBPATH variable is what tells BitBake where to look. | ||
221 | It is possible to set BBPATH as an environment variable as you | ||
222 | did above for the BitBake exexcutable's PATH. | ||
223 | However, it's much more flexible to set the BBPATH variable for | ||
224 | each project, as this allows for greater flexibility. | ||
225 | </para> | ||
226 | |||
227 | <para> | ||
228 | Without BBPATH Bitbake will not find any <filename>.conf</filename> | ||
229 | files or recipe files at all. | ||
230 | It will also not find <filename>bitbake.conf</filename>. | ||
231 | Note the reference to <filename>conf/</filename>. | ||
232 | It is standard practice to organize the project's directory tree | ||
233 | to include a <filename>conf/</filename> and a | ||
234 | <filename>classes/</filename> directory. | ||
235 | Add those now to your project directory: | ||
236 | <literallayout class='monospaced'> | ||
237 | $ mkdir conf classes | ||
238 | </literallayout> | ||
239 | Now let's copy the sample configuration files provided in the | ||
240 | BitBake source tree to their appropriate conf and classes | ||
241 | directory. | ||
242 | Change to the BitBake source tree directory and: | ||
243 | <literallayout class='monospaced'> | ||
244 | cp conf/bitbake.conf ~/dev/hello/conf/ | ||
245 | cp classes/base.bbclass ~/dev/hello/classes/ | ||
246 | </literallayout> | ||
247 | At this point your project directory structure should look like | ||
248 | the following: | ||
249 | <literallayout class='monospaced'> | ||
250 | ~/dev/hello$ tree | ||
251 | . | ||
252 | ├── classes | ||
253 | │ └── base.bbclass | ||
254 | └── conf | ||
255 | └── bitbake.conf | ||
256 | </literallayout> | ||
257 | </para> | ||
258 | |||
259 | <para> | ||
260 | But what about BBPATH, we still haven't set it? | ||
261 | </para> | ||
262 | |||
263 | <para> | ||
264 | The first configuration file that BitBake looks for is always | ||
265 | <filename>bblayers.conf</filename>. | ||
266 | With this knowledge we know that to resolve our BBPATH error we | ||
267 | can add a <filename>conf/bblayers.conf</filename> file to our | ||
268 | project source tree and populate it with the BBPATH variable | ||
269 | declaration. | ||
270 | From your project source tree: | ||
271 | <literallayout class='monospaced'> | ||
272 | $ vim conf/bblayers.conf | ||
273 | </literallayout> | ||
274 | Add the following to the empty bblayers.conf file: | ||
275 | <literallayout class='monospaced'> | ||
276 | BBPATH := "${TOPDIR}" | ||
277 | </literallayout> | ||
278 | </para> | ||
279 | |||
280 | <para> | ||
281 | Now from the root of our project directory, let's run BitBake | ||
282 | again and see what happens: | ||
283 | <literallayout class='monospaced'> | ||
284 | $ bitbake -DDD | ||
285 | Nothing to do. Use 'bitbake world' to build everything, or run | ||
286 | 'bitbake --help' for usage information. | ||
287 | DEBUG: Removed the following variables from the environment: | ||
288 | GNOME_DESKTOP_SESSION_ID, LESSOPEN, WINDOWID, | ||
289 | GNOME_KEYRING_CONTROL, DISPLAY, SSH_AGENT_PID, LANG, | ||
290 | XDG_SESSION_PATH, XAUTHORITY, LANGUAGE, SESSION_MANAGER, | ||
291 | SHLVL, MANDATORY_PATH, COMPIZ_CONFIG_PROFILE, TEXTDOMAIN, | ||
292 | GPG_AGENT_INFO, SSH_AUTH_SOCK, XDG_RUNTIME_DIR, | ||
293 | COMPIZ_BIN_PATH, GDMSESSION, DEFAULTS_PATH, TEXTDOMAINDIR, | ||
294 | XDG_SEAT_PATH, XDG_CONFIG_DIRS, XDG_CURRENT_DESKTOP, | ||
295 | DBUS_SESSION_BUS_ADDRESS, _, XDG_SESSION_COOKIE, | ||
296 | DESKTOP_SESSION, LESSCLOSE, GNOME_KEYRING_PID, UBUNTU_MENUPROXY, | ||
297 | OLDPWD, GTK_MODULES, XDG_DATA_DIRS, COLORTERM, LS_COLORS | ||
298 | DEBUG: Found bblayers.conf (/home/wmat/dev/hello/conf/ | ||
299 | bblayers.conf) | ||
300 | DEBUG: LOAD /home/wmat/dev/hello/conf/bblayers.conf | ||
301 | DEBUG: LOAD /home/wmat/dev/hello/conf/bitbake.conf | ||
302 | DEBUG: BB configuration INHERITs:0: inheriting /home/wmat/dev/ | ||
303 | hello/classes/base.bbclass | ||
304 | DEBUG: BB /home/wmat/dev/hello/classes/base.bbclass: handle | ||
305 | (data, include) | ||
306 | DEBUG: LOAD /home/wmat/dev/hello/classes/base.bbclass | ||
307 | DEBUG: Clearing SRCREV cache due to cache policy of: clear | ||
308 | DEBUG: Using cache in '/home/wmat/dev/hello/tmp/cache/ | ||
309 | local_file_checksum_cache.dat' | ||
310 | DEBUG: Using cache in '/home/wmat/dev/hello/tmp/cache/ | ||
311 | bb_codeparser.dat' | ||
312 | </literallayout> | ||
313 | <note> | ||
314 | From this point forward, the environment variable | ||
315 | removal messages will be ignored and omitted. | ||
316 | Let's examine the relevant DEBUG messages: | ||
317 | </note> | ||
318 | </para> | ||
319 | </section> | ||
320 | </section> | ||
321 | </chapter> | ||