| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 1 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" | 
 | 2 |  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | 
 | 3 |  | 
 | 4 | <html xmlns="http://www.w3.org/1999/xhtml"> | 
 | 5 |  | 
 | 6 | <!-- | 
 | 7 |   A lot of people read this document template.  Please keep it clean: | 
 | 8 |  | 
 | 9 |    - keep the document xhtml-compliant, as many people use validating editors | 
 | 10 |    - check your edits for typos, spelling errors, and questionable grammar | 
 | 11 |    - prefer css styles to formatting tags like <font>, <tt>, etc. | 
 | 12 |    - keep it human-readable and human-editable in a plain text editor: | 
 | 13 |      - strive to keep lines wrapped at 80 columns, unless a link prevents it | 
 | 14 |      - use plenty of whitespace | 
 | 15 |      - try to pretty-format (wrt nesting and indenting) any hairy html | 
 | 16 |    - check your inline javascript for errors using the javascript console | 
 | 17 |     | 
 | 18 |   Your readers will be very appreciative. | 
 | 19 | --> | 
 | 20 |  | 
 | 21 | <head> | 
 | 22 |   <title>Android Build System</title> | 
 | 23 |  | 
 | 24 |   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | 
 | 25 |  | 
 | 26 |   <link href="../android.css" type="text/css" rel="stylesheet" /> | 
 | 27 |  | 
 | 28 | <!-- commenting out so the xhtml validator doesn't whine about < and &&; | 
 | 29 |      the browser should still find the script tag. --> | 
 | 30 | <script language="JavaScript1.2" type="text/javascript"> | 
 | 31 | <!-- | 
 | 32 | function highlight(name) { | 
 | 33 |   if (document.getElementsByTagName) { | 
 | 34 |     tags              = [ 'span', 'div', 'tr', 'td' ]; | 
 | 35 |     for (i in tags) { | 
 | 36 |       elements        = document.getElementsByTagName(tags[i]); | 
 | 37 |       if (elements) { | 
 | 38 |         for (j = 0; j < elements.length; j++) { | 
 | 39 |           elementName = elements[j].getAttribute("class"); | 
 | 40 |           if (elementName == name) { | 
 | 41 |             elements[j].style.backgroundColor = "#C0F0C0"; | 
 | 42 |           } else if (elementName && elementName.indexOf("rev") == 0) { | 
 | 43 |             elements[j].style.backgroundColor = "#FFFFFF"; | 
 | 44 |           } | 
 | 45 |         } | 
 | 46 |       } | 
 | 47 |     } | 
 | 48 |   } | 
 | 49 | } | 
 | 50 | //--> | 
 | 51 |   </script> | 
 | 52 |   <!-- this style sheet is for the style of the toc --> | 
 | 53 |   <link href="toc.css" type="text/css" rel="stylesheet" /> | 
 | 54 |  | 
 | 55 |   <style type="text/css"> | 
 | 56 |     .warning { | 
 | 57 |         border: 1px solid red; | 
 | 58 |         padding: 8px; | 
 | 59 |         color: red; | 
 | 60 |     } | 
 | 61 |     pre.prettyprint { | 
 | 62 |         margin-top: 0; | 
 | 63 |     } | 
 | 64 |     li { | 
 | 65 |         margin-top: 8px; | 
 | 66 |     } | 
 | 67 |   </style> | 
 | 68 | </head> | 
 | 69 |  | 
 | 70 | <body onload="prettyPrint()"> | 
 | 71 |  | 
 | 72 | <h1><a name="My_Project_" />Android Build System</h1> | 
 | 73 |  | 
 | 74 | <!-- Status is one of: Draft, Current, Needs Update, Obsolete --> | 
 | 75 | <p style="text-align:center"> | 
 | 76 |   <strong>Status:</strong> <em>Draft </em>   | 
 | 77 |   <small>(as of May 18, 2006)</small> | 
 | 78 | </p> | 
 | 79 |  | 
 | 80 | <p><b>Contents</b></p> | 
 | 81 | <!-- this div expands out to a list of contents based on the H2 and H3 headings. | 
 | 82 | Believe it! --> | 
 | 83 |  <div id="nav"  class="nav-2-levels"></div> | 
 | 84 |  | 
 | 85 | <h2>Objective</h2> | 
 | 86 | <p>The primary goals of reworking the build system are (1) to make dependencies | 
 | 87 | work more reliably, so that when files need to rebuilt, they are, and (2) to | 
 | 88 | improve performance of the build system so that unnecessary modules are not | 
 | 89 | rebuilt, and so doing a top-level build when little or nothing needs to be done | 
 | 90 | for a build takes as little time as possible.</p> | 
 | 91 |  | 
 | 92 | <h2>Principles and Use Cases and Policy</h2> | 
 | 93 | <p>Given the above objective, these are the overall principles and use cases | 
 | 94 | that we will support.  This is not an exhaustive list.</p> | 
 | 95 | <h3>Multiple Targets</h3> | 
 | 96 | <p>It needs to be possible to build the Android platform for multiple targets. | 
 | 97 | This means:</p> | 
 | 98 | <ul> | 
 | 99 |     <li>The build system will support building tools for the host platform, | 
 | 100 |     both ones that are used in the build process itself, and developer tools | 
 | 101 |     like the simulator.</li> | 
 | 102 |     <li>The build system will need to be able to build tools on Linux | 
 | 103 |     (definitely Goobuntu and maybe Grhat), MacOS, and to some degree on | 
 | 104 |     Windows.</li> | 
 | 105 |     <li>The build system will need to be able to build the OS on Linux, and in | 
 | 106 |     the short-term, MacOS.  Note that this is a conscious decision to stop | 
 | 107 |     building the OS on Windows.  We are going to rely on the emulator there | 
 | 108 |     and not attempt to use the simulator.  This is a requirement change now | 
 | 109 |     that the emulator story is looking brighter.</li> | 
 | 110 | </ul> | 
 | 111 | <h3>Non-Recursive Make</h3> | 
 | 112 | <p>To achieve the objectives, the build system will be rewritten to use make | 
 | 113 | non-recursively.  For more background on this, read <a href="http://aegis.sourceforge.net/auug97.pdf">Recursive Make Considered Harmful</a>.  For those that don't | 
 | 114 | want PDF, here is the | 
 | 115 | <a href="http://72.14.203.104/search?q=cache:HwuX7YF2uBIJ:aegis.sourceforge.net/auug97.pdf&hl=en&gl=us&ct=clnk&cd=2&client=firefox">Google translated version</a>. | 
 | 116 | <h3>Rapid Compile-Test Cycles</h3> | 
 | 117 | <p>When developing a component, for example a C++ shared library, it must be | 
 | 118 | possible to easily rebuild just that component, and not have to wait more than a | 
 | 119 | couple seconds for dependency checks, and not have to wait for unneeded | 
 | 120 | components to be built.</p> | 
 | 121 | <h3>Both Environment and Config File Based Settings</h3> | 
 | 122 | <p>To set the target, and other options, some people on the team like to have a | 
 | 123 | configuration file in a directory so they do not have an environment setup | 
 | 124 | script to run, and others want an environment setup script to run so they can | 
 | 125 | run builds in different terminals on the same tree, or switch back and forth | 
 | 126 | in one terminal.  We will support both.</p> | 
 | 127 | <h3>Object File Directory / make clean</h3> | 
 | 128 | <p>Object files and other intermediate files will be generated into a directory | 
 | 129 | that is separate from the source tree.  The goal is to have make clean be | 
 | 130 | "rm -rf <obj>" in the tree root directory.  The primary goals of | 
 | 131 | this are to simplify searching the source tree, and to make "make clean" more | 
 | 132 | reliable.</p> | 
 | 133 |  | 
 | 134 | <h3>SDK</h3> | 
 | 135 | <p>The SDK will be a tarball that will allow non-OS-developers to write apps. | 
 | 136 | The apps will actually be built by first building the SDK, and then building | 
 | 137 | the apps against that SDK.  This will hopefully (1) make writing apps easier | 
 | 138 | for us, because we won't have to rebuild the OS as much, and we can use the | 
 | 139 | standard java-app development tools, and (2) allow us to dog-food the SDK, to | 
 | 140 | help ensure its quality.  Cedric has suggested (and I agree) that apps built | 
 | 141 | from the SDK should be built with ant.  Stay tuned for more details as we | 
 | 142 | figure out exactly how this will work.</p> | 
 | 143 |  | 
 | 144 | <h3>Dependecies</h3> | 
 | 145 | <p>Dependencies should all be automatic.  Unless there is a custom tool involved | 
 | 146 | (e.g. the webkit has several), the dependencies for shared and static libraries, | 
 | 147 | .c, .cpp, .h, .java, java libraries, etc., should all work without intervention | 
 | 148 | in the Android.mk file.</p> | 
 | 149 |  | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 150 | <h3>Wildcard source files</h3> | 
 | 151 | <p>Wildcarding source file will be discouraged.  It may be useful in some | 
 | 152 | scenarios.  The default <code>$(wildcard *)</code> will not work due to the | 
 | 153 | current directory being set to the root of the build tree.<p> | 
 | 154 |  | 
 | 155 | <h3>Multiple targets in one directory</h3> | 
 | 156 | <p>It will be possible to generate more than one target from a given | 
 | 157 | subdirectory.  For example, libutils generates a shared library for the target | 
 | 158 | and a static library for the host.</p> | 
 | 159 |  | 
 | 160 | <h3>Makefile fragments for modules</h3> | 
 | 161 | <p><b>Android.mk</b> is the standard name for the makefile fragments that | 
 | 162 | control the building of a given module.  Only the top directory should | 
 | 163 | have a file named "Makefile".</p> | 
 | 164 |  | 
 | 165 | <h3>Use shared libraries</h3> | 
 | 166 | <p>Currently, the simulator is not built to use shared libraries.  This should | 
 | 167 | be fixed, and now is a good time to do it.  This implies getting shared | 
 | 168 | libraries to work on Mac OS.</p> | 
 | 169 |  | 
 | 170 |  | 
 | 171 | <h2>Nice to Have</h2> | 
 | 172 |  | 
 | 173 | <p>These things would be nice to have, and this is a good place to record them, | 
 | 174 | however these are not promises.</p> | 
 | 175 |  | 
 | 176 | <h3>Simultaneous Builds</h3> | 
 | 177 | <p>The hope is to be able to do two builds for different combos in the same | 
 | 178 | tree at the same time, but this is a stretch goal, not a requirement. | 
 | 179 | Doing two builds in the same tree, not at the same time must work.  (update: | 
 | 180 | it's looking like we'll get the two builds at the same time working)</p> | 
 | 181 |  | 
 | 182 | <h3>Deleting headers (or other dependecies)</h3> | 
 | 183 | <p>Problems can arise if you delete a header file that is referenced in | 
 | 184 | ".d" files.  The easy way to deal with this is "make clean".  There | 
 | 185 | should be a better way to handle it. (from fadden)</p> | 
 | 186 | <p>One way of solving this is introducing a dependency on the directory.  The | 
 | 187 | problem is that this can create extra dependecies and slow down the build. | 
 | 188 | It's a tradeoff.</p> | 
 | 189 |  | 
 | 190 | <h3>Multiple builds</h3> | 
 | 191 | <p>General way to perform builds across the set of known platforms.  This | 
 | 192 | would make it easy to perform multiple platform builds when testing a | 
 | 193 | change, and allow a wide-scale "make clean".  Right now the buildspec.mk | 
 | 194 | or environment variables need to be updated before each build. (from fadden)</p> | 
 | 195 |  | 
 | 196 | <h3>Aftermarket Locales and Carrier</h3> | 
 | 197 | <p>We will eventually need to add support for creating locales and carrier | 
 | 198 | customizations to the SDK, but that will not be addressed right now.</p> | 
 | 199 |  | 
 | 200 |  | 
 | 201 | <h2><a id="usage"/>Usage</h2> | 
 | 202 | <p>You've read (or scrolled past) all of the motivations for this build system, | 
 | 203 | and you want to know how to use it.  This is the place.</p> | 
 | 204 |  | 
 | 205 | <h3>Your first build</h3> | 
 | 206 | <p>The <a href="../building.html">Building</a> document describes how do do | 
 | 207 | builds.</p> | 
 | 208 |  | 
 | 209 | <h3>build/envsetup.sh functions</h3> | 
 | 210 | If you source the file build/envsetup.sh into your bash environment, | 
 | 211 | <code>. build/envsetup.sh</code>you'll get a few helpful shell functions: | 
 | 212 |  | 
 | 213 | <ul> | 
 | 214 | <li><b>printconfig</b> - Prints the current configuration as set by the | 
 | 215 | lunch and choosecombo commands.</li> | 
 | 216 | <li><b>m</b> - Runs <code>make</code> from the top of the tree.  This is | 
 | 217 | useful because you can run make from within subdirectories.  If you have the | 
 | 218 | <code>TOP</code> environment variable set, it uses that.  If you don't, it looks | 
 | 219 | up the tree from the current directory, trying to find the top of the tree.</li> | 
 | 220 | <li><b>croot</b> - <code>cd</code> to the top of the tree.</li> | 
 | 221 | <li><b>sgrep</b> - grep for the regex you provide in all .c, .cpp, .h, .java, | 
 | 222 | and .xml files below the current directory.</li> | 
 | 223 | </ul> | 
 | 224 |  | 
 | 225 | <h3>Build flavors/types</h3> | 
 | 226 | <p> | 
 | 227 | When building for a particular product, it's often useful to have minor | 
 | 228 | variations on what is ultimately the final release build.  These are the | 
 | 229 | currently-defined "flavors" or "types" (we need to settle on a real name | 
 | 230 | for these). | 
 | 231 | </p> | 
 | 232 |  | 
 | 233 | <table border=1> | 
 | 234 | <tr> | 
 | 235 |     <td> | 
 | 236 |         <code>eng<code> | 
 | 237 |     </td> | 
 | 238 |     <td> | 
 | 239 |         This is the default flavor. A plain "<code>make</code>" is the | 
 | 240 |         same as "<code>make eng</code>".  <code>droid</code> is an alias | 
 | 241 |         for <code>eng</code>. | 
 | 242 |         <ul> | 
 | 243 |         <li>Installs modules tagged with: <code>eng</code>, <code>debug</code>, | 
 | 244 |             <code>user</code>, and/or <code>development</code>. | 
 | 245 |         <li>Installs non-APK modules that have no tags specified. | 
 | 246 |         <li>Installs APKs according to the product definition files, in | 
 | 247 |             addition to tagged APKs. | 
 | 248 |         <li><code>ro.secure=0</code> | 
 | 249 |         <li><code>ro.debuggable=1</code> | 
 | 250 |         <li><code>ro.kernel.android.checkjni=1</code> | 
 | 251 |         <li><code>adb</code> is enabled by default. | 
 | 252 |     </td> | 
 | 253 | </tr> | 
 | 254 | <tr> | 
 | 255 |     <td> | 
 | 256 |         <code>user<code> | 
 | 257 |     </td> | 
 | 258 |     <td> | 
 | 259 |         "<code>make user</code>" | 
 | 260 |         <p> | 
 | 261 |         This is the flavor intended to be the final release bits. | 
 | 262 |         <ul> | 
