Attend XDA's Second Annual Developer Conference, XDA:DevCon 2014!
5,740,095 Members 40,702 Now Online
XDA Developers Android and Mobile Development Forum
View Poll Results: What is your favorite custom ROM?
CyanogenMod 129 38.51%
AOKP 19 5.67%
Paranoid Android 58 17.31%
PAC 34 10.15%
Omni 26 7.76%
Other 69 20.60%
Voters: 335. You may not vote on this poll

[GUIDE][Step-by-Step] Build ROM from source

Tip us?
 
Haze028
Old
(Last edited by Haze028; 14th March 2014 at 04:00 PM.) Reason: just updating things...
#1  
Haze028's Avatar
Senior Member - OP
Thanks Meter 437
Posts: 413
Join Date: Jun 2011
Tutorial [GUIDE][Step-by-Step] Build ROM from source

I put this tutorial together in an attempt to create the most complete and easy to follow guide for building a ROM from source. Including steps for adding apps to your build, changing toolchains and more... The entire guide uses a single Linux terminal window from start to finish in an attempt to keep everything as user friendly as possible. Please feel free to PM me suggestions on where changes need be made.

If you find this guide helpful please press the Thanks button on my posts and rate the thread a 5.


Prerequisites

1. This guide is for Ubuntu 12+ based machine, I run Linux Mint 15. Follow links at end of OP for alternate directions
Windows Users: Setup Ubuntu in Virtualbox Instructions

2. You need to know the location for your device, vendor, and kernel repos. This can be found fairly easily in the forum for your phone. Also take note of your phones codename.
For example the Optimus G is the gee and its repos can be found here https://github.com/TeamPlaceholder

Note*All terminal commands will be in Code boxes*

Part 1 - Setting Up The Build Environment


Install Java JDK
Code:
Select Code
sudo add-apt-repository ppa:webupd8team/java
Code:
Select Code
sudo apt-get update
Code:
Select Code
sudo apt-get install oracle-java6-installer
Installing required packages
Code:
Select Code
sudo apt-get install git gnupg flex bison gperf build-essential \
  zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
  libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
  libgl1-mesa-dev g++-multilib mingw32 tofrodos \
  python-markdown libxml2-utils xsltproc zlib1g-dev:i386
Code:
Select Code
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
Set-up ccache This Is Optional
Code:
Select Code
nano ~/.bashrc
Add these two lines
Quote:
export USE_CCACHE=1
export CCACHE_DIR=<path-to-your-cache-directory>
Save and exit by pressing ctrl+x, selecting Y then enter.

