1page.title=Android.mk
2@jd:body
3
4<div id="qv-wrapper">
5    <div id="qv">
6      <h2>On this page</h2>
7
8      <ol>
9        <li><a href="#over">Overview</a></li>
10        <li><a href="#basics">Basics</a></li>
11        <li><a href="#var">Variables and Macros</a></li>
12        <li><a href="#mdv">Module-Description Variables</a></li>
13      </ol>
14    </div>
15  </div>
16
17
18<p>This page describes the syntax of the {@code Android.mk} build file,
19which glues your C and C++ source files to the Android NDK.</p>
20
21<h2 id="over">Overview</h2>
22<p>The {@code Android.mk} file resides in a subdirectory of your project's {@code jni/} directory,
23and describes your sources and shared libraries to the build system. It is really a tiny GNU
24makefile fragment that the build system parses once or more. The {@code Android.mk} file is useful
25for defining project-wide settings that <a href="{@docRoot}ndk/guides/application_mk.html">{@code
26Application.mk}</a>, the build system, and your
27environment variables leave undefined. It can also override project-wide settings for specific
28<i>modules</i>.</p>
29
30<p>The syntax of the {@code Android.mk} allows you to group your sources into
31<em>modules</em>. A module is either a static library, a shared library, or a standalone
32executable. You can define one or more modules in each {@code Android.mk} file, and
33you can use the same source file in multiple modules. The build system only places shared libraries
34into your application package. In addition, static libraries can generate shared libraries.</p>
35
36<p>In addition to packaging libraries, the build system handles a variety of other details for you.
37For example, you don't need to list header files or explicit dependencies between generated files in
38your {@code Android.mk} file. The NDK build system computes these relationships automatically for
39you. As a result, you should be able to benefit from new toolchain/platform support in future NDK
40releases without having to touch your {@code Android.mk} file.</p>
41
42<p>The syntax of this file is very close to that used in the {@code Android.mk} files distributed with
43the full <a href="https://source.android.com">Android Open Source Project</a>. While the
44build system implementation that uses them is different, their similarity is an
45intentional design decision aimed at making it easier for application
46developers to reuse source code for external libraries.</p>
47
48<h2 id="basics">Basics</h2>
49<p>Before exploring the syntax in detail, it is useful to start by understanding the basics
50of what a {@code Android.mk} file contains. This section uses the {@code Android.mk} file in the
51Hello-JNI sample toward that end, explaining the role that each line in the file plays.</p>
52
53
54<p>An {@code Android.mk} file must begin by defining the {@code LOCAL_PATH} variable:
55
56<pre class="no-pretty-print">
57LOCAL_PATH := $(call my-dir)
58</pre>
59
60<p>This variable indicates the location of the source files in the development tree. Here, the macro
61function {@code my-dir}, provided by the build system, returns the path of the current directory
62(the directory containing the {@code Android.mk} file itself).</p>
63
64<p>The next line declares the {@code CLEAR_VARS} variable, whose value the build system provides.
65
66<pre class="no-pretty-print">
67include $(CLEAR_VARS)
68</pre>
69
70<p>The {@code CLEAR_VARS} variable points to a special GNU Makefile that clears many
71{@code LOCAL_XXX} variables for you, such as {@code LOCAL_MODULE}, {@code LOCAL_SRC_FILES}, and
72{@code LOCAL_STATIC_LIBRARIES}. Note that it does not clear {@code LOCAL_PATH}. This variable must
73retain its value because the system parses all build control files in a single GNU Make execution
74context where all variables are global. You must (re-)declare this variable before describing each
75module.</p>
76
77<p>Next, the {@code LOCAL_MODULE} variable stores the name of the module that you wish to build.
78Use this variable once per module in your application.</p>
79
80<pre class="no-pretty-print">
81LOCAL_MODULE := hello-jni
82</pre>
83
84<p>Each module name must be unique and not contain any spaces. The build system, when it
85generates the final shared-library file, automatically adds the proper prefix and suffix to
86the name that you assign to {@code LOCAL_MODULE}. For example, the example that appears above
87results in generation of a library called {@code libhello-jni.so}.</p>
88
89<p class="note"><strong>Note:</strong> If your module's name already starts with {@code lib}, the
90build system does not prepend an additional {@code lib} prefix; it takes the module name as-is, and
91adds the {@code .so} extension. So a source file originally called, for example, {@code libfoo.c}
92still produces a shared-object file called {@code libfoo.so}. This behavior is to support libraries
93that the Android platform sources generate from {@code Android.mk} files; the names of all such
94libraries start with {@code lib}.</p>
95
96<p>The next line enumerates the source files, with spaces delimiting multiple files:</p>
97
98<pre class="no-pretty-print">
99LOCAL_SRC_FILES := hello-jni.c
100</pre>
101
102<p>The {@code LOCAL_SRC_FILES} variable must contain a list of C and/or C++ source files to build
103into a module.</p>
104
105<p>The last line helps the system tie everything together:</p>
106
107<pre class="no-pretty-print">
108include $(BUILD_SHARED_LIBRARY)
109</pre>
110
111<p>The {@code BUILD_SHARED_LIBRARY} variable points to a GNU Makefile script that collects all the
112information you defined in {@code LOCAL_XXX} variables since the most recent {@code include}. This
113script determines what to build, and how to do it.</p>
114
115<p>There are more complex examples in the samples directories, with commented
116{@code Android.mk} files that you can look at. In addition,
117<a href="{@docRoot}ndk/samples/sample_na.html">Sample: native-activity</a> provides
118a detailed explanation of that sample's {@code Android.mk} file. Finally, <a href="#var">
119Variables and Macros</a> provides further information on the variables from this section.
120
121
122<h2 id="var">Variables and Macros</h2>
123<p>The build system provides many possible variables for use in the the {@code Android.mk} file.
124Many of these variables come with preassigned values. Others, you assign.</p>
125
126<p>In addition to these variables, you can also define your own arbitrary ones. If you do so, keep
127in mind that the NDK build system reserves the following variable names:</p>
128<ul>
129<li>Names that begin with {@code LOCAL_}, such as {@code LOCAL_MODULE}.</li>
130<li>Names that begin with {@code PRIVATE_}, {@code NDK_}, or {@code APP}. The build system uses
131these internally.</li>
132<li>Lower-case names, such as {@code my-dir}. The build system uses these internally, as well.</li>
133</ul>
134<p>If you need to define your own convenience variables in an {@code Android.mk} file, we
135recommend prepending {@code MY_} to their names.
136
137
138<h3 id="npv">NDK-defined variables</h3>
139<p>This section discusses the GNU Make variables that the build system defines before parsing your
140{@code Android.mk} file. Under certain circumstances, the NDK might parse your {@code Android.mk}
141file several times, using a different definition for some of these variables each time.</p>
142
143<h4>CLEAR_VARS</h4>
144<p>This variable points to a build script that undefines nearly all {@code LOCAL_XXX} variables
145listed in the "Developer-defined variables" section below. Use this variable to include
146this script before describing a new module. The syntax for using it is:</p>
147
148<pre class="no-pretty-print">
149include $(CLEAR_VARS)
150</pre>
151
152<h4>BUILD_SHARED_LIBRARY</h4>
153<p>This variable points to a build script that collects all the information about the module
154you provided in your {@code LOCAL_XXX} variables, and determines how to build a target shared
155library from the sources you listed. Note that using this script requires that you have already
156assigned values to {@code LOCAL_MODULE} and {@code LOCAL_SRC_FILES}, at a minimum (for more
157information about these variables, see <a href = "#mdv">Module-Description Variables</a>).</p>
158
159<p>The syntax for using this variable is:</p>
160
161<pre class="no-pretty-print">
162include $(BUILD_SHARED_LIBRARY)
163</pre>
164
165<p>A shared-library variable causes the build system to generate a library file with a {@code .so}
166extension.</p>
167
168<h4>BUILD_STATIC_LIBRARY</h4>
169<p>A variant of {@code BUILD_SHARED_LIBRARY} that is used to build a static library. The build
170system does not copy static libraries into your project/packages, but it can use them to build
171shared libraries (see {@code LOCAL_STATIC_LIBRARIES} and {@code LOCAL_WHOLE_STATIC_LIBRARIES},
172below). The syntax for using this variable is:</p>
173
174<pre class="no-pretty-print">
175include $(BUILD_STATIC_LIBRARY)
176</pre>
177
178<p>A static-library variable causes the build system to generate a library with a {@code .a}
179extension.</p>
180
181<h4>PREBUILT_SHARED_LIBRARY</h4>
182<p>Points to a build script used to specify a prebuilt shared library. Unlike in the case of
183{@code BUILD_SHARED_LIBRARY} and {@code BUILD_STATIC_LIBRARY}, here the value of
184{@code LOCAL_SRC_FILES} cannot be a source file. Instead, it must be a single path to a prebuilt
185shared library, such as {@code foo/libfoo.so}. The syntax for using this variable is:</p>
186
187<pre class="no-pretty-print">
188include $(PREBUILT_SHARED_LIBRARY)
189</pre>
190
191<p>You can also reference a prebuilt library in another module by using the
192{@code LOCAL_PREBUILTS} variable. For more information about using prebuilts, see
193<a href="{@docRoot}ndk/guides/prebuilts.html">Using Prebuilt Libraries</a>.</p>
194
195
196<h4>PREBUILT_STATIC_LIBRARY</h4>
197<p>The same as {@code PREBUILT_SHARED_LIBRARY}, but for a prebuilt static library. For more
198information about using prebuilts, see <a href="{@docRoot}ndk/guides/prebuilts.html">Using Prebuilt
199Libraries</a>.</p>
200
201<h4>TARGET_ARCH</h4>
202<p>The name of the target CPU architecture as the Android Open Source Project specifies it.
203For any ARM-compatible build, use {@code arm}, independent of the CPU architecture revision or
204ABI (see TARGET_ARCH_ABI, below).</p>
205
206<p>The value of this variable is taken from the APP_ABI variable that you define in the
207{@code Android.mk} file, which the system reads ahead of parsing the {@code Android.mk} file.</p>
208
209<h4>TARGET_PLATFORM</h4>
210<p>The Android API level number for the build system to target.
211For example, the Android 5.1 system images correspond to Android API level 22: {@code android-22}.
212For a complete list of platform names and corresponding Android system
213images, see <a href="{@docRoot}ndk/guides/stable_apis.html">Android NDK Native APIs</a>.
214The following example shows the syntax for using this variable:</p>
215
216<pre class="no-pretty-print">
217TARGET_PLATFORM := android-22
218</pre>
219
220<h4 id="taa">TARGET_ARCH_ABI</h4>
221<p>This variable stores the name of the CPU and architecture to target when the build system
222parses this {@code Android.mk} file. You can specify one or more of the following values, using
223a space as a delimiter between multiple targets. Table 1 shows the ABI setting to use for each
224supported CPU and architecture.
225
226<p class="table-caption" id="table1">
227  <strong>Table 1.</strong> ABI settings for different CPUs and architectures.</p>
228<table>
229  <tr>
230    <th scope="col">CPU and architecture</th>
231    <th scope="col">Setting</th>
232  </tr>
233  <tr>
234    <td>ARMv5TE</td>
235    <td>{@code armeabi}</td>
236  </tr>
237  <tr>
238    <td>ARMv7</td>
239    <td>{@code armeabi-v7a}</td>
240  </tr>
241  <tr>
242    <td>ARMv8 AArch64</td>
243    <td>{@code arm64-v8a}</td>
244  </tr>
245  <tr>
246    <td>i686</td>
247    <td>{@code x86}</td>
248  </tr>
249  <tr>
250    <td>x86-64</td>
251    <td>{@code x86_64}</td>
252  </tr>
253  <tr>
254    <td>mips32 (r1)</td>
255    <td>{@code mips}</td>
256  </tr>
257  <tr>
258    <td>mips64 (r6)</td>
259    <td>{@code mips64}</td>
260  </tr>
261  <tr>
262    <td>All</td>
263    <td>{@code all}</td>
264  </tr>
265</table>
266
267<p>The following example shows how to set ARMv8 AArch64 as the target CPU-and-ABI combination:</p>
268
269<pre class="no-pretty-print">
270TARGET_ARCH_ABI := arm64-v8a
271</pre>
272
273<p class="note"><strong>Note: </strong> Up to Android NDK 1.6_r1, this variable is defined as
274{@code arm}.</p>
275
276<p>For more details about architecture ABIs and associated compatibility
277issues, refer to
278<a href="{@docRoot}ndk/guides/abis.html">ABI Management</a>.</p>
279
280<p>New target ABIs in the future will have different values.</p>
281
282<h4>TARGET_ABI</h4>
283<p>A concatenation of target Android API level and ABI, it is especially useful when you want to test against
284a specific target system image for a real device. For example, to specify a 64-bit ARM device
285running on Android API level 22:</p>
286
287<pre class="no-pretty-print">
288TARGET_ABI := android-22-arm64-v8a
289</pre>
290
291<p class="note"><strong>Note:</strong> Up to Android NDK 1.6_r1, the default value was
292{@code android-3-arm}.</p>
293
294<h2 id="mdv">Module-Description Variables</h2>
295<p>The variables in this section describe your module to the build system. Each module description
296should follow this basic flow:
297<ul>
298<ol type = "1">
299<li>Initialize or undefine the variables associated with the module, using the {@code CLEAR_VARS}
300  variable.</li>
301<li>Assign values to the variables used to describe the module.
302<li>Set the NDK build system to use the appropriate build script for the module, using the
303  {@code BUILD_XXX} variable.</li>
304</ol>
305</ul>
306
307<h4>LOCAL_PATH</h4>
308<p>This variable is used to give the path of the current file. You must define
309it at the start of your {@code Android.mk} file. The following example shows how to do so:</p>
310
311<pre class="no-pretty-print">
312LOCAL_PATH := $(call my-dir)
313</pre>
314
315<p>The script to which {@code CLEAR_VARS} points does not clear this variable. Therefore, you only need
316to define it a single time, even if your {@code Android.mk} file describes multiple modules.</p>
317
318<h4>LOCAL_MODULE</h4>
319<p>This variable stores the name of your module. It must be unique among all module names,
320and must not contain any spaces. You must define it before including any scripts (other than
321the one for {@code CLEAR_VARS}). You need not add either the {@code lib} prefix
322or the {@code .so} or {@code .a} file extension; the build system makes these modifications
323automatically. Throughout your {@code Android.mk} and
324<a href="{@docRoot}ndk/guides/application_mk.html">{@code Application.mk}</a> files, refer to
325your module by its unmodified name. For example, the following line results in the generation of a
326shared library module called {@code libfoo.so}:</p>
327
328<pre class="no-pretty-print">
329LOCAL_MODULE := "foo"
330</pre>
331
332<p>If you want the generated module to have a name other than {@code lib} + the value of
333{@code LOCAL_MODULE}, you can use the {@code LOCAL_MODULE_FILENAME} variable to give the
334generated module a name of your own choosing, instead.</p>
335
336<h4>LOCAL_MODULE_FILENAME</h4>
337<p>This optional variable allows you to override the names that the build system
338uses by default for files that it generates. For example, if the name of your {@code LOCAL_MODULE}
339is {@code foo}, you can force the system to call the file it generates {@code libnewfoo}. The
340following example shows how to accomplish this:</p>
341
342<pre class="no-pretty-print">
343LOCAL_MODULE := foo
344LOCAL_MODULE_FILENAME := libnewfoo
345</pre>
346
347<p>For a shared library module, this example would generate a file called {@code libnewfoo.so}.</p>
348
349<p class="note"><strong>Note:</strong> You cannot override filepath or file extension.</p>
350
351<h4>LOCAL_SRC_FILES</h4>
352<p>This variable contains the list of source files that the build system uses to generate the
353module. Only list the files that the build system actually passes to the compiler, since the build
354system automatically computes any associated depencies.</p>
355<p>Note that you can use both relative (to {@code LOCAL_PATH}) and absolute file paths.
356
357<p>We recommend avoiding absolute file paths; relative paths make your {@code Android.mk} file more
358portable.</p>
359
360<p class="note"><strong>Note: </strong> Always use Unix-style forward slashes (/) in build files.
361The build system does not handle Windows-style backslashes (\) properly.</p>
362
363<h4>LOCAL_CPP_EXTENSION</h4>
364<p>You can use this optional variable to indicate a file extension other than {@code .cpp} for your
365C++ source files. For example, the following line changes the extension to {@code .cxx}.
366(The setting must include the dot.)
367
368<pre class="no-pretty-print">
369LOCAL_CPP_EXTENSION := .cxx
370</pre>
371
372<p>From NDK r7, you can use this variable to specify multiple extensions. For instance:</p>
373
374<pre class="no-pretty-print">
375LOCAL_CPP_EXTENSION := .cxx .cpp .cc
376</pre>
377
378<h4>LOCAL_CPP_FEATURES</h4>
379
380<p>You can use this optional variable to indicate that your code relies on specific C++ features.
381It enables the right compiler and linker flags during the build process. For prebuilt binaries,
382this variable also declares which features the binary depends on, thus helping ensure the final
383linking works correctly. We recommend that you use this variable instead of enabling
384{@code -frtti} and {@code -fexceptions} directly in your {@code LOCAL_CPPFLAGS} definition.</p>
385
386<p>Using this variable allows the build system to use the appropriate flags for each module. Using
387{@code LOCAL_CPPFLAGS} causes the compiler to use all specified flags for all modules, regardless
388of actual need.</p>
389
390For example, to indicate that your code uses RTTI (RunTime Type Information), write: </p>
391
392<pre class="no-pretty-print">
393LOCAL_CPP_FEATURES := rtti
394</pre>
395
396<p>To indicate that your code uses C++ exceptions, write:</p>
397
398<pre class="no-pretty-print">
399LOCAL_CPP_FEATURES := exceptions
400</pre>
401
402<p>You can also specify multiple values for this variable. For example:</p>
403
404<pre class="no-pretty-print">
405LOCAL_CPP_FEATURES := rtti features
406</pre>
407
408The order in which you describe the values does not matter.
409
410
411<h4>LOCAL_C_INCLUDES</h4>
412<p>You can use this optional variable to specify a list of paths, relative to the
413NDK {@code root} directory, to add to the include search path when compiling all sources
414(C, C++ and Assembly). For example: </p>
415
416<pre class="no-pretty-print">
417LOCAL_C_INCLUDES := sources/foo
418</pre>
419
420<p>Or even: </p>
421
422<pre class="no-pretty-print">
423LOCAL_C_INCLUDES := $(LOCAL_PATH)/<subdirectory>/foo
424</pre>
425
426<p>Define this variable before setting any corresponding inclusion flags via {@code LOCAL_CFLAGS}
427or {@code LOCAL_CPPFLAGS}.</p>
428
429<p>The build system also uses {@code LOCAL_C_INCLUDES} paths automatically when launching native
430debugging with ndk-gdb.</p>
431
432
433<h4>LOCAL_CFLAGS</h4>
434
435<p>This optional variable sets compiler flags for the build system to pass when building C
436<em>and</em> C++ source files. The ability to do so can be useful for specifying additional macro
437definitions or compile options.</p>
438
439<p>Try not to change the optimization/debugging level in your {@code Android.mk} file.
440The build system can handle this setting automatically for you, using the relevant information
441in the <a href="{@docRoot}ndk/guides/application_mk.html">{@code Application.mk}</a> file. Doing it
442this way allows the build system to generate useful data files used during debugging.</p>
443
444<p class="note"><strong>Note: </strong>In android-ndk-1.5_r1, the corresponding flags only applied
445to C source files, not C++ ones. They now match the full Android build system behavior.
446(You can now use {@code LOCAL_CPPFLAGS} to specify flags for C++ sources only.)</p>
447
448<p>It is possible to specify additional include paths by writing:
449
450<pre class="no-pretty-print">
451LOCAL_CFLAGS += -I&lt;path&gt;,
452</pre>
453
454It is better, however, to use {@code LOCAL_C_INCLUDES} for this purpose, since
455doing so also makes it possible to use the paths available for native debugging with ndk-gdb.</p>
456
457
458<h4>LOCAL_CPPFLAGS</h4>
459<p>An optional set of compiler flags that will be passed when building C++
460source files <em>only</em>. They will appear after the LOCAL_CFLAGS on the
461compiler's command-line.</p>
462
463
464<p class="note"><strong>Note: </strong>In android-ndk-1.5_r1, the corresponding flags applied to
465both C and C++ sources. This has been corrected to match the full Android build system.
466To specify flags for both C and C++ sources, use {@code LOCAL_CFLAGS}.</p>
467
468
469<h4>LOCAL_STATIC_LIBRARIES</h4>
470
471<p>This variable stores the list of static libraries modules on which the current module depends.</p>
472
473<p>If the current module is a shared library or an executable, this variable will force
474these libraries to be linked into the resulting binary.</p>
475
476<p>If the current module is a static library, this variable simply indicates that other
477modules depending on the current one will also depend on the listed
478libraries.</p>
479
480<h4>LOCAL_SHARED_LIBRARIES</h4>
481
482<p>This variable is the list of shared libraries <em>modules</em> on which this module depends at
483runtime. This information is necessary at link time, and to embed the corresponding information
484in the generated file.</p>
485
486<h4>LOCAL_WHOLE_STATIC_LIBRARIES</h4>
487<p>This variable is a variant of {@code LOCAL_STATIC_LIBRARIES}, and expresses that the linker
488should treat the associated library modules as <em>whole archives</em>. For more information
489on whole archives, see the GNU linker's
490<a href="http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_3.html">documentation</a> for the
491{@code --whole-archive} flag.</p>
492
493<p>This variable is useful when there are circular dependencies among
494several static libraries. When you use this variable to build a shared library, it will force
495the build system to add all object files from your static libraries to the final binary. The same
496is not true, however, when generating executables.</p>
497
498
499<h4>LOCAL_LDLIBS</h4>
500
501<p>This variable contains the list of additional linker flags for use in building your shared
502library or executable. It enables you to use the {@code -l} prefix to pass the name of specific
503system libraries. For example, the following example tells the linker to generate a module that
504links to {@code /system/lib/libz.so} at load time: </p>
505
506<pre class="no-pretty-print">
507LOCAL_LDLIBS := -lz
508</pre>
509
510<p>For the list of exposed system libraries against which you can link in this NDK release, see
511<a href="stable_apis.html">Android NDK Native APIs</a>.</p>
512
513<p class="note"><strong>Note: </strong> If you define this variable for a static library,
514the build system ignores it, and {@code ndk-build} prints a warning.</p>
515
516<h4>LOCAL_LDFLAGS</h4>
517
518<p>The list of other linker flags for the build system to use when building your shared library
519or executable. For example, the following example uses the {@code ld.bfd} linker on ARM/X86 GCC
5204.6+, on which {@code ld.gold} is the default </p>
521
522<pre class="no-pretty-print">
523LOCAL_LDFLAGS += -fuse-ld=bfd
524</pre>
525
526<p class="note"><strong>Note: </strong>If you define this variable for a static library, the build
527system ignores it, and ndk-build prints a warning.</p>
528
529<h4>LOCAL_ALLOW_UNDEFINED_SYMBOLS</h4>
530
531<p>By default, when the build system encounters an undefined reference encountered while trying to
532build a shared, it will throw an <em>undefined symbol</em> error. This error can help you catch
533catch bugs in your source code.</p>
534
535<p>To disable this check, set this variable to {@code true}. Note that this setting may cause the
536shared library to load at runtime.</p>
537
538<p class="note"><strong>Note: </strong> If you define this variable for a static library,
539the build system ignores it, and ndk-build prints a warning.</p>
540
541<h4>LOCAL_ARM_MODE</h4
542>
543<p>By default, the build system generates ARM target binaries in <em>thumb</em> mode, where each
544instruction is 16 bits wide and linked with the STL libraries in the {@code thumb/} directory.
545Defining this variable as {@code arm} forces the build system to generate the module's object
546files in 32-bit {@code arm} mode. The following example shows how to do this:</p>
547
548<pre class="no-pretty-print">
549LOCAL_ARM_MODE := arm
550</pre>
551
552<p>You can also instruct the build system to only build specific sources in {@code arm} mode by
553appending {@code .arm} suffix to the the source filenames. For example, the following example
554tells the build system to always compile {@code bar.c} in ARM mode, but to build
555{@code foo.c} according to the value of {@code LOCAL_ARM_MODE}.</p>
556
557<pre class="no-pretty-print">
558LOCAL_SRC_FILES := foo.c bar.c.arm
559</pre>
560
561<p></p>
562
563<p class="note"><strong>Note: </strong> You can also force the build system to generate ARM binaries
564by setting {@code APP_OPTIM} in your
565<a href="{@docRoot}ndk/guides/application_mk.html">{@code Application.mk}</a> file to {@code debug}.
566Specifying {@code debug} forces an ARM build because the toolchain debugger does not handle Thumb
567code properly.</p>
568
569
570<h4>LOCAL_ARM_NEON</h4>
571<p>This variable only matters when you are targeting the {@code armeabi-v7a} ABI. It allows the
572use of ARM Advanced SIMD (NEON) GCC intrinsics in your C and C++ sources, as well as NEON
573instructions in Assembly files.</p>
574
575<p>Note that not all ARMv7-based CPUs support the NEON instruction set extensions. For this reason,
576you must perform runtime detection to be able to safely use this code at runtime. For more
577information, see <a href="{@docRoot}ndk/guides/cpu-arm-neon.html">NEON Support</a> and <a
578href="{@docRoot}ndk/guides/cpu-features.html">The {@code cpufeatures} Library</a>.</p>
579
580<p>Alternatively, you can use the {@code .neon} suffix to specify that the build system only
581compile specific source files with NEON support. In the following example, the build system compiles
582{@code foo.c} with thumb and neon support, {@code bar.c} with thumb support, and
583{@code zoo.c} with support for ARM and NEON:</p>
584
585<pre class="no-pretty-print">
586LOCAL_SRC_FILES = foo.c.neon bar.c zoo.c.arm.neon
587</pre>
588
589
590<p>If you use both suffixes, {@code .arm} must precede {@code .neon}.</p>
591
592<h4>LOCAL_DISABLE_NO_EXECUTE</h4>
593
594<p>Android NDK r4 added support for the "NX bit" security feature. It is
595enabled by default, but you can disable it by setting this variable to {@code true}. We do not
596recommend doing so without a compelling reason.</p>
597
598<p>This feature does not modify the ABI, and is only enabled on kernels
599targeting ARMv6+ CPU devices. Machine code with this feature enabled
600will run unmodified on devices running earlier CPU architectures.</p>
601<p>For more information, see <a href="http://en.wikipedia.org/wiki/NX_bit">Wikipedia: NX bit</a>
602and <a href="http://www.gentoo.org/proj/en/hardened/gnu-stack.xml">The GNU stack kickstart</a>.
603
604<h4>LOCAL_DISABLE_RELRO</h4>
605
606<p>By default, the NDK compiles code with read-only relocations and GOT
607protection. This variable instructs the runtime linker to mark certain regions of memory
608as read-only after relocation, making certain security exploits (such as GOT overwrites)
609more difficult. Note that these protections are only effective on Android API level 16 and higher.
610On lower API levels, the code will still run, but without memory protections.</p>
611
612<p>This variable is turned on by default, but you can disable it by setting its value to
613{@code true}. We do not recommend doing so without a compelling reason.</p>
614
615<p>For more information, see
616<a href="http://isisblogs.poly.edu/2011/06/01/relro-relocation-read-only/">RELRO:
617RELocation Read-Only</a> and <a href="http://www.akkadia.org/drepper/nonselsec.pdf">Security
618enhancements in RedHat Enterprise Linux (section 6)</a>.</p>
619
620<h4>LOCAL_DISABLE_FORMAT_STRING_CHECKS</h4>
621
622<p>By default, the build system compiles code with format string protection. Doing so forces a
623compiler error if a non-constant format string is used in a {@code printf}-style function.</p>
624<p>This protection is on by default, but you can disable it by setting the value of
625this variable to {@code true}. We do not recommend doing so without a compelling reason.</p>
626
627
628<h4>LOCAL_EXPORT_CFLAGS</h4>
629
630<p>This variable records a set of C/C++ compiler flags to add to the {@code LOCAL_CFLAGS} definition
631of any other module that uses this one via the {@code LOCAL_STATIC_LIBRARIES} or
632{@code LOCAL_SHARED_LIBRARIES} variables.</p>
633
634<p>For example, consider the following pair of modules: {@code foo} and {@code bar}, which depends
635on {@code foo}:</p>
636
637<pre class="no-pretty-print">
638include $(CLEAR_VARS)
639LOCAL_MODULE := foo
640LOCAL_SRC_FILES := foo/foo.c
641LOCAL_EXPORT_CFLAGS := -DFOO=1
642include $(BUILD_STATIC_LIBRARY)
643
644
645include $(CLEAR_VARS)
646LOCAL_MODULE := bar
647LOCAL_SRC_FILES := bar.c
648LOCAL_CFLAGS := -DBAR=2
649LOCAL_STATIC_LIBRARIES := foo
650include $(BUILD_SHARED_LIBRARY)
651</pre>
652
653<p>Here, the build system passes the flags {@code -DFOO=1} and {@code -DBAR=2} to the compiler when
654building {@code bar.c}. It also prepends exported flags to your your module's {@code LOCAL_CFLAGS}
655so you can easily override them.</p>
656
657In addition, the relationship among modules is transitive: If {@code zoo} depends on
658{@code bar}, which in turn depends on {@code foo}, then {@code zoo} also inherits all flags
659exported from {@code foo}.</p>
660
661<p>Finally, the build system does not use exported flags when building locally (i.e., building the
662module whose flags it is exporting). Thus, in the example above, it does not pass {@code -DFOO=1}
663to the compiler when building {@code foo/foo.c}. To build locally, use {@code LOCAL_CFLAGS}
664instead.</p>
665
666<h4>LOCAL_EXPORT_CPPFLAGS</h4>
667<p>This variable is the same as {@code LOCAL_EXPORT_CFLAGS}, but for C++ flags only.</p>
668
669<h4>LOCAL_EXPORT_C_INCLUDES</h4>
670<p>This variable is the same as {@code LOCAL_EXPORT_CFLAGS}, but for C include paths. It is useful
671in cases where, for example, {@code bar.c} needs to include headers from module {@code foo}.</p>
672
673<h4>LOCAL_EXPORT_LDFLAGS</h4>
674<p>This variable is the same as {@code LOCAL_EXPORT_CFLAGS}, but for linker flags.</p>
675
676<h4>LOCAL_EXPORT_LDLIBS</h4>
677<p>This variable is the same as {@code LOCAL_EXPORT_CFLAGS}, telling the build system to pass names
678of specific system libraries to the compiler. Prepend {@code -l} to the name of each library you
679specify.</p>
680
681<p>Note that the build system appends imported linker flags to the value of your module's
682{@code LOCAL_LDLIBS} variable. It does this due to the way Unix linkers work.</p>
683
684<p>This variable is typically useful when module {@code foo} is a static library
685and has code that depends on a system library. You can then use {@code LOCAL_EXPORT_LDLIBS} to
686to export the dependency. For example: </p>
687
688<pre class="no-pretty-print">
689include $(CLEAR_VARS)
690LOCAL_MODULE := foo
691LOCAL_SRC_FILES := foo/foo.c
692LOCAL_EXPORT_LDLIBS := -llog
693include $(BUILD_STATIC_LIBRARY)
694
695include $(CLEAR_VARS)
696LOCAL_MODULE := bar
697LOCAL_SRC_FILES := bar.c
698LOCAL_STATIC_LIBRARIES := foo
699include $(BUILD_SHARED_LIBRARY)
700</pre>
701
702<p>In this example, the build system puts {@code -llog} at the end of the linker command when it
703builds {@code libbar.so}. Doing so tells the linker that, because {@code libbar.so} depends
704on {@code foo}, it also depends on the system logging library.</p>
705
706<h4>LOCAL_SHORT_COMMANDS</h4>
707<p>Set this variable to {@code true} when your module has a very high
708number of sources and/or dependent static or shared libraries. Doing so forces the
709build system to use {@code @} syntax for archives containing intermediate object files
710or linking libraries.</p>
711
712<p>This feature can be useful on Windows, where the command line accepts a maximum of only
713of 8191 characters, which can be too small for complex projects. It also impacts the compilation of
714individual source files, placing nearly all compiler flags inside list files, too.</p>
715
716<p>Note that any value other than {@code true} will revert to the
717default behaviour. You can also define {@code APP_SHORT_COMMANDS} in your
718<a href="{@docRoot}ndk/guides/application_mk.html">{@code Application.mk}</a> file to force this
719behavior for all modules in your project.</p>
720
721<p>We do not recommend enabling this feature by default, since it makes the build slower.</p>
722
723
724<h4>LOCAL_THIN_ARCHIVE</h4>
725
726<p>Set this variable to {@code true} when building static libraries.
727Doing so will generate a <strong>thin archive</strong>, a library file that does not contain
728object files, but instead just file paths to the actual objects that it would normally
729contain.</p>
730<p>This is useful to reduce the size of your build output. The drawback is that
731such libraries <em>cannot</em> be moved to a different location (all paths
732inside them are relative).</p>
733<p>Valid values are {@code true}, {@code false} or empty. A
734default value can be set in your <a href="{@docRoot}ndk/guides/application_mk.html">
735{@code Application.mk}</a> file through the {@code APP_THIN_ARCHIVE}
736
737variable.</p>
738<p class="note"><strong>Note:</strong> This is ignored for non-static library modules, or prebuilt
739static library ones.</p>
740
741<h4>LOCAL_FILTER_ASM</h4>
742<p>Define this variable as a shell command that the build system will use to filter the
743assembly files extracted or generated from the files you specified for {@code LOCAL_SRC_FILES}.</p>
744<p>Defining this variable causes the following things to occur:</p>
745
746<ul>
747<ol type = "1">
748<li>The build system generates a temporary assembly file from any C or C++ source file, instead of compiling them into an object file.</li>
749<li>The build system executes the shell command in {@code LOCAL_FILTER_ASM}
750on any temporary assembly file and on any assembly file
751listed in {@code LOCAL_SRC_FILES}, thus generating another temporary assembly
752file.</li>
753<li>The build system compiles these filtered assembly files into an object file.</li>
754</ol>
755</ul>
756<p>For example:</p>
757
758<pre class="no-pretty-print">
759LOCAL_SRC_FILES  := foo.c bar.S
760LOCAL_FILTER_ASM :=
761
762foo.c --1--&gt; $OBJS_DIR/foo.S.original --2--&gt; $OBJS_DIR/foo.S --3--&gt; $OBJS_DIR/foo.o
763bar.S                                 --2--&gt; $OBJS_DIR/bar.S --3--&gt; $OBJS_DIR/bar.o
764</pre>
765
766<p>"1" corresponds to the compiler, "2" to the filter, and "3" to the assembler. The filter must
767be a standalone shell command that takes the name of the input file as its first argument, and the
768name of the output file as the second one. For example:</p>
769
770<pre class="no-pretty-print">
771myasmfilter $OBJS_DIR/foo.S.original $OBJS_DIR/foo.S
772myasmfilter bar.S $OBJS_DIR/bar.S
773</pre>
774
775<h3 id="npfm">NDK-provided function macros</h2>
776<p>This section explains GNU Make function macros that the NDK provides. Use
777{@code $(call &lt;function&gt;)} to evaluate them; they return textual information.</p>
778
779<h4>my-dir</h4>
780
781<p>This macro returns the path of the last included makefile, which typically is the
782current {@code Android.mk}'s directory. {@code my-dir} is useful for defining
783{@code LOCAL_PATH} at the start of your {@code Android.mk} file. For example:</p>
784
785<pre class="no-pretty-print">
786LOCAL_PATH := $(call my-dir)
787</pre>
788
789<p>Due to the way GNU Make works, what this macro really returns is the
790path of the last makefile that the build system included when parsing the build scripts. For this
791reason, you should not call {@code my-dir} after including another file.</p>
792
793<p>For example, consider the following example: </p>
794
795<pre class="no-pretty-print">
796LOCAL_PATH := $(call my-dir)
797
798# ... declare one module
799
800include $(LOCAL_PATH)/foo/`Android.mk`
801
802LOCAL_PATH := $(call my-dir)
803
804# ... declare another module
805</pre>
806
807<p>The problem here is that the second call to {@code my-dir} defines
808{@code LOCAL_PATH} as {@code $PATH/foo} instead of {@code $PATH}, because that was where its
809most recent include pointed.</p>
810
811<p>You can avoid this problem by putting additional includes after everything
812else in the {@code Android.mk} file. For example:</p>
813
814<pre class="no-pretty-print">
815LOCAL_PATH := $(call my-dir)
816
817# ... declare one module
818
819LOCAL_PATH := $(call my-dir)
820
821# ... declare another module
822
823# extra includes at the end of the Android.mk file
824include $(LOCAL_PATH)/foo/Android.mk
825
826</pre>
827
828<p>If it is not feasible to structure the file in this way, save the value of the first
829{@code my-dir} call into another variable. For example: </p>
830
831<pre class="no-pretty-print">
832MY_LOCAL_PATH := $(call my-dir)
833
834LOCAL_PATH := $(MY_LOCAL_PATH)
835
836# ... declare one module
837
838include $(LOCAL_PATH)/foo/`Android.mk`
839
840LOCAL_PATH := $(MY_LOCAL_PATH)
841
842# ... declare another module
843</pre>
844
845<h4>all-subdir-makefiles</h4>
846
847<p>Returns the list of {@code Android.mk} files located in all subdirectories of
848the current {@code my-dir} path.
849
850<p>You can use this function to provide deep-nested source directory hierarchies to the build
851system. By default, the NDK only looks for files in the directory containing the
852{@code Android.mk} file.</p>
853
854<h4>this-makefile</h4>
855<p>Returns the path of the current makefile (from which the build system called the function).</p>
856
857<h4>parent-makefile</h4>
858<p>Returns the path of the parent makefile in the inclusion tree (the path of the makefile that
859included the current one).</p>
860
861<h4>grand-parent-makefile</h4>
862<p>Returns the path of the grandparent makefile in the inclusion tree (the path of the makefile that
863included the current one).</p>
864
865<h4>import-module</h4>
866<p>A function that allows you to find and include a module's {@code Android.mk} file by the name of
867the module. A typical example is as follows: </p>
868
869<pre class="no-pretty-print">
870$(call import-module,&lt;name&gt;)
871</pre>
872
873<p>In this example, the build system looks for the module tagged {@code &lt;name&gt;} in the list of
874directories referenced that your {@code NDK_MODULE_PATH} environment variable references, and
875includes its {@code Android.mk} file automatically for you.</p>