| Elliott Hughes | 32bfd70 | 2013-11-05 11:13:49 -0800 | [diff] [blame] | 263 |         <li>Installs modules tagged with <code>user</code>. | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 264 |         <li>Installs non-APK modules that have no tags specified. | 
 | 265 |         <li>Installs APKs according to the product definition files; tags | 
 | 266 |             are ignored for APK modules. | 
| Daniel Micay | 18a141c | 2015-12-16 16:42:49 -0500 | [diff] [blame] | 267 |         <li><code>ro.adb.secure=1</code> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 268 |         <li><code>ro.secure=1</code> | 
 | 269 |         <li><code>ro.debuggable=0</code> | 
 | 270 |         <li><code>adb</code> is disabled by default. | 
 | 271 |     </td> | 
 | 272 | </tr> | 
 | 273 | <tr> | 
 | 274 |     <td> | 
 | 275 |         <code>userdebug<code> | 
 | 276 |     </td> | 
 | 277 |     <td> | 
 | 278 |         "<code>make userdebug</code>" | 
 | 279 |         <p> | 
 | 280 |         The same as <code>user</code>, except: | 
 | 281 |         <ul> | 
 | 282 |         <li>Also installs modules tagged with <code>debug</code>. | 
 | 283 |         <li><code>ro.debuggable=1</code> | 
 | 284 |         <li><code>adb</code> is enabled by default. | 
 | 285 |     </td> | 
 | 286 | </tr> | 
 | 287 | </table> | 
 | 288 |  | 
 | 289 | <p> | 
 | 290 | If you build one flavor and then want to build another, you should run | 
 | 291 | "<code>make installclean</code>" between the two makes to guarantee that | 
 | 292 | you don't pick up files installed by the previous flavor.  "<code>make | 
 | 293 | clean</code>" will also suffice, but it takes a lot longer. | 
 | 294 | </p> | 
 | 295 |  | 
 | 296 |  | 
 | 297 | <h3>More pseudotargets</h3> | 
 | 298 | <p>Sometimes you want to just build one thing.  The following pseudotargets are | 
 | 299 | there for your convenience:</p> | 
 | 300 |  | 
 | 301 | <ul> | 
 | 302 | <li><b>droid</b> - <code>make droid</code> is the normal build.  This target | 
 | 303 | is here because the default target has to have a name.</li> | 
 | 304 | <li><b>all</b> - <code>make all</code> builds everything <code>make | 
 | 305 | droid</code> does, plus everything whose <code>LOCAL_MODULE_TAGS</code> do not | 
 | 306 | include the "droid" tag.  The build server runs this to make sure | 
 | 307 | that everything that is in the tree and has an Android.mk builds.</li> | 
 | 308 | <li><b>clean-$(LOCAL_MODULE)</b> and <b>clean-$(LOCAL_PACKAGE_NAME)</b> -  | 
 | 309 | Let you selectively clean one target.  For example, you can type | 
 | 310 | <code>make clean-libutils</code> and it will delete libutils.so and all of the | 
 | 311 | intermediate files, or you can type <code>make clean-Home</code> and it will | 
 | 312 | clean just the Home app.</li> | 
 | 313 | <li><b>clean</b> - <code>make clean</code> deletes all of the output and | 
 | 314 | intermediate files for this configuration.  This is the same as <code>rm -rf | 
 | 315 | out/<configuration>/</code></li> | 
 | 316 | <li><b>clobber</b> - <code>make clobber</code> deletes all of the output | 
 | 317 | and intermediate files for all configurations.  This is the same as | 
 | 318 | <code>rm -rf out/</code>.</li> | 
 | 319 | <li><b>dataclean</b> - <code>make dataclean</code> deletes contents of the data  | 
 | 320 | directory inside the current combo directory.  This is especially useful on the | 
 | 321 | simulator and emulator, where the persistent data remains present between  | 
 | 322 | builds.</li> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 323 | <li><b>LOCAL_MODULE</b> - Anything you specify as a <code>LOCAL_MODULE</code> | 
 | 324 | in an Android.mk is made into a pseudotarget.  For example, <code>make | 
 | 325 | runtime</code> might be shorthand for <code>make | 
 | 326 | out/linux-x86-debug/system/bin/runtime</code> (which would work), and | 
 | 327 | <code>make libkjs</code> might be shorthand for <code>make | 
 | 328 | out/linux-x86-debug/system/lib/libkjs.so</code> (which would also work).</li> | 
 | 329 | <li><b>targets</b> - <code>make targets</code> will print a list of all of | 
 | 330 | the LOCAL_MODULE names you can make.</li> | 
 | 331 | </ul> | 
 | 332 |  | 
 | 333 | <h3><a name="templates"/>How to add another component to the build - Android.mk templates</h3> | 
 | 334 | <p>You have a new library, a new app, or a new executable.  For each of the | 
 | 335 | common types of modules, there is a corresponding file in the templates | 
 | 336 | directory.  It will usually be enough to copy one of these, and fill in your | 
 | 337 | own values.  Some of the more esoteric values are not included in the | 
 | 338 | templates, but are instead just documented here, as is the documentation | 
 | 339 | on using custom tools to generate files.</p> | 
 | 340 | <p>Mostly, you can just look for the TODO comments in the templates and do | 
 | 341 | what it says.  Please remember to delete the TODO comments when you're done | 
 | 342 | to keep the files clean.  The templates have minimal documentation in them, | 
 | 343 | because they're going to be copied, and when that gets stale, the copies just | 
 | 344 | won't get updated.  So read on...</p> | 
 | 345 |  | 
 | 346 | <h4>Apps</h4> | 
 | 347 | <p>Use the <code>templates/apps</code> file.</p> | 
 | 348 | <p>This template is pretty self-explanitory.  See the variables below for more | 
 | 349 | details.</p> | 
 | 350 |  | 
 | 351 | <h4>Java Libraries</h4> | 
 | 352 | <p>Use the <code>templates/java_library</code> file.</p> | 
 | 353 | <p>The interesting thing here is the value of LOCAL_MODULE, which becomes | 
 | 354 | the name of the jar file.  (Actually right now, we're not making jar files yet, | 
 | 355 | just directories of .class files,  but the directory is named according to | 
 | 356 | what you put in LOCAL_MODULE).  This name will be what goes in the  | 
 | 357 | LOCAL_JAVA_LIBRARIES variable in modules that depend on your java library.</p> | 
 | 358 |  | 
 | 359 | <h4>C/C++ Executables</h4> | 
 | 360 | <p>Use the <code>templates/executable</code> file, or the | 
 | 361 | <code>templates/executable_host</code> file.</p> | 
 | 362 | <p>This template has a couple extra options that you usually don't need. | 
 | 363 | Please delete the ones you don't need, and remove the TODO comments.  It makes | 
 | 364 | the rest of them easier to read, and you can always refer back to the templates | 
 | 365 | if you need them again later.</p> | 
 | 366 | <p>By default, on the target these are built into /system/bin, and on the | 
 | 367 | host, they're built into <combo>/host/bin.  These can be overridden by setting | 
