<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.openembedded.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mhatle</id>
	<title>Openembedded.org - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.openembedded.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mhatle"/>
	<link rel="alternate" type="text/html" href="https://www.openembedded.org/wiki/Special:Contributions/Mhatle"/>
	<updated>2026-05-04T20:34:25Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=OEDAM_2018&amp;diff=10183</id>
		<title>OEDAM 2018</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=OEDAM_2018&amp;diff=10183"/>
		<updated>2018-03-11T17:47:07Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Planning to Attend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Location and Time ==&lt;br /&gt;
&lt;br /&gt;
Sunday, 11 March 2018 (before ELC [March 12-14])&amp;lt;br&amp;gt;&lt;br /&gt;
Board meeting to happen before the event&lt;br /&gt;
Doors open at 10am&lt;br /&gt;
Developer&#039;s meeting to start at 10:30&lt;br /&gt;
Expectation is to finish by 1800&lt;br /&gt;
&lt;br /&gt;
For those who want to commute with Armin, Please meet in the Lobby in the Hilton&lt;br /&gt;
where ELC is hosted  at 9:30 am. I can only take 15.&lt;br /&gt;
&lt;br /&gt;
Lunch and coffee are provided by the Yocto Project.&lt;br /&gt;
&lt;br /&gt;
Location: Mentor Graphics Headquarters&lt;br /&gt;
8105 Boeckman Road, Wilsonville, OR&lt;br /&gt;
Evergreen Building, E2411 Training room&lt;br /&gt;
&lt;br /&gt;
Lunch location is McMenamins Old Church &amp;amp; Pub, 30340 SW Boones Ferry Rd, Wilsonville.&lt;br /&gt;
Lunch will be at about 12:45.&lt;br /&gt;
&lt;br /&gt;
Carpooling is encouraged, see below&lt;br /&gt;
&lt;br /&gt;
== Logistics ==&lt;br /&gt;
&lt;br /&gt;
Yes, we know it is Sunday. Best we could do this year.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Daylight Savings Time starts tomorrow&#039;&#039;&#039;, so be sure to roll your clocks FORWARD by an hour - so 10am is actually logical 9am. &lt;br /&gt;
&lt;br /&gt;
The planned start is 10:30. I am planning to arrive at 10am with coffee. It is roughly 1/2 hour drive from downtown, so please plan accordingly. &lt;br /&gt;
&lt;br /&gt;
Carpooling is highly encouraged. Armin has a van rented that can take up to 15. Jefro is already picking up 2 and has room for 1-2 more. If anyone else has a vehicle and can take people, please pipe up on the email thread or send email to jefro@jefro.net. Note that an uber or lyft will be a $35 trip from downtown.&lt;br /&gt;
&lt;br /&gt;
The day will need to end by 6pm. Jefro will be going back up to the Hilton at top speed to set up the Yocto booth.&lt;br /&gt;
&lt;br /&gt;
== Remote conference link ==&lt;br /&gt;
&lt;br /&gt;
If you are not able to be there in person, you can join this conference remotely over zoom.us:&lt;br /&gt;
&lt;br /&gt;
Join URL: https://zoom.us/j/347593211&lt;br /&gt;
&lt;br /&gt;
== Planning to Attend ==&lt;br /&gt;
&lt;br /&gt;
Carpool note: Please add a {#} after your name if you plan to drive and can take # of people in your car other than yourself&lt;br /&gt;
&lt;br /&gt;
* Jeff Osier-Mixon &amp;quot;Jefro&amp;quot; {4}&lt;br /&gt;
* Philip Balister (Crofton)&lt;br /&gt;
* Denys Dmytriyenko (denix)&lt;br /&gt;
* Sean Hudson (darknighte)&lt;br /&gt;
* Manjukumar Matha (manju)&lt;br /&gt;
* Joshua Watt (JPEWhacker)&lt;br /&gt;
* Zachary Booth&lt;br /&gt;
* Jim Lodes&lt;br /&gt;
* Armin Kuster (Armpit){15}&lt;br /&gt;
* Scott Murray (smurray)&lt;br /&gt;
* Tim Orling (moto-timo)&lt;br /&gt;
* Alejandro Hernandez (aehs29)&lt;br /&gt;
* Christopher Clark&lt;br /&gt;
* Behan Webster (behanw)&lt;br /&gt;
* Marek Vasut (Marex)&lt;br /&gt;
* Taras Kondratiuk&lt;br /&gt;
* Bill Mills&lt;br /&gt;
* Ricardo Salveti (rsalveti)&lt;br /&gt;
* Khem Raj (khem)&lt;br /&gt;
* Tom King (ka6sox)&lt;br /&gt;
* Rich Persaud&lt;br /&gt;
* Michael Halstead (halstead)&lt;br /&gt;
* Stephano Cetola (stephano) {1 + truck bed }&lt;br /&gt;
* Richard Purdie (RP)&lt;br /&gt;
* Marco Cavallini (mckoan)&lt;br /&gt;
* Mark Hatle (fray) {1}&lt;br /&gt;
&lt;br /&gt;
== Agenda Items ==&lt;br /&gt;
&lt;br /&gt;
=== OE Board ===&lt;br /&gt;
E.v status&lt;br /&gt;
&lt;br /&gt;
=== OE Developers Meeting ===&lt;br /&gt;
# State of the Union&lt;br /&gt;
## Discuss meta-oe release process&lt;br /&gt;
## World build monitoring and automatic notifications&lt;br /&gt;
# Topics from GA&lt;br /&gt;
## Introduction&lt;br /&gt;
### Quick agenda overview (Sean)&lt;br /&gt;
### Refer to https://www.openembedded.org/wiki/2018_02_General_Meeting&lt;br /&gt;
## Call for Topics at OEDAM in 2018-03 in Portland&lt;br /&gt;
####Refer to https://www.openembedded.org/wiki/OEDAM_2018&lt;br /&gt;
###Layer Quality (hatle)&lt;br /&gt;
###Splitting meta-oe if not resolved prior to meeting (armpit)&lt;br /&gt;
####Patch submissions (all OE components)&lt;br /&gt;
###REQUEST: Identify areas where we need maintainers to help&lt;br /&gt;
####ptest additions to meta-oe (timo)&lt;br /&gt;
###REQUEST: Could someone run through a simple example to help others learn to do this correctly&lt;br /&gt;
####OEQA testing&lt;br /&gt;
###Clear need for a quickstart guide (one-page recipe to get folks started quickly)&lt;br /&gt;
###Running tests (individual, groups, all)&lt;br /&gt;
###Connecting to a Machine ( h/w)(armpit)&lt;br /&gt;
###FOSDEM feedback (paulbarker)&lt;br /&gt;
###Auto Updater ( AUH)(armpit)???&lt;br /&gt;
# Logistics for OEDAM in 2018-03 in Portland&lt;br /&gt;
## Board will facilitate putting folks needing rides and folks with spots in their cars together. (see OEDAM wiki) &lt;br /&gt;
## Moped balance in question…  Carpooling recommended...&lt;br /&gt;
&lt;br /&gt;
== Minutes ==&lt;br /&gt;
&lt;br /&gt;
SHARED MINUTES AT&lt;br /&gt;
https://docs.google.com/document/d/1h_otwcH-6ej4URB5vER-7FpaPthrji3TpJWf5jAKRIk/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Prior minutes ===&lt;br /&gt;
&lt;br /&gt;
Minutes from Prague, Oct 2017:&lt;br /&gt;
https://docs.google.com/document/d/1R_pV_PumhZ9a8_aRDTuW7wBjqNwIDuau7FGr6sYYRu0/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
Minutes from Portland, Feb 2017:&lt;br /&gt;
https://docs.google.com/document/d/1ECCfBwdLUaW3I23RATWCU3kGnSh04Kv0DkH1_KfiLVA/edit?usp=sharing&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=OEDEM_2017&amp;diff=9745</id>
		<title>OEDEM 2017</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=OEDEM_2017&amp;diff=9745"/>
		<updated>2017-09-15T16:24:20Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Location and Time ==&lt;br /&gt;
&lt;br /&gt;
Sunday, 22 October 2017&amp;lt;br&amp;gt;&lt;br /&gt;
Start at 0900&lt;br /&gt;
&lt;br /&gt;
(before ELC-E [Oct 23-25])&lt;br /&gt;
&lt;br /&gt;
Yes, we know it is Sunday. Best we could do this year.&lt;br /&gt;
&lt;br /&gt;
NOTE: venue has changed, we are now at:&lt;br /&gt;
&lt;br /&gt;
JURY&#039;S INN Prague&lt;br /&gt;
Sokolovská 204/11, 186 00 &lt;br /&gt;
Praha 8-Florenc, Czechia&lt;br /&gt;
&lt;br /&gt;
This hotel is across the street from the Hilton (ELCE venue). If you have any difficulty please let [mailto:jefro@jefro.net jefro] know.&lt;br /&gt;
&lt;br /&gt;
== Attendees ==&lt;br /&gt;
&lt;br /&gt;
* Jeff Osier-Mixon &amp;quot;Jefro&amp;quot;&lt;br /&gt;
* Behan Webster (behanw)&lt;br /&gt;
* Philip Balister (Crofton)&lt;br /&gt;
* Martin Jansa (JaMa)&lt;br /&gt;
* Scott Murray (smurray)&lt;br /&gt;
* Peter Kjellerstedt (Saur)&lt;br /&gt;
* Armin Kuster (Armpit)&lt;br /&gt;
* Marco Cavallini (mckoan)&lt;br /&gt;
* Paul Barker (paulbarker)&lt;br /&gt;
* Myunghun Chun&lt;br /&gt;
* Changhyeok Bae (chbae)&lt;br /&gt;
* Adrian Ratiu (aratiu)&lt;br /&gt;
* Josef Holzmayr (LetoThe2nd)&lt;br /&gt;
* Jan Leupold&lt;br /&gt;
* Anders Darander &lt;br /&gt;
* Sean Hudson (darknighte)&lt;br /&gt;
* Tim Orling (moto-timo)&lt;br /&gt;
* Ricardo Ribalda (ribalda)&lt;br /&gt;
* Nicolas Dechesne (ndec)&lt;br /&gt;
* Richard Purdie (RP)&lt;br /&gt;
* Andrei Gherzan (agherzan)&lt;br /&gt;
* Denys Dmytriyenko (denix)&lt;br /&gt;
* Anton Gerasimov&lt;br /&gt;
* Rich Persaud&lt;br /&gt;
* Koen Kooi&lt;br /&gt;
* Marek Vasut (marex)&lt;br /&gt;
* Ruslan Bilovol&lt;br /&gt;
* Grygorii Tertychnyi&lt;br /&gt;
* Bruce Ashfield (zeddii)&lt;br /&gt;
* Mark Hatle (fray)&lt;br /&gt;
&lt;br /&gt;
NOTE: we will make every effort to provide a web/phone link for remote attendees&lt;br /&gt;
&lt;br /&gt;
== Agenda Items ==&lt;br /&gt;
&lt;br /&gt;
# Stack Overflow report (From someone who regularly watches stackoverflow)&lt;br /&gt;
# Demos for FOSDEM and other events. Good chance to (discretely) show your companies work. (Philip)&lt;br /&gt;
# Long-term releases support (more than one year)&lt;br /&gt;
# Automated CVE checking, issues with cve-check-tool, alternative tools&lt;br /&gt;
&lt;br /&gt;
== Minutes ==&lt;br /&gt;
&lt;br /&gt;
=== OEDEM: ===&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=TSC&amp;diff=9465</id>
		<title>TSC</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=TSC&amp;diff=9465"/>
		<updated>2017-05-03T13:23:20Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Members */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=OE Technical Steering Committee=&lt;br /&gt;
&lt;br /&gt;
The TSC consists of 5 people who are elected by, and ultimately be answerable to, the members of the OpenEmbedded organisation.&lt;br /&gt;
&lt;br /&gt;
Here is the [[TSCCharter | working copy]] of the new TSC charter.&lt;br /&gt;
&lt;br /&gt;
The TSC meets on an irregular basis, but is happy to hold meetings on request if there are issues to discuss.&lt;br /&gt;
&lt;br /&gt;
The TSC discusses technical issues for the direction of OpenEmbedded. Note that the TSC is NOT chartered with actually doing all of the work discussed, but they do make every effort to locate resources to do that work.&lt;br /&gt;
&lt;br /&gt;
= Members =&lt;br /&gt;
&lt;br /&gt;
In order by election:&lt;br /&gt;
&lt;br /&gt;
* Martin Jansa (JaMa) - re-elected May 2017&lt;br /&gt;
* Richard Purdie (RP) - re-elected May 2017&lt;br /&gt;
* Khem Raj (khem) - re-elected May 2017&lt;br /&gt;
* Paul Eggleton (bluelightning) - re-elected May 2017&lt;br /&gt;
* Mark Hatle (fray) - re-elected May 2017&lt;br /&gt;
&lt;br /&gt;
Each member serves a two-year term. During election time, one member may stand for election every two months.&lt;br /&gt;
&lt;br /&gt;
= Responsibilities =&lt;br /&gt;
&lt;br /&gt;
On a day-to-day basis the TSC is responsible for making&lt;br /&gt;
tactical policy decisions, resolving disputes between contributors,&lt;br /&gt;
administering access control to the git tree, and generally promoting&lt;br /&gt;
good development practice.&lt;br /&gt;
&lt;br /&gt;
= Decision Making =&lt;br /&gt;
&lt;br /&gt;
Decisions are made where necessary by majority vote. Once a decision is made by&lt;br /&gt;
the technical steering committee, the decision should be respected as a democratic decision.&lt;br /&gt;
&lt;br /&gt;
= TSC issue escalation procedure =&lt;br /&gt;
&lt;br /&gt;
The best way to agendize an issue for the TSC is to send email to one of the TSC members or to [mailto:jefro@jefro.net Jefro], the curator. The issue will be added to the agenda for the next meeting. If the issue is particularly urgent, a specific TSC meeting may be called.&lt;br /&gt;
&lt;br /&gt;
= TSC mailing list archive =&lt;br /&gt;
&lt;br /&gt;
http://lists.openembedded.org/pipermail/tsc/&lt;br /&gt;
&lt;br /&gt;
= Meeting Minutes =&lt;br /&gt;
&lt;br /&gt;
== 2013 Minutes ==&lt;br /&gt;
&lt;br /&gt;
* [http://lists.openembedded.org/pipermail/tsc/2013-February/000362.html 29 January 2013]&lt;br /&gt;
* [http://lists.openembedded.org/pipermail/tsc/2013-February/000363.html 12 February 2013]&lt;br /&gt;
* [http://lists.openembedded.org/pipermail/tsc/2013-March/000365.html 26 February 2013]&lt;br /&gt;
* [http://lists.openembedded.org/pipermail/tsc/2013-March/000366.html 19 March 2013]&lt;br /&gt;
* [http://lists.openembedded.org/pipermail/tsc/2013-April/000367.html 8 April 2013]&lt;br /&gt;
* [http://lists.openembedded.org/pipermail/tsc/2013-May/000368.html 23 April 2013]&lt;br /&gt;
* [http://lists.openembedded.org/pipermail/tsc/2013-May/00037.html 7 May 2013]&lt;br /&gt;
* [http://lists.openembedded.org/pipermail/tsc/2013-June/000372.html 21 May 2013]&lt;br /&gt;
* [http://lists.openembedded.org/pipermail/tsc/2013-June/000373.html 4 June 2013]&lt;br /&gt;
* [http://lists.openembedded.org/pipermail/tsc/2013-June/000381.html 18 June 2013]&lt;br /&gt;
* [http://lists.openembedded.org/pipermail/tsc/2013-August/000393.html 2 July 2013]&lt;br /&gt;
* 16 July 2013&lt;br /&gt;
* 30 July 2013 (public meeting)&lt;br /&gt;
* 13 August 2013 (cancelled)&lt;br /&gt;
* 27 August 2013&lt;br /&gt;
&lt;br /&gt;
== 2012 Minutes ==&lt;br /&gt;
&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-January/000330.html 3-Jan-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-January/000331.html 17-Jan-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-February/000332.html 30-Jan-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-March/000334.html 15-Feb-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-March/000335.html 28-Feb-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-March/000336.html 13-Mar-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-April/000337.html 27-Mar-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-April/000340.html 10-Apr-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-May/000342.html 24-Apr-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-May/000341.html 08-May-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-June/000343.html 22-May-2012]&lt;br /&gt;
* 5-Jun-2012 (no meeting)&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-June/000344.html 19-Jun-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-August/000346.html 3-Jul-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-August/000347.html 17-Jul-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-August/000348.html 31-Jul-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-August/000353.html 14-Aug-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-September/000354.html 28-Aug-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-September/000355.html 11-Sep-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-October/000356.html 25-Sep-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-October/000357.html 9-Oct-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-November/000358.html 23-Oct-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2012-December/000359.html 6-Nov-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2013-January/000360.html 20-Nov-2012]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2013-January/000361.html 4-Dec-2012]&lt;br /&gt;
&lt;br /&gt;
== 2011 Minutes ==&lt;br /&gt;
&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/openembedded-devel/2011-February/029974.html 14-Feb-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/openembedded-devel/2011-February/030355.html 21-Feb-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-March/000113.html 28-Feb-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-March/000192.html 10-Mar-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-March/000193.html 17-Mar-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-March/000208.html 25-Mar-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-April/000224.html 31-Mar-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-April/000232.html 10-Apr-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-May/000241.html 28-Apr-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-May/000240.html 05-May-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-June/000245.html 12-May-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-June/000246.html 19-May-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-June/000249.html 26-May-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-June/000250.html 02-Jun-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-June/000251.html 09-Jun-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-June/000258.html 16-Jun-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-June/000266.html 23-Jun-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-July/000270.html 30-Jun-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-July/000272.html 14-Jul-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-August/000283.html 21-Jul-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-August/000285.html 04-Aug-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-September/000298.html 11-Aug-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-October/000301.html 01-Sep-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-September/000297.html 16-Sep-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-September/000299.html 29-Sep-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-October/000302.html 06-Oct-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-October/000303.html 20-Oct-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-November/000304.html 03-Nov-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-November/000322.html 17-Nov-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/tsc/2011-November/000323.html 22-Nov-2011]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/openembedded-core/2011-December/014563.html 13-Dec-2011]&lt;br /&gt;
&lt;br /&gt;
== 2010 Minutes ==&lt;br /&gt;
&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/openembedded-devel/2010-June/020655.html June 2010]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/openembedded-devel/2010-May/020047.html May 2010]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/openembedded-devel/2010-March/017876.html March 2010]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/openembedded-devel/2010-February/017094.html February 2010]&lt;br /&gt;
* [http://lists.linuxtogo.org/pipermail/openembedded-devel/2010-January/015931.html January 2010]&lt;br /&gt;
&lt;br /&gt;
[[Category:Policy]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=2017_General_Meeting&amp;diff=9405</id>
		<title>2017 General Meeting</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=2017_General_Meeting&amp;diff=9405"/>
		<updated>2017-04-19T23:49:57Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Planning to attend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Purpose ==&lt;br /&gt;
The new bylaws of the organization require &#039;&#039;&#039;at least&#039;&#039;&#039; one general meeting per year.  This will fulfill that requirement.  Also, we plan to discuss topics of interest to the community and the project.&lt;br /&gt;
&lt;br /&gt;
== Date and Time ==&lt;br /&gt;
&#039;&#039;&#039;!!!Tentative!!!&#039;&#039;&#039; 2017-05-03 @ 8am US-CDT(UTC-06:00)/3pm CET(UTC+01:00)&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a link to the time:&lt;br /&gt;
https://www.timeanddate.com/worldclock/fixedtime.html?msg=OpenEmbedded+2017+General+Meeting&amp;amp;iso=20170503T08&amp;amp;p1=24&amp;amp;ah=1&lt;br /&gt;
&lt;br /&gt;
Countdown link:&lt;br /&gt;
https://www.timeanddate.com/countdown/generic?p0=24&amp;amp;iso=20170503T08&amp;amp;msg=OpenEmbedded%202017%20General%20Meeting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Conference Information ==&lt;br /&gt;
&lt;br /&gt;
Meeting will be held as a teleconference with a IRC channel to allow for background discussion and trouble shooting of audio.&lt;br /&gt;
&lt;br /&gt;
IRC: #oe-meeting on freenode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dial-in Conference # 8964521&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Dial-in Information&lt;br /&gt;
|-&lt;br /&gt;
| United States (USA)&lt;br /&gt;
|917-210-2607&lt;br /&gt;
|-&lt;br /&gt;
|DENMARK (DNK)&lt;br /&gt;
|36910500&lt;br /&gt;
|-&lt;br /&gt;
|FINLAND (FIN)&lt;br /&gt;
|923194205&lt;br /&gt;
|-&lt;br /&gt;
|GERMANY (DEU)&lt;br /&gt;
|69710448206&lt;br /&gt;
|-&lt;br /&gt;
|IRELAND (IRL)&lt;br /&gt;
|14360203&lt;br /&gt;
|-&lt;br /&gt;
|MEXICO&lt;br /&gt;
|52-5547772297&lt;br /&gt;
|-&lt;br /&gt;
|NETHERLANDS (NLD)&lt;br /&gt;
|207940366&lt;br /&gt;
|-&lt;br /&gt;
|PAKISTAN&lt;br /&gt;
|4238108701&lt;br /&gt;
|-&lt;br /&gt;
|ROMANIA&lt;br /&gt;
|215291724              &lt;br /&gt;
|-&lt;br /&gt;
|RUSSIA&lt;br /&gt;
|7 4959952645&lt;br /&gt;
|-&lt;br /&gt;
|SPAIN (ESP)&lt;br /&gt;
|917911851&lt;br /&gt;
|-&lt;br /&gt;
|SWEDEN (SWE)&lt;br /&gt;
|114501530&lt;br /&gt;
|-&lt;br /&gt;
|UNITED KINGDOM (GBR)&lt;br /&gt;
|2070840301&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tentative Agenda ==&lt;br /&gt;
# Meeting Schedule&lt;br /&gt;
##   The board would like to propose a quarterly meeting schedule with alternating online and face-to-face meetings.&lt;br /&gt;
# Membership&lt;br /&gt;
## Grandfathered all existing members in good standing&lt;br /&gt;
## New members&lt;br /&gt;
# TSC&lt;br /&gt;
## Grandfathered from old organization&lt;br /&gt;
# Online voting&lt;br /&gt;
# Elections&lt;br /&gt;
# Future plans/purpose for the organization&lt;br /&gt;
# Technical topics&lt;br /&gt;
&lt;br /&gt;
== Planning to attend ==&lt;br /&gt;
* Sean Hudson (irc:darknighte)&lt;br /&gt;
* Denys Dmytriyenko (denix)&lt;br /&gt;
* Bruce Ashfield (zeddii*)&lt;br /&gt;
* Armin Kuster (armpit)&lt;br /&gt;
* Mark Hatle (fray)&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=OEDAM_2017&amp;diff=9315</id>
		<title>OEDAM 2017</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=OEDAM_2017&amp;diff=9315"/>
		<updated>2017-02-20T06:00:23Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Attendees */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Location and Time ==&lt;br /&gt;
&lt;br /&gt;
Monday February 20 2017&lt;br /&gt;
&lt;br /&gt;
Location:&amp;lt;br/&amp;gt;&lt;br /&gt;
Mentor Graphics&amp;lt;br/&amp;gt;&lt;br /&gt;
8005 Boeckman Rd&amp;lt;br/&amp;gt;&lt;br /&gt;
Wilsonville, OR 97070&amp;lt;br/&amp;gt;&lt;br /&gt;
Phone: (800) 547-3000&amp;lt;br/&amp;gt;&lt;br /&gt;
9am-5pm&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Before ELC [Feb 21-23] and Yocto Project Developer Day [Feb 24])&lt;br /&gt;
&lt;br /&gt;
Current transportation plan is meet in the Hilton Lobby at 0800. From there we will use Lyft/Uber/other in as efficient way as possible.&lt;br /&gt;
&lt;br /&gt;
(fray) I&#039;ve got room for 2, maybe 3 people in my car.&lt;br /&gt;
&lt;br /&gt;
== Attendees ==&lt;br /&gt;
&lt;br /&gt;
* Armin Kuster (armpit)&lt;br /&gt;
* Philip Balister (Crofton)&lt;br /&gt;
* Trevor Woerner (tlwoerner)&lt;br /&gt;
* Denys Dmytriyenko (denix)&lt;br /&gt;
* Stephano Cetola&lt;br /&gt;
* Matthew McClintock&lt;br /&gt;
* Tim Orling (moto-timo)&lt;br /&gt;
* James Perkins (jamesp)&lt;br /&gt;
* Patrick Ohly (pohly)&lt;br /&gt;
* Richard Purdie (RP)&lt;br /&gt;
* Mark Hatle (fray)&lt;br /&gt;
* Jan-Simon Möller (dl9pf)&lt;br /&gt;
* Derek Straka&lt;br /&gt;
* Scott Murray (scottm)&lt;br /&gt;
* Ken Sharp&lt;br /&gt;
* Behan Webster (behanw)&lt;br /&gt;
* Brian Avery (bavery)&lt;br /&gt;
* Saul Wold (sgw)&lt;br /&gt;
* David Reyna&lt;br /&gt;
&lt;br /&gt;
== Agenda Items ==&lt;br /&gt;
&lt;br /&gt;
* Review items from last meeting in Berlin (Please add remarks)&lt;br /&gt;
* Proposal (Patrick): &amp;quot;production&amp;quot; vs. &amp;quot;development&amp;quot; builds and features&lt;br /&gt;
* Proposal (Patrick): stateless distro&lt;br /&gt;
* Proposal (Patrick): GPLv3 handling - remove recipes for obsolete components, replace with adaptive recipe and image configurations (like disabling readline support)&lt;br /&gt;
* Proposal (Patrick): remove openembedded-devel@lists.openembedded.org Reply-To?&lt;br /&gt;
* Discuss recruiting new layer maintainers for meta-oe and what a maintainer does.&lt;br /&gt;
&lt;br /&gt;
=== Berlin AR&#039;s ===&lt;br /&gt;
&lt;br /&gt;
==== LTS ====&lt;br /&gt;
&lt;br /&gt;
Yocto-Compatibility requires pushing patches upstream, but Yocto doesn&#039;t handle QA for old releases&lt;br /&gt;
A lot of work for the software vendors&lt;br /&gt;
rp: have new/separate LTS tree for older releases&lt;br /&gt;
crofton: how to coordinate between ppl who want this, collect interest in the wiki&lt;br /&gt;
add maintainer information to the layer repos?&lt;br /&gt;
rp: write a proposal?&lt;br /&gt;
→ enough interest to set this up&lt;br /&gt;
&lt;br /&gt;
action: Armin will start conversation on the Architecture list &lt;br /&gt;
&#039;&#039;&#039;Not completed&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Windriver ‘setup’ Demo ====&lt;br /&gt;
Conclusion: We want it in OE instead of Yocto (unanimous) &lt;br /&gt;
Mark: Once able to contribute, talk to halstead for new repo.&lt;br /&gt;
&#039;&#039;&#039;Repo published. OE has not taken over&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Notes: Layer Index was recently updated and this was required before progress can be made on promoting this tool.&lt;br /&gt;
&lt;br /&gt;
I would like to talk about the next steps at the OEDAM, now that everything is public.&lt;br /&gt;
&lt;br /&gt;
==== Devtool and other stuff (10:04) ====&lt;br /&gt;
Sysroot-Contamination&lt;br /&gt;
rp: solution “sysroot per recipe”&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Suggestion for improvement of how to handle site and user configuration. ====&lt;br /&gt;
Conclusion: Saur will implement the BBPATH_EXTRA and discuss it on the list.&lt;br /&gt;
&lt;br /&gt;
==== BSPs and layer name recommendations ====&lt;br /&gt;
RP: We can do this by … For Compatible v2 we want to raise the bar. Sanity check for things  that keep breaking.&lt;br /&gt;
Conclusion: Jan-Simon will start a script check the basic stuff, RP should add the checksum checks.&lt;br /&gt;
&lt;br /&gt;
==== OTA ====&lt;br /&gt;
RP: This discussion needs to continue beyond OEDEM&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Layer Quality ====&lt;br /&gt;
Conclusion: We need to get the word out and get suggestions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Make perl and python distro features? [Saur] ====&lt;br /&gt;
Conclusion: No change.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Support for meson build system? [Saur] ====&lt;br /&gt;
Conclusion: Patches welcome, talk to Ross.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== The use of ${COREBASE}/LICENSE in LIC_FILES_CHKSUM. [Saur] ====&lt;br /&gt;
Conclusion: RP: This needs to go to the ML&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Discuss merging duplicate classes and recipes (metadata) ====&lt;br /&gt;
Conclusion: Duplicate recipes and machines need to be brought up with the maintainers.&lt;br /&gt;
&lt;br /&gt;
Conclusion: Mark, RP, Chris and others should look to create a proposal about resolving the confusion over layer order/priority/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Changes to deploy_image ====&lt;br /&gt;
Conclusion: Document&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Discussion on mesa and splitting libgbm ====&lt;br /&gt;
Conclusion: RP: Topic should be discussed with Ross on mailing list.&lt;br /&gt;
&lt;br /&gt;
==== Discussion of recipe maintainers for oe-core and beyond ====&lt;br /&gt;
RP: This list is a Yocto initiative. They try to get more involvement from the members. There is an incentive to get more ppl involved (recipe reporting system):&lt;br /&gt;
&lt;br /&gt;
== Minutes ==&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=OEDAM_2017&amp;diff=9313</id>
		<title>OEDAM 2017</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=OEDAM_2017&amp;diff=9313"/>
		<updated>2017-02-20T05:59:50Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Location and Time */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Location and Time ==&lt;br /&gt;
&lt;br /&gt;
Monday February 20 2017&lt;br /&gt;
&lt;br /&gt;
Location:&amp;lt;br/&amp;gt;&lt;br /&gt;
Mentor Graphics&amp;lt;br/&amp;gt;&lt;br /&gt;
8005 Boeckman Rd&amp;lt;br/&amp;gt;&lt;br /&gt;
Wilsonville, OR 97070&amp;lt;br/&amp;gt;&lt;br /&gt;
Phone: (800) 547-3000&amp;lt;br/&amp;gt;&lt;br /&gt;
9am-5pm&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Before ELC [Feb 21-23] and Yocto Project Developer Day [Feb 24])&lt;br /&gt;
&lt;br /&gt;
Current transportation plan is meet in the Hilton Lobby at 0800. From there we will use Lyft/Uber/other in as efficient way as possible.&lt;br /&gt;
&lt;br /&gt;
(fray) I&#039;ve got room for 2, maybe 3 people in my car.&lt;br /&gt;
&lt;br /&gt;
== Attendees ==&lt;br /&gt;
&lt;br /&gt;
* Armin Kuster (armpit)&lt;br /&gt;
* Philip Balister (Crofton)&lt;br /&gt;
* Trevor Woerner (tlwoerner)&lt;br /&gt;
* Denys Dmytriyenko (denix)&lt;br /&gt;
* Stephano Cetola&lt;br /&gt;
* Matthew McClintock&lt;br /&gt;
* Tim Orling (moto-timo)&lt;br /&gt;
* James Perkins (jamesp)&lt;br /&gt;
* Patrick Ohly (pohly)&lt;br /&gt;
* Richard Purdie (RP)&lt;br /&gt;
* Mark Hatle (fray)&lt;br /&gt;
* Jan-Simon Möller (dl9pf)&lt;br /&gt;
* Derek Straka&lt;br /&gt;
* Scott Murray (scottm)&lt;br /&gt;
* Ken Sharp&lt;br /&gt;
* Behan Webster (behanw)&lt;br /&gt;
* Brian Avery (bavery)&lt;br /&gt;
* Saul Wold (sgw)&lt;br /&gt;
&lt;br /&gt;
== Agenda Items ==&lt;br /&gt;
&lt;br /&gt;
* Review items from last meeting in Berlin (Please add remarks)&lt;br /&gt;
* Proposal (Patrick): &amp;quot;production&amp;quot; vs. &amp;quot;development&amp;quot; builds and features&lt;br /&gt;
* Proposal (Patrick): stateless distro&lt;br /&gt;
* Proposal (Patrick): GPLv3 handling - remove recipes for obsolete components, replace with adaptive recipe and image configurations (like disabling readline support)&lt;br /&gt;
* Proposal (Patrick): remove openembedded-devel@lists.openembedded.org Reply-To?&lt;br /&gt;
* Discuss recruiting new layer maintainers for meta-oe and what a maintainer does.&lt;br /&gt;
&lt;br /&gt;
=== Berlin AR&#039;s ===&lt;br /&gt;
&lt;br /&gt;
==== LTS ====&lt;br /&gt;
&lt;br /&gt;
Yocto-Compatibility requires pushing patches upstream, but Yocto doesn&#039;t handle QA for old releases&lt;br /&gt;
A lot of work for the software vendors&lt;br /&gt;
rp: have new/separate LTS tree for older releases&lt;br /&gt;
crofton: how to coordinate between ppl who want this, collect interest in the wiki&lt;br /&gt;
add maintainer information to the layer repos?&lt;br /&gt;
rp: write a proposal?&lt;br /&gt;
→ enough interest to set this up&lt;br /&gt;
&lt;br /&gt;
action: Armin will start conversation on the Architecture list &lt;br /&gt;
&#039;&#039;&#039;Not completed&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Windriver ‘setup’ Demo ====&lt;br /&gt;
Conclusion: We want it in OE instead of Yocto (unanimous) &lt;br /&gt;
Mark: Once able to contribute, talk to halstead for new repo.&lt;br /&gt;
&#039;&#039;&#039;Repo published. OE has not taken over&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Notes: Layer Index was recently updated and this was required before progress can be made on promoting this tool.&lt;br /&gt;
&lt;br /&gt;
I would like to talk about the next steps at the OEDAM, now that everything is public.&lt;br /&gt;
&lt;br /&gt;
==== Devtool and other stuff (10:04) ====&lt;br /&gt;
Sysroot-Contamination&lt;br /&gt;
rp: solution “sysroot per recipe”&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Suggestion for improvement of how to handle site and user configuration. ====&lt;br /&gt;
Conclusion: Saur will implement the BBPATH_EXTRA and discuss it on the list.&lt;br /&gt;
&lt;br /&gt;
==== BSPs and layer name recommendations ====&lt;br /&gt;
RP: We can do this by … For Compatible v2 we want to raise the bar. Sanity check for things  that keep breaking.&lt;br /&gt;
Conclusion: Jan-Simon will start a script check the basic stuff, RP should add the checksum checks.&lt;br /&gt;
&lt;br /&gt;
==== OTA ====&lt;br /&gt;
RP: This discussion needs to continue beyond OEDEM&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Layer Quality ====&lt;br /&gt;
Conclusion: We need to get the word out and get suggestions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Make perl and python distro features? [Saur] ====&lt;br /&gt;
Conclusion: No change.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Support for meson build system? [Saur] ====&lt;br /&gt;
Conclusion: Patches welcome, talk to Ross.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== The use of ${COREBASE}/LICENSE in LIC_FILES_CHKSUM. [Saur] ====&lt;br /&gt;
Conclusion: RP: This needs to go to the ML&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Discuss merging duplicate classes and recipes (metadata) ====&lt;br /&gt;
Conclusion: Duplicate recipes and machines need to be brought up with the maintainers.&lt;br /&gt;
&lt;br /&gt;
Conclusion: Mark, RP, Chris and others should look to create a proposal about resolving the confusion over layer order/priority/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Changes to deploy_image ====&lt;br /&gt;
Conclusion: Document&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Discussion on mesa and splitting libgbm ====&lt;br /&gt;
Conclusion: RP: Topic should be discussed with Ross on mailing list.&lt;br /&gt;
&lt;br /&gt;
==== Discussion of recipe maintainers for oe-core and beyond ====&lt;br /&gt;
RP: This list is a Yocto initiative. They try to get more involvement from the members. There is an incentive to get more ppl involved (recipe reporting system):&lt;br /&gt;
&lt;br /&gt;
== Minutes ==&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=OEDAM_2017&amp;diff=9237</id>
		<title>OEDAM 2017</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=OEDAM_2017&amp;diff=9237"/>
		<updated>2017-01-19T19:33:47Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Windriver ‘setup’ Demo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Location and Time ==&lt;br /&gt;
&lt;br /&gt;
Monday February 20 2017&lt;br /&gt;
&lt;br /&gt;
Location TBA&lt;br /&gt;
&lt;br /&gt;
(Before ELC [Feb 21-23] and Yocto Project Developer Day [Feb 24])&lt;br /&gt;
&lt;br /&gt;
== Attendees ==&lt;br /&gt;
&lt;br /&gt;
* Armin Kuster (armpit)&lt;br /&gt;
* Philip Balister (Crofton)&lt;br /&gt;
* Trevor Woerner (tlwoerner)&lt;br /&gt;
* Denys Dmytriyenko (denix)&lt;br /&gt;
* Stephano Cetola&lt;br /&gt;
* Matthew McClintock&lt;br /&gt;
* Tim Orling (moto-timo)&lt;br /&gt;
* James Perkins (jamesp)&lt;br /&gt;
* Patrick Ohly (pohly)&lt;br /&gt;
* Richard Purdie (RP)&lt;br /&gt;
* Mark Hatle (fray)&lt;br /&gt;
&lt;br /&gt;
== Agenda Items ==&lt;br /&gt;
&lt;br /&gt;
* Review items from last meeting in Berlin (Please add remarks)&lt;br /&gt;
&lt;br /&gt;
=== Berlin AR&#039;s ===&lt;br /&gt;
&lt;br /&gt;
==== LTS ====&lt;br /&gt;
&lt;br /&gt;
Yocto-Compatibility requires pushing patches upstream, but Yocto doesn&#039;t handle QA for old releases&lt;br /&gt;
A lot of work for the software vendors&lt;br /&gt;
rp: have new/separate LTS tree for older releases&lt;br /&gt;
crofton: how to coordinate between ppl who want this, collect interest in the wiki&lt;br /&gt;
add maintainer information to the layer repos?&lt;br /&gt;
rp: write a proposal?&lt;br /&gt;
→ enough interest to set this up&lt;br /&gt;
&lt;br /&gt;
action: Armin will start conversation on the Architecture list &lt;br /&gt;
&#039;&#039;&#039;Not completed&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Windriver ‘setup’ Demo ====&lt;br /&gt;
Conclusion: We want it in OE instead of Yocto (unanimous) &lt;br /&gt;
Mark: Once able to contribute, talk to halstead for new repo.&lt;br /&gt;
&#039;&#039;&#039;Repo published. OE has not taken over&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Notes: Layer Index was recently updated and this was required before progress can be made on promoting this tool.&lt;br /&gt;
&lt;br /&gt;
I would like to talk about the next steps at the OEDAM, now that everything is public.&lt;br /&gt;
&lt;br /&gt;
==== Devtool and other stuff (10:04) ====&lt;br /&gt;
Sysroot-Contamination&lt;br /&gt;
rp: solution “sysroot per recipe”&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Suggestion for improvement of how to handle site and user configuration. ====&lt;br /&gt;
Conclusion: Saur will implement the BBPATH_EXTRA and discuss it on the list.&lt;br /&gt;
&lt;br /&gt;
==== BSPs and layer name recommendations ====&lt;br /&gt;
RP: We can do this by … For Compatible v2 we want to raise the bar. Sanity check for things  that keep breaking.&lt;br /&gt;
Conclusion: Jan-Simon will start a script check the basic stuff, RP should add the checksum checks.&lt;br /&gt;
&lt;br /&gt;
==== OTA ====&lt;br /&gt;
RP: This discussion needs to continue beyond OEDEM&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Layer Quality ====&lt;br /&gt;
Conclusion: We need to get the word out and get suggestions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Make perl and python distro features? [Saur] ====&lt;br /&gt;
Conclusion: No change.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Support for meson build system? [Saur] ====&lt;br /&gt;
Conclusion: Patches welcome, talk to Ross.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== The use of ${COREBASE}/LICENSE in LIC_FILES_CHKSUM. [Saur] ====&lt;br /&gt;
Conclusion: RP: This needs to go to the ML&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Discuss merging duplicate classes and recipes (metadata) ====&lt;br /&gt;
Conclusion: Duplicate recipes and machines need to be brought up with the maintainers.&lt;br /&gt;
&lt;br /&gt;
Conclusion: Mark, RP, Chris and others should look to create a proposal about resolving the confusion over layer order/priority/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Changes to deploy_image ====&lt;br /&gt;
Conclusion: Document&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Discussion on mesa and splitting libgbm ====&lt;br /&gt;
Conclusion: RP: Topic should be discussed with Ross on mailing list.&lt;br /&gt;
&lt;br /&gt;
==== Discussion of recipe maintainers for oe-core and beyond ====&lt;br /&gt;
RP: This list is a Yocto initiative. They try to get more involvement from the members. There is an incentive to get more ppl involved (recipe reporting system):&lt;br /&gt;
&lt;br /&gt;
== Minutes ==&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=OEDAM_2017&amp;diff=9235</id>
		<title>OEDAM 2017</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=OEDAM_2017&amp;diff=9235"/>
		<updated>2017-01-19T19:32:54Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Attendees */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Location and Time ==&lt;br /&gt;
&lt;br /&gt;
Monday February 20 2017&lt;br /&gt;
&lt;br /&gt;
Location TBA&lt;br /&gt;
&lt;br /&gt;
(Before ELC [Feb 21-23] and Yocto Project Developer Day [Feb 24])&lt;br /&gt;
&lt;br /&gt;
== Attendees ==&lt;br /&gt;
&lt;br /&gt;
* Armin Kuster (armpit)&lt;br /&gt;
* Philip Balister (Crofton)&lt;br /&gt;
* Trevor Woerner (tlwoerner)&lt;br /&gt;
* Denys Dmytriyenko (denix)&lt;br /&gt;
* Stephano Cetola&lt;br /&gt;
* Matthew McClintock&lt;br /&gt;
* Tim Orling (moto-timo)&lt;br /&gt;
* James Perkins (jamesp)&lt;br /&gt;
* Patrick Ohly (pohly)&lt;br /&gt;
* Richard Purdie (RP)&lt;br /&gt;
* Mark Hatle (fray)&lt;br /&gt;
&lt;br /&gt;
== Agenda Items ==&lt;br /&gt;
&lt;br /&gt;
* Review items from last meeting in Berlin (Please add remarks)&lt;br /&gt;
&lt;br /&gt;
=== Berlin AR&#039;s ===&lt;br /&gt;
&lt;br /&gt;
==== LTS ====&lt;br /&gt;
&lt;br /&gt;
Yocto-Compatibility requires pushing patches upstream, but Yocto doesn&#039;t handle QA for old releases&lt;br /&gt;
A lot of work for the software vendors&lt;br /&gt;
rp: have new/separate LTS tree for older releases&lt;br /&gt;
crofton: how to coordinate between ppl who want this, collect interest in the wiki&lt;br /&gt;
add maintainer information to the layer repos?&lt;br /&gt;
rp: write a proposal?&lt;br /&gt;
→ enough interest to set this up&lt;br /&gt;
&lt;br /&gt;
action: Armin will start conversation on the Architecture list &lt;br /&gt;
&#039;&#039;&#039;Not completed&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Windriver ‘setup’ Demo ====&lt;br /&gt;
Conclusion: We want it in OE instead of Yocto (unanimous) &lt;br /&gt;
Mark: Once able to contribute, talk to halstead for new repo.&lt;br /&gt;
&#039;&#039;&#039;Repo published. OE has not taken over&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Devtool and other stuff (10:04) ====&lt;br /&gt;
Sysroot-Contamination&lt;br /&gt;
rp: solution “sysroot per recipe”&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Suggestion for improvement of how to handle site and user configuration. ====&lt;br /&gt;
Conclusion: Saur will implement the BBPATH_EXTRA and discuss it on the list.&lt;br /&gt;
&lt;br /&gt;
==== BSPs and layer name recommendations ====&lt;br /&gt;
RP: We can do this by … For Compatible v2 we want to raise the bar. Sanity check for things  that keep breaking.&lt;br /&gt;
Conclusion: Jan-Simon will start a script check the basic stuff, RP should add the checksum checks.&lt;br /&gt;
&lt;br /&gt;
==== OTA ====&lt;br /&gt;
RP: This discussion needs to continue beyond OEDEM&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Layer Quality ====&lt;br /&gt;
Conclusion: We need to get the word out and get suggestions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Make perl and python distro features? [Saur] ====&lt;br /&gt;
Conclusion: No change.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Support for meson build system? [Saur] ====&lt;br /&gt;
Conclusion: Patches welcome, talk to Ross.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== The use of ${COREBASE}/LICENSE in LIC_FILES_CHKSUM. [Saur] ====&lt;br /&gt;
Conclusion: RP: This needs to go to the ML&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Discuss merging duplicate classes and recipes (metadata) ====&lt;br /&gt;
Conclusion: Duplicate recipes and machines need to be brought up with the maintainers.&lt;br /&gt;
&lt;br /&gt;
Conclusion: Mark, RP, Chris and others should look to create a proposal about resolving the confusion over layer order/priority/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Changes to deploy_image ====&lt;br /&gt;
Conclusion: Document&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Discussion on mesa and splitting libgbm ====&lt;br /&gt;
Conclusion: RP: Topic should be discussed with Ross on mailing list.&lt;br /&gt;
&lt;br /&gt;
==== Discussion of recipe maintainers for oe-core and beyond ====&lt;br /&gt;
RP: This list is a Yocto initiative. They try to get more involvement from the members. There is an incentive to get more ppl involved (recipe reporting system):&lt;br /&gt;
&lt;br /&gt;
== Minutes ==&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Commit_Patch_Message_Guidelines&amp;diff=9101</id>
		<title>Commit Patch Message Guidelines</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Commit_Patch_Message_Guidelines&amp;diff=9101"/>
		<updated>2016-11-08T15:49:08Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This set of guidelines is intended to help both the developer and reviewers of&lt;br /&gt;
changes determine reasonable patch headers and change commit messages. Often&lt;br /&gt;
when working with the code, you forget that not everyone is as familiar with the&lt;br /&gt;
problem and/or fix as you are. Often the next person in the code doesn&#039;t&lt;br /&gt;
understand what or why something is done so they quickly look at patch header&lt;br /&gt;
and commit messages. Unless these messages are clear it will be difficult to&lt;br /&gt;
understand the relevance of a given change and how future changes may impact&lt;br /&gt;
previous decisions.&lt;br /&gt;
&lt;br /&gt;
This policy refers both to patches that are being applied by recipes as well as&lt;br /&gt;
commit messages that are part of the source control system, usually git. A patch&lt;br /&gt;
file needs a header in order to describe the specific changes that are made&lt;br /&gt;
within that patch, while a commit message describes one or more changes to the&lt;br /&gt;
overall project or system. Both the patch headers and commit messages require&lt;br /&gt;
the same attention and basic details, however the purposes of the messages are&lt;br /&gt;
slightly different. A commit message documents all of the changes made as part&lt;br /&gt;
of a commit, while a patch header documents items specific to a single patch. In&lt;br /&gt;
many cases the patch header can also be used as the commit message.&lt;br /&gt;
&lt;br /&gt;
This policy does not cover the testing of the changes, the technical criteria&lt;br /&gt;
for accepting a patch, nor the style requirements for the technical changes.  See &lt;br /&gt;
the [http://www.openembedded.org/wiki/Styleguide Styleguide] for more information on style requirements.&lt;br /&gt;
&lt;br /&gt;
By following these guidelines we will have a better record of the problems and&lt;br /&gt;
solutions made over the course of development. It will also help establish a&lt;br /&gt;
clear provenance of all of the code and changes.&lt;br /&gt;
&lt;br /&gt;
   Draft version, changes from last approved version:&lt;br /&gt;
   * Revised General Information section to correct broken link&lt;br /&gt;
   * Clarify the &#039;&#039;Developer&#039;s Certificate of Origin&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
&lt;br /&gt;
While specific to the Linux kernel development, the following could also be&lt;br /&gt;
considered a general guide for any Open Source development:&lt;br /&gt;
&lt;br /&gt;
https://www.linux.com/publications/how-participate-linux-community&lt;br /&gt;
&lt;br /&gt;
Many of the guidelines in this document are related to the items referenced in&lt;br /&gt;
the link above.&lt;br /&gt;
&lt;br /&gt;
Pay particular attention to section 5.3 that talks about patch preparation.&lt;br /&gt;
The key thing to remember is to break up your changes into logical sections.&lt;br /&gt;
Otherwise you run the risk of not being able to even explain the purpose of a&lt;br /&gt;
change in the patch headers!&lt;br /&gt;
&lt;br /&gt;
In addition section 5.4 explains the purpose of the Signed-off-by: tag line.  The&lt;br /&gt;
signed-off-by: tag line is the &#039;&#039;Developer&#039;s Certificate of Origin&#039;&#039;.  The full text&lt;br /&gt;
of which can be found in the Linux kernel&#039;s Documentation/SubmittingPatches.&lt;br /&gt;
&lt;br /&gt;
Pay particular attention to section 11 of &lt;br /&gt;
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/SubmittingPatches&lt;br /&gt;
&lt;br /&gt;
Due to the importance of the &#039;&#039;Developer&#039;s Certificate of Origin&#039;&#039;, part of section 11&lt;br /&gt;
is copied below:&lt;br /&gt;
&lt;br /&gt;
   The sign-off is a simple line at the end of the explanation for the&lt;br /&gt;
   patch, which certifies that you wrote it or otherwise have the right to&lt;br /&gt;
   pass it on as an open-source patch.  The rules are pretty simple: if you&lt;br /&gt;
   can certify the below:&lt;br /&gt;
   &lt;br /&gt;
   Developer&#039;s Certificate of Origin 1.1&lt;br /&gt;
   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^&lt;br /&gt;
   &lt;br /&gt;
   By making a contribution to this project, I certify that:&lt;br /&gt;
   &lt;br /&gt;
        (a) The contribution was created in whole or in part by me and I&lt;br /&gt;
            have the right to submit it under the open source license&lt;br /&gt;
            indicated in the file; or&lt;br /&gt;
   &lt;br /&gt;
        (b) The contribution is based upon previous work that, to the best&lt;br /&gt;
            of my knowledge, is covered under an appropriate open source&lt;br /&gt;
            license and I have the right under that license to submit that&lt;br /&gt;
            work with modifications, whether created in whole or in part&lt;br /&gt;
            by me, under the same open source license (unless I am&lt;br /&gt;
            permitted to submit under a different license), as indicated&lt;br /&gt;
            in the file; or&lt;br /&gt;
   &lt;br /&gt;
        (c) The contribution was provided directly to me by some other&lt;br /&gt;
            person who certified (a), (b) or (c) and I have not modified&lt;br /&gt;
            it.&lt;br /&gt;
   &lt;br /&gt;
        (d) I understand and agree that this project and the contribution&lt;br /&gt;
            are public and that a record of the contribution (including all&lt;br /&gt;
            personal information I submit with it, including my sign-off) is&lt;br /&gt;
            maintained indefinitely and may be redistributed consistent with&lt;br /&gt;
            this project or the open source license(s) involved.&lt;br /&gt;
   &lt;br /&gt;
   then you just add a line saying::&lt;br /&gt;
   &lt;br /&gt;
       Signed-off-by: Random J Developer &amp;lt;random@developer.example.org&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   using your real name (sorry, no pseudonyms or anonymous contributions.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Patch Headers and Commit Messages ==&lt;br /&gt;
&lt;br /&gt;
There seems to always be a question or two surrounding what a person&lt;br /&gt;
should put in a patch header, or commit message.&lt;br /&gt;
&lt;br /&gt;
The general rules always apply, those being that there is a single line&lt;br /&gt;
short log or summary of the change (think of this as the subject when the patch&lt;br /&gt;
is e-mailed), and then the more detailed long log, and closure with tag lines&lt;br /&gt;
such as &amp;quot;Signed-off-by:&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== New Development ==&lt;br /&gt;
&lt;br /&gt;
A minimal patch or commit message would be of the format:&lt;br /&gt;
&lt;br /&gt;
   Short log / Statement of what needed to be changed.&lt;br /&gt;
   &lt;br /&gt;
   (Optional pointers to external resources, such as defect tracking)&lt;br /&gt;
   &lt;br /&gt;
   The intent of your change.&lt;br /&gt;
   &lt;br /&gt;
   (Optional, if it&#039;s not clear from above) how your change resolves the&lt;br /&gt;
   issues in the first part.&lt;br /&gt;
   &lt;br /&gt;
   Tag line(s) at the end.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
   foobar: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   When using foobar on systems with less than a gigabyte of RAM common&lt;br /&gt;
   usage patterns often result in an Out-of-memory condition causing&lt;br /&gt;
   slowdowns and unexpected application termination.&lt;br /&gt;
   &lt;br /&gt;
   Low-memory systems should continue to function without running into&lt;br /&gt;
   memory-starvation conditions with minimal cost to systems with more&lt;br /&gt;
   available memory.  High-memory systems will be less able to use the&lt;br /&gt;
   full extent of the system, a dynamically tunable option may be best,&lt;br /&gt;
   long-term.&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The minimal commit message is good for new code development and simple changes.&lt;br /&gt;
&lt;br /&gt;
The single short log message indicates what needed to be changed. It should&lt;br /&gt;
begin with an indicator as to the primary item changed by this work,&lt;br /&gt;
followed by a short summary of the change. In the above case we&#039;re indicating&lt;br /&gt;
that we&#039;ve changed the &amp;quot;foobar&amp;quot; item, by &amp;quot;adjusting the foo setting in bar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The single short log message is analogous to the git &amp;quot;commit summary&amp;quot;. While no&lt;br /&gt;
maximum line length is specified by this policy, it is suggested that it remains&lt;br /&gt;
under 78 characters wherever possible.&lt;br /&gt;
&lt;br /&gt;
Optionally, you may include pointers to defects this change corrects. Unless&lt;br /&gt;
the defect format is specified by the component you are modifying, it is&lt;br /&gt;
suggested that you use a full URL to specify the reference to the defect&lt;br /&gt;
information. Generally these pointers will precede any long description, but as&lt;br /&gt;
an optional item it may be after the long description.&lt;br /&gt;
&lt;br /&gt;
For example, you might refer to an open source defect in the RPM project:&lt;br /&gt;
&lt;br /&gt;
   rpm: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;[RPM Ticket #65] -- http://rpm5.org/cvs/tktview?tn=65,5&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must then have a full description of the change. Specifying the intent of&lt;br /&gt;
your change and if necessary how the change resolves the issue.&lt;br /&gt;
&lt;br /&gt;
As mentioned above this is intended to answer the &amp;quot;what were you thinking&amp;quot;&lt;br /&gt;
questions down the road and to know what other impacts are likely to&lt;br /&gt;
result of the change needs to be reverted. It also allows for better&lt;br /&gt;
solutions if someone comes along later and agrees with paragraph 1&lt;br /&gt;
(the problem statement) and either disagrees with paragraph 2&lt;br /&gt;
(the design) or paragraph 3 (the implementation).&lt;br /&gt;
&lt;br /&gt;
Finally one or more tag lines should exist. Each developer responsible&lt;br /&gt;
for working on the patch is responsible for adding a Signed-off-by: tag line.&lt;br /&gt;
&lt;br /&gt;
It is not acceptable to have an empty or non-existent header, or just a single&lt;br /&gt;
line message. The summary and description is required for all changes.&lt;br /&gt;
&lt;br /&gt;
== Importing from Elsewhere ==&lt;br /&gt;
&lt;br /&gt;
If you are importing work from somewhere else, such as a cherry-pick from&lt;br /&gt;
another repository or a code patch pulled from a mailing list, the minimum patch&lt;br /&gt;
header or commit message is not enough. It does not clearly establish the&lt;br /&gt;
provenance of the code.&lt;br /&gt;
&lt;br /&gt;
The following specifies the additional guidelines required for importing changes&lt;br /&gt;
from elsewhere.&lt;br /&gt;
&lt;br /&gt;
By default you should keep the original author&#039;s summary and description,&lt;br /&gt;
along with any tag lines such as, &amp;quot;Signed-off-by:&amp;quot;. If the original change that&lt;br /&gt;
was imported does not have a summary and/or commit message from the original&lt;br /&gt;
author, it is still your responsibility to add the summary and commit message to&lt;br /&gt;
the patch header. Just as if you wrote the code, you should be able to clearly&lt;br /&gt;
explain what the change does. It is also necessary to document the original&lt;br /&gt;
author of the change. You should indicate the original author by simply stating&lt;br /&gt;
&amp;quot;written by&amp;quot; or &amp;quot;posted to the ... mailing list by&amp;quot;. You must not add a&lt;br /&gt;
Signed-off-by: tag line with their name, only the original author may add their&lt;br /&gt;
own Signed-off-by: tag line.&lt;br /&gt;
&lt;br /&gt;
It is also required that the origin of the work be fully documented. The origin&lt;br /&gt;
should be specified as part of the commit message in a way that an average&lt;br /&gt;
developer would be able to track down the original code. URLs should reference&lt;br /&gt;
original authoritative sources and not mirrors.&lt;br /&gt;
&lt;br /&gt;
If changes were required to resolve conflicts, they should be documented as&lt;br /&gt;
well.  When incorporating a commit or patch from an external source, changes to&lt;br /&gt;
the functionality not related to resolving conflicts should be made in a&lt;br /&gt;
second commit or patch.  This preserves the original external commit, and makes&lt;br /&gt;
the modifications clearly visible, and prevents confusion over the author of the&lt;br /&gt;
code.&lt;br /&gt;
&lt;br /&gt;
Finally you must add a &amp;quot;Signed-off-by:&amp;quot; tag line to indicate that you worked&lt;br /&gt;
with the patch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example: Importing from Elsewhere Unmodified ===&lt;br /&gt;
&lt;br /&gt;
For example, if you were to pull in the patch from the above example unmodified:&lt;br /&gt;
&lt;br /&gt;
   foobar: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   When using foobar on systems with less than a gigabyte of RAM common&lt;br /&gt;
   usage patterns often result in an Out-of-memory condition causing&lt;br /&gt;
   slowdowns and unexpected application termination.&lt;br /&gt;
   &lt;br /&gt;
   Low-memory systems should continue to function without running into&lt;br /&gt;
   memory-starvation conditions with minimal cost to systems with more&lt;br /&gt;
   available memory.  High-memory systems will be less able to use the&lt;br /&gt;
   full extent of the system, a dynamically tunable option may be best,&lt;br /&gt;
   long-term.&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The patch was imported from the OpenEmbedded git server&lt;br /&gt;
   (&amp;lt;nowiki&amp;gt;git://git.openembedded.org/openembedded&amp;lt;/nowiki&amp;gt;) as of commit id&lt;br /&gt;
   b65a0e0c84cf489bfa00d6aa6c48abc5a237100f.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Your Name &amp;lt;your.name@openembedded.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above example shows a clear way for a developer to find the original source&lt;br /&gt;
of the change. It indicates that the OpenEmbedded developer simply integrated&lt;br /&gt;
the change into the system without making any further modifications.&lt;br /&gt;
&lt;br /&gt;
=== Example: Importing from Elsewhere Modified ===&lt;br /&gt;
&lt;br /&gt;
When importing a patch, occasionally changes have to be made in order to resolve&lt;br /&gt;
conflicts.  The following is an example of the commit message when the item needed&lt;br /&gt;
to be modified:&lt;br /&gt;
&lt;br /&gt;
   foobar: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   When using foobar on systems with less than a gigabyte of RAM common&lt;br /&gt;
   usage patterns often result in an Out-of-memory condition causing&lt;br /&gt;
   slowdowns and unexpected application termination.&lt;br /&gt;
   &lt;br /&gt;
   Low-memory systems should continue to function without running into&lt;br /&gt;
   memory-starvation conditions with minimal cost to systems with more&lt;br /&gt;
   available memory.  High-memory systems will be less able to use the&lt;br /&gt;
   full extent of the system, a dynamically tunable option may be best,&lt;br /&gt;
   long-term.&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The patch was imported from the OpenEmbedded git server&lt;br /&gt;
   (&amp;lt;nowiki&amp;gt;git://git.openembedded.org/openembedded&amp;lt;/nowiki&amp;gt;) as of commit id&lt;br /&gt;
   b65a0e0c84cf489bfa00d6aa6c48abc5a237100f.&lt;br /&gt;
   &lt;br /&gt;
   A previous change had modified the memory threshold calculation,&lt;br /&gt;
   causing a conflict.  The conflict was resolved by preserving the&lt;br /&gt;
   memory threshold calculation from the existing implementation.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Your Name &amp;lt;your.name@openembedded.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Patch Header Recommendations ==&lt;br /&gt;
&lt;br /&gt;
In order to keep track of patches and ultimately reduce the number of patches&lt;br /&gt;
that are required to be maintained, we need to track the status of the patches&lt;br /&gt;
that are created. The following items are specific to patches applied by recipes.&lt;br /&gt;
&lt;br /&gt;
In addition to the items mentioned above, we also want to track if it&#039;s&lt;br /&gt;
appropriate to get this particular patch into the upstream project. Since we&lt;br /&gt;
want to track this information, we need a consistent tag and status indicator&lt;br /&gt;
that can be searched.&lt;br /&gt;
&lt;br /&gt;
While adding this tracking information to the patch headers is currently&lt;br /&gt;
optional, it is highly recommended and some maintainers may require it.  It is&lt;br /&gt;
optional at this time so that it can be evaluated as to its usefulness over&lt;br /&gt;
time.  Existing patches will be updated with the tag as they are modified.&lt;br /&gt;
&lt;br /&gt;
As mentioned in the above, be sure to include any URL to bug tracking, mailing&lt;br /&gt;
lists or other reference material pertaining to the patch. Then add a new tag&lt;br /&gt;
&amp;quot;Upstream-Status:&amp;quot; which contains one of the following items:&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Pending&#039;&#039;&#039;&lt;br /&gt;
   - No determination has been made yet or not yet submitted to upstream&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Submitted&#039;&#039;&#039; [where]&lt;br /&gt;
   - Submitted to upstream, waiting approval&lt;br /&gt;
   - Optionally include where it was submitted, such as the author, mailing&lt;br /&gt;
     list, etc.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Accepted&#039;&#039;&#039;&lt;br /&gt;
   - Accepted in upstream, expect it to be removed at next update, include&lt;br /&gt;
     expected version info&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Backport&#039;&#039;&#039;&lt;br /&gt;
   - Backported from new upstream version, because we are at a fixed version,&lt;br /&gt;
     include upstream version info&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Denied&#039;&#039;&#039;&lt;br /&gt;
   - Not accepted by upstream, include reason in patch&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Inappropriate [reason]&#039;&#039;&#039;&lt;br /&gt;
   - The patch is not appropriate for upstream, include a brief reason on the&lt;br /&gt;
     same line enclosed with []&lt;br /&gt;
     reason can be:&lt;br /&gt;
       not author (You are not the author and do not intend to upstream this,&lt;br /&gt;
                   source must be listed in the comments)&lt;br /&gt;
       native&lt;br /&gt;
       licensing&lt;br /&gt;
       configuration&lt;br /&gt;
       enable feature&lt;br /&gt;
       disable feature&lt;br /&gt;
       bugfix (add bug URL here)&lt;br /&gt;
       embedded specific&lt;br /&gt;
       no upstream (the upstream is no longer available -- dead project)&lt;br /&gt;
       other (give details in comments)&lt;br /&gt;
&lt;br /&gt;
The various &amp;quot;Inappropriate [reason]&amp;quot; status items are meant to indicate that the&lt;br /&gt;
person responsible for adding this patch to the system does not intend to&lt;br /&gt;
upstream the patch for a specific reason.  Unless otherwise noted, another&lt;br /&gt;
person could submit this patch to the upstream, if they do the status should be&lt;br /&gt;
changed to &amp;quot;Submitted [where]&amp;quot;, and an additional Signed-off-by: line added to&lt;br /&gt;
the patch by the person claiming responsibility for upstreaming.&lt;br /&gt;
&lt;br /&gt;
For example, if the patch has been submitted upstream:&lt;br /&gt;
&lt;br /&gt;
   rpm: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;[RPM Ticket #65] -- http://rpm5.org/cvs/tktview?tn=65,5&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Upstream-Status: Submitted [rpm5-devel@rpm5.org]&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A future commit can change the value to &amp;quot;Accepted&amp;quot; or &amp;quot;Denied&amp;quot; as appropriate.&lt;br /&gt;
&lt;br /&gt;
=== CVE Patches ===&lt;br /&gt;
&lt;br /&gt;
In order to have a better control of vulnerabilities, patches that fix CVEs must contain the &amp;quot;CVE:&amp;quot; tag. This tag list all CVEs fixed by the patch. If more than one CVE is fixed, separate them using spaces.&lt;br /&gt;
&lt;br /&gt;
==== Example: CVE patch header ====&lt;br /&gt;
&lt;br /&gt;
This should be the header of patch that fixes grub2 CVE-2015-8370:&lt;br /&gt;
&lt;br /&gt;
   grub2: Fix CVE-2015-8370&lt;br /&gt;
   &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;[No upstream tracking] -- https://bugzilla.redhat.com/show_bug.cgi?id=1286966&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Back to 28; Grub2 Authentication&lt;br /&gt;
   &lt;br /&gt;
   Two functions suffer from integer underflow fault; the grub_username_get() and grub_password_get()located in&lt;br /&gt;
   grub-core/normal/auth.c and lib/crypto.c respectively. This can be exploited to obtain a Grub rescue shell.&lt;br /&gt;
   &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;Upstream-Status: Accepted [http://git.savannah.gnu.org/cgit/grub.git/commit/?id=451d80e52d851432e109771bb8febafca7a5f1f2]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   CVE: CVE-2015-8370&lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Common Errors in Patch and Commit Messages ==&lt;br /&gt;
&lt;br /&gt;
- Short log does not start with the file or component being modified.  Such as&lt;br /&gt;
&amp;quot;foo: Update to new upstream version 5.8.9&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Avoid starting the summary line with a capital letter, unless the component&lt;br /&gt;
being referred to also begins with a capital letter.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t have one huge patch, split your change into logical subparts. It&#039;s&lt;br /&gt;
easier to track down problems afterward using tools such as git bisect. It also&lt;br /&gt;
makes it easy for people to cherry-pick changes into things like stable branches.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t simply translate your change into English for a commit log. The log&lt;br /&gt;
&amp;quot;Change compare from zero to one&amp;quot; is bad because it describes only the code&lt;br /&gt;
change in the patch; we can see that from reading the patch itself. Let the code&lt;br /&gt;
tell the story of the mechanics of the change (as much as possible), and let&lt;br /&gt;
your comment tell the other details -- i.e. what the problem was, how it&lt;br /&gt;
manifested itself (symptoms), and if necessary, the justification for why the&lt;br /&gt;
fix was done in manner that it was.  In other words, the long commit message&lt;br /&gt;
must describe *why* the change was needed (instead of what has changed).&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t start your commit log with &amp;quot;This patch...&amp;quot; -- we already know it is a patch.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t repeat your short log in the long log. If you really really don&#039;t have&lt;br /&gt;
anything new and informational to add in as a long log, then don&#039;t put a long&lt;br /&gt;
log at all. This should be uncommon -- i.e. the only acceptable cases for no&lt;br /&gt;
long log would be something like &amp;quot;Documentation/README: Fix spelling mistakes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t put absolute paths to source files that are specific to your site, i.e.&lt;br /&gt;
if you get a compile error on &amp;quot;fs/exec.c&amp;quot; then tidy up the parts of the compile&lt;br /&gt;
output to just show that portion. We don&#039;t need to see that it was&lt;br /&gt;
/home/wally/src/git/oe-core/meta/classes/insane.bbclass or similar - that full&lt;br /&gt;
path has no value to others. Always reduce the path to something more&lt;br /&gt;
meaningful, such as oe-core/meta/classes/insane.bbclass.&lt;br /&gt;
&lt;br /&gt;
- Always use the most significant ramification of the change in the words of&lt;br /&gt;
your subject/shortlog. For example, don&#039;t say &amp;quot;fix compile warning in foo&amp;quot; when&lt;br /&gt;
the compiler warning was really telling us that we were dereferencing complete&lt;br /&gt;
garbage off in the weeds that could in theory cause an OOPS under some&lt;br /&gt;
circumstances. When people are choosing commits for backports to stable or&lt;br /&gt;
distro kernels, the shortlog will be what they use for an initial sorting&lt;br /&gt;
selection. If they see &amp;quot;Fix possible OOPS in....&amp;quot; then these people will look&lt;br /&gt;
closer, whereas they most likely will skip over simple warning fixes.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t put in the full 20 or more lines of a backtrace when really it is just&lt;br /&gt;
the last 5 or so function calls that are relevant to the crash/fix. If the entry&lt;br /&gt;
point, or start of the trace is relevant (i.e. a syscall or similar), you can&lt;br /&gt;
leave that, and then replace a chunk of the intermediate calls in the middle&lt;br /&gt;
with a single [...]&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t include timestamps or other unnecessary information, unless they are&lt;br /&gt;
relevant to the situation (i.e. indicating an unacceptable delay in a driver&lt;br /&gt;
initialization etc.)&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t use links to temporary resources like pastebin and friends. The commit&lt;br /&gt;
message may be read long after this resource timed out.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t reference mirrors, but instead always reference original authoritative&lt;br /&gt;
sources.&lt;br /&gt;
&lt;br /&gt;
- Avoid punctuation in the short log.&lt;br /&gt;
&lt;br /&gt;
[[Category:Policy]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=OEDEM_2016&amp;diff=8997</id>
		<title>OEDEM 2016</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=OEDEM_2016&amp;diff=8997"/>
		<updated>2016-09-28T14:46:43Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Agenda Items */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NOTE: for the OpenEmbedded General Assembly 2016, held the same day at the same location, see the page [[Berlin, 2016]]&lt;br /&gt;
&lt;br /&gt;
== Location and Time ==&lt;br /&gt;
&lt;br /&gt;
Friday, October 14 2016&amp;lt;br&amp;gt;&lt;br /&gt;
(after ELC-E [Oct 11-13])&lt;br /&gt;
&lt;br /&gt;
Specific location in Berlin will be announced later&lt;br /&gt;
&lt;br /&gt;
== Attendees ==&lt;br /&gt;
&lt;br /&gt;
* Andrei Gherzan&lt;br /&gt;
* Khem Raj &amp;quot;khem&amp;quot;&lt;br /&gt;
* Armin Kuster &amp;quot;Armpit&amp;quot;&lt;br /&gt;
* Marco Cavallini &amp;quot;mckoan&amp;quot;&lt;br /&gt;
* Pierre-Jean Texier &amp;quot;pjtexier&amp;quot;&lt;br /&gt;
* Koen Kooi &amp;quot;koen&amp;quot;&lt;br /&gt;
* Anders Darander&lt;br /&gt;
* Sean Hudson &amp;quot;darknighte&amp;quot;&lt;br /&gt;
* Changhyeok Bae &amp;quot;chbae&amp;quot;&lt;br /&gt;
* Peter Kjellerstedt &amp;quot;Saur&amp;quot;&lt;br /&gt;
* Josef Holzmayr &amp;quot;LetoThe2nd&amp;quot;&lt;br /&gt;
* Vicentiu Neagoe&lt;br /&gt;
* Nicolas Dechesne &amp;quot;ndec&amp;quot;&lt;br /&gt;
* Denys Dmytriyenko &amp;quot;denix&amp;quot;&lt;br /&gt;
* Philip Balister &amp;quot;Crofton&amp;quot;&lt;br /&gt;
* Jan Lübbe &amp;quot;shoragan&amp;quot;&lt;br /&gt;
* Enrico Jörns&lt;br /&gt;
* Jeff Osier-Mixon &amp;quot;Jefro&amp;quot;&lt;br /&gt;
* Andrea Galbusera &amp;quot;gizero&amp;quot;&lt;br /&gt;
* Richard Purdie &amp;quot;RP&amp;quot;&lt;br /&gt;
* Changhyeok bae &amp;quot;chbae&amp;quot;&lt;br /&gt;
* Scott Murray &amp;quot;smurray&amp;quot;&lt;br /&gt;
* Behan Webster &amp;quot;behanw&amp;quot;&lt;br /&gt;
* Jan-Simon Moeller &amp;quot;dl9pf&amp;quot;&lt;br /&gt;
* Bruce Ashfield &amp;quot;zediii&amp;quot;&lt;br /&gt;
* Marcin Juszkiewicz &amp;quot;hrw&amp;quot;&lt;br /&gt;
* Mark Hatle &amp;quot;fray&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Agenda Items ==&lt;br /&gt;
&lt;br /&gt;
OpenEmbedded eV General Assembly [[Berlin,_2016]]&lt;br /&gt;
&lt;br /&gt;
# LTS&lt;br /&gt;
# BSPs and layer name recommendations&lt;br /&gt;
# Make perl and python distro features? [Saur]&lt;br /&gt;
# Support for meson build system? [Saur]&lt;br /&gt;
# Can devtool be made standalone, or how to use latest devtool with older version of OE? [Saur]&lt;br /&gt;
# Show off Wind River &#039;setup&#039; tool (response to discussions from last year and this spring) [Fray]&lt;br /&gt;
&lt;br /&gt;
== Minutes ==&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=OEDEM_2016&amp;diff=8995</id>
		<title>OEDEM 2016</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=OEDEM_2016&amp;diff=8995"/>
		<updated>2016-09-28T14:45:37Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Attendees */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NOTE: for the OpenEmbedded General Assembly 2016, held the same day at the same location, see the page [[Berlin, 2016]]&lt;br /&gt;
&lt;br /&gt;
== Location and Time ==&lt;br /&gt;
&lt;br /&gt;
Friday, October 14 2016&amp;lt;br&amp;gt;&lt;br /&gt;
(after ELC-E [Oct 11-13])&lt;br /&gt;
&lt;br /&gt;
Specific location in Berlin will be announced later&lt;br /&gt;
&lt;br /&gt;
== Attendees ==&lt;br /&gt;
&lt;br /&gt;
* Andrei Gherzan&lt;br /&gt;
* Khem Raj &amp;quot;khem&amp;quot;&lt;br /&gt;
* Armin Kuster &amp;quot;Armpit&amp;quot;&lt;br /&gt;
* Marco Cavallini &amp;quot;mckoan&amp;quot;&lt;br /&gt;
* Pierre-Jean Texier &amp;quot;pjtexier&amp;quot;&lt;br /&gt;
* Koen Kooi &amp;quot;koen&amp;quot;&lt;br /&gt;
* Anders Darander&lt;br /&gt;
* Sean Hudson &amp;quot;darknighte&amp;quot;&lt;br /&gt;
* Changhyeok Bae &amp;quot;chbae&amp;quot;&lt;br /&gt;
* Peter Kjellerstedt &amp;quot;Saur&amp;quot;&lt;br /&gt;
* Josef Holzmayr &amp;quot;LetoThe2nd&amp;quot;&lt;br /&gt;
* Vicentiu Neagoe&lt;br /&gt;
* Nicolas Dechesne &amp;quot;ndec&amp;quot;&lt;br /&gt;
* Denys Dmytriyenko &amp;quot;denix&amp;quot;&lt;br /&gt;
* Philip Balister &amp;quot;Crofton&amp;quot;&lt;br /&gt;
* Jan Lübbe &amp;quot;shoragan&amp;quot;&lt;br /&gt;
* Enrico Jörns&lt;br /&gt;
* Jeff Osier-Mixon &amp;quot;Jefro&amp;quot;&lt;br /&gt;
* Andrea Galbusera &amp;quot;gizero&amp;quot;&lt;br /&gt;
* Richard Purdie &amp;quot;RP&amp;quot;&lt;br /&gt;
* Changhyeok bae &amp;quot;chbae&amp;quot;&lt;br /&gt;
* Scott Murray &amp;quot;smurray&amp;quot;&lt;br /&gt;
* Behan Webster &amp;quot;behanw&amp;quot;&lt;br /&gt;
* Jan-Simon Moeller &amp;quot;dl9pf&amp;quot;&lt;br /&gt;
* Bruce Ashfield &amp;quot;zediii&amp;quot;&lt;br /&gt;
* Marcin Juszkiewicz &amp;quot;hrw&amp;quot;&lt;br /&gt;
* Mark Hatle &amp;quot;fray&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Agenda Items ==&lt;br /&gt;
&lt;br /&gt;
OpenEmbedded eV General Assembly [[Berlin,_2016]]&lt;br /&gt;
&lt;br /&gt;
# LTS&lt;br /&gt;
# BSPs and layer name recommendations&lt;br /&gt;
# Make perl and python distro features? [Saur]&lt;br /&gt;
# Support for meson build system? [Saur]&lt;br /&gt;
# Can devtool be made standalone, or how to use latest devtool with older version of OE? [Saur]&lt;br /&gt;
&lt;br /&gt;
== Minutes ==&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=OEDAM_2016&amp;diff=8565</id>
		<title>OEDAM 2016</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=OEDAM_2016&amp;diff=8565"/>
		<updated>2016-03-10T22:47:46Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Attendees */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Location and Time ==&lt;br /&gt;
&lt;br /&gt;
Friday April 8 2016 (after ELC [Apr 4-6] and Yocto Project Developer Day [Apr 7])&lt;br /&gt;
&lt;br /&gt;
== Attendees ==&lt;br /&gt;
Armin Kuster (Armpit)&amp;lt;br&amp;gt;&lt;br /&gt;
Behan Webster (behanw)&amp;lt;br&amp;gt;&lt;br /&gt;
Denys Dmytriyenko (denix)&amp;lt;br&amp;gt;&lt;br /&gt;
Jan-Simon Möller (dl9pf)&amp;lt;br&amp;gt;&lt;br /&gt;
Philip Balister (Crofton|work)&amp;lt;br&amp;gt;&lt;br /&gt;
Sean Hudson (darknighte)&amp;lt;br&amp;gt;&lt;br /&gt;
Tim Orling (Moto-timo)&amp;lt;br&amp;gt;&lt;br /&gt;
Trevor Woerner&amp;lt;br&amp;gt;&lt;br /&gt;
Tom King (ka6sox)&amp;lt;br&amp;gt;&lt;br /&gt;
Mark Hatle (fray)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Agenda Items ==&lt;br /&gt;
&lt;br /&gt;
* Review items from last meeting in Dublin (Please add remarks)&lt;br /&gt;
&lt;br /&gt;
===BSPs &amp;amp; Layer Index===&lt;br /&gt;
* oe driving toward machine readable files, can also drive from layer&lt;br /&gt;
test (yp compat) side - KK&lt;br /&gt;
* publicize defs of each list? discuss on members list - where to&lt;br /&gt;
overall architecture discussions belong&lt;br /&gt;
* TSC to add new mailing list specifically about project&lt;br /&gt;
architecture, no patches, and determine list name&lt;br /&gt;
* KK bring discussion to new mailing list&lt;br /&gt;
&lt;br /&gt;
===BSP standards - standards exist,coming soon are methods for comparing===&lt;br /&gt;
a given layer with the standard&lt;br /&gt;
* need wiki documentation for TSC to ratify&lt;br /&gt;
* document distro vs. machine policies, other best practices&lt;br /&gt;
&lt;br /&gt;
===BSP layer availability===&lt;br /&gt;
* encourage board vendors to provide a BSP, make it easier to do so&lt;br /&gt;
* ask yp ab to talk to linux.com [PB] - community issue&lt;br /&gt;
* look at digi manual (i.e. &amp;quot;just add bsp changes in local.conf&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
===meta-yocto to meta-poky===&lt;br /&gt;
* RP to take action on the YP side, possibly not for 2.0&lt;br /&gt;
* formalize lowercase as mandatory requirement for overrides, look&lt;br /&gt;
for other options in the future&lt;br /&gt;
&lt;br /&gt;
===Layer Index feature requests discussed with layer index build feedback&amp;gt;&amp;gt;===&lt;br /&gt;
* ask for cycles from employers to work on these issues&lt;br /&gt;
* make people aware, help with triage, provide resources&lt;br /&gt;
&lt;br /&gt;
===Security===&lt;br /&gt;
* need a method for tracking CVs&lt;br /&gt;
&lt;br /&gt;
===Systemd===&lt;br /&gt;
complaints: more package config, comments; look at packaging to have&lt;br /&gt;
minimal systemd even with options available&lt;br /&gt;
* need someone with time available to work on it&lt;br /&gt;
* need to get systemd feedback, people using systemd talk to package maintainer&lt;br /&gt;
* file systemctl wrapper bug&lt;br /&gt;
&lt;br /&gt;
===Advocacy===&lt;br /&gt;
* board to discuss advocacy/community, invite jefro to meetings&lt;br /&gt;
Potential OE Day at ELCE next year&lt;br /&gt;
* board: do a proper cfp&lt;br /&gt;
&lt;br /&gt;
== Minutes ==&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=OEDEM_2015&amp;diff=7853</id>
		<title>OEDEM 2015</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=OEDEM_2015&amp;diff=7853"/>
		<updated>2015-08-15T15:18:16Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Attendees */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The 2015 OpenEmbedded Developer&#039;s European Meeting will take place Friday, Oct 9, 2015 in Dublin, Ireland. Part of this meeting will also constitute the annual OE General Assembly, and some corporation/eV matters will be discussed.&lt;br /&gt;
&lt;br /&gt;
== Location and Time ==&lt;br /&gt;
&lt;br /&gt;
[http://www.thegibsonhotel.ie/ The Gibson Hotel]&amp;lt;br&amp;gt;&lt;br /&gt;
Point Village&amp;lt;br&amp;gt;&lt;br /&gt;
Dublin 1, Ireland&amp;lt;br&amp;gt;&lt;br /&gt;
+353 1 681 5000&lt;br /&gt;
&lt;br /&gt;
9am - 5pm (note: times may change)&lt;br /&gt;
&lt;br /&gt;
== OpenEmbedded eV General Assembly ==&lt;br /&gt;
&lt;br /&gt;
We have a short administrative meeting before starting the Developer meeting. All are welcome for this.&lt;br /&gt;
&lt;br /&gt;
* Proposal to dissolve the current e.V. and re-constituting it in the U.S. to reduce the administrative burden for the project.&lt;br /&gt;
* Define a method for identifying lapsed memberships.&lt;br /&gt;
* Proxy form [[File:Proxy_instructions-oe.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Agenda ==&lt;br /&gt;
&lt;br /&gt;
* Standards for BSP behavior. (Crofton)&lt;br /&gt;
* Tentative: User/group definitions. Distribution wide (uid/gid) vs layer wide (primary group, path, description, etc for users). (Saur)&lt;br /&gt;
* LayerIndex feature requests (tlwoerner)&lt;br /&gt;
** build feedback (autobuilders and off-site)&lt;br /&gt;
** master branch parsability&lt;br /&gt;
* Systemd packaging. As new things appear, they are lumped into one package. Update split? (Crofton relaying info)&lt;br /&gt;
* meta-yocto -&amp;gt; meta-poky. People are still spending too much time explaining reality. (Crofton)&lt;br /&gt;
&lt;br /&gt;
== Attendees ==&lt;br /&gt;
&lt;br /&gt;
If you plan to attend, please list your name below.&lt;br /&gt;
&lt;br /&gt;
# Jeff Osier-Mixon (jefro)&lt;br /&gt;
# Philip Balister (Crofton)&lt;br /&gt;
# Trevor Woerner (tlwoerner)&lt;br /&gt;
# Anders Darander (andersd)&lt;br /&gt;
# Marco Cavallini (mckoan)&lt;br /&gt;
# Koen Kooi (koen)&lt;br /&gt;
# Alexandre Belloni (abelloni)&lt;br /&gt;
# Armin Kuster (armpit)&lt;br /&gt;
# Belén Barros Pena (belen) (tentative)&lt;br /&gt;
# Peter Kjellerstedt (Saur)&lt;br /&gt;
# Alejandro del Castillo (adelcast)&lt;br /&gt;
# Denys Dmytriyenko (denix)&lt;br /&gt;
# Sean Hudson (darknighte)&lt;br /&gt;
# Nathan Rossi (nrossi)&lt;br /&gt;
# Mark Hatle (fray)&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=OEDAM_2015&amp;diff=7663</id>
		<title>OEDAM 2015</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=OEDAM_2015&amp;diff=7663"/>
		<updated>2015-03-23T20:47:06Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Attendees */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Location and Time ==&lt;br /&gt;
&lt;br /&gt;
March 27-28 (after ELC and Yocto Project Developer Day)&lt;br /&gt;
&lt;br /&gt;
2315 North 1st Street, San Jose, CA 95131 &lt;br /&gt;
&lt;br /&gt;
https://goo.gl/maps/1pRGR&lt;br /&gt;
&lt;br /&gt;
Now that people are already claiming to attend by Google Hangout, I will announce our intention to also webcast via Google Hangout ;)&lt;br /&gt;
&lt;br /&gt;
== Attendees ==&lt;br /&gt;
&lt;br /&gt;
* Philip Balister (Crofton)&lt;br /&gt;
* Denys Dmytriyenko (denix)&lt;br /&gt;
* Armin Kuster (Armpit)&lt;br /&gt;
* Martin Jansa (JaMa) - 50%&lt;br /&gt;
* Michael Halstead (halstead) - Friday only&lt;br /&gt;
* Jeff Osier-Mixon (jefro)&lt;br /&gt;
* Paul Eggleton (bluelightning)&lt;br /&gt;
* Steve Arnold (nerdboy/mr_science)&lt;br /&gt;
* Stephanie Lockwood-Childs (wormo/sjl) - via hangout&lt;br /&gt;
* Ron Lockwood-Childs (speedy1) - via hangout&lt;br /&gt;
* Herb Kuta&lt;br /&gt;
* Tim Orling (moto-timo)&lt;br /&gt;
* Sean Hudson (darknighte)&lt;br /&gt;
* Bruce Ashfield (zedd) - probably&lt;br /&gt;
* Mark Hatle (fray)&lt;br /&gt;
* Sona Sarmadi&lt;br /&gt;
* Changhyeok Bae&lt;br /&gt;
* Belén Barros Pena (belen) - via hangout&lt;br /&gt;
&lt;br /&gt;
== Agenda Items ==&lt;br /&gt;
&lt;br /&gt;
* Progress on items identified during OEDAM 2014&lt;br /&gt;
* Development cycle&lt;br /&gt;
* Patch review tools&lt;br /&gt;
* Tests&lt;br /&gt;
* Removing the oe-core and meta-oe repos on github. These repos are now called openembedded-core and meta-openembedded/&lt;br /&gt;
* People still use OE-classic from time to time. Should we remove the repo?&lt;br /&gt;
* Security processes&lt;br /&gt;
* Community Development / Team Building (please add more examples/ideas...  almond flour cake is always good...)&lt;br /&gt;
** Intro / crash course events&lt;br /&gt;
** Coordinated bug day sprints&lt;br /&gt;
** Other group/meetup activities&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=OEDAM_2015&amp;diff=7647</id>
		<title>OEDAM 2015</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=OEDAM_2015&amp;diff=7647"/>
		<updated>2015-03-13T17:07:28Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Attendees */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Location and Time ==&lt;br /&gt;
&lt;br /&gt;
March 27-28 (after ELC and Yocto Project Developer Day)&lt;br /&gt;
&lt;br /&gt;
2315 North 1st Street, San Jose, CA 95131 &lt;br /&gt;
&lt;br /&gt;
https://goo.gl/maps/1pRGR&lt;br /&gt;
&lt;br /&gt;
Now that people are already claiming to attend by Google Hangout, I will announce our intention to also webcast via Google Hangout ;)&lt;br /&gt;
&lt;br /&gt;
== Attendees ==&lt;br /&gt;
&lt;br /&gt;
* Philip Balister (Crofton)&lt;br /&gt;
* Denys Dmytriyenko (denix)&lt;br /&gt;
* Armin Kuster (Armpit)&lt;br /&gt;
* Martin Jansa (JaMa) - 50%&lt;br /&gt;
* Michael Halstead (halstead) - Friday only&lt;br /&gt;
* Jeff Osier-Mixon (jefro)&lt;br /&gt;
* Paul Eggleton (bluelightning)&lt;br /&gt;
* Steve Arnold (nerdboy/mr_science)&lt;br /&gt;
* Stephanie Lockwood-Childs (wormo/sjl) - via hangout&lt;br /&gt;
* Ron Lockwood-Childs (speedy1) - via hangout&lt;br /&gt;
* Herb Kuta&lt;br /&gt;
* Tim Orling (moto-timo)&lt;br /&gt;
* Sean Hudson (darknighte)&lt;br /&gt;
* Bruce Ashfield (zedd) - probably&lt;br /&gt;
* Mark Hatle (fray) - probably&lt;br /&gt;
&lt;br /&gt;
== Agenda Items ==&lt;br /&gt;
&lt;br /&gt;
* Progress on items identified during OEDAM 2014&lt;br /&gt;
* Development cycle&lt;br /&gt;
* Removing the oe-core and meta-oe repos. These repos are now called openembedded-core and meta-openembedded/&lt;br /&gt;
* People still use OE-classic from time to time. Should we remove the repo?&lt;br /&gt;
* Community Development / Team Building (please add more examples/ideas...  almond flour cake is always good...)&lt;br /&gt;
** Intro / crash course events&lt;br /&gt;
** Coordinated bug day sprints&lt;br /&gt;
** Other group/meetup activities&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Dusseldorf,_2014&amp;diff=7393</id>
		<title>Dusseldorf, 2014</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Dusseldorf,_2014&amp;diff=7393"/>
		<updated>2014-09-05T22:37:57Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Attendance */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Location ==&lt;br /&gt;
&lt;br /&gt;
Congress Centre Düsseldorf, Düsseldorf, Germany&lt;br /&gt;
&lt;br /&gt;
October 14, 2014 at 1300 - 1500 in room 10.&lt;br /&gt;
&lt;br /&gt;
== Agenda ==&lt;br /&gt;
&lt;br /&gt;
* Financial report&lt;br /&gt;
* Election of new members&lt;br /&gt;
&lt;br /&gt;
== Forms ==&lt;br /&gt;
&lt;br /&gt;
* Proxy form [[File:Proxy_instructions-oe.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Attendance ==&lt;br /&gt;
* Martin &#039;JaMa&#039; Jansa&lt;br /&gt;
* Jeff &#039;Jefro&#039; Osier-Mixon&lt;br /&gt;
* Denys &#039;denix&#039; Dmytriyenko&lt;br /&gt;
* Dave &amp;quot;davest&amp;quot; Stewart (likely)&lt;br /&gt;
* Philip &amp;quot;Crofton&amp;quot; Balister&lt;br /&gt;
* Ross &amp;quot;rburton&amp;quot; Burton&lt;br /&gt;
* &#039;Khem&#039; Raj&lt;br /&gt;
* Mark &#039;fray&#039; Hatle&lt;br /&gt;
&lt;br /&gt;
== Meeting notes ==&lt;br /&gt;
&lt;br /&gt;
== Action Items ==&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=OEDAM_2014&amp;diff=7243</id>
		<title>OEDAM 2014</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=OEDAM_2014&amp;diff=7243"/>
		<updated>2014-05-13T18:40:21Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Why is embedded still hard */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OpenEmbedded Developers America Meeting =&lt;br /&gt;
&lt;br /&gt;
The OpenEmbedded Project held a developers meeting May 2-3, 2014, in Santa Clara, CA. This meeting was co-located with the Embedded Linux Conference North America. All active OpenEmbedded developers were invited to attend. &lt;br /&gt;
&lt;br /&gt;
Contact [mailto:jefro@jefro.net Jefro] with any questions.&lt;br /&gt;
&lt;br /&gt;
== Location &amp;amp; Time ==&lt;br /&gt;
&lt;br /&gt;
May 2-3, 2014&amp;lt;br&amp;gt;&lt;br /&gt;
9am - 5pm&lt;br /&gt;
&lt;br /&gt;
[https://www.google.com/maps/preview#!q=4600+Patrick+Henry+Dr+Santa+Clara%2C+CA+95054+&amp;amp;data=!1m4!1m3!1d9724!2d-121.985724!3d37.3978139!4m15!2m14!1m13!1s0x808fc9d0bdf38417%3A0x8ca7d9c558968760!3m8!1m3!1d2439!2d-80.4013806!3d37.1440125!3m2!1i1366!2i589!4f13.1!4m2!3d37.3978139!4d-121.985724 Ettus Research / National Instruments]&amp;lt;br&amp;gt;&lt;br /&gt;
4600 Patrick Henry Drive&amp;lt;br&amp;gt;&lt;br /&gt;
Santa Clara, CA 95054 USA&lt;br /&gt;
&lt;br /&gt;
== Goals ==&lt;br /&gt;
&lt;br /&gt;
* Have fun.&lt;br /&gt;
* Get useful work done that benefits from high bandwidth interactions.&lt;br /&gt;
* Get more people involved with the project at a higher level.&lt;br /&gt;
&lt;br /&gt;
== Working Agenda ==&lt;br /&gt;
&lt;br /&gt;
This agenda is flexible, and meant to reflect the important issues in the OE community. Please feel free to contribute agenda items. We will finalize the agenda after introduction to maximize use of people&#039;s time.&lt;br /&gt;
&lt;br /&gt;
* Introductions. Be prepared to tell us who you are and how you use OpenEmbedded (and the Yocto Project)&lt;br /&gt;
* The Yocto Project is supposed to make Embedded easy. What is still hard?&lt;br /&gt;
* bug scrub (also bug collecting/wrangling)&lt;br /&gt;
* ongoing role of the OE TSC&lt;br /&gt;
* wiki/website organization&lt;br /&gt;
* online voting&lt;br /&gt;
* increasing the amount of hardware that works out of the box with oe-core + layers&lt;br /&gt;
* next + 1 release&lt;br /&gt;
* quality of meta-oe and what to do with it: http://lists.openembedded.org/pipermail/openembedded-devel/2014-March/094893.html&lt;br /&gt;
* lune to replace sato?&lt;br /&gt;
* developer community - outreach/recruiting/mentoring, new developer documentation, process and QA tools&lt;br /&gt;
* image deployment/update best practices (shared yocto issue)&lt;br /&gt;
* feedback on Toaster, the web interface for BitBake (some background in this thread https://lists.yoctoproject.org/pipermail/yocto/2014-April/018956.html)&lt;br /&gt;
* infrastructure sync&lt;br /&gt;
&lt;br /&gt;
== Registered Attendees ==&lt;br /&gt;
&lt;br /&gt;
* Philip Balister (Crofton)&lt;br /&gt;
* &amp;lt;strike&amp;gt;Richard Purdie (RP)&amp;lt;/strike&amp;gt;&lt;br /&gt;
* Mark Hatle (fray)&lt;br /&gt;
* Khem Raj (khem)&lt;br /&gt;
* Martin Jansa (jama)&lt;br /&gt;
* Armin Kuster (akuster)&lt;br /&gt;
* Jeff Osier-Mixon (jefro)&lt;br /&gt;
* Alejandro del Castillo&lt;br /&gt;
* Tom King (ka6sox)&lt;br /&gt;
* Steve Arnold (mr_science/nerdboy)&lt;br /&gt;
* Herb Kuta&lt;br /&gt;
* Trevor Woerner (tlwoerner)&lt;br /&gt;
* Sean Hudson (darknighte)&lt;br /&gt;
* Denys Dmytriyenko (denix)&lt;br /&gt;
* Toby Flynn&lt;br /&gt;
* Adam Bell&lt;br /&gt;
* Belen Barros Pena (belen)&lt;br /&gt;
* Brian Hutchinson&lt;br /&gt;
* Tim Orling (moto-timo)&lt;br /&gt;
* Michael Halstead (halstead)&lt;br /&gt;
* &amp;lt;your name here&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Minutes =&lt;br /&gt;
&lt;br /&gt;
== Actual Attendance ==&lt;br /&gt;
&lt;br /&gt;
* armin kuster&lt;br /&gt;
* tim orling&lt;br /&gt;
* herb kuta&lt;br /&gt;
* martin jansa&lt;br /&gt;
* toby flynn&lt;br /&gt;
* steve arnold&lt;br /&gt;
* adam bell&lt;br /&gt;
* mark hatle&lt;br /&gt;
* sean hudson&lt;br /&gt;
* philip balister&lt;br /&gt;
* denys dmitriyenko&lt;br /&gt;
* alan bennett &lt;br /&gt;
* trevor woerner &lt;br /&gt;
* michael halstead&lt;br /&gt;
* belen barros pena&lt;br /&gt;
* bill mills&lt;br /&gt;
* khem raj&lt;br /&gt;
* alejandro del castillo&lt;br /&gt;
* jefro&lt;br /&gt;
&lt;br /&gt;
on call:&lt;br /&gt;
* richard purdie&lt;br /&gt;
* paul eggleton&lt;br /&gt;
* saul wold&lt;br /&gt;
* bruce ashfield&lt;br /&gt;
&lt;br /&gt;
== Agenda ==&lt;br /&gt;
&lt;br /&gt;
We worked out a detailed agenda as the first task on Friday morning.&lt;br /&gt;
&lt;br /&gt;
Fri am:&lt;br /&gt;
* introductions&lt;br /&gt;
* Lava&lt;br /&gt;
* ongoing role of the TSC&lt;br /&gt;
* Why is embedded still hard? &amp;amp; RP&#039;s email&lt;br /&gt;
&lt;br /&gt;
Fri pm:&lt;br /&gt;
* unfinished business from this morning&lt;br /&gt;
* Lune to replace Sato&lt;br /&gt;
* increasing BSP quantity &amp;amp; quality&lt;br /&gt;
* next+1 release&lt;br /&gt;
* online voting&lt;br /&gt;
* best practices - image deployment, default config&lt;br /&gt;
&lt;br /&gt;
Sat:&lt;br /&gt;
* unfinished business from Friday&lt;br /&gt;
* wiki/website organization&lt;br /&gt;
* meta-oe quality&lt;br /&gt;
* developer community outreach&lt;br /&gt;
* bug scrub&lt;br /&gt;
&lt;br /&gt;
offline:&lt;br /&gt;
* toaster feedback&lt;br /&gt;
* infrastructure sync&lt;br /&gt;
&lt;br /&gt;
== Lava ==&lt;br /&gt;
&lt;br /&gt;
no board farm, possible to set up distributed board farm&amp;lt;br&amp;gt;&lt;br /&gt;
worried about documentation&amp;lt;br&amp;gt;&lt;br /&gt;
long term aggregate many, for now just a handful of hardware&amp;lt;br&amp;gt;&lt;br /&gt;
linaro can help define lava piece&amp;lt;br&amp;gt;&lt;br /&gt;
define what to certify, then push results&amp;lt;br&amp;gt;&lt;br /&gt;
simple data: configuration and red/green (yellow?) on layer+config+hw basis&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3 stages:&amp;lt;br&amp;gt;&lt;br /&gt;
* building&lt;br /&gt;
* testing (potentially lava)&lt;br /&gt;
* aggregation &amp;amp; publishing data (toaster?)&lt;br /&gt;
&lt;br /&gt;
lava has ways to report results, suspect regressions&amp;lt;br&amp;gt;&lt;br /&gt;
drilldown capability&amp;lt;br&amp;gt;&lt;br /&gt;
lava difficult to connect inside/outside firewalls&lt;br /&gt;
&lt;br /&gt;
error reporting tool in 1.6&amp;lt;br&amp;gt;&lt;br /&gt;
standard output push to bug reporting tool like this&amp;lt;br&amp;gt;&lt;br /&gt;
like a failure pastebin&amp;lt;br&amp;gt;&lt;br /&gt;
can mine data &amp;amp; look for trends&lt;br /&gt;
&lt;br /&gt;
porting 1.6 requires resources &amp;lt;br&amp;gt;&lt;br /&gt;
2k tests in 1.6, more tests less necessary than integration&lt;br /&gt;
&lt;br /&gt;
parallel work, not for 1.7&amp;lt;br&amp;gt;&lt;br /&gt;
nice to have simplified install complete with lava, hw pieces, additional test pieces&amp;lt;br&amp;gt;&lt;br /&gt;
interface for aggregation - porting mechanism&amp;lt;br&amp;gt;&lt;br /&gt;
built on error reporting system&lt;br /&gt;
&lt;br /&gt;
action items:&lt;br /&gt;
* autobuilder assets tested in lava, apply to ab output (alan -&amp;gt; beth, michael)&lt;br /&gt;
* take some tests performed in 1.6 and bring into lava (ti/bill, steve nerdboy)&lt;br /&gt;
* define requirements for aggregation system (sean)&lt;br /&gt;
&lt;br /&gt;
== Ongoing role of the TSC ==&lt;br /&gt;
&lt;br /&gt;
needed someone to set direction&amp;lt;br&amp;gt;&lt;br /&gt;
fulfilled original charter&amp;lt;br&amp;gt;&lt;br /&gt;
board &amp;amp; happy with TSC - responsive&amp;lt;br&amp;gt;&lt;br /&gt;
still needed?&amp;lt;br&amp;gt;&lt;br /&gt;
new public meeting + as needed format is not much work&amp;lt;br&amp;gt;&lt;br /&gt;
hardest thing is topics&amp;lt;br&amp;gt;&lt;br /&gt;
* jefro to help with topics&lt;br /&gt;
need to do more? less?&amp;lt;br&amp;gt;&lt;br /&gt;
denys - people would like to see more diversity&amp;lt;br&amp;gt;&lt;br /&gt;
heavy on yocto project&amp;lt;br&amp;gt;&lt;br /&gt;
members have worked to isolate roles&amp;lt;br&amp;gt;&lt;br /&gt;
community requests yes keep going, yes keep elections&amp;lt;br&amp;gt;&lt;br /&gt;
if contentious issue, group that can vote&amp;lt;br&amp;gt;&lt;br /&gt;
like RP not being overwhelmed &amp;amp; provide contrast&amp;lt;br&amp;gt;&lt;br /&gt;
community meetings very useful&amp;lt;br&amp;gt;&lt;br /&gt;
some concern about uniformity/affiliations but trust exists&amp;lt;br&amp;gt;&lt;br /&gt;
mark: call us on it if you think we are deciding for intel/wr/whoever&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
board to do these things within the next month:&lt;br /&gt;
* ask community if anyone else wants to step in or if anyone wants to step down&lt;br /&gt;
* vote everyone together&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
mark asked about discussion re dissolving ev, moving it elsewhere, etc&amp;lt;br&amp;gt;&lt;br /&gt;
no movement planned right now&amp;lt;br&amp;gt;&lt;br /&gt;
have account for donations&lt;br /&gt;
&lt;br /&gt;
== Why is embedded still hard ==&lt;br /&gt;
&lt;br /&gt;
i.e. best practices&lt;br /&gt;
&lt;br /&gt;
learning curve&amp;lt;br&amp;gt;&lt;br /&gt;
oe and yp trying to make embedded easier&amp;lt;br&amp;gt;&lt;br /&gt;
many tasks involved &amp;lt;br&amp;gt;&lt;br /&gt;
finding changes/errors involves many steps&amp;lt;br&amp;gt;&lt;br /&gt;
locked sstate coming&amp;lt;br&amp;gt;&lt;br /&gt;
just documentation issue? no, but that is where to begin&amp;lt;br&amp;gt;&lt;br /&gt;
many people don&#039;t want to know about build systems, they want magic to happen&amp;lt;br&amp;gt;&lt;br /&gt;
system integrateors are very happy with yp&amp;lt;br&amp;gt;&lt;br /&gt;
app developers don&#039;t care&amp;lt;br&amp;gt;&lt;br /&gt;
- app developers don&#039;t (or shouldn&#039;t) care about using all of bitbake/oe&amp;lt;br&amp;gt;&lt;br /&gt;
- they should care about compiling, debugging, and even deployment of their application&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
figure out steps, maybe yp does - white papers, best practices, disseminate&amp;lt;br&amp;gt;&lt;br /&gt;
what do i hav eto do day to day to get it done&amp;lt;br&amp;gt;&lt;br /&gt;
encapsulate problem&amp;lt;br&amp;gt;&lt;br /&gt;
* capture daily workflow, write email&lt;br /&gt;
&lt;br /&gt;
aggregate - yp tech writer&lt;br /&gt;
&lt;br /&gt;
external source class stuff&amp;lt;br&amp;gt;&lt;br /&gt;
narcissus good at making images, but can make images that don&#039;t work&amp;lt;br&amp;gt;&lt;br /&gt;
much discussion about details&amp;lt;br&amp;gt;&lt;br /&gt;
* document personal workflows as best we can &amp;amp; categorize&lt;br /&gt;
* DEPENDS overloaded? khem&lt;br /&gt;
&lt;br /&gt;
* document workflows based on rp&#039;s email&lt;br /&gt;
* based on workflows, determine how extermal toolchains to be used&lt;br /&gt;
* dependency tree&lt;br /&gt;
* ? feed based assembly for the yocto autobuilders&lt;br /&gt;
* install built toolchain as toolchain (steve)&lt;br /&gt;
* generate RPMs - external source workflow&lt;br /&gt;
* eclipse&lt;br /&gt;
&lt;br /&gt;
* take to list&lt;br /&gt;
&lt;br /&gt;
== Increasing layer quality ==&lt;br /&gt;
&lt;br /&gt;
have a lot of layers, some better maintained than others&amp;lt;br&amp;gt;&lt;br /&gt;
monitor maintainers&amp;lt;br&amp;gt;&lt;br /&gt;
where to file bugs&amp;lt;br&amp;gt;&lt;br /&gt;
MAINTAINER file should include where to send patches, report problems&amp;lt;br&amp;gt;&lt;br /&gt;
eg on github use github issues system or to mailing list&amp;lt;br&amp;gt;&lt;br /&gt;
possibly on yp bugzilla?&lt;br /&gt;
&lt;br /&gt;
RP:&amp;lt;br&amp;gt;&lt;br /&gt;
no new bugs in yp bugzilla, policy is not supporting bugs for outside projects&amp;lt;br&amp;gt;&lt;br /&gt;
unless someone from that project joins the triage team&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
quality of any layer, esp oe layers, bring it up to the tsc &amp;amp; main maintainer if one exists&amp;lt;br&amp;gt;&lt;br /&gt;
document:&amp;lt;br&amp;gt;&lt;br /&gt;
1. maintainer makes right technical decisions for layer - rp is the boss&amp;lt;br&amp;gt;&lt;br /&gt;
2. must respond on ml within reasonable time, longer than 2 weeks is too long&amp;lt;br&amp;gt;&lt;br /&gt;
3. if cant do maintainership along with other paid work, find someone&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
maintainer = quality&lt;br /&gt;
&lt;br /&gt;
* philip: for yp users: best practice read martin&#039;s emails about broken recipes&lt;br /&gt;
disable broken layers?&amp;lt;br&amp;gt;&lt;br /&gt;
has to be a way to tell people who don&#039;t read emails&amp;lt;br&amp;gt;&lt;br /&gt;
move or remove on 2nd iteration&amp;lt;br&amp;gt;&lt;br /&gt;
blacklist recipe inside itself&amp;lt;br&amp;gt;&lt;br /&gt;
add to default inherit&lt;br /&gt;
&lt;br /&gt;
* increase pain for stuff that just fails&lt;br /&gt;
highlight qa fails, cheerlead &amp;amp; encourage people to look at&amp;lt;br&amp;gt;&lt;br /&gt;
more review comments helps&amp;lt;br&amp;gt;&lt;br /&gt;
collect stats&amp;lt;br&amp;gt;&lt;br /&gt;
explain what using stats for&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
advertise e.g. meta-selinux&lt;br /&gt;
&lt;br /&gt;
* extra fields on layer index (maintainers, readme file)&lt;br /&gt;
* philip to send to list re updates to README files, paul to see if he can parse things out of it&lt;br /&gt;
* place to put results if attached to autobuilder:  dont have to advocate right away,  best practices on what to bulid against - 1.4, 1.5, master, etc&lt;br /&gt;
* guidance to new maintainers&lt;br /&gt;
&lt;br /&gt;
Philip:&lt;br /&gt;
* working demos &amp;amp; starting points, e.g. qt demo&amp;lt;br&amp;gt;&lt;br /&gt;
cinematic&amp;lt;br&amp;gt;&lt;br /&gt;
working on a set of hardware, not just one&amp;lt;br&amp;gt;&lt;br /&gt;
also document how I made the demo - no reason for handwaving&lt;br /&gt;
&lt;br /&gt;
devday - splitting by function, auto/iot/medical&amp;lt;br&amp;gt;&lt;br /&gt;
getting a number of vendors interested in helping with&lt;br /&gt;
&lt;br /&gt;
* pb to agitate on list for demo with recipes, no bsps - non arch specific&lt;br /&gt;
&lt;br /&gt;
== lune ==&lt;br /&gt;
&lt;br /&gt;
came from openwebos&amp;lt;br&amp;gt;&lt;br /&gt;
rewritten to be in qt5&amp;lt;br&amp;gt;&lt;br /&gt;
great for phones, tablets, internet of 5&amp;lt;br&amp;gt;&lt;br /&gt;
need qt5 in oe-core&amp;lt;br&amp;gt;&lt;br /&gt;
many demos&amp;lt;br&amp;gt;&lt;br /&gt;
html5&amp;lt;br&amp;gt;&lt;br /&gt;
luna is webos specific. this is lune os&lt;br /&gt;
&lt;br /&gt;
general consensus - yes, worth making it work for oe demos&amp;lt;br&amp;gt;&lt;br /&gt;
bmills would love to see solutoin that does not require hw acceleration&amp;lt;br&amp;gt;&lt;br /&gt;
good demo that can build &amp;lt;br&amp;gt;&lt;br /&gt;
not good for qemu&lt;br /&gt;
&lt;br /&gt;
2 things&amp;lt;br&amp;gt;&lt;br /&gt;
need sane demo that looks better than sato&amp;lt;br&amp;gt;&lt;br /&gt;
better demo for high end hardware&lt;br /&gt;
&lt;br /&gt;
node.js is another option&amp;lt;br&amp;gt;&lt;br /&gt;
lune uses v8 or node&lt;br /&gt;
&lt;br /&gt;
* jama to do initial work, will post for help when needed&lt;br /&gt;
* not to replace completely &amp;amp; put into oe-core, don&#039;t want to upstream due to requiring change in qt&lt;br /&gt;
&lt;br /&gt;
== next+1 release ==&lt;br /&gt;
&lt;br /&gt;
khem: meta-oe in yocto (1.8? no, 4.04)&amp;lt;br&amp;gt;&lt;br /&gt;
poky, oe-core YP compatible&lt;br /&gt;
&lt;br /&gt;
improve deployment&amp;lt;br&amp;gt;&lt;br /&gt;
currently board specific, maybe my board is different&amp;lt;br&amp;gt;&lt;br /&gt;
also installer - config for 1st boot&lt;br /&gt;
&lt;br /&gt;
common pieces - same sd card formatting several different products&amp;lt;br&amp;gt;&lt;br /&gt;
so spit out sd image small then enlarged, awesome&amp;lt;br&amp;gt;&lt;br /&gt;
solves 80% of installation needs&amp;lt;br&amp;gt;&lt;br /&gt;
deployment config file&amp;lt;br&amp;gt;&lt;br /&gt;
no sudo&amp;lt;br&amp;gt;&lt;br /&gt;
WIC&amp;lt;br&amp;gt;&lt;br /&gt;
target: 1.7&lt;br /&gt;
&lt;br /&gt;
upgrade methods that don&#039;t use package feeds&amp;lt;br&amp;gt;&lt;br /&gt;
autobuilder &amp;amp; tester feeds to upgrade&amp;lt;br&amp;gt;&lt;br /&gt;
can&#039;t rely on distros to alert&amp;lt;br&amp;gt;&lt;br /&gt;
khem - images want upgradability&amp;lt;br&amp;gt;&lt;br /&gt;
eg internal storage and an SD card&amp;lt;br&amp;gt;&lt;br /&gt;
dual identical partitions for failover&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
best practices, industry examples&amp;lt;br&amp;gt;&lt;br /&gt;
need good samples&amp;lt;br&amp;gt;&lt;br /&gt;
=&amp;gt; please document this problem if you have solved it&amp;lt;br&amp;gt;&lt;br /&gt;
in-service updates&amp;lt;br&amp;gt;&lt;br /&gt;
other option - atomic package feeds&lt;br /&gt;
&lt;br /&gt;
plans for clang on oe&amp;lt;br&amp;gt;&lt;br /&gt;
fray&#039;s secondary toolchain layer&amp;lt;br&amp;gt;&lt;br /&gt;
layer availalbe, not in oe-core&lt;br /&gt;
&lt;br /&gt;
html5 applications to become first class citizens&amp;lt;br&amp;gt;&lt;br /&gt;
oe? oe-core? bill: layer, but well supported&amp;lt;br&amp;gt;&lt;br /&gt;
also for processors without hw accel&amp;lt;br&amp;gt;&lt;br /&gt;
scale down to dumb framebuffers&lt;br /&gt;
&lt;br /&gt;
lava&amp;lt;br&amp;gt;&lt;br /&gt;
steve: deployed jenkins to apache&lt;br /&gt;
&lt;br /&gt;
cryptographically signed sstate cache&amp;lt;br&amp;gt;&lt;br /&gt;
secure development life cycles&lt;br /&gt;
&lt;br /&gt;
== online voting &amp;amp; other board issues ==&lt;br /&gt;
&lt;br /&gt;
drupal site for yocto project&amp;lt;br&amp;gt;&lt;br /&gt;
registered members can vote&amp;lt;br&amp;gt;&lt;br /&gt;
code is built already, like surveymonkey&lt;br /&gt;
&lt;br /&gt;
Philip: any sane system is great&amp;lt;br&amp;gt;&lt;br /&gt;
* sean to drive voting system&lt;br /&gt;
&lt;br /&gt;
more regular developer meetings&amp;lt;br&amp;gt;&lt;br /&gt;
build a sense of community&amp;lt;br&amp;gt;&lt;br /&gt;
need advance notice - 2-3 months&amp;lt;br&amp;gt;&lt;br /&gt;
find space&lt;br /&gt;
&lt;br /&gt;
devday - trainers, overlap with plumbers&lt;br /&gt;
&lt;br /&gt;
funding discussion - ongoing&lt;br /&gt;
&lt;br /&gt;
= Mark Hatle&#039;s notes =&lt;br /&gt;
&lt;br /&gt;
Complaints about local.conf files from 3rd parties...&lt;br /&gt;
&lt;br /&gt;
— local.conf generation, comment it!&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
solution use format/comments similar to existing local.conf and local.conf.extended so new developers can translate their work.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Friday Morning discussion, couple of key points to remember as we move forward with oe development:&lt;br /&gt;
&lt;br /&gt;
— Document workflows (based on RPs email)&amp;lt;br&amp;gt;&lt;br /&gt;
— Reuse SDK toolchain&amp;lt;br&amp;gt;&lt;br /&gt;
— External SRC workflow&amp;lt;br&amp;gt;&lt;br /&gt;
— manual adjust (opt-out) of dep change&amp;lt;br&amp;gt;&lt;br /&gt;
— feed based assembly for app dev&amp;lt;br&amp;gt;&lt;br /&gt;
— Generate a ‘package’ from the SDK, add to feed and deploy&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Friday Afternoon discussion, making embedded easier.  Few key things we can do..&lt;br /&gt;
&lt;br /&gt;
— Git/SCM workflow/best practices&amp;lt;br&amp;gt;&lt;br /&gt;
— SCM rate of change is an indication of quality&amp;lt;br&amp;gt;&lt;br /&gt;
— OE Stats/Recipe usage stats&amp;lt;br&amp;gt;&lt;br /&gt;
— layer index — maintainer info, submit patches, auto builder, test results, …&amp;lt;br&amp;gt;&lt;br /&gt;
— working demos&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Saturday Next+1 Future discussion...&lt;br /&gt;
&lt;br /&gt;
— deployment (wic — partitions… , network fs)&amp;lt;br&amp;gt;&lt;br /&gt;
— heterogeneous systems (GPU, DSP, multi arch)&amp;lt;br&amp;gt;&lt;br /&gt;
— HTML5 apps become first class citizens&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=OEDAM_2014&amp;diff=7241</id>
		<title>OEDAM 2014</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=OEDAM_2014&amp;diff=7241"/>
		<updated>2014-05-13T15:04:47Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Mark Hatle&amp;#039;s notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OpenEmbedded Developers America Meeting =&lt;br /&gt;
&lt;br /&gt;
The OpenEmbedded Project held a developers meeting May 2-3, 2014, in Santa Clara, CA. This meeting was co-located with the Embedded Linux Conference North America. All active OpenEmbedded developers were invited to attend. &lt;br /&gt;
&lt;br /&gt;
Contact [mailto:jefro@jefro.net Jefro] with any questions.&lt;br /&gt;
&lt;br /&gt;
== Location &amp;amp; Time ==&lt;br /&gt;
&lt;br /&gt;
May 2-3, 2014&amp;lt;br&amp;gt;&lt;br /&gt;
9am - 5pm&lt;br /&gt;
&lt;br /&gt;
[https://www.google.com/maps/preview#!q=4600+Patrick+Henry+Dr+Santa+Clara%2C+CA+95054+&amp;amp;data=!1m4!1m3!1d9724!2d-121.985724!3d37.3978139!4m15!2m14!1m13!1s0x808fc9d0bdf38417%3A0x8ca7d9c558968760!3m8!1m3!1d2439!2d-80.4013806!3d37.1440125!3m2!1i1366!2i589!4f13.1!4m2!3d37.3978139!4d-121.985724 Ettus Research / National Instruments]&amp;lt;br&amp;gt;&lt;br /&gt;
4600 Patrick Henry Drive&amp;lt;br&amp;gt;&lt;br /&gt;
Santa Clara, CA 95054 USA&lt;br /&gt;
&lt;br /&gt;
== Goals ==&lt;br /&gt;
&lt;br /&gt;
* Have fun.&lt;br /&gt;
* Get useful work done that benefits from high bandwidth interactions.&lt;br /&gt;
* Get more people involved with the project at a higher level.&lt;br /&gt;
&lt;br /&gt;
== Working Agenda ==&lt;br /&gt;
&lt;br /&gt;
This agenda is flexible, and meant to reflect the important issues in the OE community. Please feel free to contribute agenda items. We will finalize the agenda after introduction to maximize use of people&#039;s time.&lt;br /&gt;
&lt;br /&gt;
* Introductions. Be prepared to tell us who you are and how you use OpenEmbedded (and the Yocto Project)&lt;br /&gt;
* The Yocto Project is supposed to make Embedded easy. What is still hard?&lt;br /&gt;
* bug scrub (also bug collecting/wrangling)&lt;br /&gt;
* ongoing role of the OE TSC&lt;br /&gt;
* wiki/website organization&lt;br /&gt;
* online voting&lt;br /&gt;
* increasing the amount of hardware that works out of the box with oe-core + layers&lt;br /&gt;
* next + 1 release&lt;br /&gt;
* quality of meta-oe and what to do with it: http://lists.openembedded.org/pipermail/openembedded-devel/2014-March/094893.html&lt;br /&gt;
* lune to replace sato?&lt;br /&gt;
* developer community - outreach/recruiting/mentoring, new developer documentation, process and QA tools&lt;br /&gt;
* image deployment/update best practices (shared yocto issue)&lt;br /&gt;
* feedback on Toaster, the web interface for BitBake (some background in this thread https://lists.yoctoproject.org/pipermail/yocto/2014-April/018956.html)&lt;br /&gt;
* infrastructure sync&lt;br /&gt;
&lt;br /&gt;
== Registered Attendees ==&lt;br /&gt;
&lt;br /&gt;
* Philip Balister (Crofton)&lt;br /&gt;
* &amp;lt;strike&amp;gt;Richard Purdie (RP)&amp;lt;/strike&amp;gt;&lt;br /&gt;
* Mark Hatle (fray)&lt;br /&gt;
* Khem Raj (khem)&lt;br /&gt;
* Martin Jansa (jama)&lt;br /&gt;
* Armin Kuster (akuster)&lt;br /&gt;
* Jeff Osier-Mixon (jefro)&lt;br /&gt;
* Alejandro del Castillo&lt;br /&gt;
* Tom King (ka6sox)&lt;br /&gt;
* Steve Arnold (mr_science/nerdboy)&lt;br /&gt;
* Herb Kuta&lt;br /&gt;
* Trevor Woerner (tlwoerner)&lt;br /&gt;
* Sean Hudson (darknighte)&lt;br /&gt;
* Denys Dmytriyenko (denix)&lt;br /&gt;
* Toby Flynn&lt;br /&gt;
* Adam Bell&lt;br /&gt;
* Belen Barros Pena (belen)&lt;br /&gt;
* Brian Hutchinson&lt;br /&gt;
* Tim Orling (moto-timo)&lt;br /&gt;
* Michael Halstead (halstead)&lt;br /&gt;
* &amp;lt;your name here&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Minutes =&lt;br /&gt;
&lt;br /&gt;
== Actual Attendance ==&lt;br /&gt;
&lt;br /&gt;
* armin kuster&lt;br /&gt;
* tim orling&lt;br /&gt;
* herb kuta&lt;br /&gt;
* martin jansa&lt;br /&gt;
* toby flynn&lt;br /&gt;
* steve arnold&lt;br /&gt;
* adam bell&lt;br /&gt;
* mark hatle&lt;br /&gt;
* sean hudson&lt;br /&gt;
* philip balister&lt;br /&gt;
* denys dmitriyenko&lt;br /&gt;
* alan bennett &lt;br /&gt;
* trevor woerner &lt;br /&gt;
* michael halstead&lt;br /&gt;
* belen barros pena&lt;br /&gt;
* bill mills&lt;br /&gt;
* khem raj&lt;br /&gt;
* alejandro del castillo&lt;br /&gt;
* jefro&lt;br /&gt;
&lt;br /&gt;
on call:&lt;br /&gt;
* richard purdie&lt;br /&gt;
* paul eggleton&lt;br /&gt;
* saul wold&lt;br /&gt;
* bruce ashfield&lt;br /&gt;
&lt;br /&gt;
== Agenda ==&lt;br /&gt;
&lt;br /&gt;
We worked out a detailed agenda as the first task on Friday morning.&lt;br /&gt;
&lt;br /&gt;
Fri am:&lt;br /&gt;
* introductions&lt;br /&gt;
* Lava&lt;br /&gt;
* ongoing role of the TSC&lt;br /&gt;
* Why is embedded still hard? &amp;amp; RP&#039;s email&lt;br /&gt;
&lt;br /&gt;
Fri pm:&lt;br /&gt;
* unfinished business from this morning&lt;br /&gt;
* Lune to replace Sato&lt;br /&gt;
* increasing BSP quantity &amp;amp; quality&lt;br /&gt;
* next+1 release&lt;br /&gt;
* online voting&lt;br /&gt;
* best practices - image deployment, default config&lt;br /&gt;
&lt;br /&gt;
Sat:&lt;br /&gt;
* unfinished business from Friday&lt;br /&gt;
* wiki/website organization&lt;br /&gt;
* meta-oe quality&lt;br /&gt;
* developer community outreach&lt;br /&gt;
* bug scrub&lt;br /&gt;
&lt;br /&gt;
offline:&lt;br /&gt;
* toaster feedback&lt;br /&gt;
* infrastructure sync&lt;br /&gt;
&lt;br /&gt;
== Lava ==&lt;br /&gt;
&lt;br /&gt;
no board farm, possible to set up distributed board farm&amp;lt;br&amp;gt;&lt;br /&gt;
worried about documentation&amp;lt;br&amp;gt;&lt;br /&gt;
long term aggregate many, for now just a handful of hardware&amp;lt;br&amp;gt;&lt;br /&gt;
linaro can help define lava piece&amp;lt;br&amp;gt;&lt;br /&gt;
define what to certify, then push results&amp;lt;br&amp;gt;&lt;br /&gt;
simple data: configuration and red/green (yellow?) on layer+config+hw basis&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3 stages:&amp;lt;br&amp;gt;&lt;br /&gt;
* building&lt;br /&gt;
* testing (potentially lava)&lt;br /&gt;
* aggregation &amp;amp; publishing data (toaster?)&lt;br /&gt;
&lt;br /&gt;
lava has ways to report results, suspect regressions&amp;lt;br&amp;gt;&lt;br /&gt;
drilldown capability&amp;lt;br&amp;gt;&lt;br /&gt;
lava difficult to connect inside/outside firewalls&lt;br /&gt;
&lt;br /&gt;
error reporting tool in 1.6&amp;lt;br&amp;gt;&lt;br /&gt;
standard output push to bug reporting tool like this&amp;lt;br&amp;gt;&lt;br /&gt;
like a failure pastebin&amp;lt;br&amp;gt;&lt;br /&gt;
can mine data &amp;amp; look for trends&lt;br /&gt;
&lt;br /&gt;
porting 1.6 requires resources &amp;lt;br&amp;gt;&lt;br /&gt;
2k tests in 1.6, more tests less necessary than integration&lt;br /&gt;
&lt;br /&gt;
parallel work, not for 1.7&amp;lt;br&amp;gt;&lt;br /&gt;
nice to have simplified install complete with lava, hw pieces, additional test pieces&amp;lt;br&amp;gt;&lt;br /&gt;
interface for aggregation - porting mechanism&amp;lt;br&amp;gt;&lt;br /&gt;
built on error reporting system&lt;br /&gt;
&lt;br /&gt;
action items:&lt;br /&gt;
* autobuilder assets tested in lava, apply to ab output (alan -&amp;gt; beth, michael)&lt;br /&gt;
* take some tests performed in 1.6 and bring into lava (ti/bill, steve nerdboy)&lt;br /&gt;
* define requirements for aggregation system (sean)&lt;br /&gt;
&lt;br /&gt;
== Ongoing role of the TSC ==&lt;br /&gt;
&lt;br /&gt;
needed someone to set direction&amp;lt;br&amp;gt;&lt;br /&gt;
fulfilled original charter&amp;lt;br&amp;gt;&lt;br /&gt;
board &amp;amp; happy with TSC - responsive&amp;lt;br&amp;gt;&lt;br /&gt;
still needed?&amp;lt;br&amp;gt;&lt;br /&gt;
new public meeting + as needed format is not much work&amp;lt;br&amp;gt;&lt;br /&gt;
hardest thing is topics&amp;lt;br&amp;gt;&lt;br /&gt;
* jefro to help with topics&lt;br /&gt;
need to do more? less?&amp;lt;br&amp;gt;&lt;br /&gt;
denys - people would like to see more diversity&amp;lt;br&amp;gt;&lt;br /&gt;
heavy on yocto project&amp;lt;br&amp;gt;&lt;br /&gt;
members have worked to isolate roles&amp;lt;br&amp;gt;&lt;br /&gt;
community requests yes keep going, yes keep elections&amp;lt;br&amp;gt;&lt;br /&gt;
if contentious issue, group that can vote&amp;lt;br&amp;gt;&lt;br /&gt;
like RP not being overwhelmed &amp;amp; provide contrast&amp;lt;br&amp;gt;&lt;br /&gt;
community meetings very useful&amp;lt;br&amp;gt;&lt;br /&gt;
some concern about uniformity/affiliations but trust exists&amp;lt;br&amp;gt;&lt;br /&gt;
mark: call us on it if you think we are deciding for intel/wr/whoever&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
board to do these things within the next month:&lt;br /&gt;
* ask community if anyone else wants to step in or if anyone wants to step down&lt;br /&gt;
* vote everyone together&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
mark asked about discussion re dissolving ev, moving it elsewhere, etc&amp;lt;br&amp;gt;&lt;br /&gt;
no movement planned right now&amp;lt;br&amp;gt;&lt;br /&gt;
have account for donations&lt;br /&gt;
&lt;br /&gt;
== Why is embedded still hard ==&lt;br /&gt;
&lt;br /&gt;
i.e. best practices&lt;br /&gt;
&lt;br /&gt;
learning curve&amp;lt;br&amp;gt;&lt;br /&gt;
oe and yp trying to make embedded easier&amp;lt;br&amp;gt;&lt;br /&gt;
many tasks involved &amp;lt;br&amp;gt;&lt;br /&gt;
finding changes/errors involves many steps&amp;lt;br&amp;gt;&lt;br /&gt;
locked sstate coming&amp;lt;br&amp;gt;&lt;br /&gt;
just documentation issue? no, but that is where to begin&amp;lt;br&amp;gt;&lt;br /&gt;
many people don&#039;t want to know about build systems, they want magic to happen&amp;lt;br&amp;gt;&lt;br /&gt;
system integrateors are very happy with yp&amp;lt;br&amp;gt;&lt;br /&gt;
app developers don&#039;t care&amp;lt;br&amp;gt;&lt;br /&gt;
figure out steps, maybe yp does - white papers, best practices, disseminate&amp;lt;br&amp;gt;&lt;br /&gt;
what do i hav eto do day to day to get it done&amp;lt;br&amp;gt;&lt;br /&gt;
encapsulate problem&amp;lt;br&amp;gt;&lt;br /&gt;
* capture daily workflow, write email&lt;br /&gt;
&lt;br /&gt;
aggregate - yp tech writer&lt;br /&gt;
&lt;br /&gt;
external source class stuff&amp;lt;br&amp;gt;&lt;br /&gt;
narcissus good at making images, but can make images that don&#039;t work&amp;lt;br&amp;gt;&lt;br /&gt;
much discussion about details&amp;lt;br&amp;gt;&lt;br /&gt;
* document personal workflows as best we can &amp;amp; categorize&lt;br /&gt;
* DEPENDS overloaded? khem&lt;br /&gt;
&lt;br /&gt;
* document workflows based on rp&#039;s email&lt;br /&gt;
* based on workflows, determine how extermal toolchains to be used&lt;br /&gt;
* dependency tree&lt;br /&gt;
* ? feed based assembly for the yocto autobuilders&lt;br /&gt;
* install built toolchain as toolchain (steve)&lt;br /&gt;
* generate RPMs - external source workflow&lt;br /&gt;
* eclipse&lt;br /&gt;
&lt;br /&gt;
* take to list&lt;br /&gt;
&lt;br /&gt;
== Increasing layer quality ==&lt;br /&gt;
&lt;br /&gt;
have a lot of layers, some better maintained than others&amp;lt;br&amp;gt;&lt;br /&gt;
monitor maintainers&amp;lt;br&amp;gt;&lt;br /&gt;
where to file bugs&amp;lt;br&amp;gt;&lt;br /&gt;
MAINTAINER file should include where to send patches, report problems&amp;lt;br&amp;gt;&lt;br /&gt;
eg on github use github issues system or to mailing list&amp;lt;br&amp;gt;&lt;br /&gt;
possibly on yp bugzilla?&lt;br /&gt;
&lt;br /&gt;
RP:&amp;lt;br&amp;gt;&lt;br /&gt;
no new bugs in yp bugzilla, policy is not supporting bugs for outside projects&amp;lt;br&amp;gt;&lt;br /&gt;
unless someone from that project joins the triage team&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
quality of any layer, esp oe layers, bring it up to the tsc &amp;amp; main maintainer if one exists&amp;lt;br&amp;gt;&lt;br /&gt;
document:&amp;lt;br&amp;gt;&lt;br /&gt;
1. maintainer makes right technical decisions for layer - rp is the boss&amp;lt;br&amp;gt;&lt;br /&gt;
2. must respond on ml within reasonable time, longer than 2 weeks is too long&amp;lt;br&amp;gt;&lt;br /&gt;
3. if cant do maintainership along with other paid work, find someone&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
maintainer = quality&lt;br /&gt;
&lt;br /&gt;
* philip: for yp users: best practice read martin&#039;s emails about broken recipes&lt;br /&gt;
disable broken layers?&amp;lt;br&amp;gt;&lt;br /&gt;
has to be a way to tell people who don&#039;t read emails&amp;lt;br&amp;gt;&lt;br /&gt;
move or remove on 2nd iteration&amp;lt;br&amp;gt;&lt;br /&gt;
blacklist recipe inside itself&amp;lt;br&amp;gt;&lt;br /&gt;
add to default inherit&lt;br /&gt;
&lt;br /&gt;
* increase pain for stuff that just fails&lt;br /&gt;
highlight qa fails, cheerlead &amp;amp; encourage people to look at&amp;lt;br&amp;gt;&lt;br /&gt;
more review comments helps&amp;lt;br&amp;gt;&lt;br /&gt;
collect stats&amp;lt;br&amp;gt;&lt;br /&gt;
explain what using stats for&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
advertise e.g. meta-selinux&lt;br /&gt;
&lt;br /&gt;
* extra fields on layer index (maintainers, readme file)&lt;br /&gt;
* philip to send to list re updates to README files, paul to see if he can parse things out of it&lt;br /&gt;
* place to put results if attached to autobuilder:  dont have to advocate right away,  best practices on what to bulid against - 1.4, 1.5, master, etc&lt;br /&gt;
* guidance to new maintainers&lt;br /&gt;
&lt;br /&gt;
Philip:&lt;br /&gt;
* working demos &amp;amp; starting points, e.g. qt demo&amp;lt;br&amp;gt;&lt;br /&gt;
cinematic&amp;lt;br&amp;gt;&lt;br /&gt;
working on a set of hardware, not just one&amp;lt;br&amp;gt;&lt;br /&gt;
also document how I made the demo - no reason for handwaving&lt;br /&gt;
&lt;br /&gt;
devday - splitting by function, auto/iot/medical&amp;lt;br&amp;gt;&lt;br /&gt;
getting a number of vendors interested in helping with&lt;br /&gt;
&lt;br /&gt;
* pb to agitate on list for demo with recipes, no bsps - non arch specific&lt;br /&gt;
&lt;br /&gt;
== lune ==&lt;br /&gt;
&lt;br /&gt;
came from openwebos&amp;lt;br&amp;gt;&lt;br /&gt;
rewritten to be in qt5&amp;lt;br&amp;gt;&lt;br /&gt;
great for phones, tablets, internet of 5&amp;lt;br&amp;gt;&lt;br /&gt;
need qt5 in oe-core&amp;lt;br&amp;gt;&lt;br /&gt;
many demos&amp;lt;br&amp;gt;&lt;br /&gt;
html5&amp;lt;br&amp;gt;&lt;br /&gt;
luna is webos specific. this is lune os&lt;br /&gt;
&lt;br /&gt;
general consensus - yes, worth making it work for oe demos&amp;lt;br&amp;gt;&lt;br /&gt;
bmills would love to see solutoin that does not require hw acceleration&amp;lt;br&amp;gt;&lt;br /&gt;
good demo that can build &amp;lt;br&amp;gt;&lt;br /&gt;
not good for qemu&lt;br /&gt;
&lt;br /&gt;
2 things&amp;lt;br&amp;gt;&lt;br /&gt;
need sane demo that looks better than sato&amp;lt;br&amp;gt;&lt;br /&gt;
better demo for high end hardware&lt;br /&gt;
&lt;br /&gt;
node.js is another option&amp;lt;br&amp;gt;&lt;br /&gt;
lune uses v8 or node&lt;br /&gt;
&lt;br /&gt;
* jama to do initial work, will post for help when needed&lt;br /&gt;
* not to replace completely &amp;amp; put into oe-core, don&#039;t want to upstream due to requiring change in qt&lt;br /&gt;
&lt;br /&gt;
== next+1 release ==&lt;br /&gt;
&lt;br /&gt;
khem: meta-oe in yocto (1.8? no, 4.04)&amp;lt;br&amp;gt;&lt;br /&gt;
poky, oe-core YP compatible&lt;br /&gt;
&lt;br /&gt;
improve deployment&amp;lt;br&amp;gt;&lt;br /&gt;
currently board specific, maybe my board is different&amp;lt;br&amp;gt;&lt;br /&gt;
also installer - config for 1st boot&lt;br /&gt;
&lt;br /&gt;
common pieces - same sd card formatting several different products&amp;lt;br&amp;gt;&lt;br /&gt;
so spit out sd image small then enlarged, awesome&amp;lt;br&amp;gt;&lt;br /&gt;
solves 80% of installation needs&amp;lt;br&amp;gt;&lt;br /&gt;
deployment config file&amp;lt;br&amp;gt;&lt;br /&gt;
no sudo&amp;lt;br&amp;gt;&lt;br /&gt;
WIC&amp;lt;br&amp;gt;&lt;br /&gt;
target: 1.7&lt;br /&gt;
&lt;br /&gt;
upgrade methods that don&#039;t use package feeds&amp;lt;br&amp;gt;&lt;br /&gt;
autobuilder &amp;amp; tester feeds to upgrade&amp;lt;br&amp;gt;&lt;br /&gt;
can&#039;t rely on distros to alert&amp;lt;br&amp;gt;&lt;br /&gt;
khem - images want upgradability&amp;lt;br&amp;gt;&lt;br /&gt;
eg internal storage and an SD card&amp;lt;br&amp;gt;&lt;br /&gt;
dual identical partitions for failover&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
best practices, industry examples&amp;lt;br&amp;gt;&lt;br /&gt;
need good samples&amp;lt;br&amp;gt;&lt;br /&gt;
=&amp;gt; please document this problem if you have solved it&amp;lt;br&amp;gt;&lt;br /&gt;
in-service updates&amp;lt;br&amp;gt;&lt;br /&gt;
other option - atomic package feeds&lt;br /&gt;
&lt;br /&gt;
plans for clang on oe&amp;lt;br&amp;gt;&lt;br /&gt;
fray&#039;s secondary toolchain layer&amp;lt;br&amp;gt;&lt;br /&gt;
layer availalbe, not in oe-core&lt;br /&gt;
&lt;br /&gt;
html5 applications to become first class citizens&amp;lt;br&amp;gt;&lt;br /&gt;
oe? oe-core? bill: layer, but well supported&amp;lt;br&amp;gt;&lt;br /&gt;
also for processors without hw accel&amp;lt;br&amp;gt;&lt;br /&gt;
scale down to dumb framebuffers&lt;br /&gt;
&lt;br /&gt;
lava&amp;lt;br&amp;gt;&lt;br /&gt;
steve: deployed jenkins to apache&lt;br /&gt;
&lt;br /&gt;
cryptographically signed sstate cache&amp;lt;br&amp;gt;&lt;br /&gt;
secure development life cycles&lt;br /&gt;
&lt;br /&gt;
== online voting &amp;amp; other board issues ==&lt;br /&gt;
&lt;br /&gt;
drupal site for yocto project&amp;lt;br&amp;gt;&lt;br /&gt;
registered members can vote&amp;lt;br&amp;gt;&lt;br /&gt;
code is built already, like surveymonkey&lt;br /&gt;
&lt;br /&gt;
Philip: any sane system is great&amp;lt;br&amp;gt;&lt;br /&gt;
* sean to drive voting system&lt;br /&gt;
&lt;br /&gt;
more regular developer meetings&amp;lt;br&amp;gt;&lt;br /&gt;
build a sense of community&amp;lt;br&amp;gt;&lt;br /&gt;
need advance notice - 2-3 months&amp;lt;br&amp;gt;&lt;br /&gt;
find space&lt;br /&gt;
&lt;br /&gt;
devday - trainers, overlap with plumbers&lt;br /&gt;
&lt;br /&gt;
funding discussion - ongoing&lt;br /&gt;
&lt;br /&gt;
= Mark Hatle&#039;s notes =&lt;br /&gt;
&lt;br /&gt;
Complaints about local.conf files from 3rd parties...&lt;br /&gt;
&lt;br /&gt;
— local.conf generation, comment it!&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
solution use format/comments similar to existing local.conf and local.conf.extended so new developers can translate their work.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Friday Morning discussion, couple of key points to remember as we move forward with oe development:&lt;br /&gt;
&lt;br /&gt;
— Document workflows (based on RPs email)&amp;lt;br&amp;gt;&lt;br /&gt;
— Reuse SDK toolchain&amp;lt;br&amp;gt;&lt;br /&gt;
— External SRC workflow&amp;lt;br&amp;gt;&lt;br /&gt;
— manual adjust (opt-out) of dep change&amp;lt;br&amp;gt;&lt;br /&gt;
— feed based assembly for app dev&amp;lt;br&amp;gt;&lt;br /&gt;
— Generate a ‘package’ from the SDK, add to feed and deploy&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Friday Afternoon discussion, making embedded easier.  Few key things we can do..&lt;br /&gt;
&lt;br /&gt;
— Git/SCM workflow/best practices&amp;lt;br&amp;gt;&lt;br /&gt;
— SCM rate of change is an indication of quality&amp;lt;br&amp;gt;&lt;br /&gt;
— OE Stats/Recipe usage stats&amp;lt;br&amp;gt;&lt;br /&gt;
— layer index — maintainer info, submit patches, auto builder, test results, …&amp;lt;br&amp;gt;&lt;br /&gt;
— working demos&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Saturday Next+1 Future discussion...&lt;br /&gt;
&lt;br /&gt;
— deployment (wic — partitions… , network fs)&amp;lt;br&amp;gt;&lt;br /&gt;
— heterogeneous systems (GPU, DSP, multi arch)&amp;lt;br&amp;gt;&lt;br /&gt;
— HTML5 apps become first class citizens&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Edinburgh,_2013&amp;diff=6445</id>
		<title>Edinburgh, 2013</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Edinburgh,_2013&amp;diff=6445"/>
		<updated>2013-10-14T14:46:59Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Attendence Record */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Location ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Edinburgh International Conference Centre, Edinburgh, UK&lt;br /&gt;
&lt;br /&gt;
October 25, 2013 at 1830 - 1930&lt;br /&gt;
 &lt;br /&gt;
== Agenda ==&lt;br /&gt;
&lt;br /&gt;
* Financial report&lt;br /&gt;
&lt;br /&gt;
== Forms ==&lt;br /&gt;
&lt;br /&gt;
* Proxy form [[File:Proxy_instructions-oe.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Attendence Record ==&lt;br /&gt;
&lt;br /&gt;
(Proxies are in brackets)&lt;br /&gt;
&lt;br /&gt;
* Marco Cavallini &#039;mckoan&#039; (proxying for Eric Bénard &#039;ericben&#039;)&lt;br /&gt;
* Paul Eggleton &#039;bluelightning&#039; (proxying for Andrea Adami &#039;ant&#039;)&lt;br /&gt;
* Philip Balister &#039;Crofton&#039;&lt;br /&gt;
* Richard Purdie &#039;RP&#039;&lt;br /&gt;
* Martin Jansa &#039;JaMa&#039;&lt;br /&gt;
* Denys Dmytriyenko &#039;denix&#039;&lt;br /&gt;
* Koen Kooi &#039;koen&#039; ( Khem Raj &#039;khem&#039;)&lt;br /&gt;
* Anders Darander&lt;br /&gt;
* Mark Hatle &#039;fray&#039; (Otavio Salvador &#039;otavio&#039;)&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Edinburgh,_2013&amp;diff=6443</id>
		<title>Edinburgh, 2013</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Edinburgh,_2013&amp;diff=6443"/>
		<updated>2013-10-14T14:46:44Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Attendence Record */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Location ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Edinburgh International Conference Centre, Edinburgh, UK&lt;br /&gt;
&lt;br /&gt;
October 25, 2013 at 1830 - 1930&lt;br /&gt;
 &lt;br /&gt;
== Agenda ==&lt;br /&gt;
&lt;br /&gt;
* Financial report&lt;br /&gt;
&lt;br /&gt;
== Forms ==&lt;br /&gt;
&lt;br /&gt;
* Proxy form [[File:Proxy_instructions-oe.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Attendence Record ==&lt;br /&gt;
&lt;br /&gt;
(Proxies are in brackets)&lt;br /&gt;
&lt;br /&gt;
* Marco Cavallini &#039;mckoan&#039; (proxying for Eric Bénard &#039;ericben&#039;)&lt;br /&gt;
* Paul Eggleton &#039;bluelightning&#039; (proxying for Andrea Adami &#039;ant&#039;)&lt;br /&gt;
* Philip Balister &#039;Crofton&#039;&lt;br /&gt;
* Richard Purdie &#039;RP&#039;&lt;br /&gt;
* Martin Jansa &#039;JaMa&#039;&lt;br /&gt;
* Denys Dmytriyenko &#039;denix&#039;&lt;br /&gt;
* Koen Kooi &#039;koen&#039; ( Khem Raj &#039;khem&#039;)&lt;br /&gt;
* Anders Darander&lt;br /&gt;
* Mark Hatle (Otavio Salvador &#039;otavio&#039;)&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5993</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5993"/>
		<updated>2013-05-21T22:59:10Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Further comments and information */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
&lt;br /&gt;
In OpenEmbedded-Core there is an included toolchain that is built up of GNU binutils, gcc, and eglibc.  In addition related components such as gdb, cross-prelink, mklibs and others provider additional toolchain functionality.  In this document we focus on explaining best practices for including an additional toolchain that is capable of assembling, compiling and linking code.  This document does not cover replacing the existing toolchain or toolchain components with external elements.&lt;br /&gt;
&lt;br /&gt;
Many companies have commercial / highly optimized toolchains for specific purposes, such as ICC from Intel, LLVM, ARM Ltd toolchains, etc..  In some cases, these highly optimized toolchains may result in better performance for some applications, however they are often not generally applicable as they can not compile all of the system software.  So instead of replacing the included GNU toolchain, a mechanism for providing an alternative/secondary toolchain is desired.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchains should be implemented in a layer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In order to facilitate re-use and make it easier to completely disable the secondary toolchain, a layer must be used to implement the secondary toolchain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchain must be generally compatible with GNU toolchain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The secondary toolchain must be generally compatible with the idea of sysroots, linking to the defined libc, and various GNU conventions.  This compatibility may be implemented directly by the secondary toolchain or via a wrapper of some type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Per recipe selection of toolchain usage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A mechanism is needed to activate this alternative toolchain on a per-recipe basis.  Using variables it should be possible to specify on a per-recipe basis which toolchain should be used, leaving the default up to the user.  (It&#039;s assumed if the user does not select a default, the system GNU toolchain will be defaulted.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blacklist/Whitelist&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even with the requirement to be generally compatible, we can not expect all of the possible recipes to build properly with the secondary toolchain.  As a consequence of this, it will be necessary to implement a blacklist (or whitelist) of specific recipes that are known to work.  This way only supported components can be build by the user, avoid numerous complaints and unresolvable defects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The SDK generated by OpenEmbedded-Core also includes the included toolchain components.  It would be useful to also provide support for the secondary toolchain within the SDK environment.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Bitbake variables ===&lt;br /&gt;
&lt;br /&gt;
A set of common bitbake variables, defined in meta/conf/bitbake.conf, are used to define how to run the toolchain components and the proper arguments.&lt;br /&gt;
&lt;br /&gt;
A number of key items may need to be changed, depending on the toolchain being provided.  These items may include:&lt;br /&gt;
&lt;br /&gt;
   * TARGET_CPPFLAGS&lt;br /&gt;
   * TARGET_CFLAGS&lt;br /&gt;
   * TARGET_CXXFLAGS&lt;br /&gt;
   * TARGET_LDFLAGS&lt;br /&gt;
   * CC&lt;br /&gt;
   * CXX&lt;br /&gt;
   * F77&lt;br /&gt;
   * CPP&lt;br /&gt;
   * LD&lt;br /&gt;
   * CCLD&lt;br /&gt;
   * AR&lt;br /&gt;
   * AS&lt;br /&gt;
   * RANLIB&lt;br /&gt;
   * STRIP&lt;br /&gt;
   * OBJCOPY&lt;br /&gt;
   * OBJDUMP&lt;br /&gt;
   * NM&lt;br /&gt;
   * SELECTED_OPTIMIZATION&lt;br /&gt;
      * FULL_OPTIMIZATION&lt;br /&gt;
      * DEBUG_OPTIMIZATION&lt;br /&gt;
&lt;br /&gt;
Each of the above items has a default definition within the meta/conf/bitbake.conf file.  In addition, many of the components are based on specific tune variables such as:&lt;br /&gt;
&lt;br /&gt;
   * TUNE_CCARGS&lt;br /&gt;
   * TUNE_LDARGS&lt;br /&gt;
   * TUNE_ASARGS&lt;br /&gt;
&lt;br /&gt;
Deciding which items need to be overridden is up to the author of the layer.  It is expected that only a subset of the above referenced variables will need secondary toolchain specific versions for most implementations.&lt;br /&gt;
&lt;br /&gt;
It is suggested that the secondary toolchain values be defined in a single configuration file.  Within the example this is &amp;quot;conf/tc-example.conf&amp;quot;.  The standard name for the file should be &#039;conf/tc-&amp;lt;toolchain&amp;gt;.conf&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Override ===&lt;br /&gt;
&lt;br /&gt;
In order to allow for the layer to selectively override the variables listed above, a standard override syntax is needed.&lt;br /&gt;
&lt;br /&gt;
The standard override syntax will be &#039;toolchain-${TOOLCHAIN}&#039;.  This will allow us to specify multiple alternative and primary toolchain combinations as necessary.&lt;br /&gt;
&lt;br /&gt;
Each of the toolchain related variables can then be overridden using the standard override syntax: &amp;lt;var&amp;gt;_toolchain-&amp;lt;toolchain&amp;gt;, such as:&lt;br /&gt;
&lt;br /&gt;
CC_toolchain-icc = &amp;quot;icc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In order for an individual recipe to use the secondary toolchain, the user would define: TOOLCHAIN_pn-&amp;lt;recipe&amp;gt; = &#039;toolchain&#039;, such as:&lt;br /&gt;
&lt;br /&gt;
TOOLCHAIN_pn-bash = &amp;quot;icc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The OVERRIDE is implemented in the tc-secondary.bbclass in the example.&lt;br /&gt;
&lt;br /&gt;
=== Blacklist/Whitelist ===&lt;br /&gt;
&lt;br /&gt;
A standard blacklist/whitelist facility is to be implemented.  This facility is independent of the existing blacklist class that is part of OpenEmbedded-Core.&lt;br /&gt;
&lt;br /&gt;
Similar to the existing blacklist class, you will be able to define a blacklist, per toolchain type, such as:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
or alternatively create a whitelist facility using:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
   TCWHITELIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Using the second approach will allow you to blacklist all recipes, and only enable those known to work with the alternative toolchain.  &lt;br /&gt;
&lt;br /&gt;
The blacklist items should be defined within conf/tc-&amp;lt;toolchain&amp;gt;-blacklist.conf.  The validation of the blacklist should use the standard tc-blacklist.bbclass implementation available within the example.&lt;br /&gt;
&lt;br /&gt;
=== SDK ===&lt;br /&gt;
&lt;br /&gt;
In order to make it easier to use the alternative toolchain within the SDK.  An additional environment-* file should be created.  The purpose of this file is to simply override the settings in the main environment file.&lt;br /&gt;
&lt;br /&gt;
See the example section for an implementation that will create this file automatically.&lt;br /&gt;
&lt;br /&gt;
== Implementation Example ==&lt;br /&gt;
&lt;br /&gt;
An example implementation has been created in the layer &amp;quot;meta-tc-example&amp;quot;.  The file format follows:&lt;br /&gt;
&lt;br /&gt;
   meta-tc-example/&lt;br /&gt;
   meta-tc-example/bin&lt;br /&gt;
   meta-tc-example/bin/example-toolchain&lt;br /&gt;
   meta-tc-example/conf&lt;br /&gt;
   meta-tc-example/conf/layer.conf&lt;br /&gt;
   meta-tc-example/conf/tc-example.conf&lt;br /&gt;
   meta-tc-example/conf/tc-example-blacklist.conf&lt;br /&gt;
   meta-tc-example/classes&lt;br /&gt;
   meta-tc-example/classes/tc-secondary.bbclass&lt;br /&gt;
   meta-tc-example/classes/tc-blacklist.bbclass&lt;br /&gt;
&lt;br /&gt;
The following example is available at: [http://gate.crashing.org/~fray/yocto/meta-tc-example.tar.bz2 meta-tc-example.tar.bz2]&lt;br /&gt;
&lt;br /&gt;
=== conf/layer.conf ===&lt;br /&gt;
&lt;br /&gt;
   # We have a conf and classes directory, append to BBPATH&lt;br /&gt;
   BBPATH .= &amp;quot;:${LAYERDIR}&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # If we have a recipes directory, add to BBFILES&lt;br /&gt;
   #BBFILES += &amp;quot;${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/*/recipes-*/*/*.bbappend&amp;quot;&lt;br /&gt;
   #BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   #BBFILE_PATTERN_tc-example := &amp;quot;^${LAYERDIR}/&amp;quot;&lt;br /&gt;
   #BBFILE_PRIORITY_tc-example = &amp;quot;5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Above is standard layer configuration.  Note, the commented out sections should be re-enabled if the secondary toolchain includes recipes and/or bbappend files.&lt;br /&gt;
&lt;br /&gt;
   PATH := &amp;quot;${PATH}:${LAYERDIR}/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Add to the path a standard system path, a layer specific path.  This is the way you can add a secondary toolchain to the path.&lt;br /&gt;
&lt;br /&gt;
   # Define the alternative toolchain&lt;br /&gt;
   SECONDARYTC = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   # Enable the secondary toolchain&lt;br /&gt;
   INHERIT += &#039;tc-secondary tc-blacklist&#039;&lt;br /&gt;
&lt;br /&gt;
Define the alternative toolchain name in SECONDARYTC.  The inherit causes the tc-secondary.bbclass and tc-blacklist.bbclass to be loaded later.  Eventually this class used SECONDARYTC to load in the secondary toolchain configuration files.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example.conf ===&lt;br /&gt;
&lt;br /&gt;
   # Define default system toolchain (default to built-in)&lt;br /&gt;
   TOOLCHAIN = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
Define a reasonable default such as gnu.  The purpose of this default is to allow someone to specify the default or provide default override items for the built-in toolchain.&lt;br /&gt;
&lt;br /&gt;
   # Define a secondary toolchain called &#039;example&#039;&lt;br /&gt;
   # the &#039;example&#039; toolchain can be activated using:&lt;br /&gt;
   #&lt;br /&gt;
   # Per package (preferred):&lt;br /&gt;
   #   TOOLCHAIN_pn-bash = &#039;example&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # Globally:&lt;br /&gt;
   #   TOOLCHAIN = &#039;example&#039;&lt;br /&gt;
   #   TOOLCHAIN_pn-eglibc = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
The above is an example of how to use the alternative toolchain.&lt;br /&gt;
&lt;br /&gt;
   # When the secondary toolchain is used, we add an automatic depend...&lt;br /&gt;
   DEPENDS_append_toolchain-example = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # ...the depend can be provided by a recipe or as an ASSUME_PROVIDED&lt;br /&gt;
   ASSUME_PROVIDED_append = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Use the above as an example on how to add additional dependencies to specific packages.  This can be used to trigger a recipe to build.&lt;br /&gt;
&lt;br /&gt;
   # Default values from bitbake.conf...&lt;br /&gt;
   # Variables with a &#039;*&#039; are things likely to need to be overridden:&lt;br /&gt;
   #&lt;br /&gt;
   #   FULL_OPTIMIZATION = &amp;quot;-O2 -pipe ${DEBUG_FLAGS}&amp;quot;&lt;br /&gt;
   #   DEBUG_OPTIMIZATION = &amp;quot;-O -fno-omit-frame-pointer ${DEBUG_FLAGS} -pipe&amp;quot;&lt;br /&gt;
   #   SELECTED_OPTIMIZATION = &amp;quot;${@d.getVar([&#039;FULL_OPTIMIZATION&#039;, &#039;DEBUG_OPTIMIZATION&#039;][d.getVar(&#039;DEBUG_BUILD&#039;, True) == &#039;1&#039;], True)}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   # * TOOLCHAIN_OPTIONS = &amp;quot; --sysroot=${STAGING_DIR_TARGET}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * TARGET_CPPFLAGS = &amp;quot;&amp;quot;&lt;br /&gt;
   # * TARGET_CFLAGS = &amp;quot;${TARGET_CPPFLAGS} ${SELECTED_OPTIMIZATION}&amp;quot;&lt;br /&gt;
   # * TARGET CXXFLAGS = &amp;quot;${TARGET_CFLAGS} -fpermissive&amp;quot;&lt;br /&gt;
   # * TARGET_LDFLAGS = &amp;quot;-Wl,-O1 ${TARGET_LINK_HASH_STYLE}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   TARGET_CC_ARCH = &amp;quot;${TUNE_CCARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_LD_ARCH = &amp;quot;${TUNE_LDARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_AS_ARCH = &amp;quot;${TUNE_ASARGS}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   HOST_CC_ARCH = &amp;quot;${TARGET_CC_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_LD_ARCH = &amp;quot;${TARGET_LD_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_AS_ARCH = &amp;quot;${TARGET_AS_ARCH}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * CC = &amp;quot;${CCACHE}${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CXX = &amp;quot;${CCACHE}${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * F77 = &amp;quot;${CCACHE}${HOST_PREFIX}g77 ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CPP = &amp;quot;${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   # * LD = &amp;quot;${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
   # * CCLD = &amp;quot;${CC}&amp;quot;&lt;br /&gt;
   #   AR = &amp;quot;${HOST_PREFIX}ar&amp;quot;&lt;br /&gt;
   #   AS = &amp;quot;${HOST_PREFIX}as ${HOST_AS_ARCH}&amp;quot;&lt;br /&gt;
   #   RANLIB = &amp;quot;${HOST_PREFIX}ranlib&amp;quot;&lt;br /&gt;
   #   STRIP = &amp;quot;${HOST_PREFIX}strip&amp;quot;&lt;br /&gt;
   #   OBJCOPY = &amp;quot;${HOST_PREFIX}objcopy&amp;quot;&lt;br /&gt;
   #   OBJDUMP = &amp;quot;${HOST_PREFIX}objdump&amp;quot;&lt;br /&gt;
   #   NM = &amp;quot;${HOST_PREFIX}nm&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # Override values:&lt;br /&gt;
   CC_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   CXX_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   CPP_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   LD_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The above implements the necessary overrides for the example toolchain.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example-blacklist.conf ===&lt;br /&gt;
&lt;br /&gt;
Example configuration file that enables the blacklist and defines the defaults.&lt;br /&gt;
&lt;br /&gt;
   # Blacklist certain items...&lt;br /&gt;
   TCBLACKLIST[eglibc] = &#039;example&#039;&lt;br /&gt;
   TCBLACKLIST[bash] = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   #&lt;br /&gt;
   # or&lt;br /&gt;
   #&lt;br /&gt;
   &lt;br /&gt;
   # Switch to a global blacklist and whitelist situation...&lt;br /&gt;
   # TCBLACKLIST = &#039;example&#039;&lt;br /&gt;
   # TCWHITELIST[bash] = &#039;example&#039;&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-secondary.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # In order to add overrides, we need to do it later then in the layers.conf&lt;br /&gt;
   # the only standard way is using an inherit, which requires a bbclass&lt;br /&gt;
   &lt;br /&gt;
   # Add the necessary override&lt;br /&gt;
   TOOLCHAINOVERRIDES = &amp;quot;:toolchain-${TOOLCHAIN}&amp;quot;&lt;br /&gt;
   TOOLCHAINOVERRIDES[vardepsexclude] = &amp;quot;TOOLCHAIN&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   OVERRIDES .= &amp;quot;${TOOLCHAINOVERRIDES}&amp;quot;&lt;br /&gt;
   OVERRIDES[vardepsexclude] += &amp;quot;TOOLCHAINOVERRIDES&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   require conf/tc-${SECONDARYTC}.conf&lt;br /&gt;
&lt;br /&gt;
The above code configures the basic overrides and loads the configuration file.  There is one limitation to the above however.  It will only load one secondary toolchain.  A simple way around this is to rename the inherit and change to using something other then SECONDARYTC.  This likely will not be a problem.&lt;br /&gt;
&lt;br /&gt;
   toolchain_create_sdk_env_script_alt () {&lt;br /&gt;
           set -x&lt;br /&gt;
   &lt;br /&gt;
           # Create environment setup script (secondary toolchain)&lt;br /&gt;
           orig_script=${1:-${SDK_OUTPUT}/${SDKPATH}/environment-setup-${REAL_MULTIMACH_TARGET_SYS}}&lt;br /&gt;
           script=&amp;quot;$orig_script&amp;quot;&amp;quot;-${SECONDARYTC}&amp;quot;&lt;br /&gt;
           rm -f $script&lt;br /&gt;
           touch $script&lt;br /&gt;
           echo &amp;quot;. $orig_script&amp;quot; | sed -e &amp;quot;s:${SDK_OUTPUT}::&amp;quot; &amp;gt;&amp;gt; $script&lt;br /&gt;
           if [ &#039;${CC_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CC_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CC=&amp;quot;${CC_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CXX_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CXX_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CXX=&amp;quot;${CXX_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CPP_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CPP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CPP=&amp;quot;${CPP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${AS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;AS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export AS=&amp;quot;${AS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${LD_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;LD_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export LD=&amp;quot;${LD_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${RANLIB_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;RANLIB_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export RANLIB=&amp;quot;${RANLIB_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${STRIP_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;STRIP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export STRIP=&amp;quot;${STRIP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${OBJCOPY_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;OBJCOPY_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export OBJCOPY=&amp;quot;${OBJCOPY_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${OBJDUMP_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;OBJDUMP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export OBJDUMP=&amp;quot;${OBJDUMP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${NM_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;NM_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export NM=&amp;quot;${NM_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
   &lt;br /&gt;
           if [ &#039;${CFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CFLAGS=&amp;quot;${CFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CXXFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CXXFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CXXFLAGS=&amp;quot;${CXXFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${LDFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;LDFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export LDFLAGS=&amp;quot;${LDFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CPPFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CPPFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CPPFLAGS=&amp;quot;${CPPFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
   &lt;br /&gt;
           # Fixup any sysroot references&lt;br /&gt;
           sed -i -e &amp;quot;s:${STAGING_DIR_TARGET}:${SDKTARGETSYSROOT}:g&amp;quot; $script&lt;br /&gt;
   &lt;br /&gt;
           # All environment scripts require OECORE_NATIVE_SYSROOT&lt;br /&gt;
           echo &#039;export OECORE_NATIVE_SYSROOT=&amp;quot;${SDKPATHNATIVE}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   populate_sdk_image_append() {&lt;br /&gt;
           toolchain_create_sdk_env_script_alt ${SDK_OUTPUT}/${SDKPATH}/environment-setup-${REAL_MULTIMACH_TARGET_SYS}&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
The above code will add an additional environment-setup-*-&amp;lt;toolchain&amp;gt; file.  This can be used to enable the right environment to use the alternative toolchain.  Note, it does not add anything to the path so the user will still need to configure the path to the alternative toolchain.  (The layer creator can always provide the necessary &#039;nativesdk&#039; or similar package that provides the alternative toolchain as part of the SDK as well.)&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-blacklist.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain blacklist class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # Implement blacklist/whitelist functionality for alternative toolchains&lt;br /&gt;
   # Based on the oe-core blacklist bclass&lt;br /&gt;
   #&lt;br /&gt;
   # To add a blacklisted package:&lt;br /&gt;
   #   TCBLACKLIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # To blacklist everything, and whitelist a package:&lt;br /&gt;
   #   TCBLACKLIST = &#039;toolchain&#039;&lt;br /&gt;
   #   TCWHITELIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   &lt;br /&gt;
   include conf/tc-${SECONDARYTC}-blacklist.conf&lt;br /&gt;
   &lt;br /&gt;
   python () {&lt;br /&gt;
       tc = d.getVar(&#039;TOOLCHAIN&#039;, True)&lt;br /&gt;
       pn = d.getVar(&#039;PN&#039;, True)&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVarFlag(&#039;TCBLACKLIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and blacklist == tc:&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVar(&#039;TCBLACKLIST&#039;, True)&lt;br /&gt;
       whitelist = d.getVarFlag(&#039;TCWHITELIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and (not whitelist or whitelist != tc):&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Further comments and information ==&lt;br /&gt;
&lt;br /&gt;
For questions, comments or bug reports please contact the author at markDOThatleATwindriverDOTcom, also be sure to CC the openembedded-devel mailing list.&lt;br /&gt;
&lt;br /&gt;
[[Category:Dev]]&lt;br /&gt;
[[Category:Layers]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5469</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5469"/>
		<updated>2013-01-08T21:38:43Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
&lt;br /&gt;
In OpenEmbedded-Core there is an included toolchain that is built up of GNU binutils, gcc, and eglibc.  In addition related components such as gdb, cross-prelink, mklibs and others provider additional toolchain functionality.  In this document we focus on explaining best practices for including an additional toolchain that is capable of assembling, compiling and linking code.  This document does not cover replacing the existing toolchain or toolchain components with external elements.&lt;br /&gt;
&lt;br /&gt;
Many companies have commercial / highly optimized toolchains for specific purposes, such as ICC from Intel, LLVM, ARM Ltd toolchains, etc..  In some cases, these highly optimized toolchains may result in better performance for some applications, however they are often not generally applicable as they can not compile all of the system software.  So instead of replacing the included GNU toolchain, a mechanism for providing an alternative/secondary toolchain is desired.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchains should be implemented in a layer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In order to facilitate re-use and make it easier to completely disable the secondary toolchain, a layer must be used to implement the secondary toolchain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchain must be generally compatible with GNU toolchain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The secondary toolchain must be generally compatible with the idea of sysroots, linking to the defined libc, and various GNU conventions.  This compatibility may be implemented directly by the secondary toolchain or via a wrapper of some type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Per recipe selection of toolchain usage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A mechanism is needed to activate this alternative toolchain on a per-recipe basis.  Using variables it should be possible to specify on a per-recipe basis which toolchain should be used, leaving the default up to the user.  (It&#039;s assumed if the user does not select a default, the system GNU toolchain will be defaulted.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blacklist/Whitelist&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even with the requirement to be generally compatible, we can not expect all of the possible recipes to build properly with the secondary toolchain.  As a consequence of this, it will be necessary to implement a blacklist (or whitelist) of specific recipes that are known to work.  This way only supported components can be build by the user, avoid numerous complaints and unresolvable defects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The SDK generated by OpenEmbedded-Core also includes the included toolchain components.  It would be useful to also provide support for the secondary toolchain within the SDK environment.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Bitbake variables ===&lt;br /&gt;
&lt;br /&gt;
A set of common bitbake variables, defined in meta/conf/bitbake.conf, are used to define how to run the toolchain components and the proper arguments.&lt;br /&gt;
&lt;br /&gt;
A number of key items may need to be changed, depending on the toolchain being provided.  These items may include:&lt;br /&gt;
&lt;br /&gt;
   * TARGET_CPPFLAGS&lt;br /&gt;
   * TARGET_CFLAGS&lt;br /&gt;
   * TARGET_CXXFLAGS&lt;br /&gt;
   * TARGET_LDFLAGS&lt;br /&gt;
   * CC&lt;br /&gt;
   * CXX&lt;br /&gt;
   * F77&lt;br /&gt;
   * CPP&lt;br /&gt;
   * LD&lt;br /&gt;
   * CCLD&lt;br /&gt;
   * AR&lt;br /&gt;
   * AS&lt;br /&gt;
   * RANLIB&lt;br /&gt;
   * STRIP&lt;br /&gt;
   * OBJCOPY&lt;br /&gt;
   * OBJDUMP&lt;br /&gt;
   * NM&lt;br /&gt;
   * SELECTED_OPTIMIZATION&lt;br /&gt;
      * FULL_OPTIMIZATION&lt;br /&gt;
      * DEBUG_OPTIMIZATION&lt;br /&gt;
&lt;br /&gt;
Each of the above items has a default definition within the meta/conf/bitbake.conf file.  In addition, many of the components are based on specific tune variables such as:&lt;br /&gt;
&lt;br /&gt;
   * TUNE_CCARGS&lt;br /&gt;
   * TUNE_LDARGS&lt;br /&gt;
   * TUNE_ASARGS&lt;br /&gt;
&lt;br /&gt;
Deciding which items need to be overridden is up to the author of the layer.  It is expected that only a subset of the above referenced variables will need secondary toolchain specific versions for most implementations.&lt;br /&gt;
&lt;br /&gt;
It is suggested that the secondary toolchain values be defined in a single configuration file.  Within the example this is &amp;quot;conf/tc-example.conf&amp;quot;.  The standard name for the file should be &#039;conf/tc-&amp;lt;toolchain&amp;gt;.conf&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Override ===&lt;br /&gt;
&lt;br /&gt;
In order to allow for the layer to selectively override the variables listed above, a standard override syntax is needed.&lt;br /&gt;
&lt;br /&gt;
The standard override syntax will be &#039;toolchain-${TOOLCHAIN}&#039;.  This will allow us to specify multiple alternative and primary toolchain combinations as necessary.&lt;br /&gt;
&lt;br /&gt;
Each of the toolchain related variables can then be overridden using the standard override syntax: &amp;lt;var&amp;gt;_toolchain-&amp;lt;toolchain&amp;gt;, such as:&lt;br /&gt;
&lt;br /&gt;
CC_toolchain-icc = &amp;quot;icc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In order for an individual recipe to use the secondary toolchain, the user would define: TOOLCHAIN_pn-&amp;lt;recipe&amp;gt; = &#039;toolchain&#039;, such as:&lt;br /&gt;
&lt;br /&gt;
TOOLCHAIN_pn-bash = &amp;quot;icc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The OVERRIDE is implemented in the tc-secondary.bbclass in the example.&lt;br /&gt;
&lt;br /&gt;
=== Blacklist/Whitelist ===&lt;br /&gt;
&lt;br /&gt;
A standard blacklist/whitelist facility is to be implemented.  This facility is independent of the existing blacklist class that is part of OpenEmbedded-Core.&lt;br /&gt;
&lt;br /&gt;
Similar to the existing blacklist class, you will be able to define a blacklist, per toolchain type, such as:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
or alternatively create a whitelist facility using:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
   TCWHITELIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Using the second approach will allow you to blacklist all recipes, and only enable those known to work with the alternative toolchain.  &lt;br /&gt;
&lt;br /&gt;
The blacklist items should be defined within conf/tc-&amp;lt;toolchain&amp;gt;-blacklist.conf.  The validation of the blacklist should use the standard tc-blacklist.bbclass implementation available within the example.&lt;br /&gt;
&lt;br /&gt;
=== SDK ===&lt;br /&gt;
&lt;br /&gt;
In order to make it easier to use the alternative toolchain within the SDK.  An additional environment-* file should be created.  The purpose of this file is to simply override the settings in the main environment file.&lt;br /&gt;
&lt;br /&gt;
See the example section for an implementation that will create this file automatically.&lt;br /&gt;
&lt;br /&gt;
== Implementation Example ==&lt;br /&gt;
&lt;br /&gt;
An example implementation has been created in the layer &amp;quot;meta-tc-example&amp;quot;.  The file format follows:&lt;br /&gt;
&lt;br /&gt;
   meta-tc-example/&lt;br /&gt;
   meta-tc-example/bin&lt;br /&gt;
   meta-tc-example/bin/example-toolchain&lt;br /&gt;
   meta-tc-example/conf&lt;br /&gt;
   meta-tc-example/conf/layer.conf&lt;br /&gt;
   meta-tc-example/conf/tc-example.conf&lt;br /&gt;
   meta-tc-example/conf/tc-example-blacklist.conf&lt;br /&gt;
   meta-tc-example/classes&lt;br /&gt;
   meta-tc-example/classes/tc-secondary.bbclass&lt;br /&gt;
   meta-tc-example/classes/tc-blacklist.bbclass&lt;br /&gt;
&lt;br /&gt;
The following example is available at: [http://gate.crashing.org/~fray/yocto/meta-tc-example.tar.bz2 meta-tc-example.tar.bz2]&lt;br /&gt;
&lt;br /&gt;
=== conf/layer.conf ===&lt;br /&gt;
&lt;br /&gt;
   # We have a conf and classes directory, append to BBPATH&lt;br /&gt;
   BBPATH .= &amp;quot;:${LAYERDIR}&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # If we have a recipes directory, add to BBFILES&lt;br /&gt;
   #BBFILES += &amp;quot;${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/*/recipes-*/*/*.bbappend&amp;quot;&lt;br /&gt;
   #BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   #BBFILE_PATTERN_tc-example := &amp;quot;^${LAYERDIR}/&amp;quot;&lt;br /&gt;
   #BBFILE_PRIORITY_tc-example = &amp;quot;5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Above is standard layer configuration.  Note, the commented out sections should be re-enabled if the secondary toolchain includes recipes and/or bbappend files.&lt;br /&gt;
&lt;br /&gt;
   PATH := &amp;quot;${PATH}:${LAYERDIR}/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Add to the path a standard system path, a layer specific path.  This is the way you can add a secondary toolchain to the path.&lt;br /&gt;
&lt;br /&gt;
   # Define the alternative toolchain&lt;br /&gt;
   SECONDARYTC = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   # Enable the secondary toolchain&lt;br /&gt;
   INHERIT += &#039;tc-secondary tc-blacklist&#039;&lt;br /&gt;
&lt;br /&gt;
Define the alternative toolchain name in SECONDARYTC.  The inherit causes the tc-secondary.bbclass and tc-blacklist.bbclass to be loaded later.  Eventually this class used SECONDARYTC to load in the secondary toolchain configuration files.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example.conf ===&lt;br /&gt;
&lt;br /&gt;
   # Define default system toolchain (default to built-in)&lt;br /&gt;
   TOOLCHAIN = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
Define a reasonable default such as gnu.  The purpose of this default is to allow someone to specify the default or provide default override items for the built-in toolchain.&lt;br /&gt;
&lt;br /&gt;
   # Define a secondary toolchain called &#039;example&#039;&lt;br /&gt;
   # the &#039;example&#039; toolchain can be activated using:&lt;br /&gt;
   #&lt;br /&gt;
   # Per package (preferred):&lt;br /&gt;
   #   TOOLCHAIN_pn-bash = &#039;example&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # Globally:&lt;br /&gt;
   #   TOOLCHAIN = &#039;example&#039;&lt;br /&gt;
   #   TOOLCHAIN_pn-eglibc = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
The above is an example of how to use the alternative toolchain.&lt;br /&gt;
&lt;br /&gt;
   # When the secondary toolchain is used, we add an automatic depend...&lt;br /&gt;
   DEPENDS_append_toolchain-example = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # ...the depend can be provided by a recipe or as an ASSUME_PROVIDED&lt;br /&gt;
   ASSUME_PROVIDED_append = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Use the above as an example on how to add additional dependencies to specific packages.  This can be used to trigger a recipe to build.&lt;br /&gt;
&lt;br /&gt;
   # Default values from bitbake.conf...&lt;br /&gt;
   # Variables with a &#039;*&#039; are things likely to need to be overridden:&lt;br /&gt;
   #&lt;br /&gt;
   #   FULL_OPTIMIZATION = &amp;quot;-O2 -pipe ${DEBUG_FLAGS}&amp;quot;&lt;br /&gt;
   #   DEBUG_OPTIMIZATION = &amp;quot;-O -fno-omit-frame-pointer ${DEBUG_FLAGS} -pipe&amp;quot;&lt;br /&gt;
   #   SELECTED_OPTIMIZATION = &amp;quot;${@d.getVar([&#039;FULL_OPTIMIZATION&#039;, &#039;DEBUG_OPTIMIZATION&#039;][d.getVar(&#039;DEBUG_BUILD&#039;, True) == &#039;1&#039;], True)}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   # * TOOLCHAIN_OPTIONS = &amp;quot; --sysroot=${STAGING_DIR_TARGET}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * TARGET_CPPFLAGS = &amp;quot;&amp;quot;&lt;br /&gt;
   # * TARGET_CFLAGS = &amp;quot;${TARGET_CPPFLAGS} ${SELECTED_OPTIMIZATION}&amp;quot;&lt;br /&gt;
   # * TARGET CXXFLAGS = &amp;quot;${TARGET_CFLAGS} -fpermissive&amp;quot;&lt;br /&gt;
   # * TARGET_LDFLAGS = &amp;quot;-Wl,-O1 ${TARGET_LINK_HASH_STYLE}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   TARGET_CC_ARCH = &amp;quot;${TUNE_CCARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_LD_ARCH = &amp;quot;${TUNE_LDARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_AS_ARCH = &amp;quot;${TUNE_ASARGS}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   HOST_CC_ARCH = &amp;quot;${TARGET_CC_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_LD_ARCH = &amp;quot;${TARGET_LD_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_AS_ARCH = &amp;quot;${TARGET_AS_ARCH}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * CC = &amp;quot;${CCACHE}${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CXX = &amp;quot;${CCACHE}${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * F77 = &amp;quot;${CCACHE}${HOST_PREFIX}g77 ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CPP = &amp;quot;${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   # * LD = &amp;quot;${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
   # * CCLD = &amp;quot;${CC}&amp;quot;&lt;br /&gt;
   #   AR = &amp;quot;${HOST_PREFIX}ar&amp;quot;&lt;br /&gt;
   #   AS = &amp;quot;${HOST_PREFIX}as ${HOST_AS_ARCH}&amp;quot;&lt;br /&gt;
   #   RANLIB = &amp;quot;${HOST_PREFIX}ranlib&amp;quot;&lt;br /&gt;
   #   STRIP = &amp;quot;${HOST_PREFIX}strip&amp;quot;&lt;br /&gt;
   #   OBJCOPY = &amp;quot;${HOST_PREFIX}objcopy&amp;quot;&lt;br /&gt;
   #   OBJDUMP = &amp;quot;${HOST_PREFIX}objdump&amp;quot;&lt;br /&gt;
   #   NM = &amp;quot;${HOST_PREFIX}nm&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # Override values:&lt;br /&gt;
   CC_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   CXX_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   CPP_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   LD_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The above implements the necessary overrides for the example toolchain.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example-blacklist.conf ===&lt;br /&gt;
&lt;br /&gt;
Example configuration file that enables the blacklist and defines the defaults.&lt;br /&gt;
&lt;br /&gt;
   # Blacklist certain items...&lt;br /&gt;
   TCBLACKLIST[eglibc] = &#039;example&#039;&lt;br /&gt;
   TCBLACKLIST[bash] = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   #&lt;br /&gt;
   # or&lt;br /&gt;
   #&lt;br /&gt;
   &lt;br /&gt;
   # Switch to a global blacklist and whitelist situation...&lt;br /&gt;
   # TCBLACKLIST = &#039;example&#039;&lt;br /&gt;
   # TCWHITELIST[bash] = &#039;example&#039;&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-secondary.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # In order to add overrides, we need to do it later then in the layers.conf&lt;br /&gt;
   # the only standard way is using an inherit, which requires a bbclass&lt;br /&gt;
   &lt;br /&gt;
   # Add the necessary override&lt;br /&gt;
   TOOLCHAINOVERRIDES = &amp;quot;:toolchain-${TOOLCHAIN}&amp;quot;&lt;br /&gt;
   TOOLCHAINOVERRIDES[vardepsexclude] = &amp;quot;TOOLCHAIN&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   OVERRIDES .= &amp;quot;${TOOLCHAINOVERRIDES}&amp;quot;&lt;br /&gt;
   OVERRIDES[vardepsexclude] += &amp;quot;TOOLCHAINOVERRIDES&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   require conf/tc-${SECONDARYTC}.conf&lt;br /&gt;
&lt;br /&gt;
The above code configures the basic overrides and loads the configuration file.  There is one limitation to the above however.  It will only load one secondary toolchain.  A simple way around this is to rename the inherit and change to using something other then SECONDARYTC.  This likely will not be a problem.&lt;br /&gt;
&lt;br /&gt;
   toolchain_create_sdk_env_script_alt () {&lt;br /&gt;
           set -x&lt;br /&gt;
   &lt;br /&gt;
           # Create environment setup script (secondary toolchain)&lt;br /&gt;
           orig_script=${1:-${SDK_OUTPUT}/${SDKPATH}/environment-setup-${REAL_MULTIMACH_TARGET_SYS}}&lt;br /&gt;
           script=&amp;quot;$orig_script&amp;quot;&amp;quot;-${SECONDARYTC}&amp;quot;&lt;br /&gt;
           rm -f $script&lt;br /&gt;
           touch $script&lt;br /&gt;
           echo &amp;quot;. $orig_script&amp;quot; | sed -e &amp;quot;s:${SDK_OUTPUT}::&amp;quot; &amp;gt;&amp;gt; $script&lt;br /&gt;
           if [ &#039;${CC_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CC_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CC=&amp;quot;${CC_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CXX_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CXX_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CXX=&amp;quot;${CXX_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CPP_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CPP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CPP=&amp;quot;${CPP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${AS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;AS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export AS=&amp;quot;${AS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${LD_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;LD_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export LD=&amp;quot;${LD_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${RANLIB_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;RANLIB_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export RANLIB=&amp;quot;${RANLIB_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${STRIP_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;STRIP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export STRIP=&amp;quot;${STRIP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${OBJCOPY_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;OBJCOPY_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export OBJCOPY=&amp;quot;${OBJCOPY_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${OBJDUMP_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;OBJDUMP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export OBJDUMP=&amp;quot;${OBJDUMP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${NM_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;NM_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export NM=&amp;quot;${NM_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
   &lt;br /&gt;
           if [ &#039;${CFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CFLAGS=&amp;quot;${CFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CXXFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CXXFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CXXFLAGS=&amp;quot;${CXXFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${LDFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;LDFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export LDFLAGS=&amp;quot;${LDFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CPPFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CPPFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CPPFLAGS=&amp;quot;${CPPFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
   &lt;br /&gt;
           # Fixup any sysroot references&lt;br /&gt;
           sed -i -e &amp;quot;s:${STAGING_DIR_TARGET}:${SDKTARGETSYSROOT}:g&amp;quot; $script&lt;br /&gt;
   &lt;br /&gt;
           # All environment scripts require OECORE_NATIVE_SYSROOT&lt;br /&gt;
           echo &#039;export OECORE_NATIVE_SYSROOT=&amp;quot;${SDKPATHNATIVE}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   populate_sdk_image_append() {&lt;br /&gt;
           toolchain_create_sdk_env_script_alt ${SDK_OUTPUT}/${SDKPATH}/environment-setup-${REAL_MULTIMACH_TARGET_SYS}&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
The above code will add an additional environment-setup-*-&amp;lt;toolchain&amp;gt; file.  This can be used to enable the right environment to use the alternative toolchain.  Note, it does not add anything to the path so the user will still need to configure the path to the alternative toolchain.  (The layer creator can always provide the necessary &#039;nativesdk&#039; or similar package that provides the alternative toolchain as part of the SDK as well.)&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-blacklist.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain blacklist class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # Implement blacklist/whitelist functionality for alternative toolchains&lt;br /&gt;
   # Based on the oe-core blacklist bclass&lt;br /&gt;
   #&lt;br /&gt;
   # To add a blacklisted package:&lt;br /&gt;
   #   TCBLACKLIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # To blacklist everything, and whitelist a package:&lt;br /&gt;
   #   TCBLACKLIST = &#039;toolchain&#039;&lt;br /&gt;
   #   TCWHITELIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   &lt;br /&gt;
   include conf/tc-${SECONDARYTC}-blacklist.conf&lt;br /&gt;
   &lt;br /&gt;
   python () {&lt;br /&gt;
       tc = d.getVar(&#039;TOOLCHAIN&#039;, True)&lt;br /&gt;
       pn = d.getVar(&#039;PN&#039;, True)&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVarFlag(&#039;TCBLACKLIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and blacklist == tc:&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVar(&#039;TCBLACKLIST&#039;, True)&lt;br /&gt;
       whitelist = d.getVarFlag(&#039;TCWHITELIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and (not whitelist or whitelist != tc):&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Further comments and information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Dev]]&lt;br /&gt;
[[Category:Layers]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Commit_Patch_Message_Guidelines&amp;diff=5413</id>
		<title>Commit Patch Message Guidelines</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Commit_Patch_Message_Guidelines&amp;diff=5413"/>
		<updated>2012-12-04T17:46:25Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This set of guidelines is intended to help both the developer and reviewers of&lt;br /&gt;
changes determine reasonable patch headers and change commit messages. Often&lt;br /&gt;
when working with the code, you forget that not everyone is as familiar with the&lt;br /&gt;
problem and/or fix as you are. Often the next person in the code doesn&#039;t&lt;br /&gt;
understand what or why something is done so they quickly look at patch header&lt;br /&gt;
and commit messages. Unless these messages are clear it will be difficult to&lt;br /&gt;
understand the relevance of a given change and how future changes may impact&lt;br /&gt;
previous decisions.&lt;br /&gt;
&lt;br /&gt;
This policy refers both to patches that are being applied by recipes as well as&lt;br /&gt;
commit messages that are part of the source control system, usually git. A patch&lt;br /&gt;
file needs a header in order to describe the specific changes that are made&lt;br /&gt;
within that patch, while a commit message describes one or more changes to the&lt;br /&gt;
overall project or system. Both the patch headers and commit messages require&lt;br /&gt;
the same attention and basic details, however the purposes of the messages are&lt;br /&gt;
slightly different. A commit message documents all of the changes made as part&lt;br /&gt;
of a commit, while a patch header documents items specific to a single patch. In&lt;br /&gt;
many cases the patch header can also be used as the commit message.&lt;br /&gt;
&lt;br /&gt;
This policy does not cover the testing of the changes, the technical criteria&lt;br /&gt;
for accepting a patch, nor the style requirements for the technical changes.  See &lt;br /&gt;
the [http://www.openembedded.org/wiki/Styleguide Styleguide] for more information on style requirements.&lt;br /&gt;
&lt;br /&gt;
By following these guidelines we will have a better record of the problems and&lt;br /&gt;
solutions made over the course of development. It will also help establish a&lt;br /&gt;
clear provenance of all of the code and changes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Approved by the Technical Steering Committee 2011/06/09.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
&lt;br /&gt;
While specific to the Linux kernel development, the following could also be&lt;br /&gt;
considered a general guide for any Open Source development:&lt;br /&gt;
&lt;br /&gt;
http://ldn.linuxfoundation.org/book/how-participate-linux-community&lt;br /&gt;
&lt;br /&gt;
Many of the guidelines in this document are related to the items in that&lt;br /&gt;
information.&lt;br /&gt;
&lt;br /&gt;
Pay particular attention to section 5.3 that talks about patch preparation.&lt;br /&gt;
The key thing to remember is to break up your changes into logical sections.&lt;br /&gt;
Otherwise you run the risk of not being able to even explain the purpose of a&lt;br /&gt;
change in the patch headers!&lt;br /&gt;
&lt;br /&gt;
In addition section 5.4 explains the purpose of the Signed-off-by: tag line as&lt;br /&gt;
discussed in later parts of this document. Due to the importance of the&lt;br /&gt;
Signed-off-by: tag line a copy of the description follows:&lt;br /&gt;
&lt;br /&gt;
   Signed-off-by: this is a developer&#039;s certification that he or she has&lt;br /&gt;
   the right to submit the patch for inclusion into the [project].  It is&lt;br /&gt;
   an agreement to the Developer&#039;s Certificate of Origin, the full text of&lt;br /&gt;
   which can be found in [Linux Kernel] Documentation/SubmittingPatches.&lt;br /&gt;
   Code without a proper signoff cannot be merged into the mainline.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more information on the Developer&#039;s Certificate of Origin and the Linux&lt;br /&gt;
Kernel Documentation/SubmittingPatches, see:&lt;br /&gt;
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/SubmittingPatches&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Patch Headers and Commit Messages ==&lt;br /&gt;
&lt;br /&gt;
There seems to always be a question or two surrounding what a person&lt;br /&gt;
should put in a patch header, or commit message.&lt;br /&gt;
&lt;br /&gt;
The general rules always apply, those being that there is a single line&lt;br /&gt;
short log or summary of the change (think of this as the subject when the patch&lt;br /&gt;
is e-mailed), and then the more detailed long log, and closure with tag lines&lt;br /&gt;
such as &amp;quot;Signed-off-by:&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== New Development ==&lt;br /&gt;
&lt;br /&gt;
A minimal patch or commit message would be of the format:&lt;br /&gt;
&lt;br /&gt;
   Short log / Statement of what needed to be changed.&lt;br /&gt;
   &lt;br /&gt;
   (Optional pointers to external resources, such as defect tracking)&lt;br /&gt;
   &lt;br /&gt;
   The intent of your change.&lt;br /&gt;
   &lt;br /&gt;
   (Optional, if it&#039;s not clear from above) how your change resolves the&lt;br /&gt;
   issues in the first part.&lt;br /&gt;
   &lt;br /&gt;
   Tag line(s) at the end.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
   foobar: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   When using foobar on systems with less than a gigabyte of RAM common&lt;br /&gt;
   usage patterns often result in an Out-of-memory condition causing&lt;br /&gt;
   slowdowns and unexpected application termination.&lt;br /&gt;
   &lt;br /&gt;
   Low-memory systems should continue to function without running into&lt;br /&gt;
   memory-starvation conditions with minimal cost to systems with more&lt;br /&gt;
   available memory.  High-memory systems will be less able to use the&lt;br /&gt;
   full extent of the system, a dynamically tunable option may be best,&lt;br /&gt;
   long-term.&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The minimal commit message is good for new code development and simple changes.&lt;br /&gt;
&lt;br /&gt;
The single short log message indicates what needed to be changed. It should&lt;br /&gt;
begin with an indicator as to the primary item changed by this work,&lt;br /&gt;
followed by a short summary of the change. In the above case we&#039;re indicating&lt;br /&gt;
that we&#039;ve changed the &amp;quot;foobar&amp;quot; item, by &amp;quot;adjusting the foo setting in bar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The single short log message is analogous to the git &amp;quot;commit summary&amp;quot;. While no&lt;br /&gt;
maximum line length is specified by this policy, it is suggested that it remains&lt;br /&gt;
under 78 characters wherever possible.&lt;br /&gt;
&lt;br /&gt;
Optionally, you may include pointers to defects this change corrects. Unless&lt;br /&gt;
the defect format is specified by the component you are modifying, it is&lt;br /&gt;
suggested that you use a full URL to specify the reference to the defect&lt;br /&gt;
information. Generally these pointers will precede any long description, but as&lt;br /&gt;
an optional item it may be after the long description.&lt;br /&gt;
&lt;br /&gt;
For example, you might refer to an open source defect in the RPM project:&lt;br /&gt;
&lt;br /&gt;
   rpm: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;[RPM Ticket #65] -- http://rpm5.org/cvs/tktview?tn=65,5&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must then have a full description of the change. Specifying the intent of&lt;br /&gt;
your change and if necessary how the change resolves the issue.&lt;br /&gt;
&lt;br /&gt;
As mentioned above this is intended to answer the &amp;quot;what were you thinking&amp;quot;&lt;br /&gt;
questions down the road and to know what other impacts are likely to&lt;br /&gt;
result of the change needs to be reverted. It also allows for better&lt;br /&gt;
solutions if someone comes along later and agrees with paragraph 1&lt;br /&gt;
(the problem statement) and either disagrees with paragraph 2&lt;br /&gt;
(the design) or paragraph 3 (the implementation).&lt;br /&gt;
&lt;br /&gt;
Finally one or more tag lines should exist. Each developer responsible&lt;br /&gt;
for working on the patch is responsible for adding a Signed-off-by: tag line.&lt;br /&gt;
&lt;br /&gt;
It is not acceptable to have an empty or non-existent header, or just a single&lt;br /&gt;
line message. The summary and description is required for all changes.&lt;br /&gt;
&lt;br /&gt;
== Importing from Elsewhere ==&lt;br /&gt;
&lt;br /&gt;
If you are importing work from somewhere else, such as a cherry-pick from&lt;br /&gt;
another repository or a code patch pulled from a mailing list, the minimum patch&lt;br /&gt;
header or commit message is not enough. It does not clearly establish the&lt;br /&gt;
provenance of the code.&lt;br /&gt;
&lt;br /&gt;
The following specifies the additional guidelines required for importing changes&lt;br /&gt;
from elsewhere.&lt;br /&gt;
&lt;br /&gt;
By default you should keep the original author&#039;s summary and description,&lt;br /&gt;
along with any tag lines such as, &amp;quot;Signed-off-by:&amp;quot;. If the original change that&lt;br /&gt;
was imported does not have a summary and/or commit message from the original&lt;br /&gt;
author, it is still your responsibility to add the summary and commit message to&lt;br /&gt;
the patch header. Just as if you wrote the code, you should be able to clearly&lt;br /&gt;
explain what the change does. It is also necessary to document the original&lt;br /&gt;
author of the change. You should indicate the original author by simply stating&lt;br /&gt;
&amp;quot;written by&amp;quot; or &amp;quot;posted to the ... mailing list by&amp;quot;. You must not add a&lt;br /&gt;
Signed-off-by: tag line with their name, only the original author may add their&lt;br /&gt;
own Signed-off-by: tag line.&lt;br /&gt;
&lt;br /&gt;
It is also required that the origin of the work be fully documented. The origin&lt;br /&gt;
should be specified as part of the commit message in a way that an average&lt;br /&gt;
developer would be able to track down the original code. URLs should reference&lt;br /&gt;
original authoritative sources and not mirrors.&lt;br /&gt;
&lt;br /&gt;
If changes were required to resolve conflicts, they should be documented as&lt;br /&gt;
well.  When incorporating a commit or patch from an external source, changes to&lt;br /&gt;
the functionality not related to resolving conflicts should be made in a&lt;br /&gt;
second commit or patch.  This preserves the original external commit, and makes&lt;br /&gt;
the modifications clearly visible, and prevents confusion over the author of the&lt;br /&gt;
code.&lt;br /&gt;
&lt;br /&gt;
Finally you must add a &amp;quot;Signed-off-by:&amp;quot; tag line to indicate that you worked&lt;br /&gt;
with the patch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example: Importing from Elsewhere Unmodified ===&lt;br /&gt;
&lt;br /&gt;
For example, if you were to pull in the patch from the above example unmodified:&lt;br /&gt;
&lt;br /&gt;
   foobar: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   When using foobar on systems with less than a gigabyte of RAM common&lt;br /&gt;
   usage patterns often result in an Out-of-memory condition causing&lt;br /&gt;
   slowdowns and unexpected application termination.&lt;br /&gt;
   &lt;br /&gt;
   Low-memory systems should continue to function without running into&lt;br /&gt;
   memory-starvation conditions with minimal cost to systems with more&lt;br /&gt;
   available memory.  High-memory systems will be less able to use the&lt;br /&gt;
   full extent of the system, a dynamically tunable option may be best,&lt;br /&gt;
   long-term.&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The patch was imported from the OpenEmbedded git server&lt;br /&gt;
   (&amp;lt;nowiki&amp;gt;git://git.openembedded.org/openembedded&amp;lt;/nowiki&amp;gt;) as of commit id&lt;br /&gt;
   b65a0e0c84cf489bfa00d6aa6c48abc5a237100f.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Your Name &amp;lt;your.name@openembedded.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above example shows a clear way for a developer to find the original source&lt;br /&gt;
of the change. It indicates that the OpenEmbedded developer simply integrated&lt;br /&gt;
the change into the system without making any further modifications.&lt;br /&gt;
&lt;br /&gt;
=== Example: Importing from Elsewhere Modified ===&lt;br /&gt;
&lt;br /&gt;
When importing a patch, occasionally changes have to be made in order to resolve&lt;br /&gt;
conflicts.  The following is an example of the commit message when the item needed&lt;br /&gt;
to be modified:&lt;br /&gt;
&lt;br /&gt;
   foobar: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   When using foobar on systems with less than a gigabyte of RAM common&lt;br /&gt;
   usage patterns often result in an Out-of-memory condition causing&lt;br /&gt;
   slowdowns and unexpected application termination.&lt;br /&gt;
   &lt;br /&gt;
   Low-memory systems should continue to function without running into&lt;br /&gt;
   memory-starvation conditions with minimal cost to systems with more&lt;br /&gt;
   available memory.  High-memory systems will be less able to use the&lt;br /&gt;
   full extent of the system, a dynamically tunable option may be best,&lt;br /&gt;
   long-term.&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The patch was imported from the OpenEmbedded git server&lt;br /&gt;
   (&amp;lt;nowiki&amp;gt;git://git.openembedded.org/openembedded&amp;lt;/nowiki&amp;gt;) as of commit id&lt;br /&gt;
   b65a0e0c84cf489bfa00d6aa6c48abc5a237100f.&lt;br /&gt;
   &lt;br /&gt;
   A previous change had modified the memory threshold calculation,&lt;br /&gt;
   causing a conflict.  The conflict was resolved by preserving the&lt;br /&gt;
   memory threshold calculation from the existing implementation.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Your Name &amp;lt;your.name@openembedded.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Patch Header Recommendations ==&lt;br /&gt;
&lt;br /&gt;
In order to keep track of patches and ultimately reduce the number of patches&lt;br /&gt;
that are required to be maintained, we need to track the status of the patches&lt;br /&gt;
that are created. The following items are specific to patches applied by recipes.&lt;br /&gt;
&lt;br /&gt;
In addition to the items mentioned above, we also want to track if it&#039;s&lt;br /&gt;
appropriate to get this particular patch into the upstream project. Since we&lt;br /&gt;
want to track this information, we need a consistent tag and status indicator&lt;br /&gt;
that can be searched.&lt;br /&gt;
&lt;br /&gt;
While adding this tracking information to the patch headers is currently&lt;br /&gt;
optional, it is highly recommended and some maintainers may require it.  It is&lt;br /&gt;
optional at this time so that it can be evaluated as to its usefulness over&lt;br /&gt;
time.  Existing patches will be updated with the tag as they are modified.&lt;br /&gt;
&lt;br /&gt;
As mentioned in the above, be sure to include any URL to bug tracking, mailing&lt;br /&gt;
lists or other reference material pertaining to the patch. Then add a new tag&lt;br /&gt;
&amp;quot;Upstream-Status:&amp;quot; which contains one of the following items:&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Pending&#039;&#039;&#039;&lt;br /&gt;
   - No determination has been made yet or not yet submitted to upstream&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Submitted&#039;&#039;&#039; [where]&lt;br /&gt;
   - Submitted to upstream, waiting approval&lt;br /&gt;
   - Optionally include where it was submitted, such as the author, mailing&lt;br /&gt;
     list, etc.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Accepted&#039;&#039;&#039;&lt;br /&gt;
   - Accepted in upstream, expect it to be removed at next update, include&lt;br /&gt;
     expected version info&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Backport&#039;&#039;&#039;&lt;br /&gt;
   - Backported from new upstream version, because we are at a fixed version,&lt;br /&gt;
     include upstream version info&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Denied&#039;&#039;&#039;&lt;br /&gt;
   - Not accepted by upstream, include reason in patch&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Inappropriate [reason]&#039;&#039;&#039;&lt;br /&gt;
   - The patch is not appropriate for upstream, include a brief reason on the&lt;br /&gt;
     same line enclosed with []&lt;br /&gt;
     reason can be:&lt;br /&gt;
       not author (You are not the author and do not intend to upstream this,&lt;br /&gt;
                   source must be listed in the comments)&lt;br /&gt;
       native&lt;br /&gt;
       licensing&lt;br /&gt;
       configuration&lt;br /&gt;
       enable feature&lt;br /&gt;
       disable feature&lt;br /&gt;
       bugfix (add bug URL here)&lt;br /&gt;
       embedded specific&lt;br /&gt;
       no upstream (the upstream is no longer available -- dead project)&lt;br /&gt;
       other (give details in comments)&lt;br /&gt;
&lt;br /&gt;
The various &amp;quot;Inappropriate [reason]&amp;quot; status items are meant to indicate that the&lt;br /&gt;
person responsible for adding this patch to the system does not intend to&lt;br /&gt;
upstream the patch for a specific reason.  Unless otherwise noted, another&lt;br /&gt;
person could submit this patch to the upstream, if they do the status should be&lt;br /&gt;
changed to &amp;quot;Submitted [where]&amp;quot;, and an additional Signed-off-by: line added to&lt;br /&gt;
the patch by the person claiming responsibility for upstreaming.&lt;br /&gt;
&lt;br /&gt;
For example, if the patch has been submitted upstream:&lt;br /&gt;
&lt;br /&gt;
   rpm: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;[RPM Ticket #65] -- http://rpm5.org/cvs/tktview?tn=65,5&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Upstream-Status: Submitted [rpm5-devel@rpm5.org]&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A future commit can change the value to &amp;quot;Accepted&amp;quot; or &amp;quot;Denied&amp;quot; as appropriate.&lt;br /&gt;
&lt;br /&gt;
== Common Errors in Patch and Commit Messages ==&lt;br /&gt;
&lt;br /&gt;
- Short log does not start with the file or component being modified.  Such as&lt;br /&gt;
&amp;quot;foo: Update to new upstream version 5.8.9&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Avoid starting the summary line with a capital letter, unless the component&lt;br /&gt;
being referred to also begins with a capital letter.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t have one huge patch, split your change into logical subparts. It&#039;s&lt;br /&gt;
easier to track down problems afterward using tools such as git bisect. It also&lt;br /&gt;
makes it easy for people to cherry-pick changes into things like stable branches.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t simply translate your change into English for a commit log. The log&lt;br /&gt;
&amp;quot;Change compare from zero to one&amp;quot; is bad because it describes only the code&lt;br /&gt;
change in the patch; we can see that from reading the patch itself. Let the code&lt;br /&gt;
tell the story of the mechanics of the change (as much as possible), and let&lt;br /&gt;
your comment tell the other details -- i.e. what the problem was, how it&lt;br /&gt;
manifested itself (symptoms), and if necessary, the justification for why the&lt;br /&gt;
fix was done in manner that it was.  In other words, the long commit message&lt;br /&gt;
must describe *why* the change was needed (instead of what has changed).&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t start your commit log with &amp;quot;This patch...&amp;quot; -- we already know it is a patch.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t repeat your short log in the long log. If you really really don&#039;t have&lt;br /&gt;
anything new and informational to add in as a long log, then don&#039;t put a long&lt;br /&gt;
log at all. This should be uncommon -- i.e. the only acceptable cases for no&lt;br /&gt;
long log would be something like &amp;quot;Documentation/README: Fix spelling mistakes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t put absolute paths to source files that are specific to your site, i.e.&lt;br /&gt;
if you get a compile error on &amp;quot;fs/exec.c&amp;quot; then tidy up the parts of the compile&lt;br /&gt;
output to just show that portion. We don&#039;t need to see that it was&lt;br /&gt;
/home/wally/src/git/oe-core/meta/classes/insane.bbclass or similar - that full&lt;br /&gt;
path has no value to others. Always reduce the path to something more&lt;br /&gt;
meaningful, such as oe-core/meta/classes/insane.bbclass.&lt;br /&gt;
&lt;br /&gt;
- Always use the most significant ramification of the change in the words of&lt;br /&gt;
your subject/shortlog. For example, don&#039;t say &amp;quot;fix compile warning in foo&amp;quot; when&lt;br /&gt;
the compiler warning was really telling us that we were dereferencing complete&lt;br /&gt;
garbage off in the weeds that could in theory cause an OOPS under some&lt;br /&gt;
circumstances. When people are choosing commits for backports to stable or&lt;br /&gt;
distro kernels, the shortlog will be what they use for an initial sorting&lt;br /&gt;
selection. If they see &amp;quot;Fix possible OOPS in....&amp;quot; then these people will look&lt;br /&gt;
closer, whereas they most likely will skip over simple warning fixes.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t put in the full 20 or more lines of a backtrace when really it is just&lt;br /&gt;
the last 5 or so function calls that are relevant to the crash/fix. If the entry&lt;br /&gt;
point, or start of the trace is relevant (i.e. a syscall or similar), you can&lt;br /&gt;
leave that, and then replace a chunk of the intermediate calls in the middle&lt;br /&gt;
with a single [...]&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t include timestamps or other unnecessary information, unless they are&lt;br /&gt;
relevant to the situation (i.e. indicating an unacceptable delay in a driver&lt;br /&gt;
initialization etc.)&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t use links to temporary resources like pastebin and friends. The commit&lt;br /&gt;
message may be read long after this resource timed out.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t reference mirrors, but instead always reference original authoritative&lt;br /&gt;
sources.&lt;br /&gt;
&lt;br /&gt;
- Avoid punctuation in the short log.&lt;br /&gt;
&lt;br /&gt;
[[Category:Policy]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5359</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5359"/>
		<updated>2012-11-14T22:32:35Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Implementation Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
&lt;br /&gt;
In OpenEmbedded-Core there in an included toolchain that is built up of GNU binutils, gcc, and eglibc.  In addition related components such as gdb, cross-prelink, mklibs and others provider additional toolchain functionality.  In this document we focus on explaining best practices for including an additional toolchain that is capable of assembling, compiling and linking code.  This document does not cover replacing the existing toolchain or toolchain components with external elements.&lt;br /&gt;
&lt;br /&gt;
Many companies have commercial / highly optimized toolchains for specific purposes, such as ICC from Intel, LLVM, ARM Ltd toolchains, etc..  In some cases, these highly optimized toolchains may result in better performance for some applications, however they are often not generally applicable as they can not compile all of the system software.  So instead of replacing the included GNU toolchain, a mechanism for providing an alternative/secondary toolchain is desired.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchains should be implemented in a layer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In order to facilitate re-use and make it easier to completely disable the secondary toolchain, a layer must be used to implement the secondary toolchain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchain must be generally compatible with GNU toolchain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The secondary toolchain must be generally compatible with the idea of sysroots, linking to the defined libc, and various GNU conventions.  This compatibility may be implemented directly by the secondary toolchain or via a wrapper of some type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Per recipe selection of toolchain usage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A mechanism is needed to activate this alternative toolchain on a per-recipe basis.  Using variables it should be possible to specify on a per-recipe basis which toolchain should be used, leaving the default up to the user.  (It&#039;s assumed if the user does not select a default, the system GNU toolchain will be defaulted.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blacklist/Whitelist&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even with the requirement to be generally compatible, we can not expect all of the possible recipes to build properly with the secondary toolchain.  As a consequence of this, it will be necessary to implement a blacklist (or whitelist) of specific recipes that are known to work.  This way only supported components can be build by the user, avoid numerous complaints and unresolvable defects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The SDK generated by OpenEmbedded-Core also includes the included toolchain components.  It would be useful to also provide support for the secondary toolchain within the SDK environment.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Bitbake variables ===&lt;br /&gt;
&lt;br /&gt;
A set of common bitbake variables, defined in meta/conf/bitbake.conf, are used to define how to run the toolchain components and the proper arguments.&lt;br /&gt;
&lt;br /&gt;
A number of key items may need to be changed, depending on the toolchain being provided.  These items may include:&lt;br /&gt;
&lt;br /&gt;
   * TARGET_CPPFLAGS&lt;br /&gt;
   * TARGET_CFLAGS&lt;br /&gt;
   * TARGET_CXXFLAGS&lt;br /&gt;
   * TARGET_LDFLAGS&lt;br /&gt;
   * CC&lt;br /&gt;
   * CXX&lt;br /&gt;
   * F77&lt;br /&gt;
   * CPP&lt;br /&gt;
   * LD&lt;br /&gt;
   * CCLD&lt;br /&gt;
   * AR&lt;br /&gt;
   * AS&lt;br /&gt;
   * RANLIB&lt;br /&gt;
   * STRIP&lt;br /&gt;
   * OBJCOPY&lt;br /&gt;
   * OBJDUMP&lt;br /&gt;
   * NM&lt;br /&gt;
   * SELECTED_OPTIMIZATION&lt;br /&gt;
      * FULL_OPTIMIZATION&lt;br /&gt;
      * DEBUG_OPTIMIZATION&lt;br /&gt;
&lt;br /&gt;
Each of the above items has a default definition within the meta/conf/bitbake.conf file.  In addition, many of the components are based on specific tune variables such as:&lt;br /&gt;
&lt;br /&gt;
   * TUNE_CCARGS&lt;br /&gt;
   * TUNE_LDARGS&lt;br /&gt;
   * TUNE_ASARGS&lt;br /&gt;
&lt;br /&gt;
Deciding which items need to be overridden is up to the author of the layer.  It is expected that only a subset of the above referenced variables will need secondary toolchain specific versions for most implementations.&lt;br /&gt;
&lt;br /&gt;
It is suggested that the secondary toolchain values be defined in a single configuration file.  Within the example this is &amp;quot;conf/tc-example.conf&amp;quot;.  The standard name for the file should be &#039;conf/tc-&amp;lt;toolchain&amp;gt;.conf&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Override ===&lt;br /&gt;
&lt;br /&gt;
In order to allow for the layer to selectively override the variables listed above, a standard override syntax is needed.&lt;br /&gt;
&lt;br /&gt;
The standard override syntax will be &#039;toolchain-${TOOLCHAIN}&#039;.  This will allow us to specify multiple alternative and primary toolchain combinations as necessary.&lt;br /&gt;
&lt;br /&gt;
Each of the toolchain related variables can then be overridden using the standard override syntax: &amp;lt;var&amp;gt;_toolchain-&amp;lt;toolchain&amp;gt;, such as:&lt;br /&gt;
&lt;br /&gt;
CC_toolchain-icc = &amp;quot;icc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In order for an individual recipe to use the secondary toolchain, the user would define: TOOLCHAIN_pn-&amp;lt;recipe&amp;gt; = &#039;toolchain&#039;, such as:&lt;br /&gt;
&lt;br /&gt;
TOOLCHAIN_pn-bash = &amp;quot;icc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The OVERRIDE is implemented in the tc-secondary.bbclass in the example.&lt;br /&gt;
&lt;br /&gt;
=== Blacklist/Whitelist ===&lt;br /&gt;
&lt;br /&gt;
A standard blacklist/whitelist facility is to be implemented.  This facility is independent of the existing blacklist class that is part of OpenEmbedded-Core.&lt;br /&gt;
&lt;br /&gt;
Similar to the existing blacklist class, you will be able to define a blacklist, per toolchain type, such as:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
or alternatively create a whitelist facility using:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
   TCWHITELIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Using the second approach will allow you to blacklist all recipes, and only enable those known to work with the alternative toolchain.  &lt;br /&gt;
&lt;br /&gt;
The blacklist items should be defined within conf/tc-&amp;lt;toolchain&amp;gt;-blacklist.conf.  The validation of the blacklist should use the standard tc-blacklist.bbclass implementation available within the example.&lt;br /&gt;
&lt;br /&gt;
=== SDK ===&lt;br /&gt;
&lt;br /&gt;
In order to make it easier to use the alternative toolchain within the SDK.  An additional environment-* file should be created.  The purpose of this file is to simply override the settings in the main environment file.&lt;br /&gt;
&lt;br /&gt;
See the example section for an implementation that will create this file automatically.&lt;br /&gt;
&lt;br /&gt;
== Implementation Example ==&lt;br /&gt;
&lt;br /&gt;
An example implementation has been created in the layer &amp;quot;meta-tc-example&amp;quot;.  The file format follows:&lt;br /&gt;
&lt;br /&gt;
meta-tc-example/&lt;br /&gt;
meta-tc-example/bin&lt;br /&gt;
meta-tc-example/bin/example-toolchain&lt;br /&gt;
meta-tc-example/conf&lt;br /&gt;
meta-tc-example/conf/layer.conf&lt;br /&gt;
meta-tc-example/conf/tc-example.conf&lt;br /&gt;
meta-tc-example/conf/tc-example-blacklist.conf&lt;br /&gt;
meta-tc-example/classes&lt;br /&gt;
meta-tc-example/classes/tc-secondary.bbclass&lt;br /&gt;
meta-tc-example/classes/tc-blacklist.bbclass&lt;br /&gt;
&lt;br /&gt;
The following example is available at: [http://gate.crashing.org/~fray/yocto/meta-tc-example.tar.bz2 meta-tc-example.tar.bz2]&lt;br /&gt;
&lt;br /&gt;
=== conf/layer.conf ===&lt;br /&gt;
&lt;br /&gt;
   # We have a conf and classes directory, append to BBPATH&lt;br /&gt;
   BBPATH .= &amp;quot;:${LAYERDIR}&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # If we have a recipes directory, add to BBFILES&lt;br /&gt;
   #BBFILES += &amp;quot;${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/*/recipes-*/*/*.bbappend&amp;quot;&lt;br /&gt;
   #BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   #BBFILE_PATTERN_tc-example := &amp;quot;^${LAYERDIR}/&amp;quot;&lt;br /&gt;
   #BBFILE_PRIORITY_tc-example = &amp;quot;5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Above is standard layer configuration.  Note, the commented out sections should be re-enabled if the secondary toolchain includes recipes and/or bbappend files.&lt;br /&gt;
&lt;br /&gt;
   PATH := &amp;quot;${PATH}:${LAYERDIR}/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Add to the path a standard system path, a layer specific path.  This is the way you can add a secondary toolchain to the path.&lt;br /&gt;
&lt;br /&gt;
   # Define the alternative toolchain&lt;br /&gt;
   SECONDARYTC = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   # Enable the secondary toolchain&lt;br /&gt;
   INHERIT += &#039;tc-secondary tc-blacklist&#039;&lt;br /&gt;
&lt;br /&gt;
Define the alternative toolchain name in SECONDARYTC.  The inherit causes the tc-secondary.bbclass and tc-blacklist.bbclass to be loaded later.  Eventually this class used SECONDARYTC to load in the secondary toolchain configuration files.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example.conf ===&lt;br /&gt;
&lt;br /&gt;
   # Define default system toolchain (default to built-in)&lt;br /&gt;
   TOOLCHAIN = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
Define a reasonable default such as gnu.  The purpose of this default is to allow someone to specify the default or provide default override items for the built-in toolchain.&lt;br /&gt;
&lt;br /&gt;
   # Define a secondary toolchain called &#039;example&#039;&lt;br /&gt;
   # the &#039;example&#039; toolchain can be activated using:&lt;br /&gt;
   #&lt;br /&gt;
   # Per package (preferred):&lt;br /&gt;
   #   TOOLCHAIN_pn-bash = &#039;example&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # Globally:&lt;br /&gt;
   #   TOOLCHAIN = &#039;example&#039;&lt;br /&gt;
   #   TOOLCHAIN_pn-eglibc = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
The above is an example of how to use the alternative toolchain.&lt;br /&gt;
&lt;br /&gt;
   # When the secondary toolchain is used, we add an automatic depend...&lt;br /&gt;
   DEPENDS_append_toolchain-example = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # ...the depend can be provided by a recipe or as an ASSUME_PROVIDED&lt;br /&gt;
   ASSUME_PROVIDED_append = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Use the above as an example on how to add additional dependencies to specific packages.  This can be used to trigger a recipe to build.&lt;br /&gt;
&lt;br /&gt;
   # Default values from bitbake.conf...&lt;br /&gt;
   # Variables with a &#039;*&#039; are things likely to need to be overridden:&lt;br /&gt;
   #&lt;br /&gt;
   #   FULL_OPTIMIZATION = &amp;quot;-O2 -pipe ${DEBUG_FLAGS}&amp;quot;&lt;br /&gt;
   #   DEBUG_OPTIMIZATION = &amp;quot;-O -fno-omit-frame-pointer ${DEBUG_FLAGS} -pipe&amp;quot;&lt;br /&gt;
   #   SELECTED_OPTIMIZATION = &amp;quot;${@d.getVar([&#039;FULL_OPTIMIZATION&#039;, &#039;DEBUG_OPTIMIZATION&#039;][d.getVar(&#039;DEBUG_BUILD&#039;, True) == &#039;1&#039;], True)}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   # * TOOLCHAIN_OPTIONS = &amp;quot; --sysroot=${STAGING_DIR_TARGET}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * TARGET_CPPFLAGS = &amp;quot;&amp;quot;&lt;br /&gt;
   # * TARGET_CFLAGS = &amp;quot;${TARGET_CPPFLAGS} ${SELECTED_OPTIMIZATION}&amp;quot;&lt;br /&gt;
   # * TARGET CXXFLAGS = &amp;quot;${TARGET_CFLAGS} -fpermissive&amp;quot;&lt;br /&gt;
   # * TARGET_LDFLAGS = &amp;quot;-Wl,-O1 ${TARGET_LINK_HASH_STYLE}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   TARGET_CC_ARCH = &amp;quot;${TUNE_CCARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_LD_ARCH = &amp;quot;${TUNE_LDARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_AS_ARCH = &amp;quot;${TUNE_ASARGS}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   HOST_CC_ARCH = &amp;quot;${TARGET_CC_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_LD_ARCH = &amp;quot;${TARGET_LD_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_AS_ARCH = &amp;quot;${TARGET_AS_ARCH}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * CC = &amp;quot;${CCACHE}${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CXX = &amp;quot;${CCACHE}${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * F77 = &amp;quot;${CCACHE}${HOST_PREFIX}g77 ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CPP = &amp;quot;${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   # * LD = &amp;quot;${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
   # * CCLD = &amp;quot;${CC}&amp;quot;&lt;br /&gt;
   #   AR = &amp;quot;${HOST_PREFIX}ar&amp;quot;&lt;br /&gt;
   #   AS = &amp;quot;${HOST_PREFIX}as ${HOST_AS_ARCH}&amp;quot;&lt;br /&gt;
   #   RANLIB = &amp;quot;${HOST_PREFIX}ranlib&amp;quot;&lt;br /&gt;
   #   STRIP = &amp;quot;${HOST_PREFIX}strip&amp;quot;&lt;br /&gt;
   #   OBJCOPY = &amp;quot;${HOST_PREFIX}objcopy&amp;quot;&lt;br /&gt;
   #   OBJDUMP = &amp;quot;${HOST_PREFIX}objdump&amp;quot;&lt;br /&gt;
   #   NM = &amp;quot;${HOST_PREFIX}nm&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # Override values:&lt;br /&gt;
   CC_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   CXX_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   CPP_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   LD_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The above implements the necessary overrides for the example toolchain.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example-blacklist.conf ===&lt;br /&gt;
&lt;br /&gt;
Example configuration file that enables the blacklist and defines the defaults.&lt;br /&gt;
&lt;br /&gt;
   # Blacklist certain items...&lt;br /&gt;
   TCBLACKLIST[eglibc] = &#039;example&#039;&lt;br /&gt;
   TCBLACKLIST[bash] = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   #&lt;br /&gt;
   # or&lt;br /&gt;
   #&lt;br /&gt;
   &lt;br /&gt;
   # Switch to a global blacklist and whitelist situation...&lt;br /&gt;
   # TCBLACKLIST = &#039;example&#039;&lt;br /&gt;
   # TCWHITELIST[bash] = &#039;example&#039;&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-secondary.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # In order to add overrides, we need to do it later then in the layers.conf&lt;br /&gt;
   # the only standard way is using an inherit, which requires a bbclass&lt;br /&gt;
   &lt;br /&gt;
   # Add the necessary override&lt;br /&gt;
   TOOLCHAINOVERRIDES = &amp;quot;:toolchain-${TOOLCHAIN}&amp;quot;&lt;br /&gt;
   TOOLCHAINOVERRIDES[vardepsexclude] = &amp;quot;TOOLCHAIN&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   OVERRIDES .= &amp;quot;${TOOLCHAINOVERRIDES}&amp;quot;&lt;br /&gt;
   OVERRIDES[vardepsexclude] += &amp;quot;TOOLCHAINOVERRIDES&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   require conf/tc-${SECONDARYTC}.conf&lt;br /&gt;
&lt;br /&gt;
The above code configures the basic overrides and loads the configuration file.  There is one limitation to the above however.  It will only load one secondary toolchain.  A simple way around this is to rename the inherit and change to using something other then SECONDARYTC.  This likely will not be a problem.&lt;br /&gt;
&lt;br /&gt;
   toolchain_create_sdk_env_script_alt () {&lt;br /&gt;
           set -x&lt;br /&gt;
   &lt;br /&gt;
           # Create environment setup script (secondary toolchain)&lt;br /&gt;
           orig_script=${1:-${SDK_OUTPUT}/${SDKPATH}/environment-setup-${REAL_MULTIMACH_TARGET_SYS}}&lt;br /&gt;
           script=&amp;quot;$orig_script&amp;quot;&amp;quot;-${SECONDARYTC}&amp;quot;&lt;br /&gt;
           rm -f $script&lt;br /&gt;
           touch $script&lt;br /&gt;
           echo &amp;quot;. $orig_script&amp;quot; | sed -e &amp;quot;s:${SDK_OUTPUT}::&amp;quot; &amp;gt;&amp;gt; $script&lt;br /&gt;
           if [ &#039;${CC_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CC_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CC=&amp;quot;${CC_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CXX_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CXX_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CXX=&amp;quot;${CXX_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CPP_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CPP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CPP=&amp;quot;${CPP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${AS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;AS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export AS=&amp;quot;${AS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${LD_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;LD_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export LD=&amp;quot;${LD_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${RANLIB_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;RANLIB_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export RANLIB=&amp;quot;${RANLIB_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${STRIP_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;STRIP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export STRIP=&amp;quot;${STRIP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${OBJCOPY_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;OBJCOPY_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export OBJCOPY=&amp;quot;${OBJCOPY_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${OBJDUMP_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;OBJDUMP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export OBJDUMP=&amp;quot;${OBJDUMP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${NM_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;NM_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export NM=&amp;quot;${NM_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
   &lt;br /&gt;
           if [ &#039;${CFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CFLAGS=&amp;quot;${CFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CXXFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CXXFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CXXFLAGS=&amp;quot;${CXXFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${LDFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;LDFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export LDFLAGS=&amp;quot;${LDFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CPPFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CPPFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CPPFLAGS=&amp;quot;${CPPFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
   &lt;br /&gt;
           # Fixup any sysroot references&lt;br /&gt;
           sed -i -e &amp;quot;s:${STAGING_DIR_TARGET}:${SDKTARGETSYSROOT}:g&amp;quot; $script&lt;br /&gt;
   &lt;br /&gt;
           # All environment scripts require OECORE_NATIVE_SYSROOT&lt;br /&gt;
           echo &#039;export OECORE_NATIVE_SYSROOT=&amp;quot;${SDKPATHNATIVE}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   populate_sdk_image_append() {&lt;br /&gt;
           toolchain_create_sdk_env_script_alt ${SDK_OUTPUT}/${SDKPATH}/environment-setup-${REAL_MULTIMACH_TARGET_SYS}&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
The above code will add an additional environment-setup-*-&amp;lt;toolchain&amp;gt; file.  This can be used to enable the right environment to use the alternative toolchain.  Note, it does not add anything to the path so the user will still need to configure the path to the alternative toolchain.  (The layer creator can always provide the necessary &#039;nativesdk&#039; or similar package that provides the alternative toolchain as part of the SDK as well.)&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-blacklist.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain blacklist class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # Implement blacklist/whitelist functionality for alternative toolchains&lt;br /&gt;
   # Based on the oe-core blacklist bclass&lt;br /&gt;
   #&lt;br /&gt;
   # To add a blacklisted package:&lt;br /&gt;
   #   TCBLACKLIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # To blacklist everything, and whitelist a package:&lt;br /&gt;
   #   TCBLACKLIST = &#039;toolchain&#039;&lt;br /&gt;
   #   TCWHITELIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   &lt;br /&gt;
   include conf/tc-${SECONDARYTC}-blacklist.conf&lt;br /&gt;
   &lt;br /&gt;
   python () {&lt;br /&gt;
       tc = d.getVar(&#039;TOOLCHAIN&#039;, True)&lt;br /&gt;
       pn = d.getVar(&#039;PN&#039;, True)&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVarFlag(&#039;TCBLACKLIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and blacklist == tc:&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVar(&#039;TCBLACKLIST&#039;, True)&lt;br /&gt;
       whitelist = d.getVarFlag(&#039;TCWHITELIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and (not whitelist or whitelist != tc):&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Further comments and information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Dev]]&lt;br /&gt;
[[Category:Layers]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5357</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5357"/>
		<updated>2012-11-14T22:29:19Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* classes/tc-secondary.bbclass */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
&lt;br /&gt;
In OpenEmbedded-Core there in an included toolchain that is built up of GNU binutils, gcc, and eglibc.  In addition related components such as gdb, cross-prelink, mklibs and others provider additional toolchain functionality.  In this document we focus on explaining best practices for including an additional toolchain that is capable of assembling, compiling and linking code.  This document does not cover replacing the existing toolchain or toolchain components with external elements.&lt;br /&gt;
&lt;br /&gt;
Many companies have commercial / highly optimized toolchains for specific purposes, such as ICC from Intel, LLVM, ARM Ltd toolchains, etc..  In some cases, these highly optimized toolchains may result in better performance for some applications, however they are often not generally applicable as they can not compile all of the system software.  So instead of replacing the included GNU toolchain, a mechanism for providing an alternative/secondary toolchain is desired.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchains should be implemented in a layer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In order to facilitate re-use and make it easier to completely disable the secondary toolchain, a layer must be used to implement the secondary toolchain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchain must be generally compatible with GNU toolchain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The secondary toolchain must be generally compatible with the idea of sysroots, linking to the defined libc, and various GNU conventions.  This compatibility may be implemented directly by the secondary toolchain or via a wrapper of some type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Per recipe selection of toolchain usage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A mechanism is needed to activate this alternative toolchain on a per-recipe basis.  Using variables it should be possible to specify on a per-recipe basis which toolchain should be used, leaving the default up to the user.  (It&#039;s assumed if the user does not select a default, the system GNU toolchain will be defaulted.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blacklist/Whitelist&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even with the requirement to be generally compatible, we can not expect all of the possible recipes to build properly with the secondary toolchain.  As a consequence of this, it will be necessary to implement a blacklist (or whitelist) of specific recipes that are known to work.  This way only supported components can be build by the user, avoid numerous complaints and unresolvable defects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The SDK generated by OpenEmbedded-Core also includes the included toolchain components.  It would be useful to also provide support for the secondary toolchain within the SDK environment.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Bitbake variables ===&lt;br /&gt;
&lt;br /&gt;
A set of common bitbake variables, defined in meta/conf/bitbake.conf, are used to define how to run the toolchain components and the proper arguments.&lt;br /&gt;
&lt;br /&gt;
A number of key items may need to be changed, depending on the toolchain being provided.  These items may include:&lt;br /&gt;
&lt;br /&gt;
   * TARGET_CPPFLAGS&lt;br /&gt;
   * TARGET_CFLAGS&lt;br /&gt;
   * TARGET_CXXFLAGS&lt;br /&gt;
   * TARGET_LDFLAGS&lt;br /&gt;
   * CC&lt;br /&gt;
   * CXX&lt;br /&gt;
   * F77&lt;br /&gt;
   * CPP&lt;br /&gt;
   * LD&lt;br /&gt;
   * CCLD&lt;br /&gt;
   * AR&lt;br /&gt;
   * AS&lt;br /&gt;
   * RANLIB&lt;br /&gt;
   * STRIP&lt;br /&gt;
   * OBJCOPY&lt;br /&gt;
   * OBJDUMP&lt;br /&gt;
   * NM&lt;br /&gt;
   * SELECTED_OPTIMIZATION&lt;br /&gt;
      * FULL_OPTIMIZATION&lt;br /&gt;
      * DEBUG_OPTIMIZATION&lt;br /&gt;
&lt;br /&gt;
Each of the above items has a default definition within the meta/conf/bitbake.conf file.  In addition, many of the components are based on specific tune variables such as:&lt;br /&gt;
&lt;br /&gt;
   * TUNE_CCARGS&lt;br /&gt;
   * TUNE_LDARGS&lt;br /&gt;
   * TUNE_ASARGS&lt;br /&gt;
&lt;br /&gt;
Deciding which items need to be overridden is up to the author of the layer.  It is expected that only a subset of the above referenced variables will need secondary toolchain specific versions for most implementations.&lt;br /&gt;
&lt;br /&gt;
It is suggested that the secondary toolchain values be defined in a single configuration file.  Within the example this is &amp;quot;conf/tc-example.conf&amp;quot;.  The standard name for the file should be &#039;conf/tc-&amp;lt;toolchain&amp;gt;.conf&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Override ===&lt;br /&gt;
&lt;br /&gt;
In order to allow for the layer to selectively override the variables listed above, a standard override syntax is needed.&lt;br /&gt;
&lt;br /&gt;
The standard override syntax will be &#039;toolchain-${TOOLCHAIN}&#039;.  This will allow us to specify multiple alternative and primary toolchain combinations as necessary.&lt;br /&gt;
&lt;br /&gt;
Each of the toolchain related variables can then be overridden using the standard override syntax: &amp;lt;var&amp;gt;_toolchain-&amp;lt;toolchain&amp;gt;, such as:&lt;br /&gt;
&lt;br /&gt;
CC_toolchain-icc = &amp;quot;icc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In order for an individual recipe to use the secondary toolchain, the user would define: TOOLCHAIN_pn-&amp;lt;recipe&amp;gt; = &#039;toolchain&#039;, such as:&lt;br /&gt;
&lt;br /&gt;
TOOLCHAIN_pn-bash = &amp;quot;icc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The OVERRIDE is implemented in the tc-secondary.bbclass in the example.&lt;br /&gt;
&lt;br /&gt;
=== Blacklist/Whitelist ===&lt;br /&gt;
&lt;br /&gt;
A standard blacklist/whitelist facility is to be implemented.  This facility is independent of the existing blacklist class that is part of OpenEmbedded-Core.&lt;br /&gt;
&lt;br /&gt;
Similar to the existing blacklist class, you will be able to define a blacklist, per toolchain type, such as:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
or alternatively create a whitelist facility using:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
   TCWHITELIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Using the second approach will allow you to blacklist all recipes, and only enable those known to work with the alternative toolchain.  &lt;br /&gt;
&lt;br /&gt;
The blacklist items should be defined within conf/tc-&amp;lt;toolchain&amp;gt;-blacklist.conf.  The validation of the blacklist should use the standard tc-blacklist.bbclass implementation available within the example.&lt;br /&gt;
&lt;br /&gt;
=== SDK ===&lt;br /&gt;
&lt;br /&gt;
In order to make it easier to use the alternative toolchain within the SDK.  An additional environment-* file should be created.  The purpose of this file is to simply override the settings in the main environment file.&lt;br /&gt;
&lt;br /&gt;
See the example section for an implementation that will create this file automatically.&lt;br /&gt;
&lt;br /&gt;
== Implementation Example ==&lt;br /&gt;
&lt;br /&gt;
An example implementation has been created in the layer &amp;quot;meta-tc-example&amp;quot;.  The file format follows:&lt;br /&gt;
&lt;br /&gt;
meta-tc-example/&lt;br /&gt;
meta-tc-example/bin&lt;br /&gt;
meta-tc-example/bin/example-toolchain&lt;br /&gt;
meta-tc-example/conf&lt;br /&gt;
meta-tc-example/conf/layer.conf&lt;br /&gt;
meta-tc-example/conf/tc-example.conf&lt;br /&gt;
meta-tc-example/conf/tc-example-blacklist.conf&lt;br /&gt;
meta-tc-example/classes&lt;br /&gt;
meta-tc-example/classes/tc-secondary.bbclass&lt;br /&gt;
meta-tc-example/classes/tc-blacklist.bbclass&lt;br /&gt;
&lt;br /&gt;
=== conf/layer.conf ===&lt;br /&gt;
&lt;br /&gt;
   # We have a conf and classes directory, append to BBPATH&lt;br /&gt;
   BBPATH .= &amp;quot;:${LAYERDIR}&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # If we have a recipes directory, add to BBFILES&lt;br /&gt;
   #BBFILES += &amp;quot;${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/*/recipes-*/*/*.bbappend&amp;quot;&lt;br /&gt;
   #BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   #BBFILE_PATTERN_tc-example := &amp;quot;^${LAYERDIR}/&amp;quot;&lt;br /&gt;
   #BBFILE_PRIORITY_tc-example = &amp;quot;5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Above is standard layer configuration.  Note, the commented out sections should be re-enabled if the secondary toolchain includes recipes and/or bbappend files.&lt;br /&gt;
&lt;br /&gt;
   PATH := &amp;quot;${PATH}:${LAYERDIR}/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Add to the path a standard system path, a layer specific path.  This is the way you can add a secondary toolchain to the path.&lt;br /&gt;
&lt;br /&gt;
   # Define the alternative toolchain&lt;br /&gt;
   SECONDARYTC = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   # Enable the secondary toolchain&lt;br /&gt;
   INHERIT += &#039;tc-secondary tc-blacklist&#039;&lt;br /&gt;
&lt;br /&gt;
Define the alternative toolchain name in SECONDARYTC.  The inherit causes the tc-secondary.bbclass and tc-blacklist.bbclass to be loaded later.  Eventually this class used SECONDARYTC to load in the secondary toolchain configuration files.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example.conf ===&lt;br /&gt;
&lt;br /&gt;
   # Define default system toolchain (default to built-in)&lt;br /&gt;
   TOOLCHAIN = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
Define a reasonable default such as gnu.  The purpose of this default is to allow someone to specify the default or provide default override items for the built-in toolchain.&lt;br /&gt;
&lt;br /&gt;
   # Define a secondary toolchain called &#039;example&#039;&lt;br /&gt;
   # the &#039;example&#039; toolchain can be activated using:&lt;br /&gt;
   #&lt;br /&gt;
   # Per package (preferred):&lt;br /&gt;
   #   TOOLCHAIN_pn-bash = &#039;example&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # Globally:&lt;br /&gt;
   #   TOOLCHAIN = &#039;example&#039;&lt;br /&gt;
   #   TOOLCHAIN_pn-eglibc = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
The above is an example of how to use the alternative toolchain.&lt;br /&gt;
&lt;br /&gt;
   # When the secondary toolchain is used, we add an automatic depend...&lt;br /&gt;
   DEPENDS_append_toolchain-example = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # ...the depend can be provided by a recipe or as an ASSUME_PROVIDED&lt;br /&gt;
   ASSUME_PROVIDED_append = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Use the above as an example on how to add additional dependencies to specific packages.  This can be used to trigger a recipe to build.&lt;br /&gt;
&lt;br /&gt;
   # Default values from bitbake.conf...&lt;br /&gt;
   # Variables with a &#039;*&#039; are things likely to need to be overridden:&lt;br /&gt;
   #&lt;br /&gt;
   #   FULL_OPTIMIZATION = &amp;quot;-O2 -pipe ${DEBUG_FLAGS}&amp;quot;&lt;br /&gt;
   #   DEBUG_OPTIMIZATION = &amp;quot;-O -fno-omit-frame-pointer ${DEBUG_FLAGS} -pipe&amp;quot;&lt;br /&gt;
   #   SELECTED_OPTIMIZATION = &amp;quot;${@d.getVar([&#039;FULL_OPTIMIZATION&#039;, &#039;DEBUG_OPTIMIZATION&#039;][d.getVar(&#039;DEBUG_BUILD&#039;, True) == &#039;1&#039;], True)}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   # * TOOLCHAIN_OPTIONS = &amp;quot; --sysroot=${STAGING_DIR_TARGET}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * TARGET_CPPFLAGS = &amp;quot;&amp;quot;&lt;br /&gt;
   # * TARGET_CFLAGS = &amp;quot;${TARGET_CPPFLAGS} ${SELECTED_OPTIMIZATION}&amp;quot;&lt;br /&gt;
   # * TARGET CXXFLAGS = &amp;quot;${TARGET_CFLAGS} -fpermissive&amp;quot;&lt;br /&gt;
   # * TARGET_LDFLAGS = &amp;quot;-Wl,-O1 ${TARGET_LINK_HASH_STYLE}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   TARGET_CC_ARCH = &amp;quot;${TUNE_CCARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_LD_ARCH = &amp;quot;${TUNE_LDARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_AS_ARCH = &amp;quot;${TUNE_ASARGS}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   HOST_CC_ARCH = &amp;quot;${TARGET_CC_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_LD_ARCH = &amp;quot;${TARGET_LD_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_AS_ARCH = &amp;quot;${TARGET_AS_ARCH}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * CC = &amp;quot;${CCACHE}${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CXX = &amp;quot;${CCACHE}${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * F77 = &amp;quot;${CCACHE}${HOST_PREFIX}g77 ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CPP = &amp;quot;${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   # * LD = &amp;quot;${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
   # * CCLD = &amp;quot;${CC}&amp;quot;&lt;br /&gt;
   #   AR = &amp;quot;${HOST_PREFIX}ar&amp;quot;&lt;br /&gt;
   #   AS = &amp;quot;${HOST_PREFIX}as ${HOST_AS_ARCH}&amp;quot;&lt;br /&gt;
   #   RANLIB = &amp;quot;${HOST_PREFIX}ranlib&amp;quot;&lt;br /&gt;
   #   STRIP = &amp;quot;${HOST_PREFIX}strip&amp;quot;&lt;br /&gt;
   #   OBJCOPY = &amp;quot;${HOST_PREFIX}objcopy&amp;quot;&lt;br /&gt;
   #   OBJDUMP = &amp;quot;${HOST_PREFIX}objdump&amp;quot;&lt;br /&gt;
   #   NM = &amp;quot;${HOST_PREFIX}nm&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # Override values:&lt;br /&gt;
   CC_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   CXX_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   CPP_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   LD_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The above implements the necessary overrides for the example toolchain.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example-blacklist.conf ===&lt;br /&gt;
&lt;br /&gt;
Example configuration file that enables the blacklist and defines the defaults.&lt;br /&gt;
&lt;br /&gt;
   # Blacklist certain items...&lt;br /&gt;
   TCBLACKLIST[eglibc] = &#039;example&#039;&lt;br /&gt;
   TCBLACKLIST[bash] = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   #&lt;br /&gt;
   # or&lt;br /&gt;
   #&lt;br /&gt;
   &lt;br /&gt;
   # Switch to a global blacklist and whitelist situation...&lt;br /&gt;
   # TCBLACKLIST = &#039;example&#039;&lt;br /&gt;
   # TCWHITELIST[bash] = &#039;example&#039;&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-secondary.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # In order to add overrides, we need to do it later then in the layers.conf&lt;br /&gt;
   # the only standard way is using an inherit, which requires a bbclass&lt;br /&gt;
   &lt;br /&gt;
   # Add the necessary override&lt;br /&gt;
   TOOLCHAINOVERRIDES = &amp;quot;:toolchain-${TOOLCHAIN}&amp;quot;&lt;br /&gt;
   TOOLCHAINOVERRIDES[vardepsexclude] = &amp;quot;TOOLCHAIN&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   OVERRIDES .= &amp;quot;${TOOLCHAINOVERRIDES}&amp;quot;&lt;br /&gt;
   OVERRIDES[vardepsexclude] += &amp;quot;TOOLCHAINOVERRIDES&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   require conf/tc-${SECONDARYTC}.conf&lt;br /&gt;
&lt;br /&gt;
The above code configures the basic overrides and loads the configuration file.  There is one limitation to the above however.  It will only load one secondary toolchain.  A simple way around this is to rename the inherit and change to using something other then SECONDARYTC.  This likely will not be a problem.&lt;br /&gt;
&lt;br /&gt;
   toolchain_create_sdk_env_script_alt () {&lt;br /&gt;
           set -x&lt;br /&gt;
   &lt;br /&gt;
           # Create environment setup script (secondary toolchain)&lt;br /&gt;
           orig_script=${1:-${SDK_OUTPUT}/${SDKPATH}/environment-setup-${REAL_MULTIMACH_TARGET_SYS}}&lt;br /&gt;
           script=&amp;quot;$orig_script&amp;quot;&amp;quot;-${SECONDARYTC}&amp;quot;&lt;br /&gt;
           rm -f $script&lt;br /&gt;
           touch $script&lt;br /&gt;
           echo &amp;quot;. $orig_script&amp;quot; | sed -e &amp;quot;s:${SDK_OUTPUT}::&amp;quot; &amp;gt;&amp;gt; $script&lt;br /&gt;
           if [ &#039;${CC_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CC_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CC=&amp;quot;${CC_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CXX_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CXX_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CXX=&amp;quot;${CXX_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CPP_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CPP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CPP=&amp;quot;${CPP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${AS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;AS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export AS=&amp;quot;${AS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${LD_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;LD_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export LD=&amp;quot;${LD_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${RANLIB_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;RANLIB_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export RANLIB=&amp;quot;${RANLIB_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${STRIP_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;STRIP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export STRIP=&amp;quot;${STRIP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${OBJCOPY_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;OBJCOPY_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export OBJCOPY=&amp;quot;${OBJCOPY_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${OBJDUMP_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;OBJDUMP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export OBJDUMP=&amp;quot;${OBJDUMP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${NM_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;NM_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export NM=&amp;quot;${NM_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
   &lt;br /&gt;
           if [ &#039;${CFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CFLAGS=&amp;quot;${CFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CXXFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CXXFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CXXFLAGS=&amp;quot;${CXXFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${LDFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;LDFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export LDFLAGS=&amp;quot;${LDFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CPPFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;CPPFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CPPFLAGS=&amp;quot;${CPPFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
   &lt;br /&gt;
           # Fixup any sysroot references&lt;br /&gt;
           sed -i -e &amp;quot;s:${STAGING_DIR_TARGET}:${SDKTARGETSYSROOT}:g&amp;quot; $script&lt;br /&gt;
   &lt;br /&gt;
           # All environment scripts require OECORE_NATIVE_SYSROOT&lt;br /&gt;
           echo &#039;export OECORE_NATIVE_SYSROOT=&amp;quot;${SDKPATHNATIVE}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   populate_sdk_image_append() {&lt;br /&gt;
           toolchain_create_sdk_env_script_alt ${SDK_OUTPUT}/${SDKPATH}/environment-setup-${REAL_MULTIMACH_TARGET_SYS}&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
The above code will add an additional environment-setup-*-&amp;lt;toolchain&amp;gt; file.  This can be used to enable the right environment to use the alternative toolchain.  Note, it does not add anything to the path so the user will still need to configure the path to the alternative toolchain.  (The layer creator can always provide the necessary &#039;nativesdk&#039; or similar package that provides the alternative toolchain as part of the SDK as well.)&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-blacklist.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain blacklist class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # Implement blacklist/whitelist functionality for alternative toolchains&lt;br /&gt;
   # Based on the oe-core blacklist bclass&lt;br /&gt;
   #&lt;br /&gt;
   # To add a blacklisted package:&lt;br /&gt;
   #   TCBLACKLIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # To blacklist everything, and whitelist a package:&lt;br /&gt;
   #   TCBLACKLIST = &#039;toolchain&#039;&lt;br /&gt;
   #   TCWHITELIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   &lt;br /&gt;
   include conf/tc-${SECONDARYTC}-blacklist.conf&lt;br /&gt;
   &lt;br /&gt;
   python () {&lt;br /&gt;
       tc = d.getVar(&#039;TOOLCHAIN&#039;, True)&lt;br /&gt;
       pn = d.getVar(&#039;PN&#039;, True)&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVarFlag(&#039;TCBLACKLIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and blacklist == tc:&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVar(&#039;TCBLACKLIST&#039;, True)&lt;br /&gt;
       whitelist = d.getVarFlag(&#039;TCWHITELIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and (not whitelist or whitelist != tc):&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Further comments and information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Dev]]&lt;br /&gt;
[[Category:Layers]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5355</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5355"/>
		<updated>2012-11-14T22:25:18Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* classes/tc-secondary.bbclass */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
&lt;br /&gt;
In OpenEmbedded-Core there in an included toolchain that is built up of GNU binutils, gcc, and eglibc.  In addition related components such as gdb, cross-prelink, mklibs and others provider additional toolchain functionality.  In this document we focus on explaining best practices for including an additional toolchain that is capable of assembling, compiling and linking code.  This document does not cover replacing the existing toolchain or toolchain components with external elements.&lt;br /&gt;
&lt;br /&gt;
Many companies have commercial / highly optimized toolchains for specific purposes, such as ICC from Intel, LLVM, ARM Ltd toolchains, etc..  In some cases, these highly optimized toolchains may result in better performance for some applications, however they are often not generally applicable as they can not compile all of the system software.  So instead of replacing the included GNU toolchain, a mechanism for providing an alternative/secondary toolchain is desired.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchains should be implemented in a layer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In order to facilitate re-use and make it easier to completely disable the secondary toolchain, a layer must be used to implement the secondary toolchain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchain must be generally compatible with GNU toolchain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The secondary toolchain must be generally compatible with the idea of sysroots, linking to the defined libc, and various GNU conventions.  This compatibility may be implemented directly by the secondary toolchain or via a wrapper of some type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Per recipe selection of toolchain usage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A mechanism is needed to activate this alternative toolchain on a per-recipe basis.  Using variables it should be possible to specify on a per-recipe basis which toolchain should be used, leaving the default up to the user.  (It&#039;s assumed if the user does not select a default, the system GNU toolchain will be defaulted.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blacklist/Whitelist&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even with the requirement to be generally compatible, we can not expect all of the possible recipes to build properly with the secondary toolchain.  As a consequence of this, it will be necessary to implement a blacklist (or whitelist) of specific recipes that are known to work.  This way only supported components can be build by the user, avoid numerous complaints and unresolvable defects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The SDK generated by OpenEmbedded-Core also includes the included toolchain components.  It would be useful to also provide support for the secondary toolchain within the SDK environment.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Bitbake variables ===&lt;br /&gt;
&lt;br /&gt;
A set of common bitbake variables, defined in meta/conf/bitbake.conf, are used to define how to run the toolchain components and the proper arguments.&lt;br /&gt;
&lt;br /&gt;
A number of key items may need to be changed, depending on the toolchain being provided.  These items may include:&lt;br /&gt;
&lt;br /&gt;
   * TARGET_CPPFLAGS&lt;br /&gt;
   * TARGET_CFLAGS&lt;br /&gt;
   * TARGET_CXXFLAGS&lt;br /&gt;
   * TARGET_LDFLAGS&lt;br /&gt;
   * CC&lt;br /&gt;
   * CXX&lt;br /&gt;
   * F77&lt;br /&gt;
   * CPP&lt;br /&gt;
   * LD&lt;br /&gt;
   * CCLD&lt;br /&gt;
   * AR&lt;br /&gt;
   * AS&lt;br /&gt;
   * RANLIB&lt;br /&gt;
   * STRIP&lt;br /&gt;
   * OBJCOPY&lt;br /&gt;
   * OBJDUMP&lt;br /&gt;
   * NM&lt;br /&gt;
   * SELECTED_OPTIMIZATION&lt;br /&gt;
      * FULL_OPTIMIZATION&lt;br /&gt;
      * DEBUG_OPTIMIZATION&lt;br /&gt;
&lt;br /&gt;
Each of the above items has a default definition within the meta/conf/bitbake.conf file.  In addition, many of the components are based on specific tune variables such as:&lt;br /&gt;
&lt;br /&gt;
   * TUNE_CCARGS&lt;br /&gt;
   * TUNE_LDARGS&lt;br /&gt;
   * TUNE_ASARGS&lt;br /&gt;
&lt;br /&gt;
Deciding which items need to be overridden is up to the author of the layer.  It is expected that only a subset of the above referenced variables will need secondary toolchain specific versions for most implementations.&lt;br /&gt;
&lt;br /&gt;
It is suggested that the secondary toolchain values be defined in a single configuration file.  Within the example this is &amp;quot;conf/tc-example.conf&amp;quot;.  The standard name for the file should be &#039;conf/tc-&amp;lt;toolchain&amp;gt;.conf&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Override ===&lt;br /&gt;
&lt;br /&gt;
In order to allow for the layer to selectively override the variables listed above, a standard override syntax is needed.&lt;br /&gt;
&lt;br /&gt;
The standard override syntax will be &#039;toolchain-${TOOLCHAIN}&#039;.  This will allow us to specify multiple alternative and primary toolchain combinations as necessary.&lt;br /&gt;
&lt;br /&gt;
Each of the toolchain related variables can then be overridden using the standard override syntax: &amp;lt;var&amp;gt;_toolchain-&amp;lt;toolchain&amp;gt;, such as:&lt;br /&gt;
&lt;br /&gt;
CC_toolchain-icc = &amp;quot;icc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In order for an individual recipe to use the secondary toolchain, the user would define: TOOLCHAIN_pn-&amp;lt;recipe&amp;gt; = &#039;toolchain&#039;, such as:&lt;br /&gt;
&lt;br /&gt;
TOOLCHAIN_pn-bash = &amp;quot;icc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The OVERRIDE is implemented in the tc-secondary.bbclass in the example.&lt;br /&gt;
&lt;br /&gt;
=== Blacklist/Whitelist ===&lt;br /&gt;
&lt;br /&gt;
A standard blacklist/whitelist facility is to be implemented.  This facility is independent of the existing blacklist class that is part of OpenEmbedded-Core.&lt;br /&gt;
&lt;br /&gt;
Similar to the existing blacklist class, you will be able to define a blacklist, per toolchain type, such as:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
or alternatively create a whitelist facility using:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
   TCWHITELIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Using the second approach will allow you to blacklist all recipes, and only enable those known to work with the alternative toolchain.  &lt;br /&gt;
&lt;br /&gt;
The blacklist items should be defined within conf/tc-&amp;lt;toolchain&amp;gt;-blacklist.conf.  The validation of the blacklist should use the standard tc-blacklist.bbclass implementation available within the example.&lt;br /&gt;
&lt;br /&gt;
=== SDK ===&lt;br /&gt;
&lt;br /&gt;
In order to make it easier to use the alternative toolchain within the SDK.  An additional environment-* file should be created.  The purpose of this file is to simply override the settings in the main environment file.&lt;br /&gt;
&lt;br /&gt;
See the example section for an implementation that will create this file automatically.&lt;br /&gt;
&lt;br /&gt;
== Implementation Example ==&lt;br /&gt;
&lt;br /&gt;
An example implementation has been created in the layer &amp;quot;meta-tc-example&amp;quot;.  The file format follows:&lt;br /&gt;
&lt;br /&gt;
meta-tc-example/&lt;br /&gt;
meta-tc-example/bin&lt;br /&gt;
meta-tc-example/bin/example-toolchain&lt;br /&gt;
meta-tc-example/conf&lt;br /&gt;
meta-tc-example/conf/layer.conf&lt;br /&gt;
meta-tc-example/conf/tc-example.conf&lt;br /&gt;
meta-tc-example/conf/tc-example-blacklist.conf&lt;br /&gt;
meta-tc-example/classes&lt;br /&gt;
meta-tc-example/classes/tc-secondary.bbclass&lt;br /&gt;
meta-tc-example/classes/tc-blacklist.bbclass&lt;br /&gt;
&lt;br /&gt;
=== conf/layer.conf ===&lt;br /&gt;
&lt;br /&gt;
   # We have a conf and classes directory, append to BBPATH&lt;br /&gt;
   BBPATH .= &amp;quot;:${LAYERDIR}&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # If we have a recipes directory, add to BBFILES&lt;br /&gt;
   #BBFILES += &amp;quot;${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/*/recipes-*/*/*.bbappend&amp;quot;&lt;br /&gt;
   #BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   #BBFILE_PATTERN_tc-example := &amp;quot;^${LAYERDIR}/&amp;quot;&lt;br /&gt;
   #BBFILE_PRIORITY_tc-example = &amp;quot;5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Above is standard layer configuration.  Note, the commented out sections should be re-enabled if the secondary toolchain includes recipes and/or bbappend files.&lt;br /&gt;
&lt;br /&gt;
   PATH := &amp;quot;${PATH}:${LAYERDIR}/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Add to the path a standard system path, a layer specific path.  This is the way you can add a secondary toolchain to the path.&lt;br /&gt;
&lt;br /&gt;
   # Define the alternative toolchain&lt;br /&gt;
   SECONDARYTC = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   # Enable the secondary toolchain&lt;br /&gt;
   INHERIT += &#039;tc-secondary tc-blacklist&#039;&lt;br /&gt;
&lt;br /&gt;
Define the alternative toolchain name in SECONDARYTC.  The inherit causes the tc-secondary.bbclass and tc-blacklist.bbclass to be loaded later.  Eventually this class used SECONDARYTC to load in the secondary toolchain configuration files.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example.conf ===&lt;br /&gt;
&lt;br /&gt;
   # Define default system toolchain (default to built-in)&lt;br /&gt;
   TOOLCHAIN = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
Define a reasonable default such as gnu.  The purpose of this default is to allow someone to specify the default or provide default override items for the built-in toolchain.&lt;br /&gt;
&lt;br /&gt;
   # Define a secondary toolchain called &#039;example&#039;&lt;br /&gt;
   # the &#039;example&#039; toolchain can be activated using:&lt;br /&gt;
   #&lt;br /&gt;
   # Per package (preferred):&lt;br /&gt;
   #   TOOLCHAIN_pn-bash = &#039;example&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # Globally:&lt;br /&gt;
   #   TOOLCHAIN = &#039;example&#039;&lt;br /&gt;
   #   TOOLCHAIN_pn-eglibc = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
The above is an example of how to use the alternative toolchain.&lt;br /&gt;
&lt;br /&gt;
   # When the secondary toolchain is used, we add an automatic depend...&lt;br /&gt;
   DEPENDS_append_toolchain-example = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # ...the depend can be provided by a recipe or as an ASSUME_PROVIDED&lt;br /&gt;
   ASSUME_PROVIDED_append = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Use the above as an example on how to add additional dependencies to specific packages.  This can be used to trigger a recipe to build.&lt;br /&gt;
&lt;br /&gt;
   # Default values from bitbake.conf...&lt;br /&gt;
   # Variables with a &#039;*&#039; are things likely to need to be overridden:&lt;br /&gt;
   #&lt;br /&gt;
   #   FULL_OPTIMIZATION = &amp;quot;-O2 -pipe ${DEBUG_FLAGS}&amp;quot;&lt;br /&gt;
   #   DEBUG_OPTIMIZATION = &amp;quot;-O -fno-omit-frame-pointer ${DEBUG_FLAGS} -pipe&amp;quot;&lt;br /&gt;
   #   SELECTED_OPTIMIZATION = &amp;quot;${@d.getVar([&#039;FULL_OPTIMIZATION&#039;, &#039;DEBUG_OPTIMIZATION&#039;][d.getVar(&#039;DEBUG_BUILD&#039;, True) == &#039;1&#039;], True)}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   # * TOOLCHAIN_OPTIONS = &amp;quot; --sysroot=${STAGING_DIR_TARGET}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * TARGET_CPPFLAGS = &amp;quot;&amp;quot;&lt;br /&gt;
   # * TARGET_CFLAGS = &amp;quot;${TARGET_CPPFLAGS} ${SELECTED_OPTIMIZATION}&amp;quot;&lt;br /&gt;
   # * TARGET CXXFLAGS = &amp;quot;${TARGET_CFLAGS} -fpermissive&amp;quot;&lt;br /&gt;
   # * TARGET_LDFLAGS = &amp;quot;-Wl,-O1 ${TARGET_LINK_HASH_STYLE}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   TARGET_CC_ARCH = &amp;quot;${TUNE_CCARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_LD_ARCH = &amp;quot;${TUNE_LDARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_AS_ARCH = &amp;quot;${TUNE_ASARGS}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   HOST_CC_ARCH = &amp;quot;${TARGET_CC_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_LD_ARCH = &amp;quot;${TARGET_LD_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_AS_ARCH = &amp;quot;${TARGET_AS_ARCH}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * CC = &amp;quot;${CCACHE}${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CXX = &amp;quot;${CCACHE}${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * F77 = &amp;quot;${CCACHE}${HOST_PREFIX}g77 ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CPP = &amp;quot;${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   # * LD = &amp;quot;${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
   # * CCLD = &amp;quot;${CC}&amp;quot;&lt;br /&gt;
   #   AR = &amp;quot;${HOST_PREFIX}ar&amp;quot;&lt;br /&gt;
   #   AS = &amp;quot;${HOST_PREFIX}as ${HOST_AS_ARCH}&amp;quot;&lt;br /&gt;
   #   RANLIB = &amp;quot;${HOST_PREFIX}ranlib&amp;quot;&lt;br /&gt;
   #   STRIP = &amp;quot;${HOST_PREFIX}strip&amp;quot;&lt;br /&gt;
   #   OBJCOPY = &amp;quot;${HOST_PREFIX}objcopy&amp;quot;&lt;br /&gt;
   #   OBJDUMP = &amp;quot;${HOST_PREFIX}objdump&amp;quot;&lt;br /&gt;
   #   NM = &amp;quot;${HOST_PREFIX}nm&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # Override values:&lt;br /&gt;
   CC_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   CXX_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   CPP_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   LD_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The above implements the necessary overrides for the example toolchain.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example-blacklist.conf ===&lt;br /&gt;
&lt;br /&gt;
Example configuration file that enables the blacklist and defines the defaults.&lt;br /&gt;
&lt;br /&gt;
   # Blacklist certain items...&lt;br /&gt;
   TCBLACKLIST[eglibc] = &#039;example&#039;&lt;br /&gt;
   TCBLACKLIST[bash] = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   #&lt;br /&gt;
   # or&lt;br /&gt;
   #&lt;br /&gt;
   &lt;br /&gt;
   # Switch to a global blacklist and whitelist situation...&lt;br /&gt;
   # TCBLACKLIST = &#039;example&#039;&lt;br /&gt;
   # TCWHITELIST[bash] = &#039;example&#039;&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-secondary.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # In order to add overrides, we need to do it later then in the layers.conf&lt;br /&gt;
   # the only standard way is using an inherit, which requires a bbclass&lt;br /&gt;
   &lt;br /&gt;
   # Add the necessary override&lt;br /&gt;
   TOOLCHAINOVERRIDES = &amp;quot;:toolchain-${TOOLCHAIN}&amp;quot;&lt;br /&gt;
   TOOLCHAINOVERRIDES[vardepsexclude] = &amp;quot;TOOLCHAIN&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   OVERRIDES .= &amp;quot;${TOOLCHAINOVERRIDES}&amp;quot;&lt;br /&gt;
   OVERRIDES[vardepsexclude] += &amp;quot;TOOLCHAINOVERRIDES&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   require conf/tc-${SECONDARYTC}.conf&lt;br /&gt;
&lt;br /&gt;
The above code configures the basic overrides and loads the configuration file.  There is one limitation to the above however.  It will only load one secondary toolchain.  A simple way around this is to rename the inherit and change to using something other then SECONDARYTC.  This likely will not be a problem.&lt;br /&gt;
&lt;br /&gt;
   toolchain_create_sdk_env_script_alt () {&lt;br /&gt;
           set -x&lt;br /&gt;
   &lt;br /&gt;
           # Create environment setup script (secondary toolchain)&lt;br /&gt;
           orig_script=${1:-${SDK_OUTPUT}/${SDKPATH}/environment-setup-${REAL_MULTIMACH_TARGET_SYS}}&lt;br /&gt;
           script=&amp;quot;$orig_script&amp;quot;&amp;quot;-${SECONDARYTC}&amp;quot;&lt;br /&gt;
           rm -f $script&lt;br /&gt;
           touch $script&lt;br /&gt;
           echo &amp;quot;. $orig_script&amp;quot; | sed -e &amp;quot;s:${SDK_OUTPUT}::&amp;quot; &amp;gt;&amp;gt; $script&lt;br /&gt;
           if [ &#039;${CC_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;CC_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CC=&amp;quot;${CC_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CXX_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;CXX_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CXX=&amp;quot;${CXX_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CPP_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;CPP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CPP=&amp;quot;${CPP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${AS_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;AS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export AS=&amp;quot;${AS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${LD_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;LD_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export LD=&amp;quot;${LD_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${RANLIB_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;RANLIB_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export RANLIB=&amp;quot;${RANLIB_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${STRIP_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;STRIP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export STRIP=&amp;quot;${STRIP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${OBJCOPY_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;OBJCOPY_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export OBJCOPY=&amp;quot;${OBJCOPY_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${OBJDUMP_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;OBJDUMP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export OBJDUMP=&amp;quot;${OBJDUMP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${NM_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;NM_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export NM=&amp;quot;${NM_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
   &lt;br /&gt;
           if [ &#039;${CFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;CFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CFLAGS=&amp;quot;${CFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CXXFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;CXXFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CXXFLAGS=&amp;quot;${CXXFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${LDFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;LDFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export LDFLAGS=&amp;quot;${LDFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CPPFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;CPPFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CPPFLAGS=&amp;quot;${CPPFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
   &lt;br /&gt;
           # Fixup any sysroot references&lt;br /&gt;
           sed -i -e &amp;quot;s:${STAGING_DIR_TARGET}:${SDKTARGETSYSROOT}:g&amp;quot; $script&lt;br /&gt;
   &lt;br /&gt;
           # All environment scripts require OECORE_NATIVE_SYSROOT&lt;br /&gt;
           echo &#039;export OECORE_NATIVE_SYSROOT=&amp;quot;${SDKPATHNATIVE}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   populate_sdk_image_append() {&lt;br /&gt;
           toolchain_create_sdk_env_script_alt ${SDK_OUTPUT}/${SDKPATH}/environment-setup-${REAL_MULTIMACH_TARGET_SYS}&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
The above code will add an additional environment-setup-*-&amp;lt;toolchain&amp;gt; file.  This can be used to enable the right environment to use the alternative toolchain.  Note, it does not add anything to the path so the user will still need to configure the path to the alternative toolchain.  (The layer creator can always provide the necessary &#039;nativesdk&#039; or similar package that provides the alternative toolchain as part of the SDK as well.)&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-blacklist.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain blacklist class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # Implement blacklist/whitelist functionality for alternative toolchains&lt;br /&gt;
   # Based on the oe-core blacklist bclass&lt;br /&gt;
   #&lt;br /&gt;
   # To add a blacklisted package:&lt;br /&gt;
   #   TCBLACKLIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # To blacklist everything, and whitelist a package:&lt;br /&gt;
   #   TCBLACKLIST = &#039;toolchain&#039;&lt;br /&gt;
   #   TCWHITELIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   &lt;br /&gt;
   include conf/tc-${SECONDARYTC}-blacklist.conf&lt;br /&gt;
   &lt;br /&gt;
   python () {&lt;br /&gt;
       tc = d.getVar(&#039;TOOLCHAIN&#039;, True)&lt;br /&gt;
       pn = d.getVar(&#039;PN&#039;, True)&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVarFlag(&#039;TCBLACKLIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and blacklist == tc:&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVar(&#039;TCBLACKLIST&#039;, True)&lt;br /&gt;
       whitelist = d.getVarFlag(&#039;TCWHITELIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and (not whitelist or whitelist != tc):&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Further comments and information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Dev]]&lt;br /&gt;
[[Category:Layers]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5353</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5353"/>
		<updated>2012-11-14T22:24:58Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* classes/tc-secondary.bbclass */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
&lt;br /&gt;
In OpenEmbedded-Core there in an included toolchain that is built up of GNU binutils, gcc, and eglibc.  In addition related components such as gdb, cross-prelink, mklibs and others provider additional toolchain functionality.  In this document we focus on explaining best practices for including an additional toolchain that is capable of assembling, compiling and linking code.  This document does not cover replacing the existing toolchain or toolchain components with external elements.&lt;br /&gt;
&lt;br /&gt;
Many companies have commercial / highly optimized toolchains for specific purposes, such as ICC from Intel, LLVM, ARM Ltd toolchains, etc..  In some cases, these highly optimized toolchains may result in better performance for some applications, however they are often not generally applicable as they can not compile all of the system software.  So instead of replacing the included GNU toolchain, a mechanism for providing an alternative/secondary toolchain is desired.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchains should be implemented in a layer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In order to facilitate re-use and make it easier to completely disable the secondary toolchain, a layer must be used to implement the secondary toolchain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchain must be generally compatible with GNU toolchain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The secondary toolchain must be generally compatible with the idea of sysroots, linking to the defined libc, and various GNU conventions.  This compatibility may be implemented directly by the secondary toolchain or via a wrapper of some type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Per recipe selection of toolchain usage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A mechanism is needed to activate this alternative toolchain on a per-recipe basis.  Using variables it should be possible to specify on a per-recipe basis which toolchain should be used, leaving the default up to the user.  (It&#039;s assumed if the user does not select a default, the system GNU toolchain will be defaulted.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blacklist/Whitelist&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even with the requirement to be generally compatible, we can not expect all of the possible recipes to build properly with the secondary toolchain.  As a consequence of this, it will be necessary to implement a blacklist (or whitelist) of specific recipes that are known to work.  This way only supported components can be build by the user, avoid numerous complaints and unresolvable defects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The SDK generated by OpenEmbedded-Core also includes the included toolchain components.  It would be useful to also provide support for the secondary toolchain within the SDK environment.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Bitbake variables ===&lt;br /&gt;
&lt;br /&gt;
A set of common bitbake variables, defined in meta/conf/bitbake.conf, are used to define how to run the toolchain components and the proper arguments.&lt;br /&gt;
&lt;br /&gt;
A number of key items may need to be changed, depending on the toolchain being provided.  These items may include:&lt;br /&gt;
&lt;br /&gt;
   * TARGET_CPPFLAGS&lt;br /&gt;
   * TARGET_CFLAGS&lt;br /&gt;
   * TARGET_CXXFLAGS&lt;br /&gt;
   * TARGET_LDFLAGS&lt;br /&gt;
   * CC&lt;br /&gt;
   * CXX&lt;br /&gt;
   * F77&lt;br /&gt;
   * CPP&lt;br /&gt;
   * LD&lt;br /&gt;
   * CCLD&lt;br /&gt;
   * AR&lt;br /&gt;
   * AS&lt;br /&gt;
   * RANLIB&lt;br /&gt;
   * STRIP&lt;br /&gt;
   * OBJCOPY&lt;br /&gt;
   * OBJDUMP&lt;br /&gt;
   * NM&lt;br /&gt;
   * SELECTED_OPTIMIZATION&lt;br /&gt;
      * FULL_OPTIMIZATION&lt;br /&gt;
      * DEBUG_OPTIMIZATION&lt;br /&gt;
&lt;br /&gt;
Each of the above items has a default definition within the meta/conf/bitbake.conf file.  In addition, many of the components are based on specific tune variables such as:&lt;br /&gt;
&lt;br /&gt;
   * TUNE_CCARGS&lt;br /&gt;
   * TUNE_LDARGS&lt;br /&gt;
   * TUNE_ASARGS&lt;br /&gt;
&lt;br /&gt;
Deciding which items need to be overridden is up to the author of the layer.  It is expected that only a subset of the above referenced variables will need secondary toolchain specific versions for most implementations.&lt;br /&gt;
&lt;br /&gt;
It is suggested that the secondary toolchain values be defined in a single configuration file.  Within the example this is &amp;quot;conf/tc-example.conf&amp;quot;.  The standard name for the file should be &#039;conf/tc-&amp;lt;toolchain&amp;gt;.conf&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Override ===&lt;br /&gt;
&lt;br /&gt;
In order to allow for the layer to selectively override the variables listed above, a standard override syntax is needed.&lt;br /&gt;
&lt;br /&gt;
The standard override syntax will be &#039;toolchain-${TOOLCHAIN}&#039;.  This will allow us to specify multiple alternative and primary toolchain combinations as necessary.&lt;br /&gt;
&lt;br /&gt;
Each of the toolchain related variables can then be overridden using the standard override syntax: &amp;lt;var&amp;gt;_toolchain-&amp;lt;toolchain&amp;gt;, such as:&lt;br /&gt;
&lt;br /&gt;
CC_toolchain-icc = &amp;quot;icc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In order for an individual recipe to use the secondary toolchain, the user would define: TOOLCHAIN_pn-&amp;lt;recipe&amp;gt; = &#039;toolchain&#039;, such as:&lt;br /&gt;
&lt;br /&gt;
TOOLCHAIN_pn-bash = &amp;quot;icc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The OVERRIDE is implemented in the tc-secondary.bbclass in the example.&lt;br /&gt;
&lt;br /&gt;
=== Blacklist/Whitelist ===&lt;br /&gt;
&lt;br /&gt;
A standard blacklist/whitelist facility is to be implemented.  This facility is independent of the existing blacklist class that is part of OpenEmbedded-Core.&lt;br /&gt;
&lt;br /&gt;
Similar to the existing blacklist class, you will be able to define a blacklist, per toolchain type, such as:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
or alternatively create a whitelist facility using:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
   TCWHITELIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Using the second approach will allow you to blacklist all recipes, and only enable those known to work with the alternative toolchain.  &lt;br /&gt;
&lt;br /&gt;
The blacklist items should be defined within conf/tc-&amp;lt;toolchain&amp;gt;-blacklist.conf.  The validation of the blacklist should use the standard tc-blacklist.bbclass implementation available within the example.&lt;br /&gt;
&lt;br /&gt;
=== SDK ===&lt;br /&gt;
&lt;br /&gt;
In order to make it easier to use the alternative toolchain within the SDK.  An additional environment-* file should be created.  The purpose of this file is to simply override the settings in the main environment file.&lt;br /&gt;
&lt;br /&gt;
See the example section for an implementation that will create this file automatically.&lt;br /&gt;
&lt;br /&gt;
== Implementation Example ==&lt;br /&gt;
&lt;br /&gt;
An example implementation has been created in the layer &amp;quot;meta-tc-example&amp;quot;.  The file format follows:&lt;br /&gt;
&lt;br /&gt;
meta-tc-example/&lt;br /&gt;
meta-tc-example/bin&lt;br /&gt;
meta-tc-example/bin/example-toolchain&lt;br /&gt;
meta-tc-example/conf&lt;br /&gt;
meta-tc-example/conf/layer.conf&lt;br /&gt;
meta-tc-example/conf/tc-example.conf&lt;br /&gt;
meta-tc-example/conf/tc-example-blacklist.conf&lt;br /&gt;
meta-tc-example/classes&lt;br /&gt;
meta-tc-example/classes/tc-secondary.bbclass&lt;br /&gt;
meta-tc-example/classes/tc-blacklist.bbclass&lt;br /&gt;
&lt;br /&gt;
=== conf/layer.conf ===&lt;br /&gt;
&lt;br /&gt;
   # We have a conf and classes directory, append to BBPATH&lt;br /&gt;
   BBPATH .= &amp;quot;:${LAYERDIR}&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # If we have a recipes directory, add to BBFILES&lt;br /&gt;
   #BBFILES += &amp;quot;${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/*/recipes-*/*/*.bbappend&amp;quot;&lt;br /&gt;
   #BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   #BBFILE_PATTERN_tc-example := &amp;quot;^${LAYERDIR}/&amp;quot;&lt;br /&gt;
   #BBFILE_PRIORITY_tc-example = &amp;quot;5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Above is standard layer configuration.  Note, the commented out sections should be re-enabled if the secondary toolchain includes recipes and/or bbappend files.&lt;br /&gt;
&lt;br /&gt;
   PATH := &amp;quot;${PATH}:${LAYERDIR}/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Add to the path a standard system path, a layer specific path.  This is the way you can add a secondary toolchain to the path.&lt;br /&gt;
&lt;br /&gt;
   # Define the alternative toolchain&lt;br /&gt;
   SECONDARYTC = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   # Enable the secondary toolchain&lt;br /&gt;
   INHERIT += &#039;tc-secondary tc-blacklist&#039;&lt;br /&gt;
&lt;br /&gt;
Define the alternative toolchain name in SECONDARYTC.  The inherit causes the tc-secondary.bbclass and tc-blacklist.bbclass to be loaded later.  Eventually this class used SECONDARYTC to load in the secondary toolchain configuration files.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example.conf ===&lt;br /&gt;
&lt;br /&gt;
   # Define default system toolchain (default to built-in)&lt;br /&gt;
   TOOLCHAIN = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
Define a reasonable default such as gnu.  The purpose of this default is to allow someone to specify the default or provide default override items for the built-in toolchain.&lt;br /&gt;
&lt;br /&gt;
   # Define a secondary toolchain called &#039;example&#039;&lt;br /&gt;
   # the &#039;example&#039; toolchain can be activated using:&lt;br /&gt;
   #&lt;br /&gt;
   # Per package (preferred):&lt;br /&gt;
   #   TOOLCHAIN_pn-bash = &#039;example&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # Globally:&lt;br /&gt;
   #   TOOLCHAIN = &#039;example&#039;&lt;br /&gt;
   #   TOOLCHAIN_pn-eglibc = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
The above is an example of how to use the alternative toolchain.&lt;br /&gt;
&lt;br /&gt;
   # When the secondary toolchain is used, we add an automatic depend...&lt;br /&gt;
   DEPENDS_append_toolchain-example = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # ...the depend can be provided by a recipe or as an ASSUME_PROVIDED&lt;br /&gt;
   ASSUME_PROVIDED_append = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Use the above as an example on how to add additional dependencies to specific packages.  This can be used to trigger a recipe to build.&lt;br /&gt;
&lt;br /&gt;
   # Default values from bitbake.conf...&lt;br /&gt;
   # Variables with a &#039;*&#039; are things likely to need to be overridden:&lt;br /&gt;
   #&lt;br /&gt;
   #   FULL_OPTIMIZATION = &amp;quot;-O2 -pipe ${DEBUG_FLAGS}&amp;quot;&lt;br /&gt;
   #   DEBUG_OPTIMIZATION = &amp;quot;-O -fno-omit-frame-pointer ${DEBUG_FLAGS} -pipe&amp;quot;&lt;br /&gt;
   #   SELECTED_OPTIMIZATION = &amp;quot;${@d.getVar([&#039;FULL_OPTIMIZATION&#039;, &#039;DEBUG_OPTIMIZATION&#039;][d.getVar(&#039;DEBUG_BUILD&#039;, True) == &#039;1&#039;], True)}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   # * TOOLCHAIN_OPTIONS = &amp;quot; --sysroot=${STAGING_DIR_TARGET}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * TARGET_CPPFLAGS = &amp;quot;&amp;quot;&lt;br /&gt;
   # * TARGET_CFLAGS = &amp;quot;${TARGET_CPPFLAGS} ${SELECTED_OPTIMIZATION}&amp;quot;&lt;br /&gt;
   # * TARGET CXXFLAGS = &amp;quot;${TARGET_CFLAGS} -fpermissive&amp;quot;&lt;br /&gt;
   # * TARGET_LDFLAGS = &amp;quot;-Wl,-O1 ${TARGET_LINK_HASH_STYLE}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   TARGET_CC_ARCH = &amp;quot;${TUNE_CCARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_LD_ARCH = &amp;quot;${TUNE_LDARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_AS_ARCH = &amp;quot;${TUNE_ASARGS}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   HOST_CC_ARCH = &amp;quot;${TARGET_CC_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_LD_ARCH = &amp;quot;${TARGET_LD_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_AS_ARCH = &amp;quot;${TARGET_AS_ARCH}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * CC = &amp;quot;${CCACHE}${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CXX = &amp;quot;${CCACHE}${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * F77 = &amp;quot;${CCACHE}${HOST_PREFIX}g77 ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CPP = &amp;quot;${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   # * LD = &amp;quot;${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
   # * CCLD = &amp;quot;${CC}&amp;quot;&lt;br /&gt;
   #   AR = &amp;quot;${HOST_PREFIX}ar&amp;quot;&lt;br /&gt;
   #   AS = &amp;quot;${HOST_PREFIX}as ${HOST_AS_ARCH}&amp;quot;&lt;br /&gt;
   #   RANLIB = &amp;quot;${HOST_PREFIX}ranlib&amp;quot;&lt;br /&gt;
   #   STRIP = &amp;quot;${HOST_PREFIX}strip&amp;quot;&lt;br /&gt;
   #   OBJCOPY = &amp;quot;${HOST_PREFIX}objcopy&amp;quot;&lt;br /&gt;
   #   OBJDUMP = &amp;quot;${HOST_PREFIX}objdump&amp;quot;&lt;br /&gt;
   #   NM = &amp;quot;${HOST_PREFIX}nm&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # Override values:&lt;br /&gt;
   CC_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   CXX_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   CPP_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   LD_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The above implements the necessary overrides for the example toolchain.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example-blacklist.conf ===&lt;br /&gt;
&lt;br /&gt;
Example configuration file that enables the blacklist and defines the defaults.&lt;br /&gt;
&lt;br /&gt;
   # Blacklist certain items...&lt;br /&gt;
   TCBLACKLIST[eglibc] = &#039;example&#039;&lt;br /&gt;
   TCBLACKLIST[bash] = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   #&lt;br /&gt;
   # or&lt;br /&gt;
   #&lt;br /&gt;
   &lt;br /&gt;
   # Switch to a global blacklist and whitelist situation...&lt;br /&gt;
   # TCBLACKLIST = &#039;example&#039;&lt;br /&gt;
   # TCWHITELIST[bash] = &#039;example&#039;&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-secondary.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # In order to add overrides, we need to do it later then in the layers.conf&lt;br /&gt;
   # the only standard way is using an inherit, which requires a bbclass&lt;br /&gt;
   &lt;br /&gt;
   # Add the necessary override&lt;br /&gt;
   TOOLCHAINOVERRIDES = &amp;quot;:toolchain-${TOOLCHAIN}&amp;quot;&lt;br /&gt;
   TOOLCHAINOVERRIDES[vardepsexclude] = &amp;quot;TOOLCHAIN&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   OVERRIDES .= &amp;quot;${TOOLCHAINOVERRIDES}&amp;quot;&lt;br /&gt;
   OVERRIDES[vardepsexclude] += &amp;quot;TOOLCHAINOVERRIDES&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   require conf/tc-${SECONDARYTC}.conf&lt;br /&gt;
&lt;br /&gt;
The above code configures the basic overrides and loads the configuration file.  There is one limitation to the above however.  It will only load one secondary toolchain.  A simple way around this is to rename the inherit and change to using something other then SECONDARYTC.  This likely will not be a problem.&lt;br /&gt;
&lt;br /&gt;
   toolchain_create_sdk_env_script_alt () {&lt;br /&gt;
           set -x&lt;br /&gt;
   &lt;br /&gt;
           # Create environment setup script (secondary toolchain)&lt;br /&gt;
           orig_script=${1:-${SDK_OUTPUT}/${SDKPATH}/environment-setup-${REAL_MULTIMACH_TARGET_SYS}}&lt;br /&gt;
           script=&amp;quot;$orig_script&amp;quot;&amp;quot;-${SECONDARYTC}&amp;quot;&lt;br /&gt;
           rm -f $script&lt;br /&gt;
           touch $script&lt;br /&gt;
           echo &amp;quot;. $orig_script&amp;quot; | sed -e &amp;quot;s:${SDK_OUTPUT}::&amp;quot; &amp;gt;&amp;gt; $script&lt;br /&gt;
           if [ &#039;${CC_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;CC_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CC=&amp;quot;${CC_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CXX_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;CXX_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CXX=&amp;quot;${CXX_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CPP_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;CPP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CPP=&amp;quot;${CPP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${AS_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;AS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export AS=&amp;quot;${AS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${LD_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;LD_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export LD=&amp;quot;${LD_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${RANLIB_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;RANLIB_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export RANLIB=&amp;quot;${RANLIB_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${STRIP_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;STRIP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export STRIP=&amp;quot;${STRIP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${OBJCOPY_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;OBJCOPY_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export OBJCOPY=&amp;quot;${OBJCOPY_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${OBJDUMP_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;OBJDUMP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export OBJDUMP=&amp;quot;${OBJDUMP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${NM_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;NM_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export NM=&amp;quot;${NM_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
&lt;br /&gt;
           if [ &#039;${CFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;CFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CFLAGS=&amp;quot;${CFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CXXFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;CXXFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CXXFLAGS=&amp;quot;${CXXFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${LDFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;LDFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export LDFLAGS=&amp;quot;${LDFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CPPFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;CPPFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CPPFLAGS=&amp;quot;${CPPFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
   &lt;br /&gt;
           # Fixup any sysroot references&lt;br /&gt;
           sed -i -e &amp;quot;s:${STAGING_DIR_TARGET}:${SDKTARGETSYSROOT}:g&amp;quot; $script&lt;br /&gt;
   &lt;br /&gt;
           # All environment scripts require OECORE_NATIVE_SYSROOT&lt;br /&gt;
           echo &#039;export OECORE_NATIVE_SYSROOT=&amp;quot;${SDKPATHNATIVE}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   populate_sdk_image_append() {&lt;br /&gt;
           toolchain_create_sdk_env_script_alt ${SDK_OUTPUT}/${SDKPATH}/environment-setup-${REAL_MULTIMACH_TARGET_SYS}&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
The above code will add an additional environment-setup-*-&amp;lt;toolchain&amp;gt; file.  This can be used to enable the right environment to use the alternative toolchain.  Note, it does not add anything to the path so the user will still need to configure the path to the alternative toolchain.  (The layer creator can always provide the necessary &#039;nativesdk&#039; or similar package that provides the alternative toolchain as part of the SDK as well.)&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-blacklist.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain blacklist class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # Implement blacklist/whitelist functionality for alternative toolchains&lt;br /&gt;
   # Based on the oe-core blacklist bclass&lt;br /&gt;
   #&lt;br /&gt;
   # To add a blacklisted package:&lt;br /&gt;
   #   TCBLACKLIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # To blacklist everything, and whitelist a package:&lt;br /&gt;
   #   TCBLACKLIST = &#039;toolchain&#039;&lt;br /&gt;
   #   TCWHITELIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   &lt;br /&gt;
   include conf/tc-${SECONDARYTC}-blacklist.conf&lt;br /&gt;
   &lt;br /&gt;
   python () {&lt;br /&gt;
       tc = d.getVar(&#039;TOOLCHAIN&#039;, True)&lt;br /&gt;
       pn = d.getVar(&#039;PN&#039;, True)&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVarFlag(&#039;TCBLACKLIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and blacklist == tc:&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVar(&#039;TCBLACKLIST&#039;, True)&lt;br /&gt;
       whitelist = d.getVarFlag(&#039;TCWHITELIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and (not whitelist or whitelist != tc):&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Further comments and information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Dev]]&lt;br /&gt;
[[Category:Layers]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5351</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5351"/>
		<updated>2012-11-14T22:24:15Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* classes/tc-secondary.bbclass */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
&lt;br /&gt;
In OpenEmbedded-Core there in an included toolchain that is built up of GNU binutils, gcc, and eglibc.  In addition related components such as gdb, cross-prelink, mklibs and others provider additional toolchain functionality.  In this document we focus on explaining best practices for including an additional toolchain that is capable of assembling, compiling and linking code.  This document does not cover replacing the existing toolchain or toolchain components with external elements.&lt;br /&gt;
&lt;br /&gt;
Many companies have commercial / highly optimized toolchains for specific purposes, such as ICC from Intel, LLVM, ARM Ltd toolchains, etc..  In some cases, these highly optimized toolchains may result in better performance for some applications, however they are often not generally applicable as they can not compile all of the system software.  So instead of replacing the included GNU toolchain, a mechanism for providing an alternative/secondary toolchain is desired.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchains should be implemented in a layer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In order to facilitate re-use and make it easier to completely disable the secondary toolchain, a layer must be used to implement the secondary toolchain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchain must be generally compatible with GNU toolchain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The secondary toolchain must be generally compatible with the idea of sysroots, linking to the defined libc, and various GNU conventions.  This compatibility may be implemented directly by the secondary toolchain or via a wrapper of some type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Per recipe selection of toolchain usage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A mechanism is needed to activate this alternative toolchain on a per-recipe basis.  Using variables it should be possible to specify on a per-recipe basis which toolchain should be used, leaving the default up to the user.  (It&#039;s assumed if the user does not select a default, the system GNU toolchain will be defaulted.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blacklist/Whitelist&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even with the requirement to be generally compatible, we can not expect all of the possible recipes to build properly with the secondary toolchain.  As a consequence of this, it will be necessary to implement a blacklist (or whitelist) of specific recipes that are known to work.  This way only supported components can be build by the user, avoid numerous complaints and unresolvable defects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The SDK generated by OpenEmbedded-Core also includes the included toolchain components.  It would be useful to also provide support for the secondary toolchain within the SDK environment.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Bitbake variables ===&lt;br /&gt;
&lt;br /&gt;
A set of common bitbake variables, defined in meta/conf/bitbake.conf, are used to define how to run the toolchain components and the proper arguments.&lt;br /&gt;
&lt;br /&gt;
A number of key items may need to be changed, depending on the toolchain being provided.  These items may include:&lt;br /&gt;
&lt;br /&gt;
   * TARGET_CPPFLAGS&lt;br /&gt;
   * TARGET_CFLAGS&lt;br /&gt;
   * TARGET_CXXFLAGS&lt;br /&gt;
   * TARGET_LDFLAGS&lt;br /&gt;
   * CC&lt;br /&gt;
   * CXX&lt;br /&gt;
   * F77&lt;br /&gt;
   * CPP&lt;br /&gt;
   * LD&lt;br /&gt;
   * CCLD&lt;br /&gt;
   * AR&lt;br /&gt;
   * AS&lt;br /&gt;
   * RANLIB&lt;br /&gt;
   * STRIP&lt;br /&gt;
   * OBJCOPY&lt;br /&gt;
   * OBJDUMP&lt;br /&gt;
   * NM&lt;br /&gt;
   * SELECTED_OPTIMIZATION&lt;br /&gt;
      * FULL_OPTIMIZATION&lt;br /&gt;
      * DEBUG_OPTIMIZATION&lt;br /&gt;
&lt;br /&gt;
Each of the above items has a default definition within the meta/conf/bitbake.conf file.  In addition, many of the components are based on specific tune variables such as:&lt;br /&gt;
&lt;br /&gt;
   * TUNE_CCARGS&lt;br /&gt;
   * TUNE_LDARGS&lt;br /&gt;
   * TUNE_ASARGS&lt;br /&gt;
&lt;br /&gt;
Deciding which items need to be overridden is up to the author of the layer.  It is expected that only a subset of the above referenced variables will need secondary toolchain specific versions for most implementations.&lt;br /&gt;
&lt;br /&gt;
It is suggested that the secondary toolchain values be defined in a single configuration file.  Within the example this is &amp;quot;conf/tc-example.conf&amp;quot;.  The standard name for the file should be &#039;conf/tc-&amp;lt;toolchain&amp;gt;.conf&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Override ===&lt;br /&gt;
&lt;br /&gt;
In order to allow for the layer to selectively override the variables listed above, a standard override syntax is needed.&lt;br /&gt;
&lt;br /&gt;
The standard override syntax will be &#039;toolchain-${TOOLCHAIN}&#039;.  This will allow us to specify multiple alternative and primary toolchain combinations as necessary.&lt;br /&gt;
&lt;br /&gt;
Each of the toolchain related variables can then be overridden using the standard override syntax: &amp;lt;var&amp;gt;_toolchain-&amp;lt;toolchain&amp;gt;, such as:&lt;br /&gt;
&lt;br /&gt;
CC_toolchain-icc = &amp;quot;icc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In order for an individual recipe to use the secondary toolchain, the user would define: TOOLCHAIN_pn-&amp;lt;recipe&amp;gt; = &#039;toolchain&#039;, such as:&lt;br /&gt;
&lt;br /&gt;
TOOLCHAIN_pn-bash = &amp;quot;icc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The OVERRIDE is implemented in the tc-secondary.bbclass in the example.&lt;br /&gt;
&lt;br /&gt;
=== Blacklist/Whitelist ===&lt;br /&gt;
&lt;br /&gt;
A standard blacklist/whitelist facility is to be implemented.  This facility is independent of the existing blacklist class that is part of OpenEmbedded-Core.&lt;br /&gt;
&lt;br /&gt;
Similar to the existing blacklist class, you will be able to define a blacklist, per toolchain type, such as:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
or alternatively create a whitelist facility using:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
   TCWHITELIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Using the second approach will allow you to blacklist all recipes, and only enable those known to work with the alternative toolchain.  &lt;br /&gt;
&lt;br /&gt;
The blacklist items should be defined within conf/tc-&amp;lt;toolchain&amp;gt;-blacklist.conf.  The validation of the blacklist should use the standard tc-blacklist.bbclass implementation available within the example.&lt;br /&gt;
&lt;br /&gt;
=== SDK ===&lt;br /&gt;
&lt;br /&gt;
In order to make it easier to use the alternative toolchain within the SDK.  An additional environment-* file should be created.  The purpose of this file is to simply override the settings in the main environment file.&lt;br /&gt;
&lt;br /&gt;
See the example section for an implementation that will create this file automatically.&lt;br /&gt;
&lt;br /&gt;
== Implementation Example ==&lt;br /&gt;
&lt;br /&gt;
An example implementation has been created in the layer &amp;quot;meta-tc-example&amp;quot;.  The file format follows:&lt;br /&gt;
&lt;br /&gt;
meta-tc-example/&lt;br /&gt;
meta-tc-example/bin&lt;br /&gt;
meta-tc-example/bin/example-toolchain&lt;br /&gt;
meta-tc-example/conf&lt;br /&gt;
meta-tc-example/conf/layer.conf&lt;br /&gt;
meta-tc-example/conf/tc-example.conf&lt;br /&gt;
meta-tc-example/conf/tc-example-blacklist.conf&lt;br /&gt;
meta-tc-example/classes&lt;br /&gt;
meta-tc-example/classes/tc-secondary.bbclass&lt;br /&gt;
meta-tc-example/classes/tc-blacklist.bbclass&lt;br /&gt;
&lt;br /&gt;
=== conf/layer.conf ===&lt;br /&gt;
&lt;br /&gt;
   # We have a conf and classes directory, append to BBPATH&lt;br /&gt;
   BBPATH .= &amp;quot;:${LAYERDIR}&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # If we have a recipes directory, add to BBFILES&lt;br /&gt;
   #BBFILES += &amp;quot;${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/*/recipes-*/*/*.bbappend&amp;quot;&lt;br /&gt;
   #BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   #BBFILE_PATTERN_tc-example := &amp;quot;^${LAYERDIR}/&amp;quot;&lt;br /&gt;
   #BBFILE_PRIORITY_tc-example = &amp;quot;5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Above is standard layer configuration.  Note, the commented out sections should be re-enabled if the secondary toolchain includes recipes and/or bbappend files.&lt;br /&gt;
&lt;br /&gt;
   PATH := &amp;quot;${PATH}:${LAYERDIR}/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Add to the path a standard system path, a layer specific path.  This is the way you can add a secondary toolchain to the path.&lt;br /&gt;
&lt;br /&gt;
   # Define the alternative toolchain&lt;br /&gt;
   SECONDARYTC = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   # Enable the secondary toolchain&lt;br /&gt;
   INHERIT += &#039;tc-secondary tc-blacklist&#039;&lt;br /&gt;
&lt;br /&gt;
Define the alternative toolchain name in SECONDARYTC.  The inherit causes the tc-secondary.bbclass and tc-blacklist.bbclass to be loaded later.  Eventually this class used SECONDARYTC to load in the secondary toolchain configuration files.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example.conf ===&lt;br /&gt;
&lt;br /&gt;
   # Define default system toolchain (default to built-in)&lt;br /&gt;
   TOOLCHAIN = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
Define a reasonable default such as gnu.  The purpose of this default is to allow someone to specify the default or provide default override items for the built-in toolchain.&lt;br /&gt;
&lt;br /&gt;
   # Define a secondary toolchain called &#039;example&#039;&lt;br /&gt;
   # the &#039;example&#039; toolchain can be activated using:&lt;br /&gt;
   #&lt;br /&gt;
   # Per package (preferred):&lt;br /&gt;
   #   TOOLCHAIN_pn-bash = &#039;example&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # Globally:&lt;br /&gt;
   #   TOOLCHAIN = &#039;example&#039;&lt;br /&gt;
   #   TOOLCHAIN_pn-eglibc = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
The above is an example of how to use the alternative toolchain.&lt;br /&gt;
&lt;br /&gt;
   # When the secondary toolchain is used, we add an automatic depend...&lt;br /&gt;
   DEPENDS_append_toolchain-example = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # ...the depend can be provided by a recipe or as an ASSUME_PROVIDED&lt;br /&gt;
   ASSUME_PROVIDED_append = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Use the above as an example on how to add additional dependencies to specific packages.  This can be used to trigger a recipe to build.&lt;br /&gt;
&lt;br /&gt;
   # Default values from bitbake.conf...&lt;br /&gt;
   # Variables with a &#039;*&#039; are things likely to need to be overridden:&lt;br /&gt;
   #&lt;br /&gt;
   #   FULL_OPTIMIZATION = &amp;quot;-O2 -pipe ${DEBUG_FLAGS}&amp;quot;&lt;br /&gt;
   #   DEBUG_OPTIMIZATION = &amp;quot;-O -fno-omit-frame-pointer ${DEBUG_FLAGS} -pipe&amp;quot;&lt;br /&gt;
   #   SELECTED_OPTIMIZATION = &amp;quot;${@d.getVar([&#039;FULL_OPTIMIZATION&#039;, &#039;DEBUG_OPTIMIZATION&#039;][d.getVar(&#039;DEBUG_BUILD&#039;, True) == &#039;1&#039;], True)}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   # * TOOLCHAIN_OPTIONS = &amp;quot; --sysroot=${STAGING_DIR_TARGET}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * TARGET_CPPFLAGS = &amp;quot;&amp;quot;&lt;br /&gt;
   # * TARGET_CFLAGS = &amp;quot;${TARGET_CPPFLAGS} ${SELECTED_OPTIMIZATION}&amp;quot;&lt;br /&gt;
   # * TARGET CXXFLAGS = &amp;quot;${TARGET_CFLAGS} -fpermissive&amp;quot;&lt;br /&gt;
   # * TARGET_LDFLAGS = &amp;quot;-Wl,-O1 ${TARGET_LINK_HASH_STYLE}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   TARGET_CC_ARCH = &amp;quot;${TUNE_CCARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_LD_ARCH = &amp;quot;${TUNE_LDARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_AS_ARCH = &amp;quot;${TUNE_ASARGS}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   HOST_CC_ARCH = &amp;quot;${TARGET_CC_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_LD_ARCH = &amp;quot;${TARGET_LD_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_AS_ARCH = &amp;quot;${TARGET_AS_ARCH}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * CC = &amp;quot;${CCACHE}${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CXX = &amp;quot;${CCACHE}${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * F77 = &amp;quot;${CCACHE}${HOST_PREFIX}g77 ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CPP = &amp;quot;${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   # * LD = &amp;quot;${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
   # * CCLD = &amp;quot;${CC}&amp;quot;&lt;br /&gt;
   #   AR = &amp;quot;${HOST_PREFIX}ar&amp;quot;&lt;br /&gt;
   #   AS = &amp;quot;${HOST_PREFIX}as ${HOST_AS_ARCH}&amp;quot;&lt;br /&gt;
   #   RANLIB = &amp;quot;${HOST_PREFIX}ranlib&amp;quot;&lt;br /&gt;
   #   STRIP = &amp;quot;${HOST_PREFIX}strip&amp;quot;&lt;br /&gt;
   #   OBJCOPY = &amp;quot;${HOST_PREFIX}objcopy&amp;quot;&lt;br /&gt;
   #   OBJDUMP = &amp;quot;${HOST_PREFIX}objdump&amp;quot;&lt;br /&gt;
   #   NM = &amp;quot;${HOST_PREFIX}nm&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # Override values:&lt;br /&gt;
   CC_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   CXX_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   CPP_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   LD_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The above implements the necessary overrides for the example toolchain.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example-blacklist.conf ===&lt;br /&gt;
&lt;br /&gt;
Example configuration file that enables the blacklist and defines the defaults.&lt;br /&gt;
&lt;br /&gt;
   # Blacklist certain items...&lt;br /&gt;
   TCBLACKLIST[eglibc] = &#039;example&#039;&lt;br /&gt;
   TCBLACKLIST[bash] = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   #&lt;br /&gt;
   # or&lt;br /&gt;
   #&lt;br /&gt;
   &lt;br /&gt;
   # Switch to a global blacklist and whitelist situation...&lt;br /&gt;
   # TCBLACKLIST = &#039;example&#039;&lt;br /&gt;
   # TCWHITELIST[bash] = &#039;example&#039;&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-secondary.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # In order to add overrides, we need to do it later then in the layers.conf&lt;br /&gt;
   # the only standard way is using an inherit, which requires a bbclass&lt;br /&gt;
   &lt;br /&gt;
   # Add the necessary override&lt;br /&gt;
   TOOLCHAINOVERRIDES = &amp;quot;:toolchain-${TOOLCHAIN}&amp;quot;&lt;br /&gt;
   TOOLCHAINOVERRIDES[vardepsexclude] = &amp;quot;TOOLCHAIN&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   OVERRIDES .= &amp;quot;${TOOLCHAINOVERRIDES}&amp;quot;&lt;br /&gt;
   OVERRIDES[vardepsexclude] += &amp;quot;TOOLCHAINOVERRIDES&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   require conf/tc-${SECONDARYTC}.conf&lt;br /&gt;
&lt;br /&gt;
The above code configures the basic overrides and loads the configuration file.  There is one limitation to the above however.  It will only load one secondary toolchain.  A simple way around this is to rename the inherit and change to using something other then SECONDARYTC.  This likely will not be a problem.&lt;br /&gt;
&lt;br /&gt;
   toolchain_create_sdk_env_script_alt () {&lt;br /&gt;
           set -x&lt;br /&gt;
   &lt;br /&gt;
           # Create environment setup script (secondary toolchain)&lt;br /&gt;
           orig_script=${1:-${SDK_OUTPUT}/${SDKPATH}/environment-setup-${REAL_MULTIMACH_TARGET_SYS}}&lt;br /&gt;
           script=&amp;quot;$orig_script&amp;quot;&amp;quot;-${SECONDARYTC}&amp;quot;&lt;br /&gt;
           rm -f $script&lt;br /&gt;
           touch $script&lt;br /&gt;
           echo &amp;quot;. $orig_script&amp;quot; | sed -e &amp;quot;s:${SDK_OUTPUT}::&amp;quot; &amp;gt;&amp;gt; $script&lt;br /&gt;
           if [ &#039;${CC_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;CC_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CC=&amp;quot;${CC_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CXX_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;CXX_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CXX=&amp;quot;${CXX_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CPP_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;CPP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CPP=&amp;quot;${CPP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${AS_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;AS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export AS=&amp;quot;${AS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${LD_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;LD_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export LD=&amp;quot;${LD_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${RANLIB_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;RANLIB_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export RANLIB=&amp;quot;${RANLIB_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${STRIP_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;STRIP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export STRIP=&amp;quot;${STRIP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${OBJCOPY_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;OBJCOPY_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export OBJCOPY=&amp;quot;${OBJCOPY_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${OBJDUMP_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;OBJDUMP_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export OBJDUMP=&amp;quot;${OBJDUMP_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${NM_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;NM_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export NM=&amp;quot;${NM_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
&lt;br /&gt;
           if [ &#039;${CFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;CFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CFLAGS=&amp;quot;${CFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CXXFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;CXXFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CXXFLAGS=&amp;quot;${CXXFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${LDFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;LDFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export LDFLAGS=&amp;quot;${LDFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
           if [ &#039;${CPPFLAGS_toolchain-${SECONDARYTC}}&#039; != &#039;${&#039;&#039;CPPFLAGS_toolchain-${SECONDARYTC}}&#039; ]; then&lt;br /&gt;
              echo &#039;export CPPFLAGS=&amp;quot;${CPPFLAGS_toolchain-${SECONDARYTC}}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
           fi&lt;br /&gt;
&lt;br /&gt;
           # Fixup any sysroot references&lt;br /&gt;
           sed -i -e &amp;quot;s:${STAGING_DIR_TARGET}:${SDKTARGETSYSROOT}:g&amp;quot; $script&lt;br /&gt;
&lt;br /&gt;
           # All environment scripts require OECORE_NATIVE_SYSROOT&lt;br /&gt;
           echo &#039;export OECORE_NATIVE_SYSROOT=&amp;quot;${SDKPATHNATIVE}&amp;quot;&#039; &amp;gt;&amp;gt; $script&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   populate_sdk_image_append() {&lt;br /&gt;
           toolchain_create_sdk_env_script_alt ${SDK_OUTPUT}/${SDKPATH}/environment-setup-${REAL_MULTIMACH_TARGET_SYS}&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
The above code will add an additional environment-setup-*-&amp;lt;toolchain&amp;gt; file.  This can be used to enable the right environment to use the alternative toolchain.  Note, it does not add anything to the path so the user will still need to configure the path to the alternative toolchain.  (The layer creator can always provide the necessary &#039;nativesdk&#039; or similar package that provides the alternative toolchain as part of the SDK as well.)&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-blacklist.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain blacklist class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # Implement blacklist/whitelist functionality for alternative toolchains&lt;br /&gt;
   # Based on the oe-core blacklist bclass&lt;br /&gt;
   #&lt;br /&gt;
   # To add a blacklisted package:&lt;br /&gt;
   #   TCBLACKLIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # To blacklist everything, and whitelist a package:&lt;br /&gt;
   #   TCBLACKLIST = &#039;toolchain&#039;&lt;br /&gt;
   #   TCWHITELIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   &lt;br /&gt;
   include conf/tc-${SECONDARYTC}-blacklist.conf&lt;br /&gt;
   &lt;br /&gt;
   python () {&lt;br /&gt;
       tc = d.getVar(&#039;TOOLCHAIN&#039;, True)&lt;br /&gt;
       pn = d.getVar(&#039;PN&#039;, True)&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVarFlag(&#039;TCBLACKLIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and blacklist == tc:&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVar(&#039;TCBLACKLIST&#039;, True)&lt;br /&gt;
       whitelist = d.getVarFlag(&#039;TCWHITELIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and (not whitelist or whitelist != tc):&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Further comments and information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Dev]]&lt;br /&gt;
[[Category:Layers]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5349</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5349"/>
		<updated>2012-11-14T22:19:17Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* SDK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
&lt;br /&gt;
In OpenEmbedded-Core there in an included toolchain that is built up of GNU binutils, gcc, and eglibc.  In addition related components such as gdb, cross-prelink, mklibs and others provider additional toolchain functionality.  In this document we focus on explaining best practices for including an additional toolchain that is capable of assembling, compiling and linking code.  This document does not cover replacing the existing toolchain or toolchain components with external elements.&lt;br /&gt;
&lt;br /&gt;
Many companies have commercial / highly optimized toolchains for specific purposes, such as ICC from Intel, LLVM, ARM Ltd toolchains, etc..  In some cases, these highly optimized toolchains may result in better performance for some applications, however they are often not generally applicable as they can not compile all of the system software.  So instead of replacing the included GNU toolchain, a mechanism for providing an alternative/secondary toolchain is desired.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchains should be implemented in a layer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In order to facilitate re-use and make it easier to completely disable the secondary toolchain, a layer must be used to implement the secondary toolchain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchain must be generally compatible with GNU toolchain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The secondary toolchain must be generally compatible with the idea of sysroots, linking to the defined libc, and various GNU conventions.  This compatibility may be implemented directly by the secondary toolchain or via a wrapper of some type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Per recipe selection of toolchain usage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A mechanism is needed to activate this alternative toolchain on a per-recipe basis.  Using variables it should be possible to specify on a per-recipe basis which toolchain should be used, leaving the default up to the user.  (It&#039;s assumed if the user does not select a default, the system GNU toolchain will be defaulted.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blacklist/Whitelist&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even with the requirement to be generally compatible, we can not expect all of the possible recipes to build properly with the secondary toolchain.  As a consequence of this, it will be necessary to implement a blacklist (or whitelist) of specific recipes that are known to work.  This way only supported components can be build by the user, avoid numerous complaints and unresolvable defects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The SDK generated by OpenEmbedded-Core also includes the included toolchain components.  It would be useful to also provide support for the secondary toolchain within the SDK environment.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Bitbake variables ===&lt;br /&gt;
&lt;br /&gt;
A set of common bitbake variables, defined in meta/conf/bitbake.conf, are used to define how to run the toolchain components and the proper arguments.&lt;br /&gt;
&lt;br /&gt;
A number of key items may need to be changed, depending on the toolchain being provided.  These items may include:&lt;br /&gt;
&lt;br /&gt;
   * TARGET_CPPFLAGS&lt;br /&gt;
   * TARGET_CFLAGS&lt;br /&gt;
   * TARGET_CXXFLAGS&lt;br /&gt;
   * TARGET_LDFLAGS&lt;br /&gt;
   * CC&lt;br /&gt;
   * CXX&lt;br /&gt;
   * F77&lt;br /&gt;
   * CPP&lt;br /&gt;
   * LD&lt;br /&gt;
   * CCLD&lt;br /&gt;
   * AR&lt;br /&gt;
   * AS&lt;br /&gt;
   * RANLIB&lt;br /&gt;
   * STRIP&lt;br /&gt;
   * OBJCOPY&lt;br /&gt;
   * OBJDUMP&lt;br /&gt;
   * NM&lt;br /&gt;
   * SELECTED_OPTIMIZATION&lt;br /&gt;
      * FULL_OPTIMIZATION&lt;br /&gt;
      * DEBUG_OPTIMIZATION&lt;br /&gt;
&lt;br /&gt;
Each of the above items has a default definition within the meta/conf/bitbake.conf file.  In addition, many of the components are based on specific tune variables such as:&lt;br /&gt;
&lt;br /&gt;
   * TUNE_CCARGS&lt;br /&gt;
   * TUNE_LDARGS&lt;br /&gt;
   * TUNE_ASARGS&lt;br /&gt;
&lt;br /&gt;
Deciding which items need to be overridden is up to the author of the layer.  It is expected that only a subset of the above referenced variables will need secondary toolchain specific versions for most implementations.&lt;br /&gt;
&lt;br /&gt;
It is suggested that the secondary toolchain values be defined in a single configuration file.  Within the example this is &amp;quot;conf/tc-example.conf&amp;quot;.  The standard name for the file should be &#039;conf/tc-&amp;lt;toolchain&amp;gt;.conf&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Override ===&lt;br /&gt;
&lt;br /&gt;
In order to allow for the layer to selectively override the variables listed above, a standard override syntax is needed.&lt;br /&gt;
&lt;br /&gt;
The standard override syntax will be &#039;toolchain-${TOOLCHAIN}&#039;.  This will allow us to specify multiple alternative and primary toolchain combinations as necessary.&lt;br /&gt;
&lt;br /&gt;
Each of the toolchain related variables can then be overridden using the standard override syntax: &amp;lt;var&amp;gt;_toolchain-&amp;lt;toolchain&amp;gt;, such as:&lt;br /&gt;
&lt;br /&gt;
CC_toolchain-icc = &amp;quot;icc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In order for an individual recipe to use the secondary toolchain, the user would define: TOOLCHAIN_pn-&amp;lt;recipe&amp;gt; = &#039;toolchain&#039;, such as:&lt;br /&gt;
&lt;br /&gt;
TOOLCHAIN_pn-bash = &amp;quot;icc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The OVERRIDE is implemented in the tc-secondary.bbclass in the example.&lt;br /&gt;
&lt;br /&gt;
=== Blacklist/Whitelist ===&lt;br /&gt;
&lt;br /&gt;
A standard blacklist/whitelist facility is to be implemented.  This facility is independent of the existing blacklist class that is part of OpenEmbedded-Core.&lt;br /&gt;
&lt;br /&gt;
Similar to the existing blacklist class, you will be able to define a blacklist, per toolchain type, such as:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
or alternatively create a whitelist facility using:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
   TCWHITELIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Using the second approach will allow you to blacklist all recipes, and only enable those known to work with the alternative toolchain.  &lt;br /&gt;
&lt;br /&gt;
The blacklist items should be defined within conf/tc-&amp;lt;toolchain&amp;gt;-blacklist.conf.  The validation of the blacklist should use the standard tc-blacklist.bbclass implementation available within the example.&lt;br /&gt;
&lt;br /&gt;
=== SDK ===&lt;br /&gt;
&lt;br /&gt;
In order to make it easier to use the alternative toolchain within the SDK.  An additional environment-* file should be created.  The purpose of this file is to simply override the settings in the main environment file.&lt;br /&gt;
&lt;br /&gt;
See the example section for an implementation that will create this file automatically.&lt;br /&gt;
&lt;br /&gt;
== Implementation Example ==&lt;br /&gt;
&lt;br /&gt;
An example implementation has been created in the layer &amp;quot;meta-tc-example&amp;quot;.  The file format follows:&lt;br /&gt;
&lt;br /&gt;
meta-tc-example/&lt;br /&gt;
meta-tc-example/bin&lt;br /&gt;
meta-tc-example/bin/example-toolchain&lt;br /&gt;
meta-tc-example/conf&lt;br /&gt;
meta-tc-example/conf/layer.conf&lt;br /&gt;
meta-tc-example/conf/tc-example.conf&lt;br /&gt;
meta-tc-example/conf/tc-example-blacklist.conf&lt;br /&gt;
meta-tc-example/classes&lt;br /&gt;
meta-tc-example/classes/tc-secondary.bbclass&lt;br /&gt;
meta-tc-example/classes/tc-blacklist.bbclass&lt;br /&gt;
&lt;br /&gt;
=== conf/layer.conf ===&lt;br /&gt;
&lt;br /&gt;
   # We have a conf and classes directory, append to BBPATH&lt;br /&gt;
   BBPATH .= &amp;quot;:${LAYERDIR}&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # If we have a recipes directory, add to BBFILES&lt;br /&gt;
   #BBFILES += &amp;quot;${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/*/recipes-*/*/*.bbappend&amp;quot;&lt;br /&gt;
   #BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   #BBFILE_PATTERN_tc-example := &amp;quot;^${LAYERDIR}/&amp;quot;&lt;br /&gt;
   #BBFILE_PRIORITY_tc-example = &amp;quot;5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Above is standard layer configuration.  Note, the commented out sections should be re-enabled if the secondary toolchain includes recipes and/or bbappend files.&lt;br /&gt;
&lt;br /&gt;
   PATH := &amp;quot;${PATH}:${LAYERDIR}/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Add to the path a standard system path, a layer specific path.  This is the way you can add a secondary toolchain to the path.&lt;br /&gt;
&lt;br /&gt;
   # Define the alternative toolchain&lt;br /&gt;
   SECONDARYTC = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   # Enable the secondary toolchain&lt;br /&gt;
   INHERIT += &#039;tc-secondary tc-blacklist&#039;&lt;br /&gt;
&lt;br /&gt;
Define the alternative toolchain name in SECONDARYTC.  The inherit causes the tc-secondary.bbclass and tc-blacklist.bbclass to be loaded later.  Eventually this class used SECONDARYTC to load in the secondary toolchain configuration files.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example.conf ===&lt;br /&gt;
&lt;br /&gt;
   # Define default system toolchain (default to built-in)&lt;br /&gt;
   TOOLCHAIN = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
Define a reasonable default such as gnu.  The purpose of this default is to allow someone to specify the default or provide default override items for the built-in toolchain.&lt;br /&gt;
&lt;br /&gt;
   # Define a secondary toolchain called &#039;example&#039;&lt;br /&gt;
   # the &#039;example&#039; toolchain can be activated using:&lt;br /&gt;
   #&lt;br /&gt;
   # Per package (preferred):&lt;br /&gt;
   #   TOOLCHAIN_pn-bash = &#039;example&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # Globally:&lt;br /&gt;
   #   TOOLCHAIN = &#039;example&#039;&lt;br /&gt;
   #   TOOLCHAIN_pn-eglibc = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
The above is an example of how to use the alternative toolchain.&lt;br /&gt;
&lt;br /&gt;
   # When the secondary toolchain is used, we add an automatic depend...&lt;br /&gt;
   DEPENDS_append_toolchain-example = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # ...the depend can be provided by a recipe or as an ASSUME_PROVIDED&lt;br /&gt;
   ASSUME_PROVIDED_append = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Use the above as an example on how to add additional dependencies to specific packages.  This can be used to trigger a recipe to build.&lt;br /&gt;
&lt;br /&gt;
   # Default values from bitbake.conf...&lt;br /&gt;
   # Variables with a &#039;*&#039; are things likely to need to be overridden:&lt;br /&gt;
   #&lt;br /&gt;
   #   FULL_OPTIMIZATION = &amp;quot;-O2 -pipe ${DEBUG_FLAGS}&amp;quot;&lt;br /&gt;
   #   DEBUG_OPTIMIZATION = &amp;quot;-O -fno-omit-frame-pointer ${DEBUG_FLAGS} -pipe&amp;quot;&lt;br /&gt;
   #   SELECTED_OPTIMIZATION = &amp;quot;${@d.getVar([&#039;FULL_OPTIMIZATION&#039;, &#039;DEBUG_OPTIMIZATION&#039;][d.getVar(&#039;DEBUG_BUILD&#039;, True) == &#039;1&#039;], True)}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   # * TOOLCHAIN_OPTIONS = &amp;quot; --sysroot=${STAGING_DIR_TARGET}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * TARGET_CPPFLAGS = &amp;quot;&amp;quot;&lt;br /&gt;
   # * TARGET_CFLAGS = &amp;quot;${TARGET_CPPFLAGS} ${SELECTED_OPTIMIZATION}&amp;quot;&lt;br /&gt;
   # * TARGET CXXFLAGS = &amp;quot;${TARGET_CFLAGS} -fpermissive&amp;quot;&lt;br /&gt;
   # * TARGET_LDFLAGS = &amp;quot;-Wl,-O1 ${TARGET_LINK_HASH_STYLE}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   TARGET_CC_ARCH = &amp;quot;${TUNE_CCARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_LD_ARCH = &amp;quot;${TUNE_LDARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_AS_ARCH = &amp;quot;${TUNE_ASARGS}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   HOST_CC_ARCH = &amp;quot;${TARGET_CC_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_LD_ARCH = &amp;quot;${TARGET_LD_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_AS_ARCH = &amp;quot;${TARGET_AS_ARCH}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * CC = &amp;quot;${CCACHE}${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CXX = &amp;quot;${CCACHE}${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * F77 = &amp;quot;${CCACHE}${HOST_PREFIX}g77 ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CPP = &amp;quot;${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   # * LD = &amp;quot;${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
   # * CCLD = &amp;quot;${CC}&amp;quot;&lt;br /&gt;
   #   AR = &amp;quot;${HOST_PREFIX}ar&amp;quot;&lt;br /&gt;
   #   AS = &amp;quot;${HOST_PREFIX}as ${HOST_AS_ARCH}&amp;quot;&lt;br /&gt;
   #   RANLIB = &amp;quot;${HOST_PREFIX}ranlib&amp;quot;&lt;br /&gt;
   #   STRIP = &amp;quot;${HOST_PREFIX}strip&amp;quot;&lt;br /&gt;
   #   OBJCOPY = &amp;quot;${HOST_PREFIX}objcopy&amp;quot;&lt;br /&gt;
   #   OBJDUMP = &amp;quot;${HOST_PREFIX}objdump&amp;quot;&lt;br /&gt;
   #   NM = &amp;quot;${HOST_PREFIX}nm&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # Override values:&lt;br /&gt;
   CC_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   CXX_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   CPP_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   LD_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The above implements the necessary overrides for the example toolchain.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example-blacklist.conf ===&lt;br /&gt;
&lt;br /&gt;
Example configuration file that enables the blacklist and defines the defaults.&lt;br /&gt;
&lt;br /&gt;
   # Blacklist certain items...&lt;br /&gt;
   TCBLACKLIST[eglibc] = &#039;example&#039;&lt;br /&gt;
   TCBLACKLIST[bash] = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   #&lt;br /&gt;
   # or&lt;br /&gt;
   #&lt;br /&gt;
   &lt;br /&gt;
   # Switch to a global blacklist and whitelist situation...&lt;br /&gt;
   # TCBLACKLIST = &#039;example&#039;&lt;br /&gt;
   # TCWHITELIST[bash] = &#039;example&#039;&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-secondary.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # In order to add overrides, we need to do it later then in the layers.conf&lt;br /&gt;
   # the only standard way is using an inherit, which requires a bbclass&lt;br /&gt;
   &lt;br /&gt;
   # Add the necessary override&lt;br /&gt;
   TOOLCHAINOVERRIDES = &amp;quot;:toolchain-${TOOLCHAIN}&amp;quot;&lt;br /&gt;
   TOOLCHAINOVERRIDES[vardepsexclude] = &amp;quot;TOOLCHAIN&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   OVERRIDES .= &amp;quot;${TOOLCHAINOVERRIDES}&amp;quot;&lt;br /&gt;
   OVERRIDES[vardepsexclude] += &amp;quot;TOOLCHAINOVERRIDES&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   require conf/tc-${SECONDARYTC}.conf&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-blacklist.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain blacklist class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # Implement blacklist/whitelist functionality for alternative toolchains&lt;br /&gt;
   # Based on the oe-core blacklist bclass&lt;br /&gt;
   #&lt;br /&gt;
   # To add a blacklisted package:&lt;br /&gt;
   #   TCBLACKLIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # To blacklist everything, and whitelist a package:&lt;br /&gt;
   #   TCBLACKLIST = &#039;toolchain&#039;&lt;br /&gt;
   #   TCWHITELIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   &lt;br /&gt;
   include conf/tc-${SECONDARYTC}-blacklist.conf&lt;br /&gt;
   &lt;br /&gt;
   python () {&lt;br /&gt;
       tc = d.getVar(&#039;TOOLCHAIN&#039;, True)&lt;br /&gt;
       pn = d.getVar(&#039;PN&#039;, True)&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVarFlag(&#039;TCBLACKLIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and blacklist == tc:&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVar(&#039;TCBLACKLIST&#039;, True)&lt;br /&gt;
       whitelist = d.getVarFlag(&#039;TCWHITELIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and (not whitelist or whitelist != tc):&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Further comments and information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Dev]]&lt;br /&gt;
[[Category:Layers]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5347</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5347"/>
		<updated>2012-11-14T17:45:45Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Implementation Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
&lt;br /&gt;
In OpenEmbedded-Core there in an included toolchain that is built up of GNU binutils, gcc, and eglibc.  In addition related components such as gdb, cross-prelink, mklibs and others provider additional toolchain functionality.  In this document we focus on explaining best practices for including an additional toolchain that is capable of assembling, compiling and linking code.  This document does not cover replacing the existing toolchain or toolchain components with external elements.&lt;br /&gt;
&lt;br /&gt;
Many companies have commercial / highly optimized toolchains for specific purposes, such as ICC from Intel, LLVM, ARM Ltd toolchains, etc..  In some cases, these highly optimized toolchains may result in better performance for some applications, however they are often not generally applicable as they can not compile all of the system software.  So instead of replacing the included GNU toolchain, a mechanism for providing an alternative/secondary toolchain is desired.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchains should be implemented in a layer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In order to facilitate re-use and make it easier to completely disable the secondary toolchain, a layer must be used to implement the secondary toolchain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchain must be generally compatible with GNU toolchain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The secondary toolchain must be generally compatible with the idea of sysroots, linking to the defined libc, and various GNU conventions.  This compatibility may be implemented directly by the secondary toolchain or via a wrapper of some type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Per recipe selection of toolchain usage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A mechanism is needed to activate this alternative toolchain on a per-recipe basis.  Using variables it should be possible to specify on a per-recipe basis which toolchain should be used, leaving the default up to the user.  (It&#039;s assumed if the user does not select a default, the system GNU toolchain will be defaulted.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blacklist/Whitelist&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even with the requirement to be generally compatible, we can not expect all of the possible recipes to build properly with the secondary toolchain.  As a consequence of this, it will be necessary to implement a blacklist (or whitelist) of specific recipes that are known to work.  This way only supported components can be build by the user, avoid numerous complaints and unresolvable defects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The SDK generated by OpenEmbedded-Core also includes the included toolchain components.  It would be useful to also provide support for the secondary toolchain within the SDK environment.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Bitbake variables ===&lt;br /&gt;
&lt;br /&gt;
A set of common bitbake variables, defined in meta/conf/bitbake.conf, are used to define how to run the toolchain components and the proper arguments.&lt;br /&gt;
&lt;br /&gt;
A number of key items may need to be changed, depending on the toolchain being provided.  These items may include:&lt;br /&gt;
&lt;br /&gt;
   * TARGET_CPPFLAGS&lt;br /&gt;
   * TARGET_CFLAGS&lt;br /&gt;
   * TARGET_CXXFLAGS&lt;br /&gt;
   * TARGET_LDFLAGS&lt;br /&gt;
   * CC&lt;br /&gt;
   * CXX&lt;br /&gt;
   * F77&lt;br /&gt;
   * CPP&lt;br /&gt;
   * LD&lt;br /&gt;
   * CCLD&lt;br /&gt;
   * AR&lt;br /&gt;
   * AS&lt;br /&gt;
   * RANLIB&lt;br /&gt;
   * STRIP&lt;br /&gt;
   * OBJCOPY&lt;br /&gt;
   * OBJDUMP&lt;br /&gt;
   * NM&lt;br /&gt;
   * SELECTED_OPTIMIZATION&lt;br /&gt;
      * FULL_OPTIMIZATION&lt;br /&gt;
      * DEBUG_OPTIMIZATION&lt;br /&gt;
&lt;br /&gt;
Each of the above items has a default definition within the meta/conf/bitbake.conf file.  In addition, many of the components are based on specific tune variables such as:&lt;br /&gt;
&lt;br /&gt;
   * TUNE_CCARGS&lt;br /&gt;
   * TUNE_LDARGS&lt;br /&gt;
   * TUNE_ASARGS&lt;br /&gt;
&lt;br /&gt;
Deciding which items need to be overridden is up to the author of the layer.  It is expected that only a subset of the above referenced variables will need secondary toolchain specific versions for most implementations.&lt;br /&gt;
&lt;br /&gt;
It is suggested that the secondary toolchain values be defined in a single configuration file.  Within the example this is &amp;quot;conf/tc-example.conf&amp;quot;.  The standard name for the file should be &#039;conf/tc-&amp;lt;toolchain&amp;gt;.conf&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Override ===&lt;br /&gt;
&lt;br /&gt;
In order to allow for the layer to selectively override the variables listed above, a standard override syntax is needed.&lt;br /&gt;
&lt;br /&gt;
The standard override syntax will be &#039;toolchain-${TOOLCHAIN}&#039;.  This will allow us to specify multiple alternative and primary toolchain combinations as necessary.&lt;br /&gt;
&lt;br /&gt;
Each of the toolchain related variables can then be overridden using the standard override syntax: &amp;lt;var&amp;gt;_toolchain-&amp;lt;toolchain&amp;gt;, such as:&lt;br /&gt;
&lt;br /&gt;
CC_toolchain-icc = &amp;quot;icc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In order for an individual recipe to use the secondary toolchain, the user would define: TOOLCHAIN_pn-&amp;lt;recipe&amp;gt; = &#039;toolchain&#039;, such as:&lt;br /&gt;
&lt;br /&gt;
TOOLCHAIN_pn-bash = &amp;quot;icc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The OVERRIDE is implemented in the tc-secondary.bbclass in the example.&lt;br /&gt;
&lt;br /&gt;
=== Blacklist/Whitelist ===&lt;br /&gt;
&lt;br /&gt;
A standard blacklist/whitelist facility is to be implemented.  This facility is independent of the existing blacklist class that is part of OpenEmbedded-Core.&lt;br /&gt;
&lt;br /&gt;
Similar to the existing blacklist class, you will be able to define a blacklist, per toolchain type, such as:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
or alternatively create a whitelist facility using:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
   TCWHITELIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Using the second approach will allow you to blacklist all recipes, and only enable those known to work with the alternative toolchain.  &lt;br /&gt;
&lt;br /&gt;
The blacklist items should be defined within conf/tc-&amp;lt;toolchain&amp;gt;-blacklist.conf.  The validation of the blacklist should use the standard tc-blacklist.bbclass implementation available within the example.&lt;br /&gt;
&lt;br /&gt;
=== SDK ===&lt;br /&gt;
&lt;br /&gt;
TBD: Add SDK extension details&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
* need to add a custom toolchain_create_sdk_env_script for the secondary toolchain(s) (supporting override).&lt;br /&gt;
* need to support more then one secondary toolchain&lt;br /&gt;
* populate_sdk_image_append -- define a python class to dump the secondary toolchain bits...&lt;br /&gt;
&lt;br /&gt;
== Implementation Example ==&lt;br /&gt;
&lt;br /&gt;
An example implementation has been created in the layer &amp;quot;meta-tc-example&amp;quot;.  The file format follows:&lt;br /&gt;
&lt;br /&gt;
meta-tc-example/&lt;br /&gt;
meta-tc-example/bin&lt;br /&gt;
meta-tc-example/bin/example-toolchain&lt;br /&gt;
meta-tc-example/conf&lt;br /&gt;
meta-tc-example/conf/layer.conf&lt;br /&gt;
meta-tc-example/conf/tc-example.conf&lt;br /&gt;
meta-tc-example/conf/tc-example-blacklist.conf&lt;br /&gt;
meta-tc-example/classes&lt;br /&gt;
meta-tc-example/classes/tc-secondary.bbclass&lt;br /&gt;
meta-tc-example/classes/tc-blacklist.bbclass&lt;br /&gt;
&lt;br /&gt;
=== conf/layer.conf ===&lt;br /&gt;
&lt;br /&gt;
   # We have a conf and classes directory, append to BBPATH&lt;br /&gt;
   BBPATH .= &amp;quot;:${LAYERDIR}&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # If we have a recipes directory, add to BBFILES&lt;br /&gt;
   #BBFILES += &amp;quot;${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/*/recipes-*/*/*.bbappend&amp;quot;&lt;br /&gt;
   #BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   #BBFILE_PATTERN_tc-example := &amp;quot;^${LAYERDIR}/&amp;quot;&lt;br /&gt;
   #BBFILE_PRIORITY_tc-example = &amp;quot;5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Above is standard layer configuration.  Note, the commented out sections should be re-enabled if the secondary toolchain includes recipes and/or bbappend files.&lt;br /&gt;
&lt;br /&gt;
   PATH := &amp;quot;${PATH}:${LAYERDIR}/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Add to the path a standard system path, a layer specific path.  This is the way you can add a secondary toolchain to the path.&lt;br /&gt;
&lt;br /&gt;
   # Define the alternative toolchain&lt;br /&gt;
   SECONDARYTC = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   # Enable the secondary toolchain&lt;br /&gt;
   INHERIT += &#039;tc-secondary tc-blacklist&#039;&lt;br /&gt;
&lt;br /&gt;
Define the alternative toolchain name in SECONDARYTC.  The inherit causes the tc-secondary.bbclass and tc-blacklist.bbclass to be loaded later.  Eventually this class used SECONDARYTC to load in the secondary toolchain configuration files.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example.conf ===&lt;br /&gt;
&lt;br /&gt;
   # Define default system toolchain (default to built-in)&lt;br /&gt;
   TOOLCHAIN = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
Define a reasonable default such as gnu.  The purpose of this default is to allow someone to specify the default or provide default override items for the built-in toolchain.&lt;br /&gt;
&lt;br /&gt;
   # Define a secondary toolchain called &#039;example&#039;&lt;br /&gt;
   # the &#039;example&#039; toolchain can be activated using:&lt;br /&gt;
   #&lt;br /&gt;
   # Per package (preferred):&lt;br /&gt;
   #   TOOLCHAIN_pn-bash = &#039;example&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # Globally:&lt;br /&gt;
   #   TOOLCHAIN = &#039;example&#039;&lt;br /&gt;
   #   TOOLCHAIN_pn-eglibc = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
The above is an example of how to use the alternative toolchain.&lt;br /&gt;
&lt;br /&gt;
   # When the secondary toolchain is used, we add an automatic depend...&lt;br /&gt;
   DEPENDS_append_toolchain-example = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # ...the depend can be provided by a recipe or as an ASSUME_PROVIDED&lt;br /&gt;
   ASSUME_PROVIDED_append = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Use the above as an example on how to add additional dependencies to specific packages.  This can be used to trigger a recipe to build.&lt;br /&gt;
&lt;br /&gt;
   # Default values from bitbake.conf...&lt;br /&gt;
   # Variables with a &#039;*&#039; are things likely to need to be overridden:&lt;br /&gt;
   #&lt;br /&gt;
   #   FULL_OPTIMIZATION = &amp;quot;-O2 -pipe ${DEBUG_FLAGS}&amp;quot;&lt;br /&gt;
   #   DEBUG_OPTIMIZATION = &amp;quot;-O -fno-omit-frame-pointer ${DEBUG_FLAGS} -pipe&amp;quot;&lt;br /&gt;
   #   SELECTED_OPTIMIZATION = &amp;quot;${@d.getVar([&#039;FULL_OPTIMIZATION&#039;, &#039;DEBUG_OPTIMIZATION&#039;][d.getVar(&#039;DEBUG_BUILD&#039;, True) == &#039;1&#039;], True)}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   # * TOOLCHAIN_OPTIONS = &amp;quot; --sysroot=${STAGING_DIR_TARGET}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * TARGET_CPPFLAGS = &amp;quot;&amp;quot;&lt;br /&gt;
   # * TARGET_CFLAGS = &amp;quot;${TARGET_CPPFLAGS} ${SELECTED_OPTIMIZATION}&amp;quot;&lt;br /&gt;
   # * TARGET CXXFLAGS = &amp;quot;${TARGET_CFLAGS} -fpermissive&amp;quot;&lt;br /&gt;
   # * TARGET_LDFLAGS = &amp;quot;-Wl,-O1 ${TARGET_LINK_HASH_STYLE}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   TARGET_CC_ARCH = &amp;quot;${TUNE_CCARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_LD_ARCH = &amp;quot;${TUNE_LDARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_AS_ARCH = &amp;quot;${TUNE_ASARGS}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   HOST_CC_ARCH = &amp;quot;${TARGET_CC_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_LD_ARCH = &amp;quot;${TARGET_LD_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_AS_ARCH = &amp;quot;${TARGET_AS_ARCH}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * CC = &amp;quot;${CCACHE}${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CXX = &amp;quot;${CCACHE}${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * F77 = &amp;quot;${CCACHE}${HOST_PREFIX}g77 ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CPP = &amp;quot;${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   # * LD = &amp;quot;${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
   # * CCLD = &amp;quot;${CC}&amp;quot;&lt;br /&gt;
   #   AR = &amp;quot;${HOST_PREFIX}ar&amp;quot;&lt;br /&gt;
   #   AS = &amp;quot;${HOST_PREFIX}as ${HOST_AS_ARCH}&amp;quot;&lt;br /&gt;
   #   RANLIB = &amp;quot;${HOST_PREFIX}ranlib&amp;quot;&lt;br /&gt;
   #   STRIP = &amp;quot;${HOST_PREFIX}strip&amp;quot;&lt;br /&gt;
   #   OBJCOPY = &amp;quot;${HOST_PREFIX}objcopy&amp;quot;&lt;br /&gt;
   #   OBJDUMP = &amp;quot;${HOST_PREFIX}objdump&amp;quot;&lt;br /&gt;
   #   NM = &amp;quot;${HOST_PREFIX}nm&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # Override values:&lt;br /&gt;
   CC_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   CXX_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   CPP_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   LD_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The above implements the necessary overrides for the example toolchain.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example-blacklist.conf ===&lt;br /&gt;
&lt;br /&gt;
Example configuration file that enables the blacklist and defines the defaults.&lt;br /&gt;
&lt;br /&gt;
   # Blacklist certain items...&lt;br /&gt;
   TCBLACKLIST[eglibc] = &#039;example&#039;&lt;br /&gt;
   TCBLACKLIST[bash] = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   #&lt;br /&gt;
   # or&lt;br /&gt;
   #&lt;br /&gt;
   &lt;br /&gt;
   # Switch to a global blacklist and whitelist situation...&lt;br /&gt;
   # TCBLACKLIST = &#039;example&#039;&lt;br /&gt;
   # TCWHITELIST[bash] = &#039;example&#039;&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-secondary.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # In order to add overrides, we need to do it later then in the layers.conf&lt;br /&gt;
   # the only standard way is using an inherit, which requires a bbclass&lt;br /&gt;
   &lt;br /&gt;
   # Add the necessary override&lt;br /&gt;
   TOOLCHAINOVERRIDES = &amp;quot;:toolchain-${TOOLCHAIN}&amp;quot;&lt;br /&gt;
   TOOLCHAINOVERRIDES[vardepsexclude] = &amp;quot;TOOLCHAIN&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   OVERRIDES .= &amp;quot;${TOOLCHAINOVERRIDES}&amp;quot;&lt;br /&gt;
   OVERRIDES[vardepsexclude] += &amp;quot;TOOLCHAINOVERRIDES&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   require conf/tc-${SECONDARYTC}.conf&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-blacklist.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain blacklist class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # Implement blacklist/whitelist functionality for alternative toolchains&lt;br /&gt;
   # Based on the oe-core blacklist bclass&lt;br /&gt;
   #&lt;br /&gt;
   # To add a blacklisted package:&lt;br /&gt;
   #   TCBLACKLIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # To blacklist everything, and whitelist a package:&lt;br /&gt;
   #   TCBLACKLIST = &#039;toolchain&#039;&lt;br /&gt;
   #   TCWHITELIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   &lt;br /&gt;
   include conf/tc-${SECONDARYTC}-blacklist.conf&lt;br /&gt;
   &lt;br /&gt;
   python () {&lt;br /&gt;
       tc = d.getVar(&#039;TOOLCHAIN&#039;, True)&lt;br /&gt;
       pn = d.getVar(&#039;PN&#039;, True)&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVarFlag(&#039;TCBLACKLIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and blacklist == tc:&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVar(&#039;TCBLACKLIST&#039;, True)&lt;br /&gt;
       whitelist = d.getVarFlag(&#039;TCWHITELIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and (not whitelist or whitelist != tc):&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Further comments and information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Dev]]&lt;br /&gt;
[[Category:Layers]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5345</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5345"/>
		<updated>2012-11-13T23:31:38Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* SDK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
&lt;br /&gt;
In OpenEmbedded-Core there in an included toolchain that is built up of GNU binutils, gcc, and eglibc.  In addition related components such as gdb, cross-prelink, mklibs and others provider additional toolchain functionality.  In this document we focus on explaining best practices for including an additional toolchain that is capable of assembling, compiling and linking code.  This document does not cover replacing the existing toolchain or toolchain components with external elements.&lt;br /&gt;
&lt;br /&gt;
Many companies have commercial / highly optimized toolchains for specific purposes, such as ICC from Intel, LLVM, ARM Ltd toolchains, etc..  In some cases, these highly optimized toolchains may result in better performance for some applications, however they are often not generally applicable as they can not compile all of the system software.  So instead of replacing the included GNU toolchain, a mechanism for providing an alternative/secondary toolchain is desired.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchains should be implemented in a layer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In order to facilitate re-use and make it easier to completely disable the secondary toolchain, a layer must be used to implement the secondary toolchain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchain must be generally compatible with GNU toolchain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The secondary toolchain must be generally compatible with the idea of sysroots, linking to the defined libc, and various GNU conventions.  This compatibility may be implemented directly by the secondary toolchain or via a wrapper of some type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Per recipe selection of toolchain usage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A mechanism is needed to activate this alternative toolchain on a per-recipe basis.  Using variables it should be possible to specify on a per-recipe basis which toolchain should be used, leaving the default up to the user.  (It&#039;s assumed if the user does not select a default, the system GNU toolchain will be defaulted.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blacklist/Whitelist&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even with the requirement to be generally compatible, we can not expect all of the possible recipes to build properly with the secondary toolchain.  As a consequence of this, it will be necessary to implement a blacklist (or whitelist) of specific recipes that are known to work.  This way only supported components can be build by the user, avoid numerous complaints and unresolvable defects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The SDK generated by OpenEmbedded-Core also includes the included toolchain components.  It would be useful to also provide support for the secondary toolchain within the SDK environment.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Bitbake variables ===&lt;br /&gt;
&lt;br /&gt;
A set of common bitbake variables, defined in meta/conf/bitbake.conf, are used to define how to run the toolchain components and the proper arguments.&lt;br /&gt;
&lt;br /&gt;
A number of key items may need to be changed, depending on the toolchain being provided.  These items may include:&lt;br /&gt;
&lt;br /&gt;
   * TARGET_CPPFLAGS&lt;br /&gt;
   * TARGET_CFLAGS&lt;br /&gt;
   * TARGET_CXXFLAGS&lt;br /&gt;
   * TARGET_LDFLAGS&lt;br /&gt;
   * CC&lt;br /&gt;
   * CXX&lt;br /&gt;
   * F77&lt;br /&gt;
   * CPP&lt;br /&gt;
   * LD&lt;br /&gt;
   * CCLD&lt;br /&gt;
   * AR&lt;br /&gt;
   * AS&lt;br /&gt;
   * RANLIB&lt;br /&gt;
   * STRIP&lt;br /&gt;
   * OBJCOPY&lt;br /&gt;
   * OBJDUMP&lt;br /&gt;
   * NM&lt;br /&gt;
   * SELECTED_OPTIMIZATION&lt;br /&gt;
      * FULL_OPTIMIZATION&lt;br /&gt;
      * DEBUG_OPTIMIZATION&lt;br /&gt;
&lt;br /&gt;
Each of the above items has a default definition within the meta/conf/bitbake.conf file.  In addition, many of the components are based on specific tune variables such as:&lt;br /&gt;
&lt;br /&gt;
   * TUNE_CCARGS&lt;br /&gt;
   * TUNE_LDARGS&lt;br /&gt;
   * TUNE_ASARGS&lt;br /&gt;
&lt;br /&gt;
Deciding which items need to be overridden is up to the author of the layer.  It is expected that only a subset of the above referenced variables will need secondary toolchain specific versions for most implementations.&lt;br /&gt;
&lt;br /&gt;
It is suggested that the secondary toolchain values be defined in a single configuration file.  Within the example this is &amp;quot;conf/tc-example.conf&amp;quot;.  The standard name for the file should be &#039;conf/tc-&amp;lt;toolchain&amp;gt;.conf&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Override ===&lt;br /&gt;
&lt;br /&gt;
In order to allow for the layer to selectively override the variables listed above, a standard override syntax is needed.&lt;br /&gt;
&lt;br /&gt;
The standard override syntax will be &#039;toolchain-${TOOLCHAIN}&#039;.  This will allow us to specify multiple alternative and primary toolchain combinations as necessary.&lt;br /&gt;
&lt;br /&gt;
Each of the toolchain related variables can then be overridden using the standard override syntax: &amp;lt;var&amp;gt;_toolchain-&amp;lt;toolchain&amp;gt;, such as:&lt;br /&gt;
&lt;br /&gt;
CC_toolchain-icc = &amp;quot;icc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In order for an individual recipe to use the secondary toolchain, the user would define: TOOLCHAIN_pn-&amp;lt;recipe&amp;gt; = &#039;toolchain&#039;, such as:&lt;br /&gt;
&lt;br /&gt;
TOOLCHAIN_pn-bash = &amp;quot;icc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The OVERRIDE is implemented in the tc-secondary.bbclass in the example.&lt;br /&gt;
&lt;br /&gt;
=== Blacklist/Whitelist ===&lt;br /&gt;
&lt;br /&gt;
A standard blacklist/whitelist facility is to be implemented.  This facility is independent of the existing blacklist class that is part of OpenEmbedded-Core.&lt;br /&gt;
&lt;br /&gt;
Similar to the existing blacklist class, you will be able to define a blacklist, per toolchain type, such as:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
or alternatively create a whitelist facility using:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
   TCWHITELIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Using the second approach will allow you to blacklist all recipes, and only enable those known to work with the alternative toolchain.  &lt;br /&gt;
&lt;br /&gt;
The blacklist items should be defined within conf/tc-&amp;lt;toolchain&amp;gt;-blacklist.conf.  The validation of the blacklist should use the standard tc-blacklist.bbclass implementation available within the example.&lt;br /&gt;
&lt;br /&gt;
=== SDK ===&lt;br /&gt;
&lt;br /&gt;
TBD: Add SDK extension details&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
* need to add a custom toolchain_create_sdk_env_script for the secondary toolchain(s) (supporting override).&lt;br /&gt;
* need to support more then one secondary toolchain&lt;br /&gt;
* populate_sdk_image_append -- define a python class to dump the secondary toolchain bits...&lt;br /&gt;
&lt;br /&gt;
== Implementation Example ==&lt;br /&gt;
&lt;br /&gt;
An example implementation has been created in the layer &amp;quot;meta-tc-example&amp;quot;.  The file format follows:&lt;br /&gt;
&lt;br /&gt;
meta-tc-example/&lt;br /&gt;
meta-tc-example/bin&lt;br /&gt;
meta-tc-example/bin/example-toolchain&lt;br /&gt;
meta-tc-example/conf&lt;br /&gt;
meta-tc-example/conf/layer.conf&lt;br /&gt;
meta-tc-example/conf/tc-example.conf&lt;br /&gt;
meta-tc-example/conf/tc-example-blacklist.conf&lt;br /&gt;
meta-tc-example/classes&lt;br /&gt;
meta-tc-example/classes/tc-secondary.bbclass&lt;br /&gt;
meta-tc-example/classes/tc-blacklist.bbclass&lt;br /&gt;
&lt;br /&gt;
=== conf/layer.conf ===&lt;br /&gt;
&lt;br /&gt;
   # We have a conf and classes directory, append to BBPATH&lt;br /&gt;
   BBPATH .= &amp;quot;:${LAYERDIR}&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # If we have a recipes directory, add to BBFILES&lt;br /&gt;
   #BBFILES += &amp;quot;${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/*/recipes-*/*/*.bbappend&amp;quot;&lt;br /&gt;
   #BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   #BBFILE_PATTERN_tc-example := &amp;quot;^${LAYERDIR}/&amp;quot;&lt;br /&gt;
   #BBFILE_PRIORITY_tc-example = &amp;quot;5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Above is standard layer configuration.  Note, the commented out sections should be re-enabled if the secondary toolchain includes recipes and/or bbappend files.&lt;br /&gt;
&lt;br /&gt;
   PATH := &amp;quot;${PATH}:${LAYERDIR}/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Add to the path a standard system path, a layer specific path.  This is the way you can add a secondary toolchain to the path.&lt;br /&gt;
&lt;br /&gt;
   # Define the alternative toolchain&lt;br /&gt;
   SECONDARYTC = &#039;example&#039;&lt;br /&gt;
   require ${LAYERDIR}/conf/tc-${SECONDARYTC}.conf&lt;br /&gt;
   include ${LAYERDIR}/conf/tc-${SECONDARYTC}-blacklist.conf&lt;br /&gt;
&lt;br /&gt;
Define the alternative toolchain name in SECONDARYTC.  This is then used to bring in the two configuration files.  The first tc-example.conf is required, while the tc-example-blacklist.conf is optional.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example.conf ===&lt;br /&gt;
&lt;br /&gt;
   # Enable the override:&lt;br /&gt;
   INHERIT += &#039;tc-secondary&#039;&lt;br /&gt;
&lt;br /&gt;
This inherit is mandatory and adds the secondary toolchain control class.  All secondary toolchains should contain the same class.&lt;br /&gt;
&lt;br /&gt;
   # Define default system toolchain (default to built-in)&lt;br /&gt;
   TOOLCHAIN = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
Define a reasonable default such as gnu.  The purpose of this default is to allow someone to specify the default or provide default override items for the built-in toolchain.&lt;br /&gt;
&lt;br /&gt;
   # Define a secondary toolchain called &#039;example&#039;&lt;br /&gt;
   # the &#039;example&#039; toolchain can be activated using:&lt;br /&gt;
   #&lt;br /&gt;
   # Per package (preferred):&lt;br /&gt;
   #   TOOLCHAIN_pn-bash = &#039;example&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # Globally:&lt;br /&gt;
   #   TOOLCHAIN = &#039;example&#039;&lt;br /&gt;
   #   TOOLCHAIN_pn-eglibc = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
The above is an example of how to use the alternative toolchain.&lt;br /&gt;
&lt;br /&gt;
   # When the secondary toolchain is used, we add an automatic depend...&lt;br /&gt;
   DEPENDS_append_toolchain-example = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # ...the depend can be provided by a recipe or as an ASSUME_PROVIDED&lt;br /&gt;
   ASSUME_PROVIDED_append = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Use the above as an example on how to add additional dependencies to specific packages.  This can be used to trigger a recipe to build.&lt;br /&gt;
&lt;br /&gt;
   # Default values from bitbake.conf...&lt;br /&gt;
   # Variables with a &#039;*&#039; are things likely to need to be overridden:&lt;br /&gt;
   #&lt;br /&gt;
   #   FULL_OPTIMIZATION = &amp;quot;-O2 -pipe ${DEBUG_FLAGS}&amp;quot;&lt;br /&gt;
   #   DEBUG_OPTIMIZATION = &amp;quot;-O -fno-omit-frame-pointer ${DEBUG_FLAGS} -pipe&amp;quot;&lt;br /&gt;
   #   SELECTED_OPTIMIZATION = &amp;quot;${@d.getVar([&#039;FULL_OPTIMIZATION&#039;, &#039;DEBUG_OPTIMIZATION&#039;][d.getVar(&#039;DEBUG_BUILD&#039;, True) == &#039;1&#039;], True)}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   # * TOOLCHAIN_OPTIONS = &amp;quot; --sysroot=${STAGING_DIR_TARGET}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * TARGET_CPPFLAGS = &amp;quot;&amp;quot;&lt;br /&gt;
   # * TARGET_CFLAGS = &amp;quot;${TARGET_CPPFLAGS} ${SELECTED_OPTIMIZATION}&amp;quot;&lt;br /&gt;
   # * TARGET CXXFLAGS = &amp;quot;${TARGET_CFLAGS} -fpermissive&amp;quot;&lt;br /&gt;
   # * TARGET_LDFLAGS = &amp;quot;-Wl,-O1 ${TARGET_LINK_HASH_STYLE}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   TARGET_CC_ARCH = &amp;quot;${TUNE_CCARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_LD_ARCH = &amp;quot;${TUNE_LDARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_AS_ARCH = &amp;quot;${TUNE_ASARGS}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   HOST_CC_ARCH = &amp;quot;${TARGET_CC_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_LD_ARCH = &amp;quot;${TARGET_LD_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_AS_ARCH = &amp;quot;${TARGET_AS_ARCH}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * CC = &amp;quot;${CCACHE}${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CXX = &amp;quot;${CCACHE}${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * F77 = &amp;quot;${CCACHE}${HOST_PREFIX}g77 ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CPP = &amp;quot;${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   # * LD = &amp;quot;${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
   # * CCLD = &amp;quot;${CC}&amp;quot;&lt;br /&gt;
   #   AR = &amp;quot;${HOST_PREFIX}ar&amp;quot;&lt;br /&gt;
   #   AS = &amp;quot;${HOST_PREFIX}as ${HOST_AS_ARCH}&amp;quot;&lt;br /&gt;
   #   RANLIB = &amp;quot;${HOST_PREFIX}ranlib&amp;quot;&lt;br /&gt;
   #   STRIP = &amp;quot;${HOST_PREFIX}strip&amp;quot;&lt;br /&gt;
   #   OBJCOPY = &amp;quot;${HOST_PREFIX}objcopy&amp;quot;&lt;br /&gt;
   #   OBJDUMP = &amp;quot;${HOST_PREFIX}objdump&amp;quot;&lt;br /&gt;
   #   NM = &amp;quot;${HOST_PREFIX}nm&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # Override values:&lt;br /&gt;
   export CC_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   export CXX_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   export CPP_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   export LD_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The above implements the necessary overrides for the example toolchain.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example-blacklist.conf ===&lt;br /&gt;
&lt;br /&gt;
Example configuration file that enables the blacklist and defines the defaults.&lt;br /&gt;
&lt;br /&gt;
   INHERIT += &#039;tc-blacklist&#039;&lt;br /&gt;
   &lt;br /&gt;
   # Blacklist certain items...&lt;br /&gt;
   TCBLACKLIST[eglibc] = &#039;example&#039;&lt;br /&gt;
   TCBLACKLIST[bash] = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   #&lt;br /&gt;
   # or&lt;br /&gt;
   #&lt;br /&gt;
   &lt;br /&gt;
   # Switch to a global blacklist and whitelist situation...&lt;br /&gt;
   # TCBLACKLIST = &#039;example&#039;&lt;br /&gt;
   # TCWHITELIST[bash] = &#039;example&#039;&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-secondary.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # In order to add overrides, we need to do it later then in the layers.conf&lt;br /&gt;
   # the only standard way is using an inherit, which requires a bbclass&lt;br /&gt;
   &lt;br /&gt;
   # Add the necessary override&lt;br /&gt;
   TOOLCHAINOVERRIDES = &amp;quot;:toolchain-${TOOLCHAIN}&amp;quot;&lt;br /&gt;
   TOOLCHAINOVERRIDES[vardepsexclude] = &amp;quot;TOOLCHAIN&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   OVERRIDES .= &amp;quot;${TOOLCHAINOVERRIDES}&amp;quot;&lt;br /&gt;
   OVERRIDES[vardepsexclude] += &amp;quot;TOOLCHAINOVERRIDES&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-blacklist.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain blacklist class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # Implement blacklist/whitelist functionality for alternative toolchains&lt;br /&gt;
   # Based on the oe-core blacklist bclass&lt;br /&gt;
   #&lt;br /&gt;
   # To add a blacklisted package:&lt;br /&gt;
   #   TCBLACKLIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # To blacklist everything, and whitelist a package:&lt;br /&gt;
   #   TCBLACKLIST = &#039;toolchain&#039;&lt;br /&gt;
   #   TCWHITELIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   &lt;br /&gt;
   python () {&lt;br /&gt;
       tc = d.getVar(&#039;TOOLCHAIN&#039;, True)&lt;br /&gt;
       pn = d.getVar(&#039;PN&#039;, True)&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVarFlag(&#039;TCBLACKLIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and blacklist == tc:&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVar(&#039;TCBLACKLIST&#039;, True)&lt;br /&gt;
       whitelist = d.getVarFlag(&#039;TCWHITELIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and (not whitelist or whitelist != tc):&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Further comments and information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Dev]]&lt;br /&gt;
[[Category:Layers]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5343</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5343"/>
		<updated>2012-11-13T23:16:04Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Implementation Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
&lt;br /&gt;
In OpenEmbedded-Core there in an included toolchain that is built up of GNU binutils, gcc, and eglibc.  In addition related components such as gdb, cross-prelink, mklibs and others provider additional toolchain functionality.  In this document we focus on explaining best practices for including an additional toolchain that is capable of assembling, compiling and linking code.  This document does not cover replacing the existing toolchain or toolchain components with external elements.&lt;br /&gt;
&lt;br /&gt;
Many companies have commercial / highly optimized toolchains for specific purposes, such as ICC from Intel, LLVM, ARM Ltd toolchains, etc..  In some cases, these highly optimized toolchains may result in better performance for some applications, however they are often not generally applicable as they can not compile all of the system software.  So instead of replacing the included GNU toolchain, a mechanism for providing an alternative/secondary toolchain is desired.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchains should be implemented in a layer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In order to facilitate re-use and make it easier to completely disable the secondary toolchain, a layer must be used to implement the secondary toolchain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchain must be generally compatible with GNU toolchain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The secondary toolchain must be generally compatible with the idea of sysroots, linking to the defined libc, and various GNU conventions.  This compatibility may be implemented directly by the secondary toolchain or via a wrapper of some type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Per recipe selection of toolchain usage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A mechanism is needed to activate this alternative toolchain on a per-recipe basis.  Using variables it should be possible to specify on a per-recipe basis which toolchain should be used, leaving the default up to the user.  (It&#039;s assumed if the user does not select a default, the system GNU toolchain will be defaulted.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blacklist/Whitelist&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even with the requirement to be generally compatible, we can not expect all of the possible recipes to build properly with the secondary toolchain.  As a consequence of this, it will be necessary to implement a blacklist (or whitelist) of specific recipes that are known to work.  This way only supported components can be build by the user, avoid numerous complaints and unresolvable defects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The SDK generated by OpenEmbedded-Core also includes the included toolchain components.  It would be useful to also provide support for the secondary toolchain within the SDK environment.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Bitbake variables ===&lt;br /&gt;
&lt;br /&gt;
A set of common bitbake variables, defined in meta/conf/bitbake.conf, are used to define how to run the toolchain components and the proper arguments.&lt;br /&gt;
&lt;br /&gt;
A number of key items may need to be changed, depending on the toolchain being provided.  These items may include:&lt;br /&gt;
&lt;br /&gt;
   * TARGET_CPPFLAGS&lt;br /&gt;
   * TARGET_CFLAGS&lt;br /&gt;
   * TARGET_CXXFLAGS&lt;br /&gt;
   * TARGET_LDFLAGS&lt;br /&gt;
   * CC&lt;br /&gt;
   * CXX&lt;br /&gt;
   * F77&lt;br /&gt;
   * CPP&lt;br /&gt;
   * LD&lt;br /&gt;
   * CCLD&lt;br /&gt;
   * AR&lt;br /&gt;
   * AS&lt;br /&gt;
   * RANLIB&lt;br /&gt;
   * STRIP&lt;br /&gt;
   * OBJCOPY&lt;br /&gt;
   * OBJDUMP&lt;br /&gt;
   * NM&lt;br /&gt;
   * SELECTED_OPTIMIZATION&lt;br /&gt;
      * FULL_OPTIMIZATION&lt;br /&gt;
      * DEBUG_OPTIMIZATION&lt;br /&gt;
&lt;br /&gt;
Each of the above items has a default definition within the meta/conf/bitbake.conf file.  In addition, many of the components are based on specific tune variables such as:&lt;br /&gt;
&lt;br /&gt;
   * TUNE_CCARGS&lt;br /&gt;
   * TUNE_LDARGS&lt;br /&gt;
   * TUNE_ASARGS&lt;br /&gt;
&lt;br /&gt;
Deciding which items need to be overridden is up to the author of the layer.  It is expected that only a subset of the above referenced variables will need secondary toolchain specific versions for most implementations.&lt;br /&gt;
&lt;br /&gt;
It is suggested that the secondary toolchain values be defined in a single configuration file.  Within the example this is &amp;quot;conf/tc-example.conf&amp;quot;.  The standard name for the file should be &#039;conf/tc-&amp;lt;toolchain&amp;gt;.conf&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Override ===&lt;br /&gt;
&lt;br /&gt;
In order to allow for the layer to selectively override the variables listed above, a standard override syntax is needed.&lt;br /&gt;
&lt;br /&gt;
The standard override syntax will be &#039;toolchain-${TOOLCHAIN}&#039;.  This will allow us to specify multiple alternative and primary toolchain combinations as necessary.&lt;br /&gt;
&lt;br /&gt;
Each of the toolchain related variables can then be overridden using the standard override syntax: &amp;lt;var&amp;gt;_toolchain-&amp;lt;toolchain&amp;gt;, such as:&lt;br /&gt;
&lt;br /&gt;
CC_toolchain-icc = &amp;quot;icc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In order for an individual recipe to use the secondary toolchain, the user would define: TOOLCHAIN_pn-&amp;lt;recipe&amp;gt; = &#039;toolchain&#039;, such as:&lt;br /&gt;
&lt;br /&gt;
TOOLCHAIN_pn-bash = &amp;quot;icc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The OVERRIDE is implemented in the tc-secondary.bbclass in the example.&lt;br /&gt;
&lt;br /&gt;
=== Blacklist/Whitelist ===&lt;br /&gt;
&lt;br /&gt;
A standard blacklist/whitelist facility is to be implemented.  This facility is independent of the existing blacklist class that is part of OpenEmbedded-Core.&lt;br /&gt;
&lt;br /&gt;
Similar to the existing blacklist class, you will be able to define a blacklist, per toolchain type, such as:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
or alternatively create a whitelist facility using:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
   TCWHITELIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Using the second approach will allow you to blacklist all recipes, and only enable those known to work with the alternative toolchain.  &lt;br /&gt;
&lt;br /&gt;
The blacklist items should be defined within conf/tc-&amp;lt;toolchain&amp;gt;-blacklist.conf.  The validation of the blacklist should use the standard tc-blacklist.bbclass implementation available within the example.&lt;br /&gt;
&lt;br /&gt;
=== SDK ===&lt;br /&gt;
&lt;br /&gt;
MGH: Add SDK extension details&lt;br /&gt;
&lt;br /&gt;
== Implementation Example ==&lt;br /&gt;
&lt;br /&gt;
An example implementation has been created in the layer &amp;quot;meta-tc-example&amp;quot;.  The file format follows:&lt;br /&gt;
&lt;br /&gt;
meta-tc-example/&lt;br /&gt;
meta-tc-example/bin&lt;br /&gt;
meta-tc-example/bin/example-toolchain&lt;br /&gt;
meta-tc-example/conf&lt;br /&gt;
meta-tc-example/conf/layer.conf&lt;br /&gt;
meta-tc-example/conf/tc-example.conf&lt;br /&gt;
meta-tc-example/conf/tc-example-blacklist.conf&lt;br /&gt;
meta-tc-example/classes&lt;br /&gt;
meta-tc-example/classes/tc-secondary.bbclass&lt;br /&gt;
meta-tc-example/classes/tc-blacklist.bbclass&lt;br /&gt;
&lt;br /&gt;
=== conf/layer.conf ===&lt;br /&gt;
&lt;br /&gt;
   # We have a conf and classes directory, append to BBPATH&lt;br /&gt;
   BBPATH .= &amp;quot;:${LAYERDIR}&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # If we have a recipes directory, add to BBFILES&lt;br /&gt;
   #BBFILES += &amp;quot;${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/*/recipes-*/*/*.bbappend&amp;quot;&lt;br /&gt;
   #BBFILE_COLLECTIONS += &amp;quot;tc-example&amp;quot;&lt;br /&gt;
   #BBFILE_PATTERN_tc-example := &amp;quot;^${LAYERDIR}/&amp;quot;&lt;br /&gt;
   #BBFILE_PRIORITY_tc-example = &amp;quot;5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Above is standard layer configuration.  Note, the commented out sections should be re-enabled if the secondary toolchain includes recipes and/or bbappend files.&lt;br /&gt;
&lt;br /&gt;
   PATH := &amp;quot;${PATH}:${LAYERDIR}/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Add to the path a standard system path, a layer specific path.  This is the way you can add a secondary toolchain to the path.&lt;br /&gt;
&lt;br /&gt;
   # Define the alternative toolchain&lt;br /&gt;
   SECONDARYTC = &#039;example&#039;&lt;br /&gt;
   require ${LAYERDIR}/conf/tc-${SECONDARYTC}.conf&lt;br /&gt;
   include ${LAYERDIR}/conf/tc-${SECONDARYTC}-blacklist.conf&lt;br /&gt;
&lt;br /&gt;
Define the alternative toolchain name in SECONDARYTC.  This is then used to bring in the two configuration files.  The first tc-example.conf is required, while the tc-example-blacklist.conf is optional.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example.conf ===&lt;br /&gt;
&lt;br /&gt;
   # Enable the override:&lt;br /&gt;
   INHERIT += &#039;tc-secondary&#039;&lt;br /&gt;
&lt;br /&gt;
This inherit is mandatory and adds the secondary toolchain control class.  All secondary toolchains should contain the same class.&lt;br /&gt;
&lt;br /&gt;
   # Define default system toolchain (default to built-in)&lt;br /&gt;
   TOOLCHAIN = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
Define a reasonable default such as gnu.  The purpose of this default is to allow someone to specify the default or provide default override items for the built-in toolchain.&lt;br /&gt;
&lt;br /&gt;
   # Define a secondary toolchain called &#039;example&#039;&lt;br /&gt;
   # the &#039;example&#039; toolchain can be activated using:&lt;br /&gt;
   #&lt;br /&gt;
   # Per package (preferred):&lt;br /&gt;
   #   TOOLCHAIN_pn-bash = &#039;example&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # Globally:&lt;br /&gt;
   #   TOOLCHAIN = &#039;example&#039;&lt;br /&gt;
   #   TOOLCHAIN_pn-eglibc = &#039;gnu&#039;&lt;br /&gt;
&lt;br /&gt;
The above is an example of how to use the alternative toolchain.&lt;br /&gt;
&lt;br /&gt;
   # When the secondary toolchain is used, we add an automatic depend...&lt;br /&gt;
   DEPENDS_append_toolchain-example = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # ...the depend can be provided by a recipe or as an ASSUME_PROVIDED&lt;br /&gt;
   ASSUME_PROVIDED_append = &amp;quot; virtual/TOOLCHAIN-EXAMPLE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Use the above as an example on how to add additional dependencies to specific packages.  This can be used to trigger a recipe to build.&lt;br /&gt;
&lt;br /&gt;
   # Default values from bitbake.conf...&lt;br /&gt;
   # Variables with a &#039;*&#039; are things likely to need to be overridden:&lt;br /&gt;
   #&lt;br /&gt;
   #   FULL_OPTIMIZATION = &amp;quot;-O2 -pipe ${DEBUG_FLAGS}&amp;quot;&lt;br /&gt;
   #   DEBUG_OPTIMIZATION = &amp;quot;-O -fno-omit-frame-pointer ${DEBUG_FLAGS} -pipe&amp;quot;&lt;br /&gt;
   #   SELECTED_OPTIMIZATION = &amp;quot;${@d.getVar([&#039;FULL_OPTIMIZATION&#039;, &#039;DEBUG_OPTIMIZATION&#039;][d.getVar(&#039;DEBUG_BUILD&#039;, True) == &#039;1&#039;], True)}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   # * TOOLCHAIN_OPTIONS = &amp;quot; --sysroot=${STAGING_DIR_TARGET}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * TARGET_CPPFLAGS = &amp;quot;&amp;quot;&lt;br /&gt;
   # * TARGET_CFLAGS = &amp;quot;${TARGET_CPPFLAGS} ${SELECTED_OPTIMIZATION}&amp;quot;&lt;br /&gt;
   # * TARGET CXXFLAGS = &amp;quot;${TARGET_CFLAGS} -fpermissive&amp;quot;&lt;br /&gt;
   # * TARGET_LDFLAGS = &amp;quot;-Wl,-O1 ${TARGET_LINK_HASH_STYLE}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   TARGET_CC_ARCH = &amp;quot;${TUNE_CCARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_LD_ARCH = &amp;quot;${TUNE_LDARGS}&amp;quot;&lt;br /&gt;
   #   TARGET_AS_ARCH = &amp;quot;${TUNE_ASARGS}&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   #   HOST_CC_ARCH = &amp;quot;${TARGET_CC_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_LD_ARCH = &amp;quot;${TARGET_LD_ARCH}&amp;quot;&lt;br /&gt;
   #   HOST_AS_ARCH = &amp;quot;${TARGET_AS_ARCH}&amp;quot;&lt;br /&gt;
   # &lt;br /&gt;
   # * CC = &amp;quot;${CCACHE}${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CXX = &amp;quot;${CCACHE}${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * F77 = &amp;quot;${CCACHE}${HOST_PREFIX}g77 ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   # * CPP = &amp;quot;${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   # * LD = &amp;quot;${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
   # * CCLD = &amp;quot;${CC}&amp;quot;&lt;br /&gt;
   #   AR = &amp;quot;${HOST_PREFIX}ar&amp;quot;&lt;br /&gt;
   #   AS = &amp;quot;${HOST_PREFIX}as ${HOST_AS_ARCH}&amp;quot;&lt;br /&gt;
   #   RANLIB = &amp;quot;${HOST_PREFIX}ranlib&amp;quot;&lt;br /&gt;
   #   STRIP = &amp;quot;${HOST_PREFIX}strip&amp;quot;&lt;br /&gt;
   #   OBJCOPY = &amp;quot;${HOST_PREFIX}objcopy&amp;quot;&lt;br /&gt;
   #   OBJDUMP = &amp;quot;${HOST_PREFIX}objdump&amp;quot;&lt;br /&gt;
   #   NM = &amp;quot;${HOST_PREFIX}nm&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   # Override values:&lt;br /&gt;
   export CC_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   export CXX_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
   export CPP_toolchain-example = &amp;quot;example-toolchain ${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}&amp;quot;&lt;br /&gt;
   export LD_toolchain-example  = &amp;quot;example-toolchain ${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The above implements the necessary overrides for the example toolchain.&lt;br /&gt;
&lt;br /&gt;
=== conf/tc-example-blacklist.conf ===&lt;br /&gt;
&lt;br /&gt;
Example configuration file that enables the blacklist and defines the defaults.&lt;br /&gt;
&lt;br /&gt;
   INHERIT += &#039;tc-blacklist&#039;&lt;br /&gt;
   &lt;br /&gt;
   # Blacklist certain items...&lt;br /&gt;
   TCBLACKLIST[eglibc] = &#039;example&#039;&lt;br /&gt;
   TCBLACKLIST[bash] = &#039;example&#039;&lt;br /&gt;
   &lt;br /&gt;
   #&lt;br /&gt;
   # or&lt;br /&gt;
   #&lt;br /&gt;
   &lt;br /&gt;
   # Switch to a global blacklist and whitelist situation...&lt;br /&gt;
   # TCBLACKLIST = &#039;example&#039;&lt;br /&gt;
   # TCWHITELIST[bash] = &#039;example&#039;&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-secondary.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # In order to add overrides, we need to do it later then in the layers.conf&lt;br /&gt;
   # the only standard way is using an inherit, which requires a bbclass&lt;br /&gt;
   &lt;br /&gt;
   # Add the necessary override&lt;br /&gt;
   TOOLCHAINOVERRIDES = &amp;quot;:toolchain-${TOOLCHAIN}&amp;quot;&lt;br /&gt;
   TOOLCHAINOVERRIDES[vardepsexclude] = &amp;quot;TOOLCHAIN&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   OVERRIDES .= &amp;quot;${TOOLCHAINOVERRIDES}&amp;quot;&lt;br /&gt;
   OVERRIDES[vardepsexclude] += &amp;quot;TOOLCHAINOVERRIDES&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== classes/tc-blacklist.bbclass ===&lt;br /&gt;
&lt;br /&gt;
This is the standard secondary toolchain blacklist class.  It should be the same in all secondary toolchain layers.&lt;br /&gt;
&lt;br /&gt;
   # Implement blacklist/whitelist functionality for alternative toolchains&lt;br /&gt;
   # Based on the oe-core blacklist bclass&lt;br /&gt;
   #&lt;br /&gt;
   # To add a blacklisted package:&lt;br /&gt;
   #   TCBLACKLIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   #&lt;br /&gt;
   # To blacklist everything, and whitelist a package:&lt;br /&gt;
   #   TCBLACKLIST = &#039;toolchain&#039;&lt;br /&gt;
   #   TCWHITELIST[pn] = &#039;toolchain&#039;&lt;br /&gt;
   &lt;br /&gt;
   python () {&lt;br /&gt;
       tc = d.getVar(&#039;TOOLCHAIN&#039;, True)&lt;br /&gt;
       pn = d.getVar(&#039;PN&#039;, True)&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVarFlag(&#039;TCBLACKLIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and blacklist == tc:&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   &lt;br /&gt;
       blacklist = d.getVar(&#039;TCBLACKLIST&#039;, True)&lt;br /&gt;
       whitelist = d.getVarFlag(&#039;TCWHITELIST&#039;, pn, True)&lt;br /&gt;
   &lt;br /&gt;
       if blacklist and (not whitelist or whitelist != tc):&lt;br /&gt;
           raise bb.parse.SkipPackage(&amp;quot;Recipe &#039;%s&#039; is blacklisted for the &#039;%s&#039; toolchain&amp;quot; % (pn, tc))&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Further comments and information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Dev]]&lt;br /&gt;
[[Category:Layers]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5341</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5341"/>
		<updated>2012-11-13T22:48:01Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Blacklist/Whitelist */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
&lt;br /&gt;
In OpenEmbedded-Core there in an included toolchain that is built up of GNU binutils, gcc, and eglibc.  In addition related components such as gdb, cross-prelink, mklibs and others provider additional toolchain functionality.  In this document we focus on explaining best practices for including an additional toolchain that is capable of assembling, compiling and linking code.  This document does not cover replacing the existing toolchain or toolchain components with external elements.&lt;br /&gt;
&lt;br /&gt;
Many companies have commercial / highly optimized toolchains for specific purposes, such as ICC from Intel, LLVM, ARM Ltd toolchains, etc..  In some cases, these highly optimized toolchains may result in better performance for some applications, however they are often not generally applicable as they can not compile all of the system software.  So instead of replacing the included GNU toolchain, a mechanism for providing an alternative/secondary toolchain is desired.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchains should be implemented in a layer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In order to facilitate re-use and make it easier to completely disable the secondary toolchain, a layer must be used to implement the secondary toolchain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchain must be generally compatible with GNU toolchain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The secondary toolchain must be generally compatible with the idea of sysroots, linking to the defined libc, and various GNU conventions.  This compatibility may be implemented directly by the secondary toolchain or via a wrapper of some type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Per recipe selection of toolchain usage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A mechanism is needed to activate this alternative toolchain on a per-recipe basis.  Using variables it should be possible to specify on a per-recipe basis which toolchain should be used, leaving the default up to the user.  (It&#039;s assumed if the user does not select a default, the system GNU toolchain will be defaulted.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blacklist/Whitelist&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even with the requirement to be generally compatible, we can not expect all of the possible recipes to build properly with the secondary toolchain.  As a consequence of this, it will be necessary to implement a blacklist (or whitelist) of specific recipes that are known to work.  This way only supported components can be build by the user, avoid numerous complaints and unresolvable defects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The SDK generated by OpenEmbedded-Core also includes the included toolchain components.  It would be useful to also provide support for the secondary toolchain within the SDK environment.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Bitbake variables ===&lt;br /&gt;
&lt;br /&gt;
A set of common bitbake variables, defined in meta/conf/bitbake.conf, are used to define how to run the toolchain components and the proper arguments.&lt;br /&gt;
&lt;br /&gt;
A number of key items may need to be changed, depending on the toolchain being provided.  These items may include:&lt;br /&gt;
&lt;br /&gt;
   * TARGET_CPPFLAGS&lt;br /&gt;
   * TARGET_CFLAGS&lt;br /&gt;
   * TARGET_CXXFLAGS&lt;br /&gt;
   * TARGET_LDFLAGS&lt;br /&gt;
   * CC&lt;br /&gt;
   * CXX&lt;br /&gt;
   * F77&lt;br /&gt;
   * CPP&lt;br /&gt;
   * LD&lt;br /&gt;
   * CCLD&lt;br /&gt;
   * AR&lt;br /&gt;
   * AS&lt;br /&gt;
   * RANLIB&lt;br /&gt;
   * STRIP&lt;br /&gt;
   * OBJCOPY&lt;br /&gt;
   * OBJDUMP&lt;br /&gt;
   * NM&lt;br /&gt;
   * SELECTED_OPTIMIZATION&lt;br /&gt;
      * FULL_OPTIMIZATION&lt;br /&gt;
      * DEBUG_OPTIMIZATION&lt;br /&gt;
&lt;br /&gt;
Each of the above items has a default definition within the meta/conf/bitbake.conf file.  In addition, many of the components are based on specific tune variables such as:&lt;br /&gt;
&lt;br /&gt;
   * TUNE_CCARGS&lt;br /&gt;
   * TUNE_LDARGS&lt;br /&gt;
   * TUNE_ASARGS&lt;br /&gt;
&lt;br /&gt;
Deciding which items need to be overridden is up to the author of the layer.  It is expected that only a subset of the above referenced variables will need secondary toolchain specific versions for most implementations.&lt;br /&gt;
&lt;br /&gt;
It is suggested that the secondary toolchain values be defined in a single configuration file.  Within the example this is &amp;quot;conf/tc-example.conf&amp;quot;.  The standard name for the file should be &#039;conf/tc-&amp;lt;toolchain&amp;gt;.conf&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Override ===&lt;br /&gt;
&lt;br /&gt;
In order to allow for the layer to selectively override the variables listed above, a standard override syntax is needed.&lt;br /&gt;
&lt;br /&gt;
The standard override syntax will be &#039;toolchain-${TOOLCHAIN}&#039;.  This will allow us to specify multiple alternative and primary toolchain combinations as necessary.&lt;br /&gt;
&lt;br /&gt;
Each of the toolchain related variables can then be overridden using the standard override syntax: &amp;lt;var&amp;gt;_toolchain-&amp;lt;toolchain&amp;gt;, such as:&lt;br /&gt;
&lt;br /&gt;
CC_toolchain-icc = &amp;quot;icc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In order for an individual recipe to use the secondary toolchain, the user would define: TOOLCHAIN_pn-&amp;lt;recipe&amp;gt; = &#039;toolchain&#039;, such as:&lt;br /&gt;
&lt;br /&gt;
TOOLCHAIN_pn-bash = &amp;quot;icc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The OVERRIDE is implemented in the tc-secondary.bbclass in the example.&lt;br /&gt;
&lt;br /&gt;
=== Blacklist/Whitelist ===&lt;br /&gt;
&lt;br /&gt;
A standard blacklist/whitelist facility is to be implemented.  This facility is independent of the existing blacklist class that is part of OpenEmbedded-Core.&lt;br /&gt;
&lt;br /&gt;
Similar to the existing blacklist class, you will be able to define a blacklist, per toolchain type, such as:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
or alternatively create a whitelist facility using:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
   TCWHITELIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Using the second approach will allow you to blacklist all recipes, and only enable those known to work with the alternative toolchain.  &lt;br /&gt;
&lt;br /&gt;
The blacklist items should be defined within conf/tc-&amp;lt;toolchain&amp;gt;-blacklist.conf.  The validation of the blacklist should use the standard tc-blacklist.bbclass implementation available within the example.&lt;br /&gt;
&lt;br /&gt;
=== SDK ===&lt;br /&gt;
&lt;br /&gt;
MGH: Add SDK extension details&lt;br /&gt;
&lt;br /&gt;
== Implementation Example ==&lt;br /&gt;
&lt;br /&gt;
The following example implements a secondary toolchain.  The example is generated in a new layer named: meta-toolchain-test&lt;br /&gt;
&lt;br /&gt;
MGH: include example here..&lt;br /&gt;
&lt;br /&gt;
== Further comments and information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Dev]]&lt;br /&gt;
[[Category:Layers]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5339</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5339"/>
		<updated>2012-11-13T22:47:31Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Blacklist/Whitelist */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
&lt;br /&gt;
In OpenEmbedded-Core there in an included toolchain that is built up of GNU binutils, gcc, and eglibc.  In addition related components such as gdb, cross-prelink, mklibs and others provider additional toolchain functionality.  In this document we focus on explaining best practices for including an additional toolchain that is capable of assembling, compiling and linking code.  This document does not cover replacing the existing toolchain or toolchain components with external elements.&lt;br /&gt;
&lt;br /&gt;
Many companies have commercial / highly optimized toolchains for specific purposes, such as ICC from Intel, LLVM, ARM Ltd toolchains, etc..  In some cases, these highly optimized toolchains may result in better performance for some applications, however they are often not generally applicable as they can not compile all of the system software.  So instead of replacing the included GNU toolchain, a mechanism for providing an alternative/secondary toolchain is desired.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchains should be implemented in a layer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In order to facilitate re-use and make it easier to completely disable the secondary toolchain, a layer must be used to implement the secondary toolchain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchain must be generally compatible with GNU toolchain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The secondary toolchain must be generally compatible with the idea of sysroots, linking to the defined libc, and various GNU conventions.  This compatibility may be implemented directly by the secondary toolchain or via a wrapper of some type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Per recipe selection of toolchain usage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A mechanism is needed to activate this alternative toolchain on a per-recipe basis.  Using variables it should be possible to specify on a per-recipe basis which toolchain should be used, leaving the default up to the user.  (It&#039;s assumed if the user does not select a default, the system GNU toolchain will be defaulted.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blacklist/Whitelist&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even with the requirement to be generally compatible, we can not expect all of the possible recipes to build properly with the secondary toolchain.  As a consequence of this, it will be necessary to implement a blacklist (or whitelist) of specific recipes that are known to work.  This way only supported components can be build by the user, avoid numerous complaints and unresolvable defects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The SDK generated by OpenEmbedded-Core also includes the included toolchain components.  It would be useful to also provide support for the secondary toolchain within the SDK environment.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Bitbake variables ===&lt;br /&gt;
&lt;br /&gt;
A set of common bitbake variables, defined in meta/conf/bitbake.conf, are used to define how to run the toolchain components and the proper arguments.&lt;br /&gt;
&lt;br /&gt;
A number of key items may need to be changed, depending on the toolchain being provided.  These items may include:&lt;br /&gt;
&lt;br /&gt;
   * TARGET_CPPFLAGS&lt;br /&gt;
   * TARGET_CFLAGS&lt;br /&gt;
   * TARGET_CXXFLAGS&lt;br /&gt;
   * TARGET_LDFLAGS&lt;br /&gt;
   * CC&lt;br /&gt;
   * CXX&lt;br /&gt;
   * F77&lt;br /&gt;
   * CPP&lt;br /&gt;
   * LD&lt;br /&gt;
   * CCLD&lt;br /&gt;
   * AR&lt;br /&gt;
   * AS&lt;br /&gt;
   * RANLIB&lt;br /&gt;
   * STRIP&lt;br /&gt;
   * OBJCOPY&lt;br /&gt;
   * OBJDUMP&lt;br /&gt;
   * NM&lt;br /&gt;
   * SELECTED_OPTIMIZATION&lt;br /&gt;
      * FULL_OPTIMIZATION&lt;br /&gt;
      * DEBUG_OPTIMIZATION&lt;br /&gt;
&lt;br /&gt;
Each of the above items has a default definition within the meta/conf/bitbake.conf file.  In addition, many of the components are based on specific tune variables such as:&lt;br /&gt;
&lt;br /&gt;
   * TUNE_CCARGS&lt;br /&gt;
   * TUNE_LDARGS&lt;br /&gt;
   * TUNE_ASARGS&lt;br /&gt;
&lt;br /&gt;
Deciding which items need to be overridden is up to the author of the layer.  It is expected that only a subset of the above referenced variables will need secondary toolchain specific versions for most implementations.&lt;br /&gt;
&lt;br /&gt;
It is suggested that the secondary toolchain values be defined in a single configuration file.  Within the example this is &amp;quot;conf/tc-example.conf&amp;quot;.  The standard name for the file should be &#039;conf/tc-&amp;lt;toolchain&amp;gt;.conf&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Override ===&lt;br /&gt;
&lt;br /&gt;
In order to allow for the layer to selectively override the variables listed above, a standard override syntax is needed.&lt;br /&gt;
&lt;br /&gt;
The standard override syntax will be &#039;toolchain-${TOOLCHAIN}&#039;.  This will allow us to specify multiple alternative and primary toolchain combinations as necessary.&lt;br /&gt;
&lt;br /&gt;
Each of the toolchain related variables can then be overridden using the standard override syntax: &amp;lt;var&amp;gt;_toolchain-&amp;lt;toolchain&amp;gt;, such as:&lt;br /&gt;
&lt;br /&gt;
CC_toolchain-icc = &amp;quot;icc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In order for an individual recipe to use the secondary toolchain, the user would define: TOOLCHAIN_pn-&amp;lt;recipe&amp;gt; = &#039;toolchain&#039;, such as:&lt;br /&gt;
&lt;br /&gt;
TOOLCHAIN_pn-bash = &amp;quot;icc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The OVERRIDE is implemented in the tc-secondary.bbclass in the example.&lt;br /&gt;
&lt;br /&gt;
=== Blacklist/Whitelist ===&lt;br /&gt;
&lt;br /&gt;
A standard blacklist/whitelist facility is to be implemented.  This facility is independent of the existing blacklist class that is part of OpenEmbedded-Core.&lt;br /&gt;
&lt;br /&gt;
Similar to the existing blacklist class, you will be able to define a blacklist, per toolchain type, such as:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
or alternatively create a whitelist facility using:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
   TCWHITELIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Using the second approach will allow you to blacklist all recipes, and only enable those known to work with the alternative toolchain.  &lt;br /&gt;
&lt;br /&gt;
The blacklist items should be defined within conf/tc-example-blacklist.conf.  The validation of the blacklist should use the standard tc-blacklist.bbclass implementation available within the example.&lt;br /&gt;
&lt;br /&gt;
=== SDK ===&lt;br /&gt;
&lt;br /&gt;
MGH: Add SDK extension details&lt;br /&gt;
&lt;br /&gt;
== Implementation Example ==&lt;br /&gt;
&lt;br /&gt;
The following example implements a secondary toolchain.  The example is generated in a new layer named: meta-toolchain-test&lt;br /&gt;
&lt;br /&gt;
MGH: include example here..&lt;br /&gt;
&lt;br /&gt;
== Further comments and information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Dev]]&lt;br /&gt;
[[Category:Layers]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5337</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5337"/>
		<updated>2012-11-13T22:45:16Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Bitbake variables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
&lt;br /&gt;
In OpenEmbedded-Core there in an included toolchain that is built up of GNU binutils, gcc, and eglibc.  In addition related components such as gdb, cross-prelink, mklibs and others provider additional toolchain functionality.  In this document we focus on explaining best practices for including an additional toolchain that is capable of assembling, compiling and linking code.  This document does not cover replacing the existing toolchain or toolchain components with external elements.&lt;br /&gt;
&lt;br /&gt;
Many companies have commercial / highly optimized toolchains for specific purposes, such as ICC from Intel, LLVM, ARM Ltd toolchains, etc..  In some cases, these highly optimized toolchains may result in better performance for some applications, however they are often not generally applicable as they can not compile all of the system software.  So instead of replacing the included GNU toolchain, a mechanism for providing an alternative/secondary toolchain is desired.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchains should be implemented in a layer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In order to facilitate re-use and make it easier to completely disable the secondary toolchain, a layer must be used to implement the secondary toolchain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchain must be generally compatible with GNU toolchain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The secondary toolchain must be generally compatible with the idea of sysroots, linking to the defined libc, and various GNU conventions.  This compatibility may be implemented directly by the secondary toolchain or via a wrapper of some type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Per recipe selection of toolchain usage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A mechanism is needed to activate this alternative toolchain on a per-recipe basis.  Using variables it should be possible to specify on a per-recipe basis which toolchain should be used, leaving the default up to the user.  (It&#039;s assumed if the user does not select a default, the system GNU toolchain will be defaulted.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blacklist/Whitelist&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even with the requirement to be generally compatible, we can not expect all of the possible recipes to build properly with the secondary toolchain.  As a consequence of this, it will be necessary to implement a blacklist (or whitelist) of specific recipes that are known to work.  This way only supported components can be build by the user, avoid numerous complaints and unresolvable defects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The SDK generated by OpenEmbedded-Core also includes the included toolchain components.  It would be useful to also provide support for the secondary toolchain within the SDK environment.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Bitbake variables ===&lt;br /&gt;
&lt;br /&gt;
A set of common bitbake variables, defined in meta/conf/bitbake.conf, are used to define how to run the toolchain components and the proper arguments.&lt;br /&gt;
&lt;br /&gt;
A number of key items may need to be changed, depending on the toolchain being provided.  These items may include:&lt;br /&gt;
&lt;br /&gt;
   * TARGET_CPPFLAGS&lt;br /&gt;
   * TARGET_CFLAGS&lt;br /&gt;
   * TARGET_CXXFLAGS&lt;br /&gt;
   * TARGET_LDFLAGS&lt;br /&gt;
   * CC&lt;br /&gt;
   * CXX&lt;br /&gt;
   * F77&lt;br /&gt;
   * CPP&lt;br /&gt;
   * LD&lt;br /&gt;
   * CCLD&lt;br /&gt;
   * AR&lt;br /&gt;
   * AS&lt;br /&gt;
   * RANLIB&lt;br /&gt;
   * STRIP&lt;br /&gt;
   * OBJCOPY&lt;br /&gt;
   * OBJDUMP&lt;br /&gt;
   * NM&lt;br /&gt;
   * SELECTED_OPTIMIZATION&lt;br /&gt;
      * FULL_OPTIMIZATION&lt;br /&gt;
      * DEBUG_OPTIMIZATION&lt;br /&gt;
&lt;br /&gt;
Each of the above items has a default definition within the meta/conf/bitbake.conf file.  In addition, many of the components are based on specific tune variables such as:&lt;br /&gt;
&lt;br /&gt;
   * TUNE_CCARGS&lt;br /&gt;
   * TUNE_LDARGS&lt;br /&gt;
   * TUNE_ASARGS&lt;br /&gt;
&lt;br /&gt;
Deciding which items need to be overridden is up to the author of the layer.  It is expected that only a subset of the above referenced variables will need secondary toolchain specific versions for most implementations.&lt;br /&gt;
&lt;br /&gt;
It is suggested that the secondary toolchain values be defined in a single configuration file.  Within the example this is &amp;quot;conf/tc-example.conf&amp;quot;.  The standard name for the file should be &#039;conf/tc-&amp;lt;toolchain&amp;gt;.conf&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Override ===&lt;br /&gt;
&lt;br /&gt;
In order to allow for the layer to selectively override the variables listed above, a standard override syntax is needed.&lt;br /&gt;
&lt;br /&gt;
The standard override syntax will be &#039;toolchain-${TOOLCHAIN}&#039;.  This will allow us to specify multiple alternative and primary toolchain combinations as necessary.&lt;br /&gt;
&lt;br /&gt;
Each of the toolchain related variables can then be overridden using the standard override syntax: &amp;lt;var&amp;gt;_toolchain-&amp;lt;toolchain&amp;gt;, such as:&lt;br /&gt;
&lt;br /&gt;
CC_toolchain-icc = &amp;quot;icc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In order for an individual recipe to use the secondary toolchain, the user would define: TOOLCHAIN_pn-&amp;lt;recipe&amp;gt; = &#039;toolchain&#039;, such as:&lt;br /&gt;
&lt;br /&gt;
TOOLCHAIN_pn-bash = &amp;quot;icc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The OVERRIDE is implemented in the tc-secondary.bbclass in the example.&lt;br /&gt;
&lt;br /&gt;
=== Blacklist/Whitelist ===&lt;br /&gt;
&lt;br /&gt;
A standard blacklist/whitelist facility is to be implemented.  This facility is independent of the existing blacklist class that is part of OpenEmbedded-Core.&lt;br /&gt;
&lt;br /&gt;
Similar to the existing blacklist class, you will be able to define a blacklist, per toolchain type, such as:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
or alternatively create a whitelist facility using:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
   TCWHITELIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Using the second approach will allow you to blacklist all recipes, and only enable those known to work with the alternative toolchain.  A standard implementation is available in the secondary toolchain example.&lt;br /&gt;
&lt;br /&gt;
=== SDK ===&lt;br /&gt;
&lt;br /&gt;
MGH: Add SDK extension details&lt;br /&gt;
&lt;br /&gt;
== Implementation Example ==&lt;br /&gt;
&lt;br /&gt;
The following example implements a secondary toolchain.  The example is generated in a new layer named: meta-toolchain-test&lt;br /&gt;
&lt;br /&gt;
MGH: include example here..&lt;br /&gt;
&lt;br /&gt;
== Further comments and information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Dev]]&lt;br /&gt;
[[Category:Layers]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5335</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5335"/>
		<updated>2012-11-13T22:39:58Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Override */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
&lt;br /&gt;
In OpenEmbedded-Core there in an included toolchain that is built up of GNU binutils, gcc, and eglibc.  In addition related components such as gdb, cross-prelink, mklibs and others provider additional toolchain functionality.  In this document we focus on explaining best practices for including an additional toolchain that is capable of assembling, compiling and linking code.  This document does not cover replacing the existing toolchain or toolchain components with external elements.&lt;br /&gt;
&lt;br /&gt;
Many companies have commercial / highly optimized toolchains for specific purposes, such as ICC from Intel, LLVM, ARM Ltd toolchains, etc..  In some cases, these highly optimized toolchains may result in better performance for some applications, however they are often not generally applicable as they can not compile all of the system software.  So instead of replacing the included GNU toolchain, a mechanism for providing an alternative/secondary toolchain is desired.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchains should be implemented in a layer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In order to facilitate re-use and make it easier to completely disable the secondary toolchain, a layer must be used to implement the secondary toolchain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchain must be generally compatible with GNU toolchain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The secondary toolchain must be generally compatible with the idea of sysroots, linking to the defined libc, and various GNU conventions.  This compatibility may be implemented directly by the secondary toolchain or via a wrapper of some type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Per recipe selection of toolchain usage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A mechanism is needed to activate this alternative toolchain on a per-recipe basis.  Using variables it should be possible to specify on a per-recipe basis which toolchain should be used, leaving the default up to the user.  (It&#039;s assumed if the user does not select a default, the system GNU toolchain will be defaulted.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blacklist/Whitelist&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even with the requirement to be generally compatible, we can not expect all of the possible recipes to build properly with the secondary toolchain.  As a consequence of this, it will be necessary to implement a blacklist (or whitelist) of specific recipes that are known to work.  This way only supported components can be build by the user, avoid numerous complaints and unresolvable defects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The SDK generated by OpenEmbedded-Core also includes the included toolchain components.  It would be useful to also provide support for the secondary toolchain within the SDK environment.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Bitbake variables ===&lt;br /&gt;
&lt;br /&gt;
A set of common bitbake variables, defined in meta/conf/bitbake.conf, are used to define how to run the toolchain components and the proper arguments.&lt;br /&gt;
&lt;br /&gt;
A number of key items may need to be changed, depending on the toolchain being provided.  These items may include:&lt;br /&gt;
&lt;br /&gt;
   * TARGET_CPPFLAGS&lt;br /&gt;
   * TARGET_CFLAGS&lt;br /&gt;
   * TARGET_CXXFLAGS&lt;br /&gt;
   * TARGET_LDFLAGS&lt;br /&gt;
   * CC&lt;br /&gt;
   * CXX&lt;br /&gt;
   * F77&lt;br /&gt;
   * CPP&lt;br /&gt;
   * LD&lt;br /&gt;
   * CCLD&lt;br /&gt;
   * AR&lt;br /&gt;
   * AS&lt;br /&gt;
   * RANLIB&lt;br /&gt;
   * STRIP&lt;br /&gt;
   * OBJCOPY&lt;br /&gt;
   * OBJDUMP&lt;br /&gt;
   * NM&lt;br /&gt;
   * SELECTED_OPTIMIZATION&lt;br /&gt;
      * FULL_OPTIMIZATION&lt;br /&gt;
      * DEBUG_OPTIMIZATION&lt;br /&gt;
&lt;br /&gt;
Each of the above items has a default definition within the meta/conf/bitbake.conf file.  In addition, many of the components are based on specific tune variables such as:&lt;br /&gt;
&lt;br /&gt;
   * TUNE_CCARGS&lt;br /&gt;
   * TUNE_LDARGS&lt;br /&gt;
   * TUNE_ASARGS&lt;br /&gt;
&lt;br /&gt;
Deciding which items need to be overridden is up to the author of the layer.  It is expected that only a subset of the above referenced variables will need secondary toolchain specific versions for most implementations.&lt;br /&gt;
&lt;br /&gt;
=== Override ===&lt;br /&gt;
&lt;br /&gt;
In order to allow for the layer to selectively override the variables listed above, a standard override syntax is needed.&lt;br /&gt;
&lt;br /&gt;
The standard override syntax will be &#039;toolchain-${TOOLCHAIN}&#039;.  This will allow us to specify multiple alternative and primary toolchain combinations as necessary.&lt;br /&gt;
&lt;br /&gt;
Each of the toolchain related variables can then be overridden using the standard override syntax: &amp;lt;var&amp;gt;_toolchain-&amp;lt;toolchain&amp;gt;, such as:&lt;br /&gt;
&lt;br /&gt;
CC_toolchain-icc = &amp;quot;icc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In order for an individual recipe to use the secondary toolchain, the user would define: TOOLCHAIN_pn-&amp;lt;recipe&amp;gt; = &#039;toolchain&#039;, such as:&lt;br /&gt;
&lt;br /&gt;
TOOLCHAIN_pn-bash = &amp;quot;icc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The OVERRIDE is implemented in the tc-secondary.bbclass in the example.&lt;br /&gt;
&lt;br /&gt;
=== Blacklist/Whitelist ===&lt;br /&gt;
&lt;br /&gt;
A standard blacklist/whitelist facility is to be implemented.  This facility is independent of the existing blacklist class that is part of OpenEmbedded-Core.&lt;br /&gt;
&lt;br /&gt;
Similar to the existing blacklist class, you will be able to define a blacklist, per toolchain type, such as:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
or alternatively create a whitelist facility using:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
   TCWHITELIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Using the second approach will allow you to blacklist all recipes, and only enable those known to work with the alternative toolchain.  A standard implementation is available in the secondary toolchain example.&lt;br /&gt;
&lt;br /&gt;
=== SDK ===&lt;br /&gt;
&lt;br /&gt;
MGH: Add SDK extension details&lt;br /&gt;
&lt;br /&gt;
== Implementation Example ==&lt;br /&gt;
&lt;br /&gt;
The following example implements a secondary toolchain.  The example is generated in a new layer named: meta-toolchain-test&lt;br /&gt;
&lt;br /&gt;
MGH: include example here..&lt;br /&gt;
&lt;br /&gt;
== Further comments and information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Dev]]&lt;br /&gt;
[[Category:Layers]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5333</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5333"/>
		<updated>2012-11-13T22:39:03Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Blacklist/Whitelist */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
&lt;br /&gt;
In OpenEmbedded-Core there in an included toolchain that is built up of GNU binutils, gcc, and eglibc.  In addition related components such as gdb, cross-prelink, mklibs and others provider additional toolchain functionality.  In this document we focus on explaining best practices for including an additional toolchain that is capable of assembling, compiling and linking code.  This document does not cover replacing the existing toolchain or toolchain components with external elements.&lt;br /&gt;
&lt;br /&gt;
Many companies have commercial / highly optimized toolchains for specific purposes, such as ICC from Intel, LLVM, ARM Ltd toolchains, etc..  In some cases, these highly optimized toolchains may result in better performance for some applications, however they are often not generally applicable as they can not compile all of the system software.  So instead of replacing the included GNU toolchain, a mechanism for providing an alternative/secondary toolchain is desired.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchains should be implemented in a layer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In order to facilitate re-use and make it easier to completely disable the secondary toolchain, a layer must be used to implement the secondary toolchain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchain must be generally compatible with GNU toolchain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The secondary toolchain must be generally compatible with the idea of sysroots, linking to the defined libc, and various GNU conventions.  This compatibility may be implemented directly by the secondary toolchain or via a wrapper of some type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Per recipe selection of toolchain usage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A mechanism is needed to activate this alternative toolchain on a per-recipe basis.  Using variables it should be possible to specify on a per-recipe basis which toolchain should be used, leaving the default up to the user.  (It&#039;s assumed if the user does not select a default, the system GNU toolchain will be defaulted.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blacklist/Whitelist&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even with the requirement to be generally compatible, we can not expect all of the possible recipes to build properly with the secondary toolchain.  As a consequence of this, it will be necessary to implement a blacklist (or whitelist) of specific recipes that are known to work.  This way only supported components can be build by the user, avoid numerous complaints and unresolvable defects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The SDK generated by OpenEmbedded-Core also includes the included toolchain components.  It would be useful to also provide support for the secondary toolchain within the SDK environment.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Bitbake variables ===&lt;br /&gt;
&lt;br /&gt;
A set of common bitbake variables, defined in meta/conf/bitbake.conf, are used to define how to run the toolchain components and the proper arguments.&lt;br /&gt;
&lt;br /&gt;
A number of key items may need to be changed, depending on the toolchain being provided.  These items may include:&lt;br /&gt;
&lt;br /&gt;
   * TARGET_CPPFLAGS&lt;br /&gt;
   * TARGET_CFLAGS&lt;br /&gt;
   * TARGET_CXXFLAGS&lt;br /&gt;
   * TARGET_LDFLAGS&lt;br /&gt;
   * CC&lt;br /&gt;
   * CXX&lt;br /&gt;
   * F77&lt;br /&gt;
   * CPP&lt;br /&gt;
   * LD&lt;br /&gt;
   * CCLD&lt;br /&gt;
   * AR&lt;br /&gt;
   * AS&lt;br /&gt;
   * RANLIB&lt;br /&gt;
   * STRIP&lt;br /&gt;
   * OBJCOPY&lt;br /&gt;
   * OBJDUMP&lt;br /&gt;
   * NM&lt;br /&gt;
   * SELECTED_OPTIMIZATION&lt;br /&gt;
      * FULL_OPTIMIZATION&lt;br /&gt;
      * DEBUG_OPTIMIZATION&lt;br /&gt;
&lt;br /&gt;
Each of the above items has a default definition within the meta/conf/bitbake.conf file.  In addition, many of the components are based on specific tune variables such as:&lt;br /&gt;
&lt;br /&gt;
   * TUNE_CCARGS&lt;br /&gt;
   * TUNE_LDARGS&lt;br /&gt;
   * TUNE_ASARGS&lt;br /&gt;
&lt;br /&gt;
Deciding which items need to be overridden is up to the author of the layer.  It is expected that only a subset of the above referenced variables will need secondary toolchain specific versions for most implementations.&lt;br /&gt;
&lt;br /&gt;
=== Override ===&lt;br /&gt;
&lt;br /&gt;
In order to allow for the layer to selectively override the variables listed above, a standard override syntax is needed.&lt;br /&gt;
&lt;br /&gt;
The standard override syntax will be &#039;toolchain-${TOOLCHAIN}&#039;.  This will allow us to specify multiple alternative and primary toolchain combinations as necessary.&lt;br /&gt;
&lt;br /&gt;
Each of the toolchain related variables can then be overridden using the standard override syntax: &amp;lt;var&amp;gt;_toolchain-&amp;lt;toolchain&amp;gt;, such as:&lt;br /&gt;
&lt;br /&gt;
CC_toolchain-icc = &amp;quot;icc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In order for an individual recipe to use the secondary toolchain, the user would define: TOOLCHAIN_pn-&amp;lt;recipe&amp;gt; = &#039;toolchain&#039;, such as:&lt;br /&gt;
&lt;br /&gt;
TOOLCHAIN_pn-bash = &amp;quot;icc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Blacklist/Whitelist ===&lt;br /&gt;
&lt;br /&gt;
A standard blacklist/whitelist facility is to be implemented.  This facility is independent of the existing blacklist class that is part of OpenEmbedded-Core.&lt;br /&gt;
&lt;br /&gt;
Similar to the existing blacklist class, you will be able to define a blacklist, per toolchain type, such as:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
or alternatively create a whitelist facility using:&lt;br /&gt;
&lt;br /&gt;
   TCBLACKLIST = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
   TCWHITELIST[pn] = &amp;quot;toolchain&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Using the second approach will allow you to blacklist all recipes, and only enable those known to work with the alternative toolchain.  A standard implementation is available in the secondary toolchain example.&lt;br /&gt;
&lt;br /&gt;
=== SDK ===&lt;br /&gt;
&lt;br /&gt;
MGH: Add SDK extension details&lt;br /&gt;
&lt;br /&gt;
== Implementation Example ==&lt;br /&gt;
&lt;br /&gt;
The following example implements a secondary toolchain.  The example is generated in a new layer named: meta-toolchain-test&lt;br /&gt;
&lt;br /&gt;
MGH: include example here..&lt;br /&gt;
&lt;br /&gt;
== Further comments and information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Dev]]&lt;br /&gt;
[[Category:Layers]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5331</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5331"/>
		<updated>2012-11-13T19:10:25Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Implementation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
&lt;br /&gt;
In OpenEmbedded-Core there in an included toolchain that is built up of GNU binutils, gcc, and eglibc.  In addition related components such as gdb, cross-prelink, mklibs and others provider additional toolchain functionality.  In this document we focus on explaining best practices for including an additional toolchain that is capable of assembling, compiling and linking code.  This document does not cover replacing the existing toolchain or toolchain components with external elements.&lt;br /&gt;
&lt;br /&gt;
Many companies have commercial / highly optimized toolchains for specific purposes, such as ICC from Intel, LLVM, ARM Ltd toolchains, etc..  In some cases, these highly optimized toolchains may result in better performance for some applications, however they are often not generally applicable as they can not compile all of the system software.  So instead of replacing the included GNU toolchain, a mechanism for providing an alternative/secondary toolchain is desired.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchains should be implemented in a layer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In order to facilitate re-use and make it easier to completely disable the secondary toolchain, a layer must be used to implement the secondary toolchain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchain must be generally compatible with GNU toolchain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The secondary toolchain must be generally compatible with the idea of sysroots, linking to the defined libc, and various GNU conventions.  This compatibility may be implemented directly by the secondary toolchain or via a wrapper of some type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Per recipe selection of toolchain usage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A mechanism is needed to activate this alternative toolchain on a per-recipe basis.  Using variables it should be possible to specify on a per-recipe basis which toolchain should be used, leaving the default up to the user.  (It&#039;s assumed if the user does not select a default, the system GNU toolchain will be defaulted.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blacklist/Whitelist&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even with the requirement to be generally compatible, we can not expect all of the possible recipes to build properly with the secondary toolchain.  As a consequence of this, it will be necessary to implement a blacklist (or whitelist) of specific recipes that are known to work.  This way only supported components can be build by the user, avoid numerous complaints and unresolvable defects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The SDK generated by OpenEmbedded-Core also includes the included toolchain components.  It would be useful to also provide support for the secondary toolchain within the SDK environment.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Bitbake variables ===&lt;br /&gt;
&lt;br /&gt;
A set of common bitbake variables, defined in meta/conf/bitbake.conf, are used to define how to run the toolchain components and the proper arguments.&lt;br /&gt;
&lt;br /&gt;
A number of key items may need to be changed, depending on the toolchain being provided.  These items may include:&lt;br /&gt;
&lt;br /&gt;
   * TARGET_CPPFLAGS&lt;br /&gt;
   * TARGET_CFLAGS&lt;br /&gt;
   * TARGET_CXXFLAGS&lt;br /&gt;
   * TARGET_LDFLAGS&lt;br /&gt;
   * CC&lt;br /&gt;
   * CXX&lt;br /&gt;
   * F77&lt;br /&gt;
   * CPP&lt;br /&gt;
   * LD&lt;br /&gt;
   * CCLD&lt;br /&gt;
   * AR&lt;br /&gt;
   * AS&lt;br /&gt;
   * RANLIB&lt;br /&gt;
   * STRIP&lt;br /&gt;
   * OBJCOPY&lt;br /&gt;
   * OBJDUMP&lt;br /&gt;
   * NM&lt;br /&gt;
   * SELECTED_OPTIMIZATION&lt;br /&gt;
      * FULL_OPTIMIZATION&lt;br /&gt;
      * DEBUG_OPTIMIZATION&lt;br /&gt;
&lt;br /&gt;
Each of the above items has a default definition within the meta/conf/bitbake.conf file.  In addition, many of the components are based on specific tune variables such as:&lt;br /&gt;
&lt;br /&gt;
   * TUNE_CCARGS&lt;br /&gt;
   * TUNE_LDARGS&lt;br /&gt;
   * TUNE_ASARGS&lt;br /&gt;
&lt;br /&gt;
Deciding which items need to be overridden is up to the author of the layer.  It is expected that only a subset of the above referenced variables will need secondary toolchain specific versions for most implementations.&lt;br /&gt;
&lt;br /&gt;
=== Override ===&lt;br /&gt;
&lt;br /&gt;
In order to allow for the layer to selectively override the variables listed above, a standard override syntax is needed.&lt;br /&gt;
&lt;br /&gt;
The standard override syntax will be &#039;toolchain-${TOOLCHAIN}&#039;.  This will allow us to specify multiple alternative and primary toolchain combinations as necessary.&lt;br /&gt;
&lt;br /&gt;
Each of the toolchain related variables can then be overridden using the standard override syntax: &amp;lt;var&amp;gt;_toolchain-&amp;lt;toolchain&amp;gt;, such as:&lt;br /&gt;
&lt;br /&gt;
CC_toolchain-icc = &amp;quot;icc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In order for an individual recipe to use the secondary toolchain, the user would define: TOOLCHAIN_pn-&amp;lt;recipe&amp;gt; = &#039;toolchain&#039;, such as:&lt;br /&gt;
&lt;br /&gt;
TOOLCHAIN_pn-bash = &amp;quot;icc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Blacklist/Whitelist ===&lt;br /&gt;
&lt;br /&gt;
MGH: Add blacklist/whitelist implementation details....&lt;br /&gt;
&lt;br /&gt;
=== SDK ===&lt;br /&gt;
&lt;br /&gt;
MGH: Add SDK extension details&lt;br /&gt;
&lt;br /&gt;
== Implementation Example ==&lt;br /&gt;
&lt;br /&gt;
The following example implements a secondary toolchain.  The example is generated in a new layer named: meta-toolchain-test&lt;br /&gt;
&lt;br /&gt;
MGH: include example here..&lt;br /&gt;
&lt;br /&gt;
== Further comments and information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Dev]]&lt;br /&gt;
[[Category:Layers]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5329</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5329"/>
		<updated>2012-11-13T18:55:53Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Implementation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
&lt;br /&gt;
In OpenEmbedded-Core there in an included toolchain that is built up of GNU binutils, gcc, and eglibc.  In addition related components such as gdb, cross-prelink, mklibs and others provider additional toolchain functionality.  In this document we focus on explaining best practices for including an additional toolchain that is capable of assembling, compiling and linking code.  This document does not cover replacing the existing toolchain or toolchain components with external elements.&lt;br /&gt;
&lt;br /&gt;
Many companies have commercial / highly optimized toolchains for specific purposes, such as ICC from Intel, LLVM, ARM Ltd toolchains, etc..  In some cases, these highly optimized toolchains may result in better performance for some applications, however they are often not generally applicable as they can not compile all of the system software.  So instead of replacing the included GNU toolchain, a mechanism for providing an alternative/secondary toolchain is desired.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchains should be implemented in a layer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In order to facilitate re-use and make it easier to completely disable the secondary toolchain, a layer must be used to implement the secondary toolchain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchain must be generally compatible with GNU toolchain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The secondary toolchain must be generally compatible with the idea of sysroots, linking to the defined libc, and various GNU conventions.  This compatibility may be implemented directly by the secondary toolchain or via a wrapper of some type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Per recipe selection of toolchain usage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A mechanism is needed to activate this alternative toolchain on a per-recipe basis.  Using variables it should be possible to specify on a per-recipe basis which toolchain should be used, leaving the default up to the user.  (It&#039;s assumed if the user does not select a default, the system GNU toolchain will be defaulted.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blacklist/Whitelist&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even with the requirement to be generally compatible, we can not expect all of the possible recipes to build properly with the secondary toolchain.  As a consequence of this, it will be necessary to implement a blacklist (or whitelist) of specific recipes that are known to work.  This way only supported components can be build by the user, avoid numerous complaints and unresolvable defects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The SDK generated by OpenEmbedded-Core also includes the included toolchain components.  It would be useful to also provide support for the secondary toolchain within the SDK environment.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Bitbake variables ===&lt;br /&gt;
&lt;br /&gt;
A set of common bitbake variables, defined in meta/conf/bitbake.conf, are used to define how to run the toolchain components and the proper arguments.&lt;br /&gt;
&lt;br /&gt;
A number of key items may need to be changed, depending on the toolchain being provided.  These items may include:&lt;br /&gt;
&lt;br /&gt;
   * TARGET_CPPFLAGS&lt;br /&gt;
   * TARGET_CFLAGS&lt;br /&gt;
   * TARGET_CXXFLAGS&lt;br /&gt;
   * TARGET_LDFLAGS&lt;br /&gt;
   * CC&lt;br /&gt;
   * CXX&lt;br /&gt;
   * F77&lt;br /&gt;
   * CPP&lt;br /&gt;
   * LD&lt;br /&gt;
   * CCLD&lt;br /&gt;
   * AR&lt;br /&gt;
   * AS&lt;br /&gt;
   * RANLIB&lt;br /&gt;
   * STRIP&lt;br /&gt;
   * OBJCOPY&lt;br /&gt;
   * OBJDUMP&lt;br /&gt;
   * NM&lt;br /&gt;
   * SELECTED_OPTIMIZATION&lt;br /&gt;
      * FULL_OPTIMIZATION&lt;br /&gt;
      * DEBUG_OPTIMIZATION&lt;br /&gt;
&lt;br /&gt;
Each of the above items has a default definition within the meta/conf/bitbake.conf file.  In addition, many of the components are based on specific tune variables such as:&lt;br /&gt;
&lt;br /&gt;
   * TUNE_CCARGS&lt;br /&gt;
   * TUNE_LDARGS&lt;br /&gt;
   * TUNE_ASARGS&lt;br /&gt;
&lt;br /&gt;
Deciding which items need to be overridden is up to the author of the layer.  It is expected that only a subset of the above referenced variables will need secondary toolchain specific versions for most implementations.&lt;br /&gt;
&lt;br /&gt;
=== Override ===&lt;br /&gt;
&lt;br /&gt;
In order to allow for the layer to selectively override the variables listed above, a standard override syntax is needed.&lt;br /&gt;
&lt;br /&gt;
The standard override syntax will be &#039;toolchain-${TOOLCHAIN}&#039;.  This will allow us to specify multiple alternative and primary toolchain combinations as necessary.&lt;br /&gt;
&lt;br /&gt;
Each of the toolchain related variables can then be overridden using the standard override syntax: &amp;lt;var&amp;gt;_toolchain-&amp;lt;toolchain&amp;gt;, such as:&lt;br /&gt;
&lt;br /&gt;
CC_toolchain-icc = &amp;quot;icc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In order for an individual recipe to use the secondary toolchain, the user would define: TOOLCHAIN_pn-&amp;lt;recipe&amp;gt; = &#039;toolchain&#039;, such as:&lt;br /&gt;
&lt;br /&gt;
TOOLCHAIN_pn-bash = &amp;quot;icc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Further comments and information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Dev]]&lt;br /&gt;
[[Category:Layers]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5327</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5327"/>
		<updated>2012-11-13T18:31:52Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background ==&lt;br /&gt;
&lt;br /&gt;
In OpenEmbedded-Core there in an included toolchain that is built up of GNU binutils, gcc, and eglibc.  In addition related components such as gdb, cross-prelink, mklibs and others provider additional toolchain functionality.  In this document we focus on explaining best practices for including an additional toolchain that is capable of assembling, compiling and linking code.  This document does not cover replacing the existing toolchain or toolchain components with external elements.&lt;br /&gt;
&lt;br /&gt;
Many companies have commercial / highly optimized toolchains for specific purposes, such as ICC from Intel, LLVM, ARM Ltd toolchains, etc..  In some cases, these highly optimized toolchains may result in better performance for some applications, however they are often not generally applicable as they can not compile all of the system software.  So instead of replacing the included GNU toolchain, a mechanism for providing an alternative/secondary toolchain is desired.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchains should be implemented in a layer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In order to facilitate re-use and make it easier to completely disable the secondary toolchain, a layer must be used to implement the secondary toolchain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary Toolchain must be generally compatible with GNU toolchain&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The secondary toolchain must be generally compatible with the idea of sysroots, linking to the defined libc, and various GNU conventions.  This compatibility may be implemented directly by the secondary toolchain or via a wrapper of some type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Per recipe selection of toolchain usage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A mechanism is needed to activate this alternative toolchain on a per-recipe basis.  Using variables it should be possible to specify on a per-recipe basis which toolchain should be used, leaving the default up to the user.  (It&#039;s assumed if the user does not select a default, the system GNU toolchain will be defaulted.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blacklist/Whitelist&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even with the requirement to be generally compatible, we can not expect all of the possible recipes to build properly with the secondary toolchain.  As a consequence of this, it will be necessary to implement a blacklist (or whitelist) of specific recipes that are known to work.  This way only supported components can be build by the user, avoid numerous complaints and unresolvable defects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The SDK generated by OpenEmbedded-Core also includes the included toolchain components.  It would be useful to also provide support for the secondary toolchain within the SDK environment.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
== Further comments and information ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Dev]]&lt;br /&gt;
[[Category:Layers]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5325</id>
		<title>Adding a secondary toolchain</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Adding_a_secondary_toolchain&amp;diff=5325"/>
		<updated>2012-11-13T18:07:24Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: How to add an alternative/secondary toolchain to or-core&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Test&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Barcelona,_2012&amp;diff=4949</id>
		<title>Barcelona, 2012</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Barcelona,_2012&amp;diff=4949"/>
		<updated>2012-10-30T14:52:11Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: /* Participants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Location ==&lt;br /&gt;
&lt;br /&gt;
Hotel Fira Palace · Barcelona, Spain&lt;br /&gt;
Nov 7, 2012 at 17:00.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Agenda ==&lt;br /&gt;
&lt;br /&gt;
* Financial report&lt;br /&gt;
* Board Elections, Dr. Michael Lauer, Florian Boor, and Philip Balister&#039;s terms are ending.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Participants ==&lt;br /&gt;
&lt;br /&gt;
The sign [P] means he/she is available as proxy.&lt;br /&gt;
&lt;br /&gt;
* Marco Cavallini [P]&lt;br /&gt;
* Eric Bénard [P]&lt;br /&gt;
* Mark Hatle (fray) [P]&lt;br /&gt;
&lt;br /&gt;
== Forms ==&lt;br /&gt;
&lt;br /&gt;
* Proxy form [[File:Proxy_instructions-oe.pdf]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Commit_Patch_Message_Guidelines&amp;diff=4307</id>
		<title>Commit Patch Message Guidelines</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Commit_Patch_Message_Guidelines&amp;diff=4307"/>
		<updated>2011-06-14T18:39:21Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This set of guidelines is intended to help both the developer and reviewers of&lt;br /&gt;
changes determine reasonable patch headers and change commit messages. Often&lt;br /&gt;
when working with the code, you forget that not everyone is as familiar with the&lt;br /&gt;
problem and/or fix as you are. Often the next person in the code doesn&#039;t&lt;br /&gt;
understand what or why something is done so they quickly look at patch header&lt;br /&gt;
and commit messages. Unless these messages are clear it will be difficult to&lt;br /&gt;
understand the relevance of a given change and how future changes may impact&lt;br /&gt;
previous decisions.&lt;br /&gt;
&lt;br /&gt;
This policy refers both to patches that are being applied by recipes as well as&lt;br /&gt;
commit messages that are part of the source control system, usually git. A patch&lt;br /&gt;
file needs a header in order to describe the specific changes that are made&lt;br /&gt;
within that patch, while a commit message describes one or more changes to the&lt;br /&gt;
overall project or system. Both the patch headers and commit messages require&lt;br /&gt;
the same attention and basic details, however the purposes of the messages are&lt;br /&gt;
slightly different. A commit message documents all of the changes made as part&lt;br /&gt;
of a commit, while a patch header documents items specific to a single patch. In&lt;br /&gt;
many cases the patch header can also be used as the commit message.&lt;br /&gt;
&lt;br /&gt;
This policy does not cover the testing of the changes, or the technical criteria&lt;br /&gt;
for accepting a patch.&lt;br /&gt;
&lt;br /&gt;
By following these guidelines we will have a better record of the problems and&lt;br /&gt;
solutions made over the course of development. It will also help establish a&lt;br /&gt;
clear provenance of all of the code and changes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Approved by the Technical Steering Committee 2011/06/09.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
&lt;br /&gt;
While specific to the Linux kernel development, the following could also be&lt;br /&gt;
considered a general guide for any Open Source development:&lt;br /&gt;
&lt;br /&gt;
http://ldn.linuxfoundation.org/book/how-participate-linux-community&lt;br /&gt;
&lt;br /&gt;
Many of the guidelines in this document are related to the items in that&lt;br /&gt;
information.&lt;br /&gt;
&lt;br /&gt;
Pay particular attention to section 5.3 that talks about patch preparation.&lt;br /&gt;
The key thing to remember is to break up your changes into logical sections.&lt;br /&gt;
Otherwise you run the risk of not being able to even explain the purpose of a&lt;br /&gt;
change in the patch headers!&lt;br /&gt;
&lt;br /&gt;
In addition section 5.4 explains the purpose of the Signed-off-by: tag line as&lt;br /&gt;
discussed in later parts of this document. Due to the importance of the&lt;br /&gt;
Signed-off-by: tag line a copy of the description follows:&lt;br /&gt;
&lt;br /&gt;
   Signed-off-by: this is a developer&#039;s certification that he or she has&lt;br /&gt;
   the right to submit the patch for inclusion into the [project].  It is&lt;br /&gt;
   an agreement to the Developer&#039;s Certificate of Origin, the full text of&lt;br /&gt;
   which can be found in [Linux Kernel] Documentation/SubmittingPatches.&lt;br /&gt;
   Code without a proper signoff cannot be merged into the mainline.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more information on the Developer&#039;s Certificate of Origin and the Linux&lt;br /&gt;
Kernel Documentation/SubmittingPatches, see:&lt;br /&gt;
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/SubmittingPatches&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Patch Headers and Commit Messages ==&lt;br /&gt;
&lt;br /&gt;
There seems to always be a question or two surrounding what a person&lt;br /&gt;
should put in a patch header, or commit message.&lt;br /&gt;
&lt;br /&gt;
The general rules always apply, those being that there is a single line&lt;br /&gt;
short log or summary of the change (think of this as the subject when the patch&lt;br /&gt;
is e-mailed), and then the more detailed long log, and closure with tag lines&lt;br /&gt;
such as &amp;quot;Signed-off-by:&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== New Development ==&lt;br /&gt;
&lt;br /&gt;
A minimal patch or commit message would be of the format:&lt;br /&gt;
&lt;br /&gt;
   Short log / Statement of what needed to be changed.&lt;br /&gt;
   &lt;br /&gt;
   (Optional pointers to external resources, such as defect tracking)&lt;br /&gt;
   &lt;br /&gt;
   The intent of your change.&lt;br /&gt;
   &lt;br /&gt;
   (Optional, if it&#039;s not clear from above) how your change resolves the&lt;br /&gt;
   issues in the first part.&lt;br /&gt;
   &lt;br /&gt;
   Tag line(s) at the end.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
   foobar: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   When using foobar on systems with less than a gigabyte of RAM common&lt;br /&gt;
   usage patterns often result in an Out-of-memory condition causing&lt;br /&gt;
   slowdowns and unexpected application termination.&lt;br /&gt;
   &lt;br /&gt;
   Low-memory systems should continue to function without running into&lt;br /&gt;
   memory-starvation conditions with minimal cost to systems with more&lt;br /&gt;
   available memory.  High-memory systems will be less able to use the&lt;br /&gt;
   full extent of the system, a dynamically tunable option may be best,&lt;br /&gt;
   long-term.&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The minimal commit message is good for new code development and simple changes.&lt;br /&gt;
&lt;br /&gt;
The single short log message indicates what needed to be changed. It should&lt;br /&gt;
begin with an indicator as to the primary item changed by this work,&lt;br /&gt;
followed by a short summary of the change. In the above case we&#039;re indicating&lt;br /&gt;
that we&#039;ve changed the &amp;quot;foobar&amp;quot; item, by &amp;quot;adjusting the foo setting in bar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The single short log message is analogous to the git &amp;quot;commit summary&amp;quot;. While no&lt;br /&gt;
maximum line length is specified by this policy, it is suggested that it remains&lt;br /&gt;
under 78 characters wherever possible.&lt;br /&gt;
&lt;br /&gt;
Optionally, you may include pointers to defects this change corrects. Unless&lt;br /&gt;
the defect format is specified by the component you are modifying, it is&lt;br /&gt;
suggested that you use a full URL to specify the reference to the defect&lt;br /&gt;
information. Generally these pointers will precede any long description, but as&lt;br /&gt;
an optional item it may be after the long description.&lt;br /&gt;
&lt;br /&gt;
For example, you might refer to an open source defect in the RPM project:&lt;br /&gt;
&lt;br /&gt;
   rpm: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;[RPM Ticket #65] -- http://rpm5.org/cvs/tktview?tn=65,5&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must then have a full description of the change. Specifying the intent of&lt;br /&gt;
your change and if necessary how the change resolves the issue.&lt;br /&gt;
&lt;br /&gt;
As mentioned above this is intended to answer the &amp;quot;what were you thinking&amp;quot;&lt;br /&gt;
questions down the road and to know what other impacts are likely to&lt;br /&gt;
result of the change needs to be reverted. It also allows for better&lt;br /&gt;
solutions if someone comes along later and agrees with paragraph 1&lt;br /&gt;
(the problem statement) and either disagrees with paragraph 2&lt;br /&gt;
(the design) or paragraph 3 (the implementation).&lt;br /&gt;
&lt;br /&gt;
Finally one or more tag lines should exist. Each developer responsible&lt;br /&gt;
for working on the patch is responsible for adding a Signed-off-by: tag line.&lt;br /&gt;
&lt;br /&gt;
It is not acceptable to have an empty or non-existent header, or just a single&lt;br /&gt;
line message. The summary and description is required for all changes.&lt;br /&gt;
&lt;br /&gt;
== Importing from Elsewhere ==&lt;br /&gt;
&lt;br /&gt;
If you are importing work from somewhere else, such as a cherry-pick from&lt;br /&gt;
another repository or a code patch pulled from a mailing list, the minimum patch&lt;br /&gt;
header or commit message is not enough. It does not clearly establish the&lt;br /&gt;
provenance of the code.&lt;br /&gt;
&lt;br /&gt;
The following specifies the additional guidelines required for importing changes&lt;br /&gt;
from elsewhere.&lt;br /&gt;
&lt;br /&gt;
By default you should keep the original author&#039;s summary and description,&lt;br /&gt;
along with any tag lines such as, &amp;quot;Signed-off-by:&amp;quot;. If the original change that&lt;br /&gt;
was imported does not have a summary and/or commit message from the original&lt;br /&gt;
author, it is still your responsibility to add the summary and commit message to&lt;br /&gt;
the patch header. Just as if you wrote the code, you should be able to clearly&lt;br /&gt;
explain what the change does. It is also necessary to document the original&lt;br /&gt;
author of the change. You should indicate the original author by simply stating&lt;br /&gt;
&amp;quot;written by&amp;quot; or &amp;quot;posted to the ... mailing list by&amp;quot;. You must not add a&lt;br /&gt;
Signed-off-by: tag line with their name, only the original author may add their&lt;br /&gt;
own Signed-off-by: tag line.&lt;br /&gt;
&lt;br /&gt;
It is also required that the origin of the work be fully documented. The origin&lt;br /&gt;
should be specified as part of the commit message in a way that an average&lt;br /&gt;
developer would be able to track down the original code. URLs should reference&lt;br /&gt;
original authoritative sources and not mirrors.&lt;br /&gt;
&lt;br /&gt;
If changes were required to resolve conflicts, they should be documented as&lt;br /&gt;
well.  When incorporating a commit or patch from an external source, changes to&lt;br /&gt;
the functionality not related to resolving conflicts should be made in a&lt;br /&gt;
second commit or patch.  This preserves the original external commit, and makes&lt;br /&gt;
the modifications clearly visible, and prevents confusion over the author of the&lt;br /&gt;
code.&lt;br /&gt;
&lt;br /&gt;
Finally you must add a &amp;quot;Signed-off-by:&amp;quot; tag line to indicate that you worked&lt;br /&gt;
with the patch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Example: Importing from Elsewhere Unmodified ==&lt;br /&gt;
&lt;br /&gt;
For example, if you were to pull in the patch from the above example unmodified:&lt;br /&gt;
&lt;br /&gt;
   foobar: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   When using foobar on systems with less than a gigabyte of RAM common&lt;br /&gt;
   usage patterns often result in an Out-of-memory condition causing&lt;br /&gt;
   slowdowns and unexpected application termination.&lt;br /&gt;
   &lt;br /&gt;
   Low-memory systems should continue to function without running into&lt;br /&gt;
   memory-starvation conditions with minimal cost to systems with more&lt;br /&gt;
   available memory.  High-memory systems will be less able to use the&lt;br /&gt;
   full extent of the system, a dynamically tunable option may be best,&lt;br /&gt;
   long-term.&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The patch was imported from the OpenEmbedded git server&lt;br /&gt;
   (&amp;lt;nowiki&amp;gt;git://git.openembedded.org/openembedded&amp;lt;/nowiki&amp;gt;) as of commit id&lt;br /&gt;
   b65a0e0c84cf489bfa00d6aa6c48abc5a237100f.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Your Name &amp;lt;your.name@openembedded.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above example shows a clear way for a developer to find the original source&lt;br /&gt;
of the change. It indicates that the OpenEmbedded developer simply integrated&lt;br /&gt;
the change into the system without making any further modifications.&lt;br /&gt;
&lt;br /&gt;
== Example: Importing from Elsewhere Modified ==&lt;br /&gt;
&lt;br /&gt;
When importing a patch, occasionally changes have to be made in order to resolve&lt;br /&gt;
conflicts.  The following is an example of the commit message when the item needed&lt;br /&gt;
to be modified:&lt;br /&gt;
&lt;br /&gt;
   foobar: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   When using foobar on systems with less than a gigabyte of RAM common&lt;br /&gt;
   usage patterns often result in an Out-of-memory condition causing&lt;br /&gt;
   slowdowns and unexpected application termination.&lt;br /&gt;
   &lt;br /&gt;
   Low-memory systems should continue to function without running into&lt;br /&gt;
   memory-starvation conditions with minimal cost to systems with more&lt;br /&gt;
   available memory.  High-memory systems will be less able to use the&lt;br /&gt;
   full extent of the system, a dynamically tunable option may be best,&lt;br /&gt;
   long-term.&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The patch was imported from the OpenEmbedded git server&lt;br /&gt;
   (&amp;lt;nowiki&amp;gt;git://git.openembedded.org/openembedded&amp;lt;/nowiki&amp;gt;) as of commit id&lt;br /&gt;
   b65a0e0c84cf489bfa00d6aa6c48abc5a237100f.&lt;br /&gt;
   &lt;br /&gt;
   A previous change had modified the memory threshold calculation,&lt;br /&gt;
   causing a conflict.  The conflict was resolved by preserving the&lt;br /&gt;
   memory threshold calculation from the existing implementation.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Your Name &amp;lt;your.name@openembedded.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Patch Header Recommendations ==&lt;br /&gt;
&lt;br /&gt;
In order to keep track of patches and ultimately reduce the number of patches&lt;br /&gt;
that are required to be maintained, we need to track the status of the patches&lt;br /&gt;
that are created. The following items are specific to patches applied by recipes.&lt;br /&gt;
&lt;br /&gt;
In addition to the items mentioned above, we also want to track if it&#039;s&lt;br /&gt;
appropriate to get this particular patch into the upstream project. Since we&lt;br /&gt;
want to track this information, we need a consistent tag and status indicator&lt;br /&gt;
that can be searched.&lt;br /&gt;
&lt;br /&gt;
While adding this tracking information to the patch headers is currently&lt;br /&gt;
optional, it is highly recommended and some maintainers may require it.  It is&lt;br /&gt;
optional at this time so that it can be evaluated as to its usefulness over&lt;br /&gt;
time.  Existing patches will be updated with the tag as they are modified.&lt;br /&gt;
&lt;br /&gt;
As mentioned in the above, be sure to include any URL to bug tracking, mailing&lt;br /&gt;
lists or other reference material pertaining to the patch. Then add a new tag&lt;br /&gt;
&amp;quot;Upstream-Status:&amp;quot; which contains one of the following items:&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Pending&#039;&#039;&#039;&lt;br /&gt;
   - No determination has been made yet or not yet submitted to upstream&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Submitted&#039;&#039;&#039; [where]&lt;br /&gt;
   - Submitted to upstream, waiting approval&lt;br /&gt;
   - Optionally include where it was submitted, such as the author, mailing&lt;br /&gt;
     list, etc.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Accepted&#039;&#039;&#039;&lt;br /&gt;
   - Accepted in upstream, expect it to be removed at next update, include&lt;br /&gt;
     expected version info&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Backport&#039;&#039;&#039;&lt;br /&gt;
   - Backported from new upstream version, because we are at a fixed version,&lt;br /&gt;
     include upstream version info&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Denied&#039;&#039;&#039;&lt;br /&gt;
   - Not accepted by upstream, include reason in patch&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Inappropriate [reason]&#039;&#039;&#039;&lt;br /&gt;
   - The patch is not appropriate for upstream, include a brief reason on the&lt;br /&gt;
     same line enclosed with []&lt;br /&gt;
     reason can be:&lt;br /&gt;
       not author (You are not the author and do not intend to upstream this,&lt;br /&gt;
                   source must be listed in the comments)&lt;br /&gt;
       native&lt;br /&gt;
       licensing&lt;br /&gt;
       configuration&lt;br /&gt;
       enable feature&lt;br /&gt;
       disable feature&lt;br /&gt;
       bugfix (add bug URL here)&lt;br /&gt;
       embedded specific&lt;br /&gt;
       no upstream (the upstream is no longer available -- dead project)&lt;br /&gt;
       other (give details in comments)&lt;br /&gt;
&lt;br /&gt;
The various &amp;quot;Inappropriate [reason]&amp;quot; status items are meant to indicate that the&lt;br /&gt;
person responsible for adding this patch to the system does not intend to&lt;br /&gt;
upstream the patch for a specific reason.  Unless otherwise noted, another&lt;br /&gt;
person could submit this patch to the upstream, if they do the status should be&lt;br /&gt;
changed to &amp;quot;Submitted [where]&amp;quot;, and an additional Signed-off-by: line added to&lt;br /&gt;
the patch by the person claiming responsibility for upstreaming.&lt;br /&gt;
&lt;br /&gt;
For example, if the patch has been submitted upstream:&lt;br /&gt;
&lt;br /&gt;
   rpm: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;[RPM Ticket #65] -- http://rpm5.org/cvs/tktview?tn=65,5&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Upstream-Status: Submitted [rpm5-devel@rpm5.org]&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A future commit can change the value to &amp;quot;Accepted&amp;quot; or &amp;quot;Denied&amp;quot; as appropriate.&lt;br /&gt;
&lt;br /&gt;
== Common Errors in Patch and Commit Messages ==&lt;br /&gt;
&lt;br /&gt;
- Short log does not start with the file or component being modified.  Such as&lt;br /&gt;
&amp;quot;foo: Update to new upstream version 5.8.9&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Avoid starting the summary line with a capital letter, unless the component&lt;br /&gt;
being referred to also begins with a capital letter.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t have one huge patch, split your change into logical subparts. It&#039;s&lt;br /&gt;
easier to track down problems afterward using tools such as git bisect. It also&lt;br /&gt;
makes it easy for people to cherry-pick changes into things like stable branches.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t simply translate your change into English for a commit log. The log&lt;br /&gt;
&amp;quot;Change compare from zero to one&amp;quot; is bad because it describes only the code&lt;br /&gt;
change in the patch; we can see that from reading the patch itself. Let the code&lt;br /&gt;
tell the story of the mechanics of the change (as much as possible), and let&lt;br /&gt;
your comment tell the other details -- i.e. what the problem was, how it&lt;br /&gt;
manifested itself (symptoms), and if necessary, the justification for why the&lt;br /&gt;
fix was done in manner that it was.  In other words, the long commit message&lt;br /&gt;
must describe *why* the change was needed (instead of what has changed).&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t start your commit log with &amp;quot;This patch...&amp;quot; -- we already know it is a patch.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t repeat your short log in the long log. If you really really don&#039;t have&lt;br /&gt;
anything new and informational to add in as a long log, then don&#039;t put a long&lt;br /&gt;
log at all. This should be uncommon -- i.e. the only acceptable cases for no&lt;br /&gt;
long log would be something like &amp;quot;Documentation/README: Fix spelling mistakes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t put absolute paths to source files that are specific to your site, i.e.&lt;br /&gt;
if you get a compile error on &amp;quot;fs/exec.c&amp;quot; then tidy up the parts of the compile&lt;br /&gt;
output to just show that portion. We don&#039;t need to see that it was&lt;br /&gt;
/home/wally/src/git/oe-core/meta/classes/insane.bbclass or similar - that full&lt;br /&gt;
path has no value to others. Always reduce the path to something more&lt;br /&gt;
meaningful, such as oe-core/meta/classes/insane.bbclass.&lt;br /&gt;
&lt;br /&gt;
- Always use the most significant ramification of the change in the words of&lt;br /&gt;
your subject/shortlog. For example, don&#039;t say &amp;quot;fix compile warning in foo&amp;quot; when&lt;br /&gt;
the compiler warning was really telling us that we were dereferencing complete&lt;br /&gt;
garbage off in the weeds that could in theory cause an OOPS under some&lt;br /&gt;
circumstances. When people are choosing commits for backports to stable or&lt;br /&gt;
distro kernels, the shortlog will be what they use for an initial sorting&lt;br /&gt;
selection. If they see &amp;quot;Fix possible OOPS in....&amp;quot; then these people will look&lt;br /&gt;
closer, whereas they most likely will skip over simple warning fixes.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t put in the full 20 or more lines of a backtrace when really it is just&lt;br /&gt;
the last 5 or so function calls that are relevant to the crash/fix. If the entry&lt;br /&gt;
point, or start of the trace is relevant (i.e. a syscall or similar), you can&lt;br /&gt;
leave that, and then replace a chunk of the intermediate calls in the middle&lt;br /&gt;
with a single [...]&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t include timestamps or other unnecessary information, unless they are&lt;br /&gt;
relevant to the situation (i.e. indicating an unacceptable delay in a driver&lt;br /&gt;
initialization etc.)&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t use links to temporary resources like pastebin and friends. The commit&lt;br /&gt;
message may be read long after this resource timed out.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t reference mirrors, but instead always reference original authoritative&lt;br /&gt;
sources.&lt;br /&gt;
&lt;br /&gt;
- Avoid punctuation in the short log.&lt;br /&gt;
&lt;br /&gt;
[[Category:Policy]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=User:Mhatle&amp;diff=4305</id>
		<title>User:Mhatle</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=User:Mhatle&amp;diff=4305"/>
		<updated>2011-06-14T18:36:24Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: Created page with &amp;quot;Name: Mark Hatle  IRC Alias: fray&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Name: Mark Hatle&lt;br /&gt;
&lt;br /&gt;
IRC Alias: fray&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Commit_Patch_Message_Guidelines&amp;diff=4303</id>
		<title>Commit Patch Message Guidelines</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Commit_Patch_Message_Guidelines&amp;diff=4303"/>
		<updated>2011-06-14T18:32:55Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This set of guidelines is intended to help both the developer and reviewers of&lt;br /&gt;
changes determine reasonable patch headers and change commit messages. Often&lt;br /&gt;
when working with the code, you forget that not everyone is as familiar with the&lt;br /&gt;
problem and/or fix as you are. Often the next person in the code doesn&#039;t&lt;br /&gt;
understand what or why something is done so they quickly look at patch header&lt;br /&gt;
and commit messages. Unless these messages are clear it will be difficult to&lt;br /&gt;
understand the relevance of a given change and how future changes may impact&lt;br /&gt;
previous decisions.&lt;br /&gt;
&lt;br /&gt;
This policy refers both to patches that are being applied by recipes as well as&lt;br /&gt;
commit messages that are part of the source control system, usually git. A patch&lt;br /&gt;
file needs a header in order to describe the specific changes that are made&lt;br /&gt;
within that patch, while a commit message describes one or more changes to the&lt;br /&gt;
overall project or system. Both the patch headers and commit messages require&lt;br /&gt;
the same attention and basic details, however the purposes of the messages are&lt;br /&gt;
slightly different. A commit message documents all of the changes made as part&lt;br /&gt;
of a commit, while a patch header documents items specific to a single patch. In&lt;br /&gt;
many cases the patch header can also be used as the commit message.&lt;br /&gt;
&lt;br /&gt;
This policy does not cover the testing of the changes, or the technical criteria&lt;br /&gt;
for accepting a patch.&lt;br /&gt;
&lt;br /&gt;
By following these guidelines we will have a better record of the problems and&lt;br /&gt;
solutions made over the course of development. It will also help establish a&lt;br /&gt;
clear provenance of all of the code and changes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Approved by the Technical Steering Committee 2011/06/09.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
&lt;br /&gt;
While specific to the Linux kernel development, the following could also be&lt;br /&gt;
considered a general guide for any Open Source development:&lt;br /&gt;
&lt;br /&gt;
http://ldn.linuxfoundation.org/book/how-participate-linux-community&lt;br /&gt;
&lt;br /&gt;
Many of the guidelines in this document are related to the items in that&lt;br /&gt;
information.&lt;br /&gt;
&lt;br /&gt;
Pay particular attention to section 5.3 that talks about patch preparation.&lt;br /&gt;
The key thing to remember is to break up your changes into logical sections.&lt;br /&gt;
Otherwise you run the risk of not being able to even explain the purpose of a&lt;br /&gt;
change in the patch headers!&lt;br /&gt;
&lt;br /&gt;
In addition section 5.4 explains the purpose of the Signed-off-by: tag line as&lt;br /&gt;
discussed in later parts of this document. Due to the importance of the&lt;br /&gt;
Signed-off-by: tag line a copy of the description follows:&lt;br /&gt;
&lt;br /&gt;
   Signed-off-by: this is a developer&#039;s certification that he or she has&lt;br /&gt;
   the right to submit the patch for inclusion into the [project].  It is&lt;br /&gt;
   an agreement to the Developer&#039;s Certificate of Origin, the full text of&lt;br /&gt;
   which can be found in [Linux Kernel] Documentation/SubmittingPatches.&lt;br /&gt;
   Code without a proper signoff cannot be merged into the mainline.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more information on the Developer&#039;s Certificate of Origin and the Linux&lt;br /&gt;
Kernel Documentation/SubmittingPatches, see:&lt;br /&gt;
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/SubmittingPatches&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Patch Headers and Commit Messages ==&lt;br /&gt;
&lt;br /&gt;
There seems to always be a question or two surrounding what a person&lt;br /&gt;
should put in a patch header, or commit message.&lt;br /&gt;
&lt;br /&gt;
The general rules always apply, those being that there is a single line&lt;br /&gt;
short log or summary of the change (think of this as the subject when the patch&lt;br /&gt;
is e-mailed), and then the more detailed long log, and closure with tag lines&lt;br /&gt;
such as &amp;quot;Signed-off-by:&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== New Development ==&lt;br /&gt;
&lt;br /&gt;
A minimal patch or commit message would be of the format:&lt;br /&gt;
&lt;br /&gt;
   Short log / Statement of what needed to be changed.&lt;br /&gt;
   &lt;br /&gt;
   (Optional pointers to external resources, such as defect tracking)&lt;br /&gt;
   &lt;br /&gt;
   The intent of your change.&lt;br /&gt;
   &lt;br /&gt;
   (Optional, if it&#039;s not clear from above) how your change resolves the&lt;br /&gt;
   issues in the first part.&lt;br /&gt;
   &lt;br /&gt;
   Tag line(s) at the end.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
   foobar: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   When using foobar on systems with less than a gigabyte of RAM common&lt;br /&gt;
   usage patterns often result in an Out-of-memory condition causing&lt;br /&gt;
   slowdowns and unexpected application termination.&lt;br /&gt;
   &lt;br /&gt;
   Low-memory systems should continue to function without running into&lt;br /&gt;
   memory-starvation conditions with minimal cost to systems with more&lt;br /&gt;
   available memory.  High-memory systems will be less able to use the&lt;br /&gt;
   full extent of the system, a dynamically tunable option may be best,&lt;br /&gt;
   long-term.&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The minimal commit message is good for new code development and simple changes.&lt;br /&gt;
&lt;br /&gt;
The single short log message indicates what needed to be changed. It should&lt;br /&gt;
begin with an indicator as to the primary item changed by this work,&lt;br /&gt;
followed by a short summary of the change. In the above case we&#039;re indicating&lt;br /&gt;
that we&#039;ve changed the &amp;quot;foobar&amp;quot; item, by &amp;quot;adjusting the foo setting in bar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The single short log message is analogous to the git &amp;quot;commit summary&amp;quot;. While no&lt;br /&gt;
maximum line length is specified by this policy, it is suggested that it remains&lt;br /&gt;
under 78 characters wherever possible.&lt;br /&gt;
&lt;br /&gt;
Optionally, you may include pointers to defects this change corrects. Unless&lt;br /&gt;
the defect format is specified by the component you are modifying, it is&lt;br /&gt;
suggested that you use a full URL to specify the reference to the defect&lt;br /&gt;
information. Generally these pointers will precede any long description, but as&lt;br /&gt;
an optional item it may be after the long description.&lt;br /&gt;
&lt;br /&gt;
For example, you might refer to an open source defect in the RPM project:&lt;br /&gt;
&lt;br /&gt;
   rpm: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;[RPM Ticket #65] -- http://rpm5.org/cvs/tktview?tn=65,5&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must then have a full description of the change. Specifying the intent of&lt;br /&gt;
your change and if necessary how the change resolves the issue.&lt;br /&gt;
&lt;br /&gt;
As mentioned above this is intended to answer the &amp;quot;what were you thinking&amp;quot;&lt;br /&gt;
questions down the road and to know what other impacts are likely to&lt;br /&gt;
result of the change needs to be reverted. It also allows for better&lt;br /&gt;
solutions if someone comes along later and agrees with paragraph 1&lt;br /&gt;
(the problem statement) and either disagrees with paragraph 2&lt;br /&gt;
(the design) or paragraph 3 (the implementation).&lt;br /&gt;
&lt;br /&gt;
Finally one or more tag lines should exist. Each developer responsible&lt;br /&gt;
for working on the patch is responsible for adding a Signed-off-by: tag line.&lt;br /&gt;
&lt;br /&gt;
It is not acceptable to have an empty or non-existent header, or just a single&lt;br /&gt;
line message. The summary and description is required for all changes.&lt;br /&gt;
&lt;br /&gt;
== Importing from Elsewhere ==&lt;br /&gt;
&lt;br /&gt;
If you are importing work from somewhere else, such as a cherry-pick from&lt;br /&gt;
another repository or a code patch pulled from a mailing list, the minimum patch&lt;br /&gt;
header or commit message is not enough. It does not clearly establish the&lt;br /&gt;
provenance of the code.&lt;br /&gt;
&lt;br /&gt;
The following specifies the additional guidelines required for importing changes&lt;br /&gt;
from elsewhere.&lt;br /&gt;
&lt;br /&gt;
By default you should keep the original author&#039;s summary and description,&lt;br /&gt;
along with any tag lines such as, &amp;quot;Signed-off-by:&amp;quot;. If the original change that&lt;br /&gt;
was imported does not have a summary and/or commit message from the original&lt;br /&gt;
author, it is still your responsibility to add the summary and commit message to&lt;br /&gt;
the patch header. Just as if you wrote the code, you should be able to clearly&lt;br /&gt;
explain what the change does. It is also necessary to document the original&lt;br /&gt;
author of the change. You should indicate the original author by simply stating&lt;br /&gt;
&amp;quot;written by&amp;quot; or &amp;quot;posted to the ... mailing list by&amp;quot;. You must not add a&lt;br /&gt;
Signed-off-by: tag line with their name, only the original author may add their&lt;br /&gt;
own Signed-off-by: tag line.&lt;br /&gt;
&lt;br /&gt;
It is also required that the origin of the work be fully documented. The origin&lt;br /&gt;
should be specified as part of the commit message in a way that an average&lt;br /&gt;
developer would be able to track down the original code. URLs should reference&lt;br /&gt;
original authoritative sources and not mirrors.&lt;br /&gt;
&lt;br /&gt;
If changes were required to resolve conflicts, they should be documented as&lt;br /&gt;
well.  When incorporating a commit or patch from an external source, changes to&lt;br /&gt;
the functionality not related to resolving conflicts should be made in a&lt;br /&gt;
second commit or patch.  This preserves the original external commit, and makes&lt;br /&gt;
the modifications clearly visible, and prevents confusion over the author of the&lt;br /&gt;
code.&lt;br /&gt;
&lt;br /&gt;
Finally you must add a &amp;quot;Signed-off-by:&amp;quot; tag line to indicate that you worked&lt;br /&gt;
with the patch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Example: Importing from Elsewhere Unmodified ==&lt;br /&gt;
&lt;br /&gt;
For example, if you were to pull in the patch from the above example unmodified:&lt;br /&gt;
&lt;br /&gt;
   foobar: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   When using foobar on systems with less than a gigabyte of RAM common&lt;br /&gt;
   usage patterns often result in an Out-of-memory condition causing&lt;br /&gt;
   slowdowns and unexpected application termination.&lt;br /&gt;
   &lt;br /&gt;
   Low-memory systems should continue to function without running into&lt;br /&gt;
   memory-starvation conditions with minimal cost to systems with more&lt;br /&gt;
   available memory.  High-memory systems will be less able to use the&lt;br /&gt;
   full extent of the system, a dynamically tunable option may be best,&lt;br /&gt;
   long-term.&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The patch was imported from the OpenEmbedded git server&lt;br /&gt;
   (&amp;lt;nowiki&amp;gt;git://git.openembedded.org/openembedded&amp;lt;/nowiki&amp;gt;) as of commit id&lt;br /&gt;
   b65a0e0c84cf489bfa00d6aa6c48abc5a237100f.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Your Name &amp;lt;your.name@openembedded.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above example shows a clear way for a developer to find the original source&lt;br /&gt;
of the change. It indicates that the OpenEmbedded developer simply integrated&lt;br /&gt;
the change into the system without making any further modifications.&lt;br /&gt;
&lt;br /&gt;
== Example: Importing from Elsewhere Modified ==&lt;br /&gt;
&lt;br /&gt;
When importing a patch, occasionally changes have to be made in order to resolve&lt;br /&gt;
conflicts.  The following is an example of the commit message when the item needed&lt;br /&gt;
to be modified:&lt;br /&gt;
&lt;br /&gt;
   foobar: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   When using foobar on systems with less than a gigabyte of RAM common&lt;br /&gt;
   usage patterns often result in an Out-of-memory condition causing&lt;br /&gt;
   slowdowns and unexpected application termination.&lt;br /&gt;
   &lt;br /&gt;
   Low-memory systems should continue to function without running into&lt;br /&gt;
   memory-starvation conditions with minimal cost to systems with more&lt;br /&gt;
   available memory.  High-memory systems will be less able to use the&lt;br /&gt;
   full extent of the system, a dynamically tunable option may be best,&lt;br /&gt;
   long-term.&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The patch was imported from the OpenEmbedded git server&lt;br /&gt;
   (&amp;lt;nowiki&amp;gt;git://git.openembedded.org/openembedded&amp;lt;/nowiki&amp;gt;) as of commit id&lt;br /&gt;
   b65a0e0c84cf489bfa00d6aa6c48abc5a237100f.&lt;br /&gt;
   &lt;br /&gt;
   A previous change had modified the memory threshold calculation,&lt;br /&gt;
   causing a conflict.  The conflict was resolved by preserving the&lt;br /&gt;
   memory threshold calculation from the existing implementation.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Your Name &amp;lt;your.name@openembedded.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Patch Header Recommendations ==&lt;br /&gt;
&lt;br /&gt;
In order to keep track of patches and ultimately reduce the number of patches&lt;br /&gt;
that are required to be maintained, we need to track the status of the patches&lt;br /&gt;
that are created. The following items are specific to patches applied by recipes.&lt;br /&gt;
&lt;br /&gt;
In addition to the items mentioned above, we also want to track if it&#039;s&lt;br /&gt;
appropriate to get this particular patch into the upstream project. Since we&lt;br /&gt;
want to track this information, we need a consistent tag and status indicator&lt;br /&gt;
that can be searched.&lt;br /&gt;
&lt;br /&gt;
While adding this tracking information to the patch headers is currently&lt;br /&gt;
optional, it is highly recommended and some maintainers may require it.  It is&lt;br /&gt;
optional at this time so that it can be evaluated as to its usefulness over&lt;br /&gt;
time.  Existing patches will be updated with the tag as they are modified.&lt;br /&gt;
&lt;br /&gt;
As mentioned in the above, be sure to include any URL to bug tracking, mailing&lt;br /&gt;
lists or other reference material pertaining to the patch. Then add a new tag&lt;br /&gt;
&amp;quot;Upstream-Status:&amp;quot; which contains one of the following items:&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Pending&#039;&#039;&#039;&lt;br /&gt;
   - No determination has been made yet or not yet submitted to upstream&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Submitted&#039;&#039;&#039; [where]&lt;br /&gt;
   - Submitted to upstream, waiting approval&lt;br /&gt;
   - Optionally include where it was submitted, such as the author, mailing&lt;br /&gt;
     list, etc.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Accepted&#039;&#039;&#039;&lt;br /&gt;
   - Accepted in upstream, expect it to be removed at next update, include&lt;br /&gt;
     expected version info&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Backport&#039;&#039;&#039;&lt;br /&gt;
   - Backported from new upstream version, because we are at a fixed version,&lt;br /&gt;
     include upstream version info&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Denied&#039;&#039;&#039;&lt;br /&gt;
   - Not accepted by upstream, include reason in patch&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Inappropriate [reason]&#039;&#039;&#039;&lt;br /&gt;
   - The patch is not appropriate for upstream, include a brief reason on the&lt;br /&gt;
     same line enclosed with []&lt;br /&gt;
     reason can be:&lt;br /&gt;
       not author (You are not the author and do not intend to upstream this,&lt;br /&gt;
                   source must be listed in the comments)&lt;br /&gt;
       native&lt;br /&gt;
       licensing&lt;br /&gt;
       configuration&lt;br /&gt;
       enable feature&lt;br /&gt;
       disable feature&lt;br /&gt;
       bugfix (add bug URL here)&lt;br /&gt;
       embedded specific&lt;br /&gt;
       no upstream (the upstream is no longer available -- dead project)&lt;br /&gt;
       other (give details in comments)&lt;br /&gt;
&lt;br /&gt;
The various &amp;quot;Inappropriate [reason]&amp;quot; status items are meant to indicate that the&lt;br /&gt;
person responsible for adding this patch to the system does not intend to&lt;br /&gt;
upstream the patch for a specific reason.  Unless otherwise noted, another&lt;br /&gt;
person could submit this patch to the upstream, if they do the status should be&lt;br /&gt;
changed to &amp;quot;Submitted [where]&amp;quot;, and an additional Signed-off-by: line added to&lt;br /&gt;
the patch by the person claiming responsibility for upstreaming.&lt;br /&gt;
&lt;br /&gt;
For example, if the patch has been submitted upstream:&lt;br /&gt;
&lt;br /&gt;
   rpm: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;[RPM Ticket #65] -- http://rpm5.org/cvs/tktview?tn=65,5&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Upstream-Status: Submitted [rpm5-devel@rpm5.org]&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A future commit can change the value to &amp;quot;Accepted&amp;quot; or &amp;quot;Denied&amp;quot; as appropriate.&lt;br /&gt;
&lt;br /&gt;
== Common Errors in Patch and Commit Messages ==&lt;br /&gt;
&lt;br /&gt;
- Short log does not start with the file or component being modified.  Such as&lt;br /&gt;
&amp;quot;foo: Update to new upstream version 5.8.9&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Avoid starting the summary line with a capital letter, unless the component&lt;br /&gt;
being referred to also begins with a capital letter.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t have one huge patch, split your change into logical subparts. It&#039;s&lt;br /&gt;
easier to track down problems afterward using tools such as git bisect. It also&lt;br /&gt;
makes it easy for people to cherry-pick changes into things like stable branches.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t simply translate your change into English for a commit log. The log&lt;br /&gt;
&amp;quot;Change compare from zero to one&amp;quot; is bad because it describes only the code&lt;br /&gt;
change in the patch; we can see that from reading the patch itself. Let the code&lt;br /&gt;
tell the story of the mechanics of the change (as much as possible), and let&lt;br /&gt;
your comment tell the other details -- i.e. what the problem was, how it&lt;br /&gt;
manifested itself (symptoms), and if necessary, the justification for why the&lt;br /&gt;
fix was done in manner that it was.  In other words, the long commit message&lt;br /&gt;
must describe *why* the change was needed (instead of what has changed).&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t start your commit log with &amp;quot;This patch...&amp;quot; -- we already know it is a patch.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t repeat your short log in the long log. If you really really don&#039;t have&lt;br /&gt;
anything new and informational to add in as a long log, then don&#039;t put a long&lt;br /&gt;
log at all. This should be uncommon -- i.e. the only acceptable cases for no&lt;br /&gt;
long log would be something like &amp;quot;Documentation/README: Fix spelling mistakes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t put absolute paths to source files that are specific to your site, i.e.&lt;br /&gt;
if you get a compile error on &amp;quot;fs/exec.c&amp;quot; then tidy up the parts of the compile&lt;br /&gt;
output to just show that portion. We don&#039;t need to see that it was&lt;br /&gt;
/home/wally/src/git/oe-core/meta/classes/insane.bbclass or similar - that full&lt;br /&gt;
path has no value to others. Always reduce the path to something more&lt;br /&gt;
meaningful, such as oe-core/meta/classes/insane.bbclass.&lt;br /&gt;
&lt;br /&gt;
- Always use the most significant ramification of the change in the words of&lt;br /&gt;
your subject/shortlog. For example, don&#039;t say &amp;quot;fix compile warning in foo&amp;quot; when&lt;br /&gt;
the compiler warning was really telling us that we were dereferencing complete&lt;br /&gt;
garbage off in the weeds that could in theory cause an OOPS under some&lt;br /&gt;
circumstances. When people are choosing commits for backports to stable or&lt;br /&gt;
distro kernels, the shortlog will be what they use for an initial sorting&lt;br /&gt;
selection. If they see &amp;quot;Fix possible OOPS in....&amp;quot; then these people will look&lt;br /&gt;
closer, whereas they most likely will skip over simple warning fixes.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t put in the full 20 or more lines of a backtrace when really it is just&lt;br /&gt;
the last 5 or so function calls that are relevant to the crash/fix. If the entry&lt;br /&gt;
point, or start of the trace is relevant (i.e. a syscall or similar), you can&lt;br /&gt;
leave that, and then replace a chunk of the intermediate calls in the middle&lt;br /&gt;
with a single [...]&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t include timestamps or other unnecessary information, unless they are&lt;br /&gt;
relevant to the situation (i.e. indicating an unacceptable delay in a driver&lt;br /&gt;
initialization etc.)&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t use links to temporary resources like pastebin and friends. The commit&lt;br /&gt;
message may be read long after this resource timed out.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t reference mirrors, but instead always reference original authoritative&lt;br /&gt;
sources.&lt;br /&gt;
&lt;br /&gt;
- Avoid punctuation in the short log.&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Commit_Patch_Message&amp;diff=4301</id>
		<title>Commit Patch Message</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Commit_Patch_Message&amp;diff=4301"/>
		<updated>2011-06-14T16:17:46Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: moved Commit Patch Message to Commit Patch Message Guidelines: Clear Up Confusion in the name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Commit Patch Message Guidelines]]&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Commit_Patch_Message_Guidelines&amp;diff=4299</id>
		<title>Commit Patch Message Guidelines</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Commit_Patch_Message_Guidelines&amp;diff=4299"/>
		<updated>2011-06-14T16:17:46Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: moved Commit Patch Message to Commit Patch Message Guidelines: Clear Up Confusion in the name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This set of guidelines is intended to help both the developer and reviewers of&lt;br /&gt;
changes determine reasonable patch headers and change commit messages. Often&lt;br /&gt;
when working with the code, you forget that not everyone is as familiar with the&lt;br /&gt;
problem and/or fix as you are. Often the next person in the code doesn&#039;t&lt;br /&gt;
understand what or why something is done so they quickly look at patch header&lt;br /&gt;
and commit messages. Unless these messages are clear it will be difficult to&lt;br /&gt;
understand the relevance of a given change and how future changes may impact&lt;br /&gt;
previous decisions.&lt;br /&gt;
&lt;br /&gt;
This policy refers both to patches that are being applied by recipes as well as&lt;br /&gt;
commit messages that are part of the source control system, usually git. A patch&lt;br /&gt;
file needs a header in order to describe the specific changes that are made&lt;br /&gt;
within that patch, while a commit message describes one or more changes to the&lt;br /&gt;
overall project or system. Both the patch headers and commit messages require&lt;br /&gt;
the same attention and basic details, however the purposes of the messages are&lt;br /&gt;
slightly different. A commit message documents all of the changes made as part&lt;br /&gt;
of a commit, while a patch header documents items specific to a single patch. In&lt;br /&gt;
many cases the patch header can also be used as the commit message.&lt;br /&gt;
&lt;br /&gt;
This policy does not cover the testing of the changes, or the technical criteria&lt;br /&gt;
for accepting a patch.&lt;br /&gt;
&lt;br /&gt;
By following these guidelines we will have a better record of the problems and&lt;br /&gt;
solutions made over the course of development. It will also help establish a&lt;br /&gt;
clear provenance of all of the code and changes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Approved by the Technical Steering Committee 2011/06/09.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
&lt;br /&gt;
While specific to the Linux kernel development, the following could also be&lt;br /&gt;
considered a general guide for any Open Source development:&lt;br /&gt;
&lt;br /&gt;
http://ldn.linuxfoundation.org/book/how-participate-linux-community&lt;br /&gt;
&lt;br /&gt;
Many of the guidelines in this document are related to the items in that&lt;br /&gt;
information.&lt;br /&gt;
&lt;br /&gt;
Pay particular attention to section 5.3 that talks about patch preparation.&lt;br /&gt;
The key thing to remember is to break up your changes into logical sections.&lt;br /&gt;
Otherwise you run the risk of not being able to even explain the purpose of a&lt;br /&gt;
change in the patch headers!&lt;br /&gt;
&lt;br /&gt;
In addition section 5.4 explains the purpose of the Signed-off-by: tag line as&lt;br /&gt;
discussed in later parts of this document. Due to the importance of the&lt;br /&gt;
Signed-off-by: tag line a copy of the description follows:&lt;br /&gt;
&lt;br /&gt;
   Signed-off-by: this is a developer&#039;s certification that he or she has&lt;br /&gt;
   the right to submit the patch for inclusion into the [project].  It is&lt;br /&gt;
   an agreement to the Developer&#039;s Certificate of Origin, the full text of&lt;br /&gt;
   which can be found in [Linux Kernel] Documentation/SubmittingPatches.&lt;br /&gt;
   Code without a proper signoff cannot be merged into the mainline.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more information on the Developer&#039;s Certificate of Origin and the Linux&lt;br /&gt;
Kernel Documentation/SubmittingPatches, see:&lt;br /&gt;
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/SubmittingPatches&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Patch Headers and Commit Messages ==&lt;br /&gt;
&lt;br /&gt;
There seems to always be a question or two surrounding what a person&lt;br /&gt;
should put in a patch header, or commit message.&lt;br /&gt;
&lt;br /&gt;
The general rules always apply, those being that there is a single line&lt;br /&gt;
short log or summary of the change (think of this as the subject when the patch&lt;br /&gt;
is e-mailed), and then the more detailed long log, and closure with tag lines&lt;br /&gt;
such as &amp;quot;Signed-off-by:&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== New development ==&lt;br /&gt;
&lt;br /&gt;
A minimal patch or commit message would be of the format:&lt;br /&gt;
&lt;br /&gt;
   Short log / Statement of what needed to be changed.&lt;br /&gt;
   &lt;br /&gt;
   (Optional pointers to external resources, such as defect tracking)&lt;br /&gt;
   &lt;br /&gt;
   The intent of your change.&lt;br /&gt;
   &lt;br /&gt;
   (Optional, if it&#039;s not clear from above) how your change resolves the&lt;br /&gt;
   issues in the first part.&lt;br /&gt;
   &lt;br /&gt;
   Tag line(s) at the end.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
   foobar: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   When using foobar on systems with less than a gigabyte of RAM common&lt;br /&gt;
   usage patterns often result in an Out-of-memory condition causing&lt;br /&gt;
   slowdowns and unexpected application termination.&lt;br /&gt;
   &lt;br /&gt;
   Low-memory systems should continue to function without running into&lt;br /&gt;
   memory-starvation conditions with minimal cost to systems with more&lt;br /&gt;
   available memory.  High-memory systems will be less able to use the&lt;br /&gt;
   full extent of the system, a dynamically tunable option may be best,&lt;br /&gt;
   long-term.&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The minimal commit message is good for new code development and simple changes.&lt;br /&gt;
&lt;br /&gt;
The single short log message indicates what needed to be changed. It should&lt;br /&gt;
begin with an indicator as to the primary item changed by this work,&lt;br /&gt;
followed by a short summary of the change. In the above case we&#039;re indicating&lt;br /&gt;
that we&#039;ve changed the &amp;quot;foobar&amp;quot; item, by &amp;quot;adjusting the foo setting in bar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The single short log message is analogous to the git &amp;quot;commit summary&amp;quot;. While no&lt;br /&gt;
maximum line length is specified by this policy, it is suggested that it remains&lt;br /&gt;
under 78 characters wherever possible.&lt;br /&gt;
&lt;br /&gt;
Optionally, you may include pointers to defects this change corrects. Unless&lt;br /&gt;
the defect format is specified by the component you are modifying, it is&lt;br /&gt;
suggested that you use a full URL to specify the reference to the defect&lt;br /&gt;
information. Generally these pointers will precede any long description, but as&lt;br /&gt;
an optional item it may be after the long description.&lt;br /&gt;
&lt;br /&gt;
For example, you might refer to an open source defect in the RPM project:&lt;br /&gt;
&lt;br /&gt;
   rpm: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;[RPM Ticket #65] -- http://rpm5.org/cvs/tktview?tn=65,5&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must then have a full description of the change. Specifying the intent of&lt;br /&gt;
your change and if necessary how the change resolves the issue.&lt;br /&gt;
&lt;br /&gt;
As mentioned above this is intended to answer the &amp;quot;what were you thinking&amp;quot;&lt;br /&gt;
questions down the road and to know what other impacts are likely to&lt;br /&gt;
result of the change needs to be reverted. It also allows for better&lt;br /&gt;
solutions if someone comes along later and agrees with paragraph 1&lt;br /&gt;
(the problem statement) and either disagrees with paragraph 2&lt;br /&gt;
(the design) or paragraph 3 (the implementation).&lt;br /&gt;
&lt;br /&gt;
Finally one or more tag lines should exist. Each developer responsible&lt;br /&gt;
for working on the patch is responsible for adding a Signed-off-by: tag line.&lt;br /&gt;
&lt;br /&gt;
It is not acceptable to have an empty or non-existent header, or just a single&lt;br /&gt;
line message. The summary and description is required for all changes.&lt;br /&gt;
&lt;br /&gt;
== Importing from elsewhere ==&lt;br /&gt;
&lt;br /&gt;
If you are importing work from somewhere else, such as a cherry-pick from&lt;br /&gt;
another repository or a code patch pulled from a mailing list, the minimum patch&lt;br /&gt;
header or commit message is not enough. It does not clearly establish the&lt;br /&gt;
provenance of the code.&lt;br /&gt;
&lt;br /&gt;
The following specifies the additional guidelines required for importing changes&lt;br /&gt;
from elsewhere.&lt;br /&gt;
&lt;br /&gt;
By default you should keep the original author&#039;s summary and description,&lt;br /&gt;
along with any tag lines such as, &amp;quot;Signed-off-by:&amp;quot;. If the original change that&lt;br /&gt;
was imported does not have a summary and/or commit message from the original&lt;br /&gt;
author, it is still your responsibility to add the summary and commit message to&lt;br /&gt;
the patch header. Just as if you wrote the code, you should be able to clearly&lt;br /&gt;
explain what the change does. It is also necessary to document the original&lt;br /&gt;
author of the change. You should indicate the original author by simply stating&lt;br /&gt;
&amp;quot;written by&amp;quot; or &amp;quot;posted to the ... mailing list by&amp;quot;. You must not add a&lt;br /&gt;
Signed-off-by: tag line with their name, only the original author may add their&lt;br /&gt;
own Signed-off-by: tag line.&lt;br /&gt;
&lt;br /&gt;
It is also required that the origin of the work be fully documented. The origin&lt;br /&gt;
should be specified as part of the commit message in a way that an average&lt;br /&gt;
developer would be able to track down the original code. URLs should reference&lt;br /&gt;
original authoritative sources and not mirrors.&lt;br /&gt;
&lt;br /&gt;
If changes were required to resolve conflicts, they should be documented as&lt;br /&gt;
well.  When incorporating a commit or patch from an external source, changes to&lt;br /&gt;
the functionality not related to resolving conflicts should be made in a&lt;br /&gt;
second commit or patch.  This preserves the original external commit, and makes&lt;br /&gt;
the modifications clearly visible, and prevents confusion over the author of the&lt;br /&gt;
code.&lt;br /&gt;
&lt;br /&gt;
Finally you must add a &amp;quot;Signed-off-by:&amp;quot; tag line to indicate that you worked&lt;br /&gt;
with the patch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Example: Importing form elsewhere unmodified ==&lt;br /&gt;
&lt;br /&gt;
For example, if you were to pull in the patch from the above example unmodified:&lt;br /&gt;
&lt;br /&gt;
   foobar: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   When using foobar on systems with less than a gigabyte of RAM common&lt;br /&gt;
   usage patterns often result in an Out-of-memory condition causing&lt;br /&gt;
   slowdowns and unexpected application termination.&lt;br /&gt;
   &lt;br /&gt;
   Low-memory systems should continue to function without running into&lt;br /&gt;
   memory-starvation conditions with minimal cost to systems with more&lt;br /&gt;
   available memory.  High-memory systems will be less able to use the&lt;br /&gt;
   full extent of the system, a dynamically tunable option may be best,&lt;br /&gt;
   long-term.&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The patch was imported from the OpenEmbedded git server&lt;br /&gt;
   (&amp;lt;nowiki&amp;gt;git://git.openembedded.org/openembedded&amp;lt;/nowiki&amp;gt;) as of commit id&lt;br /&gt;
   b65a0e0c84cf489bfa00d6aa6c48abc5a237100f.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Your Name &amp;lt;your.name@openembedded.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above example shows a clear way for a developer to find the original source&lt;br /&gt;
of the change. It indicates that the OpenEmbedded developer simply integrated&lt;br /&gt;
the change into the system without making any further modifications.&lt;br /&gt;
&lt;br /&gt;
== Example: Importing from Elsewhere modified ==&lt;br /&gt;
&lt;br /&gt;
When importing a patch, occasionally changes have to be made in order to resolve&lt;br /&gt;
conflicts.  The following is an example of the commit message when the item needed&lt;br /&gt;
to be modified:&lt;br /&gt;
&lt;br /&gt;
   foobar: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   When using foobar on systems with less than a gigabyte of RAM common&lt;br /&gt;
   usage patterns often result in an Out-of-memory condition causing&lt;br /&gt;
   slowdowns and unexpected application termination.&lt;br /&gt;
   &lt;br /&gt;
   Low-memory systems should continue to function without running into&lt;br /&gt;
   memory-starvation conditions with minimal cost to systems with more&lt;br /&gt;
   available memory.  High-memory systems will be less able to use the&lt;br /&gt;
   full extent of the system, a dynamically tunable option may be best,&lt;br /&gt;
   long-term.&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The patch was imported from the OpenEmbedded git server&lt;br /&gt;
   (&amp;lt;nowiki&amp;gt;git://git.openembedded.org/openembedded&amp;lt;/nowiki&amp;gt;) as of commit id&lt;br /&gt;
   b65a0e0c84cf489bfa00d6aa6c48abc5a237100f.&lt;br /&gt;
   &lt;br /&gt;
   A previous change had modified the memory threshold calculation,&lt;br /&gt;
   causing a conflict.  The conflict was resolved by preserving the&lt;br /&gt;
   memory threshold calculation from the existing implementation.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Your Name &amp;lt;your.name@openembedded.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Patch Header Recommendations ==&lt;br /&gt;
&lt;br /&gt;
In order to keep track of patches and ultimately reduce the number of patches&lt;br /&gt;
that are required to be maintained, we need to track the status of the patches&lt;br /&gt;
that are created. The following items are specific to patches applied by recipes.&lt;br /&gt;
&lt;br /&gt;
In addition to the items mentioned above, we also want to track if it&#039;s&lt;br /&gt;
appropriate to get this particular patch into the upstream project. Since we&lt;br /&gt;
want to track this information, we need a consistent tag and status indicator&lt;br /&gt;
that can be searched.&lt;br /&gt;
&lt;br /&gt;
While adding this tracking information to the patch headers is currently&lt;br /&gt;
optional, it is highly recommended and some maintainers may require it.  It is&lt;br /&gt;
optional at this time so that it can be evaluated as to its usefulness over&lt;br /&gt;
time.  Existing patches will be modified with the tag as they are modified.&lt;br /&gt;
&lt;br /&gt;
As mentioned in the above, be sure to include any URL to bug tracking, mailing&lt;br /&gt;
lists or other reference material pertaining to the patch. Then add a new tag&lt;br /&gt;
&amp;quot;Upstream-Status:&amp;quot; which contains one of the following items:&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Pending&#039;&#039;&#039;&lt;br /&gt;
   - No determination has been made yet or not yet submitted to upstream&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Submitted&#039;&#039;&#039; [where]&lt;br /&gt;
   - Submitted to upstream, waiting approval&lt;br /&gt;
   - Optionally include where it was submitted, such as the author, mailing&lt;br /&gt;
     list, etc.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Accepted&#039;&#039;&#039;&lt;br /&gt;
   - Accepted in upstream, expect it to be removed at next update, include&lt;br /&gt;
     expected version info&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Backport&#039;&#039;&#039;&lt;br /&gt;
   - Backported from new upstream version, because we are at a fixed version,&lt;br /&gt;
     include upstream version info&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Denied&#039;&#039;&#039;&lt;br /&gt;
   - Not accepted by upstream, include reason in patch&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Inappropriate [reason]&#039;&#039;&#039;&lt;br /&gt;
   - The patch is not appropriate for upstream, include a brief reason on the&lt;br /&gt;
     same line enclosed with []&lt;br /&gt;
     reason can be:&lt;br /&gt;
       not author (You are not the author and do not intend to upstream this,&lt;br /&gt;
                   source must be listed in the comments)&lt;br /&gt;
       native&lt;br /&gt;
       licensing&lt;br /&gt;
       configuration&lt;br /&gt;
       enable feature&lt;br /&gt;
       disable feature&lt;br /&gt;
       bugfix (add bug URL here)&lt;br /&gt;
       embedded specific&lt;br /&gt;
       no upstream (the upstream is no longer available -- dead project)&lt;br /&gt;
       other (give details in comments)&lt;br /&gt;
&lt;br /&gt;
The various &amp;quot;Inappropriate [reason]&amp;quot; status items are meant to indicate that the&lt;br /&gt;
person responsible for adding this patch to the system does not intend to&lt;br /&gt;
upstream the patch for a specific reason.  Unless otherwise noted, another&lt;br /&gt;
person could submit this patch to the upstream, if they do the status should be&lt;br /&gt;
changed to &amp;quot;Submitted [where]&amp;quot;, and an additional Signed-off-by: line added to&lt;br /&gt;
the patch by the person claiming responsibility for upstreaming.&lt;br /&gt;
&lt;br /&gt;
For example, if the patch has been submitted upstream:&lt;br /&gt;
&lt;br /&gt;
   rpm: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;[RPM Ticket #65] -- http://rpm5.org/cvs/tktview?tn=65,5&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Upstream-Status: Submitted [rpm5-devel@rpm5.org]&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A future commit can change the value to &amp;quot;Accepted&amp;quot; or &amp;quot;Denied&amp;quot; as appropriate.&lt;br /&gt;
&lt;br /&gt;
== Common Errors in Patch and Commit Messages ==&lt;br /&gt;
&lt;br /&gt;
- Short log does not start with the file or component being modified.  Such as&lt;br /&gt;
&amp;quot;foo: Update to new upstream version 5.8.9&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Avoid starting the summary line with a capital letter, unless the component&lt;br /&gt;
being referred to also begins with a capital letter.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t have one huge patch, split your change into logical subparts. It&#039;s&lt;br /&gt;
easier to track down problems afterward using tools such as git bisect. It also&lt;br /&gt;
makes it easy for people to cherry-pick changes into things like stable branches.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t simply translate your change into English for a commit log. The log&lt;br /&gt;
&amp;quot;Change compare from zero to one&amp;quot; is bad because it describes only the code&lt;br /&gt;
change in the patch; we can see that from reading the patch itself. Let the code&lt;br /&gt;
tell the story of the mechanics of the change (as much as possible), and let&lt;br /&gt;
your comment tell the other details -- i.e. what the problem was, how it&lt;br /&gt;
manifested itself (symptoms), and if necessary, the justification for why the&lt;br /&gt;
fix was done in manner that it was.  In other words, the long commit message&lt;br /&gt;
must describe *why* the change was needed (instead of what has changed).&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t start your commit log with &amp;quot;This patch...&amp;quot; -- we already know it is a patch.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t repeat your short log in the long log. If you really really don&#039;t have&lt;br /&gt;
anything new and informational to add in as a long log, then don&#039;t put a long&lt;br /&gt;
log at all. This should be uncommon -- i.e. the only acceptable cases for no&lt;br /&gt;
long log would be something like &amp;quot;Documentation/README: Fix spelling mistakes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t put absolute paths to source files that are specific to your site, i.e.&lt;br /&gt;
if you get a compile error on &amp;quot;fs/exec.c&amp;quot; then tidy up the parts of the compile&lt;br /&gt;
output to just show that portion. We don&#039;t need to see that it was&lt;br /&gt;
/home/wally/src/git/oe-core/meta/classes/insane.bbclass or similar - that full&lt;br /&gt;
path has no value to others. Always reduce the path to something more&lt;br /&gt;
meaningful, such as oe-core/meta/classes/insane.bbclass.&lt;br /&gt;
&lt;br /&gt;
- Always use the most significant ramification of the change in the words of&lt;br /&gt;
your subject/shortlog. For example, don&#039;t say &amp;quot;fix compile warning in foo&amp;quot; when&lt;br /&gt;
the compiler warning was really telling us that we were dereferencing complete&lt;br /&gt;
garbage off in the weeds that could in theory cause an OOPS under some&lt;br /&gt;
circumstances. When people are choosing commits for backports to stable or&lt;br /&gt;
distro kernels, the shortlog will be what they use for an initial sorting&lt;br /&gt;
selection. If they see &amp;quot;Fix possible OOPS in....&amp;quot; then these people will look&lt;br /&gt;
closer, whereas they most likely will skip over simple warning fixes.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t put in the full 20 or more lines of a backtrace when really it is just&lt;br /&gt;
the last 5 or so function calls that are relevant to the crash/fix. If the entry&lt;br /&gt;
point, or start of the trace is relevant (i.e. a syscall or similar), you can&lt;br /&gt;
leave that, and then replace a chunk of the intermediate calls in the middle&lt;br /&gt;
with a single [...]&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t include timestamps or other unnecessary information, unless they are&lt;br /&gt;
relevant to the situation (i.e. indicating an unacceptable delay in a driver&lt;br /&gt;
initialization etc.)&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t use links to temporary resources like pastebin and friends. The commit&lt;br /&gt;
message may be read long after this resource timed out.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t reference mirrors, but instead always reference original authoritative&lt;br /&gt;
sources.&lt;br /&gt;
&lt;br /&gt;
- Avoid punctuation in the short log.&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
	<entry>
		<id>https://www.openembedded.org/w/index.php?title=Commit_Patch_Message_Guidelines&amp;diff=4297</id>
		<title>Commit Patch Message Guidelines</title>
		<link rel="alternate" type="text/html" href="https://www.openembedded.org/w/index.php?title=Commit_Patch_Message_Guidelines&amp;diff=4297"/>
		<updated>2011-06-14T15:54:07Z</updated>

		<summary type="html">&lt;p&gt;Mhatle: Created page with &amp;quot;This set of guidelines is intended to help both the developer and reviewers of changes determine reasonable patch headers and change commit messages. Often when working with the ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This set of guidelines is intended to help both the developer and reviewers of&lt;br /&gt;
changes determine reasonable patch headers and change commit messages. Often&lt;br /&gt;
when working with the code, you forget that not everyone is as familiar with the&lt;br /&gt;
problem and/or fix as you are. Often the next person in the code doesn&#039;t&lt;br /&gt;
understand what or why something is done so they quickly look at patch header&lt;br /&gt;
and commit messages. Unless these messages are clear it will be difficult to&lt;br /&gt;
understand the relevance of a given change and how future changes may impact&lt;br /&gt;
previous decisions.&lt;br /&gt;
&lt;br /&gt;
This policy refers both to patches that are being applied by recipes as well as&lt;br /&gt;
commit messages that are part of the source control system, usually git. A patch&lt;br /&gt;
file needs a header in order to describe the specific changes that are made&lt;br /&gt;
within that patch, while a commit message describes one or more changes to the&lt;br /&gt;
overall project or system. Both the patch headers and commit messages require&lt;br /&gt;
the same attention and basic details, however the purposes of the messages are&lt;br /&gt;
slightly different. A commit message documents all of the changes made as part&lt;br /&gt;
of a commit, while a patch header documents items specific to a single patch. In&lt;br /&gt;
many cases the patch header can also be used as the commit message.&lt;br /&gt;
&lt;br /&gt;
This policy does not cover the testing of the changes, or the technical criteria&lt;br /&gt;
for accepting a patch.&lt;br /&gt;
&lt;br /&gt;
By following these guidelines we will have a better record of the problems and&lt;br /&gt;
solutions made over the course of development. It will also help establish a&lt;br /&gt;
clear provenance of all of the code and changes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Approved by the Technical Steering Committee 2011/06/09.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
&lt;br /&gt;
While specific to the Linux kernel development, the following could also be&lt;br /&gt;
considered a general guide for any Open Source development:&lt;br /&gt;
&lt;br /&gt;
http://ldn.linuxfoundation.org/book/how-participate-linux-community&lt;br /&gt;
&lt;br /&gt;
Many of the guidelines in this document are related to the items in that&lt;br /&gt;
information.&lt;br /&gt;
&lt;br /&gt;
Pay particular attention to section 5.3 that talks about patch preparation.&lt;br /&gt;
The key thing to remember is to break up your changes into logical sections.&lt;br /&gt;
Otherwise you run the risk of not being able to even explain the purpose of a&lt;br /&gt;
change in the patch headers!&lt;br /&gt;
&lt;br /&gt;
In addition section 5.4 explains the purpose of the Signed-off-by: tag line as&lt;br /&gt;
discussed in later parts of this document. Due to the importance of the&lt;br /&gt;
Signed-off-by: tag line a copy of the description follows:&lt;br /&gt;
&lt;br /&gt;
   Signed-off-by: this is a developer&#039;s certification that he or she has&lt;br /&gt;
   the right to submit the patch for inclusion into the [project].  It is&lt;br /&gt;
   an agreement to the Developer&#039;s Certificate of Origin, the full text of&lt;br /&gt;
   which can be found in [Linux Kernel] Documentation/SubmittingPatches.&lt;br /&gt;
   Code without a proper signoff cannot be merged into the mainline.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more information on the Developer&#039;s Certificate of Origin and the Linux&lt;br /&gt;
Kernel Documentation/SubmittingPatches, see:&lt;br /&gt;
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/SubmittingPatches&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Patch Headers and Commit Messages ==&lt;br /&gt;
&lt;br /&gt;
There seems to always be a question or two surrounding what a person&lt;br /&gt;
should put in a patch header, or commit message.&lt;br /&gt;
&lt;br /&gt;
The general rules always apply, those being that there is a single line&lt;br /&gt;
short log or summary of the change (think of this as the subject when the patch&lt;br /&gt;
is e-mailed), and then the more detailed long log, and closure with tag lines&lt;br /&gt;
such as &amp;quot;Signed-off-by:&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== New development ==&lt;br /&gt;
&lt;br /&gt;
A minimal patch or commit message would be of the format:&lt;br /&gt;
&lt;br /&gt;
   Short log / Statement of what needed to be changed.&lt;br /&gt;
   &lt;br /&gt;
   (Optional pointers to external resources, such as defect tracking)&lt;br /&gt;
   &lt;br /&gt;
   The intent of your change.&lt;br /&gt;
   &lt;br /&gt;
   (Optional, if it&#039;s not clear from above) how your change resolves the&lt;br /&gt;
   issues in the first part.&lt;br /&gt;
   &lt;br /&gt;
   Tag line(s) at the end.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
   foobar: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   When using foobar on systems with less than a gigabyte of RAM common&lt;br /&gt;
   usage patterns often result in an Out-of-memory condition causing&lt;br /&gt;
   slowdowns and unexpected application termination.&lt;br /&gt;
   &lt;br /&gt;
   Low-memory systems should continue to function without running into&lt;br /&gt;
   memory-starvation conditions with minimal cost to systems with more&lt;br /&gt;
   available memory.  High-memory systems will be less able to use the&lt;br /&gt;
   full extent of the system, a dynamically tunable option may be best,&lt;br /&gt;
   long-term.&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The minimal commit message is good for new code development and simple changes.&lt;br /&gt;
&lt;br /&gt;
The single short log message indicates what needed to be changed. It should&lt;br /&gt;
begin with an indicator as to the primary item changed by this work,&lt;br /&gt;
followed by a short summary of the change. In the above case we&#039;re indicating&lt;br /&gt;
that we&#039;ve changed the &amp;quot;foobar&amp;quot; item, by &amp;quot;adjusting the foo setting in bar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The single short log message is analogous to the git &amp;quot;commit summary&amp;quot;. While no&lt;br /&gt;
maximum line length is specified by this policy, it is suggested that it remains&lt;br /&gt;
under 78 characters wherever possible.&lt;br /&gt;
&lt;br /&gt;
Optionally, you may include pointers to defects this change corrects. Unless&lt;br /&gt;
the defect format is specified by the component you are modifying, it is&lt;br /&gt;
suggested that you use a full URL to specify the reference to the defect&lt;br /&gt;
information. Generally these pointers will precede any long description, but as&lt;br /&gt;
an optional item it may be after the long description.&lt;br /&gt;
&lt;br /&gt;
For example, you might refer to an open source defect in the RPM project:&lt;br /&gt;
&lt;br /&gt;
   rpm: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;[RPM Ticket #65] -- http://rpm5.org/cvs/tktview?tn=65,5&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must then have a full description of the change. Specifying the intent of&lt;br /&gt;
your change and if necessary how the change resolves the issue.&lt;br /&gt;
&lt;br /&gt;
As mentioned above this is intended to answer the &amp;quot;what were you thinking&amp;quot;&lt;br /&gt;
questions down the road and to know what other impacts are likely to&lt;br /&gt;
result of the change needs to be reverted. It also allows for better&lt;br /&gt;
solutions if someone comes along later and agrees with paragraph 1&lt;br /&gt;
(the problem statement) and either disagrees with paragraph 2&lt;br /&gt;
(the design) or paragraph 3 (the implementation).&lt;br /&gt;
&lt;br /&gt;
Finally one or more tag lines should exist. Each developer responsible&lt;br /&gt;
for working on the patch is responsible for adding a Signed-off-by: tag line.&lt;br /&gt;
&lt;br /&gt;
It is not acceptable to have an empty or non-existent header, or just a single&lt;br /&gt;
line message. The summary and description is required for all changes.&lt;br /&gt;
&lt;br /&gt;
== Importing from elsewhere ==&lt;br /&gt;
&lt;br /&gt;
If you are importing work from somewhere else, such as a cherry-pick from&lt;br /&gt;
another repository or a code patch pulled from a mailing list, the minimum patch&lt;br /&gt;
header or commit message is not enough. It does not clearly establish the&lt;br /&gt;
provenance of the code.&lt;br /&gt;
&lt;br /&gt;
The following specifies the additional guidelines required for importing changes&lt;br /&gt;
from elsewhere.&lt;br /&gt;
&lt;br /&gt;
By default you should keep the original author&#039;s summary and description,&lt;br /&gt;
along with any tag lines such as, &amp;quot;Signed-off-by:&amp;quot;. If the original change that&lt;br /&gt;
was imported does not have a summary and/or commit message from the original&lt;br /&gt;
author, it is still your responsibility to add the summary and commit message to&lt;br /&gt;
the patch header. Just as if you wrote the code, you should be able to clearly&lt;br /&gt;
explain what the change does. It is also necessary to document the original&lt;br /&gt;
author of the change. You should indicate the original author by simply stating&lt;br /&gt;
&amp;quot;written by&amp;quot; or &amp;quot;posted to the ... mailing list by&amp;quot;. You must not add a&lt;br /&gt;
Signed-off-by: tag line with their name, only the original author may add their&lt;br /&gt;
own Signed-off-by: tag line.&lt;br /&gt;
&lt;br /&gt;
It is also required that the origin of the work be fully documented. The origin&lt;br /&gt;
should be specified as part of the commit message in a way that an average&lt;br /&gt;
developer would be able to track down the original code. URLs should reference&lt;br /&gt;
original authoritative sources and not mirrors.&lt;br /&gt;
&lt;br /&gt;
If changes were required to resolve conflicts, they should be documented as&lt;br /&gt;
well.  When incorporating a commit or patch from an external source, changes to&lt;br /&gt;
the functionality not related to resolving conflicts should be made in a&lt;br /&gt;
second commit or patch.  This preserves the original external commit, and makes&lt;br /&gt;
the modifications clearly visible, and prevents confusion over the author of the&lt;br /&gt;
code.&lt;br /&gt;
&lt;br /&gt;
Finally you must add a &amp;quot;Signed-off-by:&amp;quot; tag line to indicate that you worked&lt;br /&gt;
with the patch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Example: Importing form elsewhere unmodified ==&lt;br /&gt;
&lt;br /&gt;
For example, if you were to pull in the patch from the above example unmodified:&lt;br /&gt;
&lt;br /&gt;
   foobar: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   When using foobar on systems with less than a gigabyte of RAM common&lt;br /&gt;
   usage patterns often result in an Out-of-memory condition causing&lt;br /&gt;
   slowdowns and unexpected application termination.&lt;br /&gt;
   &lt;br /&gt;
   Low-memory systems should continue to function without running into&lt;br /&gt;
   memory-starvation conditions with minimal cost to systems with more&lt;br /&gt;
   available memory.  High-memory systems will be less able to use the&lt;br /&gt;
   full extent of the system, a dynamically tunable option may be best,&lt;br /&gt;
   long-term.&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The patch was imported from the OpenEmbedded git server&lt;br /&gt;
   (&amp;lt;nowiki&amp;gt;git://git.openembedded.org/openembedded&amp;lt;/nowiki&amp;gt;) as of commit id&lt;br /&gt;
   b65a0e0c84cf489bfa00d6aa6c48abc5a237100f.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Your Name &amp;lt;your.name@openembedded.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above example shows a clear way for a developer to find the original source&lt;br /&gt;
of the change. It indicates that the OpenEmbedded developer simply integrated&lt;br /&gt;
the change into the system without making any further modifications.&lt;br /&gt;
&lt;br /&gt;
== Example: Importing from Elsewhere modified ==&lt;br /&gt;
&lt;br /&gt;
When importing a patch, occasionally changes have to be made in order to resolve&lt;br /&gt;
conflicts.  The following is an example of the commit message when the item needed&lt;br /&gt;
to be modified:&lt;br /&gt;
&lt;br /&gt;
   foobar: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   When using foobar on systems with less than a gigabyte of RAM common&lt;br /&gt;
   usage patterns often result in an Out-of-memory condition causing&lt;br /&gt;
   slowdowns and unexpected application termination.&lt;br /&gt;
   &lt;br /&gt;
   Low-memory systems should continue to function without running into&lt;br /&gt;
   memory-starvation conditions with minimal cost to systems with more&lt;br /&gt;
   available memory.  High-memory systems will be less able to use the&lt;br /&gt;
   full extent of the system, a dynamically tunable option may be best,&lt;br /&gt;
   long-term.&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The patch was imported from the OpenEmbedded git server&lt;br /&gt;
   (&amp;lt;nowiki&amp;gt;git://git.openembedded.org/openembedded&amp;lt;/nowiki&amp;gt;) as of commit id&lt;br /&gt;
   b65a0e0c84cf489bfa00d6aa6c48abc5a237100f.&lt;br /&gt;
   &lt;br /&gt;
   A previous change had modified the memory threshold calculation,&lt;br /&gt;
   causing a conflict.  The conflict was resolved by preserving the&lt;br /&gt;
   memory threshold calculation from the existing implementation.&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Your Name &amp;lt;your.name@openembedded.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Patch Header Recommendations ==&lt;br /&gt;
&lt;br /&gt;
In order to keep track of patches and ultimately reduce the number of patches&lt;br /&gt;
that are required to be maintained, we need to track the status of the patches&lt;br /&gt;
that are created. The following items are specific to patches applied by recipes.&lt;br /&gt;
&lt;br /&gt;
In addition to the items mentioned above, we also want to track if it&#039;s&lt;br /&gt;
appropriate to get this particular patch into the upstream project. Since we&lt;br /&gt;
want to track this information, we need a consistent tag and status indicator&lt;br /&gt;
that can be searched.&lt;br /&gt;
&lt;br /&gt;
While adding this tracking information to the patch headers is currently&lt;br /&gt;
optional, it is highly recommended and some maintainers may require it.  It is&lt;br /&gt;
optional at this time so that it can be evaluated as to its usefulness over&lt;br /&gt;
time.  Existing patches will be modified with the tag as they are modified.&lt;br /&gt;
&lt;br /&gt;
As mentioned in the above, be sure to include any URL to bug tracking, mailing&lt;br /&gt;
lists or other reference material pertaining to the patch. Then add a new tag&lt;br /&gt;
&amp;quot;Upstream-Status:&amp;quot; which contains one of the following items:&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Pending&#039;&#039;&#039;&lt;br /&gt;
   - No determination has been made yet or not yet submitted to upstream&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Submitted&#039;&#039;&#039; [where]&lt;br /&gt;
   - Submitted to upstream, waiting approval&lt;br /&gt;
   - Optionally include where it was submitted, such as the author, mailing&lt;br /&gt;
     list, etc.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Accepted&#039;&#039;&#039;&lt;br /&gt;
   - Accepted in upstream, expect it to be removed at next update, include&lt;br /&gt;
     expected version info&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Backport&#039;&#039;&#039;&lt;br /&gt;
   - Backported from new upstream version, because we are at a fixed version,&lt;br /&gt;
     include upstream version info&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Denied&#039;&#039;&#039;&lt;br /&gt;
   - Not accepted by upstream, include reason in patch&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;Inappropriate [reason]&#039;&#039;&#039;&lt;br /&gt;
   - The patch is not appropriate for upstream, include a brief reason on the&lt;br /&gt;
     same line enclosed with []&lt;br /&gt;
     reason can be:&lt;br /&gt;
       not author (You are not the author and do not intend to upstream this,&lt;br /&gt;
                   source must be listed in the comments)&lt;br /&gt;
       native&lt;br /&gt;
       licensing&lt;br /&gt;
       configuration&lt;br /&gt;
       enable feature&lt;br /&gt;
       disable feature&lt;br /&gt;
       bugfix (add bug URL here)&lt;br /&gt;
       embedded specific&lt;br /&gt;
       no upstream (the upstream is no longer available -- dead project)&lt;br /&gt;
       other (give details in comments)&lt;br /&gt;
&lt;br /&gt;
The various &amp;quot;Inappropriate [reason]&amp;quot; status items are meant to indicate that the&lt;br /&gt;
person responsible for adding this patch to the system does not intend to&lt;br /&gt;
upstream the patch for a specific reason.  Unless otherwise noted, another&lt;br /&gt;
person could submit this patch to the upstream, if they do the status should be&lt;br /&gt;
changed to &amp;quot;Submitted [where]&amp;quot;, and an additional Signed-off-by: line added to&lt;br /&gt;
the patch by the person claiming responsibility for upstreaming.&lt;br /&gt;
&lt;br /&gt;
For example, if the patch has been submitted upstream:&lt;br /&gt;
&lt;br /&gt;
   rpm: Adjusted the foo setting in bar&lt;br /&gt;
   &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;[RPM Ticket #65] -- http://rpm5.org/cvs/tktview?tn=65,5&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   The foo setting in bar was decreased from X to X-50% in order to&lt;br /&gt;
   ensure we don&#039;t exhaust all system memory with foobar threads.&lt;br /&gt;
   &lt;br /&gt;
   Upstream-Status: Submitted [rpm5-devel@rpm5.org]&lt;br /&gt;
   &lt;br /&gt;
   Signed-off-by: Joe Developer &amp;lt;joe.developer@example.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A future commit can change the value to &amp;quot;Accepted&amp;quot; or &amp;quot;Denied&amp;quot; as appropriate.&lt;br /&gt;
&lt;br /&gt;
== Common Errors in Patch and Commit Messages ==&lt;br /&gt;
&lt;br /&gt;
- Short log does not start with the file or component being modified.  Such as&lt;br /&gt;
&amp;quot;foo: Update to new upstream version 5.8.9&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Avoid starting the summary line with a capital letter, unless the component&lt;br /&gt;
being referred to also begins with a capital letter.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t have one huge patch, split your change into logical subparts. It&#039;s&lt;br /&gt;
easier to track down problems afterward using tools such as git bisect. It also&lt;br /&gt;
makes it easy for people to cherry-pick changes into things like stable branches.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t simply translate your change into English for a commit log. The log&lt;br /&gt;
&amp;quot;Change compare from zero to one&amp;quot; is bad because it describes only the code&lt;br /&gt;
change in the patch; we can see that from reading the patch itself. Let the code&lt;br /&gt;
tell the story of the mechanics of the change (as much as possible), and let&lt;br /&gt;
your comment tell the other details -- i.e. what the problem was, how it&lt;br /&gt;
manifested itself (symptoms), and if necessary, the justification for why the&lt;br /&gt;
fix was done in manner that it was.  In other words, the long commit message&lt;br /&gt;
must describe *why* the change was needed (instead of what has changed).&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t start your commit log with &amp;quot;This patch...&amp;quot; -- we already know it is a patch.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t repeat your short log in the long log. If you really really don&#039;t have&lt;br /&gt;
anything new and informational to add in as a long log, then don&#039;t put a long&lt;br /&gt;
log at all. This should be uncommon -- i.e. the only acceptable cases for no&lt;br /&gt;
long log would be something like &amp;quot;Documentation/README: Fix spelling mistakes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t put absolute paths to source files that are specific to your site, i.e.&lt;br /&gt;
if you get a compile error on &amp;quot;fs/exec.c&amp;quot; then tidy up the parts of the compile&lt;br /&gt;
output to just show that portion. We don&#039;t need to see that it was&lt;br /&gt;
/home/wally/src/git/oe-core/meta/classes/insane.bbclass or similar - that full&lt;br /&gt;
path has no value to others. Always reduce the path to something more&lt;br /&gt;
meaningful, such as oe-core/meta/classes/insane.bbclass.&lt;br /&gt;
&lt;br /&gt;
- Always use the most significant ramification of the change in the words of&lt;br /&gt;
your subject/shortlog. For example, don&#039;t say &amp;quot;fix compile warning in foo&amp;quot; when&lt;br /&gt;
the compiler warning was really telling us that we were dereferencing complete&lt;br /&gt;
garbage off in the weeds that could in theory cause an OOPS under some&lt;br /&gt;
circumstances. When people are choosing commits for backports to stable or&lt;br /&gt;
distro kernels, the shortlog will be what they use for an initial sorting&lt;br /&gt;
selection. If they see &amp;quot;Fix possible OOPS in....&amp;quot; then these people will look&lt;br /&gt;
closer, whereas they most likely will skip over simple warning fixes.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t put in the full 20 or more lines of a backtrace when really it is just&lt;br /&gt;
the last 5 or so function calls that are relevant to the crash/fix. If the entry&lt;br /&gt;
point, or start of the trace is relevant (i.e. a syscall or similar), you can&lt;br /&gt;
leave that, and then replace a chunk of the intermediate calls in the middle&lt;br /&gt;
with a single [...]&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t include timestamps or other unnecessary information, unless they are&lt;br /&gt;
relevant to the situation (i.e. indicating an unacceptable delay in a driver&lt;br /&gt;
initialization etc.)&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t use links to temporary resources like pastebin and friends. The commit&lt;br /&gt;
message may be read long after this resource timed out.&lt;br /&gt;
&lt;br /&gt;
- Don&#039;t reference mirrors, but instead always reference original authoritative&lt;br /&gt;
sources.&lt;br /&gt;
&lt;br /&gt;
- Avoid punctuation in the short log.&lt;/div&gt;</summary>
		<author><name>Mhatle</name></author>
	</entry>
</feed>