├── JNI_programmers_guide_and_specification.pdf ├── README.md ├── android_internals_a_confectioners_cookbook_volume_1_the_power_users_view.pdf ├── androidbuildsystem.png ├── auug97-recursive-make-considered-harmful.pdf ├── build-system.html ├── build_core_Makefile ├── build_core_clear_vars_mk ├── build_core_definitions.mk ├── build_output_contents.png ├── build_target_board_generic.png ├── build_target_product_AndroidProducts.mk └── buildspec.mk.default /JNI_programmers_guide_and_specification.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davisRoman/aosp-research/4e390c88589c6820f46b4472b7e2ca996a5a265a/JNI_programmers_guide_and_specification.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Wayland 2 | 3 | Num | Video | youtube | slides 4 | --- | ---------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- 5 | 1 | Jon Cruz - Where's Wayland | [youtube](https://www.youtube.com/watch?v=Sz1T0GvUziw) | 6 | 2 | X11 Sucks, Is Wayland Our Saviour? | [youtube](https://www.youtube.com/watch?v=xmAPfiyYuLw) | 7 | 3 | Hello Wayland, Goodbye X11 - The year of the Linux desktop! - Carsten Haitzler - FOSSASIA 2017 | [youtube](https://www.youtube.com/watch?v=Zsz7Shbnb9c) | 8 | 4 | The real story behind Wayland and X | [youtube](https://www.youtube.com/watch?v=GWQh_DmDLKQ) | [slides](https://people.freedesktop.org/~daniels/lca2013-wayland-x11.pdf) 9 | 10 | 11 | # aosp-research 12 | 13 | Num | Video | youtube | slides 14 | --- | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- 15 | 1 | ELC 2015 - Platform-Level UI Customization - Karim Yaghmour, Opersys | [youtube](https://www.youtube.com/watch?v=icHT3t0P3lw) | [slides](http://elinux.org/images/2/2b/Platform-Level_UI_Customization.pdf) 16 | 2 | Shree Kumar and Nitheesh K. L. - Extending Android with New Devices | [youtube](https://www.youtube.com/watch?v=hezmo93-tU4) | [slides](https://www.slideshare.net/ShreeKumar1/extending-android-with-new-devices) 17 | 3 | Open Android - O'Reilly Webcast - Marko Gargenta | [youtube](https://www.youtube.com/watch?v=6TpxrZo1FjA&list=PLOrIbKcQAgbnWyrE3EVF2QPlf4CvThk6A) | 18 | 4 | Google I/O 2014 - The ART runtime | [youtube](https://www.youtube.com/watch?v=EBlTzQsUoOw&index=10&list=PLd70x3t8N-h6TjgeOT60nnyTQ2u1p1cWL) | 19 | 5 | ELC 2015 - Memory Management Internals - Karim Yaghmour, Opersys | [youtube](https://www.youtube.com/watch?v=0BLLt_U5pus&list=PLzHJsAe4ulQr0HY2weezuHJSubzqh2McJ) | [slides](http://elinux.org/images/e/e9/Memory_Management_Internals.pdf) 20 | 6 | ELC 2015 - Android Customization: From the Kernel to the Apps - Cédric Cabessa, | [youtube](https://www.youtube.com/watch?v=o64puvBxgYM&index=3&list=PLp0nAUdhWcr5xQnM5Jaay5NccBlUE6Z8V) | [slides](http://elinux.org/images/f/fb/Android_Customization-_From_the_Kernel_to_the_Apps.pdf) 21 | 7 | Introduction to Android Platform Development (with Linaro) | [youtube](https://www.youtube.com/watch?v=wS2VxHQkeT4&index=6&list=PLp0nAUdhWcr5xQnM5Jaay5NccBlUE6Z8V) | [slides](https://wiki.linaro.org/Events/LinaroConnectQ3.11/Presentations?action=AttachFile&do=get&target=Introduction_to_Android_Platform_Development.pdf) 22 | 8 | Android Plateform Anatomy (eng) - DroidCon Paris 2013 | [youtube](https://www.youtube.com/watch?v=UBHz-noN60I) | [slides](https://www.slideshare.net/gxben/droidcon-2013-france-android-platform-anatomy) 23 | 9 | Android Device Porting Walkthrough - Android Builder Summit 2012 | [youtube](https://www.youtube.com/watch?v=mvxYt3AkbrE&t=17s) | [slides](https://events.linuxfoundation.org/images/stories/pdf/lf_abs12_zores.pdf) 24 | 10 | LCE12 - Embedded Android - 2 Nov 2012 - BV2 (Part 2) | [youtube](https://www.youtube.com/watch?v=mdpjEAu76jE&t=263s) | [slides](https://events.linuxfoundation.org/images/stories/pdf/lf_abs12_kobayashi.pdf) 25 | 11 | ADB (Android Debug Bridge) How It Works - Android Builder Summit 2012 | [youtube](https://www.youtube.com/watch?v=0y8Xn5NfpLY&index=3&list=PL89H05C9GvZ-CbEkj2CFuwNlHvql0qB_p) | 26 | 12 | Running Code in the Android Stack - Karim Yaghmour, Opersys | [youtube](https://www.youtube.com/watch?v=D5D5_Cghkv0&list=PLrWvSmw0_Zf2Y9PH3rsFZra_g1Zo9Yk2h&index=1) | [slides](http://events.linuxfoundation.org/sites/events/files/slides/running-code-in-android-clean-131030.pdf) 27 | 13 | ELC 2015 - Building My Product on Android Open Source Project - Rafael Coutinho, Phi | [youtube](https://www.youtube.com/watch?v=yUOzBvtXEgE&t=132s) | [slides](http://elinux.org/images/2/29/Customizing_AOSP_for_my_Device.pdf) 28 | 14 | Karim Yaghmour: Embedded Android #1 - Android Internals | [youtube](https://www.youtube.com/watch?v=KLUXPxxJc5c) | [slides](https://www.slideshare.net/opersys/embedded-android-workshop-part-1-at-linaro-connect-asia-2013) 29 | 15 | Karim Yaghmour: Embedded Android #2 - Working with the AOSP | [youtube](https://www.youtube.com/watch?v=LimC0XpeT0k) | [slides](https://www.slideshare.net/opersys/working-with-the-aosp-linaro-connect-asia-2013) 30 | 16 | Karim Yaghmour: Embedded Android #3 - Native Android user-space | [youtube](https://www.youtube.com/watch?v=lHeMfFAFI-I&t=880s) | [slides](https://www.slideshare.net/opersys/native-android-userspace-part-of-the-embedded-android-workshop-at-linaro-connect-asia-2013) 31 | 17 | Karim Yaghmour: Embedded Android #4 - Using and Customizing the Android Framework | [youtube](https://www.youtube.com/watch?v=XwRy8Kv3vDQ&t=7s) | [slides](https://www.slideshare.net/opersys/using-and-customizing-the-android-framework-part-4-of-embedded-android-workshop-at-linaro-connect-asia-2013) 32 | 18 | Amit Pundir - Android Porting for Dummies | [youtube](https://www.youtube.com/watch?v=JD1V3AQC0GQ) | [slides](https://www.slideshare.net/pundiramit/android-porting-for-dummies) 33 | 19 | #droidconpl2015 - Aleksander Piotrowski 'Nothing but the truth about Binder' | [youtube](https://www.youtube.com/watch?v=l4OlJqJDpkk) 34 | 20 | Tutorial: Diving into Android Source Code | [youtube](https://www.youtube.com/watch?v=NsqFOSzoYE8) 35 | 21 | ELC 2015 - Embedded Android Workshop Part 1 - Karim Yaghmour, Opersys | [youtube](https://www.youtube.com/watch?v=dEKYZUgorWQ&t=115s) | [slides](https://www.slideshare.net/opersys/embedded-android-workshop-46338344) 36 | 22 | ELC 2015 - Embedded Android Workshop Part 2 - Karim Yaghmour, Opersys | [youtube](https://www.youtube.com/watch?v=TBNz2LN_58s) | [slides](https://www.slideshare.net/opersys/embedded-android-workshop-46338344) 37 | 23 | ELC 2015 - Embedded Android Workshop Part 3 - Karim Yaghmour, Opersys | [youtube](https://www.youtube.com/watch?v=qaI2upEFuoc) | [slides](https://www.slideshare.net/opersys/embedded-android-workshop-46338344) 38 | 24 | Deep Dive into Android IPC/Binder Framework | [youtube](https://www.youtube.com/watch?v=LBqpXaivRmY&list=PLp8TnZfz-r1761W5cksOx6488Io7F-Eky&index=1) | [slides](https://events.linuxfoundation.org/images/stories/slides/abs2013_gargentas.pdf) 39 | 25 | Mastering the Android Touch System | [youtube](https://www.youtube.com/watch?v=EZAoJU-nUyI) | [slides](http://files.cnblogs.com/files/sunzn/PRE_andevcon_mastering-the-android-touch-system.pdf) 40 | 26 | Digging Into Android Startup | [youtube](https://www.youtube.com/watch?annotation_id=annotation_1433316763&feature=iv&src_vid=GFtoxou13J8&v=5SQP0qfUDjI) 41 | 27 | Digging Into Android System Services | [youtube](https://www.youtube.com/watch?v=M6extgmQQNw) 42 | 28 | Android Development Fundamentals: What I wish I knew when I started | [youtube](https://www.youtube.com/watch?v=h3gPo7qFOFw) 43 | 29 | Tutorial: X86 ROM Cooking 101 - Android Builders Summit | [youtube](https://www.youtube.com/watch?v=7iLeBD33Fo0) 44 | 30 | Debugging & Testing Your Android Applications | [youtube](https://www.youtube.com/watch?v=AJVolvNwHL8) 45 | 31 | Dave Smith: Android Training, Things Devs Should Know | [youtube](https://www.youtube.com/watch?v=GFtoxou13J8) 46 | 32 | ELC 2015-Generalize Android on Low-Cost 64-Bit ARM Community Boards-Khasim Syed Mohammed | [youtube](https://www.youtube.com/watch?v=u2Ef3bfyT6s) 47 | 33 | Android Device Porting Walkthrough - Android Builder Summit 2012 | [youtube](https://www.youtube.com/watch?v=mvxYt3AkbrE) 48 | 34 | Komáromy Dániel - Enter The Snapdragon! | [youtube](https://www.youtube.com/watch?v=2wJRnewVE-g) 49 | 35 | Dissecting Qualcomm's 1.7M Android Fork by Stephen Boyd | [youtube](https://www.youtube.com/watch?v=JnGL85SglbA) 50 | 36 | [CB16] The ARMs race for kernel protection by Jonathan Levin | [youtube](https://www.youtube.com/watch?v=7qSr5p3wJ_8) 51 | 37 | CyanogenMod Workshop - Building your own Android OS - Abhisek Devkota @ADD 15 | [youtube](https://www.youtube.com/watch?v=AUMyXknowhY) 52 | 38 | ELC2015-Android Open Source Project to Support Single-Use Device Controllers-Ben Friedberg | [youtube](https://www.youtube.com/watch?v=thzj0OtGb9E&t=466s) 53 | 39 | Porting VLC on Android (en) - Jean-Baptiste Kempf, VideoLan - Droidcon Paris 2014 | [youtube](https://www.youtube.com/watch?v=NoWV2JdoNnc) 54 | 40 | DEF CON 20 - Thomas Cannon - Into the Droid: Gaining Access to Android User Data | [youtube](https://www.youtube.com/watch?v=MOYqgIhQ3y0) 55 | 41 | A War Story: Porting Android 4.0 to a Custom Board - ELCE 2012 | [youtube](https://www.youtube.com/watch?v=LBgRmZOV-tc) | [slides](http://elinux.org/images/f/ff/Porting_Android_4.0_to_a_Custom_Board.pdf) 56 | 42 | MIS 2016 - Lecture 10 - Android Internals - Part 1 | [youtube](https://www.youtube.com/watch?v=BXqoz-qIcbk) | [slides](https://github.com/floe/mobile-information-systems/blob/master/10-android-internals.odp) 57 | 58 | Num | useful docs | link 59 | --- | --------------------------------------------------- | ------------------------ 60 | 1 | Android Compatibility Definition Android 7.1 | [here](https://static.googleusercontent.com/media/source.android.com/en//compatibility/android-cdd.pdf) 61 | 62 | 63 | 64 | Playlist 65 | 1.https://www.youtube.com/playlist?list=PLEq1q16moI5uvGNEdu0eODGiSJAk3VXfy 66 | 2. https://www.youtube.com/playlist?list=PL07D15CEBAC16A98B 67 | 3. https://www.youtube.com/playlist?list=PL9kDJEhVASV7Onu9l2rRvo14N9S4z8rNh 68 | blogs: 69 | 1. http://blog.udinic.com/2014/07/24/aosp-part-3-developing-efficiently 70 | 71 | 72 | 73 | Little Kernel Boot Loader Overview ( Qualcomm ) 74 | file:///home/davis/Downloads/lm80-p0436-1_little_kernel_boot_loader_overview.pdf 75 | 76 | 77 | 78 | 79 | 80 | https://events.linuxfoundation.org/slides/2011/abs/abs2011_yaghmour_porting.pdf 81 | 82 | 83 | 84 | NXPNCI Android Porting Guidelines 85 | http://www.nxp.com/documents/application_note/AN11690.pdf 86 | 87 | 88 | http://xda-university.com/as-a-developer/porting-android-to-non-android-devices 89 | 90 | 91 | 92 | http://free-electrons.com/pub/conferences/2015/captronic/captronic-porting-linux-on-arm.pdf 93 | 94 | What else can you do with Android? 95 | Porting to custom hardware 96 | http://elinux.org/images/7/71/03-android-inside.pdf 97 | 98 | Android internals 99 | https://vimeo.com/18017921 100 | 101 | Custom Kernel on 96boards Hikey LeMaker 102 | https://suchakra.wordpress.com/2016/04/15/custom-kernel-on-96boards-hikey/ 103 | 104 | 105 | Getting Started: Building Android From Source 106 | http://xda-university.com/as-a-developer/getting-started-building-android-from-source 107 | 108 | http://www.themobileknowledge.com/training-area/sites/default/files/NFC%20in%20Android.pdfhttps://www.windriver.com/seminars/7751-android/2-Android_TexasInstruments.pdf 109 | 110 | https://www.cl.cam.ac.uk/teaching/0910/AddTopics/lecture4.pdf 111 | 112 | http://files.cnblogs.com/files/pengdonglin137/Android-x86%E6%9E%B6%E6%9E%84%E5%88%86%E6%9E%90%E4%B8%8E%E7%A7%BB%E6%A4%8D2.pdf 113 | 114 | Understanding Android Open Source Project 115 | http://www.cafelinear.com/2014/02/27/understanding-aosp.html 116 | 117 | 118 | 119 | 120 | 121 | Compatibility Definition - Android 7.1 122 | https://static.googleusercontent.com/media/source.android.com/en//compatibility/android-cdd.pdf 123 | 124 | 125 | Android Hacking for the Nexus 7: Part 1 126 | https://www.scribd.com/document/234215989/Android-Hacking-for-Nexus7-2012-11-19-Part1 127 | 128 | https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjPvvD69MnSAhUh74MKHUI4C3UQFggfMAA&url=http%3A%2F%2Felinux.org%2Fimages%2Fd%2Fd3%2FROM_cooking_and_good_practices--vagnet.pdf&usg=AFQjCNEOCb7nJQhM8leYysfj_q36qvnM1A 129 | 130 | 131 | https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwioj7mQ9cnSAhXp5IMKHXtCBjcQFggcMAA&url=https%3A%2F%2Fdoc.lagout.org%2Fprogrammation%2FAndroid%2FXDADevelopers%27%2520Android%2520Hacker%27s%2520Toolkit%2520%255BTyler%2520%2526%2520Verduzco%25202012-06-05%255D.pdf&usg=AFQjCNFSKOmNFEcEC3a-MpXpXO9oL19Y-g 132 | 133 | 134 | https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjrnOfJ9cnSAhWP0YMKHd59AQ0QFgguMAA&url=https%3A%2F%2Fdeveloper.qualcomm.com%2Fdownload%2Fdb410c%2Flinux-android-software-build-and-installation-guide.pdf&usg=AFQjCNG7cu1AYdkxea6IbXrC_r5zupj7Bw 135 | 136 | https://developer.qualcomm.com/qfile/29466/lm80-p0436-23_interface_i2c_light_sensor_appnote.pdf 137 | 138 | 139 | https://developer.qualcomm.com/qfile/28820/lm80-p0436-9_sensors_porting_guide.pdf 140 | 141 | 142 | https://java.net/attachments/lists/jitsi/dev/2008-07/166/Porting_SIP_Communicator_on_Android.pdf 143 | -------------------------------------------------------------------------------- /android_internals_a_confectioners_cookbook_volume_1_the_power_users_view.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davisRoman/aosp-research/4e390c88589c6820f46b4472b7e2ca996a5a265a/android_internals_a_confectioners_cookbook_volume_1_the_power_users_view.pdf -------------------------------------------------------------------------------- /androidbuildsystem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davisRoman/aosp-research/4e390c88589c6820f46b4472b7e2ca996a5a265a/androidbuildsystem.png -------------------------------------------------------------------------------- /auug97-recursive-make-considered-harmful.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davisRoman/aosp-research/4e390c88589c6820f46b4472b7e2ca996a5a265a/auug97-recursive-make-considered-harmful.pdf -------------------------------------------------------------------------------- /build-system.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 20 | 21 | 22 | Android Build System 23 | 24 | 25 | 26 | 27 | 28 | 30 | 52 | 53 | 54 | 55 | 68 | 69 | 70 | 71 | 72 |

Android Build System

73 | 74 | 75 |

76 | Status: Draft   77 | (as of May 18, 2006) 78 |

79 | 80 |

Contents

81 | 83 | 84 | 85 |

Objective

86 |

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.

91 | 92 |

Principles and Use Cases and Policy

93 |

Given the above objective, these are the overall principles and use cases 94 | that we will support. This is not an exhaustive list.

95 |

Multiple Targets

96 |

It needs to be possible to build the Android platform for multiple targets. 97 | This means:

98 | 111 |

Non-Recursive Make

112 |

To achieve the objectives, the build system will be rewritten to use make 113 | non-recursively. For more background on this, read Recursive Make Considered Harmful. For those that don't 114 | want PDF, here is the 115 | Google translated version. 116 |

Rapid Compile-Test Cycles

117 |

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.

121 |

Both Environment and Config File Based Settings

122 |

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.

127 |

Object File Directory / make clean

128 |

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 " 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.

133 | 134 |

SDK

135 |

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.

143 | 144 |

Dependecies

145 |

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.

149 | 150 |

Hiding command lines

151 |

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.

155 | 156 |

Wildcard source files

157 |

Wildcarding source file will be discouraged. It may be useful in some 158 | scenarios. The default $(wildcard *) will not work due to the 159 | current directory being set to the root of the build tree.

160 | 161 |

Multiple targets in one directory

162 |

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.

165 | 166 |

Makefile fragments for modules

167 |

Android.mk 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".

170 | 171 |

Use shared libraries

172 |

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.

175 | 176 | 177 |

Nice to Have

178 | 179 |

These things would be nice to have, and this is a good place to record them, 180 | however these are not promises.

181 | 182 |

Simultaneous Builds

183 |

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)

187 | 188 |

Deleting headers (or other dependecies)

189 |

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)

192 |

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.

195 | 196 |

Multiple builds

197 |

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)

201 | 202 |

Aftermarket Locales and Carrier

203 |

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.

205 | 206 | 207 |

Usage

208 |

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.

210 | 211 |

Your first build

212 |

The Building document describes how do do 213 | builds.

214 | 215 |

build/envsetup.sh functions

216 | If you source the file build/envsetup.sh into your bash environment, 217 | . build/envsetup.shyou'll get a few helpful shell functions: 218 | 219 | 230 | 231 |

Build flavors/types

232 |

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 |

238 | 239 | 240 | 241 | 244 | 259 | 260 | 261 | 264 | 277 | 278 | 279 | 282 | 291 | 292 |
242 | eng 243 | 245 | This is the default flavor. A plain "make" is the 246 | same as "make eng". droid is an alias 247 | for eng. 248 |
    249 |
  • Installs modules tagged with: eng, debug, 250 | user, and/or development. 251 |
  • Installs non-APK modules that have no tags specified. 252 |
  • Installs APKs according to the product definition files, in 253 | addition to tagged APKs. 254 |
  • ro.secure=0 255 |
  • ro.debuggable=1 256 |
  • ro.kernel.android.checkjni=1 257 |
  • adb is enabled by default. 258 |
262 | user 263 | 265 | "make user" 266 |

267 | This is the flavor intended to be the final release bits. 268 |

    269 |
  • Installs modules tagged with user. 270 |
  • Installs non-APK modules that have no tags specified. 271 |
  • Installs APKs according to the product definition files; tags 272 | are ignored for APK modules. 273 |
  • ro.secure=1 274 |
  • ro.debuggable=0 275 |
  • adb is disabled by default. 276 |
280 | userdebug 281 | 283 | "make userdebug" 284 |

285 | The same as user, except: 286 |

    287 |
  • Also installs modules tagged with debug. 288 |
  • ro.debuggable=1 289 |
  • adb is enabled by default. 290 |
293 | 294 |

295 | If you build one flavor and then want to build another, you should run 296 | "make installclean" between the two makes to guarantee that 297 | you don't pick up files installed by the previous flavor. "make 298 | clean" will also suffice, but it takes a lot longer. 299 |

300 | 301 | 302 |

More pseudotargets

303 |

Sometimes you want to just build one thing. The following pseudotargets are 304 | there for your convenience:

305 | 306 | 350 | 351 |

How to add another component to the build - Android.mk templates

352 |

You have a new library, a new app, or a new executable. For each of the 353 | common types of modules, there is a corresponding file in the templates 354 | directory. It will usually be enough to copy one of these, and fill in your 355 | own values. Some of the more esoteric values are not included in the 356 | templates, but are instead just documented here, as is the documentation 357 | on using custom tools to generate files.

358 |

Mostly, you can just look for the TODO comments in the templates and do 359 | what it says. Please remember to delete the TODO comments when you're done 360 | to keep the files clean. The templates have minimal documentation in them, 361 | because they're going to be copied, and when that gets stale, the copies just 362 | won't get updated. So read on...

363 | 364 |

Apps

365 |

Use the templates/apps file.

366 |

This template is pretty self-explanitory. See the variables below for more 367 | details.

368 | 369 |

Java Libraries

370 |

Use the templates/java_library file.

371 |