| Colin Cross | 639c336 | 2014-01-24 19:23:40 -0800 | [diff] [blame] | 368 | <code>LOCAL_MODULE_PATH</code> or <code>LOCAL_MODULE_RELATIVE_PATH</code>.  See | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 369 | <a href="#moving-targets">Putting targets elsewhere</a> | 
 | 370 | for more.</p> | 
 | 371 |  | 
 | 372 | <h4>Shared Libraries</h4> | 
 | 373 | <p>Use the <code>templates/shared_library</code> file, or the | 
 | 374 | <code>templates/shared_library_host</code> file.</p> | 
 | 375 | <p>Remember that on the target, we use shared libraries, and on the host, | 
 | 376 | we use static libraries, since executable size isn't as big an issue, and it | 
 | 377 | simplifies distribution in the SDK.</p> | 
 | 378 |  | 
 | 379 | <h4>Static Libraries</h4> | 
 | 380 | <p>Use the <code>templates/static_library</code> file, or the | 
 | 381 | <code>templates/static_library_host</code> file.</p> | 
 | 382 | <p>Remember that on the target, we use shared libraries, and on the host, | 
 | 383 | we use static libraries, since executable size isn't as big an issue, and it | 
 | 384 | simplifies distribution in the SDK.</p> | 
 | 385 |  | 
 | 386 | <h4><a name="custom-tools"/>Using Custom Tools</h4> | 
 | 387 | <p>If you have a tool that generates source files for you, it's possible | 
 | 388 | to have the build system get the dependencies correct for it.  Here are | 
 | 389 | a couple of examples.  <code>$@</code> is the make built-in variable for | 
 | 390 | "the current target." The <font color=red>red</font> parts are the parts you'll | 
 | 391 | need to change.</p> | 
 | 392 |  | 
 | 393 | <p>You need to put this after you have declared <code>LOCAL_PATH</code> and | 