Install ADB & Fastboot This is optional, as you may already have them working. If not, they're a good thing to have.
Code:
Select Code
sudo add-apt-repository ppa:nilarimogard/webupd8
Code:
Select Code
sudo apt-get update
Code:
Select Code
sudo apt-get install android-tools-adb android-tools-fastboot
Setup Repo
Code:
Select Code
mkdir ~/bin
Code:
Select Code
PATH=~/bin:$PATH
Code:
Select Code
curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
Code:
Select Code
chmod a+x ~/bin/repo
Create working directory
Code:
Select Code
mkdir working-dir
(Replace working-dir with whatever you'd like to call it, ie. aokp)
Code:
Select Code
cd working-dir
Part 2 - Get Source

ROM Source
Choose which custom rom you are going to build and initialize the repo for it
Code:
Select Code
repo init -u chosen-manifest
(Replace chosen-manifest appropriately from the list below)
Quote:
AOKP: https://github.com/AOKP/platform_manifest.git -b Branch
Cyanogenmod: https://github.com/CyanogenMod/android.git -b Branch
CarbonDev: https://github.com/CarbonDev/android.git -b Branch
Liquid Smooth: https://github.com/LiquidSmooth/android.git -b Branch
Replace Branch with appropriate branch from github repo ie cm-10.2 or jb3
If unsure which branch click the link above to locate appropriate branch
Device Source
Go HERE and follow instructions on obtaining your device specific repos.

Sync the repo
Code:
Select Code
repo sync
This will take a while as it downloads all the required source
Part 3 - Preparing Source

Before you're ready to build your source needs to be configured to include your device. This preparation varies slightly for different custom Roms.
Go HERE and follow instructions for your ROM choice

Part 4 - Edit Source

This Is Optional

This is where you can make edits to the source before building to suit your needs.
Go HERE and follow the instructions to tweak source

Part 5 - Building ROM

Code:
Select Code
. build/envsetup.sh
Code:
Select Code
lunch
Locate your device on the list and enter appropriate number
Code:
Select Code
make -j# otapackage
Replace # with the number of cores in your system (Is the number of jobs that will be done at once, more cores means more jobs)
Build Errors

This can be hard, especially if you're new to programming languages and building. Meet Google your new best friend.
Here is a basic overview to get you started, and if no more at least googling in the right direction.

Finished

When it's done you're rom will be in working-dir/out/target/product/codename/

Enjoy.

I used these sites while making this guide
http://source.android.com/source/initializing.html
http://www.webupd8.org/2012/11/oracl...available.html
http://www.webupd8.org/2012/08/insta...oid-tools.html
The Following 66 Users Say Thank You to Haze028 For This Useful Post: [ Click to Expand ]
 
Haze028
Old
(Last edited by Haze028; 14th March 2014 at 02:59 PM.) Reason: just updating things...
#2  
Haze028's Avatar
Senior Member - OP
Thanks Meter 437
Posts: 413
Join Date: Jun 2011
Device Source
As stated in the prerequisites you will need a device specific Device repo, Vendor repo, and Kernel repo. You can find links to them in the threads for your devices. Also take note of your device codename ie Nexus 4 is mako, Optimus G is gee.

There are two options for adding in device specific source, local manifest and git clone.
Note: The local path for your phone's repos should be device/manufacturer/codename, vendor/manufacturer/codename, kernel/manufacturer/codename regardless of method chosen.

Git Clone
Git clone is a one time download of a specific repo to the directory indicated and is not affected when a repo sync is run. This is probably the better choice if you make edits to the device source as they won't be over written or cause conflicts when syncing.
This method is used AFTER the inital rom source sync. Preform a repo sync before cloning repos
Code:
Select Code
git clone repo -b branch destination-path
here is and example for the vendor repo for the E973 from TeamPlaceHolder
Quote:
git clone https://github.com/TeamPlaceholder/p...vendor_lge_gee -b cm-10.2 vendor/lge/gee
Local Manifest
Local manifest syncs the device repos each time a repo sync is run. This is probably the better choice if you don't make edits and rely on the repo's maintainer for changes. Be wary making edits locally to the repos you list as a repo sync may overwrite your changes.
This method is used BEFORE the initial rom sync. This gets your device source during the first repo sync
Code:
Select Code
mkdir .repo/local_manifests
Code:
Select Code
touch .repo/local_manifests/local_manifest.xml
Code:
Select Code
nano .repo/local_manifests/local_manifest.xml
Add these lines:
Quote:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="name-for-remote" fetch="remote-url" />
<project path="destination-folder-path" name="repo-location" remote="name-for-remote" revision="branch" />
</manifest>
name-for-remote - Any name you want to give to identify the url where your repos are stored
remote-url - The url for the remote location your repos are stored
destination-folder-path - Where do you want this repo stored locally
repo-location - Where on the remote url is your repo stored
branch - The branch of the remote repo you are using
**You will need a project line for each repo you wish to add to the source. **

Here is an example for E973 using TeamPlaceHolder repos, adding all device/vendor/kernel repos.
Quote:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>

<remote name="gh"
fetch="git://github.com/" />

<project path="kernel/lge/gee" name="TeamPlaceholder/android_kernel_lge_gee" remote="gh" revision="cm-10.2-update" />
<project path="device/lge/geeb" name="TeamPlaceholder/android_device_lge_geeb" remote="gh" revision="cm-10.2" />
<project path="device/lge/gee-common" name="TeamPlaceholder/android_device_lge_gee-common" remote="gh" revision="cm-10.2" />
<project path="vendor/lge/gee" name="TeamPlaceholder/proprietary_vendor_lge_gee" remote="gh" revision="cm-10.2" />

</manifest>
The Following 33 Users Say Thank You to Haze028 For This Useful Post: [ Click to Expand ]
 
Haze028
Old
(Last edited by Haze028; 14th March 2014 at 03:11 PM.) Reason: just updating things...
#3  
Haze028's Avatar
Senior Member - OP
Thanks Meter 437
Posts: 413
Join Date: Jun 2011
Default Preparing Source

Preparing Source
ROM specific setup instructions prior to building. All source should be downloaded already.
All ROM setup is fairly similar,
1. You must add your device to the ROM's vendor repo(vendor/cm or vendor/aokp) This process is slightly different per rom. Look at how other devices are added in the vendor repo and emulate those.
2. A ROM specific makefile, again look at how other devices are added.
3. If building AOSP based ROMs, a pre-built kernel is generally required. Look here for instructions on how to compile a kernel separately.

Here are examples of how to set up AOKP or Carbon to build. Device used in example is Optimus G.
Manufacturer and codename MUST be updated to reflect your device.
AOKP
Code:
Select Code
nano vendor/aokp/vendorsetup.sh
Add this line
Quote:
add_lunch_combo aokp_geeb-userdebug
Save and exit by pressing ctrl+x, selecting Y then enter.
Code:
Select Code
touch vendor/aokp/products/geeb.mk
Code:
Select Code
nano vendor/aokp/products/geeb.mk
Add these lines
If building for CDMA network change gsm.mk to cdma.mk
Quote:
# Inherit AOSP device configuration for geeb
$(call inherit-product, device/lge/geeb/full_geeb.mk)

# Inherit AOKP common bits
$(call inherit-product, vendor/aokp/configs/common.mk)

# Inherit GSM common stuff
$(call inherit-product, vendor/aokp/configs/gsm.mk)

# Setup device specific product configuration
PRODUCT_NAME := aokp_geeb
PRODUCT_BRAND := google
PRODUCT_DEVICE := geeb
PRODUCT_MODEL := Optimus G
PRODUCT_MANUFACTURER := LGE
Save and exit by pressing ctrl+x, selecting Y then enter.
Code:
Select Code
nano vendor/aokp/products/AndroidProducts.mk
Add this line
Quote:
$(LOCAL_DIR)/geeb.mk \
Save and exit by pressing ctrl+x, selecting Y then enter.
CarbonDev
Code:
Select Code
nano vendor/carbon/vendorsetup.sh
Add this line
Quote:
add_lunch_combo carbon_geeb-userdebug

Once your device has been added you're ready to build! Go back to the OP and complete the guide from where you left off.
The Following 16 Users Say Thank You to Haze028 For This Useful Post: [ Click to Expand ]
 
houstonn
Old
#4  
houstonn's Avatar
Recognized Contributor
Thanks Meter 9691
Posts: 1,779
Join Date: Sep 2012
Location: Ontario

 
DONATE TO ME
good stuff haze
The Following 5 Users Say Thank You to houstonn For This Useful Post: [ Click to Expand ]
 
ATRIXXIRTA
Old
#5  
ATRIXXIRTA's Avatar
Senior Member
Thanks Meter 719
Posts: 2,356
Join Date: Mar 2012
Location: The Shangri-La Motel
AGREED!!
Phones: Motorola Atrix 4G ---> Samsung Galaxy Nexus (temporarily) ---> LG Optimus 3d ---> Samsung Galaxy SII LTE Skyrocket ---> LG Optimus G ---> Sony Xperia ZL ---> Motorola Moto G
My Roms/Ports: CarbonRom/CarbonClash (port): http://forum.xda-developers.com/show....php?t=2181390
Thanks: XDA and all its members. Without you I'd still be an uneducated bumpkin complaining about my shi**y phone.

 
geokilla
Old
#6  
geokilla's Avatar
Senior Member
Thanks Meter 268
Posts: 2,574
Join Date: Jun 2010
Location: Toronto
What bout building ROMs based on LG source? I'd rather see more LG based ROMs because the camera quality is higher, and a lot of AOSP/AOKP ROMs feel more or less the same.
LG Optimus G E971
ROM: Ported Korean Kit Kat by Paulicat

Google Nexus 4
ROM: Carbon 4.4.2

Google Nexus 7
ROM: Carbon 4.4.2
 
chadouming
Old
#7  
chadouming's Avatar
Senior Member
Thanks Meter 1675
Posts: 1,999
Join Date: Aug 2009
Location: On the interwebz
Quote:
Originally Posted by geokilla View Post
What bout building ROMs based on LG source? I'd rather see more LG based ROMs because the camera quality is higher, and a lot of AOSP/AOKP ROMs feel more or less the same.
Seriously ? Find me LG source to build a rom and I'll make you one.

@moderator.
Btw, This post and the previous should be removed, that thread locked to prevent post like these and pinned. thanks.
New? Read this post
Member of BBQTeam.
Offering you : BBQTools, OpenDesign and soon BBQDroid

<codeworkx> didn't look at it because i'm lazy.
The Following User Says Thank You to chadouming For This Useful Post: [ Click to Expand ]
 
d.terenzzo
Old
(Last edited by d.terenzzo; 12th April 2013 at 06:27 AM.)
#8  
Member
Thanks Meter 10
Posts: 76
Join Date: Aug 2012
Location: São Paulo
Quote:
Originally Posted by Haze028 View Post
Well I had put up build instructions for AOKP but thought I would generalize them so people could use them for other ROM bases. My therory is the more people that are trying to build, the more improvments/enhancements can be put forth to the OG community.
As I've stated before I do not consider myself a dev. So don't be afraid of giving this a try, even if you have little to no android building experience. The instructions are as step by step as I could make them, and I'll always try to help where I can.

When it's done you're rom will be in out/target/product/geeb/

I'm writing this now from memory, so if it doesn't work let me know so I may update accordingly

Enjoy.
It was what I'm looking for...

Thanks a lot..

Definitely I'll give a try!


Quote:
Originally Posted by chadouming View Post
Seriously ? Find me LG source to build a rom and I'll make you one.
@moderator.
Btw, This post and the previous should be removed, that thread locked to prevent post like these and pinned. thanks.
Why would want to lock the thread? How do we suppose to learning? I think @Haze purpose was opposite that you suggest, if we do not learn, we'll keeping ask you to change this, or do that instead to help you and even do some nice stuff.

Don't be like that be patience and share your great knowledge. I'm your fan.
 
Haze028
Old
#9  
Haze028's Avatar
Senior Member - OP
Thanks Meter 437
Posts: 413
Join Date: Jun 2011
Quote:
Originally Posted by d.terenzzo View Post
Why would want to lock the thread? How do we suppose to learning? I think @Haze purpose was opposite that you suggest, if we do not learn, we'll keeping ask you to change this, or do that instead to help you and even do some nice stuff.
Yeah, I don't think it should get locked, I started it to try to help people out, so they can get assistance through this thread with their builds. Being new to building myself, I have found that the issues, and resolutions to them, in similar threads to this to be a wealth of knowledge.
 
Recon Freak
Old
#10  
Recon Freak's Avatar
Senior Member
Thanks Meter 77
Posts: 287
Join Date: Jan 2010
Location: Evansville, IN
Default getting error

build/core/product_config.mk:239: *** _nic.PRODUCTS.[[vendor/aokp/products/geeb.mk]]: "device/lge/geeb/full_geeb.mk" does not exist. Stop.

** Don't have a product spec for: 'aokp_geeb'
** Do you have the right repo manifest?

Any idea what i missed?

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes