<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> </o:p></p>
<p class="MsoNormal">Signed-off-by: Alan Levy <alan.levy@plextek.com><o:p></o:p></p>
<p class="MsoNormal">---<o:p></o:p></p>
<p class="MsoNormal">meta/classes/base.bbclass | 16 ++++++++++++++--<o:p></o:p></p>
<p class="MsoNormal">meta/conf/bitbake.conf | 4 ++++<o:p></o:p></p>
<p class="MsoNormal">meta/files/warnmissing.sh | 3 +++<o:p></o:p></p>
<p class="MsoNormal">3 files changed, 21 insertions(+), 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> </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">+++ b/meta/classes/base.bbclass<o:p></o:p></p>
<p class="MsoNormal">@@ -112,7 +112,9 @@ def get_lic_checksum_file_list(d):<o:p></o:p></p>
<p class="MsoNormal"> bb.fatal(d.getVar('PN') + ": LIC_FILES_CHKSUM contains an invalid URL: " + url)<o:p></o:p></p>
<p class="MsoNormal"> return " ".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">+def setup_hosttools_dir(dest, toolsvar, d, fatal=True, optional=False):<o:p></o:p></p>
<p class="MsoNormal">+ corebase = d.getVar('COREBASE')<o:p></o:p></p>
<p class="MsoNormal">+ toolwarningscript = os.path.join(corebase, "meta/files/warnmissing.sh")<o:p></o:p></p>
<p class="MsoNormal"> tools = d.getVar(toolsvar).split()<o:p></o:p></p>
<p class="MsoNormal"> origbbenv = d.getVar("BB_ORIGENV", False)<o:p></o:p></p>
<p class="MsoNormal"> path = origbbenv.getVar("PATH")<o:p></o:p></p>
<p class="MsoNormal">@@ -120,6 +122,10 @@ def setup_hosttools_dir(dest, toolsvar, d, fatal=True):<o:p></o:p></p>
<p class="MsoNormal"> notfound = []<o:p></o:p></p>
<p class="MsoNormal"> for tool in tools:<o:p></o:p></p>
<p class="MsoNormal"> desttool = os.path.join(dest, tool)<o:p></o:p></p>
<p class="MsoNormal">+ if optional and os.path.islink(desttool):<o:p></o:p></p>
<p class="MsoNormal">+ # For optional tools remove the symbolic link in case the host package has been<o:p></o:p></p>
<p class="MsoNormal">+ # installed or removed since we last ran<o:p></o:p></p>
<p class="MsoNormal">+ os.remove(desttool)<o:p></o:p></p>
<p class="MsoNormal"> if not os.path.exists(desttool):<o:p></o:p></p>
<p class="MsoNormal"> srctool = bb.utils.which(path, tool, executable=True)<o:p></o:p></p>
<p class="MsoNormal"> if "ccache" in srctool:<o:p></o:p></p>
<p class="MsoNormal">@@ -127,7 +133,12 @@ def setup_hosttools_dir(dest, toolsvar, d, fatal=True):<o:p></o:p></p>
<p class="MsoNormal"> if srctool:<o:p></o:p></p>
<p class="MsoNormal"> os.symlink(srctool, desttool)<o:p></o:p></p>
<p class="MsoNormal"> else:<o:p></o:p></p>
<p class="MsoNormal">- notfound.append(tool)<o:p></o:p></p>
<p class="MsoNormal">+ if optional:<o:p></o:p></p>
<p class="MsoNormal">+ # Optional tools don't need to be present unless they are actually used by a recipe.<o:p></o:p></p>
<p class="MsoNormal">+ # 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">+ os.symlink(toolwarningscript, desttool)<o:p></o:p></p>
<p class="MsoNormal">+ else:<o:p></o:p></p>
<p class="MsoNormal">+ notfound.append(tool)<o:p></o:p></p>
<p class="MsoNormal"> if notfound and fatal:<o:p></o:p></p>
<p class="MsoNormal"> bb.fatal("The following required tools (as specified by HOSTTOOLS) appear to be unavailable in PATH, please install them in order to proceed:\n %s" % " ".join(notfound))<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">@@ -234,6 +245,7 @@ python base_eventhandler() {<o:p></o:p></p>
<p class="MsoNormal"> # Works with the line in layer.conf which changes PATH to point here<o:p></o:p></p>
<p class="MsoNormal"> setup_hosttools_dir(d.getVar('HOSTTOOLS_DIR'), 'HOSTTOOLS', d)<o:p></o:p></p>
<p class="MsoNormal"> setup_hosttools_dir(d.getVar('HOSTTOOLS_DIR'), 'HOSTTOOLS_NONFATAL', d, fatal=False)<o:p></o:p></p>
<p class="MsoNormal">+ 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"> if isinstance(e, bb.event.BuildStarted):<o:p></o:p></p>
<p class="MsoNormal"> 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">+++ b/meta/conf/bitbake.conf<o:p></o:p></p>
<p class="MsoNormal">@@ -477,6 +477,10 @@ HOSTTOOLS_NONFATAL += "aws ccache gcc-ar gpg ld.bfd ld.gold nc sftp socat sudo"<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 += "join nl size yes zcat"<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">+# Tools that can occasionally cause problems at runtime if they aren't present<o:p></o:p></p>
<p class="MsoNormal">+# on the host.<o:p></o:p></p>
<p class="MsoNormal">+HOSTTOOLS_OPTIONAL += "svn cvs bzr hg"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">CCACHE ??= ""<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">+++ b/meta/files/warnmissing.sh<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,3 @@<o:p></o:p></p>
<p class="MsoNormal">+echo "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 `basename $0`"<o:p></o:p></p>
<p class="MsoNormal">+exit 1<o:p></o:p></p>
<p class="MsoNormal">+<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> </o:p></p>
</div>
</body>
</html>