989 lines
		
	
	
		
			44 KiB
		
	
	
	
		
			HTML
		
	
	
	
			
		
		
	
	
			989 lines
		
	
	
		
			44 KiB
		
	
	
	
		
			HTML
		
	
	
	
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 | |
|  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 | |
| 
 | |
| <html xmlns="http://www.w3.org/1999/xhtml">
 | |
| 
 | |
| <!--
 | |
|   A lot of people read this document template.  Please keep it clean:
 | |
| 
 | |
|    - keep the document xhtml-compliant, as many people use validating editors
 | |
|    - check your edits for typos, spelling errors, and questionable grammar
 | |
|    - prefer css styles to formatting tags like <font>, <tt>, etc.
 | |
|    - keep it human-readable and human-editable in a plain text editor:
 | |
|      - strive to keep lines wrapped at 80 columns, unless a link prevents it
 | |
|      - use plenty of whitespace
 | |
|      - try to pretty-format (wrt nesting and indenting) any hairy html
 | |
|    - check your inline javascript for errors using the javascript console
 | |
|    
 | |
|   Your readers will be very appreciative.
 | |
| -->
 | |
| 
 | |
| <head>
 | |
|   <title>Android Build System</title>
 | |
| 
 | |
|   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 | |
| 
 | |
|   <link href="../android.css" type="text/css" rel="stylesheet" />
 | |
| 
 | |
| <!-- commenting out so the xhtml validator doesn't whine about < and &&;
 | |
|      the browser should still find the script tag. -->
 | |
| <script language="JavaScript1.2" type="text/javascript">
 | |
| <!--
 | |
| function highlight(name) {
 | |
|   if (document.getElementsByTagName) {
 | |
|     tags              = [ 'span', 'div', 'tr', 'td' ];
 | |
|     for (i in tags) {
 | |
|       elements        = document.getElementsByTagName(tags[i]);
 | |
|       if (elements) {
 | |
|         for (j = 0; j < elements.length; j++) {
 | |
|           elementName = elements[j].getAttribute("class");
 | |
|           if (elementName == name) {
 | |
|             elements[j].style.backgroundColor = "#C0F0C0";
 | |
|           } else if (elementName && elementName.indexOf("rev") == 0) {
 | |
|             elements[j].style.backgroundColor = "#FFFFFF";
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| //-->
 | |
|   </script>
 | |
|   <!-- this style sheet is for the style of the toc -->
 | |
|   <link href="toc.css" type="text/css" rel="stylesheet" />
 | |
| 
 | |
|   <style type="text/css">
 | |
|     .warning {
 | |
|         border: 1px solid red;
 | |
|         padding: 8px;
 | |
|         color: red;
 | |
|     }
 | |
|     pre.prettyprint {
 | |
|         margin-top: 0;
 | |
|     }
 | |
|     li {
 | |
|         margin-top: 8px;
 | |
|     }
 | |
|   </style>
 | |
| </head>
 | |
| 
 | |
| <body onload="prettyPrint()">
 | |
| 
 | |
| <h1><a name="My_Project_" />Android Build System</h1>
 | |
| 
 | |
| <!-- Status is one of: Draft, Current, Needs Update, Obsolete -->
 | |
| <p style="text-align:center">
 | |
|   <strong>Status:</strong> <em>Draft </em>  
 | |
|   <small>(as of May 18, 2006)</small>
 | |
| </p>
 | |
| 
 | |
| <p><b>Contents</b></p>
 | |
| <!-- this div expands out to a list of contents based on the H2 and H3 headings.
 | |
| Believe it! -->
 | |
|  <div id="nav"  class="nav-2-levels"></div>
 | |
| 
 | |
| <h2>Objective</h2>
 | |
| <p>The primary goals of reworking the build system are (1) to make dependencies
 | |
| work more reliably, so that when files need to rebuilt, they are, and (2) to
 | |
| improve performance of the build system so that unnecessary modules are not
 | |
| rebuilt, and so doing a top-level build when little or nothing needs to be done
 | |
| for a build takes as little time as possible.</p>
 | |
| 
 | |
| <h2>Principles and Use Cases and Policy</h2>
 | |
| <p>Given the above objective, these are the overall principles and use cases
 | |
| that we will support.  This is not an exhaustive list.</p>
 | |
| <h3>Multiple Targets</h3>
 | |
| <p>It needs to be possible to build the Android platform for multiple targets.
 | |
| This means:</p>
 | |
| <ul>
 | |
|     <li>The build system will support building tools for the host platform,
 | |
|     both ones that are used in the build process itself, and developer tools
 | |
|     like the simulator.</li>
 | |
|     <li>The build system will need to be able to build tools on Linux
 | |
|     (definitely Goobuntu and maybe Grhat), MacOS, and to some degree on
 | |
|     Windows.</li>
 | |
|     <li>The build system will need to be able to build the OS on Linux, and in
 | |
|     the short-term, MacOS.  Note that this is a conscious decision to stop
 | |
|     building the OS on Windows.  We are going to rely on the emulator there
 | |
|     and not attempt to use the simulator.  This is a requirement change now
 | |
|     that the emulator story is looking brighter.</li>
 | |
| </ul>
 | |
| <h3>Non-Recursive Make</h3>
 | |
| <p>To achieve the objectives, the build system will be rewritten to use make
 | |
| 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
 | |
| want PDF, here is the
 | |
| <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>.
 | |
| <h3>Rapid Compile-Test Cycles</h3>
 | |
| <p>When developing a component, for example a C++ shared library, it must be
 | |
| possible to easily rebuild just that component, and not have to wait more than a
 | |
| couple seconds for dependency checks, and not have to wait for unneeded
 | |
| components to be built.</p>
 | |
| <h3>Both Environment and Config File Based Settings</h3>
 | |
| <p>To set the target, and other options, some people on the team like to have a
 | |
| configuration file in a directory so they do not have an environment setup
 | |
| script to run, and others want an environment setup script to run so they can
 | |
| run builds in different terminals on the same tree, or switch back and forth
 | |
| in one terminal.  We will support both.</p>
 | |
| <h3>Object File Directory / make clean</h3>
 | |
| <p>Object files and other intermediate files will be generated into a directory
 | |
| that is separate from the source tree.  The goal is to have make clean be
 | |
| "rm -rf <obj>" in the tree root directory.  The primary goals of
 | |
| this are to simplify searching the source tree, and to make "make clean" more
 | |
| reliable.</p>
 | |
| 
 | |
| <h3>SDK</h3>
 | |
| <p>The SDK will be a tarball that will allow non-OS-developers to write apps.
 | |
| The apps will actually be built by first building the SDK, and then building
 | |
| the apps against that SDK.  This will hopefully (1) make writing apps easier
 | |
| for us, because we won't have to rebuild the OS as much, and we can use the
 | |
| standard java-app development tools, and (2) allow us to dog-food the SDK, to
 | |
| help ensure its quality.  Cedric has suggested (and I agree) that apps built
 | |
| from the SDK should be built with ant.  Stay tuned for more details as we
 | |
| figure out exactly how this will work.</p>
 | |
| 
 | |
| <h3>Dependecies</h3>
 | |
| <p>Dependencies should all be automatic.  Unless there is a custom tool involved
 | |
| (e.g. the webkit has several), the dependencies for shared and static libraries,
 | |
| .c, .cpp, .h, .java, java libraries, etc., should all work without intervention
 | |
| in the Android.mk file.</p>
 | |
| 
 | |
| <h3>Wildcard source files</h3>
 | |
| <p>Wildcarding source file will be discouraged.  It may be useful in some
 | |
| scenarios.  The default <code>$(wildcard *)</code> will not work due to the
 | |
| current directory being set to the root of the build tree.<p>
 | |
| 
 | |
| <h3>Multiple targets in one directory</h3>
 | |
| <p>It will be possible to generate more than one target from a given
 | |
| subdirectory.  For example, libutils generates a shared library for the target
 | |
| and a static library for the host.</p>
 | |
| 
 | |
| <h3>Makefile fragments for modules</h3>
 | |
| <p><b>Android.mk</b> is the standard name for the makefile fragments that
 | |
| control the building of a given module.  Only the top directory should
 | |
| have a file named "Makefile".</p>
 | |
| 
 | |
| <h3>Use shared libraries</h3>
 | |
| <p>Currently, the simulator is not built to use shared libraries.  This should
 | |
| be fixed, and now is a good time to do it.  This implies getting shared
 | |
| libraries to work on Mac OS.</p>
 | |
| 
 | |
| 
 | |
| <h2>Nice to Have</h2>
 | |
| 
 | |
| <p>These things would be nice to have, and this is a good place to record them,
 | |
| however these are not promises.</p>
 | |
| 
 | |
| <h3>Simultaneous Builds</h3>
 | |
| <p>The hope is to be able to do two builds for different combos in the same
 | |
| tree at the same time, but this is a stretch goal, not a requirement.
 | |
| Doing two builds in the same tree, not at the same time must work.  (update:
 | |
| it's looking like we'll get the two builds at the same time working)</p>
 | |
| 
 | |
| <h3>Deleting headers (or other dependecies)</h3>
 | |
| <p>Problems can arise if you delete a header file that is referenced in
 | |
| ".d" files.  The easy way to deal with this is "make clean".  There
 | |
| should be a better way to handle it. (from fadden)</p>
 | |
| <p>One way of solving this is introducing a dependency on the directory.  The
 | |
| problem is that this can create extra dependecies and slow down the build.
 | |
| It's a tradeoff.</p>
 | |
| 
 | |
| <h3>Multiple builds</h3>
 | |
| <p>General way to perform builds across the set of known platforms.  This
 | |
| would make it easy to perform multiple platform builds when testing a
 | |
| change, and allow a wide-scale "make clean".  Right now the buildspec.mk
 | |
| or environment variables need to be updated before each build. (from fadden)</p>
 | |
| 
 | |
| <h3>Aftermarket Locales and Carrier</h3>
 | |
| <p>We will eventually need to add support for creating locales and carrier
 | |
| customizations to the SDK, but that will not be addressed right now.</p>
 | |
| 
 | |
| 
 | |
| <h2><a id="usage"/>Usage</h2>
 | |
| <p>You've read (or scrolled past) all of the motivations for this build system,
 | |
| and you want to know how to use it.  This is the place.</p>
 | |
| 
 | |
| <h3>Your first build</h3>
 | |
| <p>The <a href="../building.html">Building</a> document describes how do do
 | |
| builds.</p>
 | |
| 
 | |
| <h3>build/envsetup.sh functions</h3>
 | |
| If you source the file build/envsetup.sh into your bash environment,
 | |
| <code>. build/envsetup.sh</code>you'll get a few helpful shell functions:
 | |
| 
 | |
| <ul>
 | |
| <li><b>printconfig</b> - Prints the current configuration as set by the
 | |
| lunch and choosecombo commands.</li>
 | |
| <li><b>m</b> - Runs <code>make</code> from the top of the tree.  This is
 | |
| useful because you can run make from within subdirectories.  If you have the
 | |
| <code>TOP</code> environment variable set, it uses that.  If you don't, it looks
 | |
| up the tree from the current directory, trying to find the top of the tree.</li>
 | |
| <li><b>croot</b> - <code>cd</code> to the top of the tree.</li>
 | |
| <li><b>sgrep</b> - grep for the regex you provide in all .c, .cpp, .h, .java,
 | |
| and .xml files below the current directory.</li>
 | |
| </ul>
 | |
| 
 | |
| <h3>Build flavors/types</h3>
 | |
| <p>
 | |
| When building for a particular product, it's often useful to have minor
 | |
| variations on what is ultimately the final release build.  These are the
 | |
| currently-defined "flavors" or "types" (we need to settle on a real name
 | |
| for these).
 | |
| </p>
 | |
| 
 | |
| <table border=1>
 | |
| <tr>
 | |
|     <td>
 | |
|         <code>eng<code>
 | |
|     </td>
 | |
|     <td>
 | |
|         This is the default flavor. A plain "<code>make</code>" is the
 | |
|         same as "<code>make eng</code>".  <code>droid</code> is an alias
 | |
|         for <code>eng</code>.
 | |
|         <ul>
 | |
|         <li>Installs modules tagged with: <code>eng</code>, <code>debug</code>,
 | |
|             <code>user</code>, and/or <code>development</code>.
 | |
|         <li>Installs non-APK modules that have no tags specified.
 | |
|         <li>Installs APKs according to the product definition files, in
 | |
|             addition to tagged APKs.
 | |
|         <li><code>ro.secure=0</code>
 | |
|         <li><code>ro.debuggable=1</code>
 | |
|         <li><code>ro.kernel.android.checkjni=1</code>
 | |
|         <li><code>adb</code> is enabled by default.
 | |
|     </td>
 | |
| </tr>
 | |
| <tr>
 | |
|     <td>
 | |
|         <code>user<code>
 | |
|     </td>
 | |
|     <td>
 | |
|         "<code>make user</code>"
 | |
|         <p>
 | |
|         This is the flavor intended to be the final release bits.
 | |
|         <ul>
 | |
|         <li>Installs modules tagged with <code>user</code>.
 | |
|         <li>Installs non-APK modules that have no tags specified.
 | |
|         <li>Installs APKs according to the product definition files; tags
 | |
|             are ignored for APK modules.
 | |
|         <li><code>ro.adb.secure=1</code>
 | |
|         <li><code>ro.secure=1</code>
 | |
|         <li><code>ro.debuggable=0</code>
 | |
|         <li><code>adb</code> is disabled by default.
 | |
|     </td>
 | |
| </tr>
 | |
| <tr>
 | |
|     <td>
 | |
|         <code>userdebug<code>
 | |
|     </td>
 | |
|     <td>
 | |
|         "<code>make userdebug</code>"
 | |
|         <p>
 | |
|         The same as <code>user</code>, except:
 | |
|         <ul>
 | |
|         <li>Also installs modules tagged with <code>debug</code>.
 | |
|         <li><code>ro.debuggable=1</code>
 | |
|         <li><code>adb</code> is enabled by default.
 | |
|     </td>
 | |
| </tr>
 | |
| </table>
 | |
| 
 | |
| <p>
 | |
| If you build one flavor and then want to build another, you should run
 | |
| "<code>make installclean</code>" between the two makes to guarantee that
 | |
| you don't pick up files installed by the previous flavor.  "<code>make
 | |
| clean</code>" will also suffice, but it takes a lot longer.
 | |
| </p>
 | |
| 
 | |
| 
 | |
| <h3>More pseudotargets</h3>
 | |
| <p>Sometimes you want to just build one thing.  The following pseudotargets are
 | |
| there for your convenience:</p>
 | |
| 
 | |
| <ul>
 | |
| <li><b>droid</b> - <code>make droid</code> is the normal build.  This target
 | |
| is here because the default target has to have a name.</li>
 | |
| <li><b>all</b> - <code>make all</code> builds everything <code>make
 | |
| droid</code> does, plus everything whose <code>LOCAL_MODULE_TAGS</code> do not
 | |
| include the "droid" tag.  The build server runs this to make sure
 | |
| that everything that is in the tree and has an Android.mk builds.</li>
 | |
| <li><b>clean-$(LOCAL_MODULE)</b> and <b>clean-$(LOCAL_PACKAGE_NAME)</b> - 
 | |
| Let you selectively clean one target.  For example, you can type
 | |
| <code>make clean-libutils</code> and it will delete libutils.so and all of the
 | |
| intermediate files, or you can type <code>make clean-Home</code> and it will
 | |
| clean just the Home app.</li>
 | |
| <li><b>clean</b> - <code>make clean</code> deletes all of the output and
 | |
| intermediate files for this configuration.  This is the same as <code>rm -rf
 | |
| out/<configuration>/</code></li>
 | |
| <li><b>clobber</b> - <code>make clobber</code> deletes all of the output
 | |
| and intermediate files for all configurations.  This is the same as
 | |
| <code>rm -rf out/</code>.</li>
 | |
| <li><b>dataclean</b> - <code>make dataclean</code> deletes contents of the data 
 | |
| directory inside the current combo directory.  This is especially useful on the
 | |
| simulator and emulator, where the persistent data remains present between 
 | |
| builds.</li>
 | |
| <li><b>LOCAL_MODULE</b> - Anything you specify as a <code>LOCAL_MODULE</code>
 | |
| in an Android.mk is made into a pseudotarget.  For example, <code>make
 | |
| runtime</code> might be shorthand for <code>make
 | |
| out/linux-x86-debug/system/bin/runtime</code> (which would work), and
 | |
| <code>make libkjs</code> might be shorthand for <code>make
 | |
| out/linux-x86-debug/system/lib/libkjs.so</code> (which would also work).</li>
 | |
| <li><b>targets</b> - <code>make targets</code> will print a list of all of
 | |
| the LOCAL_MODULE names you can make.</li>
 | |
| </ul>
 | |
| 
 | |
| <h3><a name="templates"/>How to add another component to the build - Android.mk templates</h3>
 | |
| <p>You have a new library, a new app, or a new executable.  For each of the
 | |
| common types of modules, there is a corresponding file in the templates
 | |
| directory.  It will usually be enough to copy one of these, and fill in your
 | |
| own values.  Some of the more esoteric values are not included in the
 | |
| templates, but are instead just documented here, as is the documentation
 | |
| on using custom tools to generate files.</p>
 | |
| <p>Mostly, you can just look for the TODO comments in the templates and do
 | |
| what it says.  Please remember to delete the TODO comments when you're done
 | |
| to keep the files clean.  The templates have minimal documentation in them,
 | |
| because they're going to be copied, and when that gets stale, the copies just
 | |
| won't get updated.  So read on...</p>
 | |
| 
 | |
| <h4>Apps</h4>
 | |
| <p>Use the <code>templates/apps</code> file.</p>
 | |
| <p>This template is pretty self-explanitory.  See the variables below for more
 | |
| details.</p>
 | |
| 
 | |
| <h4>Java Libraries</h4>
 | |
| <p>Use the <code>templates/java_library</code> file.</p>
 | |
| <p>The interesting thing here is the value of LOCAL_MODULE, which becomes
 | |
| the name of the jar file.  (Actually right now, we're not making jar files yet,
 | |
| just directories of .class files,  but the directory is named according to
 | |
| what you put in LOCAL_MODULE).  This name will be what goes in the 
 | |
| LOCAL_JAVA_LIBRARIES variable in modules that depend on your java library.</p>
 | |
| 
 | |
| <h4>C/C++ Executables</h4>
 | |
| <p>Use the <code>templates/executable</code> file, or the
 | |
| <code>templates/executable_host</code> file.</p>
 | |
| <p>This template has a couple extra options that you usually don't need.
 | |
| Please delete the ones you don't need, and remove the TODO comments.  It makes
 | |
| the rest of them easier to read, and you can always refer back to the templates
 | |
| if you need them again later.</p>
 | |
| <p>By default, on the target these are built into /system/bin, and on the
 | |
| host, they're built into <combo>/host/bin.  These can be overridden by setting
 | |
| <code>LOCAL_MODULE_PATH</code> or <code>LOCAL_MODULE_RELATIVE_PATH</code>.  See
 | |
| <a href="#moving-targets">Putting targets elsewhere</a>
 | |
| for more.</p>
 | |
| 
 | |
| <h4>Shared Libraries</h4>
 | |
| <p>Use the <code>templates/shared_library</code> file, or the
 | |
| <code>templates/shared_library_host</code> file.</p>
 | |
| <p>Remember that on the target, we use shared libraries, and on the host,
 | |
| we use static libraries, since executable size isn't as big an issue, and it
 | |
| simplifies distribution in the SDK.</p>
 | |
| 
 | |
| <h4>Static Libraries</h4>
 | |
| <p>Use the <code>templates/static_library</code> file, or the
 | |
| <code>templates/static_library_host</code> file.</p>
 | |
| <p>Remember that on the target, we use shared libraries, and on the host,
 | |
| we use static libraries, since executable size isn't as big an issue, and it
 | |
| simplifies distribution in the SDK.</p>
 | |
| 
 | |
| <h4><a name="custom-tools"/>Using Custom Tools</h4>
 | |
| <p>If you have a tool that generates source files for you, it's possible
 | |
| to have the build system get the dependencies correct for it.  Here are
 | |
| a couple of examples.  <code>$@</code> is the make built-in variable for
 | |
| "the current target." The <font color=red>red</font> parts are the parts you'll
 | |
| need to change.</p>
 | |
| 
 | |
| <p>You need to put this after you have declared <code>LOCAL_PATH</code> and
 | |
| <code>LOCAL_MODULE</code>, because the <code>$(local-generated-sources-dir)</code>
 | |
| and <code>$(local-host-generated-sources-dir)</code> macros use these variables
 | |
| to determine where to put the files.
 | |
| 
 | |
| <h5>Example 1</h5>
 | |
| <p>Here, there is one generated file, called
 | |
| chartables.c, which doesn't depend on anything.  And is built by the tool
 | |
| built to $(HOST_OUT_EXECUTABLES)/dftables.  Note on the second to last line
 | |
| that a dependency is created on the tool.</p>
 | |
| <pre>
 | |
| intermediates:= $(local-generated-sources-dir)
 | |
| GEN := $(intermediates)/<font color=red>chartables.c</font>
 | |
| $(GEN): PRIVATE_CUSTOM_TOOL = <font color=red>$(HOST_OUT_EXECUTABLES)/dftables $@</font>
 | |
| $(GEN): <font color=red>$(HOST_OUT_EXECUTABLES)/dftables</font>
 | |
| 	$(transform-generated-source)
 | |
| LOCAL_GENERATED_SOURCES += $(GEN)
 | |
| </pre>
 | |
| 
 | |
| <h5>Example 2</h5>
 | |
| <p>Here as a hypothetical example, we use use cat as if it were to transform
 | |
| a file.  Pretend that it does something useful.  Note how we use a
 | |
| target-specific variable called PRIVATE_INPUT_FILE to store the name of the
 | |
| input file.</p>
 | |
| <pre>
 | |
| intermediates:= $(local-generated-sources-dir)
 | |
| GEN := $(intermediates)/<font color=red>file.c</font>
 | |
| $(GEN): PRIVATE_INPUT_FILE := $(LOCAL_PATH)/<font color=red>input.file</font>
 | |
| $(GEN): PRIVATE_CUSTOM_TOOL = <font color=red>cat $(PRIVATE_INPUT_FILE) > $@</font>
 | |
| $(GEN): <font color=red>$(LOCAL_PATH)/input.file</font>
 | |
| 	$(transform-generated-source)
 | |
| LOCAL_GENERATED_SOURCES += $(GEN)
 | |
| </pre>
 | |
| 
 | |
| <h5>Example 3</h5>
 | |
| <p>If you have several files that are all similar in
 | |
| name, and use the same tool, you can combine them.  (here the *.lut.h files are
 | |
| the generated ones, and the *.cpp files are the input files)</p>
 | |
| <pre>
 | |
| intermediates:= $(local-generated-sources-dir)
 | |
| GEN := $(addprefix $(intermediates)<font color=red>/kjs/, \
 | |
|             array_object.lut.h \
 | |
|             bool_object.lut.h \</font>
 | |
|         )
 | |
| $(GEN): PRIVATE_CUSTOM_TOOL = <font color=red>perl libs/WebKitLib/WebKit/JavaScriptCore/kjs/create_hash_table $< -i > $@</font>
 | |
| $(GEN): $(intermediates)/<font color=red>%.lut.h</font> : $(LOCAL_PATH)/<font color=red>%.cpp</font>
 | |
| 	$(transform-generated-source)
 | |
| LOCAL_GENERATED_SOURCES += $(GEN)
 | |
| </pre>
 | |
| 
 | |
| <h3><a name="unbundled-build"/>Unbundled build</h3>
 | |
| <p>Unbundled build has several meanings by the context.
 | |
| Let me explain the meaning by the flags related to "unbundled build"</p>
 | |
| <h4>TARGET_BUILD_UNBUNDLED</h4>
 | |
| <p>
 | |
|     The source tree might not have the full platform sources. It turns on
 | |
|     <code>TARGET_BUILD_USE_PREBUILT_SDKS</code>, unless
 | |
|     <code>UNBUNDLED_BUILD_SDKS_FROM_SOURCE</code> is set. It is always set if
 | |
|     <code>TARGET_BUILD_APPS</code> or <code>TARGET_BUILD_UNBUNDLED_IMAGE</code> is set.
 | |
| </p>
 | |
| <h4>TARGET_BUILD_USE_PREBUILT_SDKS</h4>
 | |
| <p>It is an internal flag. If it is set, prebuilt SDKs are used, even if a module's
 | |
| <code>LOCAL_SDK_VERSION</code> is <code>current</code> (including <code>system_current</code>,
 | |
| <code>core_current</code>, and so on). If it is unset, build current SDKs,
 | |
| and use them as usual.</p>
 | |
| <h4>DISABLE_PREOPT</h4>
 | |
| <p>It is an internal flag as well. If it is set, dexpreopt is disabled.
 | |
| It is always set if <code>TARGET_BUILD_APPS</code> or <code>TARGET_BUILD_UNBUNDLED_IMAGE</code> is set,
 | |
| because dexpreopt tightly depends on the platform.</p>
 | |
| <h4>TARGET_BUILD_APPS</h4>
 | |
| <p>Build the apps that can be distributed outside the platform, so it turns on
 | |
| <code>TARGET_BUILD_UNBUNDLED</code> and <code>DISABLE_PREOPT</code>.
 | |
| Also, it turns on <code>TARGET_BUILD_USE_PREBUILT_SDKS</code>, unless
 | |
| <code>UNBUNDLED_BUILD_SDKS_FROM_SOURCE</code> is set.</p>
 | |
| <h4>TARGET_BUILD_UNBUNDLED_IMAGE</h4>
 | |
| <p>It is similar to <code>TARGET_BUILD_APPS</code>, but its target is an unbundled partition
 | |
| (such as the vendor partition). Accordingly, it sets <code>TARGET_BUILD_UNBUNDLED</code> and <code>DISABLE_PREOPT</code>.
 | |
| We can call the partition unbundled, because the partition can be distributed outside the platform.
 | |
| And also, it turns on <code>TARGET_BUILD_USE_PREBUILT_SDKS</code>, unless
 | |
| <code>UNBUNDLED_BUILD_SDKS_FROM_SOURCE</code> is set.</p>
 | |
| 
 | |
| <h3><a name="platform-specific"/>Platform specific conditionals</h3>
 | |
| <p>Sometimes you need to set flags specifically for different platforms.  Here
 | |
| is a list of which values the different build-system defined variables will be
 | |
| set to and some examples.</p>
 | |
| <table cellspacing=25>
 | |
| <tr>
 | |
|     <td valign=top align=center>
 | |
|         <b>HOST_OS</b><br/>
 | |
|         linux<br/>
 | |
|         darwin
 | |
|     </td>
 | |
|     <td valign=top align=center>
 | |
|         <b>HOST_ARCH</b><br/>
 | |
|         x86<br/>
 | |
|         x86_64
 | |
|     </td>
 | |
|     <td valign=top align=center>
 | |
|         <b>HOST_BUILD_TYPE</b><br/>
 | |
|         release<br/>
 | |
|         debug
 | |
|     </td>
 | |
| </tr>
 | |
| <tr>
 | |
|     <td valign=top align=center>
 | |
|         <b>TARGET_ARCH</b><br/>
 | |
|         arm<br/>
 | |
|         arm64<br/>
 | |
|         x86<br/>
 | |
|         x86_64
 | |
|     </td>
 | |
|     <td valign=top align=center>
 | |
|         <b>TARGET_BUILD_TYPE</b><br/>
 | |
|         release<br/>
 | |
|         debug
 | |
|     </td>
 | |
| </tr>
 | |
| </table>
 | |
| 
 | |
| <p>There are also special variables to use instead of conditionals. Many of the
 | |
| normal variables (LOCAL_SRC_FILES, LOCAL_CFLAGS, etc) can be conditionally added
 | |
| to with _{arch} _{32|64}, and for the host, _{os}.</p>
 | |
| 
 | |
| <h4>Some Examples</h4>
 | |
| <pre>ifeq ($(TARGET_BUILD_TYPE),release)
 | |
| LOCAL_CFLAGS += -DNDEBUG=1
 | |
| endif
 | |
| 
 | |
| LOCAL_CFLAGS_arm += -DTARGET_IS_ARM
 | |
| 
 | |
| LOCAL_CFLAGS_64 += -DBIG_POINTER
 | |
| 
 | |
| # from libutils
 | |
| # Use the futex based mutex and condition variable
 | |
| # implementation from android-arm because it's shared mem safe
 | |
| LOCAL_SRC_FILES_linux += futex_synchro.c
 | |
| LOCAL_LDLIBS_linux += -lrt -ldl
 | |
| 
 | |
| </pre>
 | |
| 
 | |
| 
 | |
| <h3><a name="moving-modules"/>Putting modules elsewhere</h3>
 | |
| <p>If you have modules that normally go somewhere, and you need to have them
 | |
| build somewhere else, read this.</p>
 | |
| <p>If you have modules that need to go in a subdirectory of their normal
 | |
| location, for example HAL modules that need to go in /system/lib/hw or
 | |
| /vendor/lib/hw, set LOCAL_MODULE_RELATIVE_PATH in your Android.mk, for
 | |
| example:</p>
 | |
| <pre>
 | |
| LOCAL_MODULE_RELATIVE_PATH := hw
 | |
| </pre>
 | |
| <p>If you have modules that need to go in an entirely different location, for
 | |
| example the root filesystem instead of in /system, add these lines to your
 | |
| Android.mk:</p>
 | |
| <pre>
 | |
| LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
 | |
| LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_UNSTRIPPED)
 | |
| </pre>
 | |
| <p>For executables and libraries, you need to specify a
 | |
| <code>LOCAL_UNSTRIPPED_PATH</code> location if you specified a
 | |
| <code>LOCAL_MODULE_PATH</code>, because on target builds, we keep
 | |
| the unstripped executables so GDB can find the symbols.
 | |
| <code>LOCAL_UNSTRIPPED_PATH</code> is not necessary if you only specified
 | |
| <code>LOCAL_MODULE_RELATIVE_PATH</code>.</p>
 | |
| <p>Look in <code>core/envsetup.mk</code> for all of the variables defining
 | |
| places to build things.</p>
 | |
| 
 | |
| 
 | |
| <h3>Android.mk variables</h3>
 | |
| <p>These are the variables that you'll commonly see in Android.mk files, listed
 | |
| alphabetically.</p>
 | |
| <p>But first, a note on variable naming:
 | |
| <ul>
 | |
|     <li><b>LOCAL_</b> - These variables are set per-module.  They are cleared
 | |
|     by the <code>include $(CLEAR_VARS)</code> line, so you can rely on them
 | |
|     being empty after including that file.  Most of the variables you'll use
 | |
|     in most modules are LOCAL_ variables.</li>
 | |
|     <li><b>PRIVATE_</b> - These variables are make-target-specific variables.  That
 | |
|     means they're only usable within the commands for that module.  It also
 | |
|     means that they're unlikely to change behind your back from modules that
 | |
|     are included after yours.  This 
 | |
|     <a href="http://www.gnu.org/software/make/manual/make.html#Target_002dspecific">link to the make documentation</a>
 | |
|     describes more about target-specific variables.  Please note that there
 | |
|     are a couple of these laying around the tree that aren't prefixed with
 | |
|     PRIVATE_.  It is safe, and they will be fixed as they are discovered.
 | |
|     Sorry for the confusion.</li>
 | |
|     <li><b>INTERNAL_</b> - These variables are critical to functioning of
 | |
|     the build system, so you shouldn't create variables named like this, and
 | |
|     you probably shouldn't be messing with these variables in your makefiles.
 | |
|     </li>
 | |
|     <li><b>HOST_</b> and <b>TARGET_</b> - These contain the directories
 | |
|     and definitions that are specific to either the host or the target builds.
 | |
|     Do not set variables that start with HOST_ or TARGET_ in your makefiles.
 | |
|     </li>
 | |
|     <li><b>HOST_CROSS_</b> - These contain the directories and definitions that
 | |
|     are specific to cross-building host binaries. The common case is building
 | |
|     windows host tools on linux. Do not set variables that start with
 | |
|     HOST_CROSS_ in your makefiles.
 | |
|     </li>
 | |
|     <li><b>BUILD_</b> and <b>CLEAR_VARS</b> - These contain the names of
 | |
|     well-defined template makefiles to include.  Some examples are CLEAR_VARS
 | |
|     and BUILD_HOST_PACKAGE.</li>
 | |
|     <li>Any other name is fair-game for you to use in your Android.mk.  However,
 | |
|     remember that this is a non-recursive build system, so it is possible that
 | |
|     your variable will be changed by another Android.mk included later, and be
 | |
|     different when the commands for your rule / module are executed.</li>
 | |
| </ul>
 | |
| </p>
 | |
| 
 | |
| <h4>LOCAL_ANNOTATION_PROCESSORS</h4>
 | |
| <p>Set this to a list of modules built with <code>BUILD_HOST_JAVA_LIBRARY</code>
 | |
| to have their jars passed to javac with -processorpath for use as annotation
 | |
| processors.</p>
 | |
| 
 | |
| <h4>LOCAL_ANNOTATION_PROCESSOR_CLASSES</h4>
 | |
| <p>Set this to a list of classes to be passed to javac as -processor arguments.
 | |
| This list is would be unnecessary, as javac will autodetect annotation processor
 | |
| classes, except that the Grok tool that is used on the Android source code
 | |
| does not autodetect them and requires listing them manually.</p>
 | |
| 
 | |
| <h4>LOCAL_ASSET_FILES</h4>
 | |
| <p>In Android.mk files that <code>include $(BUILD_PACKAGE)</code> set this
 | |
| to the set of files you want built into your app.  Usually:</p>
 | |
| <p><code>LOCAL_ASSET_FILES += $(call find-subdir-assets)</code></p>
 | |
| <p>This will probably change when we switch to ant for the apps' build
 | |
| system.</p>
 | |
| 
 | |
| <h4>LOCAL_CC</h4>
 | |
| <p>If you want to use a different C compiler for this module, set LOCAL_CC
 | |
| to the path to the compiler.  If LOCAL_CC is blank, the appropriate default
 | |
| compiler is used.</p>
 | |
| 
 | |
| <h4>LOCAL_CXX</h4>
 | |
| <p>If you want to use a different C++ compiler for this module, set LOCAL_CXX
 | |
| to the path to the compiler.  If LOCAL_CXX is blank, the appropriate default
 | |
| compiler is used.</p>
 | |
| 
 | |
| <h4>LOCAL_CFLAGS</h4>
 | |
| <p>If you have additional flags to pass into the C or C++ compiler, add
 | |
| them here.  For example:</p>
 | |
| <p><code>LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1</code></p>
 | |
| 
 | |
| <h4>LOCAL_CPPFLAGS</h4>
 | |
| <p>If you have additional flags to pass into <i>only</i> the C++ compiler, add
 | |
| them here.  For example:</p>
 | |
| <p><code>LOCAL_CPPFLAGS += -ffriend-injection</code></p>
 | |
| <code>LOCAL_CPPFLAGS</code> is guaranteed to be after <code>LOCAL_CFLAGS</code>
 | |
| on the compile line, so you can use it to override flags listed in
 | |
| <code>LOCAL_CFLAGS</code>.
 | |
| 
 | |
| <h4>LOCAL_CPP_EXTENSION</h4>
 | |
| <p>If your C++ files end in something other than "<code>.cpp</code>",
 | |
| you can specify the custom extension here.  For example:</p>
 | |
| <p><code>LOCAL_CPP_EXTENSION := .cc</code></p>
 | |
| Note that all C++ files for a given module must have the same
 | |
| extension; it is not currently possible to mix different extensions.
 | |
| 
 | |
| <h4>LOCAL_NO_DEFAULT_COMPILER_FLAGS</h4>
 | |
| <p>Normally, the compile line for C and C++ files includes global include
 | |
| paths and global cflags.  If <code>LOCAL_NO_DEFAULT_COMPILER_FLAGS</code>
 | |
| is non-empty, none of the default includes or flags will be used when compiling
 | |
| C and C++ files in this module.
 | |
| <code>LOCAL_C_INCLUDES</code>, <code>LOCAL_CFLAGS</code>, and
 | |
| <code>LOCAL_CPPFLAGS</code> will still be used in this case, as will
 | |
| any <code>DEBUG_CFLAGS</code> that are defined for the module.
 | |
| 
 | |
| <h4>LOCAL_COPY_HEADERS</h4>
 | |
| <p class=warning>This will be going away.</p>
 | |
| <p>The set of files to copy to the install include tree.  You must also
 | |
| supply <code>LOCAL_COPY_HEADERS_TO</code>.</p>
 | |
| <p>This is going away because copying headers messes up the error messages, and
 | |
| may lead to people editing those headers instead of the correct ones.  It also
 | |
| makes it easier to do bad layering in the system, which we want to avoid.  We
 | |
| also aren't doing a C/C++ SDK, so there is no ultimate requirement to copy any
 | |
| headers.</p>
 | |
| 
 | |
| <h4>LOCAL_COPY_HEADERS_TO</h4>
 | |
| <p class=warning>This will be going away.</p>
 | |
| <p>The directory within "include" to copy the headers listed in
 | |
| <code>LOCAL_COPY_HEADERS</code> to.</p>
 | |
| <p>This is going away because copying headers messes up the error messages, and
 | |
| may lead to people editing those headers instead of the correct ones.  It also
 | |
| makes it easier to do bad layering in the system, which we want to avoid.  We
 | |
| also aren't doing a C/C++ SDK, so there is no ultimate requirement to copy any
 | |
| headers.</p>
 | |
| 
 | |
| <h4>LOCAL_C_INCLUDES</h4>
 | |
| <p>Additional directories to instruct the C/C++ compilers to look for header
 | |
| files in.  These paths are rooted at the top of the tree.  Use
 | |
| <code>LOCAL_PATH</code> if you have subdirectories of your own that you
 | |
| want in the include paths.  For example:</p>
 | |
| <p><code>
 | |
| LOCAL_C_INCLUDES += extlibs/zlib-1.2.3<br/>
 | |
| LOCAL_C_INCLUDES += $(LOCAL_PATH)/src
 | |
| </code></p>
 | |
| <p>You should not add subdirectories of include to
 | |
| <code>LOCAL_C_INCLUDES</code>, instead you should reference those files
 | |
| in the <code>#include</code> statement with their subdirectories.  For
 | |
| example:</p>
 | |
| <p><code>#include <utils/KeyedVector.h></code><br/>
 | |
| not <code><s>#include <KeyedVector.h></s></code></p>
 | |
| <p>There are some components that are doing this wrong, and should be cleaned
 | |
| up.</p>
 | |
| 
 | |
| <h4>LOCAL_MODULE_TAGS</h4>
 | |
| <p>Set <code>LOCAL_MODULE_TAGS</code> to any number of whitespace-separated
 | |
| tags.  If the tag list is empty or contains <code>droid</code>, the module
 | |
| will get installed as part of a <code>make droid</code>.  Otherwise, it will
 | |
| only get installed by running <code>make <your-module></code>
 | |
| or with the <code>make all</code> pseudotarget.</p>
 | |
| 
 | |
| <h4>LOCAL_REQUIRED_MODULES</h4>
 | |
| <p>Set <code>LOCAL_REQUIRED_MODULES</code> to any number of whitespace-separated
 | |
| module names, like "libblah" or "Email".  If this module is installed, all
 | |
| of the modules that it requires will be installed as well.  This can be
 | |
| used to, e.g., ensure that necessary shared libraries or providers are
 | |
| installed when a given app is installed.
 | |
| 
 | |
| <h4>LOCAL_FORCE_STATIC_EXECUTABLE</h4>
 | |
| <p>If your executable should be linked statically, set 
 | |
| <code>LOCAL_FORCE_STATIC_EXECUTABLE:=true</code>.  There is a very short
 | |
| list of libraries that we have in static form (currently only libc).</p>
 | |
| 
 | |
| <h4>LOCAL_GENERATED_SOURCES</h4>
 | |
| <p>Files that you add to <code>LOCAL_GENERATED_SOURCES</code> will be
 | |
| automatically generated and then linked in when your module is built.
 | |
| See the <a href="#custom-tools">Custom Tools</a> template makefile for an
 | |
| example.</p>
 | |
| 
 | |
| <h4>LOCAL_JAVACFLAGS</h4>
 | |
| <p>If you have additional flags to pass into the javac compiler, add
 | |
| them here.  For example:</p>
 | |
| <p><code>LOCAL_JAVACFLAGS += -Xlint:deprecation</code></p>
 | |
| 
 | |
| <h4>LOCAL_ERROR_PRONE_FLAGS</h4>
 | |
| <p>If you have additional flags to pass into the error prone compiler, add
 | |
| them here.  For example:</p>
 | |
| <p><code>LOCAL_ERROR_PRONE_FLAGS += -Xep:ClassCanBeStatic:ERROR</code></p>
 | |
| 
 | |
| <h4>LOCAL_JAVA_LIBRARIES</h4>
 | |
| <p>When linking Java apps and libraries, <code>LOCAL_JAVA_LIBRARIES</code>
 | |
| specifies which sets of java classes to include.  Currently there are
 | |
| two of these: <code>core</code> and <code>framework</code>.
 | |
| In most cases, it will look like this:</p>
 | |
| <p><code>LOCAL_JAVA_LIBRARIES := core framework</code></p>
 | |
| <p>Note that setting <code>LOCAL_JAVA_LIBRARIES</code> is not necessary
 | |
| (and is not allowed) when building an APK with
 | |
| "<code>include $(BUILD_PACKAGE)</code>".  The appropriate libraries
 | |
| will be included automatically.</p>
 | |
| 
 | |
| <h4>LOCAL_LDFLAGS</h4>
 | |
| <p>You can pass additional flags to the linker by setting
 | |
| <code>LOCAL_LDFLAGS</code>.  Keep in mind that the order of parameters is
 | |
| very important to ld, so test whatever you do on all platforms.</p>
 | |
| 
 | |
| <h4>LOCAL_LDLIBS</h4>
 | |
| <p><code>LOCAL_LDLIBS</code> allows you to specify additional libraries
 | |
| that are not part of the build for your executable or library.  Specify
 | |
| the libraries you want in -lxxx format; they're passed directly to the 
 | |
| link line.  However, keep in mind that there will be no dependency generated
 | |
| for these libraries.  It's most useful in simulator builds where you want
 | |
| to use a library preinstalled on the host.  The linker (ld) is a particularly
 | |
| fussy beast, so it's sometimes necessary to pass other flags here if you're
 | |
| doing something sneaky. Some examples:</p>
 | |
| <p><code>LOCAL_LDLIBS += -lcurses -lpthread<br/>
 | |
| LOCAL_LDLIBS += -Wl,-z,origin
 | |
| </code></p>
 | |
| 
 | |
| <h4>LOCAL_NO_MANIFEST</h4>
 | |
| <p>If your package doesn't have a manifest (AndroidManifest.xml), then
 | |
| set <code>LOCAL_NO_MANIFEST:=true</code>.  The common resources package
 | |
| does this.</p>
 | |
| 
 | |
| <h4>LOCAL_PACKAGE_NAME</h4>
 | |
| <p><code>LOCAL_PACKAGE_NAME</code> is the name of an app.  For example,
 | |
| Dialer, Contacts, etc.  This will probably change or go away when we switch
 | |
| to an ant-based build system for the apps.</p>
 | |
| 
 | |
| <h4>LOCAL_PATCH_MODULE (experimental option)</h4>
 | |
| <p>As of January 2018, you almost certainly don't need this option, so please
 | |
| ask and only use it if you understand what you're doing. This feature is
 | |
| experimental and may go away in future.</p>
 | |
| <p>
 | |
| When compiling language level 9+ .java code in packages that are part of a
 | |
| a system module, <code>LOCAL_PATCH_MODULE</code> names the module that your
 | |
| sources and dependencies should be patched into. The Android runtime currently
 | |
| (Jan 2018) doesn't implement the JEP 261 module system so this option is only
 | |
| supported at compile time. It should only be needed to compile tests in packages
 | |
| that exist in libcore and which are inconvenient to move elsewhere.
 | |
| </p>
 | |
| 
 | |
| <h4>LOCAL_PATH</h4>
 | |
| <p>The directory your Android.mk file is in. You can set it by putting the
 | |
| following as the first line in your Android.mk:</p>
 | |
| <p><code>LOCAL_PATH := $(my-dir)</code></p>
 | |
| <p>The <code>my-dir</code> macro uses the 
 | |
| <code><a href="http://www.gnu.org/software/make/manual/make.html#MAKEFILE_005fLIST-Variable">MAKEFILE_LIST</a></code>
 | |
| variable, so you must call it before you include any other makefiles.  Also,
 | |
| consider that any subdirectories you inlcude might reset LOCAL_PATH, so do your
 | |
| own stuff before you include them.  This also means that if you try to write
 | |
| several <code>include</code> lines that reference <code>LOCAL_PATH</code>,
 | |
| it won't work, because those included makefiles might reset LOCAL_PATH.
 | |
| 
 | |
| <h4>LOCAL_POST_PROCESS_COMMAND</h4>
 | |
| <p>For host executables, you can specify a command to run on the module
 | |
| after it's been linked.  You might have to go through some contortions
 | |
| to get variables right because of early or late variable evaluation:</p>
 | |
| <p><code>module := $(HOST_OUT_EXECUTABLES)/$(LOCAL_MODULE)<br/>
 | |
| LOCAL_POST_PROCESS_COMMAND := /Developer/Tools/Rez -d __DARWIN__ -t APPL\<br/>
 | |
|        -d __WXMAC__ -o $(module) Carbon.r
 | |
| </code></p>
 | |
| 
 | |
| <h4>LOCAL_PREBUILT_EXECUTABLES</h4>
 | |
| <p>When including $(BUILD_MULTI_PREBUILT) or $(BUILD_HOST_PREBUILT), set these
 | |
| to executables that you want copied.  They're located automatically into the
 | |
| right bin directory.</p>
 | |
| 
 | |
| <h4>LOCAL_PREBUILT_LIBS</h4>
 | |
| <p>When including $(BUILD_MULTI_PREBUILT) or $(BUILD_HOST_PREBUILT), set these
 | |
| to libraries that you want copied.  They're located automatically into the
 | |
| right lib directory.</p>
 | |
| 
 | |
| <h4>LOCAL_SHARED_LIBRARIES</h4>
 | |
| <p>These are the libraries you directly link against.  You don't need to
 | |
| pass transitively included libraries.  Specify the name without the suffix:</p>
 | |
| <p><code>LOCAL_SHARED_LIBRARIES := \<br/>
 | |
| 	    libutils \<br/>
 | |
| 	    libui \<br/>
 | |
| 	    libaudio \<br/>
 | |
| 	    libexpat \<br/>
 | |
| 	    libsgl
 | |
| </code></p>
 | |
| 
 | |
| <h4>LOCAL_SRC_FILES</h4>
 | |
| <p>The build system looks at <code>LOCAL_SRC_FILES</code> to know what source
 | |
| files to compile -- .cpp .c .y .l .java.  For lex and yacc files, it knows
 | |
| how to correctly do the intermediate .h and .c/.cpp files automatically.  If
 | |
| the files are in a subdirectory of the one containing the Android.mk, prefix
 | |
| them with the directory name:</p>
 | |
| <p><code>LOCAL_SRC_FILES := \<br/>
 | |
| 	    file1.cpp \<br/>
 | |
| 	    dir/file2.cpp
 | |
| </code></p>
 | |
| 
 | |
| <h4>LOCAL_STATIC_LIBRARIES</h4>
 | |
| <p>These are the static libraries that you want to include in your module.
 | |
| Mostly, we use shared libraries, but there are a couple of places, like
 | |
| host executables where we use static libraries instead.
 | |
| <p><code>LOCAL_STATIC_LIBRARIES := \<br/>
 | |
| 	    libutils \<br/>
 | |
| 	    libtinyxml
 | |
| </code></p>
 | |
| 
 | |
| <h4>LOCAL_MODULE</h4>
 | |
| <p><code>LOCAL_MODULE</code> is the name of what's supposed to be generated
 | |
| from your Android.mk.  For exmample, for libkjs, the <code>LOCAL_MODULE</code>
 | |
| is "libkjs" (the build system adds the appropriate suffix -- .so .dylib .dll).
 | |
| For app modules, use <code>LOCAL_PACKAGE_NAME</code> instead of 
 | |
| <code>LOCAL_MODULE</code>.  We're planning on switching to ant for the apps,
 | |
| so this might become moot.</p>
 | |
| 
 | |
| <h4>LOCAL_MODULE_PATH</h4>
 | |
| <p>Instructs the build system to put the module somewhere other than what's
 | |
| normal for its type.  If you override this, make sure you also set
 | |
| <code>LOCAL_UNSTRIPPED_PATH</code> if it's an executable or a shared library
 | |
| so the unstripped binary has somewhere to go.  An error will occur if you forget
 | |
| to.</p>
 | |
| <p>See <a href="#moving-modules">Putting modules elsewhere</a> for more.</p>
 | |
| 
 | |
| <h4>LOCAL_MODULE_RELATIVE_PATH</h4>
 | |
| <p>Instructs the build system to put the module in a subdirectory under the
 | |
| directory that is normal for its type.  If you set this you do not need to
 | |
| set <code>LOCAL_UNSTRIPPED_PATH</code>, the unstripped binaries will also use
 | |
| the relative path.</p>
 | |
| <p>See <a href="#moving-modules">Putting modules elsewhere</a> for more.</p>
 | |
| 
 | |
| <h4>LOCAL_MODULE_HOST_OS</h4>
 | |
| <p>This specifies which OSes are supported by this host module. It is not used
 | |
| for target builds. The accepted values here are combinations of
 | |
| <code>linux</code>, <code>darwin</code>, and <code>windows</code>. By default,
 | |
| linux and darwin(MacOS) are considered to be supported. If a module should
 | |
| build under windows, you must specify windows, and any others to be supported.
 | |
| Some examples:</p>
 | |
| <p><code>LOCAL_MODULE_HOST_OS := linux<br/>
 | |
| LOCAL_MODULE_HOST_OS := darwin linux windows</code></p>
 | |
| 
 | |
| <h4>LOCAL_UNSTRIPPED_PATH</h4>
 | |
| <p>Instructs the build system to put the unstripped version of the module
 | |
| somewhere other than what's normal for its type.  Usually, you override this
 | |
| because you overrode <code>LOCAL_MODULE_PATH</code> for an executable or a
 | |
| shared library.  If you overrode <code>LOCAL_MODULE_PATH</code>, but not 
 | |
| <code>LOCAL_UNSTRIPPED_PATH</code>, an error will occur.</p>
 | |
| <p>See <a href="#moving-modules">Putting modules elsewhere</a> for more.</p>
 | |
| 
 | |
| <h4>LOCAL_WHOLE_STATIC_LIBRARIES</h4>
 | |
| <p>These are the static libraries that you want to include in your module without allowing
 | |
| the linker to remove dead code from them. This is mostly useful if you want to add a static library
 | |
| to a shared library and have the static library's content exposed from the shared library.
 | |
| <p><code>LOCAL_WHOLE_STATIC_LIBRARIES := \<br/>
 | |
| 	    libsqlite3_android<br/>
 | |
| </code></p>
 | |
| 
 | |
| <h4>LOCAL_YACCFLAGS</h4>
 | |
| <p>Any flags to pass to invocations of yacc for your module.  A known limitation
 | |
| here is that the flags will be the same for all invocations of YACC for your
 | |
| module.  This can be fixed.  If you ever need it to be, just ask.</p>
 | |
| <p><code>LOCAL_YACCFLAGS := -p kjsyy</code></p>
 | |
| 
 | |
| 
 | |
| 
 | |
| <h2>Implementation Details</h2>
 | |
| 
 | |
| <p>You should never have to touch anything in the config directory unless
 | |
| you're adding a new platform, new tools, or adding new features to the
 | |
| build system.  In general, please consult with the build system owner(s)
 | |
| (<a href="mailto:android-build-team">android-build-team</a>) before you go
 | |
| mucking around in here.  That said, here are some notes on what's going on
 | |
| under the hood.</p>
 | |
| 
 | |
| <h3>Environment Setup / buildspec.mk Versioning</h3>
 | |
| <p>In order to make easier for people when the build system changes, when
 | |
| it is necessary to make changes to buildspec.mk or to rerun the environment
 | |
| setup scripts, they contain a version number in the variable
 | |
| BUILD_ENV_SEQUENCE_NUMBER.  If this variable does not match what the build
 | |
| system expects, it fails printing an error message explaining what happened.
 | |
| If you make a change that requires an update, you need to update two places
 | |
| so this message will be printed.
 | |
| <ul>
 | |
|     <li>In core/envsetup.mk, increment the
 | |
|         CORRECT_BUILD_ENV_SEQUENCE_NUMBER definition.</li>
 | |
|     <li>In buildspec.mk.default, update the BUILD_ENV_SEQUENCE_DUMBER
 | |
|         definition to match the one in core/envsetup.mk</li>
 | |
| </ul>
 | |
| The scripts automatically get the value from the build system, so they will
 | |
| trigger the warning as well.
 | |
| </p>
 | |
| 
 | |
| <h3>Additional makefile variables</h3>
 | |
| <p>You probably shouldn't use these variables.  Please consult
 | |
| <a href="mailto:android-build-team">android-build-team</a> before using them.
 | |
| These are mostly there for workarounds for other issues, or things that aren't
 | |
| completely done right.</p>
 | |
| 
 | |
| <h4>LOCAL_ADDITIONAL_DEPENDENCIES</h4>
 | |
| <p>If your module needs to depend on anything else that
 | |
| isn't actually built in to it, you can add those make targets to 
 | |
| <code>LOCAL_ADDITIONAL_DEPENDENCIES</code>.  Usually this is a workaround
 | |
| for some other dependency that isn't created automatically.</p>
 | |
| 
 | |
| <h4>LOCAL_BUILT_MODULE</h4>
 | |
| <p class=warning>This should not be used, since multiple binaries are now
 | |
| created from a single module defintiion.</p>
 | |
| <p>When a module is built, the module is created in an intermediate
 | |
| directory then copied to its final location.  LOCAL_BUILT_MODULE is
 | |
| the full path to the intermediate file.  See LOCAL_INSTALLED_MODULE
 | |
| for the path to the final installed location of the module.</p>
 | |
| 
 | |
| <h4>LOCAL_IS_HOST_MODULE</h4>
 | |
| <p>Set by the host_xxx.mk includes to tell base_rules.mk and the other
 | |
| includes that we're building for the host.</p>
 | |
| 
 | |
| <h4>LOCAL_INSTALLED_MODULE</h4>
 | |
| <p class=warning>This should not be used, since multiple binaries are now
 | |
| created from a single module defintiion.</p>
 | |
| <p>The fully qualified path name of the final location of the module.
 | |
| See LOCAL_BUILT_MODULE for the location of the intermediate file that
 | |
| the make rules should actually be constructing.</p>
 | |
| 
 | |
| <h4>LOCAL_MODULE_CLASS</h4>
 | |
| <p>Which kind of module this is.  This variable is used to construct other
 | |
| variable names used to locate the modules.  See base_rules.mk and
 | |
| envsetup.mk.</p>
 | |
| 
 | |
| <h4>LOCAL_MODULE_SUFFIX</h4>
 | |
| <p>The suffix that will be appended to <code>LOCAL_MODULE</code> to form
 | |
| <code>LOCAL_MODULE_NAME</code>.  For example, .so, .a, .dylib.</p>
 | |
| 
 | |
| <h4>LOCAL_STRIP_MODULE</h4>
 | |
| <p>If set to true (the default), the binary will be stripped and a debug
 | |
| link will be set up so that GDB will still work. If set to no_debuglink,
 | |
| the binary will be stripped, but no debug link will be added. If set to
 | |
| keep_symbols, it will strip the debug information, but keep the symbol table.
 | |
| Any other value will prevent stripping.</p>
 | |
| 
 | |
| <h4>LOCAL_SYSTEM_SHARED_LIBRARIES</h4>
 | |
| <p>Used while building the base libraries: libc, libm, libdl.  Usually
 | |
| it should be set to "none," as it is in $(CLEAR_VARS).  When building
 | |
| these libraries, it's set to the ones they link against.  For example,
 | |
| libc, libstdc++ and libdl don't link against anything, and libm links against
 | |
| libc.  Normally, when the value is none, these libraries are automatically
 | |
| linked in to executables and libraries, so you don't need to specify them
 | |
| manually.</p>
 | |
| 
 | |
| 
 | |
| </body>
 | |
| </html>
 |