| Colin Cross | d826264 | 2014-01-24 23:17:21 -0800 | [diff] [blame] | 394 | <code>LOCAL_MODULE</code>, because the <code>$(local-generated-sources-dir)</code> | 
 | 395 | and <code>$(local-host-generated-sources-dir)</code> macros use these variables | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 396 | to determine where to put the files. | 
 | 397 |  | 
 | 398 | <h5>Example 1</h5> | 
 | 399 | <p>Here, there is one generated file, called | 
 | 400 | chartables.c, which doesn't depend on anything.  And is built by the tool | 
 | 401 | built to $(HOST_OUT_EXECUTABLES)/dftables.  Note on the second to last line | 
 | 402 | that a dependency is created on the tool.</p> | 
 | 403 | <pre> | 
| Colin Cross | d826264 | 2014-01-24 23:17:21 -0800 | [diff] [blame] | 404 | intermediates:= $(local-generated-sources-dir) | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 405 | GEN := $(intermediates)/<font color=red>chartables.c</font> | 
 | 406 | $(GEN): PRIVATE_CUSTOM_TOOL = <font color=red>$(HOST_OUT_EXECUTABLES)/dftables $@</font> | 
 | 407 | $(GEN): <font color=red>$(HOST_OUT_EXECUTABLES)/dftables</font> | 
 | 408 | 	$(transform-generated-source) | 
 | 409 | LOCAL_GENERATED_SOURCES += $(GEN) | 
 | 410 | </pre> | 
 | 411 |  | 
 | 412 | <h5>Example 2</h5> | 
 | 413 | <p>Here as a hypothetical example, we use use cat as if it were to transform | 
 | 414 | a file.  Pretend that it does something useful.  Note how we use a | 
 | 415 | target-specific variable called PRIVATE_INPUT_FILE to store the name of the | 
 | 416 | input file.</p> | 
 | 417 | <pre> | 
| Colin Cross | d826264 | 2014-01-24 23:17:21 -0800 | [diff] [blame] | 418 | intermediates:= $(local-generated-sources-dir) | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 419 | GEN := $(intermediates)/<font color=red>file.c</font> | 
 | 420 | $(GEN): PRIVATE_INPUT_FILE := $(LOCAL_PATH)/<font color=red>input.file</font> | 
 | 421 | $(GEN): PRIVATE_CUSTOM_TOOL = <font color=red>cat $(PRIVATE_INPUT_FILE) > $@</font> | 
| Dan Willemsen | bdd2e8e | 2016-05-08 19:23:01 -0700 | [diff] [blame] | 422 | $(GEN): <font color=red>$(LOCAL_PATH)/input.file</font> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 423 | 	$(transform-generated-source) | 
 | 424 | LOCAL_GENERATED_SOURCES += $(GEN) | 
 | 425 | </pre> | 
 | 426 |  | 
 | 427 | <h5>Example 3</h5> | 
 | 428 | <p>If you have several files that are all similar in | 
 | 429 | name, and use the same tool, you can combine them.  (here the *.lut.h files are | 
 | 430 | the generated ones, and the *.cpp files are the input files)</p> | 
 | 431 | <pre> | 
| Colin Cross | d826264 | 2014-01-24 23:17:21 -0800 | [diff] [blame] | 432 | intermediates:= $(local-generated-sources-dir) | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 433 | GEN := $(addprefix $(intermediates)<font color=red>/kjs/, \ | 
 | 434 |             array_object.lut.h \ | 
 | 435 |             bool_object.lut.h \</font> | 
 | 436 |         ) | 
 | 437 | $(GEN): PRIVATE_CUSTOM_TOOL = <font color=red>perl libs/WebKitLib/WebKit/JavaScriptCore/kjs/create_hash_table $< -i > $@</font> | 
 | 438 | $(GEN): $(intermediates)/<font color=red>%.lut.h</font> : $(LOCAL_PATH)/<font color=red>%.cpp</font> | 
 | 439 | 	$(transform-generated-source) | 
 | 440 | LOCAL_GENERATED_SOURCES += $(GEN) | 
 | 441 | </pre> | 
 | 442 |  | 
 | 443 | <h3><a name="platform-specific"/>Platform specific conditionals</h3> | 
 | 444 | <p>Sometimes you need to set flags specifically for different platforms.  Here | 
 | 445 | is a list of which values the different build-system defined variables will be | 
 | 446 | set to and some examples.</p> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 447 | <table cellspacing=25> | 
 | 448 | <tr> | 
 | 449 |     <td valign=top align=center> | 
 | 450 |         <b>HOST_OS</b><br/> | 
 | 451 |         linux<br/> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 452 |         darwin | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 453 |     </td> | 
 | 454 |     <td valign=top align=center> | 
 | 455 |         <b>HOST_ARCH</b><br/> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 456 |         x86<br/> | 
 | 457 |         x86_64 | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 458 |     </td> | 
 | 459 |     <td valign=top align=center> | 
 | 460 |         <b>HOST_BUILD_TYPE</b><br/> | 
 | 461 |         release<br/> | 
 | 462 |         debug | 
 | 463 |     </td> | 
 | 464 | </tr> | 
 | 465 | <tr> | 
 | 466 |     <td valign=top align=center> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 467 |         <b>TARGET_ARCH</b><br/> | 
 | 468 |         arm<br/> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 469 |         arm64<br/> | 
 | 470 |         mips<br/> | 
 | 471 |         mips64<br/> | 
 | 472 |         x86<br/> | 
 | 473 |         x86_64 | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 474 |     </td> | 
 | 475 |     <td valign=top align=center> | 
 | 476 |         <b>TARGET_BUILD_TYPE</b><br/> | 
 | 477 |         release<br/> | 
 | 478 |         debug | 
 | 479 |     </td> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 480 | </tr> | 
 | 481 | </table> | 
 | 482 |  | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 483 | <p>There are also special variables to use instead of conditionals. Many of the | 
 | 484 | normal variables (LOCAL_SRC_FILES, LOCAL_CFLAGS, etc) can be conditionally added | 
 | 485 | to with _{arch} _{32|64}, and for the host, _{os}.</p> | 
 | 486 |  | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 487 | <h4>Some Examples</h4> | 
| Jeff Brown | e33ba4c | 2011-07-11 22:11:46 -0700 | [diff] [blame] | 488 | <pre>ifeq ($(TARGET_BUILD_TYPE),release) | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 489 | LOCAL_CFLAGS += -DNDEBUG=1 | 
 | 490 | endif | 
 | 491 |  | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 492 | LOCAL_CFLAGS_arm += -DTARGET_IS_ARM | 
 | 493 |  | 
 | 494 | LOCAL_CFLAGS_64 += -DBIG_POINTER | 
 | 495 |  | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 496 | # from libutils | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 497 | # Use the futex based mutex and condition variable | 
 | 498 | # implementation from android-arm because it's shared mem safe | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 499 | LOCAL_SRC_FILES_linux += futex_synchro.c | 
 | 500 | LOCAL_LDLIBS_linux += -lrt -ldl | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 501 |  | 
 | 502 | </pre> | 
 | 503 |  | 
 | 504 |  | 
 | 505 | <h3><a name="moving-modules"/>Putting modules elsewhere</h3> | 
 | 506 | <p>If you have modules that normally go somewhere, and you need to have them | 
| Colin Cross | 639c336 | 2014-01-24 19:23:40 -0800 | [diff] [blame] | 507 | build somewhere else, read this.</p> | 
 | 508 | <p>If you have modules that need to go in a subdirectory of their normal | 
 | 509 | location, for example HAL modules that need to go in /system/lib/hw or | 
 | 510 | /vendor/lib/hw, set LOCAL_MODULE_RELATIVE_PATH in your Android.mk, for | 
 | 511 | example:</p> | 
 | 512 | <pre> | 
 | 513 | LOCAL_MODULE_RELATIVE_PATH := hw | 
 | 514 | </pre> | 
 | 515 | <p>If you have modules that need to go in an entirely different location, for | 
 | 516 | example the root filesystem instead of in /system, add these lines to your | 
 | 517 | Android.mk:</p> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 518 | <pre> | 
 | 519 | LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT_SBIN) | 
 | 520 | LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_SBIN_UNSTRIPPED) | 
 | 521 | </pre> | 
| Colin Cross | 639c336 | 2014-01-24 19:23:40 -0800 | [diff] [blame] | 522 | <p>For executables and libraries, you need to specify a | 
 | 523 | <code>LOCAL_UNSTRIPPED_PATH</code> location if you specified a | 
 | 524 | <code>LOCAL_MODULE_PATH</code>, because on target builds, we keep | 
 | 525 | the unstripped executables so GDB can find the symbols. | 
 | 526 | <code>LOCAL_UNSTRIPPED_PATH</code> is not necessary if you only specified | 
 | 527 | <code>LOCAL_MODULE_RELATIVE_PATH</code>.</p> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 528 | <p>Look in <code>core/envsetup.mk</code> for all of the variables defining | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 529 | places to build things.</p> | 
 | 530 | <p>FYI: If you're installing an executable to /sbin, you probably also want to | 
 | 531 | set <code>LOCAL_FORCE_STATIC_EXCUTABLE := true</code> in your Android.mk, which | 
 | 532 | will force the linker to only accept static libraries.</p> | 
 | 533 |  | 
 | 534 |  | 
 | 535 | <h3>Android.mk variables</h3> | 
 | 536 | <p>These are the variables that you'll commonly see in Android.mk files, listed | 
 | 537 | alphabetically.</p> | 
 | 538 | <p>But first, a note on variable naming: | 
 | 539 | <ul> | 
 | 540 |     <li><b>LOCAL_</b> - These variables are set per-module.  They are cleared | 
 | 541 |     by the <code>include $(CLEAR_VARS)</code> line, so you can rely on them | 
 | 542 |     being empty after including that file.  Most of the variables you'll use | 
 | 543 |     in most modules are LOCAL_ variables.</li> | 
 | 544 |     <li><b>PRIVATE_</b> - These variables are make-target-specific variables.  That | 
 | 545 |     means they're only usable within the commands for that module.  It also | 
 | 546 |     means that they're unlikely to change behind your back from modules that | 
 | 547 |     are included after yours.  This  | 
 | 548 |     <a href="http://www.gnu.org/software/make/manual/make.html#Target_002dspecific">link to the make documentation</a> | 
 | 549 |     describes more about target-specific variables.  Please note that there | 
 | 550 |     are a couple of these laying around the tree that aren't prefixed with | 
 | 551 |     PRIVATE_.  It is safe, and they will be fixed as they are discovered. | 
 | 552 |     Sorry for the confusion.</li> | 
 | 553 |     <li><b>INTERNAL_</b> - These variables are critical to functioning of | 
 | 554 |     the build system, so you shouldn't create variables named like this, and | 
 | 555 |     you probably shouldn't be messing with these variables in your makefiles. | 
 | 556 |     </li> | 
 | 557 |     <li><b>HOST_</b> and <b>TARGET_</b> - These contain the directories | 
 | 558 |     and definitions that are specific to either the host or the target builds. | 
 | 559 |     Do not set variables that start with HOST_ or TARGET_ in your makefiles. | 
 | 560 |     </li> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 561 |     <li><b>HOST_CROSS_</b> - These contain the directories and definitions that | 
 | 562 |     are specific to cross-building host binaries. The common case is building | 
 | 563 |     windows host tools on linux. Do not set variables that start with | 
 | 564 |     HOST_CROSS_ in your makefiles. | 
 | 565 |     </li> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 566 |     <li><b>BUILD_</b> and <b>CLEAR_VARS</b> - These contain the names of | 
 | 567 |     well-defined template makefiles to include.  Some examples are CLEAR_VARS | 
 | 568 |     and BUILD_HOST_PACKAGE.</li> | 
 | 569 |     <li>Any other name is fair-game for you to use in your Android.mk.  However, | 
 | 570 |     remember that this is a non-recursive build system, so it is possible that | 
 | 571 |     your variable will be changed by another Android.mk included later, and be | 
 | 572 |     different when the commands for your rule / module are executed.</li> | 
 | 573 | </ul> | 
 | 574 | </p> | 
 | 575 |  | 
| Colin Cross | e8ee68b | 2017-04-07 16:28:41 -0700 | [diff] [blame] | 576 | <h4>LOCAL_ANNOTATION_PROCESSORS</h4> | 
 | 577 | <p>Set this to a list of modules built with <code>BUILD_HOST_JAVA_LIBRARY</code> | 
 | 578 | to have their jars passed to javac with -processorpath for use as annotation | 
 | 579 | processors.</p> | 
 | 580 |  | 
 | 581 | <h4>LOCAL_ANNOTATION_PROCESSOR_CLASSES</h4> | 
 | 582 | <p>Set this to a list of classes to be passed to javac as -processor arguments. | 
 | 583 | This list is would be unnecessary, as javac will autodetect annotation processor | 
 | 584 | classes, except that the Grok tool that is used on the Android source code | 
 | 585 | does not autodetect them and requires listing them manually.</p> | 
 | 586 |  | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 587 | <h4>LOCAL_ASSET_FILES</h4> | 
 | 588 | <p>In Android.mk files that <code>include $(BUILD_PACKAGE)</code> set this | 
 | 589 | to the set of files you want built into your app.  Usually:</p> | 
 | 590 | <p><code>LOCAL_ASSET_FILES += $(call find-subdir-assets)</code></p> | 
 | 591 | <p>This will probably change when we switch to ant for the apps' build | 
 | 592 | system.</p> | 
 | 593 |  | 
 | 594 | <h4>LOCAL_CC</h4> | 
 | 595 | <p>If you want to use a different C compiler for this module, set LOCAL_CC | 
 | 596 | to the path to the compiler.  If LOCAL_CC is blank, the appropriate default | 
 | 597 | compiler is used.</p> | 
 | 598 |  | 
 | 599 | <h4>LOCAL_CXX</h4> | 
 | 600 | <p>If you want to use a different C++ compiler for this module, set LOCAL_CXX | 
 | 601 | to the path to the compiler.  If LOCAL_CXX is blank, the appropriate default | 
 | 602 | compiler is used.</p> | 
 | 603 |  | 
 | 604 | <h4>LOCAL_CFLAGS</h4> | 
 | 605 | <p>If you have additional flags to pass into the C or C++ compiler, add | 
 | 606 | them here.  For example:</p> | 
 | 607 | <p><code>LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1</code></p> | 
 | 608 |  | 
 | 609 | <h4>LOCAL_CPPFLAGS</h4> | 
 | 610 | <p>If you have additional flags to pass into <i>only</i> the C++ compiler, add | 
 | 611 | them here.  For example:</p> | 
 | 612 | <p><code>LOCAL_CPPFLAGS += -ffriend-injection</code></p> | 
 | 613 | <code>LOCAL_CPPFLAGS</code> is guaranteed to be after <code>LOCAL_CFLAGS</code> | 
 | 614 | on the compile line, so you can use it to override flags listed in | 
 | 615 | <code>LOCAL_CFLAGS</code>. | 
 | 616 |  | 
 | 617 | <h4>LOCAL_CPP_EXTENSION</h4> | 
 | 618 | <p>If your C++ files end in something other than "<code>.cpp</code>", | 
 | 619 | you can specify the custom extension here.  For example:</p> | 
 | 620 | <p><code>LOCAL_CPP_EXTENSION := .cc</code></p> | 
 | 621 | Note that all C++ files for a given module must have the same | 
 | 622 | extension; it is not currently possible to mix different extensions. | 
 | 623 |  | 
 | 624 | <h4>LOCAL_NO_DEFAULT_COMPILER_FLAGS</h4> | 
 | 625 | <p>Normally, the compile line for C and C++ files includes global include | 
 | 626 | paths and global cflags.  If <code>LOCAL_NO_DEFAULT_COMPILER_FLAGS</code> | 
 | 627 | is non-empty, none of the default includes or flags will be used when compiling | 
 | 628 | C and C++ files in this module. | 
 | 629 | <code>LOCAL_C_INCLUDES</code>, <code>LOCAL_CFLAGS</code>, and | 
 | 630 | <code>LOCAL_CPPFLAGS</code> will still be used in this case, as will | 
 | 631 | any <code>DEBUG_CFLAGS</code> that are defined for the module. | 
 | 632 |  | 
 | 633 | <h4>LOCAL_COPY_HEADERS</h4> | 
 | 634 | <p class=warning>This will be going away.</p> | 
 | 635 | <p>The set of files to copy to the install include tree.  You must also | 
 | 636 | supply <code>LOCAL_COPY_HEADERS_TO</code>.</p> | 
 | 637 | <p>This is going away because copying headers messes up the error messages, and | 
 | 638 | may lead to people editing those headers instead of the correct ones.  It also | 
 | 639 | makes it easier to do bad layering in the system, which we want to avoid.  We | 
 | 640 | also aren't doing a C/C++ SDK, so there is no ultimate requirement to copy any | 
 | 641 | headers.</p> | 
 | 642 |  | 
 | 643 | <h4>LOCAL_COPY_HEADERS_TO</h4> | 
 | 644 | <p class=warning>This will be going away.</p> | 
 | 645 | <p>The directory within "include" to copy the headers listed in | 
 | 646 | <code>LOCAL_COPY_HEADERS</code> to.</p> | 
 | 647 | <p>This is going away because copying headers messes up the error messages, and | 
 | 648 | may lead to people editing those headers instead of the correct ones.  It also | 
 | 649 | makes it easier to do bad layering in the system, which we want to avoid.  We | 
 | 650 | also aren't doing a C/C++ SDK, so there is no ultimate requirement to copy any | 
 | 651 | headers.</p> | 
 | 652 |  | 
 | 653 | <h4>LOCAL_C_INCLUDES</h4> | 
 | 654 | <p>Additional directories to instruct the C/C++ compilers to look for header | 
 | 655 | files in.  These paths are rooted at the top of the tree.  Use | 
 | 656 | <code>LOCAL_PATH</code> if you have subdirectories of your own that you | 
 | 657 | want in the include paths.  For example:</p> | 
 | 658 | <p><code> | 
 | 659 | LOCAL_C_INCLUDES += extlibs/zlib-1.2.3<br/> | 
 | 660 | LOCAL_C_INCLUDES += $(LOCAL_PATH)/src | 
 | 661 | </code></p> | 
 | 662 | <p>You should not add subdirectories of include to | 
 | 663 | <code>LOCAL_C_INCLUDES</code>, instead you should reference those files | 
 | 664 | in the <code>#include</code> statement with their subdirectories.  For | 
 | 665 | example:</p> | 
 | 666 | <p><code>#include <utils/KeyedVector.h></code><br/> | 
 | 667 | not <code><s>#include <KeyedVector.h></s></code></p> | 
 | 668 | <p>There are some components that are doing this wrong, and should be cleaned | 
 | 669 | up.</p> | 
 | 670 |  | 
 | 671 | <h4>LOCAL_MODULE_TAGS</h4> | 
 | 672 | <p>Set <code>LOCAL_MODULE_TAGS</code> to any number of whitespace-separated | 
 | 673 | tags.  If the tag list is empty or contains <code>droid</code>, the module | 
| Elliott Hughes | 32bfd70 | 2013-11-05 11:13:49 -0800 | [diff] [blame] | 674 | will get installed as part of a <code>make droid</code>.  Otherwise, it will | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 675 | only get installed by running <code>make <your-module></code> | 
 | 676 | or with the <code>make all</code> pseudotarget.</p> | 
 | 677 |  | 
 | 678 | <h4>LOCAL_REQUIRED_MODULES</h4> | 
 | 679 | <p>Set <code>LOCAL_REQUIRED_MODULES</code> to any number of whitespace-separated | 
 | 680 | module names, like "libblah" or "Email".  If this module is installed, all | 
 | 681 | of the modules that it requires will be installed as well.  This can be | 
 | 682 | used to, e.g., ensure that necessary shared libraries or providers are | 
 | 683 | installed when a given app is installed. | 
 | 684 |  | 
 | 685 | <h4>LOCAL_FORCE_STATIC_EXECUTABLE</h4> | 
 | 686 | <p>If your executable should be linked statically, set  | 
 | 687 | <code>LOCAL_FORCE_STATIC_EXECUTABLE:=true</code>.  There is a very short | 
 | 688 | list of libraries that we have in static form (currently only libc).  This is | 
 | 689 | really only used for executables in /sbin on the root filesystem.</p> | 
 | 690 |  | 
 | 691 | <h4>LOCAL_GENERATED_SOURCES</h4> | 
 | 692 | <p>Files that you add to <code>LOCAL_GENERATED_SOURCES</code> will be | 
 | 693 | automatically generated and then linked in when your module is built. | 
 | 694 | See the <a href="#custom-tools">Custom Tools</a> template makefile for an | 
 | 695 | example.</p> | 
 | 696 |  | 
| Brian Carlstrom | f184a0f | 2010-02-01 11:13:32 -0800 | [diff] [blame] | 697 | <h4>LOCAL_JAVACFLAGS</h4> | 
 | 698 | <p>If you have additional flags to pass into the javac compiler, add | 
 | 699 | them here.  For example:</p> | 
 | 700 | <p><code>LOCAL_JAVACFLAGS += -Xlint:deprecation</code></p> | 
 | 701 |  | 
| Paul Duffin | 3ca9298 | 2016-09-20 15:12:30 +0100 | [diff] [blame] | 702 | <h4>LOCAL_ERROR_PRONE_FLAGS</h4> | 
 | 703 | <p>If you have additional flags to pass into the error prone compiler, add | 
 | 704 | them here.  For example:</p> | 
 | 705 | <p><code>LOCAL_ERROR_PRONE_FLAGS += -Xep:ClassCanBeStatic:ERROR</code></p> | 
 | 706 |  | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 707 | <h4>LOCAL_JAVA_LIBRARIES</h4> | 
 | 708 | <p>When linking Java apps and libraries, <code>LOCAL_JAVA_LIBRARIES</code> | 
 | 709 | specifies which sets of java classes to include.  Currently there are | 
 | 710 | two of these: <code>core</code> and <code>framework</code>. | 
 | 711 | In most cases, it will look like this:</p> | 
 | 712 | <p><code>LOCAL_JAVA_LIBRARIES := core framework</code></p> | 
 | 713 | <p>Note that setting <code>LOCAL_JAVA_LIBRARIES</code> is not necessary | 
 | 714 | (and is not allowed) when building an APK with | 
 | 715 | "<code>include $(BUILD_PACKAGE)</code>".  The appropriate libraries | 
 | 716 | will be included automatically.</p> | 
 | 717 |  | 
 | 718 | <h4>LOCAL_LDFLAGS</h4> | 
 | 719 | <p>You can pass additional flags to the linker by setting | 
 | 720 | <code>LOCAL_LDFLAGS</code>.  Keep in mind that the order of parameters is | 
 | 721 | very important to ld, so test whatever you do on all platforms.</p> | 
 | 722 |  | 
 | 723 | <h4>LOCAL_LDLIBS</h4> | 
 | 724 | <p><code>LOCAL_LDLIBS</code> allows you to specify additional libraries | 
 | 725 | that are not part of the build for your executable or library.  Specify | 
 | 726 | the libraries you want in -lxxx format; they're passed directly to the  | 
 | 727 | link line.  However, keep in mind that there will be no dependency generated | 
 | 728 | for these libraries.  It's most useful in simulator builds where you want | 
 | 729 | to use a library preinstalled on the host.  The linker (ld) is a particularly | 
 | 730 | fussy beast, so it's sometimes necessary to pass other flags here if you're | 
 | 731 | doing something sneaky. Some examples:</p> | 
 | 732 | <p><code>LOCAL_LDLIBS += -lcurses -lpthread<br/> | 
 | 733 | LOCAL_LDLIBS += -Wl,-z,origin | 
 | 734 | </code></p> | 
 | 735 |  | 
 | 736 | <h4>LOCAL_NO_MANIFEST</h4> | 
 | 737 | <p>If your package doesn't have a manifest (AndroidManifest.xml), then | 
 | 738 | set <code>LOCAL_NO_MANIFEST:=true</code>.  The common resources package | 
 | 739 | does this.</p> | 
 | 740 |  | 
 | 741 | <h4>LOCAL_PACKAGE_NAME</h4> | 
 | 742 | <p><code>LOCAL_PACKAGE_NAME</code> is the name of an app.  For example, | 
 | 743 | Dialer, Contacts, etc.  This will probably change or go away when we switch | 
 | 744 | to an ant-based build system for the apps.</p> | 
 | 745 |  | 