The interesting thing here is the value of LOCAL_MODULE, which becomes 372 | the name of the jar file. (Actually right now, we're not making jar files yet, 373 | just directories of .class files, but the directory is named according to 374 | what you put in LOCAL_MODULE). This name will be what goes in the 375 | LOCAL_JAVA_LIBRARIES variable in modules that depend on your java library.

376 | 377 |

C/C++ Executables

378 |

Use the templates/executable file, or the 379 | templates/executable_host file.

380 |

This template has a couple extra options that you usually don't need. 381 | Please delete the ones you don't need, and remove the TODO comments. It makes 382 | the rest of them easier to read, and you can always refer back to the templates 383 | if you need them again later.

384 |

By default, on the target these are built into /system/bin, and on the 385 | host, they're built into /host/bin. These can be overridden by setting 386 | LOCAL_MODULE_PATH or LOCAL_MODULE_RELATIVE_PATH. See 387 | Putting targets elsewhere 388 | for more.

389 | 390 |

Shared Libraries

391 |

Use the templates/shared_library file, or the 392 | templates/shared_library_host file.

393 |

Remember that on the target, we use shared libraries, and on the host, 394 | we use static libraries, since executable size isn't as big an issue, and it 395 | simplifies distribution in the SDK.

396 | 397 |

Static Libraries

398 |

Use the templates/static_library file, or the 399 | templates/static_library_host file.

400 |

Remember that on the target, we use shared libraries, and on the host, 401 | we use static libraries, since executable size isn't as big an issue, and it 402 | simplifies distribution in the SDK.

403 | 404 |

Using Custom Tools

405 |

If you have a tool that generates source files for you, it's possible 406 | to have the build system get the dependencies correct for it. Here are 407 | a couple of examples. $@ is the make built-in variable for 408 | "the current target." The red parts are the parts you'll 409 | need to change.

410 | 411 |

You need to put this after you have declared LOCAL_PATH and 412 | LOCAL_MODULE, because the $(local-generated-sources-dir) 413 | and $(local-host-generated-sources-dir) macros use these variables 414 | to determine where to put the files. 415 | 416 |

Example 1
417 |

Here, there is one generated file, called 418 | chartables.c, which doesn't depend on anything. And is built by the tool 419 | built to $(HOST_OUT_EXECUTABLES)/dftables. Note on the second to last line 420 | that a dependency is created on the tool.

421 |
422 | intermediates:= $(local-generated-sources-dir)
423 | GEN := $(intermediates)/chartables.c
424 | $(GEN): PRIVATE_CUSTOM_TOOL = $(HOST_OUT_EXECUTABLES)/dftables $@
425 | $(GEN): $(HOST_OUT_EXECUTABLES)/dftables
426 | 	$(transform-generated-source)
427 | LOCAL_GENERATED_SOURCES += $(GEN)
428 | 
429 | 430 |
Example 2
431 |

Here as a hypothetical example, we use use cat as if it were to transform 432 | a file. Pretend that it does something useful. Note how we use a 433 | target-specific variable called PRIVATE_INPUT_FILE to store the name of the 434 | input file.

435 |
436 | intermediates:= $(local-generated-sources-dir)
437 | GEN := $(intermediates)/file.c
438 | $(GEN): PRIVATE_INPUT_FILE := $(LOCAL_PATH)/input.file
439 | $(GEN): PRIVATE_CUSTOM_TOOL = cat $(PRIVATE_INPUT_FILE) > $@
440 | $(GEN): $(LOCAL_PATH)/file.c
441 | 	$(transform-generated-source)
442 | LOCAL_GENERATED_SOURCES += $(GEN)
443 | 
444 | 445 |
Example 3
446 |

If you have several files that are all similar in 447 | name, and use the same tool, you can combine them. (here the *.lut.h files are 448 | the generated ones, and the *.cpp files are the input files)

449 |
450 | intermediates:= $(local-generated-sources-dir)
451 | GEN := $(addprefix $(intermediates)/kjs/, \
452 |             array_object.lut.h \
453 |             bool_object.lut.h \
454 |         )
455 | $(GEN): PRIVATE_CUSTOM_TOOL = perl libs/WebKitLib/WebKit/JavaScriptCore/kjs/create_hash_table $< -i > $@
456 | $(GEN): $(intermediates)/%.lut.h : $(LOCAL_PATH)/%.cpp
457 | 	$(transform-generated-source)
458 | LOCAL_GENERATED_SOURCES += $(GEN)
459 | 
460 | 461 |

Platform specific conditionals

462 |

Sometimes you need to set flags specifically for different platforms. Here 463 | is a list of which values the different build-system defined variables will be 464 | set to and some examples.

465 |

For a device build, TARGET_OS is linux (we're using 466 | linux!), and TARGET_ARCH is arm.

467 |

For a simulator build, TARGET_OS and TARGET_ARCH 468 | are set to the same as HOST_OS and HOST_ARCH are 469 | on your platform. TARGET_PRODUCT is the name of the target 470 | hardware/product you are building for. The value sim is used 471 | for the simulator. We haven't thought through the full extent of customization 472 | that will happen here, but likely there will be additional UI configurations 473 | specified here as well.

474 | 475 | 476 | 482 | 486 | 491 | 492 | 493 | 499 | 504 | 509 | 515 | 516 |
477 | HOST_OS
478 | linux
479 | darwin
480 | (cygwin) 481 |
483 | HOST_ARCH
484 | x86 485 |
487 | HOST_BUILD_TYPE
488 | release
489 | debug 490 |
494 | TARGET_OS
495 | linux
496 | darwin
497 | (cygwin) 498 |
500 | TARGET_ARCH
501 | arm
502 | x86 503 |
505 | TARGET_BUILD_TYPE
506 | release
507 | debug 508 |
510 | TARGET_PRODUCT
511 | sim
512 | dream
513 | sooner 514 |
517 | 518 |

Some Examples

519 |
ifeq ($(TARGET_BUILD_TYPE),release)
520 | LOCAL_CFLAGS += -DNDEBUG=1
521 | endif
522 | 
523 | # from libutils
524 | ifeq ($(TARGET_OS),linux)
525 | # Use the futex based mutex and condition variable
526 | # implementation from android-arm because it's shared mem safe
527 | LOCAL_SRC_FILES += futex_synchro.c
528 | LOCAL_LDLIBS += -lrt -ldl
529 | endif
530 | 
531 | 
532 | 533 | 534 |

Putting modules elsewhere

535 |

If you have modules that normally go somewhere, and you need to have them 536 | build somewhere else, read this.

537 |

If you have modules that need to go in a subdirectory of their normal 538 | location, for example HAL modules that need to go in /system/lib/hw or 539 | /vendor/lib/hw, set LOCAL_MODULE_RELATIVE_PATH in your Android.mk, for 540 | example:

541 |
542 | LOCAL_MODULE_RELATIVE_PATH := hw
543 | 
544 |

If you have modules that need to go in an entirely different location, for 545 | example the root filesystem instead of in /system, add these lines to your 546 | Android.mk:

547 |
548 | LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT_SBIN)
549 | LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_SBIN_UNSTRIPPED)
550 | 
551 |

For executables and libraries, you need to specify a 552 | LOCAL_UNSTRIPPED_PATH location if you specified a 553 | LOCAL_MODULE_PATH, because on target builds, we keep 554 | the unstripped executables so GDB can find the symbols. 555 | LOCAL_UNSTRIPPED_PATH is not necessary if you only specified 556 | LOCAL_MODULE_RELATIVE_PATH.

557 |

Look in config/envsetup.make for all of the variables defining 558 | places to build things.

559 |

FYI: If you're installing an executable to /sbin, you probably also want to 560 | set LOCAL_FORCE_STATIC_EXCUTABLE := true in your Android.mk, which 561 | will force the linker to only accept static libraries.

562 | 563 | 564 |

Android.mk variables

565 |

These are the variables that you'll commonly see in Android.mk files, listed 566 | alphabetically.

567 |

But first, a note on variable naming: 568 |

598 |

599 | 600 |

LOCAL_ASSET_FILES

601 |

In Android.mk files that include $(BUILD_PACKAGE) set this 602 | to the set of files you want built into your app. Usually:

603 |

LOCAL_ASSET_FILES += $(call find-subdir-assets)

604 |

This will probably change when we switch to ant for the apps' build 605 | system.

606 | 607 |

LOCAL_CC

608 |

If you want to use a different C compiler for this module, set LOCAL_CC 609 | to the path to the compiler. If LOCAL_CC is blank, the appropriate default 610 | compiler is used.

611 | 612 |

LOCAL_CXX

613 |

If you want to use a different C++ compiler for this module, set LOCAL_CXX 614 | to the path to the compiler. If LOCAL_CXX is blank, the appropriate default 615 | compiler is used.

616 | 617 |

LOCAL_CFLAGS

618 |

If you have additional flags to pass into the C or C++ compiler, add 619 | them here. For example:

620 |

LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1

621 | 622 |

LOCAL_CPPFLAGS

623 |

If you have additional flags to pass into only the C++ compiler, add 624 | them here. For example:

625 |

LOCAL_CPPFLAGS += -ffriend-injection

626 | LOCAL_CPPFLAGS is guaranteed to be after LOCAL_CFLAGS 627 | on the compile line, so you can use it to override flags listed in 628 | LOCAL_CFLAGS. 629 | 630 |

LOCAL_CPP_EXTENSION

631 |

If your C++ files end in something other than ".cpp", 632 | you can specify the custom extension here. For example:

633 |

LOCAL_CPP_EXTENSION := .cc

634 | Note that all C++ files for a given module must have the same 635 | extension; it is not currently possible to mix different extensions. 636 | 637 |

LOCAL_NO_DEFAULT_COMPILER_FLAGS

638 |

Normally, the compile line for C and C++ files includes global include 639 | paths and global cflags. If LOCAL_NO_DEFAULT_COMPILER_FLAGS 640 | is non-empty, none of the default includes or flags will be used when compiling 641 | C and C++ files in this module. 642 | LOCAL_C_INCLUDES, LOCAL_CFLAGS, and 643 | LOCAL_CPPFLAGS will still be used in this case, as will 644 | any DEBUG_CFLAGS that are defined for the module. 645 | 646 |

LOCAL_COPY_HEADERS

647 |

This will be going away.

648 |

The set of files to copy to the install include tree. You must also 649 | supply LOCAL_COPY_HEADERS_TO.

650 |

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.

655 | 656 |

LOCAL_COPY_HEADERS_TO

657 |

This will be going away.

658 |

The directory within "include" to copy the headers listed in 659 | LOCAL_COPY_HEADERS to.

660 |

This is going away because copying headers messes up the error messages, and 661 | may lead to people editing those headers instead of the correct ones. It also 662 | makes it easier to do bad layering in the system, which we want to avoid. We 663 | also aren't doing a C/C++ SDK, so there is no ultimate requirement to copy any 664 | headers.

665 | 666 |

LOCAL_C_INCLUDES

667 |

Additional directories to instruct the C/C++ compilers to look for header 668 | files in. These paths are rooted at the top of the tree. Use 669 | LOCAL_PATH if you have subdirectories of your own that you 670 | want in the include paths. For example:

671 |

672 | LOCAL_C_INCLUDES += extlibs/zlib-1.2.3
673 | LOCAL_C_INCLUDES += $(LOCAL_PATH)/src 674 |

675 |

You should not add subdirectories of include to 676 | LOCAL_C_INCLUDES, instead you should reference those files 677 | in the #include statement with their subdirectories. For 678 | example:

679 |

#include <utils/KeyedVector.h>
680 | not #include <KeyedVector.h>

681 |

There are some components that are doing this wrong, and should be cleaned 682 | up.

683 | 684 |

LOCAL_MODULE_TAGS

685 |

Set LOCAL_MODULE_TAGS to any number of whitespace-separated 686 | tags. If the tag list is empty or contains droid, the module 687 | will get installed as part of a make droid. Otherwise, it will 688 | only get installed by running make <your-module> 689 | or with the make all pseudotarget.

690 | 691 |

LOCAL_REQUIRED_MODULES

692 |

Set LOCAL_REQUIRED_MODULES to any number of whitespace-separated 693 | module names, like "libblah" or "Email". If this module is installed, all 694 | of the modules that it requires will be installed as well. This can be 695 | used to, e.g., ensure that necessary shared libraries or providers are 696 | installed when a given app is installed. 697 | 698 |

LOCAL_FORCE_STATIC_EXECUTABLE

699 |

If your executable should be linked statically, set 700 | LOCAL_FORCE_STATIC_EXECUTABLE:=true. There is a very short 701 | list of libraries that we have in static form (currently only libc). This is 702 | really only used for executables in /sbin on the root filesystem.

703 | 704 |

LOCAL_GENERATED_SOURCES

705 |

Files that you add to LOCAL_GENERATED_SOURCES will be 706 | automatically generated and then linked in when your module is built. 707 | See the Custom Tools template makefile for an 708 | example.

709 | 710 |

LOCAL_JAVACFLAGS

711 |

If you have additional flags to pass into the javac compiler, add 712 | them here. For example:

713 |

LOCAL_JAVACFLAGS += -Xlint:deprecation

714 | 715 |

LOCAL_JAVA_LIBRARIES

716 |

When linking Java apps and libraries, LOCAL_JAVA_LIBRARIES 717 | specifies which sets of java classes to include. Currently there are 718 | two of these: core and framework. 719 | In most cases, it will look like this:

720 |

LOCAL_JAVA_LIBRARIES := core framework

721 |

Note that setting LOCAL_JAVA_LIBRARIES is not necessary 722 | (and is not allowed) when building an APK with 723 | "include $(BUILD_PACKAGE)". The appropriate libraries 724 | will be included automatically.

725 | 726 |

LOCAL_LDFLAGS

727 |

You can pass additional flags to the linker by setting 728 | LOCAL_LDFLAGS. Keep in mind that the order of parameters is 729 | very important to ld, so test whatever you do on all platforms.

730 | 731 |

LOCAL_LDLIBS

732 |

LOCAL_LDLIBS allows you to specify additional libraries 733 | that are not part of the build for your executable or library. Specify 734 | the libraries you want in -lxxx format; they're passed directly to the 735 | link line. However, keep in mind that there will be no dependency generated 736 | for these libraries. It's most useful in simulator builds where you want 737 | to use a library preinstalled on the host. The linker (ld) is a particularly 738 | fussy beast, so it's sometimes necessary to pass other flags here if you're 739 | doing something sneaky. Some examples:

740 |

LOCAL_LDLIBS += -lcurses -lpthread
741 | LOCAL_LDLIBS += -Wl,-z,origin 742 |

743 | 744 |

LOCAL_NO_MANIFEST

745 |

If your package doesn't have a manifest (AndroidManifest.xml), then 746 | set LOCAL_NO_MANIFEST:=true. The common resources package 747 | does this.

748 | 749 |

LOCAL_PACKAGE_NAME

750 |

LOCAL_PACKAGE_NAME is the name of an app. For example, 751 | Dialer, Contacts, etc. This will probably change or go away when we switch 752 | to an ant-based build system for the apps.

753 | 754 |

LOCAL_PATH

755 |

The directory your Android.mk file is in. You can set it by putting the 756 | following as the first line in your Android.mk:

757 |

LOCAL_PATH := $(my-dir)

758 |

The my-dir macro uses the 759 | MAKEFILE_LIST 760 | variable, so you must call it before you include any other makefiles. Also, 761 | consider that any subdirectories you inlcude might reset LOCAL_PATH, so do your 762 | own stuff before you include them. This also means that if you try to write 763 | several include lines that reference LOCAL_PATH, 764 | it won't work, because those included makefiles might reset LOCAL_PATH. 765 | 766 |

LOCAL_POST_PROCESS_COMMAND

767 |

For host executables, you can specify a command to run on the module 768 | after it's been linked. You might have to go through some contortions 769 | to get variables right because of early or late variable evaluation:

770 |

module := $(HOST_OUT_EXECUTABLES)/$(LOCAL_MODULE)
771 | LOCAL_POST_PROCESS_COMMAND := /Developer/Tools/Rez -d __DARWIN__ -t APPL\
772 |        -d __WXMAC__ -o $(module) Carbon.r 773 |

774 | 775 |

LOCAL_PREBUILT_EXECUTABLES

776 |

When including $(BUILD_PREBUILT) or $(BUILD_HOST_PREBUILT), set these to 777 | executables that you want copied. They're located automatically into the 778 | right bin directory.

779 | 780 |

LOCAL_PREBUILT_LIBS

781 |

When including $(BUILD_PREBUILT) or $(BUILD_HOST_PREBUILT), set these to 782 | libraries that you want copied. They're located automatically into the 783 | right lib directory.

784 | 785 |

LOCAL_SHARED_LIBRARIES

786 |

These are the libraries you directly link against. You don't need to 787 | pass transitively included libraries. Specify the name without the suffix:

788 |

LOCAL_SHARED_LIBRARIES := \
789 |     libutils \
790 |     libui \
791 |     libaudio \
792 |     libexpat \
793 |     libsgl 794 |

795 | 796 |

LOCAL_SRC_FILES

797 |

The build system looks at LOCAL_SRC_FILES to know what source 798 | files to compile -- .cpp .c .y .l .java. For lex and yacc files, it knows 799 | how to correctly do the intermediate .h and .c/.cpp files automatically. If 800 | the files are in a subdirectory of the one containing the Android.mk, prefix 801 | them with the directory name:

802 |

LOCAL_SRC_FILES := \
803 |     file1.cpp \
804 |     dir/file2.cpp 805 |

806 | 807 |

LOCAL_STATIC_LIBRARIES

808 |

These are the static libraries that you want to include in your module. 809 | Mostly, we use shared libraries, but there are a couple of places, like 810 | executables in sbin and host executables where we use static libraries instead. 811 |

LOCAL_STATIC_LIBRARIES := \
812 |     libutils \
813 |     libtinyxml 814 |

815 | 816 |

LOCAL_MODULE

817 |

LOCAL_MODULE is the name of what's supposed to be generated 818 | from your Android.mk. For exmample, for libkjs, the LOCAL_MODULE 819 | is "libkjs" (the build system adds the appropriate suffix -- .so .dylib .dll). 820 | For app modules, use LOCAL_PACKAGE_NAME instead of 821 | LOCAL_MODULE. We're planning on switching to ant for the apps, 822 | so this might become moot.

823 | 824 |

LOCAL_MODULE_PATH

825 |

Instructs the build system to put the module somewhere other than what's 826 | normal for its type. If you override this, make sure you also set 827 | LOCAL_UNSTRIPPED_PATH if it's an executable or a shared library 828 | so the unstripped binary has somewhere to go. An error will occur if you forget 829 | to.

830 |

See Putting modules elsewhere for more.

831 | 832 |

LOCAL_MODULE_RELATIVE_PATH

833 |

Instructs the build system to put the module in a subdirectory under the 834 | directory that is normal for its type. If you set this you do not need to 835 | set LOCAL_UNSTRIPPED_PATH, the unstripped binaries will also use 836 | the relative path.

837 |

See Putting modules elsewhere for more.

838 | 839 |

LOCAL_UNSTRIPPED_PATH

840 |

Instructs the build system to put the unstripped version of the module 841 | somewhere other than what's normal for its type. Usually, you override this 842 | because you overrode LOCAL_MODULE_PATH for an executable or a 843 | shared library. If you overrode LOCAL_MODULE_PATH, but not 844 | LOCAL_UNSTRIPPED_PATH, an error will occur.

845 |

See Putting modules elsewhere for more.

846 | 847 |

LOCAL_WHOLE_STATIC_LIBRARIES

848 |

These are the static libraries that you want to include in your module without allowing 849 | the linker to remove dead code from them. This is mostly useful if you want to add a static library 850 | to a shared library and have the static library's content exposed from the shared library. 851 |

LOCAL_WHOLE_STATIC_LIBRARIES := \
852 |     libsqlite3_android
853 |

854 | 855 |

LOCAL_YACCFLAGS

856 |

Any flags to pass to invocations of yacc for your module. A known limitation 857 | here is that the flags will be the same for all invocations of YACC for your 858 | module. This can be fixed. If you ever need it to be, just ask.

859 |

LOCAL_YACCFLAGS := -p kjsyy

860 | 861 | 862 | 863 |

Implementation Details

864 | 865 |

You should never have to touch anything in the config directory unless 866 | you're adding a new platform, new tools, or adding new features to the 867 | build system. In general, please consult with the build system owner(s) 868 | (android-build-team) before you go 869 | mucking around in here. That said, here are some notes on what's going on 870 | under the hood.

871 | 872 |

Environment Setup / buildspec.mk Versioning

873 |

In order to make easier for people when the build system changes, when 874 | it is necessary to make changes to buildspec.mk or to rerun the environment 875 | setup scripts, they contain a version number in the variable 876 | BUILD_ENV_SEQUENCE_NUMBER. If this variable does not match what the build 877 | system expects, it fails printing an error message explaining what happened. 878 | If you make a change that requires an update, you need to update two places 879 | so this message will be printed. 880 |

886 | The scripts automatically get the value from the build system, so they will 887 | trigger the warning as well. 888 |

889 | 890 |

Additional makefile variables

891 |

You probably shouldn't use these variables. Please consult 892 | android-build-team before using them. 893 | These are mostly there for workarounds for other issues, or things that aren't 894 | completely done right.

895 | 896 |

LOCAL_ADDITIONAL_DEPENDENCIES

897 |

If your module needs to depend on anything else that 898 | isn't actually built in to it, you can add those make targets to 899 | LOCAL_ADDITIONAL_DEPENDENCIES. Usually this is a workaround 900 | for some other dependency that isn't created automatically.

901 | 902 |

LOCAL_BUILT_MODULE

903 |

When a module is built, the module is created in an intermediate 904 | directory then copied to its final location. LOCAL_BUILT_MODULE is 905 | the full path to the intermediate file. See LOCAL_INSTALLED_MODULE 906 | for the path to the final installed location of the module.

907 | 908 |

LOCAL_HOST

909 |

Set by the host_xxx.make includes to tell base_rules.make and the other 910 | includes that we're building for the host. Kenneth did this as part of 911 | openbinder, and I would like to clean it up so the rules, includes and 912 | definitions aren't duplicated for host and target.

913 | 914 |

LOCAL_INSTALLED_MODULE

915 |

The fully qualified path name of the final location of the module. 916 | See LOCAL_BUILT_MODULE for the location of the intermediate file that 917 | the make rules should actually be constructing.

918 | 919 |

LOCAL_REPLACE_VARS

920 |

Used in some stuff remaining from the openbinder for building scripts 921 | with particular values set,

922 | 923 |

LOCAL_SCRIPTS

924 |

Used in some stuff remaining from the openbinder build system that we 925 | might find handy some day.

926 | 927 |

LOCAL_MODULE_CLASS

928 |

Which kind of module this is. This variable is used to construct other 929 | variable names used to locate the modules. See base_rules.make and 930 | envsetup.make.

931 | 932 |

LOCAL_MODULE_NAME

933 |

Set to the leaf name of the LOCAL_BUILT_MODULE. I'm not sure, 934 | but it looks like it's just used in the WHO_AM_I variable to identify 935 | in the pretty printing what's being built.

936 | 937 |

LOCAL_MODULE_SUFFIX

938 |

The suffix that will be appended to LOCAL_MODULE to form 939 | LOCAL_MODULE_NAME. For example, .so, .a, .dylib.

940 | 941 |

LOCAL_STRIP_MODULE

942 |

Calculated in base_rules.make to determine if this module should actually 943 | be stripped or not, based on whether LOCAL_STRIPPABLE_MODULE 944 | is set, and whether the combo is configured to ever strip modules. With 945 | Iliyan's stripping tool, this might change.

946 | 947 |

LOCAL_STRIPPABLE_MODULE

948 |

Set by the include makefiles if that type of module is strippable. 949 | Executables and shared libraries are.

950 | 951 |

LOCAL_SYSTEM_SHARED_LIBRARIES

952 |

Used while building the base libraries: libc, libm, libdl. Usually 953 | it should be set to "none," as it is in $(CLEAR_VARS). When building 954 | these libraries, it's set to the ones they link against. For example, 955 | libc, libstdc++ and libdl don't link against anything, and libm links against 956 | libc. Normally, when the value is none, these libraries are automatically 957 | linked in to executables and libraries, so you don't need to specify them 958 | manually.

959 | 960 | 961 | 962 | 963 | -------------------------------------------------------------------------------- /build_core_Makefile: -------------------------------------------------------------------------------- 1 | # Put some miscellaneous rules here 2 | 3 | # HACK: clear LOCAL_PATH from including last build target before calling 4 | # intermedites-dir-for 5 | LOCAL_PATH := $(BUILD_SYSTEM) 6 | 7 | # Pick a reasonable string to use to identify files. 8 | ifneq "" "$(filter eng.%,$(BUILD_NUMBER))" 9 | # BUILD_NUMBER has a timestamp in it, which means that 10 | # it will change every time. Pick a stable value. 11 | FILE_NAME_TAG := eng.$(USER) 12 | else 13 | FILE_NAME_TAG := $(BUILD_NUMBER) 14 | endif 15 | 16 | # ----------------------------------------------------------------- 17 | # Define rules to copy PRODUCT_COPY_FILES defined by the product. 18 | # PRODUCT_COPY_FILES contains words like :[:]. 19 | # is relative to $(PRODUCT_OUT), so it should look like, 20 | # e.g., "system/etc/file.xml". 21 | # The filter part means "only eval the copy-one-file rule if this 22 | # src:dest pair is the first one to match the same dest" 23 | #$(1): the src:dest pair 24 | define check-product-copy-files 25 | $(if $(filter %.apk, $(call word-colon, 2, $(1))),$(error \ 26 | Prebuilt apk found in PRODUCT_COPY_FILES: $(1), use BUILD_PREBUILT instead!)) 27 | endef 28 | # filter out the duplicate : pairs. 29 | unique_product_copy_files_pairs := 30 | $(foreach cf,$(PRODUCT_COPY_FILES), \ 31 | $(if $(filter $(unique_product_copy_files_pairs),$(cf)),,\ 32 | $(eval unique_product_copy_files_pairs += $(cf)))) 33 | unique_product_copy_files_destinations := 34 | $(foreach cf,$(unique_product_copy_files_pairs), \ 35 | $(eval _src := $(call word-colon,1,$(cf))) \ 36 | $(eval _dest := $(call word-colon,2,$(cf))) \ 37 | $(call check-product-copy-files,$(cf)) \ 38 | $(if $(filter $(unique_product_copy_files_destinations),$(_dest)), \ 39 | $(info PRODUCT_COPY_FILES $(cf) ignored.), \ 40 | $(eval _fulldest := $(call append-path,$(PRODUCT_OUT),$(_dest))) \ 41 | $(if $(filter %.xml,$(_dest)),\ 42 | $(eval $(call copy-xml-file-checked,$(_src),$(_fulldest))),\ 43 | $(eval $(call copy-one-file,$(_src),$(_fulldest)))) \ 44 | $(eval ALL_DEFAULT_INSTALLED_MODULES += $(_fulldest)) \ 45 | $(eval unique_product_copy_files_destinations += $(_dest)))) 46 | unique_product_copy_files_pairs := 47 | unique_product_copy_files_destinations := 48 | 49 | # ----------------------------------------------------------------- 50 | # docs/index.html 51 | ifeq (,$(TARGET_BUILD_APPS)) 52 | gen := $(OUT_DOCS)/index.html 53 | ALL_DOCS += $(gen) 54 | $(gen): frameworks/base/docs/docs-redirect-index.html 55 | @mkdir -p $(dir $@) 56 | @cp -f $< $@ 57 | endif 58 | 59 | # ----------------------------------------------------------------- 60 | # default.prop 61 | INSTALLED_DEFAULT_PROP_TARGET := $(TARGET_ROOT_OUT)/default.prop 62 | ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_DEFAULT_PROP_TARGET) 63 | ADDITIONAL_DEFAULT_PROPERTIES := \ 64 | $(call collapse-pairs, $(ADDITIONAL_DEFAULT_PROPERTIES)) 65 | ADDITIONAL_DEFAULT_PROPERTIES += \ 66 | $(call collapse-pairs, $(PRODUCT_DEFAULT_PROPERTY_OVERRIDES)) 67 | ADDITIONAL_DEFAULT_PROPERTIES := $(call uniq-pairs-by-first-component, \ 68 | $(ADDITIONAL_DEFAULT_PROPERTIES),=) 69 | 70 | intermediate_system_build_prop := $(call intermediates-dir-for,ETC,system_build_prop)/build.prop 71 | 72 | $(INSTALLED_DEFAULT_PROP_TARGET): $(intermediate_system_build_prop) 73 | @echo Target buildinfo: $@ 74 | @mkdir -p $(dir $@) 75 | $(hide) echo "#" > $@; \ 76 | echo "# ADDITIONAL_DEFAULT_PROPERTIES" >> $@; \ 77 | echo "#" >> $@; 78 | $(hide) $(foreach line,$(ADDITIONAL_DEFAULT_PROPERTIES), \ 79 | echo "$(line)" >> $@;) 80 | $(hide) echo "#" >> $@; \ 81 | echo "# BOOTIMAGE_BUILD_PROPERTIES" >> $@; \ 82 | echo "#" >> $@; 83 | $(hide) echo ro.bootimage.build.date=`date`>>$@ 84 | $(hide) echo ro.bootimage.build.date.utc=`date +%s`>>$@ 85 | $(hide) echo ro.bootimage.build.fingerprint="$(BUILD_FINGERPRINT)">>$@ 86 | $(hide) build/tools/post_process_props.py $@ 87 | 88 | # ----------------------------------------------------------------- 89 | # build.prop 90 | INSTALLED_BUILD_PROP_TARGET := $(TARGET_OUT)/build.prop 91 | ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_BUILD_PROP_TARGET) 92 | ADDITIONAL_BUILD_PROPERTIES := \ 93 | $(call collapse-pairs, $(ADDITIONAL_BUILD_PROPERTIES)) 94 | ADDITIONAL_BUILD_PROPERTIES := $(call uniq-pairs-by-first-component, \ 95 | $(ADDITIONAL_BUILD_PROPERTIES),=) 96 | 97 | # A list of arbitrary tags describing the build configuration. 98 | # Force ":=" so we can use += 99 | BUILD_VERSION_TAGS := $(BUILD_VERSION_TAGS) 100 | ifeq ($(TARGET_BUILD_TYPE),debug) 101 | BUILD_VERSION_TAGS += debug 102 | endif 103 | # The "test-keys" tag marks builds signed with the old test keys, 104 | # which are available in the SDK. "dev-keys" marks builds signed with 105 | # non-default dev keys (usually private keys from a vendor directory). 106 | # Both of these tags will be removed and replaced with "release-keys" 107 | # when the target-files is signed in a post-build step. 108 | ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/testkey) 109 | BUILD_KEYS := test-keys 110 | else 111 | BUILD_KEYS := dev-keys 112 | endif 113 | BUILD_VERSION_TAGS += $(BUILD_KEYS) 114 | BUILD_VERSION_TAGS := $(subst $(space),$(comma),$(sort $(BUILD_VERSION_TAGS))) 115 | 116 | # A human-readable string that descibes this build in detail. 117 | build_desc := $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT) $(PLATFORM_VERSION) $(BUILD_ID) $(BUILD_NUMBER) $(BUILD_VERSION_TAGS) 118 | $(intermediate_system_build_prop): PRIVATE_BUILD_DESC := $(build_desc) 119 | 120 | # The string used to uniquely identify the combined build and product; used by the OTA server. 121 | ifeq (,$(strip $(BUILD_FINGERPRINT))) 122 | ifneq ($(filter eng.%,$(BUILD_NUMBER)),) 123 | # Trim down BUILD_FINGERPRINT: the default BUILD_NUMBER makes it easily exceed 124 | # the Android system property length limit (PROPERTY_VALUE_MAX=92). 125 | BF_BUILD_NUMBER := $(USER)$(shell date +%m%d%H%M) 126 | else 127 | BF_BUILD_NUMBER := $(BUILD_NUMBER) 128 | endif 129 | BUILD_FINGERPRINT := $(PRODUCT_BRAND)/$(TARGET_PRODUCT)/$(TARGET_DEVICE):$(PLATFORM_VERSION)/$(BUILD_ID)/$(BF_BUILD_NUMBER):$(TARGET_BUILD_VARIANT)/$(BUILD_VERSION_TAGS) 130 | endif 131 | ifneq ($(words $(BUILD_FINGERPRINT)),1) 132 | $(error BUILD_FINGERPRINT cannot contain spaces: "$(BUILD_FINGERPRINT)") 133 | endif 134 | 135 | # The string used to uniquely identify the system build; used by the OTA server. 136 | # This purposefully excludes any product-specific variables. 137 | ifeq (,$(strip $(BUILD_THUMBPRINT))) 138 | BUILD_THUMBPRINT := $(PLATFORM_VERSION)/$(BUILD_ID)/$(BUILD_NUMBER):$(TARGET_BUILD_VARIANT)/$(BUILD_VERSION_TAGS) 139 | endif 140 | ifneq ($(words $(BUILD_THUMBPRINT)),1) 141 | $(error BUILD_THUMBPRINT cannot contain spaces: "$(BUILD_THUMBPRINT)") 142 | endif 143 | 144 | KNOWN_OEM_THUMBPRINT_PROPERTIES := \ 145 | ro.product.brand \ 146 | ro.product.name \ 147 | ro.product.device 148 | OEM_THUMBPRINT_PROPERTIES := $(filter $(KNOWN_OEM_THUMBPRINT_PROPERTIES),\ 149 | $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_OEM_PROPERTIES)) 150 | 151 | # Display parameters shown under Settings -> About Phone 152 | ifeq ($(TARGET_BUILD_VARIANT),user) 153 | # User builds should show: 154 | # release build number or branch.buld_number non-release builds 155 | 156 | # Dev. branches should have DISPLAY_BUILD_NUMBER set 157 | ifeq "true" "$(DISPLAY_BUILD_NUMBER)" 158 | BUILD_DISPLAY_ID := $(BUILD_ID).$(BUILD_NUMBER) $(BUILD_KEYS) 159 | else 160 | BUILD_DISPLAY_ID := $(BUILD_ID) $(BUILD_KEYS) 161 | endif 162 | else 163 | # Non-user builds should show detailed build information 164 | BUILD_DISPLAY_ID := $(build_desc) 165 | endif 166 | 167 | # Accepts a whitespace separated list of product locales such as 168 | # (en_US en_AU en_GB...) and returns the first locale in the list with 169 | # underscores replaced with hyphens. In the example above, this will 170 | # return "en-US". 171 | define get-default-product-locale 172 | $(strip $(subst _,-, $(firstword $(1)))) 173 | endef 174 | 175 | BUILDINFO_SH := build/tools/buildinfo.sh 176 | 177 | ifdef TARGET_SYSTEM_PROP 178 | system_prop_file := $(TARGET_SYSTEM_PROP) 179 | else 180 | system_prop_file := $(wildcard $(TARGET_DEVICE_DIR)/system.prop) 181 | endif 182 | $(intermediate_system_build_prop): $(BUILDINFO_SH) $(INTERNAL_BUILD_ID_MAKEFILE) $(BUILD_SYSTEM)/version_defaults.mk $(system_prop_file) $(INSTALLED_ANDROID_INFO_TXT_TARGET) 183 | @echo Target buildinfo: $@ 184 | @mkdir -p $(dir $@) 185 | $(hide) echo > $@ 186 | ifneq ($(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_OEM_PROPERTIES),) 187 | $(hide) echo "#" >> $@; \ 188 | echo "# PRODUCT_OEM_PROPERTIES" >> $@; \ 189 | echo "#" >> $@; 190 | $(hide) $(foreach prop,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_OEM_PROPERTIES), \ 191 | echo "import /oem/oem.prop $(prop)" >> $@;) 192 | endif 193 | $(hide) TARGET_BUILD_TYPE="$(TARGET_BUILD_VARIANT)" \ 194 | TARGET_BUILD_FLAVOR="$(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT)" \ 195 | TARGET_DEVICE="$(TARGET_DEVICE)" \ 196 | PRODUCT_NAME="$(TARGET_PRODUCT)" \ 197 | PRODUCT_BRAND="$(PRODUCT_BRAND)" \ 198 | PRODUCT_DEFAULT_LOCALE="$(call get-default-product-locale,$(PRODUCT_LOCALES))" \ 199 | PRODUCT_DEFAULT_WIFI_CHANNELS="$(PRODUCT_DEFAULT_WIFI_CHANNELS)" \ 200 | PRODUCT_MODEL="$(PRODUCT_MODEL)" \ 201 | PRODUCT_MANUFACTURER="$(PRODUCT_MANUFACTURER)" \ 202 | PRIVATE_BUILD_DESC="$(PRIVATE_BUILD_DESC)" \ 203 | BUILD_ID="$(BUILD_ID)" \ 204 | BUILD_DISPLAY_ID="$(BUILD_DISPLAY_ID)" \ 205 | BUILD_NUMBER="$(BUILD_NUMBER)" \ 206 | PLATFORM_VERSION="$(PLATFORM_VERSION)" \ 207 | PLATFORM_SECURITY_PATCH="$(PLATFORM_SECURITY_PATCH)" \ 208 | PLATFORM_BASE_OS="$(PLATFORM_BASE_OS)" \ 209 | PLATFORM_SDK_VERSION="$(PLATFORM_SDK_VERSION)" \ 210 | PLATFORM_PREVIEW_SDK_VERSION="$(PLATFORM_PREVIEW_SDK_VERSION)" \ 211 | PLATFORM_VERSION_CODENAME="$(PLATFORM_VERSION_CODENAME)" \ 212 | PLATFORM_VERSION_ALL_CODENAMES="$(PLATFORM_VERSION_ALL_CODENAMES)" \ 213 | BUILD_VERSION_TAGS="$(BUILD_VERSION_TAGS)" \ 214 | TARGET_BOOTLOADER_BOARD_NAME="$(TARGET_BOOTLOADER_BOARD_NAME)" \ 215 | BUILD_FINGERPRINT="$(BUILD_FINGERPRINT)" \ 216 | $(if $(OEM_THUMBPRINT_PROPERTIES),BUILD_THUMBPRINT="$(BUILD_THUMBPRINT)") \ 217 | TARGET_BOARD_PLATFORM="$(TARGET_BOARD_PLATFORM)" \ 218 | TARGET_CPU_ABI_LIST="$(TARGET_CPU_ABI_LIST)" \ 219 | TARGET_CPU_ABI_LIST_32_BIT="$(TARGET_CPU_ABI_LIST_32_BIT)" \ 220 | TARGET_CPU_ABI_LIST_64_BIT="$(TARGET_CPU_ABI_LIST_64_BIT)" \ 221 | TARGET_CPU_ABI="$(TARGET_CPU_ABI)" \ 222 | TARGET_CPU_ABI2="$(TARGET_CPU_ABI2)" \ 223 | TARGET_AAPT_CHARACTERISTICS="$(TARGET_AAPT_CHARACTERISTICS)" \ 224 | bash $(BUILDINFO_SH) >> $@ 225 | $(hide) $(foreach file,$(system_prop_file), \ 226 | if [ -f "$(file)" ]; then \ 227 | echo "#" >> $@; \ 228 | echo Target buildinfo from: "$(file)"; \ 229 | echo "# from $(file)" >> $@; \ 230 | echo "#" >> $@; \ 231 | cat $(file) >> $@; \ 232 | fi;) 233 | $(if $(ADDITIONAL_BUILD_PROPERTIES), \ 234 | $(hide) echo >> $@; \ 235 | echo "#" >> $@; \ 236 | echo "# ADDITIONAL_BUILD_PROPERTIES" >> $@; \ 237 | echo "#" >> $@; ) 238 | $(hide) $(foreach line,$(ADDITIONAL_BUILD_PROPERTIES), \ 239 | echo "$(line)" >> $@;) 240 | $(hide) cat $(INSTALLED_ANDROID_INFO_TXT_TARGET) | grep 'require version-' | sed -e 's/require version-/ro.build.expect./g' >> $@ 241 | $(hide) build/tools/post_process_props.py $@ $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_PROPERTY_BLACKLIST) 242 | 243 | build_desc := 244 | 245 | ifeq (,$(filter true, $(TARGET_NO_KERNEL) $(TARGET_NO_RECOVERY))) 246 | INSTALLED_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img 247 | else 248 | INSTALLED_RECOVERYIMAGE_TARGET := 249 | endif 250 | 251 | $(INSTALLED_BUILD_PROP_TARGET): $(intermediate_system_build_prop) $(INSTALLED_RECOVERYIMAGE_TARGET) 252 | @echo "Target build info: $@" 253 | $(hide) cat $(intermediate_system_build_prop) > $@ 254 | ifdef INSTALLED_RECOVERYIMAGE_TARGET 255 | $(hide) echo ro.expect.recovery_id=`cat $(RECOVERYIMAGE_ID_FILE)` >> $@ 256 | endif 257 | 258 | # ----------------------------------------------------------------- 259 | # vendor build.prop 260 | # 261 | # For verifying that the vendor build is what we thing it is 262 | ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE 263 | INSTALLED_VENDOR_BUILD_PROP_TARGET := $(TARGET_OUT_VENDOR)/build.prop 264 | ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_VENDOR_BUILD_PROP_TARGET) 265 | $(INSTALLED_VENDOR_BUILD_PROP_TARGET): $(INSTALLED_BUILD_PROP_TARGET) 266 | @echo Target vendor buildinfo: $@ 267 | @mkdir -p $(dir $@) 268 | $(hide) echo > $@ 269 | $(hide) echo ro.vendor.build.date=`date`>>$@ 270 | $(hide) echo ro.vendor.build.date.utc=`date +%s`>>$@ 271 | $(hide) echo ro.vendor.build.fingerprint="$(BUILD_FINGERPRINT)">>$@ 272 | endif 273 | 274 | # ---------------------------------------------------------------- 275 | 276 | # ----------------------------------------------------------------- 277 | # sdk-build.prop 278 | # 279 | # There are certain things in build.prop that we don't want to 280 | # ship with the sdk; remove them. 281 | 282 | # This must be a list of entire property keys followed by 283 | # "=" characters, without any internal spaces. 284 | sdk_build_prop_remove := \ 285 | ro.build.user= \ 286 | ro.build.host= \ 287 | ro.product.brand= \ 288 | ro.product.manufacturer= \ 289 | ro.product.device= 290 | # TODO: Remove this soon-to-be obsolete property 291 | sdk_build_prop_remove += ro.build.product= 292 | INSTALLED_SDK_BUILD_PROP_TARGET := $(PRODUCT_OUT)/sdk/sdk-build.prop 293 | $(INSTALLED_SDK_BUILD_PROP_TARGET): $(INSTALLED_BUILD_PROP_TARGET) 294 | @echo SDK buildinfo: $@ 295 | @mkdir -p $(dir $@) 296 | $(hide) grep -v "$(subst $(space),\|,$(strip \ 297 | $(sdk_build_prop_remove)))" $< > $@.tmp 298 | $(hide) for x in $(sdk_build_prop_remove); do \ 299 | echo "$$x"generic >> $@.tmp; done 300 | $(hide) mv $@.tmp $@ 301 | 302 | # ----------------------------------------------------------------- 303 | # package stats 304 | PACKAGE_STATS_FILE := $(PRODUCT_OUT)/package-stats.txt 305 | PACKAGES_TO_STAT := \ 306 | $(sort $(filter $(TARGET_OUT)/% $(TARGET_OUT_DATA)/%, \ 307 | $(filter %.jar %.apk, $(ALL_DEFAULT_INSTALLED_MODULES)))) 308 | $(PACKAGE_STATS_FILE): $(PACKAGES_TO_STAT) 309 | @echo Package stats: $@ 310 | @mkdir -p $(dir $@) 311 | $(hide) rm -f $@ 312 | $(hide) build/tools/dump-package-stats $^ > $@ 313 | 314 | .PHONY: package-stats 315 | package-stats: $(PACKAGE_STATS_FILE) 316 | 317 | # ----------------------------------------------------------------- 318 | # Cert-to-package mapping. Used by the post-build signing tools. 319 | # Use a macro to add newline to each echo command 320 | define _apkcerts_echo_with_newline 321 | $(hide) echo $(1) 322 | 323 | endef 324 | 325 | name := $(TARGET_PRODUCT) 326 | ifeq ($(TARGET_BUILD_TYPE),debug) 327 | name := $(name)_debug 328 | endif 329 | name := $(name)-apkcerts-$(FILE_NAME_TAG) 330 | intermediates := \ 331 | $(call intermediates-dir-for,PACKAGING,apkcerts) 332 | APKCERTS_FILE := $(intermediates)/$(name).txt 333 | # We don't need to really build all the modules. 334 | # TODO: rebuild APKCERTS_FILE if any app change its cert. 335 | $(APKCERTS_FILE): 336 | @echo APK certs list: $@ 337 | @mkdir -p $(dir $@) 338 | @rm -f $@ 339 | $(foreach p,$(PACKAGES),\ 340 | $(if $(PACKAGES.$(p).EXTERNAL_KEY),\ 341 | $(call _apkcerts_echo_with_newline,\ 342 | 'name="$(p).apk" certificate="EXTERNAL" \ 343 | private_key=""' >> $@),\ 344 | $(call _apkcerts_echo_with_newline,\ 345 | 'name="$(p).apk" certificate="$(PACKAGES.$(p).CERTIFICATE)" \ 346 | private_key="$(PACKAGES.$(p).PRIVATE_KEY)"' >> $@))) 347 | # In case value of PACKAGES is empty. 348 | $(hide) touch $@ 349 | 350 | .PHONY: apkcerts-list 351 | apkcerts-list: $(APKCERTS_FILE) 352 | 353 | ifneq (,$(TARGET_BUILD_APPS)) 354 | $(call dist-for-goals, apps_only, $(APKCERTS_FILE):apkcerts.txt) 355 | endif 356 | 357 | # ----------------------------------------------------------------- 358 | # module info file 359 | ifdef CREATE_MODULE_INFO_FILE 360 | MODULE_INFO_FILE := $(PRODUCT_OUT)/module-info.txt 361 | $(info Generating $(MODULE_INFO_FILE)...) 362 | $(shell rm -f $(MODULE_INFO_FILE)) 363 | $(foreach m,$(ALL_MODULES), \ 364 | $(shell echo "NAME=\"$(m)\"" \ 365 | "PATH=\"$(strip $(ALL_MODULES.$(m).PATH))\"" \ 366 | "TAGS=\"$(strip $(filter-out _%,$(ALL_MODULES.$(m).TAGS)))\"" \ 367 | "BUILT=\"$(strip $(ALL_MODULES.$(m).BUILT))\"" \ 368 | "INSTALLED=\"$(strip $(ALL_MODULES.$(m).INSTALLED))\"" >> $(MODULE_INFO_FILE))) 369 | endif 370 | 371 | # ----------------------------------------------------------------- 372 | 373 | # The dev key is used to sign this package, and as the key required 374 | # for future OTA packages installed by this system. Actual product 375 | # deliverables will be re-signed by hand. We expect this file to 376 | # exist with the suffixes ".x509.pem" and ".pk8". 377 | DEFAULT_KEY_CERT_PAIR := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) 378 | 379 | 380 | # Rules that need to be present for the all targets, even 381 | # if they don't do anything. 382 | .PHONY: systemimage 383 | systemimage: 384 | 385 | # ----------------------------------------------------------------- 386 | 387 | .PHONY: event-log-tags 388 | 389 | # Produce an event logs tag file for everything we know about, in order 390 | # to properly allocate numbers. Then produce a file that's filtered 391 | # for what's going to be installed. 392 | 393 | all_event_log_tags_file := $(TARGET_OUT_COMMON_INTERMEDIATES)/all-event-log-tags.txt 394 | 395 | event_log_tags_file := $(TARGET_OUT)/etc/event-log-tags 396 | 397 | # Include tags from all packages that we know about 398 | all_event_log_tags_src := \ 399 | $(sort $(foreach m, $(ALL_MODULES), $(ALL_MODULES.$(m).EVENT_LOG_TAGS))) 400 | 401 | # PDK builds will already have a full list of tags that needs to get merged 402 | # in with the ones from source 403 | pdk_fusion_log_tags_file := $(patsubst $(PRODUCT_OUT)/%,$(_pdk_fusion_intermediates)/%,$(filter $(event_log_tags_file),$(ALL_PDK_FUSION_FILES))) 404 | 405 | $(all_event_log_tags_file): PRIVATE_SRC_FILES := $(all_event_log_tags_src) $(pdk_fusion_log_tags_file) 406 | $(all_event_log_tags_file): $(all_event_log_tags_src) $(pdk_fusion_log_tags_file) 407 | $(hide) mkdir -p $(dir $@) 408 | $(hide) build/tools/merge-event-log-tags.py -o $@ $(PRIVATE_SRC_FILES) 409 | 410 | # Include tags from all packages included in this product, plus all 411 | # tags that are part of the system (ie, not in a vendor/ or device/ 412 | # directory). 413 | event_log_tags_src := \ 414 | $(sort $(foreach m,\ 415 | $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES) \ 416 | $(call module-names-for-tag-list,user), \ 417 | $(ALL_MODULES.$(m).EVENT_LOG_TAGS)) \ 418 | $(filter-out vendor/% device/% out/%,$(all_event_log_tags_src))) 419 | 420 | $(event_log_tags_file): PRIVATE_SRC_FILES := $(event_log_tags_src) $(pdk_fusion_log_tags_file) 421 | $(event_log_tags_file): PRIVATE_MERGED_FILE := $(all_event_log_tags_file) 422 | $(event_log_tags_file): $(event_log_tags_src) $(all_event_log_tags_file) $(pdk_fusion_log_tags_file) 423 | $(hide) mkdir -p $(dir $@) 424 | $(hide) build/tools/merge-event-log-tags.py -o $@ -m $(PRIVATE_MERGED_FILE) $(PRIVATE_SRC_FILES) 425 | 426 | event-log-tags: $(event_log_tags_file) 427 | 428 | ALL_DEFAULT_INSTALLED_MODULES += $(event_log_tags_file) 429 | 430 | 431 | # ################################################################# 432 | # Targets for boot/OS images 433 | # ################################################################# 434 | ifneq ($(strip $(TARGET_NO_BOOTLOADER)),true) 435 | INSTALLED_BOOTLOADER_MODULE := $(PRODUCT_OUT)/bootloader 436 | ifeq ($(strip $(TARGET_BOOTLOADER_IS_2ND)),true) 437 | INSTALLED_2NDBOOTLOADER_TARGET := $(PRODUCT_OUT)/2ndbootloader 438 | else 439 | INSTALLED_2NDBOOTLOADER_TARGET := 440 | endif 441 | else 442 | INSTALLED_BOOTLOADER_MODULE := 443 | INSTALLED_2NDBOOTLOADER_TARGET := 444 | endif # TARGET_NO_BOOTLOADER 445 | ifneq ($(strip $(TARGET_NO_KERNEL)),true) 446 | INSTALLED_KERNEL_TARGET := $(PRODUCT_OUT)/kernel 447 | else 448 | INSTALLED_KERNEL_TARGET := 449 | endif 450 | 451 | # ----------------------------------------------------------------- 452 | # the ramdisk 453 | INTERNAL_RAMDISK_FILES := $(filter $(TARGET_ROOT_OUT)/%, \ 454 | $(ALL_PREBUILT) \ 455 | $(ALL_COPIED_HEADERS) \ 456 | $(ALL_GENERATED_SOURCES) \ 457 | $(ALL_DEFAULT_INSTALLED_MODULES)) 458 | 459 | BUILT_RAMDISK_TARGET := $(PRODUCT_OUT)/ramdisk.img 460 | 461 | # We just build this directly to the install location. 462 | INSTALLED_RAMDISK_TARGET := $(BUILT_RAMDISK_TARGET) 463 | $(INSTALLED_RAMDISK_TARGET): $(MKBOOTFS) $(INTERNAL_RAMDISK_FILES) | $(MINIGZIP) 464 | $(call pretty,"Target ram disk: $@") 465 | $(hide) $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_ROOT_OUT) | $(MINIGZIP) > $@ 466 | 467 | .PHONY: ramdisk-nodeps 468 | ramdisk-nodeps: $(MKBOOTFS) | $(MINIGZIP) 469 | @echo "make $@: ignoring dependencies" 470 | $(hide) $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_ROOT_OUT) | $(MINIGZIP) > $(INSTALLED_RAMDISK_TARGET) 471 | 472 | ifneq ($(strip $(TARGET_NO_KERNEL)),true) 473 | 474 | # ----------------------------------------------------------------- 475 | # the boot image, which is a collection of other images. 476 | INTERNAL_BOOTIMAGE_ARGS := \ 477 | $(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET)) \ 478 | --kernel $(INSTALLED_KERNEL_TARGET) 479 | 480 | ifneq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true) 481 | INTERNAL_BOOTIMAGE_ARGS += --ramdisk $(INSTALLED_RAMDISK_TARGET) 482 | endif 483 | 484 | 485 | INTERNAL_BOOTIMAGE_FILES := $(filter-out --%,$(INTERNAL_BOOTIMAGE_ARGS)) 486 | 487 | BOARD_KERNEL_CMDLINE := $(strip $(BOARD_KERNEL_CMDLINE)) 488 | ifdef BOARD_KERNEL_CMDLINE 489 | INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(BOARD_KERNEL_CMDLINE)" 490 | endif 491 | 492 | BOARD_KERNEL_BASE := $(strip $(BOARD_KERNEL_BASE)) 493 | ifdef BOARD_KERNEL_BASE 494 | INTERNAL_BOOTIMAGE_ARGS += --base $(BOARD_KERNEL_BASE) 495 | endif 496 | 497 | BOARD_KERNEL_PAGESIZE := $(strip $(BOARD_KERNEL_PAGESIZE)) 498 | ifdef BOARD_KERNEL_PAGESIZE 499 | INTERNAL_BOOTIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE) 500 | endif 501 | 502 | INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img 503 | 504 | ifeq ($(TARGET_BOOTIMAGE_USE_EXT2),true) 505 | $(error TARGET_BOOTIMAGE_USE_EXT2 is not supported anymore) 506 | else ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER)) # TARGET_BOOTIMAGE_USE_EXT2 != true 507 | 508 | $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(BOOT_SIGNER) 509 | $(call pretty,"Target boot image: $@") 510 | $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@ 511 | $(BOOT_SIGNER) /boot $@ $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $@ 512 | $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE)) 513 | 514 | .PHONY: bootimage-nodeps 515 | bootimage-nodeps: $(MKBOOTIMG) $(BOOT_SIGNER) 516 | @echo "make $@: ignoring dependencies" 517 | $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET) 518 | $(BOOT_SIGNER) /boot $(INSTALLED_BOOTIMAGE_TARGET) $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $(INSTALLED_BOOTIMAGE_TARGET) 519 | $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE)) 520 | 521 | else ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT)) # PRODUCT_SUPPORTS_BOOT_SIGNER != true 522 | 523 | $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(VBOOT_SIGNER) 524 | $(call pretty,"Target boot image: $@") 525 | $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@.unsigned 526 | $(VBOOT_SIGNER) $(FUTILITY) $@.unsigned $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbpubk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbprivk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY).vbprivk $@.keyblock $@ 527 | $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE)) 528 | 529 | .PHONY: bootimage-nodeps 530 | bootimage-nodeps: $(MKBOOTIMG) $(VBOOT_SIGNER) 531 | @echo "make $@: ignoring dependencies" 532 | $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET).unsigned 533 | $(VBOOT_SIGNER) $(FUTILITY) $(INSTALLED_BOOTIMAGE_TARGET).unsigned $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbpubk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbprivk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY).vbprivk $(INSTALLED_BOOTIMAGE_TARGET).keyblock $(INSTALLED_BOOTIMAGE_TARGET) 534 | $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE)) 535 | 536 | else # PRODUCT_SUPPORTS_VBOOT != true 537 | 538 | $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) 539 | $(call pretty,"Target boot image: $@") 540 | $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@ 541 | $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE)) 542 | 543 | .PHONY: bootimage-nodeps 544 | bootimage-nodeps: $(MKBOOTIMG) 545 | @echo "make $@: ignoring dependencies" 546 | $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET) 547 | $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE)) 548 | 549 | endif # TARGET_BOOTIMAGE_USE_EXT2 550 | 551 | else # TARGET_NO_KERNEL 552 | # HACK: The top-level targets depend on the bootimage. Not all targets 553 | # can produce a bootimage, though, and emulator targets need the ramdisk 554 | # instead. Fake it out by calling the ramdisk the bootimage. 555 | # TODO: make the emulator use bootimages, and make mkbootimg accept 556 | # kernel-less inputs. 557 | INSTALLED_BOOTIMAGE_TARGET := $(INSTALLED_RAMDISK_TARGET) 558 | endif 559 | 560 | # ----------------------------------------------------------------- 561 | # NOTICE files 562 | # 563 | # We are required to publish the licenses for all code under BSD, GPL and 564 | # Apache licenses (and possibly other more exotic ones as well). We err on the 565 | # side of caution, so the licenses for other third-party code are included here 566 | # too. 567 | # 568 | # This needs to be before the systemimage rules, because it adds to 569 | # ALL_DEFAULT_INSTALLED_MODULES, which those use to pick which files 570 | # go into the systemimage. 571 | 572 | .PHONY: notice_files 573 | 574 | # Create the rule to combine the files into text and html forms 575 | # $(1) - Plain text output file 576 | # $(2) - HTML output file 577 | # $(3) - File title 578 | # $(4) - Directory to use. Notice files are all $(4)/src. Other 579 | # directories in there will be used for scratch 580 | # $(5) - Dependencies for the output files 581 | # 582 | # The algorithm here is that we go collect a hash for each of the notice 583 | # files and write the names of the files that match that hash. Then 584 | # to generate the real files, we go print out all of the files and their 585 | # hashes. 586 | # 587 | # These rules are fairly complex, so they depend on this makefile so if 588 | # it changes, they'll run again. 589 | # 590 | # TODO: We could clean this up so that we just record the locations of the 591 | # original notice files instead of making rules to copy them somwehere. 592 | # Then we could traverse that without quite as much bash drama. 593 | define combine-notice-files 594 | $(1) $(2): PRIVATE_MESSAGE := $(3) 595 | $(1) $(2): PRIVATE_DIR := $(4) 596 | $(1) : $(2) 597 | $(2) : $(5) $(BUILD_SYSTEM)/Makefile build/tools/generate-notice-files.py 598 | build/tools/generate-notice-files.py $(1) $(2) $$(PRIVATE_MESSAGE) $$(PRIVATE_DIR)/src 599 | notice_files: $(1) $(2) 600 | endef 601 | 602 | # TODO These intermediate NOTICE.txt/NOTICE.html files should go into 603 | # TARGET_OUT_NOTICE_FILES now that the notice files are gathered from 604 | # the src subdirectory. 605 | 606 | target_notice_file_txt := $(TARGET_OUT_INTERMEDIATES)/NOTICE.txt 607 | target_notice_file_html := $(TARGET_OUT_INTERMEDIATES)/NOTICE.html 608 | target_notice_file_html_gz := $(TARGET_OUT_INTERMEDIATES)/NOTICE.html.gz 609 | tools_notice_file_txt := $(HOST_OUT_INTERMEDIATES)/NOTICE.txt 610 | tools_notice_file_html := $(HOST_OUT_INTERMEDIATES)/NOTICE.html 611 | 612 | ifndef TARGET_BUILD_APPS 613 | kernel_notice_file := $(TARGET_OUT_NOTICE_FILES)/src/kernel.txt 614 | pdk_fusion_notice_files := $(filter $(TARGET_OUT_NOTICE_FILES)/%, $(ALL_PDK_FUSION_FILES)) 615 | 616 | $(eval $(call combine-notice-files, \ 617 | $(target_notice_file_txt), \ 618 | $(target_notice_file_html), \ 619 | "Notices for files contained in the filesystem images in this directory:", \ 620 | $(TARGET_OUT_NOTICE_FILES), \ 621 | $(ALL_DEFAULT_INSTALLED_MODULES) $(kernel_notice_file) $(pdk_fusion_notice_files))) 622 | 623 | $(eval $(call combine-notice-files, \ 624 | $(tools_notice_file_txt), \ 625 | $(tools_notice_file_html), \ 626 | "Notices for files contained in the tools directory:", \ 627 | $(HOST_OUT_NOTICE_FILES), \ 628 | $(ALL_DEFAULT_INSTALLED_MODULES))) 629 | 630 | # Install the html file at /system/etc/NOTICE.html.gz. 631 | # This is not ideal, but this is very late in the game, after a lot of 632 | # the module processing has already been done -- in fact, we used the 633 | # fact that all that has been done to get the list of modules that we 634 | # need notice files for. 635 | $(target_notice_file_html_gz): $(target_notice_file_html) | $(MINIGZIP) 636 | $(hide) $(MINIGZIP) -9 < $< > $@ 637 | installed_notice_html_gz := $(TARGET_OUT)/etc/NOTICE.html.gz 638 | $(installed_notice_html_gz): $(target_notice_file_html_gz) | $(ACP) 639 | $(copy-file-to-target) 640 | 641 | # if we've been run my mm, mmm, etc, don't reinstall this every time 642 | ifeq ($(ONE_SHOT_MAKEFILE),) 643 | ALL_DEFAULT_INSTALLED_MODULES += $(installed_notice_html_gz) 644 | endif 645 | endif # TARGET_BUILD_APPS 646 | 647 | # The kernel isn't really a module, so to get its module file in there, we 648 | # make the target NOTICE files depend on this particular file too, which will 649 | # then be in the right directory for the find in combine-notice-files to work. 650 | $(kernel_notice_file): \ 651 | prebuilts/qemu-kernel/arm/LINUX_KERNEL_COPYING \ 652 | | $(ACP) 653 | @echo Copying: $@ 654 | $(hide) mkdir -p $(dir $@) 655 | $(hide) $(ACP) $< $@ 656 | 657 | 658 | # ----------------------------------------------------------------- 659 | # Build a keystore with the authorized keys in it, used to verify the 660 | # authenticity of downloaded OTA packages. 661 | # 662 | # This rule adds to ALL_DEFAULT_INSTALLED_MODULES, so it needs to come 663 | # before the rules that use that variable to build the image. 664 | ALL_DEFAULT_INSTALLED_MODULES += $(TARGET_OUT_ETC)/security/otacerts.zip 665 | $(TARGET_OUT_ETC)/security/otacerts.zip: KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR) 666 | $(TARGET_OUT_ETC)/security/otacerts.zip: $(addsuffix .x509.pem,$(DEFAULT_KEY_CERT_PAIR)) 667 | $(hide) rm -f $@ 668 | $(hide) mkdir -p $(dir $@) 669 | $(hide) zip -qj $@ $< 670 | 671 | .PHONY: otacerts 672 | otacerts: $(TARGET_OUT_ETC)/security/otacerts.zip 673 | 674 | 675 | # ################################################################# 676 | # Targets for user images 677 | # ################################################################# 678 | 679 | INTERNAL_USERIMAGES_EXT_VARIANT := 680 | ifeq ($(TARGET_USERIMAGES_USE_EXT2),true) 681 | INTERNAL_USERIMAGES_USE_EXT := true 682 | INTERNAL_USERIMAGES_EXT_VARIANT := ext2 683 | else 684 | ifeq ($(TARGET_USERIMAGES_USE_EXT3),true) 685 | INTERNAL_USERIMAGES_USE_EXT := true 686 | INTERNAL_USERIMAGES_EXT_VARIANT := ext3 687 | else 688 | ifeq ($(TARGET_USERIMAGES_USE_EXT4),true) 689 | INTERNAL_USERIMAGES_USE_EXT := true 690 | INTERNAL_USERIMAGES_EXT_VARIANT := ext4 691 | endif 692 | endif 693 | endif 694 | 695 | # These options tell the recovery updater/installer how to mount the partitions writebale. 696 | # =[|]... 697 | # fstype_opts := [,]... 698 | # opt := [=] 699 | # The following worked on Nexus devices with Kernel 3.1, 3.4, 3.10 700 | DEFAULT_TARGET_RECOVERY_FSTYPE_MOUNT_OPTIONS := ext4=max_batch_time=0,commit=1,data=ordered,barrier=1,errors=panic,nodelalloc 701 | 702 | ifneq (true,$(TARGET_USERIMAGES_SPARSE_EXT_DISABLED)) 703 | INTERNAL_USERIMAGES_SPARSE_EXT_FLAG := -s 704 | endif 705 | 706 | ifeq ($(INTERNAL_USERIMAGES_USE_EXT),true) 707 | INTERNAL_USERIMAGES_DEPS := $(SIMG2IMG) 708 | INTERNAL_USERIMAGES_DEPS += $(MKEXTUSERIMG) $(MAKE_EXT4FS) $(E2FSCK) 709 | ifeq ($(TARGET_USERIMAGES_USE_F2FS),true) 710 | INTERNAL_USERIMAGES_DEPS += $(MKF2FSUSERIMG) $(MAKE_F2FS) 711 | endif 712 | endif 713 | 714 | ifeq ($(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE),squashfs) 715 | INTERNAL_USERIMAGES_DEPS += $(MAKE_SQUASHFS) $(MKSQUASHFSUSERIMG) $(IMG2SIMG) 716 | endif 717 | 718 | ifeq ($(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE),squashfs) 719 | INTERNAL_USERIMAGES_DEPS += $(MAKE_SQUASHFS) $(MKSQUASHFSUSERIMG) $(IMG2SIMG) 720 | endif 721 | 722 | INTERNAL_USERIMAGES_BINARY_PATHS := $(sort $(dir $(INTERNAL_USERIMAGES_DEPS))) 723 | 724 | ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY)) 725 | INTERNAL_USERIMAGES_DEPS += $(BUILD_VERITY_TREE) $(APPEND2SIMG) $(VERITY_SIGNER) 726 | endif 727 | 728 | SELINUX_FC := $(TARGET_ROOT_OUT)/file_contexts 729 | INTERNAL_USERIMAGES_DEPS += $(SELINUX_FC) 730 | 731 | # $(1): the path of the output dictionary file 732 | # $(2): additional "key=value" pairs to append to the dictionary file. 733 | define generate-userimage-prop-dictionary 734 | $(if $(INTERNAL_USERIMAGES_EXT_VARIANT),$(hide) echo "fs_type=$(INTERNAL_USERIMAGES_EXT_VARIANT)" >> $(1)) 735 | $(if $(BOARD_SYSTEMIMAGE_PARTITION_SIZE),$(hide) echo "system_size=$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)" >> $(1)) 736 | $(if $(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "system_fs_type=$(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE)" >> $(1)) 737 | $(if $(BOARD_SYSTEMIMAGE_JOURNAL_SIZE),$(hide) echo "system_journal_size=$(BOARD_SYSTEMIMAGE_JOURNAL_SIZE)" >> $(1)) 738 | $(if $(BOARD_HAS_EXT4_RESERVED_BLOCKS),$(hide) echo "has_ext4_reserved_blocks=$(BOARD_HAS_EXT4_RESERVED_BLOCKS)" >> $(1)) 739 | $(if $(BOARD_SYSTEMIMAGE_SQUASHFS_COMPRESSOR),$(hide) echo "system_squashfs_compressor=$(BOARD_SYSTEMIMAGE_SQUASHFS_COMPRESSOR)" >> $(1)) 740 | $(if $(BOARD_SYSTEMIMAGE_SQUASHFS_COMPRESSOR_OPT),$(hide) echo "system_squashfs_compressor_opt=$(BOARD_SYSTEMIMAGE_SQUASHFS_COMPRESSOR_OPT)" >> $(1)) 741 | $(if $(BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "userdata_fs_type=$(BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE)" >> $(1)) 742 | $(if $(BOARD_USERDATAIMAGE_PARTITION_SIZE),$(hide) echo "userdata_size=$(BOARD_USERDATAIMAGE_PARTITION_SIZE)" >> $(1)) 743 | $(if $(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "cache_fs_type=$(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE)" >> $(1)) 744 | $(if $(BOARD_CACHEIMAGE_PARTITION_SIZE),$(hide) echo "cache_size=$(BOARD_CACHEIMAGE_PARTITION_SIZE)" >> $(1)) 745 | $(if $(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "vendor_fs_type=$(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE)" >> $(1)) 746 | $(if $(BOARD_VENDORIMAGE_PARTITION_SIZE),$(hide) echo "vendor_size=$(BOARD_VENDORIMAGE_PARTITION_SIZE)" >> $(1)) 747 | $(if $(BOARD_VENDORIMAGE_JOURNAL_SIZE),$(hide) echo "vendor_journal_size=$(BOARD_VENDORIMAGE_JOURNAL_SIZE)" >> $(1)) 748 | $(if $(BOARD_OEMIMAGE_PARTITION_SIZE),$(hide) echo "oem_size=$(BOARD_OEMIMAGE_PARTITION_SIZE)" >> $(1)) 749 | $(if $(BOARD_OEMIMAGE_JOURNAL_SIZE),$(hide) echo "oem_journal_size=$(BOARD_OEMIMAGE_JOURNAL_SIZE)" >> $(1)) 750 | $(if $(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG),$(hide) echo "extfs_sparse_flag=$(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG)" >> $(1)) 751 | $(hide) echo "selinux_fc=$(SELINUX_FC)" >> $(1) 752 | $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER),$(hide) echo "boot_signer=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER)" >> $(1)) 753 | $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY),$(hide) echo "verity=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY)" >> $(1)) 754 | $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY),$(hide) echo "verity_key=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY)" >> $(1)) 755 | $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY),$(hide) echo "verity_signer_cmd=$(VERITY_SIGNER)" >> $(1)) 756 | $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_VERITY_PARTITION),$(hide) echo "system_verity_block_device=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_VERITY_PARTITION)" >> $(1)) 757 | $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_VERITY_PARTITION),$(hide) echo "vendor_verity_block_device=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_VERITY_PARTITION)" >> $(1)) 758 | $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT),$(hide) echo "vboot=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT)" >> $(1)) 759 | $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT),$(hide) echo "vboot_key=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY)" >> $(1)) 760 | $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT),$(hide) echo "vboot_subkey=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY)" >> $(1)) 761 | $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT),$(hide) echo "futility=$(FUTILITY)" >> $(1)) 762 | $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT),$(hide) echo "vboot_signer_cmd=$(VBOOT_SIGNER)" >> $(1)) 763 | $(if $(filter true,$(BOARD_BUILD_SYSTEM_ROOT_IMAGE)),\ 764 | $(hide) echo "system_root_image=true" >> $(1);\ 765 | echo "ramdisk_dir=$(TARGET_ROOT_OUT)" >> $(1)) 766 | $(if $(2),$(hide) $(foreach kv,$(2),echo "$(kv)" >> $(1);)) 767 | endef 768 | 769 | # ----------------------------------------------------------------- 770 | # Recovery image 771 | 772 | ifdef INSTALLED_RECOVERYIMAGE_TARGET 773 | 774 | INTERNAL_RECOVERYIMAGE_FILES := $(filter $(TARGET_RECOVERY_OUT)/%, \ 775 | $(ALL_DEFAULT_INSTALLED_MODULES)) 776 | 777 | recovery_initrc := $(call include-path-for, recovery)/etc/init.rc 778 | recovery_sepolicy := $(call intermediates-dir-for,ETC,sepolicy.recovery)/sepolicy.recovery 779 | recovery_kernel := $(INSTALLED_KERNEL_TARGET) # same as a non-recovery system 780 | recovery_ramdisk := $(PRODUCT_OUT)/ramdisk-recovery.img 781 | recovery_build_prop := $(intermediate_system_build_prop) 782 | recovery_resources_common := $(call include-path-for, recovery)/res 783 | 784 | # Set recovery_density to the density bucket of the device. 785 | recovery_density := unknown 786 | ifneq (,$(PRODUCT_AAPT_PREF_CONFIG)) 787 | # If PRODUCT_AAPT_PREF_CONFIG includes a dpi bucket, then use that value. 788 | recovery_density := $(filter %dpi,$(PRODUCT_AAPT_PREF_CONFIG)) 789 | else 790 | # Otherwise, use the default medium density. 791 | recovery_densities := mdpi 792 | endif 793 | 794 | ifneq (,$(wildcard $(recovery_resources_common)-$(recovery_density))) 795 | recovery_resources_common := $(recovery_resources_common)-$(recovery_density) 796 | else 797 | recovery_resources_common := $(recovery_resources_common)-xhdpi 798 | endif 799 | 800 | # Select the 18x32 font on high-density devices (xhdpi and up); and 801 | # the 12x22 font on other devices. Note that the font selected here 802 | # can be overridden for a particular device by putting a font.png in 803 | # its private recovery resources. 804 | 805 | ifneq (,$(filter xxxhdpi 560dpi xxhdpi 400dpi xhdpi,$(recovery_density))) 806 | recovery_font := $(call include-path-for, recovery)/fonts/18x32.png 807 | else 808 | recovery_font := $(call include-path-for, recovery)/fonts/12x22.png 809 | endif 810 | 811 | recovery_resources_private := $(strip $(wildcard $(TARGET_DEVICE_DIR)/recovery/res)) 812 | recovery_resource_deps := $(shell find $(recovery_resources_common) \ 813 | $(recovery_resources_private) -type f) 814 | ifdef TARGET_RECOVERY_FSTAB 815 | recovery_fstab := $(TARGET_RECOVERY_FSTAB) 816 | else 817 | recovery_fstab := $(strip $(wildcard $(TARGET_DEVICE_DIR)/recovery.fstab)) 818 | endif 819 | # Named '.dat' so we don't attempt to use imgdiff for patching it. 820 | RECOVERY_RESOURCE_ZIP := $(TARGET_OUT)/etc/recovery-resource.dat 821 | 822 | ifeq ($(recovery_resources_private),) 823 | $(info No private recovery resources for TARGET_DEVICE $(TARGET_DEVICE)) 824 | endif 825 | 826 | ifeq ($(recovery_fstab),) 827 | $(info No recovery.fstab for TARGET_DEVICE $(TARGET_DEVICE)) 828 | endif 829 | 830 | INTERNAL_RECOVERYIMAGE_ARGS := \ 831 | $(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET)) \ 832 | --kernel $(recovery_kernel) \ 833 | --ramdisk $(recovery_ramdisk) 834 | 835 | # Assumes this has already been stripped 836 | ifdef BOARD_KERNEL_CMDLINE 837 | INTERNAL_RECOVERYIMAGE_ARGS += --cmdline "$(BOARD_KERNEL_CMDLINE)" 838 | endif 839 | ifdef BOARD_KERNEL_BASE 840 | INTERNAL_RECOVERYIMAGE_ARGS += --base $(BOARD_KERNEL_BASE) 841 | endif 842 | BOARD_KERNEL_PAGESIZE := $(strip $(BOARD_KERNEL_PAGESIZE)) 843 | ifdef BOARD_KERNEL_PAGESIZE 844 | INTERNAL_RECOVERYIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE) 845 | endif 846 | 847 | # Keys authorized to sign OTA packages this build will accept. The 848 | # build always uses dev-keys for this; release packaging tools will 849 | # substitute other keys for this one. 850 | OTA_PUBLIC_KEYS := $(DEFAULT_SYSTEM_DEV_CERTIFICATE).x509.pem 851 | 852 | # Generate a file containing the keys that will be read by the 853 | # recovery binary. 854 | RECOVERY_INSTALL_OTA_KEYS := \ 855 | $(call intermediates-dir-for,PACKAGING,ota_keys)/keys 856 | DUMPKEY_JAR := $(HOST_OUT_JAVA_LIBRARIES)/dumpkey.jar 857 | $(RECOVERY_INSTALL_OTA_KEYS): PRIVATE_OTA_PUBLIC_KEYS := $(OTA_PUBLIC_KEYS) 858 | $(RECOVERY_INSTALL_OTA_KEYS): extra_keys := $(patsubst %,%.x509.pem,$(PRODUCT_EXTRA_RECOVERY_KEYS)) 859 | $(RECOVERY_INSTALL_OTA_KEYS): $(OTA_PUBLIC_KEYS) $(DUMPKEY_JAR) $(extra_keys) 860 | @echo "DumpPublicKey: $@ <= $(PRIVATE_OTA_PUBLIC_KEYS) $(extra_keys)" 861 | @rm -rf $@ 862 | @mkdir -p $(dir $@) 863 | java -jar $(DUMPKEY_JAR) $(PRIVATE_OTA_PUBLIC_KEYS) $(extra_keys) > $@ 864 | 865 | RECOVERYIMAGE_ID_FILE := $(PRODUCT_OUT)/recovery.id 866 | # $(1): output file 867 | define build-recoveryimage-target 868 | @echo ----- Making recovery image ------ 869 | $(hide) mkdir -p $(TARGET_RECOVERY_OUT) 870 | $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/etc $(TARGET_RECOVERY_ROOT_OUT)/tmp 871 | @echo Copying baseline ramdisk... 872 | $(hide) rsync -a $(TARGET_ROOT_OUT) $(TARGET_RECOVERY_OUT) # "cp -Rf" fails to overwrite broken symlinks on Mac. 873 | @echo Modifying ramdisk contents... 874 | $(hide) rm -f $(TARGET_RECOVERY_ROOT_OUT)/init*.rc 875 | $(hide) cp -f $(recovery_initrc) $(TARGET_RECOVERY_ROOT_OUT)/ 876 | $(hide) rm -f $(TARGET_RECOVERY_ROOT_OUT)/sepolicy 877 | $(hide) cp -f $(recovery_sepolicy) $(TARGET_RECOVERY_ROOT_OUT)/sepolicy 878 | $(hide) cp $(TARGET_ROOT_OUT)/init.recovery.*.rc $(TARGET_RECOVERY_ROOT_OUT)/ || true # Ignore error when the src file doesn't exist. 879 | $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/res 880 | $(hide) rm -rf $(TARGET_RECOVERY_ROOT_OUT)/res/* 881 | $(hide) cp -rf $(recovery_resources_common)/* $(TARGET_RECOVERY_ROOT_OUT)/res 882 | $(hide) cp -f $(recovery_font) $(TARGET_RECOVERY_ROOT_OUT)/res/images/font.png 883 | $(hide) $(foreach item,$(recovery_resources_private), \ 884 | cp -rf $(item) $(TARGET_RECOVERY_ROOT_OUT)/) 885 | $(hide) $(foreach item,$(recovery_fstab), \ 886 | cp -f $(item) $(TARGET_RECOVERY_ROOT_OUT)/etc/recovery.fstab) 887 | $(hide) cp $(RECOVERY_INSTALL_OTA_KEYS) $(TARGET_RECOVERY_ROOT_OUT)/res/keys 888 | $(hide) cat $(INSTALLED_DEFAULT_PROP_TARGET) $(recovery_build_prop) \ 889 | > $(TARGET_RECOVERY_ROOT_OUT)/default.prop 890 | $(hide) $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_RECOVERY_ROOT_OUT) | $(MINIGZIP) > $(recovery_ramdisk) 891 | $(if $(filter true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT)), \ 892 | $(hide) $(MKBOOTIMG) $(INTERNAL_RECOVERYIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(1).unsigned, \ 893 | $(hide) $(MKBOOTIMG) $(INTERNAL_RECOVERYIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(1) --id > $(RECOVERYIMAGE_ID_FILE)) 894 | $(if $(filter true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER)),\ 895 | $(BOOT_SIGNER) /recovery $(1) $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $(1)) 896 | $(if $(filter true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT)), \ 897 | $(VBOOT_SIGNER) $(FUTILITY) $(1).unsigned $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbpubk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbprivk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY).vbprivk $(1).keyblock $(1)) 898 | $(hide) $(call assert-max-image-size,$(1),$(BOARD_RECOVERYIMAGE_PARTITION_SIZE)) 899 | @echo ----- Made recovery image: $(1) -------- 900 | endef 901 | 902 | $(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) \ 903 | $(INSTALLED_RAMDISK_TARGET) \ 904 | $(INSTALLED_BOOTIMAGE_TARGET) \ 905 | $(INTERNAL_RECOVERYIMAGE_FILES) \ 906 | $(recovery_initrc) $(recovery_sepolicy) $(recovery_kernel) \ 907 | $(INSTALLED_2NDBOOTLOADER_TARGET) \ 908 | $(recovery_build_prop) $(recovery_resource_deps) \ 909 | $(recovery_fstab) \ 910 | $(RECOVERY_INSTALL_OTA_KEYS) 911 | $(call build-recoveryimage-target, $@) 912 | 913 | $(RECOVERY_RESOURCE_ZIP): $(INSTALLED_RECOVERYIMAGE_TARGET) 914 | $(hide) mkdir -p $(dir $@) 915 | $(hide) find $(TARGET_RECOVERY_ROOT_OUT)/res -type f | sort | zip -0qrj $@ -@ 916 | 917 | .PHONY: recoveryimage-nodeps 918 | recoveryimage-nodeps: 919 | @echo "make $@: ignoring dependencies" 920 | $(call build-recoveryimage-target, $(INSTALLED_RECOVERYIMAGE_TARGET)) 921 | 922 | else 923 | RECOVERY_RESOURCE_ZIP := 924 | endif 925 | 926 | .PHONY: recoveryimage 927 | recoveryimage: $(INSTALLED_RECOVERYIMAGE_TARGET) $(RECOVERY_RESOURCE_ZIP) 928 | 929 | ifeq ($(BOARD_NAND_PAGE_SIZE),) 930 | BOARD_NAND_PAGE_SIZE := 2048 931 | endif 932 | 933 | ifeq ($(BOARD_NAND_SPARE_SIZE),) 934 | BOARD_NAND_SPARE_SIZE := 64 935 | endif 936 | 937 | # ----------------------------------------------------------------- 938 | # system image 939 | # 940 | # Remove overridden packages from $(ALL_PDK_FUSION_FILES) 941 | PDK_FUSION_SYSIMG_FILES := \ 942 | $(filter-out $(foreach p,$(overridden_packages),$(p) %/$(p).apk), \ 943 | $(ALL_PDK_FUSION_FILES)) 944 | 945 | INTERNAL_SYSTEMIMAGE_FILES := $(filter $(TARGET_OUT)/%, \ 946 | $(ALL_PREBUILT) \ 947 | $(ALL_COPIED_HEADERS) \ 948 | $(ALL_GENERATED_SOURCES) \ 949 | $(ALL_DEFAULT_INSTALLED_MODULES) \ 950 | $(PDK_FUSION_SYSIMG_FILES) \ 951 | $(RECOVERY_RESOURCE_ZIP)) 952 | 953 | 954 | FULL_SYSTEMIMAGE_DEPS := $(INTERNAL_SYSTEMIMAGE_FILES) $(INTERNAL_USERIMAGES_DEPS) 955 | # ----------------------------------------------------------------- 956 | # installed file list 957 | # Depending on anything that $(BUILT_SYSTEMIMAGE) depends on. 958 | # We put installed-files.txt ahead of image itself in the dependency graph 959 | # so that we can get the size stat even if the build fails due to too large 960 | # system image. 961 | INSTALLED_FILES_FILE := $(PRODUCT_OUT)/installed-files.txt 962 | $(INSTALLED_FILES_FILE): $(FULL_SYSTEMIMAGE_DEPS) 963 | @echo Installed file list: $@ 964 | @mkdir -p $(dir $@) 965 | @rm -f $@ 966 | $(hide) build/tools/fileslist.py $(TARGET_OUT) > $@ 967 | 968 | .PHONY: installed-file-list 969 | installed-file-list: $(INSTALLED_FILES_FILE) 970 | 971 | $(call dist-for-goals, sdk win_sdk sdk_addon, $(INSTALLED_FILES_FILE)) 972 | 973 | systemimage_intermediates := \ 974 | $(call intermediates-dir-for,PACKAGING,systemimage) 975 | BUILT_SYSTEMIMAGE := $(systemimage_intermediates)/system.img 976 | 977 | # Create symlink /system/vendor to /vendor if necessary. 978 | ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE 979 | define create-system-vendor-symlink 980 | $(hide) if [ -d $(TARGET_OUT)/vendor ] && [ ! -h $(TARGET_OUT)/vendor ]; then \ 981 | echo 'Non-symlink $(TARGET_OUT)/vendor detected!' 1>&2; \ 982 | echo 'You cannot install files to $(TARGET_OUT)/vendor while building a separate vendor.img!' 1>&2; \ 983 | exit 1; \ 984 | fi 985 | $(hide) ln -sf /vendor $(TARGET_OUT)/vendor 986 | endef 987 | else 988 | define create-system-vendor-symlink 989 | endef 990 | endif 991 | 992 | # $(1): output file 993 | define build-systemimage-target 994 | @echo "Target system fs image: $(1)" 995 | $(call create-system-vendor-symlink) 996 | @mkdir -p $(dir $(1)) $(systemimage_intermediates) && rm -rf $(systemimage_intermediates)/system_image_info.txt 997 | $(call generate-userimage-prop-dictionary, $(systemimage_intermediates)/system_image_info.txt, \ 998 | skip_fsck=true) 999 | $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ 1000 | ./build/tools/releasetools/build_image.py \ 1001 | $(TARGET_OUT) $(systemimage_intermediates)/system_image_info.txt $(1) $(TARGET_OUT) \ 1002 | || ( echo "Out of space? the tree size of $(TARGET_OUT) is (MB): " 1>&2 ;\ 1003 | du -sm $(TARGET_OUT) 1>&2;\ 1004 | if [ "$(INTERNAL_USERIMAGES_EXT_VARIANT)" == "ext4" ]; then \ 1005 | maxsize=$(BOARD_SYSTEMIMAGE_PARTITION_SIZE); \ 1006 | if [ "$(BOARD_HAS_EXT4_RESERVED_BLOCKS)" == "true" ]; then \ 1007 | maxsize=$$((maxsize - 4096 * 4096)); \ 1008 | fi; \ 1009 | echo "The max is $$(( maxsize / 1048576 )) MB." 1>&2 ;\ 1010 | else \ 1011 | echo "The max is $$(( $(BOARD_SYSTEMIMAGE_PARTITION_SIZE) / 1048576 )) MB." 1>&2 ;\ 1012 | fi; \ 1013 | mkdir -p $(DIST_DIR); cp $(INSTALLED_FILES_FILE) $(DIST_DIR)/installed-files-rescued.txt; \ 1014 | exit 1 ) 1015 | endef 1016 | 1017 | $(BUILT_SYSTEMIMAGE): $(FULL_SYSTEMIMAGE_DEPS) $(INSTALLED_FILES_FILE) 1018 | $(call build-systemimage-target,$@) 1019 | 1020 | INSTALLED_SYSTEMIMAGE := $(PRODUCT_OUT)/system.img 1021 | SYSTEMIMAGE_SOURCE_DIR := $(TARGET_OUT) 1022 | 1023 | # The system partition needs room for the recovery image as well. We 1024 | # now store the recovery image as a binary patch using the boot image 1025 | # as the source (since they are very similar). Generate the patch so 1026 | # we can see how big it's going to be, and include that in the system 1027 | # image size check calculation. 1028 | ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),) 1029 | intermediates := $(call intermediates-dir-for,PACKAGING,recovery_patch) 1030 | RECOVERY_FROM_BOOT_PATCH := $(intermediates)/recovery_from_boot.p 1031 | $(RECOVERY_FROM_BOOT_PATCH): $(INSTALLED_RECOVERYIMAGE_TARGET) \ 1032 | $(INSTALLED_BOOTIMAGE_TARGET) \ 1033 | $(HOST_OUT_EXECUTABLES)/imgdiff \ 1034 | $(HOST_OUT_EXECUTABLES)/bsdiff 1035 | @echo "Construct recovery from boot" 1036 | mkdir -p $(dir $@) 1037 | PATH=$(HOST_OUT_EXECUTABLES):$$PATH $(HOST_OUT_EXECUTABLES)/imgdiff $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@ 1038 | endif 1039 | 1040 | 1041 | $(INSTALLED_SYSTEMIMAGE): $(BUILT_SYSTEMIMAGE) $(RECOVERY_FROM_BOOT_PATCH) | $(ACP) 1042 | @echo "Install system fs image: $@" 1043 | $(copy-file-to-target) 1044 | $(hide) $(call assert-max-image-size,$@ $(RECOVERY_FROM_BOOT_PATCH),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)) 1045 | 1046 | systemimage: $(INSTALLED_SYSTEMIMAGE) 1047 | 1048 | .PHONY: systemimage-nodeps snod 1049 | systemimage-nodeps snod: $(filter-out systemimage-nodeps snod,$(MAKECMDGOALS)) \ 1050 | | $(INTERNAL_USERIMAGES_DEPS) 1051 | @echo "make $@: ignoring dependencies" 1052 | $(call build-systemimage-target,$(INSTALLED_SYSTEMIMAGE)) 1053 | $(hide) $(call assert-max-image-size,$(INSTALLED_SYSTEMIMAGE),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)) 1054 | 1055 | ifneq (,$(filter systemimage-nodeps snod, $(MAKECMDGOALS))) 1056 | ifeq (true,$(WITH_DEXPREOPT)) 1057 | $(warning Warning: with dexpreopt enabled, you may need a full rebuild.) 1058 | endif 1059 | endif 1060 | 1061 | ####### 1062 | ## system tarball 1063 | define build-systemtarball-target 1064 | $(call pretty,"Target system fs tarball: $(INSTALLED_SYSTEMTARBALL_TARGET)") 1065 | $(call create-system-vendor-symlink) 1066 | $(MKTARBALL) $(FS_GET_STATS) \ 1067 | $(PRODUCT_OUT) system $(PRIVATE_SYSTEM_TAR) \ 1068 | $(INSTALLED_SYSTEMTARBALL_TARGET) $(TARGET_OUT) 1069 | endef 1070 | 1071 | ifndef SYSTEM_TARBALL_FORMAT 1072 | SYSTEM_TARBALL_FORMAT := bz2 1073 | endif 1074 | 1075 | system_tar := $(PRODUCT_OUT)/system.tar 1076 | INSTALLED_SYSTEMTARBALL_TARGET := $(system_tar).$(SYSTEM_TARBALL_FORMAT) 1077 | $(INSTALLED_SYSTEMTARBALL_TARGET): PRIVATE_SYSTEM_TAR := $(system_tar) 1078 | $(INSTALLED_SYSTEMTARBALL_TARGET): $(FS_GET_STATS) $(INTERNAL_SYSTEMIMAGE_FILES) 1079 | $(build-systemtarball-target) 1080 | 1081 | .PHONY: systemtarball-nodeps 1082 | systemtarball-nodeps: $(FS_GET_STATS) \ 1083 | $(filter-out systemtarball-nodeps stnod,$(MAKECMDGOALS)) 1084 | $(build-systemtarball-target) 1085 | 1086 | .PHONY: stnod 1087 | stnod: systemtarball-nodeps 1088 | 1089 | ####### 1090 | ## platform.zip: system, plus other files to be used in PDK fusion build, 1091 | ## in a zip file 1092 | ## 1093 | ## PDK_PLATFORM_ZIP_PRODUCT_BINARIES is used to store specified files to platform.zip. 1094 | ## The variable will be typically set from BoardConfig.mk. 1095 | ## Files under out dir will be rejected to prevent possible conflicts with other rules. 1096 | PDK_PLATFORM_ZIP_PRODUCT_BINARIES := $(filter-out $(OUT_DIR)/%,$(PDK_PLATFORM_ZIP_PRODUCT_BINARIES)) 1097 | INSTALLED_PLATFORM_ZIP := $(PRODUCT_OUT)/platform.zip 1098 | $(INSTALLED_PLATFORM_ZIP) : $(INTERNAL_SYSTEMIMAGE_FILES) 1099 | $(call pretty,"Platform zip package: $(INSTALLED_PLATFORM_ZIP)") 1100 | $(hide) rm -f $@ 1101 | $(hide) cd $(dir $@) && zip -qry $(notdir $@) \ 1102 | $(TARGET_COPY_OUT_SYSTEM) \ 1103 | $(patsubst $(PRODUCT_OUT)/%, %, $(TARGET_OUT_NOTICE_FILES)) \ 1104 | $(addprefix symbols/,$(PDK_SYMBOL_FILES_LIST)) 1105 | ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE 1106 | $(hide) cd $(dir $@) && zip -qry $(notdir $@) \ 1107 | $(TARGET_COPY_OUT_VENDOR) 1108 | endif 1109 | ifneq ($(PDK_PLATFORM_JAVA_ZIP_CONTENTS),) 1110 | $(hide) cd $(OUT_DIR) && zip -qry $(patsubst $(OUT_DIR)/%,%,$@) $(PDK_PLATFORM_JAVA_ZIP_CONTENTS) 1111 | endif 1112 | ifneq ($(PDK_PLATFORM_ZIP_PRODUCT_BINARIES),) 1113 | $(hide) zip -qry $@ $(PDK_PLATFORM_ZIP_PRODUCT_BINARIES) 1114 | endif 1115 | 1116 | .PHONY: platform 1117 | platform: $(INSTALLED_PLATFORM_ZIP) 1118 | 1119 | .PHONY: platform-java 1120 | platform-java: platform 1121 | 1122 | # Dist the platform.zip 1123 | ifneq (,$(filter platform platform-java, $(MAKECMDGOALS))) 1124 | $(call dist-for-goals, platform platform-java, $(INSTALLED_PLATFORM_ZIP)) 1125 | endif 1126 | 1127 | ####### 1128 | ## boot tarball 1129 | define build-boottarball-target 1130 | $(hide) echo "Target boot fs tarball: $(INSTALLED_BOOTTARBALL_TARGET)" 1131 | $(hide) mkdir -p $(PRODUCT_OUT)/boot 1132 | $(hide) cp -f $(INTERNAL_BOOTIMAGE_FILES) $(PRODUCT_OUT)/boot/. 1133 | $(hide) echo $(BOARD_KERNEL_CMDLINE) > $(PRODUCT_OUT)/boot/cmdline 1134 | $(hide) $(MKTARBALL) $(FS_GET_STATS) \ 1135 | $(PRODUCT_OUT) boot $(PRIVATE_BOOT_TAR) \ 1136 | $(INSTALLED_BOOTTARBALL_TARGET) $(TARGET_OUT) 1137 | endef 1138 | 1139 | ifndef BOOT_TARBALL_FORMAT 1140 | BOOT_TARBALL_FORMAT := bz2 1141 | endif 1142 | 1143 | boot_tar := $(PRODUCT_OUT)/boot.tar 1144 | INSTALLED_BOOTTARBALL_TARGET := $(boot_tar).$(BOOT_TARBALL_FORMAT) 1145 | $(INSTALLED_BOOTTARBALL_TARGET): PRIVATE_BOOT_TAR := $(boot_tar) 1146 | $(INSTALLED_BOOTTARBALL_TARGET): $(FS_GET_STATS) $(INTERNAL_BOOTIMAGE_FILES) 1147 | $(build-boottarball-target) 1148 | 1149 | .PHONY: boottarball-nodeps btnod 1150 | boottarball-nodeps btnod: $(FS_GET_STATS) \ 1151 | $(filter-out boottarball-nodeps btnod,$(MAKECMDGOALS)) 1152 | $(build-boottarball-target) 1153 | 1154 | 1155 | # ----------------------------------------------------------------- 1156 | # data partition image 1157 | INTERNAL_USERDATAIMAGE_FILES := \ 1158 | $(filter $(TARGET_OUT_DATA)/%,$(ALL_DEFAULT_INSTALLED_MODULES)) 1159 | 1160 | # Don't build userdata.img if it's extfs but no partition size 1161 | skip_userdata.img := 1162 | ifdef INTERNAL_USERIMAGES_EXT_VARIANT 1163 | ifndef BOARD_USERDATAIMAGE_PARTITION_SIZE 1164 | skip_userdata.img := true 1165 | endif 1166 | endif 1167 | 1168 | ifneq ($(skip_userdata.img),true) 1169 | userdataimage_intermediates := \ 1170 | $(call intermediates-dir-for,PACKAGING,userdata) 1171 | BUILT_USERDATAIMAGE_TARGET := $(PRODUCT_OUT)/userdata.img 1172 | 1173 | define build-userdataimage-target 1174 | $(call pretty,"Target userdata fs image: $(INSTALLED_USERDATAIMAGE_TARGET)") 1175 | @mkdir -p $(TARGET_OUT_DATA) 1176 | @mkdir -p $(userdataimage_intermediates) && rm -rf $(userdataimage_intermediates)/userdata_image_info.txt 1177 | $(call generate-userimage-prop-dictionary, $(userdataimage_intermediates)/userdata_image_info.txt, skip_fsck=true) 1178 | $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ 1179 | ./build/tools/releasetools/build_image.py \ 1180 | $(TARGET_OUT_DATA) $(userdataimage_intermediates)/userdata_image_info.txt $(INSTALLED_USERDATAIMAGE_TARGET) $(TARGET_OUT) 1181 | $(hide) $(call assert-max-image-size,$(INSTALLED_USERDATAIMAGE_TARGET),$(BOARD_USERDATAIMAGE_PARTITION_SIZE)) 1182 | endef 1183 | 1184 | # We just build this directly to the install location. 1185 | INSTALLED_USERDATAIMAGE_TARGET := $(BUILT_USERDATAIMAGE_TARGET) 1186 | $(INSTALLED_USERDATAIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) \ 1187 | $(INTERNAL_USERDATAIMAGE_FILES) 1188 | $(build-userdataimage-target) 1189 | 1190 | .PHONY: userdataimage-nodeps 1191 | userdataimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS) 1192 | $(build-userdataimage-target) 1193 | 1194 | endif # not skip_userdata.img 1195 | skip_userdata.img := 1196 | 1197 | ####### 1198 | ## data partition tarball 1199 | define build-userdatatarball-target 1200 | $(call pretty,"Target userdata fs tarball: " \ 1201 | "$(INSTALLED_USERDATATARBALL_TARGET)") 1202 | $(MKTARBALL) $(FS_GET_STATS) \ 1203 | $(PRODUCT_OUT) data $(PRIVATE_USERDATA_TAR) \ 1204 | $(INSTALLED_USERDATATARBALL_TARGET) $(TARGET_OUT) 1205 | endef 1206 | 1207 | userdata_tar := $(PRODUCT_OUT)/userdata.tar 1208 | INSTALLED_USERDATATARBALL_TARGET := $(userdata_tar).bz2 1209 | $(INSTALLED_USERDATATARBALL_TARGET): PRIVATE_USERDATA_TAR := $(userdata_tar) 1210 | $(INSTALLED_USERDATATARBALL_TARGET): $(FS_GET_STATS) $(INTERNAL_USERDATAIMAGE_FILES) 1211 | $(build-userdatatarball-target) 1212 | 1213 | .PHONY: userdatatarball-nodeps 1214 | userdatatarball-nodeps: $(FS_GET_STATS) 1215 | $(build-userdatatarball-target) 1216 | 1217 | 1218 | # ----------------------------------------------------------------- 1219 | # cache partition image 1220 | ifdef BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE 1221 | INTERNAL_CACHEIMAGE_FILES := \ 1222 | $(filter $(TARGET_OUT_CACHE)/%,$(ALL_DEFAULT_INSTALLED_MODULES)) 1223 | 1224 | cacheimage_intermediates := \ 1225 | $(call intermediates-dir-for,PACKAGING,cache) 1226 | BUILT_CACHEIMAGE_TARGET := $(PRODUCT_OUT)/cache.img 1227 | 1228 | define build-cacheimage-target 1229 | $(call pretty,"Target cache fs image: $(INSTALLED_CACHEIMAGE_TARGET)") 1230 | @mkdir -p $(TARGET_OUT_CACHE) 1231 | @mkdir -p $(cacheimage_intermediates) && rm -rf $(cacheimage_intermediates)/cache_image_info.txt 1232 | $(call generate-userimage-prop-dictionary, $(cacheimage_intermediates)/cache_image_info.txt, skip_fsck=true) 1233 | $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ 1234 | ./build/tools/releasetools/build_image.py \ 1235 | $(TARGET_OUT_CACHE) $(cacheimage_intermediates)/cache_image_info.txt $(INSTALLED_CACHEIMAGE_TARGET) $(TARGET_OUT) 1236 | $(hide) $(call assert-max-image-size,$(INSTALLED_CACHEIMAGE_TARGET),$(BOARD_CACHEIMAGE_PARTITION_SIZE)) 1237 | endef 1238 | 1239 | # We just build this directly to the install location. 1240 | INSTALLED_CACHEIMAGE_TARGET := $(BUILT_CACHEIMAGE_TARGET) 1241 | $(INSTALLED_CACHEIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_CACHEIMAGE_FILES) 1242 | $(build-cacheimage-target) 1243 | 1244 | .PHONY: cacheimage-nodeps 1245 | cacheimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS) 1246 | $(build-cacheimage-target) 1247 | 1248 | endif # BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE 1249 | 1250 | 1251 | # ----------------------------------------------------------------- 1252 | # vendor partition image 1253 | ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE 1254 | INTERNAL_VENDORIMAGE_FILES := \ 1255 | $(filter $(TARGET_OUT_VENDOR)/%,\ 1256 | $(ALL_DEFAULT_INSTALLED_MODULES)\ 1257 | $(ALL_PDK_FUSION_FILES)) 1258 | 1259 | # platform.zip depends on $(INTERNAL_VENDORIMAGE_FILES). 1260 | $(INSTALLED_PLATFORM_ZIP) : $(INTERNAL_VENDORIMAGE_FILES) 1261 | 1262 | vendorimage_intermediates := \ 1263 | $(call intermediates-dir-for,PACKAGING,vendor) 1264 | BUILT_VENDORIMAGE_TARGET := $(PRODUCT_OUT)/vendor.img 1265 | 1266 | define build-vendorimage-target 1267 | $(call pretty,"Target vendor fs image: $(INSTALLED_VENDORIMAGE_TARGET)") 1268 | @mkdir -p $(TARGET_OUT_VENDOR) 1269 | @mkdir -p $(vendorimage_intermediates) && rm -rf $(vendorimage_intermediates)/vendor_image_info.txt 1270 | $(call generate-userimage-prop-dictionary, $(vendorimage_intermediates)/vendor_image_info.txt, skip_fsck=true) 1271 | $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ 1272 | ./build/tools/releasetools/build_image.py \ 1273 | $(TARGET_OUT_VENDOR) $(vendorimage_intermediates)/vendor_image_info.txt $(INSTALLED_VENDORIMAGE_TARGET) $(TARGET_OUT) 1274 | $(hide) $(call assert-max-image-size,$(INSTALLED_VENDORIMAGE_TARGET),$(BOARD_VENDORIMAGE_PARTITION_SIZE)) 1275 | endef 1276 | 1277 | # We just build this directly to the install location. 1278 | INSTALLED_VENDORIMAGE_TARGET := $(BUILT_VENDORIMAGE_TARGET) 1279 | $(INSTALLED_VENDORIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_VENDORIMAGE_FILES) 1280 | $(build-vendorimage-target) 1281 | 1282 | .PHONY: vendorimage-nodeps 1283 | vendorimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS) 1284 | $(build-vendorimage-target) 1285 | 1286 | endif # BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE 1287 | 1288 | # ----------------------------------------------------------------- 1289 | # bring in the installer image generation defines if necessary 1290 | ifeq ($(TARGET_USE_DISKINSTALLER),true) 1291 | include bootable/diskinstaller/config.mk 1292 | endif 1293 | 1294 | # ----------------------------------------------------------------- 1295 | # host tools needed to build dist and OTA packages 1296 | 1297 | DISTTOOLS := $(HOST_OUT_EXECUTABLES)/minigzip \ 1298 | $(HOST_OUT_EXECUTABLES)/mkbootfs \ 1299 | $(HOST_OUT_EXECUTABLES)/mkbootimg \ 1300 | $(HOST_OUT_EXECUTABLES)/fs_config \ 1301 | $(HOST_OUT_EXECUTABLES)/zipalign \ 1302 | $(HOST_OUT_EXECUTABLES)/bsdiff \ 1303 | $(HOST_OUT_EXECUTABLES)/imgdiff \ 1304 | $(HOST_OUT_JAVA_LIBRARIES)/dumpkey.jar \ 1305 | $(HOST_OUT_JAVA_LIBRARIES)/signapk.jar \ 1306 | $(HOST_OUT_JAVA_LIBRARIES)/BootSignature.jar \ 1307 | $(HOST_OUT_EXECUTABLES)/mkuserimg.sh \ 1308 | $(HOST_OUT_EXECUTABLES)/make_ext4fs \ 1309 | $(HOST_OUT_EXECUTABLES)/simg2img \ 1310 | $(HOST_OUT_EXECUTABLES)/e2fsck \ 1311 | $(HOST_OUT_EXECUTABLES)/build_verity_tree \ 1312 | $(HOST_OUT_EXECUTABLES)/verity_signer \ 1313 | $(HOST_OUT_EXECUTABLES)/append2simg \ 1314 | $(HOST_OUT_EXECUTABLES)/img2simg \ 1315 | $(HOST_OUT_EXECUTABLES)/boot_signer 1316 | 1317 | # Shared libraries. 1318 | DISTTOOLS += \ 1319 | $(HOST_LIBRARY_PATH)/libc++$(HOST_SHLIB_SUFFIX) \ 1320 | $(HOST_LIBRARY_PATH)/liblog$(HOST_SHLIB_SUFFIX) \ 1321 | $(HOST_LIBRARY_PATH)/libcutils$(HOST_SHLIB_SUFFIX) \ 1322 | $(HOST_LIBRARY_PATH)/libselinux$(HOST_SHLIB_SUFFIX) \ 1323 | $(HOST_LIBRARY_PATH)/libcrypto-host$(HOST_SHLIB_SUFFIX) \ 1324 | $(HOST_LIBRARY_PATH)/libext2fs_host$(HOST_SHLIB_SUFFIX) \ 1325 | $(HOST_LIBRARY_PATH)/libext2_blkid_host$(HOST_SHLIB_SUFFIX) \ 1326 | $(HOST_LIBRARY_PATH)/libext2_com_err_host$(HOST_SHLIB_SUFFIX) \ 1327 | $(HOST_LIBRARY_PATH)/libext2_e2p_host$(HOST_SHLIB_SUFFIX) \ 1328 | $(HOST_LIBRARY_PATH)/libext2_profile_host$(HOST_SHLIB_SUFFIX) \ 1329 | $(HOST_LIBRARY_PATH)/libext2_quota_host$(HOST_SHLIB_SUFFIX) \ 1330 | $(HOST_LIBRARY_PATH)/libext2_uuid_host$(HOST_SHLIB_SUFFIX) 1331 | 1332 | OTATOOLS := $(DISTTOOLS) \ 1333 | $(HOST_OUT_EXECUTABLES)/aapt 1334 | 1335 | .PHONY: otatools 1336 | otatools: $(OTATOOLS) 1337 | 1338 | BUILT_OTATOOLS_PACKAGE := $(PRODUCT_OUT)/otatools.zip 1339 | $(BUILT_OTATOOLS_PACKAGE): zip_root := $(call intermediates-dir-for,PACKAGING,otatools)/otatools 1340 | 1341 | $(BUILT_OTATOOLS_PACKAGE): $(OTATOOLS) | $(ACP) 1342 | @echo "Package OTA tools: $@" 1343 | $(hide) rm -rf $@ $(zip_root) 1344 | $(hide) mkdir -p $(dir $@) $(zip_root)/bin $(zip_root)/framework $(zip_root)/releasetools 1345 | $(call copy-files-with-structure,$(OTATOOLS),$(HOST_OUT)/,$(zip_root)) 1346 | $(hide) $(ACP) -r -d -p build/tools/releasetools/* $(zip_root)/releasetools 1347 | $(hide) rm -rf $@ $(zip_root)/releasetools/*.pyc 1348 | $(hide) (cd $(zip_root) && zip -qry $(abspath $@) *) 1349 | $(hide) zip -qry $(abspath $@) build/target/product/security/ 1350 | $(hide) find device vendor -name \*.pk8 -o -name \*.x509.pem -o -name oem.prop | xargs zip -qry $(abspath $@)>/dev/null || true 1351 | 1352 | .PHONY: otatools-package 1353 | otatools-package: $(BUILT_OTATOOLS_PACKAGE) 1354 | 1355 | 1356 | # ----------------------------------------------------------------- 1357 | # A zip of the directories that map to the target filesystem. 1358 | # This zip can be used to create an OTA package or filesystem image 1359 | # as a post-build step. 1360 | # 1361 | name := $(TARGET_PRODUCT) 1362 | ifeq ($(TARGET_BUILD_TYPE),debug) 1363 | name := $(name)_debug 1364 | endif 1365 | name := $(name)-target_files-$(FILE_NAME_TAG) 1366 | 1367 | intermediates := $(call intermediates-dir-for,PACKAGING,target_files) 1368 | BUILT_TARGET_FILES_PACKAGE := $(intermediates)/$(name).zip 1369 | $(BUILT_TARGET_FILES_PACKAGE): intermediates := $(intermediates) 1370 | $(BUILT_TARGET_FILES_PACKAGE): \ 1371 | zip_root := $(intermediates)/$(name) 1372 | 1373 | # $(1): Directory to copy 1374 | # $(2): Location to copy it to 1375 | # The "ls -A" is to prevent "acp s/* d" from failing if s is empty. 1376 | define package_files-copy-root 1377 | if [ -d "$(strip $(1))" -a "$$(ls -A $(1))" ]; then \ 1378 | mkdir -p $(2) && \ 1379 | $(ACP) -rd $(strip $(1))/* $(2); \ 1380 | fi 1381 | endef 1382 | 1383 | built_ota_tools := \ 1384 | $(call intermediates-dir-for,EXECUTABLES,applypatch,,,$(TARGET_PREFER_32_BIT))/applypatch \ 1385 | $(call intermediates-dir-for,EXECUTABLES,applypatch_static,,,$(TARGET_PREFER_32_BIT))/applypatch_static \ 1386 | $(call intermediates-dir-for,EXECUTABLES,check_prereq,,,$(TARGET_PREFER_32_BIT))/check_prereq \ 1387 | $(call intermediates-dir-for,EXECUTABLES,sqlite3,,,$(TARGET_PREFER_32_BIT))/sqlite3 \ 1388 | $(call intermediates-dir-for,EXECUTABLES,updater,,,$(TARGET_PREFER_32_BIT))/updater 1389 | $(BUILT_TARGET_FILES_PACKAGE): PRIVATE_OTA_TOOLS := $(built_ota_tools) 1390 | 1391 | $(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_API_VERSION := $(RECOVERY_API_VERSION) 1392 | $(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_FSTAB_VERSION := $(RECOVERY_FSTAB_VERSION) 1393 | 1394 | ifeq ($(TARGET_RELEASETOOLS_EXTENSIONS),) 1395 | # default to common dir for device vendor 1396 | $(BUILT_TARGET_FILES_PACKAGE): tool_extensions := $(TARGET_DEVICE_DIR)/../common 1397 | else 1398 | $(BUILT_TARGET_FILES_PACKAGE): tool_extensions := $(TARGET_RELEASETOOLS_EXTENSIONS) 1399 | endif 1400 | 1401 | # Depending on the various images guarantees that the underlying 1402 | # directories are up-to-date. 1403 | $(BUILT_TARGET_FILES_PACKAGE): \ 1404 | $(INSTALLED_BOOTIMAGE_TARGET) \ 1405 | $(INSTALLED_RADIOIMAGE_TARGET) \ 1406 | $(INSTALLED_RECOVERYIMAGE_TARGET) \ 1407 | $(INSTALLED_SYSTEMIMAGE) \ 1408 | $(INSTALLED_USERDATAIMAGE_TARGET) \ 1409 | $(INSTALLED_CACHEIMAGE_TARGET) \ 1410 | $(INSTALLED_VENDORIMAGE_TARGET) \ 1411 | $(INSTALLED_ANDROID_INFO_TXT_TARGET) \ 1412 | $(SELINUX_FC) \ 1413 | $(built_ota_tools) \ 1414 | $(APKCERTS_FILE) \ 1415 | $(HOST_OUT_EXECUTABLES)/fs_config \ 1416 | | $(ACP) 1417 | @echo "Package target files: $@" 1418 | $(hide) rm -rf $@ $(zip_root) 1419 | $(hide) mkdir -p $(dir $@) $(zip_root) 1420 | @# Components of the recovery image 1421 | $(hide) mkdir -p $(zip_root)/RECOVERY 1422 | $(hide) $(call package_files-copy-root, \ 1423 | $(TARGET_RECOVERY_ROOT_OUT),$(zip_root)/RECOVERY/RAMDISK) 1424 | ifdef INSTALLED_KERNEL_TARGET 1425 | $(hide) $(ACP) $(INSTALLED_KERNEL_TARGET) $(zip_root)/RECOVERY/kernel 1426 | endif 1427 | ifdef INSTALLED_2NDBOOTLOADER_TARGET 1428 | $(hide) $(ACP) \ 1429 | $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/RECOVERY/second 1430 | endif 1431 | ifdef BOARD_KERNEL_CMDLINE 1432 | $(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/RECOVERY/cmdline 1433 | endif 1434 | ifdef BOARD_KERNEL_BASE 1435 | $(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/RECOVERY/base 1436 | endif 1437 | ifdef BOARD_KERNEL_PAGESIZE 1438 | $(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/RECOVERY/pagesize 1439 | endif 1440 | @# Components of the boot image 1441 | $(hide) mkdir -p $(zip_root)/BOOT 1442 | $(hide) $(call package_files-copy-root, \ 1443 | $(TARGET_ROOT_OUT),$(zip_root)/BOOT/RAMDISK) 1444 | ifdef INSTALLED_KERNEL_TARGET 1445 | $(hide) $(ACP) $(INSTALLED_KERNEL_TARGET) $(zip_root)/BOOT/kernel 1446 | endif 1447 | ifdef INSTALLED_2NDBOOTLOADER_TARGET 1448 | $(hide) $(ACP) \ 1449 | $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/BOOT/second 1450 | endif 1451 | ifdef BOARD_KERNEL_CMDLINE 1452 | $(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline 1453 | endif 1454 | ifdef BOARD_KERNEL_BASE 1455 | $(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/BOOT/base 1456 | endif 1457 | ifdef BOARD_KERNEL_PAGESIZE 1458 | $(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/BOOT/pagesize 1459 | endif 1460 | $(hide) $(foreach t,$(INSTALLED_RADIOIMAGE_TARGET),\ 1461 | mkdir -p $(zip_root)/RADIO; \ 1462 | $(ACP) $(t) $(zip_root)/RADIO/$(notdir $(t));) 1463 | @# Contents of the system image 1464 | $(hide) $(call package_files-copy-root, \ 1465 | $(SYSTEMIMAGE_SOURCE_DIR),$(zip_root)/SYSTEM) 1466 | @# Contents of the data image 1467 | $(hide) $(call package_files-copy-root, \ 1468 | $(TARGET_OUT_DATA),$(zip_root)/DATA) 1469 | ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE 1470 | @# Contents of the vendor image 1471 | $(hide) $(call package_files-copy-root, \ 1472 | $(TARGET_OUT_VENDOR),$(zip_root)/VENDOR) 1473 | endif 1474 | @# Extra contents of the OTA package 1475 | $(hide) mkdir -p $(zip_root)/OTA/bin 1476 | $(hide) $(ACP) $(INSTALLED_ANDROID_INFO_TXT_TARGET) $(zip_root)/OTA/ 1477 | $(hide) $(ACP) $(PRIVATE_OTA_TOOLS) $(zip_root)/OTA/bin/ 1478 | @# Files that do not end up in any images, but are necessary to 1479 | @# build them. 1480 | $(hide) mkdir -p $(zip_root)/META 1481 | $(hide) $(ACP) $(APKCERTS_FILE) $(zip_root)/META/apkcerts.txt 1482 | $(hide) if test -e $(tool_extensions)/releasetools.py; then $(ACP) $(tool_extensions)/releasetools.py $(zip_root)/META/; fi 1483 | $(hide) echo "$(PRODUCT_OTA_PUBLIC_KEYS)" > $(zip_root)/META/otakeys.txt 1484 | $(hide) echo "recovery_api_version=$(PRIVATE_RECOVERY_API_VERSION)" > $(zip_root)/META/misc_info.txt 1485 | $(hide) echo "fstab_version=$(PRIVATE_RECOVERY_FSTAB_VERSION)" >> $(zip_root)/META/misc_info.txt 1486 | ifdef BOARD_FLASH_BLOCK_SIZE 1487 | $(hide) echo "blocksize=$(BOARD_FLASH_BLOCK_SIZE)" >> $(zip_root)/META/misc_info.txt 1488 | endif 1489 | ifdef BOARD_BOOTIMAGE_PARTITION_SIZE 1490 | $(hide) echo "boot_size=$(BOARD_BOOTIMAGE_PARTITION_SIZE)" >> $(zip_root)/META/misc_info.txt 1491 | endif 1492 | ifdef BOARD_RECOVERYIMAGE_PARTITION_SIZE 1493 | $(hide) echo "recovery_size=$(BOARD_RECOVERYIMAGE_PARTITION_SIZE)" >> $(zip_root)/META/misc_info.txt 1494 | endif 1495 | ifdef BOARD_HAS_EXT4_RESERVED_BLOCKS 1496 | $(hide) echo "has_ext4_reserved_blocks=$(BOARD_HAS_EXT4_RESERVED_BLOCKS)" >> $(zip_root)/META/misc_info.txt 1497 | endif 1498 | ifdef TARGET_RECOVERY_FSTYPE_MOUNT_OPTIONS 1499 | @# TARGET_RECOVERY_FSTYPE_MOUNT_OPTIONS can be empty to indicate that nothing but defaults should be used. 1500 | $(hide) echo "recovery_mount_options=$(TARGET_RECOVERY_FSTYPE_MOUNT_OPTIONS)" >> $(zip_root)/META/misc_info.txt 1501 | else 1502 | $(hide) echo "recovery_mount_options=$(DEFAULT_TARGET_RECOVERY_FSTYPE_MOUNT_OPTIONS)" >> $(zip_root)/META/misc_info.txt 1503 | endif 1504 | $(hide) echo "tool_extensions=$(tool_extensions)" >> $(zip_root)/META/misc_info.txt 1505 | $(hide) echo "default_system_dev_certificate=$(DEFAULT_SYSTEM_DEV_CERTIFICATE)" >> $(zip_root)/META/misc_info.txt 1506 | ifdef PRODUCT_EXTRA_RECOVERY_KEYS 1507 | $(hide) echo "extra_recovery_keys=$(PRODUCT_EXTRA_RECOVERY_KEYS)" >> $(zip_root)/META/misc_info.txt 1508 | endif 1509 | $(hide) echo 'mkbootimg_args=$(BOARD_MKBOOTIMG_ARGS)' >> $(zip_root)/META/misc_info.txt 1510 | $(hide) echo "use_set_metadata=1" >> $(zip_root)/META/misc_info.txt 1511 | $(hide) echo "multistage_support=1" >> $(zip_root)/META/misc_info.txt 1512 | $(hide) echo "update_rename_support=1" >> $(zip_root)/META/misc_info.txt 1513 | $(hide) echo "blockimgdiff_versions=1,2,3" >> $(zip_root)/META/misc_info.txt 1514 | ifneq ($(OEM_THUMBPRINT_PROPERTIES),) 1515 | # OTA scripts are only interested in fingerprint related properties 1516 | $(hide) echo "oem_fingerprint_properties=$(OEM_THUMBPRINT_PROPERTIES)" >> $(zip_root)/META/misc_info.txt 1517 | endif 1518 | $(call generate-userimage-prop-dictionary, $(zip_root)/META/misc_info.txt) 1519 | $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ 1520 | ./build/tools/releasetools/make_recovery_patch $(zip_root) $(zip_root) 1521 | @# Zip everything up, preserving symlinks 1522 | $(hide) (cd $(zip_root) && zip -qry ../$(notdir $@) .) 1523 | @# Run fs_config on all the system, vendor, boot ramdisk, 1524 | @# and recovery ramdisk files in the zip, and save the output 1525 | $(hide) zipinfo -1 $@ | awk 'BEGIN { FS="SYSTEM/" } /^SYSTEM\// {print "system/" $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -D $(TARGET_OUT) -S $(SELINUX_FC) > $(zip_root)/META/filesystem_config.txt 1526 | $(hide) zipinfo -1 $@ | awk 'BEGIN { FS="VENDOR/" } /^VENDOR\// {print "vendor/" $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -D $(TARGET_OUT) -S $(SELINUX_FC) > $(zip_root)/META/vendor_filesystem_config.txt 1527 | $(hide) zipinfo -1 $@ | awk 'BEGIN { FS="BOOT/RAMDISK/" } /^BOOT\/RAMDISK\// {print $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -D $(TARGET_OUT) -S $(SELINUX_FC) > $(zip_root)/META/boot_filesystem_config.txt 1528 | $(hide) zipinfo -1 $@ | awk 'BEGIN { FS="RECOVERY/RAMDISK/" } /^RECOVERY\/RAMDISK\// {print $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -D $(TARGET_OUT) -S $(SELINUX_FC) > $(zip_root)/META/recovery_filesystem_config.txt 1529 | $(hide) (cd $(zip_root) && zip -q ../$(notdir $@) META/*filesystem_config.txt) 1530 | $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ 1531 | ./build/tools/releasetools/add_img_to_target_files -p $(HOST_OUT) $@ 1532 | 1533 | .PHONY: target-files-package 1534 | target-files-package: $(BUILT_TARGET_FILES_PACKAGE) 1535 | 1536 | ifneq ($(filter $(MAKECMDGOALS),target-files-package),) 1537 | $(call dist-for-goals, target-files-package, $(BUILT_TARGET_FILES_PACKAGE)) 1538 | endif 1539 | 1540 | ifneq ($(TARGET_PRODUCT),sdk) 1541 | ifeq ($(filter generic%,$(TARGET_DEVICE)),) 1542 | ifneq ($(TARGET_NO_KERNEL),true) 1543 | ifneq ($(recovery_fstab),) 1544 | 1545 | # ----------------------------------------------------------------- 1546 | # OTA update package 1547 | 1548 | name := $(TARGET_PRODUCT) 1549 | ifeq ($(TARGET_BUILD_TYPE),debug) 1550 | name := $(name)_debug 1551 | endif 1552 | name := $(name)-ota-$(FILE_NAME_TAG) 1553 | 1554 | INTERNAL_OTA_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip 1555 | 1556 | $(INTERNAL_OTA_PACKAGE_TARGET): KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR) 1557 | 1558 | $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS) 1559 | @echo "Package OTA: $@" 1560 | $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ 1561 | ./build/tools/releasetools/ota_from_target_files -v \ 1562 | --block \ 1563 | -p $(HOST_OUT) \ 1564 | -k $(KEY_CERT_PAIR) \ 1565 | $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \ 1566 | $(BUILT_TARGET_FILES_PACKAGE) $@ 1567 | 1568 | .PHONY: otapackage 1569 | otapackage: $(INTERNAL_OTA_PACKAGE_TARGET) 1570 | 1571 | endif # recovery_fstab is defined 1572 | endif # TARGET_NO_KERNEL != true 1573 | endif # TARGET_DEVICE != generic* 1574 | endif # TARGET_PRODUCT != sdk 1575 | 1576 | # ----------------------------------------------------------------- 1577 | # The update package 1578 | 1579 | name := $(TARGET_PRODUCT) 1580 | ifeq ($(TARGET_BUILD_TYPE),debug) 1581 | name := $(name)_debug 1582 | endif 1583 | name := $(name)-img-$(FILE_NAME_TAG) 1584 | 1585 | INTERNAL_UPDATE_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip 1586 | 1587 | $(INTERNAL_UPDATE_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS) 1588 | @echo "Package: $@" 1589 | $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ 1590 | ./build/tools/releasetools/img_from_target_files -v \ 1591 | -p $(HOST_OUT) \ 1592 | $(BUILT_TARGET_FILES_PACKAGE) $@ 1593 | 1594 | .PHONY: updatepackage 1595 | updatepackage: $(INTERNAL_UPDATE_PACKAGE_TARGET) 1596 | 1597 | # ----------------------------------------------------------------- 1598 | # A zip of the symbols directory. Keep the full paths to make it 1599 | # more obvious where these files came from. 1600 | # 1601 | name := $(TARGET_PRODUCT) 1602 | ifeq ($(TARGET_BUILD_TYPE),debug) 1603 | name := $(name)_debug 1604 | endif 1605 | name := $(name)-symbols-$(FILE_NAME_TAG) 1606 | 1607 | SYMBOLS_ZIP := $(PRODUCT_OUT)/$(name).zip 1608 | # For apps_only build we'll establish the dependency later in build/core/main.mk. 1609 | ifndef TARGET_BUILD_APPS 1610 | $(SYMBOLS_ZIP): $(INSTALLED_SYSTEMIMAGE) $(INSTALLED_BOOTIMAGE_TARGET) 1611 | endif 1612 | $(SYMBOLS_ZIP): 1613 | @echo "Package symbols: $@" 1614 | $(hide) rm -rf $@ 1615 | $(hide) mkdir -p $(dir $@) $(TARGET_OUT_UNSTRIPPED) 1616 | $(hide) zip -qr $@ $(TARGET_OUT_UNSTRIPPED) 1617 | 1618 | # ----------------------------------------------------------------- 1619 | # A zip of the Android Apps. Not keeping full path so that we don't 1620 | # include product names when distributing 1621 | # 1622 | name := $(TARGET_PRODUCT) 1623 | ifeq ($(TARGET_BUILD_TYPE),debug) 1624 | name := $(name)_debug 1625 | endif 1626 | name := $(name)-apps-$(FILE_NAME_TAG) 1627 | 1628 | APPS_ZIP := $(PRODUCT_OUT)/$(name).zip 1629 | $(APPS_ZIP): $(INSTALLED_SYSTEMIMAGE) 1630 | @echo "Package apps: $@" 1631 | $(hide) rm -rf $@ 1632 | $(hide) mkdir -p $(dir $@) 1633 | $(hide) zip -qj $@ $(TARGET_OUT_APPS)/*/*.apk $(TARGET_OUT_APPS_PRIVILEGED)/*/*.apk 1634 | 1635 | 1636 | #------------------------------------------------------------------ 1637 | # A zip of emma code coverage meta files. Generated for fully emma 1638 | # instrumented build. 1639 | # 1640 | ifeq (true,$(EMMA_INSTRUMENT)) 1641 | EMMA_META_ZIP := $(PRODUCT_OUT)/emma_meta.zip 1642 | # the dependency will be set up later in build/core/main.mk. 1643 | $(EMMA_META_ZIP) : 1644 | @echo "Collecting Emma coverage meta files." 1645 | $(hide) find $(TARGET_COMMON_OUT_ROOT) $(HOST_COMMON_OUT_ROOT) -name "coverage.em" | \ 1646 | zip -@ -q $@ 1647 | 1648 | endif # EMMA_INSTRUMENT=true 1649 | 1650 | #------------------------------------------------------------------ 1651 | # A zip of Proguard obfuscation dictionary files. 1652 | # Only for apps_only build. 1653 | # 1654 | ifdef TARGET_BUILD_APPS 1655 | PROGUARD_DICT_ZIP := $(PRODUCT_OUT)/$(TARGET_PRODUCT)-proguard-dict-$(FILE_NAME_TAG).zip 1656 | # the dependency will be set up later in build/core/main.mk. 1657 | $(PROGUARD_DICT_ZIP) : 1658 | @echo "Packaging Proguard obfuscation dictionary files." 1659 | $(hide) dict_files=`find $(TARGET_OUT_COMMON_INTERMEDIATES)/APPS -name proguard_dictionary`; \ 1660 | if [ -n "$$dict_files" ]; then \ 1661 | unobfuscated_jars=$${dict_files//proguard_dictionary/classes.jar}; \ 1662 | zip -q $@ $$dict_files $$unobfuscated_jars; \ 1663 | else \ 1664 | touch $(dir $@)/zipdummy; \ 1665 | (cd $(dir $@) && zip -q $(notdir $@) zipdummy); \ 1666 | zip -qd $@ zipdummy; \ 1667 | rm $(dir $@)/zipdummy; \ 1668 | fi 1669 | 1670 | endif # TARGET_BUILD_APPS 1671 | 1672 | # ----------------------------------------------------------------- 1673 | # dalvik something 1674 | .PHONY: dalvikfiles 1675 | dalvikfiles: $(INTERNAL_DALVIK_MODULES) 1676 | 1677 | # ----------------------------------------------------------------- 1678 | # The emulator package 1679 | ifeq ($(BUILD_EMULATOR),true) 1680 | INTERNAL_EMULATOR_PACKAGE_FILES += \ 1681 | $(HOST_OUT_EXECUTABLES)/emulator$(HOST_EXECUTABLE_SUFFIX) \ 1682 | prebuilts/qemu-kernel/$(TARGET_ARCH)/kernel-qemu \ 1683 | $(INSTALLED_RAMDISK_TARGET) \ 1684 | $(INSTALLED_SYSTEMIMAGE) \ 1685 | $(INSTALLED_USERDATAIMAGE_TARGET) 1686 | 1687 | name := $(TARGET_PRODUCT)-emulator-$(FILE_NAME_TAG) 1688 | 1689 | INTERNAL_EMULATOR_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip 1690 | 1691 | $(INTERNAL_EMULATOR_PACKAGE_TARGET): $(INTERNAL_EMULATOR_PACKAGE_FILES) 1692 | @echo "Package: $@" 1693 | $(hide) zip -qj $@ $(INTERNAL_EMULATOR_PACKAGE_FILES) 1694 | 1695 | endif 1696 | # ----------------------------------------------------------------- 1697 | # Old PDK stuffs, retired 1698 | # The pdk package (Platform Development Kit) 1699 | 1700 | #ifneq (,$(filter pdk,$(MAKECMDGOALS))) 1701 | # include development/pdk/Pdk.mk 1702 | #endif 1703 | 1704 | 1705 | # ----------------------------------------------------------------- 1706 | # The SDK 1707 | 1708 | # The SDK includes host-specific components, so it belongs under HOST_OUT. 1709 | sdk_dir := $(HOST_OUT)/sdk/$(TARGET_PRODUCT) 1710 | 1711 | # Build a name that looks like: 1712 | # 1713 | # linux-x86 --> android-sdk_12345_linux-x86 1714 | # darwin-x86 --> android-sdk_12345_mac-x86 1715 | # windows-x86 --> android-sdk_12345_windows 1716 | # 1717 | sdk_name := android-sdk_$(FILE_NAME_TAG) 1718 | ifeq ($(HOST_OS),darwin) 1719 | INTERNAL_SDK_HOST_OS_NAME := mac 1720 | else 1721 | INTERNAL_SDK_HOST_OS_NAME := $(HOST_OS) 1722 | endif 1723 | ifneq ($(HOST_OS),windows) 1724 | INTERNAL_SDK_HOST_OS_NAME := $(INTERNAL_SDK_HOST_OS_NAME)-$(SDK_HOST_ARCH) 1725 | endif 1726 | sdk_name := $(sdk_name)_$(INTERNAL_SDK_HOST_OS_NAME) 1727 | 1728 | sdk_dep_file := $(sdk_dir)/sdk_deps.mk 1729 | 1730 | ATREE_FILES := 1731 | -include $(sdk_dep_file) 1732 | 1733 | # if we don't have a real list, then use "everything" 1734 | ifeq ($(strip $(ATREE_FILES)),) 1735 | ATREE_FILES := \ 1736 | $(ALL_PREBUILT) \ 1737 | $(ALL_COPIED_HEADERS) \ 1738 | $(ALL_DEFAULT_INSTALLED_MODULES) \ 1739 | $(INSTALLED_RAMDISK_TARGET) \ 1740 | $(ALL_DOCS) \ 1741 | $(ALL_SDK_FILES) 1742 | endif 1743 | 1744 | atree_dir := development/build 1745 | 1746 | 1747 | sdk_atree_files := \ 1748 | $(atree_dir)/sdk.exclude.atree \ 1749 | $(atree_dir)/sdk-$(HOST_OS)-$(SDK_HOST_ARCH).atree 1750 | 1751 | # development/build/sdk-android-.atree is used to differentiate 1752 | # between architecture models (e.g. ARMv5TE versus ARMv7) when copying 1753 | # files like the kernel image. We use TARGET_CPU_ABI because we don't 1754 | # have a better way to distinguish between CPU models. 1755 | ifneq (,$(strip $(wildcard $(atree_dir)/sdk-android-$(TARGET_CPU_ABI).atree))) 1756 | sdk_atree_files += $(atree_dir)/sdk-android-$(TARGET_CPU_ABI).atree 1757 | endif 1758 | 1759 | ifneq ($(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SDK_ATREE_FILES),) 1760 | sdk_atree_files += $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SDK_ATREE_FILES) 1761 | else 1762 | sdk_atree_files += $(atree_dir)/sdk.atree 1763 | endif 1764 | 1765 | include $(BUILD_SYSTEM)/sdk_font.mk 1766 | 1767 | deps := \ 1768 | $(target_notice_file_txt) \ 1769 | $(tools_notice_file_txt) \ 1770 | $(OUT_DOCS)/offline-sdk-timestamp \ 1771 | $(SYMBOLS_ZIP) \ 1772 | $(INSTALLED_SYSTEMIMAGE) \ 1773 | $(INSTALLED_USERDATAIMAGE_TARGET) \ 1774 | $(INSTALLED_RAMDISK_TARGET) \ 1775 | $(INSTALLED_SDK_BUILD_PROP_TARGET) \ 1776 | $(INSTALLED_BUILD_PROP_TARGET) \ 1777 | $(ATREE_FILES) \ 1778 | $(sdk_atree_files) \ 1779 | $(HOST_OUT_EXECUTABLES)/atree \ 1780 | $(HOST_OUT_EXECUTABLES)/line_endings \ 1781 | $(SDK_FONT_DEPS) 1782 | 1783 | INTERNAL_SDK_TARGET := $(sdk_dir)/$(sdk_name).zip 1784 | $(INTERNAL_SDK_TARGET): PRIVATE_NAME := $(sdk_name) 1785 | $(INTERNAL_SDK_TARGET): PRIVATE_DIR := $(sdk_dir)/$(sdk_name) 1786 | $(INTERNAL_SDK_TARGET): PRIVATE_DEP_FILE := $(sdk_dep_file) 1787 | $(INTERNAL_SDK_TARGET): PRIVATE_INPUT_FILES := $(sdk_atree_files) 1788 | 1789 | # Set SDK_GNU_ERROR to non-empty to fail when a GNU target is built. 1790 | # 1791 | #SDK_GNU_ERROR := true 1792 | 1793 | $(INTERNAL_SDK_TARGET): $(deps) 1794 | @echo "Package SDK: $@" 1795 | $(hide) rm -rf $(PRIVATE_DIR) $@ 1796 | $(hide) for f in $(target_gnu_MODULES); do \ 1797 | if [ -f $$f ]; then \ 1798 | echo SDK: $(if $(SDK_GNU_ERROR),ERROR:,warning:) \ 1799 | including GNU target $$f >&2; \ 1800 | FAIL=$(SDK_GNU_ERROR); \ 1801 | fi; \ 1802 | done; \ 1803 | if [ $$FAIL ]; then exit 1; fi 1804 | $(hide) echo $(notdir $(SDK_FONT_DEPS)) | tr " " "\n" > $(SDK_FONT_TEMP)/fontsInSdk.txt 1805 | $(hide) ( \ 1806 | ATREE_STRIP="strip -x" \ 1807 | $(HOST_OUT_EXECUTABLES)/atree \ 1808 | $(addprefix -f ,$(PRIVATE_INPUT_FILES)) \ 1809 | -m $(PRIVATE_DEP_FILE) \ 1810 | -I . \ 1811 | -I $(PRODUCT_OUT) \ 1812 | -I $(HOST_OUT) \ 1813 | -I $(TARGET_COMMON_OUT_ROOT) \ 1814 | -v "PLATFORM_NAME=android-$(PLATFORM_VERSION)" \ 1815 | -v "OUT_DIR=$(OUT_DIR)" \ 1816 | -v "HOST_OUT=$(HOST_OUT)" \ 1817 | -v "TARGET_ARCH=$(TARGET_ARCH)" \ 1818 | -v "TARGET_CPU_ABI=$(TARGET_CPU_ABI)" \ 1819 | -v "DLL_EXTENSION=$(HOST_SHLIB_SUFFIX)" \ 1820 | -v "FONT_OUT=$(SDK_FONT_TEMP)" \ 1821 | -o $(PRIVATE_DIR) && \ 1822 | cp -f $(target_notice_file_txt) \ 1823 | $(PRIVATE_DIR)/system-images/android-$(PLATFORM_VERSION)/$(TARGET_CPU_ABI)/NOTICE.txt && \ 1824 | cp -f $(tools_notice_file_txt) $(PRIVATE_DIR)/platform-tools/NOTICE.txt && \ 1825 | HOST_OUT_EXECUTABLES=$(HOST_OUT_EXECUTABLES) HOST_OS=$(HOST_OS) \ 1826 | development/build/tools/sdk_clean.sh $(PRIVATE_DIR) && \ 1827 | chmod -R ug+rwX $(PRIVATE_DIR) && \ 1828 | cd $(dir $@) && zip -rq $(notdir $@) $(PRIVATE_NAME) \ 1829 | ) || ( rm -rf $(PRIVATE_DIR) $@ && exit 44 ) 1830 | 1831 | 1832 | # Is a Windows SDK requested? If so, we need some definitions from here 1833 | # in order to find the Linux SDK used to create the Windows one. 1834 | MAIN_SDK_NAME := $(sdk_name) 1835 | MAIN_SDK_DIR := $(sdk_dir) 1836 | MAIN_SDK_ZIP := $(INTERNAL_SDK_TARGET) 1837 | ifneq ($(filter win_sdk winsdk-tools,$(MAKECMDGOALS)),) 1838 | include $(TOPDIR)development/build/tools/windows_sdk.mk 1839 | endif 1840 | 1841 | # ----------------------------------------------------------------- 1842 | # Findbugs 1843 | INTERNAL_FINDBUGS_XML_TARGET := $(PRODUCT_OUT)/findbugs.xml 1844 | INTERNAL_FINDBUGS_HTML_TARGET := $(PRODUCT_OUT)/findbugs.html 1845 | $(INTERNAL_FINDBUGS_XML_TARGET): $(ALL_FINDBUGS_FILES) 1846 | @echo UnionBugs: $@ 1847 | $(hide) $(FINDBUGS_DIR)/unionBugs $(ALL_FINDBUGS_FILES) \ 1848 | > $@ 1849 | $(INTERNAL_FINDBUGS_HTML_TARGET): $(INTERNAL_FINDBUGS_XML_TARGET) 1850 | @echo ConvertXmlToText: $@ 1851 | $(hide) $(FINDBUGS_DIR)/convertXmlToText -html:fancy.xsl \ 1852 | $(INTERNAL_FINDBUGS_XML_TARGET) > $@ 1853 | 1854 | # ----------------------------------------------------------------- 1855 | # Findbugs 1856 | 1857 | # ----------------------------------------------------------------- 1858 | # These are some additional build tasks that need to be run. 1859 | ifneq ($(dont_bother),true) 1860 | include $(sort $(wildcard $(BUILD_SYSTEM)/tasks/*.mk)) 1861 | -include $(sort $(wildcard vendor/*/build/tasks/*.mk)) 1862 | -include $(sort $(wildcard device/*/build/tasks/*.mk)) 1863 | # Also the project-specific tasks 1864 | -include $(sort $(wildcard vendor/*/*/build/tasks/*.mk)) 1865 | -include $(sort $(wildcard device/*/*/build/tasks/*.mk)) 1866 | endif 1867 | 1868 | # ----------------------------------------------------------------- 1869 | # Create SDK repository packages. Must be done after tasks/* since 1870 | # we need the addon rules defined. 1871 | ifneq ($(sdk_repo_goal),) 1872 | include $(TOPDIR)development/build/tools/sdk_repo.mk 1873 | endif 1874 | -------------------------------------------------------------------------------- /build_core_clear_vars_mk: -------------------------------------------------------------------------------- 1 | ########################################################### 2 | ## Clear out values of all variables used by rule templates. 3 | ########################################################### 4 | 5 | LOCAL_MODULE:= 6 | LOCAL_MODULE_PATH:= 7 | LOCAL_MODULE_RELATIVE_PATH := 8 | LOCAL_MODULE_STEM:= 9 | LOCAL_DONT_CHECK_MODULE:= 10 | LOCAL_CHECKED_MODULE:= 11 | LOCAL_BUILT_MODULE:= 12 | LOCAL_BUILT_MODULE_STEM:= 13 | OVERRIDE_BUILT_MODULE_PATH:= 14 | LOCAL_INSTALLED_MODULE:= 15 | LOCAL_INSTALLED_MODULE_STEM:= 16 | LOCAL_PICKUP_FILES:= 17 | LOCAL_UNINSTALLABLE_MODULE:= 18 | LOCAL_INTERMEDIATE_TARGETS:= 19 | LOCAL_UNSTRIPPED_PATH:= 20 | LOCAL_MODULE_CLASS:= 21 | LOCAL_MODULE_SUFFIX:= 22 | LOCAL_PACKAGE_NAME:= 23 | LOCAL_OVERRIDES_PACKAGES:= 24 | LOCAL_EXPORT_PACKAGE_RESOURCES:= 25 | LOCAL_MANIFEST_PACKAGE_NAME:= 26 | LOCAL_PACKAGE_SPLITS:= 27 | LOCAL_REQUIRED_MODULES:= 28 | LOCAL_ACP_UNAVAILABLE:= 29 | LOCAL_MODULE_TAGS:= 30 | LOCAL_SRC_FILES:= 31 | LOCAL_PREBUILT_OBJ_FILES:= 32 | LOCAL_STATIC_JAVA_LIBRARIES:= 33 | LOCAL_STATIC_JAVA_AAR_LIBRARIES:= 34 | LOCAL_STATIC_LIBRARIES:= 35 | # Group static libraries with "-Wl,--start-group" and "-Wl,--end-group" when linking. 36 | LOCAL_GROUP_STATIC_LIBRARIES:= 37 | LOCAL_WHOLE_STATIC_LIBRARIES:= 38 | LOCAL_SHARED_LIBRARIES:= 39 | LOCAL_IS_HOST_MODULE:= 40 | LOCAL_CC:= 41 | LOCAL_CXX:= 42 | LOCAL_CPP_EXTENSION:= 43 | LOCAL_NO_DEFAULT_COMPILER_FLAGS:= 44 | LOCAL_FDO_SUPPORT:= 45 | LOCAL_ARM_MODE:= 46 | LOCAL_YACCFLAGS:= 47 | LOCAL_ASFLAGS:= 48 | LOCAL_CFLAGS:= 49 | LOCAL_CPPFLAGS:= 50 | LOCAL_CLANG_ASFLAGS:= 51 | LOCAL_CLANG_CFLAGS:= 52 | LOCAL_CLANG_CONLYFLAGS:= 53 | LOCAL_CLANG_CPPFLAGS:= 54 | LOCAL_CONLYFLAGS:= 55 | LOCAL_RTTI_FLAG:= 56 | LOCAL_C_INCLUDES:= 57 | LOCAL_EXPORT_C_INCLUDE_DIRS:= 58 | LOCAL_LDFLAGS:= 59 | LOCAL_CLANG_LDFLAGS:= 60 | LOCAL_LDLIBS:= 61 | LOCAL_AAPT_FLAGS:= 62 | LOCAL_AAPT_INCLUDE_ALL_RESOURCES:= 63 | LOCAL_SYSTEM_SHARED_LIBRARIES:=none 64 | LOCAL_PREBUILT_LIBS:= 65 | LOCAL_PREBUILT_EXECUTABLES:= 66 | LOCAL_PREBUILT_JAVA_LIBRARIES:= 67 | LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES:= 68 | LOCAL_PREBUILT_STRIP_COMMENTS:= 69 | LOCAL_INTERMEDIATE_SOURCES:= 70 | LOCAL_INTERMEDIATE_SOURCE_DIR:= 71 | LOCAL_JAVACFLAGS:= 72 | LOCAL_JAVA_LIBRARIES:= 73 | LOCAL_JAVA_LAYERS_FILE:= 74 | LOCAL_NO_STANDARD_LIBRARIES:= 75 | LOCAL_CLASSPATH:= 76 | LOCAL_JACK_CLASSPATH:= 77 | LOCAL_DROIDDOC_USE_STANDARD_DOCLET:= 78 | LOCAL_DROIDDOC_SOURCE_PATH:= 79 | LOCAL_DROIDDOC_TEMPLATE_DIR:= 80 | LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:= 81 | LOCAL_DROIDDOC_ASSET_DIR:= 82 | LOCAL_DROIDDOC_CUSTOM_ASSET_DIR:= 83 | LOCAL_DROIDDOC_OPTIONS:= 84 | LOCAL_DROIDDOC_HTML_DIR:= 85 | LOCAL_ADDITIONAL_HTML_DIR:= 86 | LOCAL_ASSET_DIR:= 87 | LOCAL_RESOURCE_DIR:= 88 | LOCAL_JAVA_RESOURCE_DIRS:= 89 | LOCAL_JAVA_RESOURCE_FILES:= 90 | LOCAL_GENERATED_SOURCES:= 91 | LOCAL_COPY_HEADERS_TO:= 92 | LOCAL_COPY_HEADERS:= 93 | LOCAL_FORCE_STATIC_EXECUTABLE:= 94 | LOCAL_ADDITIONAL_DEPENDENCIES:= 95 | LOCAL_STRIP_MODULE:= 96 | LOCAL_PACK_MODULE_RELOCATIONS:= 97 | LOCAL_JNI_SHARED_LIBRARIES:= 98 | LOCAL_JNI_SHARED_LIBRARIES_ABI:= 99 | LOCAL_PREBUILT_JNI_LIBS:= 100 | LOCAL_JAR_MANIFEST:= 101 | LOCAL_INSTRUMENTATION_FOR:= 102 | LOCAL_APK_LIBRARIES:= 103 | LOCAL_RES_LIBRARIES:= 104 | LOCAL_MANIFEST_INSTRUMENTATION_FOR:= 105 | LOCAL_AIDL_INCLUDES:= 106 | LOCAL_JARJAR_RULES:= 107 | LOCAL_ADDITIONAL_JAVA_DIR:= 108 | LOCAL_ALLOW_UNDEFINED_SYMBOLS:= 109 | LOCAL_DX_FLAGS:= 110 | LOCAL_JACK_ENABLED:=$(DEFAULT_JACK_ENABLED) # '' (ie disabled), disabled, full, incremental 111 | LOCAL_JACK_VM_ARGS := $(DEFAULT_JACK_VM_ARGS) 112 | LOCAL_JACK_EXTRA_ARGS := $(DEFAULT_JACK_EXTRA_ARGS) 113 | LOCAL_JACK_FLAGS:= 114 | LOCAL_JILL_FLAGS:= 115 | LOCAL_CERTIFICATE:= 116 | LOCAL_SDK_VERSION:= 117 | LOCAL_SDK_RES_VERSION:= 118 | LOCAL_NDK_STL_VARIANT:= 119 | LOCAL_EMMA_INSTRUMENT:= 120 | LOCAL_PROGUARD_ENABLED:= # '',full,custom,nosystem,disabled,obfuscation,optimization 121 | LOCAL_PROGUARD_FLAGS:= 122 | LOCAL_JACK_PROGUARD_FLAGS:= 123 | LOCAL_PROGUARD_FLAG_FILES:= 124 | LOCAL_TEST_MODULE_TO_PROGUARD_WITH:= 125 | LOCAL_EMMA_COVERAGE_FILTER:= 126 | LOCAL_WARNINGS_ENABLE:= 127 | LOCAL_FULL_MANIFEST_FILE:= 128 | LOCAL_MANIFEST_FILE:= 129 | LOCAL_FULL_LIBS_MANIFEST_FILES:= 130 | LOCAL_RENDERSCRIPT_INCLUDES:= 131 | LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE:= 132 | LOCAL_RENDERSCRIPT_CC:= 133 | LOCAL_RENDERSCRIPT_COMPATIBILITY:= 134 | LOCAL_RENDERSCRIPT_FLAGS:= 135 | LOCAL_RENDERSCRIPT_SKIP_INSTALL:= 136 | LOCAL_RENDERSCRIPT_TARGET_API:= 137 | LOCAL_DEX_PREOPT:= # '',true,false,nostripping 138 | LOCAL_DEX_PREOPT_IMAGE_LOCATION:= 139 | LOCAL_DEX_PREOPT_FLAGS:= 140 | LOCAL_PROTOC_OPTIMIZE_TYPE:= # lite(default),micro,nano,full,nanopb-c,nanopb-c-enable_malloc 141 | LOCAL_PROTOC_FLAGS:= 142 | LOCAL_PROTO_JAVA_OUTPUT_PARAMS:= 143 | LOCAL_NO_CRT:= 144 | LOCAL_NO_LIBGCC:= 145 | LOCAL_PROPRIETARY_MODULE:= 146 | LOCAL_OEM_MODULE:= 147 | LOCAL_ODM_MODULE:= 148 | LOCAL_PRIVILEGED_MODULE:= 149 | LOCAL_MODULE_OWNER:= 150 | LOCAL_CTS_TEST_PACKAGE:= 151 | LOCAL_CTS_TEST_RUNNER:= 152 | LOCAL_CLANG:= 153 | LOCAL_ADDRESS_SANITIZER:= 154 | LOCAL_JAR_EXCLUDE_FILES:= 155 | LOCAL_JAR_PACKAGES:= 156 | LOCAL_JAR_EXCLUDE_PACKAGES:= 157 | LOCAL_LINT_FLAGS:= 158 | LOCAL_SOURCE_FILES_ALL_GENERATED:= # '',true 159 | # Don't delete the META_INF dir when merging static Java libraries. 160 | LOCAL_DONT_DELETE_JAR_META_INF:= 161 | LOCAL_DONT_DELETE_JAR_DIRS:= 162 | LOCAL_ADDITIONAL_CERTIFICATES:= 163 | LOCAL_PREBUILT_MODULE_FILE:= 164 | LOCAL_POST_LINK_CMD:= 165 | LOCAL_POST_INSTALL_CMD:= 166 | LOCAL_DIST_BUNDLED_BINARIES:= 167 | LOCAL_HAL_STATIC_LIBRARIES:= 168 | LOCAL_RMTYPEDEFS:= 169 | LOCAL_NO_SYNTAX_CHECK:= 170 | LOCAL_NO_STATIC_ANALYZER:= 171 | LOCAL_32_BIT_ONLY:= # '',true 172 | LOCAL_MULTILIB:= 173 | LOCAL_MODULE_TARGET_ARCH:= 174 | LOCAL_MODULE_TARGET_ARCH_WARN:= 175 | LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH:= 176 | LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN:= 177 | LOCAL_MODULE_HOST_ARCH:= 178 | LOCAL_NO_FPIE := 179 | LOCAL_CXX_STL := default 180 | LOCAL_NATIVE_COVERAGE := 181 | LOCAL_DPI_VARIANTS:= 182 | LOCAL_DPI_FILE_STEM:= 183 | LOCAL_SANITIZE:= 184 | 185 | # arch specific variables 186 | LOCAL_SRC_FILES_$(TARGET_ARCH):= 187 | LOCAL_CFLAGS_$(TARGET_ARCH):= 188 | LOCAL_CLANG_CFLAGS_$(TARGET_ARCH):= 189 | LOCAL_CPPFLAGS_$(TARGET_ARCH):= 190 | LOCAL_CLANG_CPPFLAGS_$(TARGET_ARCH):= 191 | LOCAL_C_INCLUDES_$(TARGET_ARCH):= 192 | LOCAL_ASFLAGS_$(TARGET_ARCH):= 193 | LOCAL_CLANG_ASFLAGS_$(TARGET_ARCH):= 194 | LOCAL_NO_CRT_$(TARGET_ARCH):= 195 | LOCAL_LDFLAGS_$(TARGET_ARCH):= 196 | LOCAL_CLANG_LDFLAGS_$(TARGET_ARCH):= 197 | LOCAL_SHARED_LIBRARIES_$(TARGET_ARCH):= 198 | LOCAL_STATIC_LIBRARIES_$(TARGET_ARCH):= 199 | LOCAL_WHOLE_STATIC_LIBRARIES_$(TARGET_ARCH):= 200 | LOCAL_GENERATED_SOURCES_$(TARGET_ARCH):= 201 | LOCAL_REQUIRED_MODULES_$(TARGET_ARCH):= 202 | LOCAL_CLANG_$(TARGET_ARCH):= 203 | LOCAL_PREBUILT_JNI_LIBS_$(TARGET_ARCH):= 204 | ifdef TARGET_2ND_ARCH 205 | LOCAL_SRC_FILES_$(TARGET_2ND_ARCH):= 206 | LOCAL_CFLAGS_$(TARGET_2ND_ARCH):= 207 | LOCAL_CLANG_CFLAGS_$(TARGET_2ND_ARCH):= 208 | LOCAL_CPPFLAGS_$(TARGET_2ND_ARCH):= 209 | LOCAL_CLANG_CPPFLAGS_$(TARGET_2ND_ARCH):= 210 | LOCAL_C_INCLUDES_$(TARGET_2ND_ARCH):= 211 | LOCAL_ASFLAGS_$(TARGET_2ND_ARCH):= 212 | LOCAL_CLANG_ASFLAGS_$(TARGET_2ND_ARCH):= 213 | LOCAL_NO_CRT_$(TARGET_2ND_ARCH):= 214 | LOCAL_LDFLAGS_$(TARGET_2ND_ARCH):= 215 | LOCAL_CLANG_LDFLAGS_$(TARGET_2ND_ARCH):= 216 | LOCAL_SHARED_LIBRARIES_$(TARGET_2ND_ARCH):= 217 | LOCAL_STATIC_LIBRARIES_$(TARGET_2ND_ARCH):= 218 | LOCAL_WHOLE_STATIC_LIBRARIES_$(TARGET_2ND_ARCH):= 219 | LOCAL_GENERATED_SOURCES_$(TARGET_2ND_ARCH):= 220 | LOCAL_REQUIRED_MODULES_$(TARGET_2ND_ARCH):= 221 | LOCAL_CLANG_$(TARGET_2ND_ARCH):= 222 | LOCAL_PREBUILT_JNI_LIBS_$(TARGET_2ND_ARCH):= 223 | endif 224 | LOCAL_SRC_FILES_$(HOST_ARCH):= 225 | LOCAL_CFLAGS_$(HOST_ARCH):= 226 | LOCAL_CLANG_CFLAGS_$(HOST_ARCH):= 227 | LOCAL_CPPFLAGS_$(HOST_ARCH):= 228 | LOCAL_CLANG_CPPFLAGS_$(HOST_ARCH):= 229 | LOCAL_C_INCLUDES_$(HOST_ARCH):= 230 | LOCAL_ASFLAGS_$(HOST_ARCH):= 231 | LOCAL_CLANG_ASFLAGS_$(HOST_ARCH):= 232 | LOCAL_NO_CRT_$(HOST_ARCH):= 233 | LOCAL_LDFLAGS_$(HOST_ARCH):= 234 | LOCAL_CLANG_LDFLAGS_$(HOST_ARCH):= 235 | LOCAL_SHARED_LIBRARIES_$(HOST_ARCH):= 236 | LOCAL_STATIC_LIBRARIES_$(HOST_ARCH):= 237 | LOCAL_WHOLE_STATIC_LIBRARIES_$(HOST_ARCH):= 238 | LOCAL_GENERATED_SOURCES_$(HOST_ARCH):= 239 | LOCAL_REQUIRED_MODULES_$(HOST_ARCH):= 240 | LOCAL_CLANG_$(HOST_ARCH):= 241 | ifdef HOST_2ND_ARCH 242 | LOCAL_SRC_FILES_$(HOST_2ND_ARCH):= 243 | LOCAL_CFLAGS_$(HOST_2ND_ARCH):= 244 | LOCAL_CLANG_CFLAGS_$(HOST_2ND_ARCH):= 245 | LOCAL_CPPFLAGS_$(HOST_2ND_ARCH):= 246 | LOCAL_CLANG_CPPFLAGS_$(HOST_2ND_ARCH):= 247 | LOCAL_C_INCLUDES_$(HOST_2ND_ARCH):= 248 | LOCAL_ASFLAGS_$(HOST_2ND_ARCH):= 249 | LOCAL_CLANG_ASFLAGS_$(HOST_2ND_ARCH):= 250 | LOCAL_NO_CRT_$(HOST_2ND_ARCH):= 251 | LOCAL_LDFLAGS_$(HOST_2ND_ARCH):= 252 | LOCAL_CLANG_LDFLAGS_$(HOST_2ND_ARCH):= 253 | LOCAL_SHARED_LIBRARIES_$(HOST_2ND_ARCH):= 254 | LOCAL_STATIC_LIBRARIES_$(HOST_2ND_ARCH):= 255 | LOCAL_WHOLE_STATIC_LIBRARIES_$(HOST_2ND_ARCH):= 256 | LOCAL_GENERATED_SOURCES_$(HOST_2ND_ARCH):= 257 | LOCAL_REQUIRED_MODULES_$(HOST_2ND_ARCH):= 258 | LOCAL_CLANG_$(HOST_2ND_ARCH):= 259 | endif 260 | 261 | LOCAL_SRC_FILES_32:= 262 | LOCAL_SRC_FILES_64:= 263 | LOCAL_SHARED_LIBRARIES_32:= 264 | LOCAL_SHARED_LIBRARIES_64:= 265 | LOCAL_STATIC_LIBRARIES_32:= 266 | LOCAL_STATIC_LIBRARIES_64:= 267 | LOCAL_WHOLE_STATIC_LIBRARIES_32:= 268 | LOCAL_WHOLE_STATIC_LIBRARIES_64:= 269 | LOCAL_GENERATED_SOURCES_32:= 270 | LOCAL_GENERATED_SOURCES_64:= 271 | LOCAL_CFLAGS_32:= 272 | LOCAL_CFLAGS_64:= 273 | LOCAL_CPPFLAGS_32:= 274 | LOCAL_CPPFLAGS_64:= 275 | LOCAL_LDFLAGS_32:= 276 | LOCAL_LDFLAGS_64:= 277 | LOCAL_ASFLAGS_32:= 278 | LOCAL_ASFLAGS_64:= 279 | LOCAL_CLANG_CFLAGS_32:= 280 | LOCAL_CLANG_CFLAGS_64:= 281 | LOCAL_CLANG_CPPFLAGS_32:= 282 | LOCAL_CLANG_CPPFLAGS_64:= 283 | LOCAL_CLANG_LDFLAGS_32:= 284 | LOCAL_CLANG_LDFLAGS_64:= 285 | LOCAL_CLANG_ASFLAGS_32:= 286 | LOCAL_CLANG_ASFLAGS_64:= 287 | LOCAL_C_INCLUDES_32:= 288 | LOCAL_C_INCLUDES_64:= 289 | LOCAL_MODULE_PATH_32:= 290 | LOCAL_MODULE_PATH_64:= 291 | LOCAL_MODULE_STEM_32:= 292 | LOCAL_MODULE_STEM_64:= 293 | LOCAL_CLANG_32:= 294 | LOCAL_CLANG_64:= 295 | 296 | # Trim MAKEFILE_LIST so that $(call my-dir) doesn't need to 297 | # iterate over thousands of entries every time. 298 | # Leave the current makefile to make sure we don't break anything 299 | # that expects to be able to find the name of the current makefile. 300 | MAKEFILE_LIST := $(lastword $(MAKEFILE_LIST)) 301 | -------------------------------------------------------------------------------- /build_output_contents.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davisRoman/aosp-research/4e390c88589c6820f46b4472b7e2ca996a5a265a/build_output_contents.png -------------------------------------------------------------------------------- /build_target_board_generic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davisRoman/aosp-research/4e390c88589c6820f46b4472b7e2ca996a5a265a/build_target_board_generic.png -------------------------------------------------------------------------------- /build_target_product_AndroidProducts.mk: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (C) 2008 The Android Open Source Project 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | # 16 | 17 | # 18 | # This file should set PRODUCT_MAKEFILES to a list of product makefiles 19 | # to expose to the build system. LOCAL_DIR will already be set to 20 | # the directory containing this file. 21 | # PRODUCT_MAKEFILES is set up in AndroidProducts.mks. 22 | # Format of PRODUCT_MAKEFILES: 23 | # : 24 | # If the is the same as the base file name (without dir 25 | # and the .mk suffix) of the product makefile, ":" can be 26 | # omitted. 27 | # 28 | # This file may not rely on the value of any variable other than 29 | # LOCAL_DIR; do not use any conditionals, and do not look up the 30 | # value of any variable that isn't set in this file or in a file that 31 | # it includes. 32 | # 33 | 34 | # Unbundled apps will be built with the most generic product config. 35 | ifneq ($(TARGET_BUILD_APPS),) 36 | PRODUCT_MAKEFILES := \ 37 | $(LOCAL_DIR)/aosp_arm.mk \ 38 | $(LOCAL_DIR)/full.mk \ 39 | $(LOCAL_DIR)/generic_armv5.mk \ 40 | $(LOCAL_DIR)/aosp_x86.mk \ 41 | $(LOCAL_DIR)/full_x86.mk \ 42 | $(LOCAL_DIR)/aosp_mips.mk \ 43 | $(LOCAL_DIR)/full_mips.mk \ 44 | $(LOCAL_DIR)/aosp_arm64.mk \ 45 | $(LOCAL_DIR)/aosp_mips64.mk \ 46 | $(LOCAL_DIR)/aosp_x86_64.mk 47 | else 48 | PRODUCT_MAKEFILES := \ 49 | $(LOCAL_DIR)/core.mk \ 50 | $(LOCAL_DIR)/generic.mk \ 51 | $(LOCAL_DIR)/generic_x86.mk \ 52 | $(LOCAL_DIR)/generic_mips.mk \ 53 | $(LOCAL_DIR)/aosp_arm.mk \ 54 | $(LOCAL_DIR)/full.mk \ 55 | $(LOCAL_DIR)/aosp_x86.mk \ 56 | $(LOCAL_DIR)/full_x86.mk \ 57 | $(LOCAL_DIR)/aosp_mips.mk \ 58 | $(LOCAL_DIR)/full_mips.mk \ 59 | $(LOCAL_DIR)/aosp_arm64.mk \ 60 | $(LOCAL_DIR)/aosp_mips64.mk \ 61 | $(LOCAL_DIR)/aosp_x86_64.mk \ 62 | $(LOCAL_DIR)/full_x86_64.mk \ 63 | $(LOCAL_DIR)/sdk_phone_armv7.mk \ 64 | $(LOCAL_DIR)/sdk_phone_x86.mk \ 65 | $(LOCAL_DIR)/sdk_phone_mips.mk \ 66 | $(LOCAL_DIR)/sdk_phone_arm64.mk \ 67 | $(LOCAL_DIR)/sdk_phone_x86_64.mk \ 68 | $(LOCAL_DIR)/sdk_phone_mips64.mk \ 69 | $(LOCAL_DIR)/sdk.mk \ 70 | $(LOCAL_DIR)/sdk_x86.mk \ 71 | $(LOCAL_DIR)/sdk_mips.mk \ 72 | $(LOCAL_DIR)/sdk_arm64.mk \ 73 | $(LOCAL_DIR)/sdk_x86_64.mk 74 | endif 75 | -------------------------------------------------------------------------------- /buildspec.mk.default: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (C) 2007 The Android Open Source Project 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | # 16 | 17 | ###################################################################### 18 | # This is a do-nothing template file. To use it, copy it to a file 19 | # named "buildspec.mk" in the root directory, and uncomment or change 20 | # the variables necessary for your desired configuration. The file 21 | # "buildspec.mk" should never be checked in to source control. 22 | ###################################################################### 23 | 24 | # Choose a product to build for. Look in the products directory for ones 25 | # that work. 26 | ifndef TARGET_PRODUCT 27 | #TARGET_PRODUCT:=generic 28 | endif 29 | 30 | # Choose a variant to build. If you don't pick one, the default is eng. 31 | # User is what we ship. Userdebug is that, with a few flags turned on 32 | # for debugging. Eng has lots of extra tools for development. 33 | ifndef TARGET_BUILD_VARIANT 34 | #TARGET_BUILD_VARIANT:=user 35 | #TARGET_BUILD_VARIANT:=userdebug 36 | #TARGET_BUILD_VARIANT:=eng 37 | endif 38 | 39 | # Choose additional targets to always install, even when building 40 | # minimal targets like "make droid". This takes simple target names 41 | # like "Browser" or "MyApp", the names used by LOCAL_MODULE or 42 | # LOCAL_PACKAGE_NAME. Modules listed here will always be installed in 43 | # /system, even if they'd usually go in /data. 44 | ifndef CUSTOM_MODULES 45 | #CUSTOM_MODULES:= 46 | endif 47 | 48 | # Set this to debug or release if you care. Otherwise, it defaults to release. 49 | ifndef TARGET_BUILD_TYPE 50 | #TARGET_BUILD_TYPE:=release 51 | endif 52 | 53 | # Uncomment this if you want the host tools built in debug mode. Otherwise 54 | # it defaults to release. 55 | ifndef HOST_BUILD_TYPE 56 | #HOST_BUILD_TYPE:=debug 57 | endif 58 | 59 | # Turn on debugging for selected modules. If DEBUG_MODULE_ is set 60 | # to a non-empty value, the appropriate HOST_/TARGET_CUSTOM_DEBUG_CFLAGS 61 | # will be added to LOCAL_CFLAGS when building the module. 62 | #DEBUG_MODULE_ModuleName:=true 63 | 64 | # Specify an alternative tool chain prefix if needed. 65 | #TARGET_TOOLS_PREFIX:= 66 | 67 | # Specify the extra CFLAGS to use when building a module whose 68 | # DEBUG_MODULE_ variable is set. Host and device flags are handled 69 | # separately. 70 | #HOST_CUSTOM_DEBUG_CFLAGS:= 71 | #TARGET_CUSTOM_DEBUG_CFLAGS:= 72 | 73 | # Choose additional locales, like "en_US" or "it_IT", to add to any 74 | # built product. Any locales that appear in CUSTOM_LOCALES but not in 75 | # the locale list for the selected product will be added to the end 76 | # of PRODUCT_LOCALES. 77 | ifndef CUSTOM_LOCALES 78 | #CUSTOM_LOCALES:= 79 | endif 80 | 81 | # If you have a special place to put your ouput files, set this, otherwise 82 | # it goes to /out 83 | #OUT_DIR:=/tmp/stuff 84 | 85 | # If you want to always set certain system properties, add them to this list. 86 | # E.g., "ADDITIONAL_BUILD_PROPERTIES += ro.prop1=5 prop2=value" 87 | # This mechanism does not currently support values containing spaces. 88 | #ADDITIONAL_BUILD_PROPERTIES += 89 | 90 | # If you want to reduce the system.img size by several meg, and are willing to 91 | # lose access to CJK (and other) character sets, define NO_FALLBACK_FONT:=true 92 | ifndef NO_FALLBACK_FONT 93 | #NO_FALLBACK_FONT:=true 94 | endif 95 | 96 | # OVERRIDE_RUNTIMES allows you to locally override PRODUCT_RUNTIMES. 97 | # 98 | # To only build ART, use "runtime_libart_default" 99 | # To use Dalvik but also include ART, use "runtime_libdvm_default runtime_libart" 100 | # To use ART but also include Dalvik, use "runtime_libart_default runtime_libdvm" 101 | ifndef OVERRIDE_RUNTIMES 102 | #OVERRIDE_RUNTIMES:=runtime_libart_default 103 | #OVERRIDE_RUNTIMES:=runtime_libdvm_default runtime_libart 104 | #OVERRIDE_RUNTIMES:=runtime_libart_default runtime_libdvm 105 | endif 106 | 107 | # when the build system changes such that this file must be updated, this 108 | # variable will be changed. After you have modified this file with the new 109 | # changes (see buildspec.mk.default), update this to the new value from 110 | # buildspec.mk.default. 111 | BUILD_ENV_SEQUENCE_NUMBER := 10 112 | --------------------------------------------------------------------------------