| 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 |  | 
| Jeongik Cha | 1caa24f | 2020-07-08 18:01:22 +0900 | [diff] [blame] | 443 | <h3><a name="unbundled-build"/>Unbundled build</h3> | 
|  | 444 | <p>Unbundled build has several meanings by the context. | 
|  | 445 | Let me explain the meaning by the flags related to "unbundled build"</p> | 
|  | 446 | <h4>TARGET_BUILD_UNBUNDLED</h4> | 
| Jiakai Zhang | 11f44e2 | 2022-03-28 20:36:47 +0100 | [diff] [blame] | 447 | <p> | 
|  | 448 | The source tree might not have the full platform sources. It turns on | 
|  | 449 | <code>TARGET_BUILD_USE_PREBUILT_SDKS</code>, unless | 
|  | 450 | <code>UNBUNDLED_BUILD_SDKS_FROM_SOURCE</code> is set. It is always set if | 
|  | 451 | <code>TARGET_BUILD_APPS</code> or <code>TARGET_BUILD_UNBUNDLED_IMAGE</code> is set. | 
|  | 452 | </p> | 
| Jeongik Cha | 1caa24f | 2020-07-08 18:01:22 +0900 | [diff] [blame] | 453 | <h4>TARGET_BUILD_USE_PREBUILT_SDKS</h4> | 
|  | 454 | <p>It is an internal flag. If it is set, prebuilt SDKs are used, even if a module's | 
|  | 455 | <code>LOCAL_SDK_VERSION</code> is <code>current</code> (including <code>system_current</code>, | 
|  | 456 | <code>core_current</code>, and so on). If it is unset, build current SDKs, | 
|  | 457 | and use them as usual.</p> | 
|  | 458 | <h4>DISABLE_PREOPT</h4> | 
|  | 459 | <p>It is an internal flag as well. If it is set, dexpreopt is disabled. | 
|  | 460 | It is always set if <code>TARGET_BUILD_APPS</code> or <code>TARGET_BUILD_UNBUNDLED_IMAGE</code> is set, | 
|  | 461 | because dexpreopt tightly depends on the platform.</p> | 
|  | 462 | <h4>TARGET_BUILD_APPS</h4> | 
|  | 463 | <p>Build the apps that can be distributed outside the platform, so it turns on | 
|  | 464 | <code>TARGET_BUILD_UNBUNDLED</code> and <code>DISABLE_PREOPT</code>. | 
|  | 465 | Also, it turns on <code>TARGET_BUILD_USE_PREBUILT_SDKS</code>, unless | 
|  | 466 | <code>UNBUNDLED_BUILD_SDKS_FROM_SOURCE</code> is set.</p> | 
|  | 467 | <h4>TARGET_BUILD_UNBUNDLED_IMAGE</h4> | 
|  | 468 | <p>It is similar to <code>TARGET_BUILD_APPS</code>, but its target is an unbundled partition | 
|  | 469 | (such as the vendor partition). Accordingly, it sets <code>TARGET_BUILD_UNBUNDLED</code> and <code>DISABLE_PREOPT</code>. | 
|  | 470 | We can call the partition unbundled, because the partition can be distributed outside the platform. | 
|  | 471 | And also, it turns on <code>TARGET_BUILD_USE_PREBUILT_SDKS</code>, unless | 
|  | 472 | <code>UNBUNDLED_BUILD_SDKS_FROM_SOURCE</code> is set.</p> | 
|  | 473 |  | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 474 | <h3><a name="platform-specific"/>Platform specific conditionals</h3> | 
|  | 475 | <p>Sometimes you need to set flags specifically for different platforms.  Here | 
|  | 476 | is a list of which values the different build-system defined variables will be | 
|  | 477 | set to and some examples.</p> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 478 | <table cellspacing=25> | 
|  | 479 | <tr> | 
|  | 480 | <td valign=top align=center> | 
|  | 481 | <b>HOST_OS</b><br/> | 
|  | 482 | linux<br/> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 483 | darwin | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 484 | </td> | 
|  | 485 | <td valign=top align=center> | 
|  | 486 | <b>HOST_ARCH</b><br/> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 487 | x86<br/> | 
|  | 488 | x86_64 | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 489 | </td> | 
|  | 490 | <td valign=top align=center> | 
|  | 491 | <b>HOST_BUILD_TYPE</b><br/> | 
|  | 492 | release<br/> | 
|  | 493 | debug | 
|  | 494 | </td> | 
|  | 495 | </tr> | 
|  | 496 | <tr> | 
|  | 497 | <td valign=top align=center> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 498 | <b>TARGET_ARCH</b><br/> | 
|  | 499 | arm<br/> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 500 | arm64<br/> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 501 | x86<br/> | 
|  | 502 | x86_64 | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 503 | </td> | 
|  | 504 | <td valign=top align=center> | 
|  | 505 | <b>TARGET_BUILD_TYPE</b><br/> | 
|  | 506 | release<br/> | 
|  | 507 | debug | 
|  | 508 | </td> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 509 | </tr> | 
|  | 510 | </table> | 
|  | 511 |  | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 512 | <p>There are also special variables to use instead of conditionals. Many of the | 
|  | 513 | normal variables (LOCAL_SRC_FILES, LOCAL_CFLAGS, etc) can be conditionally added | 
|  | 514 | to with _{arch} _{32|64}, and for the host, _{os}.</p> | 
|  | 515 |  | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 516 | <h4>Some Examples</h4> | 
| Jeff Brown | e33ba4c | 2011-07-11 22:11:46 -0700 | [diff] [blame] | 517 | <pre>ifeq ($(TARGET_BUILD_TYPE),release) | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 518 | LOCAL_CFLAGS += -DNDEBUG=1 | 
|  | 519 | endif | 
|  | 520 |  | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 521 | LOCAL_CFLAGS_arm += -DTARGET_IS_ARM | 
|  | 522 |  | 
|  | 523 | LOCAL_CFLAGS_64 += -DBIG_POINTER | 
|  | 524 |  | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 525 | # from libutils | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 526 | # Use the futex based mutex and condition variable | 
|  | 527 | # implementation from android-arm because it's shared mem safe | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 528 | LOCAL_SRC_FILES_linux += futex_synchro.c | 
|  | 529 | LOCAL_LDLIBS_linux += -lrt -ldl | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 530 |  | 
|  | 531 | </pre> | 
|  | 532 |  | 
|  | 533 |  | 
|  | 534 | <h3><a name="moving-modules"/>Putting modules elsewhere</h3> | 
|  | 535 | <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] | 536 | build somewhere else, read this.</p> | 
|  | 537 | <p>If you have modules that need to go in a subdirectory of their normal | 
|  | 538 | location, for example HAL modules that need to go in /system/lib/hw or | 
|  | 539 | /vendor/lib/hw, set LOCAL_MODULE_RELATIVE_PATH in your Android.mk, for | 
|  | 540 | example:</p> | 
|  | 541 | <pre> | 
|  | 542 | LOCAL_MODULE_RELATIVE_PATH := hw | 
|  | 543 | </pre> | 
|  | 544 | <p>If you have modules that need to go in an entirely different location, for | 
|  | 545 | example the root filesystem instead of in /system, add these lines to your | 
|  | 546 | Android.mk:</p> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 547 | <pre> | 
| Tom Cherry | 6b28af3 | 2019-04-16 15:18:52 -0700 | [diff] [blame] | 548 | LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT) | 
|  | 549 | LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_UNSTRIPPED) | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 550 | </pre> | 
| Colin Cross | 639c336 | 2014-01-24 19:23:40 -0800 | [diff] [blame] | 551 | <p>For executables and libraries, you need to specify a | 
|  | 552 | <code>LOCAL_UNSTRIPPED_PATH</code> location if you specified a | 
|  | 553 | <code>LOCAL_MODULE_PATH</code>, because on target builds, we keep | 
|  | 554 | the unstripped executables so GDB can find the symbols. | 
|  | 555 | <code>LOCAL_UNSTRIPPED_PATH</code> is not necessary if you only specified | 
|  | 556 | <code>LOCAL_MODULE_RELATIVE_PATH</code>.</p> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 557 | <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] | 558 | places to build things.</p> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 559 |  | 
|  | 560 |  | 
|  | 561 | <h3>Android.mk variables</h3> | 
|  | 562 | <p>These are the variables that you'll commonly see in Android.mk files, listed | 
|  | 563 | alphabetically.</p> | 
|  | 564 | <p>But first, a note on variable naming: | 
|  | 565 | <ul> | 
|  | 566 | <li><b>LOCAL_</b> - These variables are set per-module.  They are cleared | 
|  | 567 | by the <code>include $(CLEAR_VARS)</code> line, so you can rely on them | 
|  | 568 | being empty after including that file.  Most of the variables you'll use | 
|  | 569 | in most modules are LOCAL_ variables.</li> | 
|  | 570 | <li><b>PRIVATE_</b> - These variables are make-target-specific variables.  That | 
|  | 571 | means they're only usable within the commands for that module.  It also | 
|  | 572 | means that they're unlikely to change behind your back from modules that | 
|  | 573 | are included after yours.  This | 
|  | 574 | <a href="http://www.gnu.org/software/make/manual/make.html#Target_002dspecific">link to the make documentation</a> | 
|  | 575 | describes more about target-specific variables.  Please note that there | 
|  | 576 | are a couple of these laying around the tree that aren't prefixed with | 
|  | 577 | PRIVATE_.  It is safe, and they will be fixed as they are discovered. | 
|  | 578 | Sorry for the confusion.</li> | 
|  | 579 | <li><b>INTERNAL_</b> - These variables are critical to functioning of | 
|  | 580 | the build system, so you shouldn't create variables named like this, and | 
|  | 581 | you probably shouldn't be messing with these variables in your makefiles. | 
|  | 582 | </li> | 
|  | 583 | <li><b>HOST_</b> and <b>TARGET_</b> - These contain the directories | 
|  | 584 | and definitions that are specific to either the host or the target builds. | 
|  | 585 | Do not set variables that start with HOST_ or TARGET_ in your makefiles. | 
|  | 586 | </li> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 587 | <li><b>HOST_CROSS_</b> - These contain the directories and definitions that | 
|  | 588 | are specific to cross-building host binaries. The common case is building | 
|  | 589 | windows host tools on linux. Do not set variables that start with | 
|  | 590 | HOST_CROSS_ in your makefiles. | 
|  | 591 | </li> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 592 | <li><b>BUILD_</b> and <b>CLEAR_VARS</b> - These contain the names of | 
|  | 593 | well-defined template makefiles to include.  Some examples are CLEAR_VARS | 
|  | 594 | and BUILD_HOST_PACKAGE.</li> | 
|  | 595 | <li>Any other name is fair-game for you to use in your Android.mk.  However, | 
|  | 596 | remember that this is a non-recursive build system, so it is possible that | 
|  | 597 | your variable will be changed by another Android.mk included later, and be | 
|  | 598 | different when the commands for your rule / module are executed.</li> | 
|  | 599 | </ul> | 
|  | 600 | </p> | 
|  | 601 |  | 
| Colin Cross | e8ee68b | 2017-04-07 16:28:41 -0700 | [diff] [blame] | 602 | <h4>LOCAL_ANNOTATION_PROCESSORS</h4> | 
|  | 603 | <p>Set this to a list of modules built with <code>BUILD_HOST_JAVA_LIBRARY</code> | 
|  | 604 | to have their jars passed to javac with -processorpath for use as annotation | 
|  | 605 | processors.</p> | 
|  | 606 |  | 
|  | 607 | <h4>LOCAL_ANNOTATION_PROCESSOR_CLASSES</h4> | 
|  | 608 | <p>Set this to a list of classes to be passed to javac as -processor arguments. | 
|  | 609 | This list is would be unnecessary, as javac will autodetect annotation processor | 
|  | 610 | classes, except that the Grok tool that is used on the Android source code | 
|  | 611 | does not autodetect them and requires listing them manually.</p> | 
|  | 612 |  | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 613 | <h4>LOCAL_ASSET_FILES</h4> | 
|  | 614 | <p>In Android.mk files that <code>include $(BUILD_PACKAGE)</code> set this | 
|  | 615 | to the set of files you want built into your app.  Usually:</p> | 
|  | 616 | <p><code>LOCAL_ASSET_FILES += $(call find-subdir-assets)</code></p> | 
|  | 617 | <p>This will probably change when we switch to ant for the apps' build | 
|  | 618 | system.</p> | 
|  | 619 |  | 
|  | 620 | <h4>LOCAL_CC</h4> | 
|  | 621 | <p>If you want to use a different C compiler for this module, set LOCAL_CC | 
|  | 622 | to the path to the compiler.  If LOCAL_CC is blank, the appropriate default | 
|  | 623 | compiler is used.</p> | 
|  | 624 |  | 
|  | 625 | <h4>LOCAL_CXX</h4> | 
|  | 626 | <p>If you want to use a different C++ compiler for this module, set LOCAL_CXX | 
|  | 627 | to the path to the compiler.  If LOCAL_CXX is blank, the appropriate default | 
|  | 628 | compiler is used.</p> | 
|  | 629 |  | 
|  | 630 | <h4>LOCAL_CFLAGS</h4> | 
|  | 631 | <p>If you have additional flags to pass into the C or C++ compiler, add | 
|  | 632 | them here.  For example:</p> | 
|  | 633 | <p><code>LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1</code></p> | 
|  | 634 |  | 
|  | 635 | <h4>LOCAL_CPPFLAGS</h4> | 
|  | 636 | <p>If you have additional flags to pass into <i>only</i> the C++ compiler, add | 
|  | 637 | them here.  For example:</p> | 
|  | 638 | <p><code>LOCAL_CPPFLAGS += -ffriend-injection</code></p> | 
|  | 639 | <code>LOCAL_CPPFLAGS</code> is guaranteed to be after <code>LOCAL_CFLAGS</code> | 
|  | 640 | on the compile line, so you can use it to override flags listed in | 
|  | 641 | <code>LOCAL_CFLAGS</code>. | 
|  | 642 |  | 
|  | 643 | <h4>LOCAL_CPP_EXTENSION</h4> | 
|  | 644 | <p>If your C++ files end in something other than "<code>.cpp</code>", | 
|  | 645 | you can specify the custom extension here.  For example:</p> | 
|  | 646 | <p><code>LOCAL_CPP_EXTENSION := .cc</code></p> | 
|  | 647 | Note that all C++ files for a given module must have the same | 
|  | 648 | extension; it is not currently possible to mix different extensions. | 
|  | 649 |  | 
|  | 650 | <h4>LOCAL_NO_DEFAULT_COMPILER_FLAGS</h4> | 
|  | 651 | <p>Normally, the compile line for C and C++ files includes global include | 
|  | 652 | paths and global cflags.  If <code>LOCAL_NO_DEFAULT_COMPILER_FLAGS</code> | 
|  | 653 | is non-empty, none of the default includes or flags will be used when compiling | 
|  | 654 | C and C++ files in this module. | 
|  | 655 | <code>LOCAL_C_INCLUDES</code>, <code>LOCAL_CFLAGS</code>, and | 
|  | 656 | <code>LOCAL_CPPFLAGS</code> will still be used in this case, as will | 
|  | 657 | any <code>DEBUG_CFLAGS</code> that are defined for the module. | 
|  | 658 |  | 
|  | 659 | <h4>LOCAL_COPY_HEADERS</h4> | 
|  | 660 | <p class=warning>This will be going away.</p> | 
|  | 661 | <p>The set of files to copy to the install include tree.  You must also | 
|  | 662 | supply <code>LOCAL_COPY_HEADERS_TO</code>.</p> | 
|  | 663 | <p>This is going away because copying headers messes up the error messages, and | 
|  | 664 | may lead to people editing those headers instead of the correct ones.  It also | 
|  | 665 | makes it easier to do bad layering in the system, which we want to avoid.  We | 
|  | 666 | also aren't doing a C/C++ SDK, so there is no ultimate requirement to copy any | 
|  | 667 | headers.</p> | 
|  | 668 |  | 
|  | 669 | <h4>LOCAL_COPY_HEADERS_TO</h4> | 
|  | 670 | <p class=warning>This will be going away.</p> | 
|  | 671 | <p>The directory within "include" to copy the headers listed in | 
|  | 672 | <code>LOCAL_COPY_HEADERS</code> to.</p> | 
|  | 673 | <p>This is going away because copying headers messes up the error messages, and | 
|  | 674 | may lead to people editing those headers instead of the correct ones.  It also | 
|  | 675 | makes it easier to do bad layering in the system, which we want to avoid.  We | 
|  | 676 | also aren't doing a C/C++ SDK, so there is no ultimate requirement to copy any | 
|  | 677 | headers.</p> | 
|  | 678 |  | 
|  | 679 | <h4>LOCAL_C_INCLUDES</h4> | 
|  | 680 | <p>Additional directories to instruct the C/C++ compilers to look for header | 
|  | 681 | files in.  These paths are rooted at the top of the tree.  Use | 
|  | 682 | <code>LOCAL_PATH</code> if you have subdirectories of your own that you | 
|  | 683 | want in the include paths.  For example:</p> | 
|  | 684 | <p><code> | 
|  | 685 | LOCAL_C_INCLUDES += extlibs/zlib-1.2.3<br/> | 
|  | 686 | LOCAL_C_INCLUDES += $(LOCAL_PATH)/src | 
|  | 687 | </code></p> | 
|  | 688 | <p>You should not add subdirectories of include to | 
|  | 689 | <code>LOCAL_C_INCLUDES</code>, instead you should reference those files | 
|  | 690 | in the <code>#include</code> statement with their subdirectories.  For | 
|  | 691 | example:</p> | 
|  | 692 | <p><code>#include <utils/KeyedVector.h></code><br/> | 
|  | 693 | not <code><s>#include <KeyedVector.h></s></code></p> | 
|  | 694 | <p>There are some components that are doing this wrong, and should be cleaned | 
|  | 695 | up.</p> | 
|  | 696 |  | 
|  | 697 | <h4>LOCAL_MODULE_TAGS</h4> | 
|  | 698 | <p>Set <code>LOCAL_MODULE_TAGS</code> to any number of whitespace-separated | 
|  | 699 | 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] | 700 | 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] | 701 | only get installed by running <code>make <your-module></code> | 
|  | 702 | or with the <code>make all</code> pseudotarget.</p> | 
|  | 703 |  | 
|  | 704 | <h4>LOCAL_REQUIRED_MODULES</h4> | 
|  | 705 | <p>Set <code>LOCAL_REQUIRED_MODULES</code> to any number of whitespace-separated | 
|  | 706 | module names, like "libblah" or "Email".  If this module is installed, all | 
|  | 707 | of the modules that it requires will be installed as well.  This can be | 
|  | 708 | used to, e.g., ensure that necessary shared libraries or providers are | 
|  | 709 | installed when a given app is installed. | 
|  | 710 |  | 
|  | 711 | <h4>LOCAL_FORCE_STATIC_EXECUTABLE</h4> | 
|  | 712 | <p>If your executable should be linked statically, set | 
|  | 713 | <code>LOCAL_FORCE_STATIC_EXECUTABLE:=true</code>.  There is a very short | 
| Tom Cherry | 6b28af3 | 2019-04-16 15:18:52 -0700 | [diff] [blame] | 714 | list of libraries that we have in static form (currently only libc).</p> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 715 |  | 
|  | 716 | <h4>LOCAL_GENERATED_SOURCES</h4> | 
|  | 717 | <p>Files that you add to <code>LOCAL_GENERATED_SOURCES</code> will be | 
|  | 718 | automatically generated and then linked in when your module is built. | 
|  | 719 | See the <a href="#custom-tools">Custom Tools</a> template makefile for an | 
|  | 720 | example.</p> | 
|  | 721 |  | 
| Brian Carlstrom | f184a0f | 2010-02-01 11:13:32 -0800 | [diff] [blame] | 722 | <h4>LOCAL_JAVACFLAGS</h4> | 
|  | 723 | <p>If you have additional flags to pass into the javac compiler, add | 
|  | 724 | them here.  For example:</p> | 
|  | 725 | <p><code>LOCAL_JAVACFLAGS += -Xlint:deprecation</code></p> | 
|  | 726 |  | 
| Paul Duffin | 3ca9298 | 2016-09-20 15:12:30 +0100 | [diff] [blame] | 727 | <h4>LOCAL_ERROR_PRONE_FLAGS</h4> | 
|  | 728 | <p>If you have additional flags to pass into the error prone compiler, add | 
|  | 729 | them here.  For example:</p> | 
|  | 730 | <p><code>LOCAL_ERROR_PRONE_FLAGS += -Xep:ClassCanBeStatic:ERROR</code></p> | 
|  | 731 |  | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 732 | <h4>LOCAL_JAVA_LIBRARIES</h4> | 
|  | 733 | <p>When linking Java apps and libraries, <code>LOCAL_JAVA_LIBRARIES</code> | 
|  | 734 | specifies which sets of java classes to include.  Currently there are | 
|  | 735 | two of these: <code>core</code> and <code>framework</code>. | 
|  | 736 | In most cases, it will look like this:</p> | 
|  | 737 | <p><code>LOCAL_JAVA_LIBRARIES := core framework</code></p> | 
|  | 738 | <p>Note that setting <code>LOCAL_JAVA_LIBRARIES</code> is not necessary | 
|  | 739 | (and is not allowed) when building an APK with | 
|  | 740 | "<code>include $(BUILD_PACKAGE)</code>".  The appropriate libraries | 
|  | 741 | will be included automatically.</p> | 
|  | 742 |  | 
|  | 743 | <h4>LOCAL_LDFLAGS</h4> | 
|  | 744 | <p>You can pass additional flags to the linker by setting | 
|  | 745 | <code>LOCAL_LDFLAGS</code>.  Keep in mind that the order of parameters is | 
|  | 746 | very important to ld, so test whatever you do on all platforms.</p> | 
|  | 747 |  | 
|  | 748 | <h4>LOCAL_LDLIBS</h4> | 
|  | 749 | <p><code>LOCAL_LDLIBS</code> allows you to specify additional libraries | 
|  | 750 | that are not part of the build for your executable or library.  Specify | 
|  | 751 | the libraries you want in -lxxx format; they're passed directly to the | 
|  | 752 | link line.  However, keep in mind that there will be no dependency generated | 
|  | 753 | for these libraries.  It's most useful in simulator builds where you want | 
|  | 754 | to use a library preinstalled on the host.  The linker (ld) is a particularly | 
|  | 755 | fussy beast, so it's sometimes necessary to pass other flags here if you're | 
|  | 756 | doing something sneaky. Some examples:</p> | 
|  | 757 | <p><code>LOCAL_LDLIBS += -lcurses -lpthread<br/> | 
|  | 758 | LOCAL_LDLIBS += -Wl,-z,origin | 
|  | 759 | </code></p> | 
|  | 760 |  | 
|  | 761 | <h4>LOCAL_NO_MANIFEST</h4> | 
|  | 762 | <p>If your package doesn't have a manifest (AndroidManifest.xml), then | 
|  | 763 | set <code>LOCAL_NO_MANIFEST:=true</code>.  The common resources package | 
|  | 764 | does this.</p> | 
|  | 765 |  | 
|  | 766 | <h4>LOCAL_PACKAGE_NAME</h4> | 
|  | 767 | <p><code>LOCAL_PACKAGE_NAME</code> is the name of an app.  For example, | 
|  | 768 | Dialer, Contacts, etc.  This will probably change or go away when we switch | 
|  | 769 | to an ant-based build system for the apps.</p> | 
|  | 770 |  | 
| Tobias Thierer | f795dcb | 2018-01-09 20:33:08 +0000 | [diff] [blame] | 771 | <h4>LOCAL_PATCH_MODULE (experimental option)</h4> | 
|  | 772 | <p>As of January 2018, you almost certainly don't need this option, so please | 
|  | 773 | ask and only use it if you understand what you're doing. This feature is | 
|  | 774 | experimental and may go away in future.</p> | 
|  | 775 | <p> | 
|  | 776 | When compiling language level 9+ .java code in packages that are part of a | 
|  | 777 | a system module, <code>LOCAL_PATCH_MODULE</code> names the module that your | 
|  | 778 | sources and dependencies should be patched into. The Android runtime currently | 
|  | 779 | (Jan 2018) doesn't implement the JEP 261 module system so this option is only | 
|  | 780 | supported at compile time. It should only be needed to compile tests in packages | 
|  | 781 | that exist in libcore and which are inconvenient to move elsewhere. | 
|  | 782 | </p> | 
|  | 783 |  | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 784 | <h4>LOCAL_PATH</h4> | 
|  | 785 | <p>The directory your Android.mk file is in. You can set it by putting the | 
|  | 786 | following as the first line in your Android.mk:</p> | 
|  | 787 | <p><code>LOCAL_PATH := $(my-dir)</code></p> | 
|  | 788 | <p>The <code>my-dir</code> macro uses the | 
|  | 789 | <code><a href="http://www.gnu.org/software/make/manual/make.html#MAKEFILE_005fLIST-Variable">MAKEFILE_LIST</a></code> | 
|  | 790 | variable, so you must call it before you include any other makefiles.  Also, | 
|  | 791 | consider that any subdirectories you inlcude might reset LOCAL_PATH, so do your | 
|  | 792 | own stuff before you include them.  This also means that if you try to write | 
|  | 793 | several <code>include</code> lines that reference <code>LOCAL_PATH</code>, | 
|  | 794 | it won't work, because those included makefiles might reset LOCAL_PATH. | 
|  | 795 |  | 
|  | 796 | <h4>LOCAL_POST_PROCESS_COMMAND</h4> | 
|  | 797 | <p>For host executables, you can specify a command to run on the module | 
|  | 798 | after it's been linked.  You might have to go through some contortions | 
|  | 799 | to get variables right because of early or late variable evaluation:</p> | 
|  | 800 | <p><code>module := $(HOST_OUT_EXECUTABLES)/$(LOCAL_MODULE)<br/> | 
|  | 801 | LOCAL_POST_PROCESS_COMMAND := /Developer/Tools/Rez -d __DARWIN__ -t APPL\<br/> | 
|  | 802 |        -d __WXMAC__ -o $(module) Carbon.r | 
|  | 803 | </code></p> | 
|  | 804 |  | 
|  | 805 | <h4>LOCAL_PREBUILT_EXECUTABLES</h4> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 806 | <p>When including $(BUILD_MULTI_PREBUILT) or $(BUILD_HOST_PREBUILT), set these | 
|  | 807 | to executables that you want copied.  They're located automatically into the | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 808 | right bin directory.</p> | 
|  | 809 |  | 
|  | 810 | <h4>LOCAL_PREBUILT_LIBS</h4> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 811 | <p>When including $(BUILD_MULTI_PREBUILT) or $(BUILD_HOST_PREBUILT), set these | 
|  | 812 | to libraries that you want copied.  They're located automatically into the | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 813 | right lib directory.</p> | 
|  | 814 |  | 
|  | 815 | <h4>LOCAL_SHARED_LIBRARIES</h4> | 
|  | 816 | <p>These are the libraries you directly link against.  You don't need to | 
|  | 817 | pass transitively included libraries.  Specify the name without the suffix:</p> | 
|  | 818 | <p><code>LOCAL_SHARED_LIBRARIES := \<br/> | 
|  | 819 |     libutils \<br/> | 
|  | 820 |     libui \<br/> | 
|  | 821 |     libaudio \<br/> | 
|  | 822 |     libexpat \<br/> | 
|  | 823 |     libsgl | 
|  | 824 | </code></p> | 
|  | 825 |  | 
|  | 826 | <h4>LOCAL_SRC_FILES</h4> | 
|  | 827 | <p>The build system looks at <code>LOCAL_SRC_FILES</code> to know what source | 
|  | 828 | files to compile -- .cpp .c .y .l .java.  For lex and yacc files, it knows | 
|  | 829 | how to correctly do the intermediate .h and .c/.cpp files automatically.  If | 
|  | 830 | the files are in a subdirectory of the one containing the Android.mk, prefix | 
|  | 831 | them with the directory name:</p> | 
|  | 832 | <p><code>LOCAL_SRC_FILES := \<br/> | 
|  | 833 |     file1.cpp \<br/> | 
|  | 834 |     dir/file2.cpp | 
|  | 835 | </code></p> | 
|  | 836 |  | 
|  | 837 | <h4>LOCAL_STATIC_LIBRARIES</h4> | 
|  | 838 | <p>These are the static libraries that you want to include in your module. | 
|  | 839 | Mostly, we use shared libraries, but there are a couple of places, like | 
| Tom Cherry | 6b28af3 | 2019-04-16 15:18:52 -0700 | [diff] [blame] | 840 | host executables where we use static libraries instead. | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 841 | <p><code>LOCAL_STATIC_LIBRARIES := \<br/> | 
|  | 842 |     libutils \<br/> | 
|  | 843 |     libtinyxml | 
|  | 844 | </code></p> | 
|  | 845 |  | 
|  | 846 | <h4>LOCAL_MODULE</h4> | 
|  | 847 | <p><code>LOCAL_MODULE</code> is the name of what's supposed to be generated | 
|  | 848 | from your Android.mk.  For exmample, for libkjs, the <code>LOCAL_MODULE</code> | 
|  | 849 | is "libkjs" (the build system adds the appropriate suffix -- .so .dylib .dll). | 
|  | 850 | For app modules, use <code>LOCAL_PACKAGE_NAME</code> instead of | 
|  | 851 | <code>LOCAL_MODULE</code>.  We're planning on switching to ant for the apps, | 
|  | 852 | so this might become moot.</p> | 
|  | 853 |  | 
|  | 854 | <h4>LOCAL_MODULE_PATH</h4> | 
|  | 855 | <p>Instructs the build system to put the module somewhere other than what's | 
|  | 856 | normal for its type.  If you override this, make sure you also set | 
|  | 857 | <code>LOCAL_UNSTRIPPED_PATH</code> if it's an executable or a shared library | 
|  | 858 | so the unstripped binary has somewhere to go.  An error will occur if you forget | 
|  | 859 | to.</p> | 
|  | 860 | <p>See <a href="#moving-modules">Putting modules elsewhere</a> for more.</p> | 
|  | 861 |  | 
| Colin Cross | 639c336 | 2014-01-24 19:23:40 -0800 | [diff] [blame] | 862 | <h4>LOCAL_MODULE_RELATIVE_PATH</h4> | 
|  | 863 | <p>Instructs the build system to put the module in a subdirectory under the | 
|  | 864 | directory that is normal for its type.  If you set this you do not need to | 
|  | 865 | set <code>LOCAL_UNSTRIPPED_PATH</code>, the unstripped binaries will also use | 
|  | 866 | the relative path.</p> | 
|  | 867 | <p>See <a href="#moving-modules">Putting modules elsewhere</a> for more.</p> | 
|  | 868 |  | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 869 | <h4>LOCAL_MODULE_HOST_OS</h4> | 
|  | 870 | <p>This specifies which OSes are supported by this host module. It is not used | 
|  | 871 | for target builds. The accepted values here are combinations of | 
|  | 872 | <code>linux</code>, <code>darwin</code>, and <code>windows</code>. By default, | 
|  | 873 | linux and darwin(MacOS) are considered to be supported. If a module should | 
|  | 874 | build under windows, you must specify windows, and any others to be supported. | 
|  | 875 | Some examples:</p> | 
|  | 876 | <p><code>LOCAL_MODULE_HOST_OS := linux<br/> | 
|  | 877 | LOCAL_MODULE_HOST_OS := darwin linux windows</code></p> | 
|  | 878 |  | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 879 | <h4>LOCAL_UNSTRIPPED_PATH</h4> | 
|  | 880 | <p>Instructs the build system to put the unstripped version of the module | 
|  | 881 | somewhere other than what's normal for its type.  Usually, you override this | 
|  | 882 | because you overrode <code>LOCAL_MODULE_PATH</code> for an executable or a | 
|  | 883 | shared library.  If you overrode <code>LOCAL_MODULE_PATH</code>, but not | 
|  | 884 | <code>LOCAL_UNSTRIPPED_PATH</code>, an error will occur.</p> | 
|  | 885 | <p>See <a href="#moving-modules">Putting modules elsewhere</a> for more.</p> | 
|  | 886 |  | 
|  | 887 | <h4>LOCAL_WHOLE_STATIC_LIBRARIES</h4> | 
|  | 888 | <p>These are the static libraries that you want to include in your module without allowing | 
|  | 889 | the linker to remove dead code from them. This is mostly useful if you want to add a static library | 
|  | 890 | to a shared library and have the static library's content exposed from the shared library. | 
|  | 891 | <p><code>LOCAL_WHOLE_STATIC_LIBRARIES := \<br/> | 
|  | 892 |     libsqlite3_android<br/> | 
|  | 893 | </code></p> | 
|  | 894 |  | 
|  | 895 | <h4>LOCAL_YACCFLAGS</h4> | 
|  | 896 | <p>Any flags to pass to invocations of yacc for your module.  A known limitation | 
|  | 897 | here is that the flags will be the same for all invocations of YACC for your | 
|  | 898 | module.  This can be fixed.  If you ever need it to be, just ask.</p> | 
|  | 899 | <p><code>LOCAL_YACCFLAGS := -p kjsyy</code></p> | 
|  | 900 |  | 
|  | 901 |  | 
|  | 902 |  | 
|  | 903 | <h2>Implementation Details</h2> | 
|  | 904 |  | 
|  | 905 | <p>You should never have to touch anything in the config directory unless | 
|  | 906 | you're adding a new platform, new tools, or adding new features to the | 
|  | 907 | build system.  In general, please consult with the build system owner(s) | 
|  | 908 | (<a href="mailto:android-build-team">android-build-team</a>) before you go | 
|  | 909 | mucking around in here.  That said, here are some notes on what's going on | 
|  | 910 | under the hood.</p> | 
|  | 911 |  | 
|  | 912 | <h3>Environment Setup / buildspec.mk Versioning</h3> | 
|  | 913 | <p>In order to make easier for people when the build system changes, when | 
|  | 914 | it is necessary to make changes to buildspec.mk or to rerun the environment | 
|  | 915 | setup scripts, they contain a version number in the variable | 
|  | 916 | BUILD_ENV_SEQUENCE_NUMBER.  If this variable does not match what the build | 
|  | 917 | system expects, it fails printing an error message explaining what happened. | 
|  | 918 | If you make a change that requires an update, you need to update two places | 
|  | 919 | so this message will be printed. | 
|  | 920 | <ul> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 921 | <li>In core/envsetup.mk, increment the | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 922 | CORRECT_BUILD_ENV_SEQUENCE_NUMBER definition.</li> | 
|  | 923 | <li>In buildspec.mk.default, update the BUILD_ENV_SEQUENCE_DUMBER | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 924 | definition to match the one in core/envsetup.mk</li> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 925 | </ul> | 
|  | 926 | The scripts automatically get the value from the build system, so they will | 
|  | 927 | trigger the warning as well. | 
|  | 928 | </p> | 
|  | 929 |  | 
|  | 930 | <h3>Additional makefile variables</h3> | 
|  | 931 | <p>You probably shouldn't use these variables.  Please consult | 
|  | 932 | <a href="mailto:android-build-team">android-build-team</a> before using them. | 
|  | 933 | These are mostly there for workarounds for other issues, or things that aren't | 
|  | 934 | completely done right.</p> | 
|  | 935 |  | 
|  | 936 | <h4>LOCAL_ADDITIONAL_DEPENDENCIES</h4> | 
|  | 937 | <p>If your module needs to depend on anything else that | 
|  | 938 | isn't actually built in to it, you can add those make targets to | 
|  | 939 | <code>LOCAL_ADDITIONAL_DEPENDENCIES</code>.  Usually this is a workaround | 
|  | 940 | for some other dependency that isn't created automatically.</p> | 
|  | 941 |  | 
|  | 942 | <h4>LOCAL_BUILT_MODULE</h4> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 943 | <p class=warning>This should not be used, since multiple binaries are now | 
|  | 944 | created from a single module defintiion.</p> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 945 | <p>When a module is built, the module is created in an intermediate | 
|  | 946 | directory then copied to its final location.  LOCAL_BUILT_MODULE is | 
|  | 947 | the full path to the intermediate file.  See LOCAL_INSTALLED_MODULE | 
|  | 948 | for the path to the final installed location of the module.</p> | 
|  | 949 |  | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 950 | <h4>LOCAL_IS_HOST_MODULE</h4> | 
|  | 951 | <p>Set by the host_xxx.mk includes to tell base_rules.mk and the other | 
|  | 952 | includes that we're building for the host.</p> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 953 |  | 
|  | 954 | <h4>LOCAL_INSTALLED_MODULE</h4> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 955 | <p class=warning>This should not be used, since multiple binaries are now | 
|  | 956 | created from a single module defintiion.</p> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 957 | <p>The fully qualified path name of the final location of the module. | 
|  | 958 | See LOCAL_BUILT_MODULE for the location of the intermediate file that | 
|  | 959 | the make rules should actually be constructing.</p> | 
|  | 960 |  | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 961 | <h4>LOCAL_MODULE_CLASS</h4> | 
|  | 962 | <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] | 963 | variable names used to locate the modules.  See base_rules.mk and | 
|  | 964 | envsetup.mk.</p> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 965 |  | 
|  | 966 | <h4>LOCAL_MODULE_SUFFIX</h4> | 
|  | 967 | <p>The suffix that will be appended to <code>LOCAL_MODULE</code> to form | 
|  | 968 | <code>LOCAL_MODULE_NAME</code>.  For example, .so, .a, .dylib.</p> | 
|  | 969 |  | 
|  | 970 | <h4>LOCAL_STRIP_MODULE</h4> | 
| Dan Willemsen | 0b6c348 | 2015-09-09 16:51:09 -0700 | [diff] [blame] | 971 | <p>If set to true (the default), the binary will be stripped and a debug | 
|  | 972 | link will be set up so that GDB will still work. If set to no_debuglink, | 
|  | 973 | the binary will be stripped, but no debug link will be added. If set to | 
|  | 974 | keep_symbols, it will strip the debug information, but keep the symbol table. | 
|  | 975 | Any other value will prevent stripping.</p> | 
| Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 976 |  | 
|  | 977 | <h4>LOCAL_SYSTEM_SHARED_LIBRARIES</h4> | 
|  | 978 | <p>Used while building the base libraries: libc, libm, libdl.  Usually | 
|  | 979 | it should be set to "none," as it is in $(CLEAR_VARS).  When building | 
|  | 980 | these libraries, it's set to the ones they link against.  For example, | 
|  | 981 | libc, libstdc++ and libdl don't link against anything, and libm links against | 
|  | 982 | libc.  Normally, when the value is none, these libraries are automatically | 
|  | 983 | linked in to executables and libraries, so you don't need to specify them | 
|  | 984 | manually.</p> | 
|  | 985 |  | 
|  | 986 |  | 
|  | 987 | </body> | 
|  | 988 | </html> |