| Tobias Thierer | f795dcb | 2018-01-09 20:33:08 +0000 | [diff] [blame] | 746 | <h4>LOCAL_PATCH_MODULE (experimental option)</h4> | 
 | 747 | <p>As of January 2018, you almost certainly don't need this option, so please | 
 | 748 | ask and only use it if you understand what you're doing. This feature is | 
 | 749 | experimental and may go away in future.</p> | 
 | 750 | <p> | 
 | 751 | When compiling language level 9+ .java code in packages that are part of a | 
 | 752 | a system module, <code>LOCAL_PATCH_MODULE</code> names the module that your | 
 | 753 | sources and dependencies should be patched into. The Android runtime currently | 
 | 754 | (Jan 2018) doesn't implement the JEP 261 module system so this option is only | 
 | 755 | supported at compile time. It should only be needed to compile tests in packages | 
 | 756 | that exist in libcore and which are inconvenient to move elsewhere. | 
 | 757 | </p> | 
 | 758 |  | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 759 | <h4>LOCAL_PATH</h4> | 
 | 760 | <p>The directory your Android.mk file is in. You can set it by putting the | 
 | 761 | following as the first line in your Android.mk:</p> | 
 | 762 | <p><code>LOCAL_PATH := $(my-dir)</code></p> | 
 | 763 | <p>The <code>my-dir</code> macro uses the  | 
 | 764 | <code><a href="http://www.gnu.org/software/make/manual/make.html#MAKEFILE_005fLIST-Variable">MAKEFILE_LIST</a></code> | 
 | 765 | variable, so you must call it before you include any other makefiles.  Also, | 
 | 766 | consider that any subdirectories you inlcude might reset LOCAL_PATH, so do your | 
 | 767 | own stuff before you include them.  This also means that if you try to write | 
 | 768 | several <code>include</code> lines that reference <code>LOCAL_PATH</code>, | 
 | 769 | it won't work, because those included makefiles might reset LOCAL_PATH. | 
 | 770 |  | 
 | 771 | <h4>LOCAL_POST_PROCESS_COMMAND</h4> | 
 | 772 | <p>For host executables, you can specify a command to run on the module | 
 | 773 | after it's been linked.  You might have to go through some contortions | 
 | 774 | to get variables right because of early or late variable evaluation:</p> | 
 | 775 | <p><code>module := $(HOST_OUT_EXECUTABLES)/$(LOCAL_MODULE)<br/> | 
 | 776 | LOCAL_POST_PROCESS_COMMAND := /Developer/Tools/Rez -d __DARWIN__ -t APPL\<br/> | 
 | 777 |        -d __WXMAC__ -o $(module) Carbon.r | 
 | 778 | </code></p> | 
 | 779 |  | 
 | 780 | <h4>LOCAL_PREBUILT_EXECUTABLES</h4> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 781 | <p>When including $(BUILD_MULTI_PREBUILT) or $(BUILD_HOST_PREBUILT), set these | 
 | 782 | to executables that you want copied.  They're located automatically into the | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 783 | right bin directory.</p> | 
 | 784 |  | 
 | 785 | <h4>LOCAL_PREBUILT_LIBS</h4> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 786 | <p>When including $(BUILD_MULTI_PREBUILT) or $(BUILD_HOST_PREBUILT), set these | 
 | 787 | to libraries that you want copied.  They're located automatically into the | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 788 | right lib directory.</p> | 
 | 789 |  | 
 | 790 | <h4>LOCAL_SHARED_LIBRARIES</h4> | 
 | 791 | <p>These are the libraries you directly link against.  You don't need to | 
 | 792 | pass transitively included libraries.  Specify the name without the suffix:</p> | 
 | 793 | <p><code>LOCAL_SHARED_LIBRARIES := \<br/> | 
 | 794 | 	    libutils \<br/> | 
 | 795 | 	    libui \<br/> | 
 | 796 | 	    libaudio \<br/> | 
 | 797 | 	    libexpat \<br/> | 
 | 798 | 	    libsgl | 
 | 799 | </code></p> | 
 | 800 |  | 
 | 801 | <h4>LOCAL_SRC_FILES</h4> | 
 | 802 | <p>The build system looks at <code>LOCAL_SRC_FILES</code> to know what source | 
 | 803 | files to compile -- .cpp .c .y .l .java.  For lex and yacc files, it knows | 
 | 804 | how to correctly do the intermediate .h and .c/.cpp files automatically.  If | 
 | 805 | the files are in a subdirectory of the one containing the Android.mk, prefix | 
 | 806 | them with the directory name:</p> | 
 | 807 | <p><code>LOCAL_SRC_FILES := \<br/> | 
 | 808 | 	    file1.cpp \<br/> | 
 | 809 | 	    dir/file2.cpp | 
 | 810 | </code></p> | 
 | 811 |  | 
 | 812 | <h4>LOCAL_STATIC_LIBRARIES</h4> | 
 | 813 | <p>These are the static libraries that you want to include in your module. | 
 | 814 | Mostly, we use shared libraries, but there are a couple of places, like | 
 | 815 | executables in sbin and host executables where we use static libraries instead. | 
 | 816 | <p><code>LOCAL_STATIC_LIBRARIES := \<br/> | 
 | 817 | 	    libutils \<br/> | 
 | 818 | 	    libtinyxml | 
 | 819 | </code></p> | 
 | 820 |  | 
 | 821 | <h4>LOCAL_MODULE</h4> | 
 | 822 | <p><code>LOCAL_MODULE</code> is the name of what's supposed to be generated | 
 | 823 | from your Android.mk.  For exmample, for libkjs, the <code>LOCAL_MODULE</code> | 
 | 824 | is "libkjs" (the build system adds the appropriate suffix -- .so .dylib .dll). | 
 | 825 | For app modules, use <code>LOCAL_PACKAGE_NAME</code> instead of  | 
 | 826 | <code>LOCAL_MODULE</code>.  We're planning on switching to ant for the apps, | 
 | 827 | so this might become moot.</p> | 
 | 828 |  | 
 | 829 | <h4>LOCAL_MODULE_PATH</h4> | 
 | 830 | <p>Instructs the build system to put the module somewhere other than what's | 
 | 831 | normal for its type.  If you override this, make sure you also set | 
 | 832 | <code>LOCAL_UNSTRIPPED_PATH</code> if it's an executable or a shared library | 
 | 833 | so the unstripped binary has somewhere to go.  An error will occur if you forget | 
 | 834 | to.</p> | 
 | 835 | <p>See <a href="#moving-modules">Putting modules elsewhere</a> for more.</p> | 
 | 836 |  | 
