<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";
        mso-fareast-language:EN-US;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">Host tools such as Subversion (svn) are not always installed or needed.<o:p></o:p></p>
<p class="MsoNormal">When they were required by a recipe but not installed the resulting error<o:p></o:p></p>
<p class="MsoNormal">message was not very user friendly. This patch generates a friendly error<o:p></o:p></p>
<p class="MsoNormal">message without forcing the user to install the tools if they aren't<o:p></o:p></p>
<p class="MsoNormal">needed.<o:p></o:p></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal">Signed-off-by: Alan Levy &lt;alan.levy@plextek.com&gt;<o:p></o:p></p>
<p class="MsoNormal">---<o:p></o:p></p>
<p class="MsoNormal">meta/classes/base.bbclass | 16 &#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;--<o:p></o:p></p>
<p class="MsoNormal">meta/conf/bitbake.conf&nbsp;&nbsp;&nbsp; |&nbsp; 4 &#43;&#43;&#43;&#43;<o:p></o:p></p>
<p class="MsoNormal">meta/files/warnmissing.sh |&nbsp; 3 &#43;&#43;&#43;<o:p></o:p></p>
<p class="MsoNormal">3 files changed, 21 insertions(&#43;), 2 deletions(-)<o:p></o:p></p>
<p class="MsoNormal">create mode 100755 meta/files/warnmissing.sh<o:p></o:p></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal">diff --git a/meta/classes/base.bbclass b/meta/classes/base.bbclass<o:p></o:p></p>
<p class="MsoNormal">index 7892665..ecb6956 100644<o:p></o:p></p>
<p class="MsoNormal">--- a/meta/classes/base.bbclass<o:p></o:p></p>
<p class="MsoNormal">&#43;&#43;&#43; b/meta/classes/base.bbclass<o:p></o:p></p>
<p class="MsoNormal">@@ -112,7 &#43;112,9 @@ def get_lic_checksum_file_list(d):<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bb.fatal(d.getVar('PN') &#43; &quot;: LIC_FILES_CHKSUM contains an invalid URL: &quot; &#43; url)<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp; return &quot; &quot;.join(filelist)<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">-def setup_hosttools_dir(dest, toolsvar, d, fatal=True):<o:p></o:p></p>
<p class="MsoNormal">&#43;def setup_hosttools_dir(dest, toolsvar, d, fatal=True, optional=False):<o:p></o:p></p>
<p class="MsoNormal">&#43;&nbsp;&nbsp;&nbsp; corebase = d.getVar('COREBASE')<o:p></o:p></p>
<p class="MsoNormal">&#43;&nbsp;&nbsp;&nbsp; toolwarningscript = os.path.join(corebase, &quot;meta/files/warnmissing.sh&quot;)<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp; tools = d.getVar(toolsvar).split()<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp; origbbenv = d.getVar(&quot;BB_ORIGENV&quot;, False)<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp; path = origbbenv.getVar(&quot;PATH&quot;)<o:p></o:p></p>
<p class="MsoNormal">@@ -120,6 &#43;122,10 @@ def setup_hosttools_dir(dest, toolsvar, d, fatal=True):<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp; notfound = []<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp; for tool in tools:<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; desttool = os.path.join(dest, tool)<o:p></o:p></p>
<p class="MsoNormal">&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if optional and os.path.islink(desttool):<o:p></o:p></p>
<p class="MsoNormal">&#43;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# For optional tools remove the symbolic link in case the host package has been<o:p></o:p></p>
<p class="MsoNormal">&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # installed or removed since we last ran<o:p></o:p></p>
<p class="MsoNormal">&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.remove(desttool)<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not os.path.exists(desttool):<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; srctool = bb.utils.which(path, tool, executable=True)<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if &quot;ccache&quot; in srctool:<o:p></o:p></p>
<p class="MsoNormal">@@ -127,7 &#43;133,12 @@ def setup_hosttools_dir(dest, toolsvar, d, fatal=True):<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if srctool:<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.symlink(srctool, desttool)<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<o:p></o:p></p>
<p class="MsoNormal">-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; notfound.append(tool)<o:p></o:p></p>
<p class="MsoNormal">&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if optional:<o:p></o:p></p>
<p class="MsoNormal">&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Optional tools don't need to be present unless they are actually used by a recipe.<o:p></o:p></p>
<p class="MsoNormal">&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Set up a symlink to a script that generates a runtime error if the tool is used<o:p></o:p></p>
<p class="MsoNormal">&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.symlink(toolwarningscript, desttool)<o:p></o:p></p>
<p class="MsoNormal">&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<o:p></o:p></p>
<p class="MsoNormal">&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; notfound.append(tool)<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp; if notfound and fatal:<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bb.fatal(&quot;The following required tools (as specified by HOSTTOOLS) appear to be unavailable in PATH, please install them in order to proceed:\n&nbsp; %s&quot; % &quot; &quot;.join(notfound))<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">@@ -234,6 &#43;245,7 @@ python base_eventhandler() {<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Works with the line in layer.conf which changes PATH to point here<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setup_hosttools_dir(d.getVar('HOSTTOOLS_DIR'), 'HOSTTOOLS', d)<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setup_hosttools_dir(d.getVar('HOSTTOOLS_DIR'), 'HOSTTOOLS_NONFATAL', d, fatal=False)<o:p></o:p></p>
<p class="MsoNormal">&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setup_hosttools_dir(d.getVar('HOSTTOOLS_DIR'), 'HOSTTOOLS_OPTIONAL', d, fatal=False, optional=True)<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if isinstance(e, bb.event.BuildStarted):<o:p></o:p></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localdata = bb.data.createCopy(e.data)<o:p></o:p></p>
<p class="MsoNormal">diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf<o:p></o:p></p>
<p class="MsoNormal">index 8e4f4bb..6b5a195 100644<o:p></o:p></p>
<p class="MsoNormal">--- a/meta/conf/bitbake.conf<o:p></o:p></p>
<p class="MsoNormal">&#43;&#43;&#43; b/meta/conf/bitbake.conf<o:p></o:p></p>
<p class="MsoNormal">@@ -477,6 &#43;477,10 @@ HOSTTOOLS_NONFATAL &#43;= &quot;aws ccache gcc-ar gpg ld.bfd ld.gold nc sftp socat sudo&quot;<o:p></o:p></p>
<p class="MsoNormal"># Temporary add few more detected in bitbake world<o:p></o:p></p>
<p class="MsoNormal">HOSTTOOLS_NONFATAL &#43;= &quot;join nl size yes zcat&quot;<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">&#43;# Tools that can occasionally cause problems at runtime if they aren't present<o:p></o:p></p>
<p class="MsoNormal">&#43;# on the host.<o:p></o:p></p>
<p class="MsoNormal">&#43;HOSTTOOLS_OPTIONAL &#43;= &quot;svn cvs bzr hg&quot;<o:p></o:p></p>
<p class="MsoNormal">&#43;<o:p></o:p></p>
<p class="MsoNormal">CCACHE ??= &quot;&quot;<o:p></o:p></p>
<p class="MsoNormal"># Disable ccache explicitly if CCACHE is null since gcc may be a symlink<o:p></o:p></p>
<p class="MsoNormal"># of ccache some distributions (e.g., Fedora 17).<o:p></o:p></p>
<p class="MsoNormal">diff --git a/meta/files/warnmissing.sh b/meta/files/warnmissing.sh<o:p></o:p></p>
<p class="MsoNormal">new file mode 100755<o:p></o:p></p>
<p class="MsoNormal">index 0000000..41c707d<o:p></o:p></p>
<p class="MsoNormal">--- /dev/null<o:p></o:p></p>
<p class="MsoNormal">&#43;&#43;&#43; b/meta/files/warnmissing.sh<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 &#43;1,3 @@<o:p></o:p></p>
<p class="MsoNormal">&#43;echo &quot;The following tool (as specified by HOSTTOOLS_OPTIONAL) appears to be unavailable in PATH but is needed by one or more recipes. Please install it in order to proceed:\n&nbsp; `basename $0`&quot;<o:p></o:p></p>
<p class="MsoNormal">&#43;exit 1<o:p></o:p></p>
<p class="MsoNormal">&#43;<o:p></o:p></p>
<p class="MsoNormal">-- <o:p></o:p></p>
<p class="MsoNormal">2.7.4<o:p></o:p></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
</body>
</html>