diff options
-rw-r--r-- | documentation/sdk-manual/sdk-working-projects.xml | 332 |
1 files changed, 167 insertions, 165 deletions
diff --git a/documentation/sdk-manual/sdk-working-projects.xml b/documentation/sdk-manual/sdk-working-projects.xml index 2e232a5041..7aa43b3921 100644 --- a/documentation/sdk-manual/sdk-working-projects.xml +++ b/documentation/sdk-manual/sdk-working-projects.xml | |||
@@ -21,202 +21,204 @@ | |||
21 | <para> | 21 | <para> |
22 | Once you have a suitable | 22 | Once you have a suitable |
23 | <ulink url='&YOCTO_DOCS_REF_URL;#cross-development-toolchain'>cross-development toolchain</ulink> | 23 | <ulink url='&YOCTO_DOCS_REF_URL;#cross-development-toolchain'>cross-development toolchain</ulink> |
24 | installed, it is very easy to develop a project outside of the | 24 | installed, it is very easy to develop a project using the |
25 | <ulink url='https://en.wikipedia.org/wiki/GNU_Build_System'>GNU Autotools-based</ulink> | ||
26 | workflow, which is outside of the | ||
25 | <ulink url='&YOCTO_DOCS_REF_URL;#build-system-term'>OpenEmbedded build system</ulink>. | 27 | <ulink url='&YOCTO_DOCS_REF_URL;#build-system-term'>OpenEmbedded build system</ulink>. |
26 | This section presents a simple "Helloworld" example that shows how | ||
27 | to set up, compile, and run the project. | ||
28 | </para> | 28 | </para> |
29 | 29 | ||
30 | <section id='creating-and-running-a-project-based-on-gnu-autotools'> | 30 | <para> |
31 | <title>Creating and Running a Project Based on GNU Autotools</title> | 31 | The following figure presents a simple Autotools workflow. |
32 | <imagedata fileref="figures/sdk-autotools-flow.png" width="7in" height="8in" align="center" /> | ||
33 | </para> | ||
32 | 34 | ||
33 | <para> | 35 | <para> |
34 | Follow these steps to create a simple | 36 | Follow these steps to create a simple Autotools-based |
35 | <ulink url='https://en.wikipedia.org/wiki/GNU_Build_System'>GNU Autotools-based</ulink> | 37 | "Hello World" project: |
36 | project: | 38 | <note> |
37 | <orderedlist> | 39 | For more information on the GNU Autotools workflow, |
38 | <listitem><para> | 40 | see the same example on the |
39 | <emphasis>Create Your Directory:</emphasis> | 41 | <ulink url='https://developer.gnome.org/anjuta-build-tutorial/stable/create-autotools.html.en'>GNOME Developer</ulink> |
40 | Create a clean directory for your project and then make | 42 | site. |
41 | that directory your working location: | 43 | </note> |
42 | <literallayout class='monospaced'> | 44 | <orderedlist> |
45 | <listitem><para> | ||
46 | <emphasis>Create a Working Directory and Populate It:</emphasis> | ||
47 | Create a clean directory for your project and then make | ||
48 | that directory your working location. | ||
49 | <literallayout class='monospaced'> | ||
43 | $ mkdir $HOME/helloworld | 50 | $ mkdir $HOME/helloworld |
44 | $ cd $HOME/helloworld | 51 | $ cd $HOME/helloworld |
45 | </literallayout> | 52 | </literallayout> |
46 | </para></listitem> | 53 | After setting up the directory, populate it with three |
47 | <listitem><para> | 54 | simple files needed for the flow. |
48 | <emphasis>Populate the Directory:</emphasis> | 55 | You need a project source file, a file to help with |
49 | Create <filename>hello.c</filename>, | 56 | configuration, and a file to help create the Makefile: |
50 | <filename>Makefile.am</filename>, | 57 | <filename>hello.c</filename>, |
51 | and <filename>configure.ac</filename> files as follows: | 58 | <filename>configure.ac</filename>, and |
52 | <itemizedlist> | 59 | <filename>Makefile.am</filename>, respectively: |
53 | <listitem><para> | 60 | <itemizedlist> |
54 | For <filename>hello.c</filename>, include | 61 | <listitem><para> |
55 | these lines: | 62 | <emphasis><filename>hello.c</filename>:</emphasis> |
56 | <literallayout class='monospaced'> | 63 | <literallayout class='monospaced'> |
57 | #include <stdio.h> | 64 | #include <stdio.h> |
58 | 65 | ||
59 | main() | 66 | main() |
60 | { | 67 | { |
61 | printf("Hello World!\n"); | 68 | printf("Hello World!\n"); |
62 | } | 69 | } |
63 | </literallayout> | 70 | </literallayout> |
64 | </para></listitem> | 71 | </para></listitem> |
65 | <listitem><para> | 72 | <listitem><para> |
66 | For <filename>Makefile.am</filename>, | 73 | <emphasis><filename>configure.ac</filename>:</emphasis> |
67 | include these lines: | 74 | <literallayout class='monospaced'> |
68 | <literallayout class='monospaced'> | ||
69 | bin_PROGRAMS = hello | ||
70 | hello_SOURCES = hello.c | ||
71 | </literallayout> | ||
72 | </para></listitem> | ||
73 | <listitem><para> | ||
74 | For <filename>configure.ac</filename>, | ||
75 | include these lines: | ||
76 | <literallayout class='monospaced'> | ||
77 | AC_INIT(hello,0.1) | 75 | AC_INIT(hello,0.1) |
78 | AM_INIT_AUTOMAKE([foreign]) | 76 | AM_INIT_AUTOMAKE([foreign]) |
79 | AC_PROG_CC | 77 | AC_PROG_CC |
80 | AC_CONFIG_FILES(Makefile) | 78 | AC_CONFIG_FILES(Makefile) |
81 | AC_OUTPUT | 79 | AC_OUTPUT |
82 | </literallayout> | 80 | </literallayout> |
83 | </para></listitem> | 81 | </para></listitem> |
84 | </itemizedlist> | 82 | <listitem><para> |
85 | </para></listitem> | 83 | <emphasis><filename>Makefile.am</filename>:</emphasis> |
86 | <listitem><para> | 84 | <literallayout class='monospaced'> |
87 | <emphasis>Source the Cross-Toolchain | 85 | bin_PROGRAMS = hello |
88 | Environment Setup File:</emphasis> | 86 | hello_SOURCES = hello.c |
89 | As described earlier in the manual, installing the | 87 | </literallayout> |
90 | cross-toolchain creates a cross-toolchain | 88 | </para></listitem> |
91 | environment setup script in the directory that the SDK | 89 | </itemizedlist> |
92 | was installed. | 90 | </para></listitem> |
93 | Before you can use the tools to develop your project, | 91 | <listitem><para> |
94 | you must source this setup script. | 92 | <emphasis>Source the Cross-Toolchain |
95 | The script begins with the string "environment-setup" | 93 | Environment Setup File:</emphasis> |
96 | and contains the machine architecture, which is | 94 | As described earlier in the manual, installing the |
97 | followed by the string "poky-linux". | 95 | cross-toolchain creates a cross-toolchain |
98 | Here is an example that sources a script from the | 96 | environment setup script in the directory that the SDK |
99 | default SDK installation directory that uses the | 97 | was installed. |
100 | 32-bit Intel x86 Architecture and the | 98 | Before you can use the tools to develop your project, |
101 | &DISTRO_NAME; Yocto Project release: | 99 | you must source this setup script. |
102 | <literallayout class='monospaced'> | 100 | The script begins with the string "environment-setup" |
101 | and contains the machine architecture, which is | ||
102 | followed by the string "poky-linux". | ||
103 | For this example, the command sources a script from the | ||
104 | default SDK installation directory that uses the | ||
105 | 32-bit Intel x86 Architecture and the | ||
106 | &DISTRO_NAME; Yocto Project release: | ||
107 | <literallayout class='monospaced'> | ||
103 | $ source /opt/poky/&DISTRO;/environment-setup-i586-poky-linux | 108 | $ source /opt/poky/&DISTRO;/environment-setup-i586-poky-linux |
104 | </literallayout> | 109 | </literallayout> |
105 | </para></listitem> | 110 | </para></listitem> |
106 | <listitem><para> | 111 | <listitem><para> |
107 | <emphasis>Generate the Local <filename>aclocal.m4</filename> | 112 | <emphasis>Generate the Local <filename>aclocal.m4</filename> Files:</emphasis> |
108 | Files and Create the <filename>configure</filename> Script:</emphasis> | 113 | The following command generates the local |
109 | The following GNU Autotools generate the local | 114 | <filename>aclocal.m4</filename> files, which are used |
110 | <filename>aclocal.m4</filename> files and create the | 115 | later with the <filename>autoconf</filename> command: |
111 | <filename>configure</filename> script: | 116 | <literallayout class='monospaced'> |
112 | <literallayout class='monospaced'> | ||
113 | $ aclocal | 117 | $ aclocal |
118 | </literallayout> | ||
119 | </para></listitem> | ||
120 | <listitem><para> | ||
121 | <emphasis>Create the <filename>configure</filename> Script:</emphasis> | ||
122 | The following command creates the | ||
123 | <filename>configure</filename> script: | ||
124 | <literallayout class='monospaced'> | ||
114 | $ autoconf | 125 | $ autoconf |
115 | </literallayout> | 126 | </literallayout> |
116 | </para></listitem> | 127 | </para></listitem> |
117 | <listitem><para> | 128 | <listitem><para> |
118 | <emphasis>Generate Files Needed by GNU Coding | 129 | <emphasis>Generate Files Needed by GNU Coding |
119 | Standards:</emphasis> | 130 | Standards:</emphasis> |
120 | GNU coding standards require certain files in order | 131 | GNU coding standards require certain files in order |
121 | for the project to be compliant. | 132 | for the project to be compliant. |
122 | This command creates those files: | 133 | This command creates those files: |
123 | <literallayout class='monospaced'> | 134 | <literallayout class='monospaced'> |
124 | $ touch NEWS README AUTHORS ChangeLog | 135 | $ touch NEWS README AUTHORS ChangeLog |
125 | </literallayout> | 136 | </literallayout> |
126 | </para></listitem> | 137 | </para></listitem> |
127 | <listitem><para> | 138 | <listitem><para> |
128 | <emphasis>Generate the Configure File:</emphasis> | 139 | <emphasis>Generate the <filename>Makefile.in</filename> File:</emphasis> |
129 | This command generates the | 140 | This command generates the |
130 | <filename>configure</filename>: | 141 | <filename>Makefile.in</filename>, which is used later |
131 | <literallayout class='monospaced'> | 142 | during cross-compilation: |
143 | <literallayout class='monospaced'> | ||
132 | $ automake -a | 144 | $ automake -a |
133 | </literallayout> | 145 | </literallayout> |
134 | </para></listitem> | 146 | </para></listitem> |
135 | <listitem><para> | 147 | <listitem><para> |
136 | <emphasis>Cross-Compile the Project:</emphasis> | 148 | <emphasis>Cross-Compile the Project:</emphasis> |
137 | This command compiles the project using the | 149 | This command compiles the project using the |
138 | cross-compiler. | 150 | cross-compiler. |
139 | The | 151 | The |
140 | <ulink url='&YOCTO_DOCS_REF_URL;#var-CONFIGURE_FLAGS'><filename>CONFIGURE_FLAGS</filename></ulink> | 152 | <ulink url='&YOCTO_DOCS_REF_URL;#var-CONFIGURE_FLAGS'><filename>CONFIGURE_FLAGS</filename></ulink> |
141 | environment variable provides the minimal arguments for | 153 | environment variable provides the minimal arguments for |
142 | GNU configure: | 154 | GNU configure: |
143 | <literallayout class='monospaced'> | 155 | <literallayout class='monospaced'> |
144 | $ ./configure ${CONFIGURE_FLAGS} | 156 | $ ./configure ${CONFIGURE_FLAGS} |
145 | </literallayout> | 157 | </literallayout> |
146 | </para></listitem> | 158 | For an Autotools-based project, you can use the |
147 | <listitem><para> | 159 | cross-toolchain by just passing the appropriate host |
148 | <emphasis>Make and Install the Project:</emphasis> | 160 | option to <filename>configure.sh</filename>. |
149 | These two commands generate and install the project | 161 | The host option you use is derived from the name of the |
150 | into the destination directory: | 162 | environment setup script found in the directory in which you |
151 | <literallayout class='monospaced'> | 163 | installed the cross-toolchain. |
152 | $ make | 164 | For example, the host option for an ARM-based target that uses |
153 | $ make install DESTDIR=./tmp | 165 | the GNU EABI is |
154 | </literallayout> | 166 | <filename>armv5te-poky-linux-gnueabi</filename>. |
155 | </para></listitem> | 167 | You will notice that the name of the script is |
156 | <listitem><para> | 168 | <filename>environment-setup-armv5te-poky-linux-gnueabi</filename>. |
157 | <emphasis>Verify the Installation:</emphasis> | 169 | Thus, the following command works to update your project |
158 | This command is a simple way to verify the installation | 170 | and rebuild it using the appropriate cross-toolchain tools: |
159 | of your project. | 171 | <literallayout class='monospaced'> |
160 | Running the command prints the architecture on which | ||
161 | the binary file can run. | ||
162 | This architecture should be the same architecture that | ||
163 | the installed cross-toolchain supports. | ||
164 | <literallayout class='monospaced'> | ||
165 | $ file ./tmp/usr/local/bin/hello | ||
166 | </literallayout> | ||
167 | </para></listitem> | ||
168 | <listitem><para> | ||
169 | <emphasis>Execute Your Project:</emphasis> | ||
170 | To execute the project in the shell, simply enter | ||
171 | the name. | ||
172 | You could also copy the binary to the actual target | ||
173 | hardware and run the project there as well: | ||
174 | <literallayout class='monospaced'> | ||
175 | $ ./hello | ||
176 | </literallayout> | ||
177 | As expected, the project displays the "Hello World!" | ||
178 | message. | ||
179 | </para></listitem> | ||
180 | </orderedlist> | ||
181 | </para> | ||
182 | </section> | ||
183 | |||
184 | <section id='passing-host-options'> | ||
185 | <title>Passing Host Options</title> | ||
186 | |||
187 | <para> | ||
188 | For an Autotools-based project, you can use the cross-toolchain | ||
189 | by just passing the appropriate host option to | ||
190 | <filename>configure.sh</filename>. | ||
191 | The host option you use is derived from the name of the | ||
192 | environment setup script found in the directory in which you | ||
193 | installed the cross-toolchain. | ||
194 | For example, the host option for an ARM-based target that uses | ||
195 | the GNU EABI is <filename>armv5te-poky-linux-gnueabi</filename>. | ||
196 | You will notice that the name of the script is | ||
197 | <filename>environment-setup-armv5te-poky-linux-gnueabi</filename>. | ||
198 | Thus, the following command works to update your project and | ||
199 | rebuild it using the appropriate cross-toolchain tools: | ||
200 | <literallayout class='monospaced'> | ||
201 | $ ./configure --host=armv5te-poky-linux-gnueabi \ | 172 | $ ./configure --host=armv5te-poky-linux-gnueabi \ |
202 | --with-libtool-sysroot=<replaceable>sysroot_dir</replaceable> | 173 | --with-libtool-sysroot=<replaceable>sysroot_dir</replaceable> |
203 | </literallayout> | 174 | </literallayout> |
204 | <note> | 175 | <note> |
205 | If the <filename>configure</filename> script results in | 176 | If the <filename>configure</filename> script results in |
206 | problems recognizing the | 177 | problems recognizing the |
207 | <filename>--with-libtool-sysroot=</filename><replaceable>sysroot-dir</replaceable> | 178 | <filename>--with-libtool-sysroot=</filename><replaceable>sysroot-dir</replaceable> |
208 | option, regenerate the script to enable the support by | 179 | option, regenerate the script to enable the support by |
209 | doing the following and then run the script again: | 180 | doing the following and then run the script again: |
210 | <literallayout class='monospaced'> | 181 | <literallayout class='monospaced'> |
211 | $ libtoolize --automake | 182 | $ libtoolize --automake |
212 | $ aclocal -I ${OECORE_TARGET_SYSROOT}/usr/share/aclocal [-I <replaceable>dir_containing_your_project-specific_m4_macros</replaceable>] | 183 | $ aclocal -I ${OECORE_TARGET_SYSROOT}/usr/share/aclocal [-I <replaceable>dir_containing_your_project-specific_m4_macros</replaceable>] |
213 | $ autoconf | 184 | $ autoconf |
214 | $ autoheader | 185 | $ autoheader |
215 | $ automake -a | 186 | $ automake -a |
187 | </literallayout> | ||
188 | </note> | ||
189 | </para></listitem> | ||
190 | <listitem><para> | ||
191 | <emphasis>Make and Install the Project:</emphasis> | ||
192 | These two commands generate and install the project | ||
193 | into the destination directory: | ||
194 | <literallayout class='monospaced'> | ||
195 | $ make | ||
196 | $ make install DESTDIR=./tmp | ||
216 | </literallayout> | 197 | </literallayout> |
217 | </note> | 198 | This next command is a simple way to verify the |
218 | </para> | 199 | installation of your project. |
219 | </section> | 200 | Running the command prints the architecture on which |
201 | the binary file can run. | ||
202 | This architecture should be the same architecture that | ||
203 | the installed cross-toolchain supports. | ||
204 | <literallayout class='monospaced'> | ||
205 | $ file ./tmp/usr/local/bin/hello | ||
206 | </literallayout> | ||
207 | </para></listitem> | ||
208 | <listitem><para> | ||
209 | <emphasis>Execute Your Project:</emphasis> | ||
210 | To execute the project in the shell, simply enter | ||
211 | the name. | ||
212 | You could also copy the binary to the actual target | ||
213 | hardware and run the project there as well: | ||
214 | <literallayout class='monospaced'> | ||
215 | $ ./hello | ||
216 | </literallayout> | ||
217 | As expected, the project displays the "Hello World!" | ||
218 | message. | ||
219 | </para></listitem> | ||
220 | </orderedlist> | ||
221 | </para> | ||
220 | </section> | 222 | </section> |
221 | 223 | ||
222 | <section id='makefile-based-projects'> | 224 | <section id='makefile-based-projects'> |