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 | |
| 150 | <h3>Hiding command lines</h3> |
| 151 | <p>The default of the build system will be to hide the command lines being |
| 152 | executed for make steps. It will be possible to override this by specifying |
| 153 | the showcommands pseudo-target, and possibly by setting an environment |
| 154 | variable.</p> |
| 155 | |
| 156 | <h3>Wildcard source files</h3> |
| 157 | <p>Wildcarding source file will be discouraged. It may be useful in some |
| 158 | scenarios. The default <code>$(wildcard *)</code> will not work due to the |
| 159 | current directory being set to the root of the build tree.<p> |
| 160 | |
| 161 | <h3>Multiple targets in one directory</h3> |
| 162 | <p>It will be possible to generate more than one target from a given |
| 163 | subdirectory. For example, libutils generates a shared library for the target |
| 164 | and a static library for the host.</p> |
| 165 | |
| 166 | <h3>Makefile fragments for modules</h3> |
| 167 | <p><b>Android.mk</b> is the standard name for the makefile fragments that |
| 168 | control the building of a given module. Only the top directory should |
| 169 | have a file named "Makefile".</p> |
| 170 | |
| 171 | <h3>Use shared libraries</h3> |
| 172 | <p>Currently, the simulator is not built to use shared libraries. This should |
| 173 | be fixed, and now is a good time to do it. This implies getting shared |
| 174 | libraries to work on Mac OS.</p> |
| 175 | |
| 176 | |
| 177 | <h2>Nice to Have</h2> |
| 178 | |
| 179 | <p>These things would be nice to have, and this is a good place to record them, |
| 180 | however these are not promises.</p> |
| 181 | |
| 182 | <h3>Simultaneous Builds</h3> |
| 183 | <p>The hope is to be able to do two builds for different combos in the same |
| 184 | tree at the same time, but this is a stretch goal, not a requirement. |
| 185 | Doing two builds in the same tree, not at the same time must work. (update: |
| 186 | it's looking like we'll get the two builds at the same time working)</p> |
| 187 | |
| 188 | <h3>Deleting headers (or other dependecies)</h3> |
| 189 | <p>Problems can arise if you delete a header file that is referenced in |
| 190 | ".d" files. The easy way to deal with this is "make clean". There |
| 191 | should be a better way to handle it. (from fadden)</p> |
| 192 | <p>One way of solving this is introducing a dependency on the directory. The |
| 193 | problem is that this can create extra dependecies and slow down the build. |
| 194 | It's a tradeoff.</p> |
| 195 | |
| 196 | <h3>Multiple builds</h3> |
| 197 | <p>General way to perform builds across the set of known platforms. This |
| 198 | would make it easy to perform multiple platform builds when testing a |
| 199 | change, and allow a wide-scale "make clean". Right now the buildspec.mk |
| 200 | or environment variables need to be updated before each build. (from fadden)</p> |
| 201 | |
| 202 | <h3>Aftermarket Locales and Carrier</h3> |
| 203 | <p>We will eventually need to add support for creating locales and carrier |
| 204 | customizations to the SDK, but that will not be addressed right now.</p> |
| 205 | |
| 206 | |
| 207 | <h2><a id="usage"/>Usage</h2> |
| 208 | <p>You've read (or scrolled past) all of the motivations for this build system, |
| 209 | and you want to know how to use it. This is the place.</p> |
| 210 | |
| 211 | <h3>Your first build</h3> |
| 212 | <p>The <a href="../building.html">Building</a> document describes how do do |
| 213 | builds.</p> |
| 214 | |
| 215 | <h3>build/envsetup.sh functions</h3> |
| 216 | If you source the file build/envsetup.sh into your bash environment, |
| 217 | <code>. build/envsetup.sh</code>you'll get a few helpful shell functions: |
| 218 | |
| 219 | <ul> |
| 220 | <li><b>printconfig</b> - Prints the current configuration as set by the |
| 221 | lunch and choosecombo commands.</li> |
| 222 | <li><b>m</b> - Runs <code>make</code> from the top of the tree. This is |
| 223 | useful because you can run make from within subdirectories. If you have the |
| 224 | <code>TOP</code> environment variable set, it uses that. If you don't, it looks |
| 225 | up the tree from the current directory, trying to find the top of the tree.</li> |
| 226 | <li><b>croot</b> - <code>cd</code> to the top of the tree.</li> |
| 227 | <li><b>sgrep</b> - grep for the regex you provide in all .c, .cpp, .h, .java, |
| 228 | and .xml files below the current directory.</li> |
| 229 | </ul> |
| 230 | |
| 231 | <h3>Build flavors/types</h3> |
| 232 | <p> |
| 233 | When building for a particular product, it's often useful to have minor |
| 234 | variations on what is ultimately the final release build. These are the |
| 235 | currently-defined "flavors" or "types" (we need to settle on a real name |
| 236 | for these). |
| 237 | </p> |
| 238 | |
| 239 | <table border=1> |
| 240 | <tr> |
| 241 | <td> |
| 242 | <code>eng<code> |
| 243 | </td> |
| 244 | <td> |
| 245 | This is the default flavor. A plain "<code>make</code>" is the |
| 246 | same as "<code>make eng</code>". <code>droid</code> is an alias |
| 247 | for <code>eng</code>. |
| 248 | <ul> |
| 249 | <li>Installs modules tagged with: <code>eng</code>, <code>debug</code>, |
Thorsten Glaser | 2213aab | 2010-06-03 19:57:02 +0200 | [diff] [blame] | 250 | <code>shell_</code>$(TARGET_SHELL), |
Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 251 | <code>user</code>, and/or <code>development</code>. |
| 252 | <li>Installs non-APK modules that have no tags specified. |
| 253 | <li>Installs APKs according to the product definition files, in |
| 254 | addition to tagged APKs. |
| 255 | <li><code>ro.secure=0</code> |
| 256 | <li><code>ro.debuggable=1</code> |
| 257 | <li><code>ro.kernel.android.checkjni=1</code> |
| 258 | <li><code>adb</code> is enabled by default. |
| 259 | </td> |
| 260 | </tr> |
| 261 | <tr> |
| 262 | <td> |
| 263 | <code>user<code> |
| 264 | </td> |
| 265 | <td> |
| 266 | "<code>make user</code>" |
| 267 | <p> |
| 268 | This is the flavor intended to be the final release bits. |
| 269 | <ul> |
Thorsten Glaser | 2213aab | 2010-06-03 19:57:02 +0200 | [diff] [blame] | 270 | <li>Installs modules tagged with <code>shell_</code>$(TARGET_SHELL) and <code>user</code>. |
Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 271 | <li>Installs non-APK modules that have no tags specified. |
| 272 | <li>Installs APKs according to the product definition files; tags |
| 273 | are ignored for APK modules. |
| 274 | <li><code>ro.secure=1</code> |
| 275 | <li><code>ro.debuggable=0</code> |
| 276 | <li><code>adb</code> is disabled by default. |
| 277 | </td> |
| 278 | </tr> |
| 279 | <tr> |
| 280 | <td> |
| 281 | <code>userdebug<code> |
| 282 | </td> |
| 283 | <td> |
| 284 | "<code>make userdebug</code>" |
| 285 | <p> |
| 286 | The same as <code>user</code>, except: |
| 287 | <ul> |
| 288 | <li>Also installs modules tagged with <code>debug</code>. |
| 289 | <li><code>ro.debuggable=1</code> |
| 290 | <li><code>adb</code> is enabled by default. |
| 291 | </td> |
| 292 | </tr> |
| 293 | </table> |
| 294 | |
| 295 | <p> |
| 296 | If you build one flavor and then want to build another, you should run |
| 297 | "<code>make installclean</code>" between the two makes to guarantee that |
| 298 | you don't pick up files installed by the previous flavor. "<code>make |
| 299 | clean</code>" will also suffice, but it takes a lot longer. |
| 300 | </p> |
| 301 | |
| 302 | |
| 303 | <h3>More pseudotargets</h3> |
| 304 | <p>Sometimes you want to just build one thing. The following pseudotargets are |
| 305 | there for your convenience:</p> |
| 306 | |
| 307 | <ul> |
| 308 | <li><b>droid</b> - <code>make droid</code> is the normal build. This target |
| 309 | is here because the default target has to have a name.</li> |
| 310 | <li><b>all</b> - <code>make all</code> builds everything <code>make |
| 311 | droid</code> does, plus everything whose <code>LOCAL_MODULE_TAGS</code> do not |
| 312 | include the "droid" tag. The build server runs this to make sure |
| 313 | that everything that is in the tree and has an Android.mk builds.</li> |
| 314 | <li><b>clean-$(LOCAL_MODULE)</b> and <b>clean-$(LOCAL_PACKAGE_NAME)</b> - |
| 315 | Let you selectively clean one target. For example, you can type |
| 316 | <code>make clean-libutils</code> and it will delete libutils.so and all of the |
| 317 | intermediate files, or you can type <code>make clean-Home</code> and it will |
| 318 | clean just the Home app.</li> |
| 319 | <li><b>clean</b> - <code>make clean</code> deletes all of the output and |
| 320 | intermediate files for this configuration. This is the same as <code>rm -rf |
| 321 | out/<configuration>/</code></li> |
| 322 | <li><b>clobber</b> - <code>make clobber</code> deletes all of the output |
| 323 | and intermediate files for all configurations. This is the same as |
| 324 | <code>rm -rf out/</code>.</li> |
| 325 | <li><b>dataclean</b> - <code>make dataclean</code> deletes contents of the data |
| 326 | directory inside the current combo directory. This is especially useful on the |
| 327 | simulator and emulator, where the persistent data remains present between |
| 328 | builds.</li> |
| 329 | <li><b>showcommands</b> - <code>showcommands</code> is a modifier target |
| 330 | which causes the build system to show the actual command lines for the build |
| 331 | steps, instead of the brief descriptions. Most people don't like seeing the |
| 332 | actual commands, because they're quite long and hard to read, but if you need |
| 333 | to for debugging purposes, you can add <code>showcommands</code> to the list |
| 334 | of targets you build. For example <code>make showcommands</code> will build |
| 335 | the default android configuration, and <code>make runtime showcommands</code> |
| 336 | will build just the runtime, and targets that it depends on, while displaying |
| 337 | the full command lines. Please note that there are a couple places where the |
| 338 | commands aren't shown here. These are considered bugs, and should be fixed, |
| 339 | but they're often hard to track down. Please let |
| 340 | <a href="mailto:android-build-team">android-build-team</a> know if you find |
| 341 | any.</li> |
| 342 | <li><b>LOCAL_MODULE</b> - Anything you specify as a <code>LOCAL_MODULE</code> |
| 343 | in an Android.mk is made into a pseudotarget. For example, <code>make |
| 344 | runtime</code> might be shorthand for <code>make |
| 345 | out/linux-x86-debug/system/bin/runtime</code> (which would work), and |
| 346 | <code>make libkjs</code> might be shorthand for <code>make |
| 347 | out/linux-x86-debug/system/lib/libkjs.so</code> (which would also work).</li> |
| 348 | <li><b>targets</b> - <code>make targets</code> will print a list of all of |
| 349 | the LOCAL_MODULE names you can make.</li> |
| 350 | </ul> |
| 351 | |
| 352 | <h3><a name="templates"/>How to add another component to the build - Android.mk templates</h3> |
| 353 | <p>You have a new library, a new app, or a new executable. For each of the |
| 354 | common types of modules, there is a corresponding file in the templates |
| 355 | directory. It will usually be enough to copy one of these, and fill in your |
| 356 | own values. Some of the more esoteric values are not included in the |
| 357 | templates, but are instead just documented here, as is the documentation |
| 358 | on using custom tools to generate files.</p> |
| 359 | <p>Mostly, you can just look for the TODO comments in the templates and do |
| 360 | what it says. Please remember to delete the TODO comments when you're done |
| 361 | to keep the files clean. The templates have minimal documentation in them, |
| 362 | because they're going to be copied, and when that gets stale, the copies just |
| 363 | won't get updated. So read on...</p> |
| 364 | |
| 365 | <h4>Apps</h4> |
| 366 | <p>Use the <code>templates/apps</code> file.</p> |
| 367 | <p>This template is pretty self-explanitory. See the variables below for more |
| 368 | details.</p> |
| 369 | |
| 370 | <h4>Java Libraries</h4> |
| 371 | <p>Use the <code>templates/java_library</code> file.</p> |
| 372 | <p>The interesting thing here is the value of LOCAL_MODULE, which becomes |
| 373 | the name of the jar file. (Actually right now, we're not making jar files yet, |
| 374 | just directories of .class files, but the directory is named according to |
| 375 | what you put in LOCAL_MODULE). This name will be what goes in the |
| 376 | LOCAL_JAVA_LIBRARIES variable in modules that depend on your java library.</p> |
| 377 | |
| 378 | <h4>C/C++ Executables</h4> |
| 379 | <p>Use the <code>templates/executable</code> file, or the |
| 380 | <code>templates/executable_host</code> file.</p> |
| 381 | <p>This template has a couple extra options that you usually don't need. |
| 382 | Please delete the ones you don't need, and remove the TODO comments. It makes |
| 383 | the rest of them easier to read, and you can always refer back to the templates |
| 384 | if you need them again later.</p> |
| 385 | <p>By default, on the target these are built into /system/bin, and on the |
| 386 | host, they're built into <combo>/host/bin. These can be overridden by setting |
| 387 | <code>LOCAL_MODULE_PATH</code>. See |
| 388 | <a href="#moving-targets">Putting targets elsewhere</a> |
| 389 | for more.</p> |
| 390 | |
| 391 | <h4>Shared Libraries</h4> |
| 392 | <p>Use the <code>templates/shared_library</code> file, or the |
| 393 | <code>templates/shared_library_host</code> file.</p> |
| 394 | <p>Remember that on the target, we use shared libraries, and on the host, |
| 395 | we use static libraries, since executable size isn't as big an issue, and it |
| 396 | simplifies distribution in the SDK.</p> |
| 397 | |
| 398 | <h4>Static Libraries</h4> |
| 399 | <p>Use the <code>templates/static_library</code> file, or the |
| 400 | <code>templates/static_library_host</code> file.</p> |
| 401 | <p>Remember that on the target, we use shared libraries, and on the host, |
| 402 | we use static libraries, since executable size isn't as big an issue, and it |
| 403 | simplifies distribution in the SDK.</p> |
| 404 | |
| 405 | <h4><a name="custom-tools"/>Using Custom Tools</h4> |
| 406 | <p>If you have a tool that generates source files for you, it's possible |
| 407 | to have the build system get the dependencies correct for it. Here are |
| 408 | a couple of examples. <code>$@</code> is the make built-in variable for |
| 409 | "the current target." The <font color=red>red</font> parts are the parts you'll |
| 410 | need to change.</p> |
| 411 | |
| 412 | <p>You need to put this after you have declared <code>LOCAL_PATH</code> and |
| 413 | <code>LOCAL_MODULE</code>, because the <code>$(local-intermediates-dir)</code> |
| 414 | and <code>$(local-host-intermediates-dir)</code> macros use these variables |
| 415 | to determine where to put the files. |
| 416 | |
| 417 | <h5>Example 1</h5> |
| 418 | <p>Here, there is one generated file, called |
| 419 | chartables.c, which doesn't depend on anything. And is built by the tool |
| 420 | built to $(HOST_OUT_EXECUTABLES)/dftables. Note on the second to last line |
| 421 | that a dependency is created on the tool.</p> |
| 422 | <pre> |
| 423 | intermediates:= $(local-intermediates-dir) |
| 424 | GEN := $(intermediates)/<font color=red>chartables.c</font> |
| 425 | $(GEN): PRIVATE_CUSTOM_TOOL = <font color=red>$(HOST_OUT_EXECUTABLES)/dftables $@</font> |
| 426 | $(GEN): <font color=red>$(HOST_OUT_EXECUTABLES)/dftables</font> |
| 427 | $(transform-generated-source) |
| 428 | LOCAL_GENERATED_SOURCES += $(GEN) |
| 429 | </pre> |
| 430 | |
| 431 | <h5>Example 2</h5> |
| 432 | <p>Here as a hypothetical example, we use use cat as if it were to transform |
| 433 | a file. Pretend that it does something useful. Note how we use a |
| 434 | target-specific variable called PRIVATE_INPUT_FILE to store the name of the |
| 435 | input file.</p> |
| 436 | <pre> |
| 437 | intermediates:= $(local-intermediates-dir) |
| 438 | GEN := $(intermediates)/<font color=red>file.c</font> |
| 439 | $(GEN): PRIVATE_INPUT_FILE := $(LOCAL_PATH)/<font color=red>input.file</font> |
| 440 | $(GEN): PRIVATE_CUSTOM_TOOL = <font color=red>cat $(PRIVATE_INPUT_FILE) > $@</font> |
| 441 | $(GEN): <font color=red>$(LOCAL_PATH)/file.c</font> |
| 442 | $(transform-generated-source) |
| 443 | LOCAL_GENERATED_SOURCES += $(GEN) |
| 444 | </pre> |
| 445 | |
| 446 | <h5>Example 3</h5> |
| 447 | <p>If you have several files that are all similar in |
| 448 | name, and use the same tool, you can combine them. (here the *.lut.h files are |
| 449 | the generated ones, and the *.cpp files are the input files)</p> |
| 450 | <pre> |
| 451 | intermediates:= $(local-intermediates-dir) |
| 452 | GEN := $(addprefix $(intermediates)<font color=red>/kjs/, \ |
| 453 | array_object.lut.h \ |
| 454 | bool_object.lut.h \</font> |
| 455 | ) |
| 456 | $(GEN): PRIVATE_CUSTOM_TOOL = <font color=red>perl libs/WebKitLib/WebKit/JavaScriptCore/kjs/create_hash_table $< -i > $@</font> |
| 457 | $(GEN): $(intermediates)/<font color=red>%.lut.h</font> : $(LOCAL_PATH)/<font color=red>%.cpp</font> |
| 458 | $(transform-generated-source) |
| 459 | LOCAL_GENERATED_SOURCES += $(GEN) |
| 460 | </pre> |
| 461 | |
| 462 | <h3><a name="platform-specific"/>Platform specific conditionals</h3> |
| 463 | <p>Sometimes you need to set flags specifically for different platforms. Here |
| 464 | is a list of which values the different build-system defined variables will be |
| 465 | set to and some examples.</p> |
| 466 | <p>For a device build, <code>TARGET_OS</code> is <code>linux</code> (we're using |
| 467 | linux!), and <code>TARGET_ARCH</code> is <code>arm</code>.</p> |
| 468 | <p>For a simulator build, <code>TARGET_OS</code> and <code>TARGET_ARCH</code> |
| 469 | are set to the same as <code>HOST_OS</code> and <code>HOST_ARCH</code> are |
| 470 | on your platform. <code>TARGET_PRODUCT</code> is the name of the target |
| 471 | hardware/product you are building for. The value <code>sim</code> is used |
| 472 | for the simulator. We haven't thought through the full extent of customization |
| 473 | that will happen here, but likely there will be additional UI configurations |
| 474 | specified here as well.</p> |
| 475 | <table cellspacing=25> |
| 476 | <tr> |
| 477 | <td valign=top align=center> |
| 478 | <b>HOST_OS</b><br/> |
| 479 | linux<br/> |
| 480 | darwin<br/> |
| 481 | (cygwin) |
| 482 | </td> |
| 483 | <td valign=top align=center> |
| 484 | <b>HOST_ARCH</b><br/> |
| 485 | x86 |
| 486 | </td> |
| 487 | <td valign=top align=center> |
| 488 | <b>HOST_BUILD_TYPE</b><br/> |
| 489 | release<br/> |
| 490 | debug |
| 491 | </td> |
| 492 | </tr> |
| 493 | <tr> |
| 494 | <td valign=top align=center> |
| 495 | <b>TARGET_OS</b><br/> |
| 496 | linux<br/> |
| 497 | darwin<br/> |
| 498 | (cygwin) |
| 499 | </td> |
| 500 | <td valign=top align=center> |
| 501 | <b>TARGET_ARCH</b><br/> |
| 502 | arm<br/> |
| 503 | x86 |
| 504 | </td> |
| 505 | <td valign=top align=center> |
| 506 | <b>TARGET_BUILD_TYPE</b><br/> |
| 507 | release<br/> |
| 508 | debug |
| 509 | </td> |
| 510 | <td valign=top align=center> |
| 511 | <b>TARGET_PRODUCT</b><br/> |
| 512 | sim<br/> |
| 513 | dream<br/> |
| 514 | sooner |
| 515 | </td> |
| 516 | </tr> |
| 517 | </table> |
| 518 | |
Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 519 | <h4>Some Examples</h4> |
Jeff Brown | e33ba4c | 2011-07-11 22:11:46 -0700 | [diff] [blame] | 520 | <pre>ifeq ($(TARGET_BUILD_TYPE),release) |
Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 521 | LOCAL_CFLAGS += -DNDEBUG=1 |
| 522 | endif |
| 523 | |
| 524 | # from libutils |
| 525 | ifeq ($(TARGET_OS),linux) |
| 526 | # Use the futex based mutex and condition variable |
| 527 | # implementation from android-arm because it's shared mem safe |
| 528 | LOCAL_SRC_FILES += futex_synchro.c |
| 529 | LOCAL_LDLIBS += -lrt -ldl |
| 530 | endif |
| 531 | |
| 532 | </pre> |
| 533 | |
| 534 | |
| 535 | <h3><a name="moving-modules"/>Putting modules elsewhere</h3> |
| 536 | <p>If you have modules that normally go somewhere, and you need to have them |
| 537 | build somewhere else, read this. One use of this is putting files on |
| 538 | the root filesystem instead of where they normally go in /system. Add these |
| 539 | lines to your Android.mk:</p> |
| 540 | <pre> |
| 541 | LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT_SBIN) |
| 542 | LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_SBIN_UNSTRIPPED) |
| 543 | </pre> |
| 544 | <p>For executables and libraries, you need to also specify a |
| 545 | <code>LOCAL_UNSTRIPPED_PATH</code> location, because on target builds, we keep |
| 546 | the unstripped executables so GDB can find the symbols.</code> |
| 547 | <p>Look in <code>config/envsetup.make</code> for all of the variables defining |
| 548 | places to build things.</p> |
| 549 | <p>FYI: If you're installing an executable to /sbin, you probably also want to |
| 550 | set <code>LOCAL_FORCE_STATIC_EXCUTABLE := true</code> in your Android.mk, which |
| 551 | will force the linker to only accept static libraries.</p> |
| 552 | |
| 553 | |
| 554 | <h3>Android.mk variables</h3> |
| 555 | <p>These are the variables that you'll commonly see in Android.mk files, listed |
| 556 | alphabetically.</p> |
| 557 | <p>But first, a note on variable naming: |
| 558 | <ul> |
| 559 | <li><b>LOCAL_</b> - These variables are set per-module. They are cleared |
| 560 | by the <code>include $(CLEAR_VARS)</code> line, so you can rely on them |
| 561 | being empty after including that file. Most of the variables you'll use |
| 562 | in most modules are LOCAL_ variables.</li> |
| 563 | <li><b>PRIVATE_</b> - These variables are make-target-specific variables. That |
| 564 | means they're only usable within the commands for that module. It also |
| 565 | means that they're unlikely to change behind your back from modules that |
| 566 | are included after yours. This |
| 567 | <a href="http://www.gnu.org/software/make/manual/make.html#Target_002dspecific">link to the make documentation</a> |
| 568 | describes more about target-specific variables. Please note that there |
| 569 | are a couple of these laying around the tree that aren't prefixed with |
| 570 | PRIVATE_. It is safe, and they will be fixed as they are discovered. |
| 571 | Sorry for the confusion.</li> |
| 572 | <li><b>INTERNAL_</b> - These variables are critical to functioning of |
| 573 | the build system, so you shouldn't create variables named like this, and |
| 574 | you probably shouldn't be messing with these variables in your makefiles. |
| 575 | </li> |
| 576 | <li><b>HOST_</b> and <b>TARGET_</b> - These contain the directories |
| 577 | and definitions that are specific to either the host or the target builds. |
| 578 | Do not set variables that start with HOST_ or TARGET_ in your makefiles. |
| 579 | </li> |
| 580 | <li><b>BUILD_</b> and <b>CLEAR_VARS</b> - These contain the names of |
| 581 | well-defined template makefiles to include. Some examples are CLEAR_VARS |
| 582 | and BUILD_HOST_PACKAGE.</li> |
| 583 | <li>Any other name is fair-game for you to use in your Android.mk. However, |
| 584 | remember that this is a non-recursive build system, so it is possible that |
| 585 | your variable will be changed by another Android.mk included later, and be |
| 586 | different when the commands for your rule / module are executed.</li> |
| 587 | </ul> |
| 588 | </p> |
| 589 | |
| 590 | <h4>LOCAL_ASSET_FILES</h4> |
| 591 | <p>In Android.mk files that <code>include $(BUILD_PACKAGE)</code> set this |
| 592 | to the set of files you want built into your app. Usually:</p> |
| 593 | <p><code>LOCAL_ASSET_FILES += $(call find-subdir-assets)</code></p> |
| 594 | <p>This will probably change when we switch to ant for the apps' build |
| 595 | system.</p> |
| 596 | |
| 597 | <h4>LOCAL_CC</h4> |
| 598 | <p>If you want to use a different C compiler for this module, set LOCAL_CC |
| 599 | to the path to the compiler. If LOCAL_CC is blank, the appropriate default |
| 600 | compiler is used.</p> |
| 601 | |
| 602 | <h4>LOCAL_CXX</h4> |
| 603 | <p>If you want to use a different C++ compiler for this module, set LOCAL_CXX |
| 604 | to the path to the compiler. If LOCAL_CXX is blank, the appropriate default |
| 605 | compiler is used.</p> |
| 606 | |
| 607 | <h4>LOCAL_CFLAGS</h4> |
| 608 | <p>If you have additional flags to pass into the C or C++ compiler, add |
| 609 | them here. For example:</p> |
| 610 | <p><code>LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1</code></p> |
| 611 | |
| 612 | <h4>LOCAL_CPPFLAGS</h4> |
| 613 | <p>If you have additional flags to pass into <i>only</i> the C++ compiler, add |
| 614 | them here. For example:</p> |
| 615 | <p><code>LOCAL_CPPFLAGS += -ffriend-injection</code></p> |
| 616 | <code>LOCAL_CPPFLAGS</code> is guaranteed to be after <code>LOCAL_CFLAGS</code> |
| 617 | on the compile line, so you can use it to override flags listed in |
| 618 | <code>LOCAL_CFLAGS</code>. |
| 619 | |
| 620 | <h4>LOCAL_CPP_EXTENSION</h4> |
| 621 | <p>If your C++ files end in something other than "<code>.cpp</code>", |
| 622 | you can specify the custom extension here. For example:</p> |
| 623 | <p><code>LOCAL_CPP_EXTENSION := .cc</code></p> |
| 624 | Note that all C++ files for a given module must have the same |
| 625 | extension; it is not currently possible to mix different extensions. |
| 626 | |
| 627 | <h4>LOCAL_NO_DEFAULT_COMPILER_FLAGS</h4> |
| 628 | <p>Normally, the compile line for C and C++ files includes global include |
| 629 | paths and global cflags. If <code>LOCAL_NO_DEFAULT_COMPILER_FLAGS</code> |
| 630 | is non-empty, none of the default includes or flags will be used when compiling |
| 631 | C and C++ files in this module. |
| 632 | <code>LOCAL_C_INCLUDES</code>, <code>LOCAL_CFLAGS</code>, and |
| 633 | <code>LOCAL_CPPFLAGS</code> will still be used in this case, as will |
| 634 | any <code>DEBUG_CFLAGS</code> that are defined for the module. |
| 635 | |
| 636 | <h4>LOCAL_COPY_HEADERS</h4> |
| 637 | <p class=warning>This will be going away.</p> |
| 638 | <p>The set of files to copy to the install include tree. You must also |
| 639 | supply <code>LOCAL_COPY_HEADERS_TO</code>.</p> |
| 640 | <p>This is going away because copying headers messes up the error messages, and |
| 641 | may lead to people editing those headers instead of the correct ones. It also |
| 642 | makes it easier to do bad layering in the system, which we want to avoid. We |
| 643 | also aren't doing a C/C++ SDK, so there is no ultimate requirement to copy any |
| 644 | headers.</p> |
| 645 | |
| 646 | <h4>LOCAL_COPY_HEADERS_TO</h4> |
| 647 | <p class=warning>This will be going away.</p> |
| 648 | <p>The directory within "include" to copy the headers listed in |
| 649 | <code>LOCAL_COPY_HEADERS</code> to.</p> |
| 650 | <p>This is going away because copying headers messes up the error messages, and |
| 651 | may lead to people editing those headers instead of the correct ones. It also |
| 652 | makes it easier to do bad layering in the system, which we want to avoid. We |
| 653 | also aren't doing a C/C++ SDK, so there is no ultimate requirement to copy any |
| 654 | headers.</p> |
| 655 | |
| 656 | <h4>LOCAL_C_INCLUDES</h4> |
| 657 | <p>Additional directories to instruct the C/C++ compilers to look for header |
| 658 | files in. These paths are rooted at the top of the tree. Use |
| 659 | <code>LOCAL_PATH</code> if you have subdirectories of your own that you |
| 660 | want in the include paths. For example:</p> |
| 661 | <p><code> |
| 662 | LOCAL_C_INCLUDES += extlibs/zlib-1.2.3<br/> |
| 663 | LOCAL_C_INCLUDES += $(LOCAL_PATH)/src |
| 664 | </code></p> |
| 665 | <p>You should not add subdirectories of include to |
| 666 | <code>LOCAL_C_INCLUDES</code>, instead you should reference those files |
| 667 | in the <code>#include</code> statement with their subdirectories. For |
| 668 | example:</p> |
| 669 | <p><code>#include <utils/KeyedVector.h></code><br/> |
| 670 | not <code><s>#include <KeyedVector.h></s></code></p> |
| 671 | <p>There are some components that are doing this wrong, and should be cleaned |
| 672 | up.</p> |
| 673 | |
| 674 | <h4>LOCAL_MODULE_TAGS</h4> |
| 675 | <p>Set <code>LOCAL_MODULE_TAGS</code> to any number of whitespace-separated |
| 676 | tags. If the tag list is empty or contains <code>droid</code>, the module |
Thorsten Glaser | 2213aab | 2010-06-03 19:57:02 +0200 | [diff] [blame] | 677 | will get installed as part of a <code>make droid</code>. Modules with the tag |
| 678 | <code>shell_</code>$(TARGET_SHELL) will also be installed. Otherwise, it will |
Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 679 | only get installed by running <code>make <your-module></code> |
| 680 | or with the <code>make all</code> pseudotarget.</p> |
| 681 | |
| 682 | <h4>LOCAL_REQUIRED_MODULES</h4> |
| 683 | <p>Set <code>LOCAL_REQUIRED_MODULES</code> to any number of whitespace-separated |
| 684 | module names, like "libblah" or "Email". If this module is installed, all |
| 685 | of the modules that it requires will be installed as well. This can be |
| 686 | used to, e.g., ensure that necessary shared libraries or providers are |
| 687 | installed when a given app is installed. |
| 688 | |
| 689 | <h4>LOCAL_FORCE_STATIC_EXECUTABLE</h4> |
| 690 | <p>If your executable should be linked statically, set |
| 691 | <code>LOCAL_FORCE_STATIC_EXECUTABLE:=true</code>. There is a very short |
| 692 | list of libraries that we have in static form (currently only libc). This is |
| 693 | really only used for executables in /sbin on the root filesystem.</p> |
| 694 | |
| 695 | <h4>LOCAL_GENERATED_SOURCES</h4> |
| 696 | <p>Files that you add to <code>LOCAL_GENERATED_SOURCES</code> will be |
| 697 | automatically generated and then linked in when your module is built. |
| 698 | See the <a href="#custom-tools">Custom Tools</a> template makefile for an |
| 699 | example.</p> |
| 700 | |
Brian Carlstrom | f184a0f | 2010-02-01 11:13:32 -0800 | [diff] [blame] | 701 | <h4>LOCAL_JAVACFLAGS</h4> |
| 702 | <p>If you have additional flags to pass into the javac compiler, add |
| 703 | them here. For example:</p> |
| 704 | <p><code>LOCAL_JAVACFLAGS += -Xlint:deprecation</code></p> |
| 705 | |
Joe Onorato | 2303bf0 | 2008-10-23 19:37:58 -0700 | [diff] [blame] | 706 | <h4>LOCAL_JAVA_LIBRARIES</h4> |
| 707 | <p>When linking Java apps and libraries, <code>LOCAL_JAVA_LIBRARIES</code> |
| 708 | specifies which sets of java classes to include. Currently there are |
| 709 | two of these: <code>core</code> and <code>framework</code>. |
| 710 | In most cases, it will look like this:</p> |
| 711 | <p><code>LOCAL_JAVA_LIBRARIES := core framework</code></p> |
| 712 | <p>Note that setting <code>LOCAL_JAVA_LIBRARIES</code> is not necessary |
| 713 | (and is not allowed) when building an APK with |
| 714 | "<code>include $(BUILD_PACKAGE)</code>". The appropriate libraries |
| 715 | will be included automatically.</p> |
| 716 | |
| 717 | <h4>LOCAL_LDFLAGS</h4> |
| 718 | <p>You can pass additional flags to the linker by setting |
| 719 | <code>LOCAL_LDFLAGS</code>. Keep in mind that the order of parameters is |
| 720 | very important to ld, so test whatever you do on all platforms.</p> |
| 721 | |
| 722 | <h4>LOCAL_LDLIBS</h4> |
| 723 | <p><code>LOCAL_LDLIBS</code> allows you to specify additional libraries |
| 724 | that are not part of the build for your executable or library. Specify |
| 725 | the libraries you want in -lxxx format; they're passed directly to the |
| 726 | link line. However, keep in mind that there will be no dependency generated |
| 727 | for these libraries. It's most useful in simulator builds where you want |
| 728 | to use a library preinstalled on the host. The linker (ld) is a particularly |
| 729 | fussy beast, so it's sometimes necessary to pass other flags here if you're |
| 730 | doing something sneaky. Some examples:</p> |
| 731 | <p><code>LOCAL_LDLIBS += -lcurses -lpthread<br/> |
| 732 | LOCAL_LDLIBS += -Wl,-z,origin |
| 733 | </code></p> |
| 734 | |
| 735 | <h4>LOCAL_NO_MANIFEST</h4> |
| 736 | <p>If your package doesn't have a manifest (AndroidManifest.xml), then |
| 737 | set <code>LOCAL_NO_MANIFEST:=true</code>. The common resources package |
| 738 | does this.</p> |
| 739 | |
| 740 | <h4>LOCAL_PACKAGE_NAME</h4> |
| 741 | <p><code>LOCAL_PACKAGE_NAME</code> is the name of an app. For example, |
| 742 | Dialer, Contacts, etc. This will probably change or go away when we switch |
| 743 | to an ant-based build system for the apps.</p> |
| 744 | |
| 745 | <h4>LOCAL_PATH</h4> |
| 746 | <p>The directory your Android.mk file is in. You can set it by putting the |
| 747 | following as the first line in your Android.mk:</p> |
| 748 | <p><code>LOCAL_PATH := $(my-dir)</code></p> |
| 749 | <p>The <code>my-dir</code> macro uses the |
| 750 | <code><a href="http://www.gnu.org/software/make/manual/make.html#MAKEFILE_005fLIST-Variable">MAKEFILE_LIST</a></code> |
| 751 | variable, so you must call it before you include any other makefiles. Also, |
| 752 | consider that any subdirectories you inlcude might reset LOCAL_PATH, so do your |
| 753 | own stuff before you include them. This also means that if you try to write |
| 754 | several <code>include</code> lines that reference <code>LOCAL_PATH</code>, |
| 755 | it won't work, because those included makefiles might reset LOCAL_PATH. |
| 756 | |
| 757 | <h4>LOCAL_POST_PROCESS_COMMAND</h4> |
| 758 | <p>For host executables, you can specify a command to run on the module |
| 759 | after it's been linked. You might have to go through some contortions |
| 760 | to get variables right because of early or late variable evaluation:</p> |
| 761 | <p><code>module := $(HOST_OUT_EXECUTABLES)/$(LOCAL_MODULE)<br/> |
| 762 | LOCAL_POST_PROCESS_COMMAND := /Developer/Tools/Rez -d __DARWIN__ -t APPL\<br/> |
| 763 | -d __WXMAC__ -o $(module) Carbon.r |
| 764 | </code></p> |
| 765 | |
| 766 | <h4>LOCAL_PREBUILT_EXECUTABLES</h4> |
| 767 | <p>When including $(BUILD_PREBUILT) or $(BUILD_HOST_PREBUILT), set these to |
| 768 | executables that you want copied. They're located automatically into the |
| 769 | right bin directory.</p> |
| 770 | |
| 771 | <h4>LOCAL_PREBUILT_LIBS</h4> |
| 772 | <p>When including $(BUILD_PREBUILT) or $(BUILD_HOST_PREBUILT), set these to |
| 773 | libraries that you want copied. They're located automatically into the |
| 774 | right lib directory.</p> |
| 775 | |
| 776 | <h4>LOCAL_SHARED_LIBRARIES</h4> |
| 777 | <p>These are the libraries you directly link against. You don't need to |
| 778 | pass transitively included libraries. Specify the name without the suffix:</p> |
| 779 | <p><code>LOCAL_SHARED_LIBRARIES := \<br/> |
| 780 | libutils \<br/> |
| 781 | libui \<br/> |
| 782 | libaudio \<br/> |
| 783 | libexpat \<br/> |
| 784 | libsgl |
| 785 | </code></p> |
| 786 | |
| 787 | <h4>LOCAL_SRC_FILES</h4> |
| 788 | <p>The build system looks at <code>LOCAL_SRC_FILES</code> to know what source |
| 789 | files to compile -- .cpp .c .y .l .java. For lex and yacc files, it knows |
| 790 | how to correctly do the intermediate .h and .c/.cpp files automatically. If |
| 791 | the files are in a subdirectory of the one containing the Android.mk, prefix |
| 792 | them with the directory name:</p> |
| 793 | <p><code>LOCAL_SRC_FILES := \<br/> |
| 794 | file1.cpp \<br/> |
| 795 | dir/file2.cpp |
| 796 | </code></p> |
| 797 | |
| 798 | <h4>LOCAL_STATIC_LIBRARIES</h4> |
| 799 | <p>These are the static libraries that you want to include in your module. |
| 800 | Mostly, we use shared libraries, but there are a couple of places, like |
| 801 | executables in sbin and host executables where we use static libraries instead. |
| 802 | <p><code>LOCAL_STATIC_LIBRARIES := \<br/> |
| 803 | libutils \<br/> |
| 804 | libtinyxml |
| 805 | </code></p> |
| 806 | |
| 807 | <h4>LOCAL_MODULE</h4> |
| 808 | <p><code>LOCAL_MODULE</code> is the name of what's supposed to be generated |
| 809 | from your Android.mk. For exmample, for libkjs, the <code>LOCAL_MODULE</code> |
| 810 | is "libkjs" (the build system adds the appropriate suffix -- .so .dylib .dll). |
| 811 | For app modules, use <code>LOCAL_PACKAGE_NAME</code> instead of |
| 812 | <code>LOCAL_MODULE</code>. We're planning on switching to ant for the apps, |
| 813 | so this might become moot.</p> |
| 814 | |
| 815 | <h4>LOCAL_MODULE_PATH</h4> |
| 816 | <p>Instructs the build system to put the module somewhere other than what's |
| 817 | normal for its type. If you override this, make sure you also set |
| 818 | <code>LOCAL_UNSTRIPPED_PATH</code> if it's an executable or a shared library |
| 819 | so the unstripped binary has somewhere to go. An error will occur if you forget |
| 820 | to.</p> |
| 821 | <p>See <a href="#moving-modules">Putting modules elsewhere</a> for more.</p> |
| 822 | |
| 823 | <h4>LOCAL_UNSTRIPPED_PATH</h4> |
| 824 | <p>Instructs the build system to put the unstripped version of the module |
| 825 | somewhere other than what's normal for its type. Usually, you override this |
| 826 | because you overrode <code>LOCAL_MODULE_PATH</code> for an executable or a |
| 827 | shared library. If you overrode <code>LOCAL_MODULE_PATH</code>, but not |
| 828 | <code>LOCAL_UNSTRIPPED_PATH</code>, an error will occur.</p> |
| 829 | <p>See <a href="#moving-modules">Putting modules elsewhere</a> for more.</p> |
| 830 | |
| 831 | <h4>LOCAL_WHOLE_STATIC_LIBRARIES</h4> |
| 832 | <p>These are the static libraries that you want to include in your module without allowing |
| 833 | the linker to remove dead code from them. This is mostly useful if you want to add a static library |
| 834 | to a shared library and have the static library's content exposed from the shared library. |
| 835 | <p><code>LOCAL_WHOLE_STATIC_LIBRARIES := \<br/> |
| 836 | libsqlite3_android<br/> |
| 837 | </code></p> |
| 838 | |
| 839 | <h4>LOCAL_YACCFLAGS</h4> |
| 840 | <p>Any flags to pass to invocations of yacc for your module. A known limitation |
| 841 | here is that the flags will be the same for all invocations of YACC for your |
| 842 | module. This can be fixed. If you ever need it to be, just ask.</p> |
| 843 | <p><code>LOCAL_YACCFLAGS := -p kjsyy</code></p> |
| 844 | |
| 845 | |
| 846 | |
| 847 | <h2>Implementation Details</h2> |
| 848 | |
| 849 | <p>You should never have to touch anything in the config directory unless |
| 850 | you're adding a new platform, new tools, or adding new features to the |
| 851 | build system. In general, please consult with the build system owner(s) |
| 852 | (<a href="mailto:android-build-team">android-build-team</a>) before you go |
| 853 | mucking around in here. That said, here are some notes on what's going on |
| 854 | under the hood.</p> |
| 855 | |
| 856 | <h3>Environment Setup / buildspec.mk Versioning</h3> |
| 857 | <p>In order to make easier for people when the build system changes, when |
| 858 | it is necessary to make changes to buildspec.mk or to rerun the environment |
| 859 | setup scripts, they contain a version number in the variable |
| 860 | BUILD_ENV_SEQUENCE_NUMBER. If this variable does not match what the build |
| 861 | system expects, it fails printing an error message explaining what happened. |
| 862 | If you make a change that requires an update, you need to update two places |
| 863 | so this message will be printed. |
| 864 | <ul> |
| 865 | <li>In config/envsetup.make, increment the |
| 866 | CORRECT_BUILD_ENV_SEQUENCE_NUMBER definition.</li> |
| 867 | <li>In buildspec.mk.default, update the BUILD_ENV_SEQUENCE_DUMBER |
| 868 | definition to match the one in config/envsetup.make</li> |
| 869 | </ul> |
| 870 | The scripts automatically get the value from the build system, so they will |
| 871 | trigger the warning as well. |
| 872 | </p> |
| 873 | |
| 874 | <h3>Additional makefile variables</h3> |
| 875 | <p>You probably shouldn't use these variables. Please consult |
| 876 | <a href="mailto:android-build-team">android-build-team</a> before using them. |
| 877 | These are mostly there for workarounds for other issues, or things that aren't |
| 878 | completely done right.</p> |
| 879 | |
| 880 | <h4>LOCAL_ADDITIONAL_DEPENDENCIES</h4> |
| 881 | <p>If your module needs to depend on anything else that |
| 882 | isn't actually built in to it, you can add those make targets to |
| 883 | <code>LOCAL_ADDITIONAL_DEPENDENCIES</code>. Usually this is a workaround |
| 884 | for some other dependency that isn't created automatically.</p> |
| 885 | |
| 886 | <h4>LOCAL_BUILT_MODULE</h4> |
| 887 | <p>When a module is built, the module is created in an intermediate |
| 888 | directory then copied to its final location. LOCAL_BUILT_MODULE is |
| 889 | the full path to the intermediate file. See LOCAL_INSTALLED_MODULE |
| 890 | for the path to the final installed location of the module.</p> |
| 891 | |
| 892 | <h4>LOCAL_HOST</h4> |
| 893 | <p>Set by the host_xxx.make includes to tell base_rules.make and the other |
| 894 | includes that we're building for the host. Kenneth did this as part of |
| 895 | openbinder, and I would like to clean it up so the rules, includes and |
| 896 | definitions aren't duplicated for host and target.</p> |
| 897 | |
| 898 | <h4>LOCAL_INSTALLED_MODULE</h4> |
| 899 | <p>The fully qualified path name of the final location of the module. |
| 900 | See LOCAL_BUILT_MODULE for the location of the intermediate file that |
| 901 | the make rules should actually be constructing.</p> |
| 902 | |
| 903 | <h4>LOCAL_REPLACE_VARS</h4> |
| 904 | <p>Used in some stuff remaining from the openbinder for building scripts |
| 905 | with particular values set,</p> |
| 906 | |
| 907 | <h4>LOCAL_SCRIPTS</h4> |
| 908 | <p>Used in some stuff remaining from the openbinder build system that we |
| 909 | might find handy some day.</p> |
| 910 | |
| 911 | <h4>LOCAL_MODULE_CLASS</h4> |
| 912 | <p>Which kind of module this is. This variable is used to construct other |
| 913 | variable names used to locate the modules. See base_rules.make and |
| 914 | envsetup.make.</p> |
| 915 | |
| 916 | <h4>LOCAL_MODULE_NAME</h4> |
| 917 | <p>Set to the leaf name of the LOCAL_BUILT_MODULE. I'm not sure, |
| 918 | but it looks like it's just used in the WHO_AM_I variable to identify |
| 919 | in the pretty printing what's being built.</p> |
| 920 | |
| 921 | <h4>LOCAL_MODULE_SUFFIX</h4> |
| 922 | <p>The suffix that will be appended to <code>LOCAL_MODULE</code> to form |
| 923 | <code>LOCAL_MODULE_NAME</code>. For example, .so, .a, .dylib.</p> |
| 924 | |
| 925 | <h4>LOCAL_STRIP_MODULE</h4> |
| 926 | <p>Calculated in base_rules.make to determine if this module should actually |
| 927 | be stripped or not, based on whether <code>LOCAL_STRIPPABLE_MODULE</code> |
| 928 | is set, and whether the combo is configured to ever strip modules. With |
| 929 | Iliyan's stripping tool, this might change.</p> |
| 930 | |
| 931 | <h4>LOCAL_STRIPPABLE_MODULE</h4> |
| 932 | <p>Set by the include makefiles if that type of module is strippable. |
| 933 | Executables and shared libraries are.</p> |
| 934 | |
| 935 | <h4>LOCAL_SYSTEM_SHARED_LIBRARIES</h4> |
| 936 | <p>Used while building the base libraries: libc, libm, libdl. Usually |
| 937 | it should be set to "none," as it is in $(CLEAR_VARS). When building |
| 938 | these libraries, it's set to the ones they link against. For example, |
| 939 | libc, libstdc++ and libdl don't link against anything, and libm links against |
| 940 | libc. Normally, when the value is none, these libraries are automatically |
| 941 | linked in to executables and libraries, so you don't need to specify them |
| 942 | manually.</p> |
| 943 | |
| 944 | |
| 945 | </body> |
| 946 | </html> |