| Colin Cross | 639c336 | 2014-01-24 19:23:40 -0800 | [diff] [blame] | 837 | <h4>LOCAL_MODULE_RELATIVE_PATH</h4> | 
 | 838 | <p>Instructs the build system to put the module in a subdirectory under the | 
 | 839 | directory that is normal for its type.  If you set this you do not need to | 
 | 840 | set <code>LOCAL_UNSTRIPPED_PATH</code>, the unstripped binaries will also use | 
 | 841 | the relative path.</p> | 
 | 842 | <p>See <a href="#moving-modules">Putting modules elsewhere</a> for more.</p> | 
 | 843 |  | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 844 | <h4>LOCAL_MODULE_HOST_OS</h4> | 
 | 845 | <p>This specifies which OSes are supported by this host module. It is not used | 
 | 846 | for target builds. The accepted values here are combinations of | 
 | 847 | <code>linux</code>, <code>darwin</code>, and <code>windows</code>. By default, | 
 | 848 | linux and darwin(MacOS) are considered to be supported. If a module should | 
 | 849 | build under windows, you must specify windows, and any others to be supported. | 
 | 850 | Some examples:</p> | 
 | 851 | <p><code>LOCAL_MODULE_HOST_OS := linux<br/> | 
 | 852 | LOCAL_MODULE_HOST_OS := darwin linux windows</code></p> | 
 | 853 |  | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 854 | <h4>LOCAL_UNSTRIPPED_PATH</h4> | 
 | 855 | <p>Instructs the build system to put the unstripped version of the module | 
 | 856 | somewhere other than what's normal for its type.  Usually, you override this | 
 | 857 | because you overrode <code>LOCAL_MODULE_PATH</code> for an executable or a | 
 | 858 | shared library.  If you overrode <code>LOCAL_MODULE_PATH</code>, but not  | 
 | 859 | <code>LOCAL_UNSTRIPPED_PATH</code>, an error will occur.</p> | 
 | 860 | <p>See <a href="#moving-modules">Putting modules elsewhere</a> for more.</p> | 
 | 861 |  | 
 | 862 | <h4>LOCAL_WHOLE_STATIC_LIBRARIES</h4> | 
 | 863 | <p>These are the static libraries that you want to include in your module without allowing | 
 | 864 | the linker to remove dead code from them. This is mostly useful if you want to add a static library | 
 | 865 | to a shared library and have the static library's content exposed from the shared library. | 
 | 866 | <p><code>LOCAL_WHOLE_STATIC_LIBRARIES := \<br/> | 
 | 867 | 	    libsqlite3_android<br/> | 
 | 868 | </code></p> | 
 | 869 |  | 
 | 870 | <h4>LOCAL_YACCFLAGS</h4> | 
 | 871 | <p>Any flags to pass to invocations of yacc for your module.  A known limitation | 
 | 872 | here is that the flags will be the same for all invocations of YACC for your | 
 | 873 | module.  This can be fixed.  If you ever need it to be, just ask.</p> | 
 | 874 | <p><code>LOCAL_YACCFLAGS := -p kjsyy</code></p> | 
 | 875 |  | 
 | 876 |  | 
 | 877 |  | 
 | 878 | <h2>Implementation Details</h2> | 
 | 879 |  | 
 | 880 | <p>You should never have to touch anything in the config directory unless | 
 | 881 | you're adding a new platform, new tools, or adding new features to the | 
 | 882 | build system.  In general, please consult with the build system owner(s) | 
 | 883 | (<a href="mailto:android-build-team">android-build-team</a>) before you go | 
 | 884 | mucking around in here.  That said, here are some notes on what's going on | 
 | 885 | under the hood.</p> | 
 | 886 |  | 
 | 887 | <h3>Environment Setup / buildspec.mk Versioning</h3> | 
 | 888 | <p>In order to make easier for people when the build system changes, when | 
 | 889 | it is necessary to make changes to buildspec.mk or to rerun the environment | 
 | 890 | setup scripts, they contain a version number in the variable | 
 | 891 | BUILD_ENV_SEQUENCE_NUMBER.  If this variable does not match what the build | 
 | 892 | system expects, it fails printing an error message explaining what happened. | 
 | 893 | If you make a change that requires an update, you need to update two places | 
 | 894 | so this message will be printed. | 
 | 895 | <ul> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 896 |     <li>In core/envsetup.mk, increment the | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 897 |         CORRECT_BUILD_ENV_SEQUENCE_NUMBER definition.</li> | 
 | 898 |     <li>In buildspec.mk.default, update the BUILD_ENV_SEQUENCE_DUMBER | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 899 |         definition to match the one in core/envsetup.mk</li> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 900 | </ul> | 
 | 901 | The scripts automatically get the value from the build system, so they will | 
 | 902 | trigger the warning as well. | 
 | 903 | </p> | 
 | 904 |  | 
 | 905 | <h3>Additional makefile variables</h3> | 
 | 906 | <p>You probably shouldn't use these variables.  Please consult | 
 | 907 | <a href="mailto:android-build-team">android-build-team</a> before using them. | 
 | 908 | These are mostly there for workarounds for other issues, or things that aren't | 
 | 909 | completely done right.</p> | 
 | 910 |  | 
 | 911 | <h4>LOCAL_ADDITIONAL_DEPENDENCIES</h4> | 
 | 912 | <p>If your module needs to depend on anything else that | 
 | 913 | isn't actually built in to it, you can add those make targets to  | 
 | 914 | <code>LOCAL_ADDITIONAL_DEPENDENCIES</code>.  Usually this is a workaround | 
 | 915 | for some other dependency that isn't created automatically.</p> | 
 | 916 |  | 
 | 917 | <h4>LOCAL_BUILT_MODULE</h4> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 918 | <p class=warning>This should not be used, since multiple binaries are now | 
 | 919 | created from a single module defintiion.</p> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 920 | <p>When a module is built, the module is created in an intermediate | 
 | 921 | directory then copied to its final location.  LOCAL_BUILT_MODULE is | 
 | 922 | the full path to the intermediate file.  See LOCAL_INSTALLED_MODULE | 
 | 923 | for the path to the final installed location of the module.</p> | 
 | 924 |  | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 925 | <h4>LOCAL_IS_HOST_MODULE</h4> | 
 | 926 | <p>Set by the host_xxx.mk includes to tell base_rules.mk and the other | 
 | 927 | includes that we're building for the host.</p> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 928 |  | 
 | 929 | <h4>LOCAL_INSTALLED_MODULE</h4> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 930 | <p class=warning>This should not be used, since multiple binaries are now | 
 | 931 | created from a single module defintiion.</p> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 932 | <p>The fully qualified path name of the final location of the module. | 
 | 933 | See LOCAL_BUILT_MODULE for the location of the intermediate file that | 
 | 934 | the make rules should actually be constructing.</p> | 
 | 935 |  | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 936 | <h4>LOCAL_MODULE_CLASS</h4> | 
 | 937 | <p>Which kind of module this is.  This variable is used to construct other | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 938 | variable names used to locate the modules.  See base_rules.mk and | 
 | 939 | envsetup.mk.</p> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 940 |  | 
 | 941 | <h4>LOCAL_MODULE_SUFFIX</h4> | 
 | 942 | <p>The suffix that will be appended to <code>LOCAL_MODULE</code> to form | 
 | 943 | <code>LOCAL_MODULE_NAME</code>.  For example, .so, .a, .dylib.</p> | 
 | 944 |  | 
 | 945 | <h4>LOCAL_STRIP_MODULE</h4> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 946 | <p>If set to true (the default), the binary will be stripped and a debug | 
 | 947 | link will be set up so that GDB will still work. If set to no_debuglink, | 
 | 948 | the binary will be stripped, but no debug link will be added. If set to | 
 | 949 | keep_symbols, it will strip the debug information, but keep the symbol table. | 
 | 950 | Any other value will prevent stripping.</p> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 951 |  | 
 | 952 | <h4>LOCAL_SYSTEM_SHARED_LIBRARIES</h4> | 
 | 953 | <p>Used while building the base libraries: libc, libm, libdl.  Usually | 
 | 954 | it should be set to "none," as it is in $(CLEAR_VARS).  When building | 
 | 955 | these libraries, it's set to the ones they link against.  For example, | 
 | 956 | libc, libstdc++ and libdl don't link against anything, and libm links against | 
 | 957 | libc.  Normally, when the value is none, these libraries are automatically | 
 | 958 | linked in to executables and libraries, so you don't need to specify them | 
 | 959 | manually.</p> | 
 | 960 |  | 
 | 961 |  | 
 | 962 | </body> | 
 | 963 | </html> |