Compare commits

..

4 Commits

Author SHA1 Message Date
Saul Wold
e5c3513ca8 qemu: fix relocatable patch for M4
Since M4 used 0.15 and the relocatable_sdk was made for 1.2, it needs
to be moved and rebased

Signed-off-by: Saul Wold <sgw@linux.intel.com>
2012-09-15 22:20:09 -07:00
Saul Wold
ae631a5ed0 xserver-xorg: Modify RREPLACES for RCONFLICTS
Signed-off-by: Saul Wold <sgw@linux.intel.com>
2012-09-15 18:29:25 -07:00
Richard Purdie
2611db5d9c bitbake.conf: Assign SRCPV so that it will be tracked correcting in the sstate checksum
Currently, SRCPV is just listed as having a value of ${@bb.fetch2.get_srcrev(d)}
which isn't helpful. This can mean that if PV changes, two recipes can have the
same sstate checksum despite having different PV values since the PV value itself
isn't tracked anywhere.

Adding this line means that the real PV value is expanded and recorded in the sstate
checksum, meaning the sstate packages no longer overlap. This is critical in ensuring
consistent builds for revipes using SRCPV.

(From OE-Core rev: a9fffadec4fb60547257cb3d7496b6e39ed07be8)

Signed-off-by: Saul Wold <sgw@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2012-09-14 18:39:18 -07:00
Laurentiu Palcu
aeb336516b nativesdk-qemu: fix SDK relocation issue
User mode emulation binaries are linked using a local linker script. The
nativesdk ones were not used and the resulting binaries did not have the
interp section resized. Hence, those binaries could not be relocated.

[YOCTO #3083]

(From OE-Core rev: da014e900adfe96f01290c5a8f5fb08e295ca204)

Signed-off-by: Laurentiu Palcu <laurentiu.palcu@intel.com>
Signed-off-by: Saul Wold <sgw@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2012-09-14 18:38:18 -07:00
765 changed files with 16705 additions and 32103 deletions

7
.gitignore vendored
View File

@@ -1,3 +1,4 @@
bitbake
*.pyc
*.pyo
/*.patch
@@ -8,10 +9,10 @@ scripts/oe-git-proxy-socks
sources/
meta-*
!meta-skeleton
!meta-hob
!meta-demoapps
*.swp
*.orig
*.rej
*~
!meta-yocto
!meta-yocto-bsp

View File

@@ -40,17 +40,9 @@ from bb import cooker
from bb import ui
from bb import server
__version__ = "1.16.0"
__version__ = "1.15.3"
logger = logging.getLogger("BitBake")
# Unbuffer stdout to avoid log truncation in the event
# of an unorderly exit as well as to provide timely
# updates to log files for use with tail
try:
if sys.stdout.name == '<stdout>':
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
except:
pass
class BBConfiguration(object):
"""
@@ -182,8 +174,6 @@ Default BBFILES are the .bb files in the current directory.""")
parser.add_option("-B", "--bind", help = "The name/address for the bitbake server to bind to",
action = "store", dest = "bind", default = False)
parser.add_option("", "--no-setscene", help = "Do not run any setscene tasks, forces builds",
action = "store_true", dest = "nosetscene", default = False)
options, args = parser.parse_args(sys.argv)
configuration = BBConfiguration(options)

View File

@@ -1,102 +1,12 @@
#!/usr/bin/env python
# bitbake-diffsigs
# BitBake task signature data comparison utility
#
# Copyright (C) 2012 Intel Corporation
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
import os
import sys
import warnings
import fnmatch
import optparse
import logging
sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(sys.argv[0])), 'lib'))
import bb.tinfoil
import bb.siggen
logger = logging.getLogger('BitBake')
def find_compare_task(bbhandler, pn, taskname):
""" Find the most recent signature files for the specified PN/task and compare them """
if not hasattr(bb.siggen, 'find_siginfo'):
logger.error('Metadata does not support finding signature data files')
sys.exit(1)
filedates = bb.siggen.find_siginfo(pn, taskname, None, bbhandler.config_data)
latestfiles = sorted(filedates.keys(), key=lambda f: filedates[f])[-2:]
if not latestfiles:
logger.error('No sigdata files found matching %s %s' % (pn, taskname))
sys.exit(1)
elif len(latestfiles) < 2:
logger.error('Only one matching sigdata file found for the specified task (%s %s)' % (pn, taskname))
sys.exit(1)
else:
# Define recursion callback
def recursecb(key, hash1, hash2):
hashes = [hash1, hash2]
hashfiles = bb.siggen.find_siginfo(key, None, hashes, bbhandler.config_data)
recout = []
if len(hashfiles) == 2:
out2 = bb.siggen.compare_sigfiles(hashfiles[hash1], hashfiles[hash2], recursecb)
recout.extend(list(' ' + l for l in out2))
else:
recout.append("Unable to find matching sigdata for %s with hashes %s or %s" % (key, hash1, hash2))
return recout
# Recurse into signature comparison
output = bb.siggen.compare_sigfiles(latestfiles[0], latestfiles[1], recursecb)
if output:
print '\n'.join(output)
sys.exit(0)
parser = optparse.OptionParser(
usage = """
%prog -t recipename taskname
%prog sigdatafile1 sigdatafile2
%prog sigdatafile1""")
parser.add_option("-t", "--task",
help = "find the signature data files for last two runs of the specified task and compare them",
action="store_true", dest="taskmode")
options, args = parser.parse_args(sys.argv)
if len(args) == 1:
parser.print_help()
if len(sys.argv) > 2:
bb.siggen.compare_sigfiles(sys.argv[1], sys.argv[2])
else:
tinfoil = bb.tinfoil.Tinfoil()
if options.taskmode:
if len(args) < 3:
logger.error("Please specify a recipe and task name")
sys.exit(1)
tinfoil.prepare(config_only = True)
find_compare_task(tinfoil, args[1], args[2])
else:
if len(args) == 2:
output = bb.siggen.dump_sigfile(sys.argv[1])
else:
output = bb.siggen.compare_sigfiles(sys.argv[1], sys.argv[2])
if output:
print '\n'.join(output)
bb.siggen.dump_sigfile(sys.argv[1])

View File

@@ -6,6 +6,4 @@ sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(sys.argv[0])), '
import bb.siggen
output = bb.siggen.dump_sigfile(sys.argv[1])
if output:
print '\n'.join(output)
bb.siggen.dump_sigfile(sys.argv[1])

View File

@@ -6,22 +6,10 @@
# Copyright (C) 2011 Mentor Graphics Corporation
# Copyright (C) 2012 Intel Corporation
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
import cmd
import logging
import warnings
import os
import sys
import fnmatch
@@ -35,14 +23,26 @@ import bb.cache
import bb.cooker
import bb.providers
import bb.utils
import bb.tinfoil
from bb.cooker import state
import bb.fetch2
logger = logging.getLogger('BitBake')
warnings.filterwarnings("ignore", category=DeprecationWarning)
def main(args):
cmds = Commands()
# Set up logging
console = logging.StreamHandler(sys.stdout)
format = bb.msg.BBLogFormatter("%(levelname)s: %(message)s")
bb.msg.addDefaultlogFilter(console)
console.setFormatter(format)
logger.addHandler(console)
initialenv = os.environ.copy()
bb.utils.clean_environment()
cmds = Commands(initialenv)
if args:
# Allow user to specify e.g. show-layers instead of show_layers
args = [args[0].replace('-', '_')] + args[1:]
@@ -53,11 +53,46 @@ def main(args):
class Commands(cmd.Cmd):
def __init__(self):
def __init__(self, initialenv):
cmd.Cmd.__init__(self)
self.bbhandler = bb.tinfoil.Tinfoil()
self.returncode = 0
self.bblayers = (self.bbhandler.config_data.getVar('BBLAYERS', True) or "").split()
self.config = Config(parse_only=True)
self.cooker = bb.cooker.BBCooker(self.config,
self.register_idle_function,
initialenv)
self.config_data = self.cooker.configuration.data
bb.providers.logger.setLevel(logging.ERROR)
self.cooker_data = None
self.bblayers = (self.config_data.getVar('BBLAYERS', True) or "").split()
def register_idle_function(self, function, data):
pass
def prepare_cooker(self):
sys.stderr.write("Parsing recipes..")
logger.setLevel(logging.WARNING)
try:
while self.cooker.state in (state.initial, state.parsing):
self.cooker.updateCache()
except KeyboardInterrupt:
self.cooker.shutdown()
self.cooker.updateCache()
sys.exit(2)
logger.setLevel(logging.INFO)
sys.stderr.write("done.\n")
self.cooker_data = self.cooker.status
self.cooker_data.appends = self.cooker.appendlist
def check_prepare_cooker(self, config_only = False):
if not self.cooker_data:
if config_only:
self.cooker.parseConfiguration()
self.cooker_data = self.cooker.status
else:
self.prepare_cooker()
def default(self, line):
"""Handle unrecognised commands"""
@@ -82,13 +117,13 @@ class Commands(cmd.Cmd):
def do_show_layers(self, args):
"""show current configured layers"""
self.bbhandler.prepare(config_only = True)
self.check_prepare_cooker(config_only = True)
logger.plain("%s %s %s" % ("layer".ljust(20), "path".ljust(40), "priority"))
logger.plain('=' * 74)
for layerdir in self.bblayers:
layername = self.get_layer_name(layerdir)
layerpri = 0
for layer, _, regex, pri in self.bbhandler.cooker.status.bbfile_config_priorities:
for layer, _, regex, pri in self.cooker.status.bbfile_config_priorities:
if regex.match(os.path.join(layerdir, 'test')):
layerpri = pri
break
@@ -119,7 +154,7 @@ Options:
recipes with the ones they overlay indented underneath
-s only list overlayed recipes where the version is the same
"""
self.bbhandler.prepare()
self.check_prepare_cooker()
show_filenames = False
show_same_ver_only = False
@@ -151,7 +186,7 @@ Options:
# factor - however, each layer.conf is free to either prepend or append to
# BBPATH (or indeed do crazy stuff with it). Thus the order in BBPATH might
# not be exactly the order present in bblayers.conf either.
bbpath = str(self.bbhandler.config_data.getVar('BBPATH', True))
bbpath = str(self.config_data.getVar('BBPATH', True))
overlayed_class_found = False
for (classfile, classdirs) in classes.items():
if len(classdirs) > 1:
@@ -202,7 +237,7 @@ Options:
-m only list where multiple recipes (in the same layer or different
layers) exist for the same recipe name
"""
self.bbhandler.prepare()
self.check_prepare_cooker()
show_filenames = False
show_multi_provider_only = False
@@ -224,15 +259,15 @@ Options:
def list_recipes(self, title, pnspec, show_overlayed_only, show_same_ver_only, show_filenames, show_multi_provider_only):
pkg_pn = self.bbhandler.cooker.status.pkg_pn
(latest_versions, preferred_versions) = bb.providers.findProviders(self.bbhandler.cooker.configuration.data, self.bbhandler.cooker.status, pkg_pn)
allproviders = bb.providers.allProviders(self.bbhandler.cooker.status)
pkg_pn = self.cooker.status.pkg_pn
(latest_versions, preferred_versions) = bb.providers.findProviders(self.cooker.configuration.data, self.cooker.status, pkg_pn)
allproviders = bb.providers.allProviders(self.cooker.status)
# Ensure we list skipped recipes
# We are largely guessing about PN, PV and the preferred version here,
# but we have no choice since skipped recipes are not fully parsed
skiplist = self.bbhandler.cooker.skiplist.keys()
skiplist.sort( key=lambda fileitem: self.bbhandler.cooker.calc_bbfile_priority(fileitem) )
skiplist = self.cooker.skiplist.keys()
skiplist.sort( key=lambda fileitem: self.cooker.calc_bbfile_priority(fileitem) )
skiplist.reverse()
for fn in skiplist:
recipe_parts = os.path.splitext(os.path.basename(fn))[0].split('_')
@@ -340,7 +375,7 @@ build results (as the layer priority order has effectively changed).
logger.error('Directory %s exists and is non-empty, please clear it out first' % outputdir)
return
self.bbhandler.prepare()
self.check_prepare_cooker()
layers = self.bblayers
if len(arglist) > 2:
layernames = arglist[:-1]
@@ -370,8 +405,8 @@ build results (as the layer priority order has effectively changed).
appended_recipes = []
for layer in layers:
overlayed = []
for f in self.bbhandler.cooker.overlayed.iterkeys():
for of in self.bbhandler.cooker.overlayed[f]:
for f in self.cooker.overlayed.iterkeys():
for of in self.cooker.overlayed[f]:
if of.startswith(layer):
overlayed.append(of)
@@ -395,8 +430,8 @@ build results (as the layer priority order has effectively changed).
logger.warn('Overwriting file %s', fdest)
bb.utils.copyfile(f1full, fdest)
if ext == '.bb':
if f1 in self.bbhandler.cooker.appendlist:
appends = self.bbhandler.cooker.appendlist[f1]
if f1 in self.cooker_data.appends:
appends = self.cooker_data.appends[f1]
if appends:
logger.plain(' Applying appends to %s' % fdest )
for appendname in appends:
@@ -405,9 +440,9 @@ build results (as the layer priority order has effectively changed).
appended_recipes.append(f1)
# Take care of when some layers are excluded and yet we have included bbappends for those recipes
for recipename in self.bbhandler.cooker.appendlist.iterkeys():
for recipename in self.cooker_data.appends.iterkeys():
if recipename not in appended_recipes:
appends = self.bbhandler.cooker.appendlist[recipename]
appends = self.cooker_data.appends[recipename]
first_append = None
for appendname in appends:
layer = layer_path_match(appendname)
@@ -425,14 +460,14 @@ build results (as the layer priority order has effectively changed).
# have come from)
first_regex = None
layerdir = layers[0]
for layername, pattern, regex, _ in self.bbhandler.cooker.status.bbfile_config_priorities:
for layername, pattern, regex, _ in self.cooker.status.bbfile_config_priorities:
if regex.match(os.path.join(layerdir, 'test')):
first_regex = regex
break
if first_regex:
# Find the BBFILES entries that match (which will have come from this conf/layer.conf file)
bbfiles = str(self.bbhandler.config_data.getVar('BBFILES', True)).split()
bbfiles = str(self.config_data.getVar('BBFILES', True)).split()
bbfiles_layer = []
for item in bbfiles:
if first_regex.match(item):
@@ -455,7 +490,7 @@ build results (as the layer priority order has effectively changed).
logger.warning("File %s does not match the flattened layer's BBFILES setting, you may need to edit conf/layer.conf or move the file elsewhere" % f1full)
def get_file_layer(self, filename):
for layer, _, regex, _ in self.bbhandler.cooker.status.bbfile_config_priorities:
for layer, _, regex, _ in self.cooker.status.bbfile_config_priorities:
if regex.match(filename):
for layerdir in self.bblayers:
if regex.match(os.path.join(layerdir, 'test')):
@@ -481,14 +516,14 @@ usage: show-appends
Recipes are listed with the bbappends that apply to them as subitems.
"""
self.bbhandler.prepare()
if not self.bbhandler.cooker.appendlist:
self.check_prepare_cooker()
if not self.cooker_data.appends:
logger.plain('No append files found')
return
logger.plain('=== Appended recipes ===')
pnlist = list(self.bbhandler.cooker_data.pkg_pn.keys())
pnlist = list(self.cooker_data.pkg_pn.keys())
pnlist.sort()
for pn in pnlist:
self.show_appends_for_pn(pn)
@@ -496,19 +531,19 @@ Recipes are listed with the bbappends that apply to them as subitems.
self.show_appends_for_skipped()
def show_appends_for_pn(self, pn):
filenames = self.bbhandler.cooker_data.pkg_pn[pn]
filenames = self.cooker_data.pkg_pn[pn]
best = bb.providers.findBestProvider(pn,
self.bbhandler.cooker.configuration.data,
self.bbhandler.cooker_data,
self.bbhandler.cooker_data.pkg_pn)
self.cooker.configuration.data,
self.cooker_data,
self.cooker_data.pkg_pn)
best_filename = os.path.basename(best[3])
self.show_appends_output(filenames, best_filename)
def show_appends_for_skipped(self):
filenames = [os.path.basename(f)
for f in self.bbhandler.cooker.skiplist.iterkeys()]
for f in self.cooker.skiplist.iterkeys()]
self.show_appends_output(filenames, None, " (skipped)")
def show_appends_output(self, filenames, best_filename, name_suffix = ''):
@@ -534,7 +569,7 @@ Recipes are listed with the bbappends that apply to them as subitems.
continue
basename = os.path.basename(filename)
appends = self.bbhandler.cooker.appendlist.get(basename)
appends = self.cooker_data.appends.get(basename)
if appends:
appended.append((basename, list(appends)))
else:
@@ -542,5 +577,22 @@ Recipes are listed with the bbappends that apply to them as subitems.
return appended, notappended
class Config(object):
def __init__(self, **options):
self.pkgs_to_build = []
self.debug_domains = []
self.extra_assume_provided = []
self.prefile = []
self.postfile = []
self.debug = 0
self.__dict__.update(options)
def __getattr__(self, attribute):
try:
return super(Config, self).__getattribute__(attribute)
except AttributeError:
return None
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]) or 0)

View File

@@ -21,7 +21,7 @@
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
__version__ = "1.16.0"
__version__ = "1.15.3"
import sys
if sys.version_info < (2, 6, 0):

View File

@@ -29,7 +29,6 @@ import os
import sys
import logging
import shlex
import glob
import bb
import bb.msg
import bb.process
@@ -471,49 +470,11 @@ def stamp_internal(taskname, d, file_name):
return stamp
def stamp_cleanmask_internal(taskname, d, file_name):
"""
Internal stamp helper function to generate stamp cleaning mask
Returns the stamp path+filename
In the bitbake core, d can be a CacheData and file_name will be set.
When called in task context, d will be a data store, file_name will not be set
"""
taskflagname = taskname
if taskname.endswith("_setscene") and taskname != "do_setscene":
taskflagname = taskname.replace("_setscene", "")
if file_name:
stamp = d.stamp_base_clean[file_name].get(taskflagname) or d.stampclean[file_name]
extrainfo = d.stamp_extrainfo[file_name].get(taskflagname) or ""
else:
stamp = d.getVarFlag(taskflagname, 'stamp-base-clean', True) or d.getVar('STAMPCLEAN', True)
file_name = d.getVar('BB_FILENAME', True)
extrainfo = d.getVarFlag(taskflagname, 'stamp-extra-info', True) or ""
if not stamp:
return []
cleanmask = bb.parse.siggen.stampcleanmask(stamp, file_name, taskname, extrainfo)
return [cleanmask, cleanmask.replace(taskflagname, taskflagname + "_setscene")]
def make_stamp(task, d, file_name = None):
"""
Creates/updates a stamp for a given task
(d can be a data dict or dataCache)
"""
cleanmask = stamp_cleanmask_internal(task, d, file_name)
for mask in cleanmask:
for name in glob.glob(mask):
# Preserve sigdata files in the stamps directory
if "sigdata" in name:
continue
# Preserve taint files in the stamps directory
if name.endswith('.taint'):
continue
os.unlink(name)
stamp = stamp_internal(task, d, file_name)
# Remove the file and recreate to force timestamp
# change on broken NFS filesystems

View File

@@ -43,7 +43,7 @@ except ImportError:
logger.info("Importing cPickle failed. "
"Falling back to a very slow implementation.")
__cache_version__ = "145"
__cache_version__ = "144"
def getCacheFile(path, filename, data_hash):
return os.path.join(path, filename + "." + data_hash)
@@ -130,9 +130,7 @@ class CoreRecipeInfo(RecipeInfoCommon):
self.broken = self.getvar('BROKEN', metadata)
self.not_world = self.getvar('EXCLUDE_FROM_WORLD', metadata)
self.stamp = self.getvar('STAMP', metadata)
self.stampclean = self.getvar('STAMPCLEAN', metadata)
self.stamp_base = self.flaglist('stamp-base', self.tasks, metadata)
self.stamp_base_clean = self.flaglist('stamp-base-clean', self.tasks, metadata)
self.stamp_extrainfo = self.flaglist('stamp-extra-info', self.tasks, metadata)
self.file_checksums = self.flaglist('file-checksums', self.tasks, metadata, True)
self.packages_dynamic = self.listvar('PACKAGES_DYNAMIC', metadata)
@@ -159,9 +157,7 @@ class CoreRecipeInfo(RecipeInfoCommon):
cachedata.pkg_dp = {}
cachedata.stamp = {}
cachedata.stampclean = {}
cachedata.stamp_base = {}
cachedata.stamp_base_clean = {}
cachedata.stamp_extrainfo = {}
cachedata.file_checksums = {}
cachedata.fn_provides = {}
@@ -193,9 +189,7 @@ class CoreRecipeInfo(RecipeInfoCommon):
cachedata.pkg_pepvpr[fn] = (self.pe, self.pv, self.pr)
cachedata.pkg_dp[fn] = self.defaultpref
cachedata.stamp[fn] = self.stamp
cachedata.stampclean[fn] = self.stampclean
cachedata.stamp_base[fn] = self.stamp_base
cachedata.stamp_base_clean[fn] = self.stamp_base_clean
cachedata.stamp_extrainfo[fn] = self.stamp_extrainfo
cachedata.file_checksums[fn] = self.file_checksums

View File

@@ -35,7 +35,7 @@ def check_indent(codestr):
class CodeParserCache(MultiProcessCache):
cache_file_name = "bb_codeparser.dat"
CACHE_VERSION = 3
CACHE_VERSION = 2
def __init__(self):
MultiProcessCache.__init__(self)
@@ -100,8 +100,7 @@ class BufferedLogger(Logger):
self.buffer = []
class PythonParser():
getvars = ("d.getVar", "bb.data.getVar", "data.getVar", "d.appendVar", "d.prependVar")
containsfuncs = ("bb.utils.contains", "base_contains", "oe.utils.contains")
getvars = ("d.getVar", "bb.data.getVar", "data.getVar")
execfuncs = ("bb.build.exec_func", "bb.build.exec_task")
def warn(self, func, arg):
@@ -120,7 +119,7 @@ class PythonParser():
def visit_Call(self, node):
name = self.called_node_name(node.func)
if name in self.getvars or name in self.containsfuncs:
if name in self.getvars:
if isinstance(node.args[0], ast.Str):
self.var_references.add(node.args[0].s)
else:

View File

@@ -44,9 +44,6 @@ class CommandFailed(CommandExit):
self.error = message
CommandExit.__init__(self, 1)
class CommandError(Exception):
pass
class Command:
"""
A queue of asynchronous commands for bitbake
@@ -60,25 +57,21 @@ class Command:
self.currentAsyncCommand = None
def runCommand(self, commandline):
command = commandline.pop(0)
if hasattr(CommandsSync, command):
# Can run synchronous commands straight away
command_method = getattr(self.cmds_sync, command)
try:
result = command_method(self, commandline)
except CommandError as exc:
return None, exc.args[0]
except Exception:
return None, traceback.format_exc()
else:
return result, None
if self.currentAsyncCommand is not None:
return None, "Busy (%s in progress)" % self.currentAsyncCommand[0]
if command not in CommandsAsync.__dict__:
return None, "No such command"
self.currentAsyncCommand = (command, commandline)
self.cooker.server_registration_cb(self.cooker.runCommands, self.cooker)
return True, None
try:
command = commandline.pop(0)
if command in CommandsSync.__dict__:
# Can run synchronous commands straight away
return getattr(CommandsSync, command)(self.cmds_sync, self, commandline)
if self.currentAsyncCommand is not None:
return "Busy (%s in progress)" % self.currentAsyncCommand[0]
if command not in CommandsAsync.__dict__:
return "No such command"
self.currentAsyncCommand = (command, commandline)
self.cooker.server_registration_cb(self.cooker.runCommands, self.cooker)
return True
except:
import traceback
return traceback.format_exc()
def runAsyncCommand(self):
try:
@@ -146,11 +139,7 @@ class CommandsSync:
"""
Get any command parsed from the commandline
"""
cmd_action = command.cooker.commandlineAction
if cmd_action['msg']:
raise CommandError(msg)
else:
return cmd_action['action']
return command.cooker.commandlineAction
def getVariable(self, command, params):
"""
@@ -168,7 +157,7 @@ class CommandsSync:
Set the value of variable in configuration.data
"""
varname = params[0]
value = str(params[1])
value = params[1]
command.cooker.configuration.data.setVar(varname, value)
def initCooker(self, command, params):

View File

@@ -1,11 +1,5 @@
"""Code pulled from future python versions, here for compatibility"""
from collections import MutableMapping, KeysView, ValuesView, ItemsView
try:
from thread import get_ident as _get_ident
except ImportError:
from dummy_thread import get_ident as _get_ident
def total_ordering(cls):
"""Class decorator that fills in missing ordering methods"""
convert = {
@@ -32,210 +26,3 @@ def total_ordering(cls):
opfunc.__doc__ = getattr(int, opname).__doc__
setattr(cls, opname, opfunc)
return cls
class OrderedDict(dict):
'Dictionary that remembers insertion order'
# An inherited dict maps keys to values.
# The inherited dict provides __getitem__, __len__, __contains__, and get.
# The remaining methods are order-aware.
# Big-O running times for all methods are the same as regular dictionaries.
# The internal self.__map dict maps keys to links in a doubly linked list.
# The circular doubly linked list starts and ends with a sentinel element.
# The sentinel element never gets deleted (this simplifies the algorithm).
# Each link is stored as a list of length three: [PREV, NEXT, KEY].
def __init__(self, *args, **kwds):
'''Initialize an ordered dictionary. The signature is the same as
regular dictionaries, but keyword arguments are not recommended because
their insertion order is arbitrary.
'''
if len(args) > 1:
raise TypeError('expected at most 1 arguments, got %d' % len(args))
try:
self.__root
except AttributeError:
self.__root = root = [] # sentinel node
root[:] = [root, root, None]
self.__map = {}
self.__update(*args, **kwds)
def __setitem__(self, key, value, PREV=0, NEXT=1, dict_setitem=dict.__setitem__):
'od.__setitem__(i, y) <==> od[i]=y'
# Setting a new item creates a new link at the end of the linked list,
# and the inherited dictionary is updated with the new key/value pair.
if key not in self:
root = self.__root
last = root[PREV]
last[NEXT] = root[PREV] = self.__map[key] = [last, root, key]
dict_setitem(self, key, value)
def __delitem__(self, key, PREV=0, NEXT=1, dict_delitem=dict.__delitem__):
'od.__delitem__(y) <==> del od[y]'
# Deleting an existing item uses self.__map to find the link which gets
# removed by updating the links in the predecessor and successor nodes.
dict_delitem(self, key)
link_prev, link_next, key = self.__map.pop(key)
link_prev[NEXT] = link_next
link_next[PREV] = link_prev
def __iter__(self):
'od.__iter__() <==> iter(od)'
# Traverse the linked list in order.
NEXT, KEY = 1, 2
root = self.__root
curr = root[NEXT]
while curr is not root:
yield curr[KEY]
curr = curr[NEXT]
def __reversed__(self):
'od.__reversed__() <==> reversed(od)'
# Traverse the linked list in reverse order.
PREV, KEY = 0, 2
root = self.__root
curr = root[PREV]
while curr is not root:
yield curr[KEY]
curr = curr[PREV]
def clear(self):
'od.clear() -> None. Remove all items from od.'
for node in self.__map.itervalues():
del node[:]
root = self.__root
root[:] = [root, root, None]
self.__map.clear()
dict.clear(self)
# -- the following methods do not depend on the internal structure --
def keys(self):
'od.keys() -> list of keys in od'
return list(self)
def values(self):
'od.values() -> list of values in od'
return [self[key] for key in self]
def items(self):
'od.items() -> list of (key, value) pairs in od'
return [(key, self[key]) for key in self]
def iterkeys(self):
'od.iterkeys() -> an iterator over the keys in od'
return iter(self)
def itervalues(self):
'od.itervalues -> an iterator over the values in od'
for k in self:
yield self[k]
def iteritems(self):
'od.iteritems -> an iterator over the (key, value) pairs in od'
for k in self:
yield (k, self[k])
update = MutableMapping.update
__update = update # let subclasses override update without breaking __init__
__marker = object()
def pop(self, key, default=__marker):
'''od.pop(k[,d]) -> v, remove specified key and return the corresponding
value. If key is not found, d is returned if given, otherwise KeyError
is raised.
'''
if key in self:
result = self[key]
del self[key]
return result
if default is self.__marker:
raise KeyError(key)
return default
def setdefault(self, key, default=None):
'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'
if key in self:
return self[key]
self[key] = default
return default
def popitem(self, last=True):
'''od.popitem() -> (k, v), return and remove a (key, value) pair.
Pairs are returned in LIFO order if last is true or FIFO order if false.
'''
if not self:
raise KeyError('dictionary is empty')
key = next(reversed(self) if last else iter(self))
value = self.pop(key)
return key, value
def __repr__(self, _repr_running={}):
'od.__repr__() <==> repr(od)'
call_key = id(self), _get_ident()
if call_key in _repr_running:
return '...'
_repr_running[call_key] = 1
try:
if not self:
return '%s()' % (self.__class__.__name__,)
return '%s(%r)' % (self.__class__.__name__, self.items())
finally:
del _repr_running[call_key]
def __reduce__(self):
'Return state information for pickling'
items = [[k, self[k]] for k in self]
inst_dict = vars(self).copy()
for k in vars(OrderedDict()):
inst_dict.pop(k, None)
if inst_dict:
return (self.__class__, (items,), inst_dict)
return self.__class__, (items,)
def copy(self):
'od.copy() -> a shallow copy of od'
return self.__class__(self)
@classmethod
def fromkeys(cls, iterable, value=None):
'''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S.
If not specified, the value defaults to None.
'''
self = cls()
for key in iterable:
self[key] = value
return self
def __eq__(self, other):
'''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive
while comparison to a regular mapping is order-insensitive.
'''
if isinstance(other, OrderedDict):
return len(self)==len(other) and self.items() == other.items()
return dict.__eq__(self, other)
def __ne__(self, other):
'od.__ne__(y) <==> od!=y'
return not self == other
# -- the following methods support python 3.x style dictionary views --
def viewkeys(self):
"od.viewkeys() -> a set-like object providing a view on od's keys"
return KeysView(self)
def viewvalues(self):
"od.viewvalues() -> an object providing a view on od's values"
return ValuesView(self)
def viewitems(self):
"od.viewitems() -> a set-like object providing a view on od's items"
return ItemsView(self)

View File

@@ -278,8 +278,8 @@ class BBCooker:
pkg_pn = self.status.pkg_pn
(latest_versions, preferred_versions) = bb.providers.findProviders(self.configuration.data, self.status, pkg_pn)
logger.plain("%-35s %25s %25s", "Recipe Name", "Latest Version", "Preferred Version")
logger.plain("%-35s %25s %25s\n", "===========", "==============", "=================")
logger.plain("%-35s %25s %25s", "Package Name", "Latest Version", "Preferred Version")
logger.plain("%-35s %25s %25s\n", "============", "==============", "=================")
for p in sorted(pkg_pn):
pref = preferred_versions[p]
@@ -642,8 +642,7 @@ class BBCooker:
# Calculate priorities for each file
matched = set()
for p in self.status.pkg_fn:
realfn, cls = bb.cache.Cache.virtualfn2realfn(p)
self.status.bbfile_priority[p] = self.calc_bbfile_priority(realfn, matched)
self.status.bbfile_priority[p] = self.calc_bbfile_priority(p, matched)
# Don't show the warning if the BBFILE_PATTERN did match .bbappend files
unmatched = set()
@@ -939,13 +938,13 @@ class BBCooker:
errors = True
continue
if lver <> depver:
parselog.error("Layer '%s' depends on version %d of layer '%s', but version %d is enabled in your configuration", c, depver, dep, lver)
parselog.error("Layer dependency %s of layer %s is at version %d, expected %d", dep, c, lver, depver)
errors = True
else:
parselog.error("Layer '%s' depends on version %d of layer '%s', which exists in your configuration but does not specify a version", c, depver, dep)
parselog.error("Layer dependency %s of layer %s has no version, expected %d", dep, c, depver)
errors = True
else:
parselog.error("Layer '%s' depends on layer '%s', but this layer is not enabled in your configuration", c, dep)
parselog.error("Layer dependency %s of layer %s not found", dep, c)
errors = True
collection_depends[c] = depnamelist
else:
@@ -1353,10 +1352,7 @@ class BBCooker:
# Empty the environment. The environment will be populated as
# necessary from the data store.
#bb.utils.empty_environment()
try:
prserv.serv.auto_start(self.configuration.data)
except prserv.serv.PRServiceConfigError:
bb.event.fire(CookerExit(), self.configuration.event_data)
prserv.serv.auto_start(self.configuration.data)
return
def post_serve(self):
@@ -1695,13 +1691,8 @@ class CookerParser(object):
except Exception as exc:
self.error += 1
etype, value, tb = sys.exc_info()
if hasattr(value, "recipe"):
logger.error('Unable to parse %s', value.recipe,
exc_info=(etype, value, exc.traceback))
else:
# Most likely, an exception occurred during raising an exception
import traceback
logger.error('Exception during parse: %s' % traceback.format_exc())
logger.error('Unable to parse %s', value.recipe,
exc_info=(etype, value, exc.traceback))
self.shutdown(clean=False)
return False

View File

@@ -323,8 +323,9 @@ def build_dependencies(key, keys, shelldeps, vardepvals, d):
deps |= set((vardeps or "").split())
deps -= set((d.getVarFlag(key, "vardepsexclude", True) or "").split())
except Exception as e:
raise bb.data_smart.ExpansionError(key, None, e)
except:
bb.note("Error expanding variable %s" % key)
raise
return deps, value
#bb.note("Variable %s references %s and calls %s" % (key, str(deps), str(execs)))
#d.setVarFlag(key, "vardeps", deps)

View File

@@ -103,10 +103,7 @@ class ExpansionError(Exception):
self.variablename = varname
self.exception = exception
if varname:
if expression:
self.msg = "Failure expanding variable %s, expression was %s which triggered exception %s: %s" % (varname, expression, type(exception).__name__, exception)
else:
self.msg = "Failure expanding variable %s: %s: %s" % (varname, type(exception).__name__, exception)
self.msg = "Failure expanding variable %s, expression was %s which triggered exception %s: %s" % (varname, expression, type(exception).__name__, exception)
else:
self.msg = "Failure expanding expression %s which triggered exception %s: %s" % (expression, type(exception).__name__, exception)
Exception.__init__(self, self.msg)
@@ -474,16 +471,12 @@ class DataSmart(MutableMapping):
def get_hash(self):
data = {}
d = self.createCopy()
bb.data.expandKeys(d)
bb.data.update_data(d)
config_whitelist = set((d.getVar("BB_HASHCONFIG_WHITELIST", True) or "").split())
keys = set(key for key in iter(d) if not key.startswith("__"))
config_whitelist = set((self.getVar("BB_HASHCONFIG_WHITELIST", True) or "").split())
keys = set(key for key in iter(self) if not key.startswith("__"))
for key in keys:
if key in config_whitelist:
continue
value = d.getVar(key, False) or ""
value = self.getVar(key, False) or ""
data.update({key:value})
data_str = str([(k, data[k]) for k in sorted(data.keys())])

View File

@@ -32,7 +32,6 @@ import logging
import atexit
import traceback
import bb.utils
import bb.compat
# This is the pid for which we should generate the event. This is set when
# the runqueue forks off.
@@ -54,7 +53,7 @@ Registered = 10
AlreadyRegistered = 14
# Internal
_handlers = bb.compat.OrderedDict()
_handlers = {}
_ui_handlers = {}
_ui_handler_seq = 0
@@ -105,18 +104,6 @@ def print_ui_queue():
console = logging.StreamHandler(sys.stdout)
console.setFormatter(BBLogFormatter("%(levelname)s: %(message)s"))
logger.handlers = [console]
# First check to see if we have any proper messages
msgprint = False
for event in ui_queue:
if isinstance(event, logging.LogRecord):
if event.levelno > logging.DEBUG:
logger.handle(event)
msgprint = True
if msgprint:
return
# Nope, so just print all of the messages we have (including debug messages)
for event in ui_queue:
if isinstance(event, logging.LogRecord):
logger.handle(event)
@@ -510,15 +497,6 @@ class MsgFatal(MsgBase):
class MsgPlain(MsgBase):
"""General output"""
class LogExecTTY(Event):
"""Send event containing program to spawn on tty of the logger"""
def __init__(self, msg, prog, sleep_delay, retries):
Event.__init__(self)
self.msg = msg
self.prog = prog
self.sleep_delay = sleep_delay
self.retries = retries
class LogHandler(logging.Handler):
"""Dispatch logging messages as bitbake events"""
@@ -562,7 +540,6 @@ class SanityCheckFailed(Event):
"""
Event to indicate sanity check has failed
"""
def __init__(self, msg, network_error=False):
def __init__(self, msg):
Event.__init__(self)
self._msg = msg
self._network_error = network_error

View File

@@ -54,7 +54,7 @@ class MalformedUrl(BBFetchException):
msg = "The URL: '%s' is invalid and cannot be interpreted" % url
self.url = url
BBFetchException.__init__(self, msg)
self.args = (url,)
self.args = url
class FetchError(BBFetchException):
"""General fetcher exception when something happens incorrectly"""
@@ -87,7 +87,7 @@ class NoMethodError(BBFetchException):
msg = "Could not find a fetcher which supports the URL: '%s'" % url
self.url = url
BBFetchException.__init__(self, msg)
self.args = (url,)
self.args = url
class MissingParameterError(BBFetchException):
"""Exception raised when a fetch method is missing a critical parameter in the url"""
@@ -178,9 +178,6 @@ def encodeurl(decoded):
url += "@"
if host and type != "file":
url += "%s" % host
# Standardise path to ensure comparisons work
while '//' in path:
path = path.replace("//", "/")
url += "%s" % urllib.quote(path)
if p:
for parm in p:
@@ -358,7 +355,7 @@ def verify_checksum(u, ud, d):
mismatch = True;
if mismatch:
msg = msg + '\nIf this change is expected (e.g. you have upgraded to a new version without updating the checksums) then you can use these lines within the recipe:\nSRC_URI[%s] = "%s"\nSRC_URI[%s] = "%s"\nOtherwise you should retry the download and/or check with upstream to determine if the file has become corrupted or otherwise unexpectedly modified.\n' % (ud.md5_name, md5data, ud.sha256_name, sha256data)
msg = msg + '\nYour checksums:\nSRC_URI[%s] = "%s"\nSRC_URI[%s] = "%s"' % (ud.md5_name, md5data, ud.sha256_name, sha256data)
if len(msg):
raise ChecksumError('Checksum mismatch!%s' % msg, u)
@@ -471,13 +468,7 @@ def runfetchcmd(cmd, d, quiet = False, cleanup = []):
except bb.process.NotFoundError as e:
error_message = "Fetch command %s" % (e.command)
except bb.process.ExecutionError as e:
if e.stdout:
output = "output:\n%s\n%s" % (e.stdout, e.stderr)
elif e.stderr:
output = "output:\n%s" % e.stderr
else:
output = "no output"
error_message = "Fetch command failed with exit code %s, %s" % (e.exitcode, output)
error_message = "Fetch command %s failed with exit code %s, output:\nSTDOUT: %s\nSTDERR: %s" % (e.command, e.exitcode, e.stdout, e.stderr)
except bb.process.CmdError as e:
error_message = "Fetch command %s could not be run:\n%s" % (e.command, e.msg)
if not success:
@@ -947,16 +938,14 @@ class FetchMethod(object):
if dos:
cmd = '%s -a' % cmd
cmd = "%s '%s'" % (cmd, file)
elif file.endswith('.rpm') or file.endswith('.srpm'):
elif file.endswith('.src.rpm') or file.endswith('.srpm'):
if 'extract' in urldata.parm:
unpack_file = urldata.parm.get('extract')
cmd = 'rpm2cpio.sh %s | cpio -id %s' % (file, unpack_file)
cmd = 'rpm2cpio.sh %s | cpio -i %s' % (file, unpack_file)
iterate = True
iterate_file = unpack_file
else:
cmd = 'rpm2cpio.sh %s | cpio -id' % (file)
elif file.endswith('.deb') or file.endswith('.ipk'):
cmd = 'ar -p %s data.tar.gz | zcat | tar --no-same-owner -xpf -' % file
cmd = 'rpm2cpio.sh %s | cpio -i' % (file)
if not unpack or not cmd:
# If file == dest, then avoid any copies, as we already put the file into dest!
@@ -1204,9 +1193,8 @@ class Fetch(object):
except BBFetchException as e:
if isinstance(e, ChecksumError):
logger.warn("Checksum failure encountered with download of %s - will attempt other sources if available" % u)
logger.debug(1, str(e))
elif isinstance(e, NoChecksumError):
logger.warn("Checksum error encountered with download (will attempt other sources): %s" % str(e))
if isinstance(e, NoChecksumError):
raise
else:
logger.warn('Failed to fetch URL %s, attempting MIRRORS if available' % u)
@@ -1228,8 +1216,6 @@ class Fetch(object):
except BBFetchException as e:
if isinstance(e, NoChecksumError):
logger.error("%s" % str(e))
elif isinstance(e, ChecksumError):
logger.error("Checksum failure fetching %s" % u)
raise
finally:

View File

@@ -29,6 +29,7 @@ BitBake build tools.
import os
import logging
import bb
from bb import data
from bb.fetch2 import FetchMethod, FetchError, MissingParameterError, logger
from bb.fetch2 import runfetchcmd
@@ -63,7 +64,7 @@ class Cvs(FetchMethod):
if 'fullpath' in ud.parm:
fullpath = '_fullpath'
ud.localfile = bb.data.expand('%s_%s_%s_%s%s%s.tar.gz' % (ud.module.replace('/', '.'), ud.host, ud.tag, ud.date, norecurse, fullpath), d)
ud.localfile = data.expand('%s_%s_%s_%s%s%s.tar.gz' % (ud.module.replace('/', '.'), ud.host, ud.tag, ud.date, norecurse, fullpath), d)
def need_update(self, url, ud, d):
if (ud.date == "now"):
@@ -87,10 +88,10 @@ class Cvs(FetchMethod):
cvsroot = ud.path
else:
cvsroot = ":" + method
cvsproxyhost = d.getVar('CVS_PROXY_HOST', True)
cvsproxyhost = data.getVar('CVS_PROXY_HOST', d, True)
if cvsproxyhost:
cvsroot += ";proxy=" + cvsproxyhost
cvsproxyport = d.getVar('CVS_PROXY_PORT', True)
cvsproxyport = data.getVar('CVS_PROXY_PORT', d, True)
if cvsproxyport:
cvsroot += ";proxyport=" + cvsproxyport
cvsroot += ":" + ud.user
@@ -111,8 +112,8 @@ class Cvs(FetchMethod):
options.append("-r %s" % ud.tag)
cvsbasecmd = d.getVar("FETCHCMD_cvs", True)
cvscmd = cvsbasecmd + " '-d" + cvsroot + "' co " + " ".join(options) + " " + ud.module
cvsupdatecmd = cvsbasecmd + " '-d" + cvsroot + "' update -d -P " + " ".join(options)
cvscmd = cvsbasecmd + "'-d" + cvsroot + "' co " + " ".join(options) + " " + ud.module
cvsupdatecmd = cvsbasecmd + "'-d" + cvsroot + "' update -d -P " + " ".join(options)
if cvs_rsh:
cvscmd = "CVS_RSH=\"%s\" %s" % (cvs_rsh, cvscmd)
@@ -120,8 +121,8 @@ class Cvs(FetchMethod):
# create module directory
logger.debug(2, "Fetch: checking for module directory")
pkg = d.getVar('PN', True)
pkgdir = os.path.join(d.getVar('CVSDIR', True), pkg)
pkg = data.expand('${PN}', d)
pkgdir = os.path.join(data.expand('${CVSDIR}', localdata), pkg)
moddir = os.path.join(pkgdir, localdir)
if os.access(os.path.join(moddir, 'CVS'), os.R_OK):
logger.info("Update " + loc)
@@ -162,9 +163,12 @@ class Cvs(FetchMethod):
def clean(self, ud, d):
""" Clean CVS Files and tarballs """
pkg = d.getVar('PN', True)
pkgdir = os.path.join(d.getVar("CVSDIR", True), pkg)
pkg = data.expand('${PN}', d)
localdata = data.createCopy(d)
data.setVar('OVERRIDES', "cvs:%s" % data.getVar('OVERRIDES', localdata), localdata)
data.update_data(localdata)
pkgdir = os.path.join(data.expand('${CVSDIR}', localdata), pkg)
bb.utils.remove(pkgdir, True)
bb.utils.remove(ud.localpath)

View File

@@ -257,7 +257,6 @@ class Git(FetchMethod):
indirectiondir = destdir[:-1] + ".indirectionsymlink"
if os.path.exists(indirectiondir):
os.remove(indirectiondir)
bb.utils.mkdirhier(os.path.dirname(indirectiondir))
os.symlink(ud.clonedir, indirectiondir)
clonedir = indirectiondir

View File

@@ -10,12 +10,6 @@ IETF secsh internet draft:
Currently does not support the sftp parameters, as this uses scp
Also does not support the 'fingerprint' connection parameter.
Please note that '/' is used as host, path separator not ':' as you may
be used to, also '~' can be used to specify user HOME, but again after '/'
Example SRC_URI:
SRC_URI = "ssh://user@host.example.com/dir/path/file.txt"
SRC_URI = "ssh://user@host.example.com/~/file.txt"
'''
# Copyright (C) 2006 OpenedHand Ltd.
@@ -78,19 +72,15 @@ class SSH(FetchMethod):
def supports_checksum(self, urldata):
return False
def urldata_init(self, urldata, d):
if 'protocol' in urldata.parm and urldata.parm['protocol'] == 'git':
raise bb.fetch2.ParameterError(
"Invalid protocol - if you wish to fetch from a git " +
"repository using ssh, you need to use " +
"git:// prefix with protocol=ssh", urldata.url)
def localpath(self, url, urldata, d):
m = __pattern__.match(urldata.url)
path = m.group('path')
host = m.group('host')
urldata.localpath = os.path.join(d.getVar('DL_DIR', True), os.path.basename(path))
lpath = os.path.join(data.getVar('DL_DIR', d, True), host, os.path.basename(path))
return lpath
def download(self, url, urldata, d):
dldir = d.getVar('DL_DIR', True)
dldir = data.getVar('DL_DIR', d, True)
m = __pattern__.match(url)
path = m.group('path')
@@ -99,10 +89,16 @@ class SSH(FetchMethod):
user = m.group('user')
password = m.group('pass')
ldir = os.path.join(dldir, host)
lpath = os.path.join(ldir, os.path.basename(path))
if not os.path.exists(ldir):
os.makedirs(ldir)
if port:
portarg = '-P %s' % port
port = '-P %s' % port
else:
portarg = ''
port = ''
if user:
fr = user
@@ -116,9 +112,9 @@ class SSH(FetchMethod):
import commands
cmd = 'scp -B -r %s %s %s/' % (
portarg,
port,
commands.mkarg(fr),
commands.mkarg(dldir)
commands.mkarg(ldir)
)
bb.fetch2.check_network_access(d, cmd, urldata.url)

View File

@@ -49,9 +49,6 @@ class Wget(FetchMethod):
return True
def urldata_init(self, ud, d):
if 'protocol' in ud.parm:
if ud.parm['protocol'] == 'git':
raise bb.fetch2.ParameterError("Invalid protocol - if you wish to fetch from a git repository using http, you need to instead use the git:// prefix with protocol=http", ud.url)
if 'downloadfilename' in ud.parm:
ud.basename = ud.parm['downloadfilename']
@@ -69,10 +66,10 @@ class Wget(FetchMethod):
basecmd += " -O ${DL_DIR}/" + ud.localfile
if checkonly:
fetchcmd = d.getVar("CHECKCOMMAND_wget", True) or d.expand(basecmd + " --spider '${URI}'")
fetchcmd = d.getVar("CHECKCOMMAND_wget", True) or d.expand(basecmd + " -c -P ${DL_DIR} '${URI}'")
elif os.path.exists(ud.localpath):
# file exists, but we didnt complete it.. trying again..
fetchcmd = d.getVar("RESUMECOMMAND_wget", True) or d.expand(basecmd + " -c -P ${DL_DIR} '${URI}'")
fetchcmd = d.getVar("RESUMECOMMAND_wget", True) or d.expand(basecmd + " --spider -P ${DL_DIR} '${URI}'")
else:
fetchcmd = d.getVar("FETCHCOMMAND_wget", True) or d.expand(basecmd + " -P ${DL_DIR} '${URI}'")

View File

@@ -128,7 +128,7 @@ def getDiskData(BBDirs, configuration):
if not os.path.exists(path):
bb.utils.mkdirhier(path)
mountedDev = getMountedDev(path)
devDict[mountedDev] = [action, path, minSpace, minInode]
devDict[mountedDev] = action, path, minSpace, minInode
return devDict
@@ -231,13 +231,6 @@ class diskMonitor:
freeInode = st.f_favail
if self.devDict[dev][3] and freeInode < self.devDict[dev][3]:
# Some fs formats' (e.g., btrfs) statvfs.f_files (inodes) is
# zero, this is a feature of the fs, we disable the inode
# checking for such a fs.
if st.f_files == 0:
logger.warn("Inode check for %s is unavaliable, remove it from disk monitor" % dev)
self.devDict[dev][3] = None
continue
# Always show warning, the self.checked would always be False if the action is WARN
if self.preFreeI[dev] == 0 or self.preFreeI[dev] - freeInode > self.inodeInterval and not self.checked[dev]:
logger.warn("The free inode of %s is running low (%.3fK left)" % (dev, freeInode / 1024.0))

View File

@@ -29,7 +29,7 @@ import logging
import bb.utils
from bb.parse import ParseError, resolve_file, ast, logger
__config_regexp__ = re.compile( r"(?P<exp>export\s*)?(?P<var>[a-zA-Z0-9\-_+.${}/]+)(\[(?P<flag>[a-zA-Z0-9\-_+.]+)\])?\s*((?P<colon>:=)|(?P<lazyques>\?\?=)|(?P<ques>\?=)|(?P<append>\+=)|(?P<prepend>=\+)|(?P<predot>=\.)|(?P<postdot>\.=)|=)\s*(?!'[^']*'[^']*'$)(?!\"[^\"]*\"[^\"]*\"$)(?P<apo>['\"])(?P<value>.*)(?P=apo)$")
__config_regexp__ = re.compile( r"(?P<exp>export\s*)?(?P<var>[a-zA-Z0-9\-_+.${}/]+)(\[(?P<flag>[a-zA-Z0-9\-_+.]+)\])?\s*((?P<colon>:=)|(?P<lazyques>\?\?=)|(?P<ques>\?=)|(?P<append>\+=)|(?P<prepend>=\+)|(?P<predot>=\.)|(?P<postdot>\.=)|=)\s*(?P<apo>['\"])(?P<value>.*)(?P=apo)$")
__include_regexp__ = re.compile( r"include\s+(.+)" )
__require_regexp__ = re.compile( r"require\s+(.+)" )
__export_regexp__ = re.compile( r"export\s+([a-zA-Z0-9\-_+.${}/]+)$" )

View File

@@ -130,7 +130,7 @@ def findPreferredProvider(pn, cfgData, dataCache, pkg_pn = None, item = None):
m = re.match('(\d+:)*(.*)(_.*)*', preferred_v)
if m:
if m.group(1):
preferred_e = m.group(1)[:-1]
preferred_e = int(m.group(1)[:-1])
else:
preferred_e = None
preferred_v = m.group(2)

View File

@@ -466,7 +466,7 @@ class RunQueueData:
# (makes sure sometask runs after targetname's someothertask)
idepends = taskData.tasks_idepends[task]
for (depid, idependtask) in idepends:
if depid in taskData.build_targets and not depid in taskData.failed_deps:
if depid in taskData.build_targets:
# Won't be in build_targets if ASSUME_PROVIDED
depdata = taskData.build_targets[depid][0]
if depdata is not None:
@@ -692,14 +692,13 @@ class RunQueueData:
stampfnwhitelist.append(fn)
self.stampfnwhitelist = stampfnwhitelist
# Iterate over the task list looking for tasks with a 'setscene' function
# Interate over the task list looking for tasks with a 'setscene' function
self.runq_setscene = []
if not self.cooker.configuration.nosetscene:
for task in range(len(self.runq_fnid)):
setscene = taskData.gettask_id(self.taskData.fn_index[self.runq_fnid[task]], self.runq_task[task] + "_setscene", False)
if not setscene:
continue
self.runq_setscene.append(task)
for task in range(len(self.runq_fnid)):
setscene = taskData.gettask_id(self.taskData.fn_index[self.runq_fnid[task]], self.runq_task[task] + "_setscene", False)
if not setscene:
continue
self.runq_setscene.append(task)
def invalidate_task(fn, taskname, error_nostamp):
taskdep = self.dataCache.task_deps[fn]
@@ -933,8 +932,6 @@ class RunQueue:
return self._execute_runqueue()
except bb.runqueue.TaskFailure:
raise
except SystemExit:
raise
except:
logger.error("An uncaught exception occured in runqueue, please see the failure below:")
self.state = runQueueComplete

View File

@@ -48,7 +48,7 @@ class ServerCommunicator():
if self.connection.poll(.5):
return self.connection.recv()
else:
return None, "Timeout while attempting to communicate with bitbake server"
return None
except KeyboardInterrupt:
pass

View File

@@ -48,9 +48,6 @@ class SignatureGenerator(object):
def stampfile(self, stampbase, file_name, taskname, extrainfo):
return ("%s.%s.%s" % (stampbase, taskname, extrainfo)).rstrip('.')
def stampcleanmask(self, stampbase, file_name, taskname, extrainfo):
return ("%s.%s.%s" % (stampbase, taskname, extrainfo)).rstrip('.')
def dump_sigtask(self, fn, task, stampbase, runtime):
return
@@ -188,8 +185,8 @@ class SignatureGeneratorBasic(SignatureGenerator):
if task in dataCache.file_checksums[fn]:
checksums = bb.fetch2.get_file_checksums(dataCache.file_checksums[fn][task], recipename)
for (f,cs) in checksums:
self.file_checksum_values[k][f] = cs
data = data + cs
self.file_checksum_values[k][f] = cs
data = data + cs
taint = self.read_taint(fn, task, dataCache.stamp[fn])
if taint:
@@ -269,23 +266,18 @@ class SignatureGeneratorBasic(SignatureGenerator):
class SignatureGeneratorBasicHash(SignatureGeneratorBasic):
name = "basichash"
def stampfile(self, stampbase, fn, taskname, extrainfo, clean=False):
def stampfile(self, stampbase, fn, taskname, extrainfo):
if taskname != "do_setscene" and taskname.endswith("_setscene"):
k = fn + "." + taskname[:-9]
else:
k = fn + "." + taskname
if clean:
h = "*"
elif k in self.taskhash:
if k in self.taskhash:
h = self.taskhash[k]
else:
# If k is not in basehash, then error
h = self.basehash[k]
return ("%s.%s.%s.%s" % (stampbase, taskname, h, extrainfo)).rstrip('.')
def stampcleanmask(self, stampbase, fn, taskname, extrainfo):
return self.stampfile(stampbase, fn, taskname, extrainfo, clean=True)
def invalidate_task(self, task, d, fn):
bb.note("Tainting hash to force rebuild of task %s, %s" % (fn, task))
bb.build.write_taint(task, d, fn)
@@ -298,7 +290,7 @@ def dump_this_task(outfile, d):
def clean_basepath(a):
if a.startswith("virtual:"):
b = a.rsplit(":", 1)[0] + ":" + a.rsplit("/", 1)[1]
b = a.rsplit(":", 1)[0] + a.rsplit("/", 1)[1]
else:
b = a.rsplit("/", 1)[1]
return b
@@ -309,9 +301,7 @@ def clean_basepaths(a):
b[clean_basepath(x)] = a[x]
return b
def compare_sigfiles(a, b, recursecb = None):
output = []
def compare_sigfiles(a, b):
p1 = pickle.Unpickler(open(a, "rb"))
a_data = p1.load()
p2 = pickle.Unpickler(open(b, "rb"))
@@ -330,123 +320,114 @@ def compare_sigfiles(a, b, recursecb = None):
return changed, added, removed
if 'basewhitelist' in a_data and a_data['basewhitelist'] != b_data['basewhitelist']:
output.append("basewhitelist changed from %s to %s" % (a_data['basewhitelist'], b_data['basewhitelist']))
print "basewhitelist changed from %s to %s" % (a_data['basewhitelist'], b_data['basewhitelist'])
if a_data['basewhitelist'] and b_data['basewhitelist']:
output.append("changed items: %s" % a_data['basewhitelist'].symmetric_difference(b_data['basewhitelist']))
print "changed items: %s" % a_data['basewhitelist'].symmetric_difference(b_data['basewhitelist'])
if 'taskwhitelist' in a_data and a_data['taskwhitelist'] != b_data['taskwhitelist']:
output.append("taskwhitelist changed from %s to %s" % (a_data['taskwhitelist'], b_data['taskwhitelist']))
print "taskwhitelist changed from %s to %s" % (a_data['taskwhitelist'], b_data['taskwhitelist'])
if a_data['taskwhitelist'] and b_data['taskwhitelist']:
output.append("changed items: %s" % a_data['taskwhitelist'].symmetric_difference(b_data['taskwhitelist']))
print "changed items: %s" % a_data['taskwhitelist'].symmetric_difference(b_data['taskwhitelist'])
if a_data['taskdeps'] != b_data['taskdeps']:
output.append("Task dependencies changed from:\n%s\nto:\n%s" % (sorted(a_data['taskdeps']), sorted(b_data['taskdeps'])))
print "Task dependencies changed from:\n%s\nto:\n%s" % (sorted(a_data['taskdeps']), sorted(b_data['taskdeps']))
if a_data['basehash'] != b_data['basehash']:
output.append("basehash changed from %s to %s" % (a_data['basehash'], b_data['basehash']))
print "basehash changed from %s to %s" % (a_data['basehash'], b_data['basehash'])
changed, added, removed = dict_diff(a_data['gendeps'], b_data['gendeps'], a_data['basewhitelist'] & b_data['basewhitelist'])
if changed:
for dep in changed:
output.append("List of dependencies for variable %s changed from %s to %s" % (dep, a_data['gendeps'][dep], b_data['gendeps'][dep]))
print "List of dependencies for variable %s changed from %s to %s" % (dep, a_data['gendeps'][dep], b_data['gendeps'][dep])
if a_data['gendeps'][dep] and b_data['gendeps'][dep]:
output.append("changed items: %s" % a_data['gendeps'][dep].symmetric_difference(b_data['gendeps'][dep]))
print "changed items: %s" % a_data['gendeps'][dep].symmetric_difference(b_data['gendeps'][dep])
if added:
for dep in added:
output.append("Dependency on variable %s was added" % (dep))
print "Dependency on variable %s was added" % (dep)
if removed:
for dep in removed:
output.append("Dependency on Variable %s was removed" % (dep))
print "Dependency on Variable %s was removed" % (dep)
changed, added, removed = dict_diff(a_data['varvals'], b_data['varvals'])
if changed:
for dep in changed:
output.append("Variable %s value changed from %s to %s" % (dep, a_data['varvals'][dep], b_data['varvals'][dep]))
print "Variable %s value changed from %s to %s" % (dep, a_data['varvals'][dep], b_data['varvals'][dep])
changed, added, removed = dict_diff(a_data['file_checksum_values'], b_data['file_checksum_values'])
if changed:
for f in changed:
output.append("Checksum for file %s changed from %s to %s" % (f, a_data['file_checksum_values'][f], b_data['file_checksum_values'][f]))
print "Checksum for file %s changed from %s to %s" % (f, a_data['file_checksum_values'][f], b_data['file_checksum_values'][f])
if added:
for f in added:
output.append("Dependency on checksum of file %s was added" % (f))
print "Dependency on checksum of file %s was added" % (f)
if removed:
for f in removed:
output.append("Dependency on checksum of file %s was removed" % (f))
print "Dependency on checksum of file %s was removed" % (f)
if 'runtaskhashes' in a_data and 'runtaskhashes' in b_data:
a = a_data['runtaskhashes']
b = b_data['runtaskhashes']
a = clean_basepaths(a_data['runtaskhashes'])
b = clean_basepaths(b_data['runtaskhashes'])
changed, added, removed = dict_diff(a, b)
if added:
for dep in added:
bdep_found = False
if removed:
for bdep in removed:
if a[dep] == b[bdep]:
#output.append("Dependency on task %s was replaced by %s with same hash" % (dep, bdep))
bdep_found = True
if not bdep_found:
output.append("Dependency on task %s was added with hash %s" % (clean_basepath(dep), a[dep]))
bdep_found = False
if removed:
for bdep in removed:
if a[dep] == b[bdep]:
#print "Dependency on task %s was replaced by %s with same hash" % (dep, bdep)
bdep_found = True
if not bdep_found:
print "Dependency on task %s was added with hash %s" % (dep, a[dep])
if removed:
for dep in removed:
adep_found = False
if added:
for adep in added:
if a[adep] == b[dep]:
#output.append("Dependency on task %s was replaced by %s with same hash" % (adep, dep))
adep_found = True
if not adep_found:
output.append("Dependency on task %s was removed with hash %s" % (clean_basepath(dep), b[dep]))
adep_found = False
if added:
for adep in added:
if a[adep] == b[dep]:
#print "Dependency on task %s was replaced by %s with same hash" % (adep, dep)
adep_found = True
if not adep_found:
print "Dependency on task %s was removed with hash %s" % (dep, b[dep])
if changed:
for dep in changed:
output.append("Hash for dependent task %s changed from %s to %s" % (clean_basepath(dep), a[dep], b[dep]))
if callable(recursecb):
recout = recursecb(dep, a[dep], b[dep])
if recout:
output.extend(recout)
print "Hash for dependent task %s changed from %s to %s" % (dep, a[dep], b[dep])
a_taint = a_data.get('taint', None)
b_taint = b_data.get('taint', None)
if a_taint != b_taint:
output.append("Taint (by forced/invalidated task) changed from %s to %s" % (a_taint, b_taint))
return output
print "Taint (by forced/invalidated task) changed from %s to %s" % (a_taint, b_taint)
def dump_sigfile(a):
output = []
p1 = pickle.Unpickler(open(a, "rb"))
a_data = p1.load()
output.append("basewhitelist: %s" % (a_data['basewhitelist']))
print "basewhitelist: %s" % (a_data['basewhitelist'])
output.append("taskwhitelist: %s" % (a_data['taskwhitelist']))
print "taskwhitelist: %s" % (a_data['taskwhitelist'])
output.append("Task dependencies: %s" % (sorted(a_data['taskdeps'])))
print "Task dependencies: %s" % (sorted(a_data['taskdeps']))
output.append("basehash: %s" % (a_data['basehash']))
print "basehash: %s" % (a_data['basehash'])
for dep in a_data['gendeps']:
output.append("List of dependencies for variable %s is %s" % (dep, a_data['gendeps'][dep]))
print "List of dependencies for variable %s is %s" % (dep, a_data['gendeps'][dep])
for dep in a_data['varvals']:
output.append("Variable %s value is %s" % (dep, a_data['varvals'][dep]))
print "Variable %s value is %s" % (dep, a_data['varvals'][dep])
if 'runtaskdeps' in a_data:
output.append("Tasks this task depends on: %s" % (a_data['runtaskdeps']))
print "Tasks this task depends on: %s" % (a_data['runtaskdeps'])
if 'file_checksum_values' in a_data:
output.append("This task depends on the checksums of files: %s" % (a_data['file_checksum_values']))
print "This task depends on the checksums of files: %s" % (a_data['file_checksum_values'])
if 'runtaskhashes' in a_data:
for dep in a_data['runtaskhashes']:
output.append("Hash for dependent task %s is %s" % (dep, a_data['runtaskhashes'][dep]))
print "Hash for dependent task %s is %s" % (dep, a_data['runtaskhashes'][dep])
if 'taint' in a_data:
output.append("Tainted (by forced/invalidated task): %s" % a_data['taint'])
return output
print "Tainted (by forced/invalidated task): %s" % a_data['taint']

View File

@@ -34,18 +34,3 @@ class VerCmpString(unittest.TestCase):
result = bb.utils.vercmp_string('1.1', '1_p2')
self.assertTrue(result < 0)
def test_explode_dep_versions(self):
correctresult = {"foo" : ["= 1.10"]}
result = bb.utils.explode_dep_versions2("foo (= 1.10)")
self.assertEqual(result, correctresult)
result = bb.utils.explode_dep_versions2("foo (=1.10)")
self.assertEqual(result, correctresult)
result = bb.utils.explode_dep_versions2("foo ( = 1.10)")
self.assertEqual(result, correctresult)
result = bb.utils.explode_dep_versions2("foo ( =1.10)")
self.assertEqual(result, correctresult)
result = bb.utils.explode_dep_versions2("foo ( = 1.10 )")
self.assertEqual(result, correctresult)
result = bb.utils.explode_dep_versions2("foo ( =1.10 )")
self.assertEqual(result, correctresult)

View File

@@ -1,98 +0,0 @@
# tinfoil: a simple wrapper around cooker for bitbake-based command-line utilities
#
# Copyright (C) 2012 Intel Corporation
# Copyright (C) 2011 Mentor Graphics Corporation
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
import logging
import warnings
import os
import sys
import bb.cache
import bb.cooker
import bb.providers
import bb.utils
from bb.cooker import state
import bb.fetch2
class Tinfoil:
def __init__(self):
# Needed to avoid deprecation warnings with python 2.6
warnings.filterwarnings("ignore", category=DeprecationWarning)
# Set up logging
self.logger = logging.getLogger('BitBake')
console = logging.StreamHandler(sys.stdout)
format = bb.msg.BBLogFormatter("%(levelname)s: %(message)s")
bb.msg.addDefaultlogFilter(console)
console.setFormatter(format)
self.logger.addHandler(console)
initialenv = os.environ.copy()
bb.utils.clean_environment()
self.config = TinfoilConfig(parse_only=True)
self.cooker = bb.cooker.BBCooker(self.config,
self.register_idle_function,
initialenv)
self.config_data = self.cooker.configuration.data
bb.providers.logger.setLevel(logging.ERROR)
self.cooker_data = None
def register_idle_function(self, function, data):
pass
def parseRecipes(self):
sys.stderr.write("Parsing recipes..")
self.logger.setLevel(logging.WARNING)
try:
while self.cooker.state in (state.initial, state.parsing):
self.cooker.updateCache()
except KeyboardInterrupt:
self.cooker.shutdown()
self.cooker.updateCache()
sys.exit(2)
self.logger.setLevel(logging.INFO)
sys.stderr.write("done.\n")
self.cooker_data = self.cooker.status
def prepare(self, config_only = False):
if not self.cooker_data:
if config_only:
self.cooker.parseConfiguration()
self.cooker_data = self.cooker.status
else:
self.parseRecipes()
class TinfoilConfig(object):
def __init__(self, **options):
self.pkgs_to_build = []
self.debug_domains = []
self.extra_assume_provided = []
self.prefile = []
self.postfile = []
self.debug = 0
self.__dict__.update(options)
def __getattr__(self, attribute):
try:
return super(TinfoilConfig, self).__getattribute__(attribute)
except AttributeError:
return None

View File

@@ -99,8 +99,6 @@ class BuildConfigurationTreeView(gtk.TreeView):
import os, os.path
if os.path.exists(path):
branch = bb.process.run('cd %s; git branch | grep "^* " | tr -d "* "' % path)[0]
if branch.startswith("fatal:"):
branch = "(unknown)"
if branch:
branch = branch.strip('\n')
vars.append(self.set_vars("Branch:", branch))
@@ -167,7 +165,7 @@ class BuildDetailsPage (HobPage):
self.builder.handler.build.model.connect_after("row-changed", self.scroll_to_present_row, self.scrolled_view_build.get_vadjustment(), self.build_tv)
self.button_box = gtk.HBox(False, 6)
self.back_button = HobAltButton('&lt;&lt; Back')
self.back_button = HobAltButton('<< Back')
self.back_button.connect("clicked", self.back_button_clicked_cb)
self.button_box.pack_start(self.back_button, expand=False, fill=False)
@@ -208,7 +206,7 @@ class BuildDetailsPage (HobPage):
color = HobColors.ERROR
build_fail_top = gtk.EventBox()
#build_fail_top.set_size_request(-1, 200)
build_fail_top.set_size_request(-1, 200)
build_fail_top.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(color))
build_fail_tab = gtk.Table(14, 46, True)
@@ -231,103 +229,40 @@ class BuildDetailsPage (HobPage):
# create button 'Edit packages'
action_button = HobButton(primary_action)
#action_button.set_size_request(-1, 40)
action_button.set_tooltip_text("Edit the %s parameters" % actions)
action_button.set_size_request(-1, 40)
action_button.connect('clicked', self.failure_primary_action_button_clicked_cb, primary_action)
build_fail_tab.attach(action_button, 4, 13, 9, 12)
if log_file:
open_log_button = HobAltButton("Open log")
open_log_button.set_relief(gtk.RELIEF_HALF)
open_log_button.set_tooltip_text("Open the build's log file")
open_log_button.connect('clicked', self.open_log_button_clicked_cb, log_file)
open_log_button.connect('clicked', self.failure_open_log_button_clicked_cb, log_file)
build_fail_tab.attach(open_log_button, 14, 23, 9, 12)
attach_pos = (24 if log_file else 14)
file_bug_button = HobAltButton('File a bug')
file_bug_button.set_relief(gtk.RELIEF_HALF)
file_bug_button.set_tooltip_text("Open the Yocto Project bug tracking website")
file_bug_button.connect('clicked', self.failure_activate_file_bug_link_cb)
build_fail_tab.attach(file_bug_button, attach_pos, attach_pos + 9, 9, 12)
return build_fail_top
def show_fail_page(self, title):
def show_fail_page(self, title, action_names):
self._remove_all_widget()
self.title = "Hob cannot build your %s" % title
self.build_fail_bar = self.add_build_fail_top_bar(title, self.builder.current_logfile)
self.build_fail_bar = self.add_build_fail_top_bar(action_names, self.builder.current_logfile)
self.pack_start(self.group_align, expand=True, fill=True)
self.box_group_area.pack_start(self.build_fail_bar, expand=False, fill=False)
self.box_group_area.pack_start(self.vbox, expand=True, fill=True)
self.vbox.pack_start(self.notebook, expand=True, fill=True)
self.box_group_area.pack_end(self.button_box, expand=False, fill=False)
self.show_all()
self.back_button.hide()
def add_build_stop_top_bar(self, action, log_file=None):
color = HobColors.LIGHT_GRAY
build_stop_top = gtk.EventBox()
#build_stop_top.set_size_request(-1, 200)
build_stop_top.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(color))
build_stop_top.set_flags(gtk.CAN_DEFAULT)
build_stop_top.grab_default()
build_stop_tab = gtk.Table(11, 46, True)
build_stop_top.add(build_stop_tab)
icon = gtk.Image()
icon_pix_buffer = gtk.gdk.pixbuf_new_from_file(hic.ICON_INFO_HOVER_FILE)
icon.set_from_pixbuf(icon_pix_buffer)
build_stop_tab.attach(icon, 1, 4, 0, 6)
label = gtk.Label()
label.set_alignment(0.0, 0.5)
label.set_markup("<span size='x-large'><b>%s</b></span>" % self.title)
build_stop_tab.attach(label, 4, 26, 0, 6)
action_button = HobButton("Edit %s" % action)
action_button.set_size_request(-1, 40)
if action == "image":
action_button.set_tooltip_text("Edit the image parameters")
elif action == "recipes":
action_button.set_tooltip_text("Edit the included recipes")
elif action == "packages":
action_button.set_tooltip_text("Edit the included packages")
action_button.connect('clicked', self.stop_primary_action_button_clicked_cb, action)
build_stop_tab.attach(action_button, 4, 13, 6, 9)
if log_file:
open_log_button = HobAltButton("Open log")
open_log_button.set_relief(gtk.RELIEF_HALF)
open_log_button.set_tooltip_text("Open the build's log file")
open_log_button.connect('clicked', self.open_log_button_clicked_cb, log_file)
build_stop_tab.attach(open_log_button, 14, 23, 6, 9)
attach_pos = (24 if log_file else 14)
build_button = HobAltButton("Build new image")
#build_button.set_size_request(-1, 40)
build_button.set_tooltip_text("Create a new image from scratch")
build_button.connect('clicked', self.new_image_button_clicked_cb)
build_stop_tab.attach(build_button, attach_pos, attach_pos + 9, 6, 9)
return build_stop_top, action_button
def show_stop_page(self, action):
self._remove_all_widget()
self.title = "Build stopped"
self.build_stop_bar, action_button = self.add_build_stop_top_bar(action, self.builder.current_logfile)
self.pack_start(self.group_align, expand=True, fill=True)
self.box_group_area.pack_start(self.build_stop_bar, expand=False, fill=False)
self.box_group_area.pack_start(self.vbox, expand=True, fill=True)
self.vbox.pack_start(self.notebook, expand=True, fill=True)
self.show_all()
self.back_button.hide()
return action_button
def show_page(self, step):
self._remove_all_widget()
if step == self.builder.PACKAGE_GENERATING or step == self.builder.FAST_IMAGE_GENERATING:
@@ -361,9 +296,6 @@ class BuildDetailsPage (HobPage):
def back_button_clicked_cb(self, button):
self.builder.show_configuration()
def new_image_button_clicked_cb(self, button):
self.builder.reset()
def show_back_button(self):
self.back_button.show()
@@ -390,18 +322,10 @@ class BuildDetailsPage (HobPage):
self.builder.show_recipes()
elif "Edit packages" in action:
self.builder.show_packages()
elif "Edit image" in action:
elif "Edit image configuration" in action:
self.builder.show_configuration()
def stop_primary_action_button_clicked_cb(self, button, action):
if "recipes" in action:
self.builder.show_recipes()
elif "packages" in action:
self.builder.show_packages(ask=False)
elif "image" in action:
self.builder.show_configuration()
def open_log_button_clicked_cb(self, button, log_file):
def failure_open_log_button_clicked_cb(self, button, log_file):
if log_file:
os.system("xdg-open /%s" % log_file)

View File

@@ -21,26 +21,23 @@
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
import glib
import gtk, gobject
import gtk
import copy
import os
import subprocess
import shlex
import re
import logging
import sys
from bb.ui.crumbs.template import TemplateMgr
from bb.ui.crumbs.imageconfigurationpage import ImageConfigurationPage
from bb.ui.crumbs.recipeselectionpage import RecipeSelectionPage
from bb.ui.crumbs.packageselectionpage import PackageSelectionPage
from bb.ui.crumbs.builddetailspage import BuildDetailsPage
from bb.ui.crumbs.imagedetailspage import ImageDetailsPage
from bb.ui.crumbs.sanitycheckpage import SanityCheckPage
from bb.ui.crumbs.hobwidget import hwc, HobButton, HobAltButton
from bb.ui.crumbs.hobwidget import hwc, HobButton, HobAltButton, hcc
from bb.ui.crumbs.hig import CrumbsMessageDialog, ImageSelectionDialog, \
AdvancedSettingDialog, SimpleSettingsDialog, \
LayerSelectionDialog, DeployImageDialog
AdvancedSettingDialog, LayerSelectionDialog, \
DeployImageDialog
from bb.ui.crumbs.persistenttooltip import PersistentTooltip
import bb.ui.crumbs.utils
@@ -126,8 +123,6 @@ class Configuration:
self.selected_image = None
self.selected_recipes = []
self.selected_packages = []
self.initial_selected_packages = []
self.initial_user_selected_packages = []
def split_proxy(self, protocol, proxy):
entry = []
@@ -189,7 +184,7 @@ class Configuration:
self.curr_distro = template.getVar("DISTRO")
self.dldir = template.getVar("DL_DIR")
self.sstatedir = template.getVar("SSTATE_DIR")
self.sstatemirror = template.getVar("SSTATE_MIRRORS")
self.sstatemirror = template.getVar("SSTATE_MIRROR")
try:
self.pmake = int(template.getVar("PARALLEL_MAKE").split()[1])
except:
@@ -239,7 +234,7 @@ class Configuration:
template.setVar("DISTRO", self.curr_distro)
template.setVar("DL_DIR", self.dldir)
template.setVar("SSTATE_DIR", self.sstatedir)
template.setVar("SSTATE_MIRRORS", self.sstatemirror)
template.setVar("SSTATE_MIRROR", self.sstatemirror)
template.setVar("PARALLEL_MAKE", "-j %s" % self.pmake)
template.setVar("BB_NUMBER_THREADS", self.bbthread)
template.setVar("PACKAGE_CLASSES", " ".join(["package_" + i for i in self.curr_package_format.split()]))
@@ -268,22 +263,6 @@ class Configuration:
template.setVar("CVS_PROXY_HOST", self.combine_host_only("cvs"))
template.setVar("CVS_PROXY_PORT", self.combine_port_only("cvs"))
def __str__(self):
s = "VERSION: '%s', BBLAYERS: '%s', MACHINE: '%s', DISTRO: '%s', DL_DIR: '%s'," % \
(hobVer, " ".join(self.layers), self.curr_mach, self.curr_distro, self.dldir )
s += "SSTATE_DIR: '%s', SSTATE_MIRROR: '%s', PARALLEL_MAKE: '-j %s', BB_NUMBER_THREADS: '%s', PACKAGE_CLASSES: '%s', " % \
(self.sstatedir, self.sstatemirror, self.pmake, self.bbthread, " ".join(["package_" + i for i in self.curr_package_format.split()]))
s += "IMAGE_ROOTFS_SIZE: '%s', IMAGE_EXTRA_SPACE: '%s', INCOMPATIBLE_LICENSE: '%s', SDKMACHINE: '%s', CONF_VERSION: '%s', " % \
(self.image_rootfs_size, self.image_extra_size, self.incompat_license, self.curr_sdk_machine, self.conf_version)
s += "LCONF_VERSION: '%s', EXTRA_SETTING: '%s', TOOLCHAIN_BUILD: '%s', IMAGE_FSTYPES: '%s', __SELECTED_IMAGE__: '%s', " % \
(self.lconf_version, self.extra_setting, self.toolchain_build, self.image_fstypes, self.selected_image)
s += "DEPENDS: '%s', IMAGE_INSTALL: '%s', enable_proxy: '%s', use_same_proxy: '%s', http_proxy: '%s', " % \
(self.selected_recipes, self.user_selected_packages, self.enable_proxy, self.same_proxy, self.combine_proxy("http"))
s += "https_proxy: '%s', ftp_proxy: '%s', GIT_PROXY_HOST: '%s', GIT_PROXY_PORT: '%s', CVS_PROXY_HOST: '%s', CVS_PROXY_PORT: '%s'" % \
(self.combine_proxy("https"), self.combine_proxy("ftp"),self.combine_host_only("git"), self.combine_port_only("git"),
self.combine_host_only("cvs"), self.combine_port_only("cvs"))
return s
class Parameters:
'''Represents other variables like available machines, etc.'''
@@ -344,7 +323,7 @@ def hob_conf_filter(fn, data):
keys = ["MACHINE_HOB", "SDKMACHINE_HOB", "PACKAGE_CLASSES_HOB", \
"BB_NUMBER_THREADS_HOB", "PARALLEL_MAKE_HOB", "DL_DIR_HOB", \
"SSTATE_DIR_HOB", "SSTATE_MIRRORS_HOB", "INCOMPATIBLE_LICENSE_HOB"]
"SSTATE_DIR_HOB", "SSTATE_MIRROR_HOB", "INCOMPATIBLE_LICENSE_HOB"]
for key in keys:
var_hob = data.getVar(key)
if var_hob:
@@ -359,8 +338,7 @@ def hob_conf_filter(fn, data):
class Builder(gtk.Window):
(INITIAL_CHECKS,
MACHINE_SELECTION,
(MACHINE_SELECTION,
RCPPKGINFO_POPULATING,
RCPPKGINFO_POPULATED,
BASEIMG_SELECTED,
@@ -373,18 +351,16 @@ class Builder(gtk.Window):
IMAGE_GENERATED,
MY_IMAGE_OPENED,
BACK,
END_NOOP) = range(15)
END_NOOP) = range(14)
(SANITY_CHECK,
IMAGE_CONFIGURATION,
(IMAGE_CONFIGURATION,
RECIPE_DETAILS,
BUILD_DETAILS,
PACKAGE_DETAILS,
IMAGE_DETAILS,
END_TAB) = range(7)
END_TAB) = range(6)
__step2page__ = {
INITIAL_CHECKS : SANITY_CHECK,
MACHINE_SELECTION : IMAGE_CONFIGURATION,
RCPPKGINFO_POPULATING : IMAGE_CONFIGURATION,
RCPPKGINFO_POPULATED : IMAGE_CONFIGURATION,
@@ -400,7 +376,14 @@ class Builder(gtk.Window):
END_NOOP : None,
}
SANITY_CHECK_MIN_DISPLAY_TIME = 5
@classmethod
def interpret_markup(cls, msg):
msg = msg.replace('&', '&amp;')
msg = msg.replace('<', '&lt;')
msg = msg.replace('>', '&gt;')
msg = msg.replace('"', '&quot;')
msg = msg.replace("'", "&acute;")
return msg
def __init__(self, hobHandler, recipe_model, package_model):
super(Builder, self).__init__()
@@ -474,14 +457,8 @@ class Builder(gtk.Window):
self.set_title("Hob")
self.set_icon_name("applications-development")
self.set_resizable(True)
try:
window_width = self.get_screen().get_width()
window_height = self.get_screen().get_height()
except AttributeError:
print "Please set DISPLAY variable before running Hob."
sys.exit(1)
window_width = self.get_screen().get_width()
window_height = self.get_screen().get_height()
if window_width >= hwc.MAIN_WIN_WIDTH:
window_width = hwc.MAIN_WIN_WIDTH
window_height = hwc.MAIN_WIN_HEIGHT
@@ -497,14 +474,9 @@ class Builder(gtk.Window):
self.build_details_page = BuildDetailsPage(self)
self.package_details_page = PackageSelectionPage(self)
self.image_details_page = ImageDetailsPage(self)
self.sanity_check_page = SanityCheckPage(self)
self.display_sanity_check = False
self.sanity_check_post_func = False
self.had_network_error = False
self.nb = gtk.Notebook()
self.nb.set_show_tabs(False)
self.nb.insert_page(self.sanity_check_page, None, self.SANITY_CHECK)
self.nb.insert_page(self.image_configuration_page, None, self.IMAGE_CONFIGURATION)
self.nb.insert_page(self.recipe_details_page, None, self.RECIPE_DETAILS)
self.nb.insert_page(self.build_details_page, None, self.BUILD_DETAILS)
@@ -515,46 +487,17 @@ class Builder(gtk.Window):
self.show_all()
self.nb.set_current_page(0)
def sanity_check_timeout(self):
# The minimum time for showing the 'sanity check' page has passe
# If someone set the 'sanity_check_post_step' meanwhile, execute it now
self.display_sanity_check = False
if self.sanity_check_post_func:
temp = self.sanity_check_post_func
self.sanity_check_post_func = None
temp()
return False
def show_sanity_check_page(self):
# This window must stay on screen for at least 5 seconds, according to the design document
self.nb.set_current_page(self.SANITY_CHECK)
self.sanity_check_post_step = None
self.display_sanity_check = True
self.sanity_check_page.start()
gobject.timeout_add(self.SANITY_CHECK_MIN_DISPLAY_TIME * 1000, self.sanity_check_timeout)
def execute_after_sanity_check(self, func):
if not self.display_sanity_check:
func()
else:
sanity_check_post_func = func
def generate_configuration(self):
self.show_sanity_check_page()
self.handler.generate_configuration()
def initiate_new_build_async(self):
self.switch_page(self.MACHINE_SELECTION)
if self.load_template(TemplateMgr.convert_to_template_pathfilename("default", ".hob/")) == False:
self.show_sanity_check_page()
self.handler.init_cooker()
self.handler.set_extra_inherit("image_types")
self.generate_configuration()
self.handler.generate_configuration()
def update_config_async(self):
self.switch_page(self.MACHINE_SELECTION)
self.set_user_config()
self.generate_configuration()
self.handler.generate_configuration()
def sanity_check(self):
self.handler.trigger_sanity_check()
@@ -576,13 +519,6 @@ class Builder(gtk.Window):
self.handler.reset_build()
self.handler.generate_packages(all_recipes, self.configuration.default_task)
def restore_initial_selected_packages(self):
self.package_model.set_selected_packages(self.configuration.initial_user_selected_packages, True)
self.package_model.set_selected_packages(self.configuration.initial_selected_packages)
for package in self.configuration.selected_packages:
if package not in self.configuration.initial_selected_packages:
self.package_model.exclude_item(self.package_model.find_path_for_item(package))
def fast_generate_image_async(self, log = False):
self.switch_page(self.FAST_IMAGE_GENERATING)
if log:
@@ -710,9 +646,6 @@ class Builder(gtk.Window):
self.recipe_details_page.set_recipe_curr_tab(self.recipe_details_page.INCLUDED)
elif next_step == self.PACKAGE_SELECTION:
self.configuration.initial_selected_packages = self.configuration.selected_packages
self.configuration.initial_user_selected_packages = self.configuration.user_selected_packages
self.package_details_page.set_title("Edit packages")
if self.recipe_model.get_selected_image() == self.recipe_model.__custom_image__:
self.package_details_page.set_packages_curr_tab(self.package_details_page.ALL)
else:
@@ -725,7 +658,6 @@ class Builder(gtk.Window):
self.build_details_page.show_page(next_step)
elif next_step == self.PACKAGE_GENERATED:
self.package_details_page.set_title("Step 2 of 2: Edit packages")
if self.recipe_model.get_selected_image() == self.recipe_model.__custom_image__:
self.package_details_page.set_packages_curr_tab(self.package_details_page.ALL)
else:
@@ -756,7 +688,7 @@ class Builder(gtk.Window):
self.handler.set_distro(self.configuration.curr_distro)
self.handler.set_dl_dir(self.configuration.dldir)
self.handler.set_sstate_dir(self.configuration.sstatedir)
self.handler.set_sstate_mirrors(self.configuration.sstatemirror)
self.handler.set_sstate_mirror(self.configuration.sstatemirror)
self.handler.set_pmake(self.configuration.pmake)
self.handler.set_bbthreads(self.configuration.bbthread)
self.handler.set_rootfs_size(self.configuration.image_rootfs_size)
@@ -785,10 +717,7 @@ class Builder(gtk.Window):
self.recipe_model.set_selected_image(selected_image)
self.recipe_model.set_selected_recipes(selected_recipes)
def update_package_model(self, selected_packages, user_selected_packages=None):
if user_selected_packages:
left = self.package_model.set_selected_packages(user_selected_packages, True)
self.configuration.user_selected_packages += left
def update_package_model(self, selected_packages):
left = self.package_model.set_selected_packages(selected_packages)
self.configuration.selected_packages += left
@@ -816,29 +745,12 @@ class Builder(gtk.Window):
def handler_package_formats_updated_cb(self, handler, formats):
self.parameters.all_package_formats = formats
def switch_to_image_configuration_helper(self):
self.sanity_check_page.stop()
self.switch_page(self.IMAGE_CONFIGURATION)
self.image_configuration_page.switch_machine_combo()
def show_network_error_dialog_helper(self):
self.sanity_check_page.stop()
self.show_network_error_dialog()
def handler_command_succeeded_cb(self, handler, initcmd):
if initcmd == self.handler.GENERATE_CONFIGURATION:
if not self.configuration.curr_mach:
self.configuration.curr_mach = self.handler.runCommand(["getVariable", "HOB_MACHINE"]) or ""
self.update_configuration_parameters(self.get_parameters_sync())
self.sanity_check()
elif initcmd == self.handler.SANITY_CHECK:
if self.had_network_error:
self.had_network_error = False
self.execute_after_sanity_check(self.show_network_error_dialog_helper)
else:
# Switch to the 'image configuration' page now, but we might need
# to wait for the minimum display time of the sanity check page
self.execute_after_sanity_check(self.switch_to_image_configuration_helper)
self.image_configuration_page.switch_machine_combo()
elif initcmd in [self.handler.GENERATE_RECIPES,
self.handler.GENERATE_PACKAGES,
self.handler.GENERATE_IMAGE]:
@@ -855,47 +767,23 @@ class Builder(gtk.Window):
self.generate_image_async(True)
def show_error_dialog(self, msg):
lbl = "<b>Hob found an error</b>\n"
dialog = CrumbsMessageDialog(self, lbl, gtk.STOCK_DIALOG_ERROR, msg)
lbl = "<b>Error</b>\n"
lbl = lbl + "%s\n\n" % Builder.interpret_markup(msg)
dialog = CrumbsMessageDialog(self, lbl, gtk.STOCK_DIALOG_ERROR)
button = dialog.add_button("Close", gtk.RESPONSE_OK)
HobButton.style_button(button)
response = dialog.run()
dialog.destroy()
def show_network_error_dialog(self):
lbl = "<b>Hob cannot connect to the network</b>\n"
msg = "Please check your network connection. If you are using a proxy server, please make sure it is configured correctly."
lbl = lbl + "%s\n\n" % glib.markup_escape_text(msg)
dialog = CrumbsMessageDialog(self, lbl, gtk.STOCK_DIALOG_ERROR)
button = dialog.add_button("Close", gtk.RESPONSE_OK)
HobButton.style_button(button)
button = dialog.add_button("Proxy settings", gtk.RESPONSE_CANCEL)
HobButton.style_button(button)
res = dialog.run()
dialog.destroy()
if res == gtk.RESPONSE_CANCEL:
res, settings_changed = self.show_simple_settings_dialog(SimpleSettingsDialog.PROXIES_PAGE_ID)
if not res:
return
if settings_changed:
self.reparse_post_adv_settings()
def handler_command_failed_cb(self, handler, msg):
if msg:
self.show_error_dialog(msg)
self.reset()
def handler_sanity_failed_cb(self, handler, msg, network_error):
def handler_sanity_failed_cb(self, handler, msg):
msg = msg.replace("your local.conf", "Settings")
self.show_error_dialog(msg)
self.reset()
if network_error:
# Mark this in an internal field. The "network error" dialog will be
# shown later, when a SanityCheckPassed event will be handled
# (as sent by sanity.bbclass)
self.had_network_error = True
else:
msg = msg.replace("your local.conf", "Settings")
self.show_error_dialog(msg)
self.reset()
def window_sensitive(self, sensitive):
self.image_configuration_page.machine_combo.set_sensitive(sensitive)
@@ -905,7 +793,6 @@ class Builder(gtk.Window):
self.image_configuration_page.layer_button.set_sensitive(sensitive)
self.image_configuration_page.layer_info_icon.set_sensitive(sensitive)
self.image_configuration_page.toolbar.set_sensitive(sensitive)
self.image_configuration_page.view_adv_configuration_button.set_sensitive(sensitive)
self.image_configuration_page.config_build_button.set_sensitive(sensitive)
self.recipe_details_page.set_sensitive(sensitive)
@@ -914,9 +801,9 @@ class Builder(gtk.Window):
self.image_details_page.set_sensitive(sensitive)
if sensitive:
self.window.set_cursor(None)
self.get_root_window().set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR))
else:
self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
self.get_root_window().set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
self.sensitive = sensitive
@@ -930,12 +817,11 @@ class Builder(gtk.Window):
selected_image = self.configuration.selected_image
selected_recipes = self.configuration.selected_recipes[:]
selected_packages = self.configuration.selected_packages[:]
user_selected_packages = self.configuration.user_selected_packages[:]
self.image_configuration_page.update_image_combo(self.recipe_model, selected_image)
self.image_configuration_page.update_image_desc()
self.update_recipe_model(selected_image, selected_recipes)
self.update_package_model(selected_packages, user_selected_packages)
self.update_package_model(selected_packages)
def recipelist_changed_cb(self, recipe_model):
self.recipe_details_page.refresh_selection()
@@ -1007,13 +893,8 @@ class Builder(gtk.Window):
linkname = 'hob-image-' + self.configuration.curr_mach
else:
linkname = selected_image + '-' + self.configuration.curr_mach
image_extension = self.get_image_extension()
for image_type in self.parameters.image_types:
if image_type in image_extension:
real_types = image_extension[image_type]
else:
real_types = [image_type]
for real_image_type in real_types:
for real_image_type in hcc.SUPPORTED_IMAGE_TYPES[image_type]:
linkpath = self.parameters.image_addr + '/' + linkname + '.' + real_image_type
if os.path.exists(linkpath):
self.parameters.image_names.append(os.readlink(linkpath))
@@ -1033,18 +914,6 @@ class Builder(gtk.Window):
status = "stop"
message = "Build stopped: "
fraction = self.build_details_page.progress_bar.get_fraction()
stop_to_next_edit = ""
if self.current_step == self.FAST_IMAGE_GENERATING:
stop_to_next_edit = "image configuration"
elif self.current_step == self.IMAGE_GENERATING:
if self.previous_step == self.FAST_IMAGE_GENERATING:
stop_to_next_edit = "image configuration"
else:
stop_to_next_edit = "packages"
elif self.current_step == self.PACKAGE_GENERATING:
stop_to_next_edit = "recipes"
button = self.build_details_page.show_stop_page(stop_to_next_edit.split(' ')[0])
self.set_default(button)
else:
fail_to_next_edit = ""
if self.current_step == self.FAST_IMAGE_GENERATING:
@@ -1059,7 +928,7 @@ class Builder(gtk.Window):
elif self.current_step == self.PACKAGE_GENERATING:
fail_to_next_edit = "recipes"
fraction = 1.0
self.build_details_page.show_fail_page(fail_to_next_edit.split(' ')[0])
self.build_details_page.show_fail_page(fail_to_next_edit.split(' ')[0], fail_to_next_edit)
status = "fail"
message = "Build failed: "
self.build_details_page.update_progress_bar(message, fraction, status)
@@ -1082,7 +951,7 @@ class Builder(gtk.Window):
self.build_failed()
def handler_no_provider_cb(self, running_build, msg):
dialog = CrumbsMessageDialog(self, glib.markup_escape_text(msg), gtk.STOCK_DIALOG_INFO)
dialog = CrumbsMessageDialog(self, Builder.interpret_markup(msg), gtk.STOCK_DIALOG_INFO)
button = dialog.add_button("Close", gtk.RESPONSE_OK)
HobButton.style_button(button)
dialog.run()
@@ -1127,11 +996,20 @@ class Builder(gtk.Window):
def destroy_window_cb(self, widget, event):
if not self.sensitive:
return True
elif self.handler.building:
self.stop_build()
return True
else:
lbl = "<b>Do you really want to exit the Hob image creator?</b>"
dialog = CrumbsMessageDialog(self, lbl, gtk.STOCK_DIALOG_INFO)
button = dialog.add_button("Cancel", gtk.RESPONSE_NO)
HobAltButton.style_button(button)
button = dialog.add_button("Exit Hob", gtk.RESPONSE_YES)
HobButton.style_button(button)
dialog.set_default_response(gtk.RESPONSE_YES)
response = dialog.run()
dialog.destroy()
if response == gtk.RESPONSE_YES:
gtk.main_quit()
return False
else:
return True
def build_packages(self):
_, all_recipes = self.recipe_model.get_selected_recipes()
@@ -1236,21 +1114,10 @@ class Builder(gtk.Window):
self.save_template(path)
dialog.destroy()
def get_image_extension(self):
image_extension = {}
for type in self.parameters.image_types:
ext = self.handler.runCommand(["getVariable", "IMAGE_EXTENSION_%s" % type])
if ext:
image_extension[type] = ext.split(' ')
return image_extension
def show_load_my_images_dialog(self):
image_extension = self.get_image_extension()
dialog = ImageSelectionDialog(self.parameters.image_addr, self.parameters.image_types,
"Open My Images", self,
gtk.FILE_CHOOSER_ACTION_SAVE, None,
image_extension)
gtk.FILE_CHOOSER_ACTION_SAVE)
button = dialog.add_button("Cancel", gtk.RESPONSE_NO)
HobAltButton.style_button(button)
button = dialog.add_button("Open", gtk.RESPONSE_YES)
@@ -1273,8 +1140,8 @@ class Builder(gtk.Window):
dialog.destroy()
def show_adv_settings_dialog(self, tab=None):
dialog = AdvancedSettingDialog(title = "Advanced configuration",
def show_adv_settings_dialog(self):
dialog = AdvancedSettingDialog(title = "Settings",
configuration = copy.deepcopy(self.configuration),
all_image_types = self.parameters.image_types,
all_package_formats = self.parameters.all_package_formats,
@@ -1289,34 +1156,6 @@ class Builder(gtk.Window):
HobAltButton.style_button(button)
button = dialog.add_button("Save", gtk.RESPONSE_YES)
HobButton.style_button(button)
dialog.set_save_button(button)
response = dialog.run()
settings_changed = False
if response == gtk.RESPONSE_YES:
self.configuration = dialog.configuration
self.save_defaults() # remember settings
settings_changed = dialog.settings_changed
dialog.destroy()
return response == gtk.RESPONSE_YES, settings_changed
def show_simple_settings_dialog(self, tab=None):
dialog = SimpleSettingsDialog(title = "Settings",
configuration = copy.deepcopy(self.configuration),
all_image_types = self.parameters.image_types,
all_package_formats = self.parameters.all_package_formats,
all_distros = self.parameters.all_distros,
all_sdk_machines = self.parameters.all_sdk_machines,
max_threads = self.parameters.max_threads,
parent = self,
flags = gtk.DIALOG_MODAL
| gtk.DIALOG_DESTROY_WITH_PARENT
| gtk.DIALOG_NO_SEPARATOR)
button = dialog.add_button("Cancel", gtk.RESPONSE_NO)
HobAltButton.style_button(button)
button = dialog.add_button("Save", gtk.RESPONSE_YES)
HobButton.style_button(button)
if tab:
dialog.switch_to_page(tab)
response = dialog.run()
settings_changed = False
if response == gtk.RESPONSE_YES:
@@ -1461,27 +1300,25 @@ class Builder(gtk.Window):
HobButton.style_button(button)
else:
lbl = "<b>Stop build?</b>\n\nAre you sure you want to stop this"
lbl = lbl + " build?\n\n'Stop' will stop the build as soon as all in"
lbl = lbl + " build?\n\n'Force Stop' will stop the build as quickly as"
lbl = lbl + " possible but may well leave your build directory in an"
lbl = lbl + " unusable state that requires manual steps to fix.\n\n"
lbl = lbl + "'Stop' will stop the build as soon as all in"
lbl = lbl + " progress build tasks are finished. However if a"
lbl = lbl + " lengthy compilation phase is in progress this may take"
lbl = lbl + " some time.\n\n"
lbl = lbl + "'Force Stop' will stop the build as quickly as"
lbl = lbl + " possible but may well leave your build directory in an"
lbl = lbl + " unusable state that requires manual steps to fix."
lbl = lbl + " some time."
dialog = CrumbsMessageDialog(self, lbl, gtk.STOCK_DIALOG_WARNING)
button = dialog.add_button("Cancel", gtk.RESPONSE_CANCEL)
HobAltButton.style_button(button)
button = dialog.add_button("Force stop", gtk.RESPONSE_YES)
HobAltButton.style_button(button)
button = dialog.add_button("Stop", gtk.RESPONSE_OK)
HobAltButton.style_button(button)
button = dialog.add_button("Force Stop", gtk.RESPONSE_YES)
HobButton.style_button(button)
response = dialog.run()
dialog.destroy()
if response != gtk.RESPONSE_CANCEL:
self.stopping = True
if response == gtk.RESPONSE_OK:
self.build_details_page.progress_bar.set_title("Stopping the build...")
self.build_details_page.progress_bar.set_rcstyle("stop")
self.cancel_build_sync()
elif response == gtk.RESPONSE_YES:
self.cancel_build_sync(True)
@@ -1497,4 +1334,4 @@ class Builder(gtk.Window):
format = bb.msg.BBLogFormatter("%(levelname)s: %(message)s")
self.consolelog.setFormatter(format)
self.logger.addHandler(self.consolelog)
self.logger.addHandler(self.consolelog)

File diff suppressed because it is too large Load Diff

View File

@@ -22,6 +22,7 @@
import gobject
import logging
from bb.ui.crumbs.runningbuild import RunningBuild
from bb.ui.crumbs.hobwidget import hcc
class HobHandler(gobject.GObject):
@@ -43,7 +44,7 @@ class HobHandler(gobject.GObject):
(gobject.TYPE_STRING,)),
"sanity-failed" : (gobject.SIGNAL_RUN_LAST,
gobject.TYPE_NONE,
(gobject.TYPE_STRING, gobject.TYPE_INT)),
(gobject.TYPE_STRING,)),
"generating-data" : (gobject.SIGNAL_RUN_LAST,
gobject.TYPE_NONE,
()),
@@ -101,10 +102,7 @@ class HobHandler(gobject.GObject):
def runCommand(self, commandline):
try:
result, error = self.server.runCommand(commandline)
if error:
raise Exception("Error running command '%s': %s" % (commandline, error))
return result
return self.server.runCommand(commandline)
except Exception as e:
self.commands_async = []
self.clear_busy()
@@ -159,16 +157,10 @@ class HobHandler(gobject.GObject):
targets.append(self.toolchain)
self.runCommand(["buildTargets", targets, self.default_task])
def display_error(self):
self.clear_busy()
self.emit("command-failed", self.error_msg)
self.error_msg = ""
if self.building:
self.building = False
def handle_event(self, event):
if not event:
return
if self.building:
self.current_phase = "building"
self.build.handle_event(event)
@@ -182,14 +174,11 @@ class HobHandler(gobject.GObject):
self.run_next_command()
elif isinstance(event, bb.event.SanityCheckFailed):
self.emit("sanity-failed", event._msg, event._network_error)
self.emit("sanity-failed", event._msg)
elif isinstance(event, logging.LogRecord):
if not self.building:
if event.levelno >= logging.ERROR:
formatter = bb.msg.BBLogFormatter()
msg = formatter.format(event)
self.error_msg += msg + '\n'
if event.levelno >= logging.ERROR:
self.error_msg += event.msg + '\n'
elif isinstance(event, bb.event.TargetsTreeGenerated):
self.current_phase = "data generation"
@@ -221,7 +210,11 @@ class HobHandler(gobject.GObject):
self.run_next_command()
elif isinstance(event, bb.command.CommandFailed):
self.commands_async = []
self.display_error()
self.clear_busy()
self.emit("command-failed", self.error_msg)
self.error_msg = ""
if self.building:
self.building = False
elif isinstance(event, (bb.event.ParseStarted,
bb.event.CacheLoadStarted,
bb.event.TreeDataPreparationStarted,
@@ -251,9 +244,6 @@ class HobHandler(gobject.GObject):
message["title"] = "Parsing recipes: "
self.emit("parsing-completed", message)
if self.error_msg and not self.commands_async:
self.display_error()
return
def init_cooker(self):
@@ -299,8 +289,8 @@ class HobHandler(gobject.GObject):
def set_sstate_dir(self, directory):
self.runCommand(["setVariable", "SSTATE_DIR_HOB", directory])
def set_sstate_mirrors(self, url):
self.runCommand(["setVariable", "SSTATE_MIRRORS_HOB", url])
def set_sstate_mirror(self, url):
self.runCommand(["setVariable", "SSTATE_MIRROR_HOB", url])
def set_extra_size(self, image_extra_size):
self.runCommand(["setVariable", "IMAGE_ROOTFS_EXTRA_SPACE", str(image_extra_size)])
@@ -401,7 +391,7 @@ class HobHandler(gobject.GObject):
self.build.reset()
def get_logfile(self):
return self.server.runCommand(["getVariable", "BB_CONSOLELOG"])[0]
return self.server.runCommand(["getVariable", "BB_CONSOLELOG"])
def _remove_redundant(self, string):
ret = []
@@ -423,7 +413,7 @@ class HobHandler(gobject.GObject):
params["distro"] = self.runCommand(["getVariable", "DISTRO"]) or "defaultsetup"
params["pclass"] = self.runCommand(["getVariable", "PACKAGE_CLASSES"]) or ""
params["sstatedir"] = self.runCommand(["getVariable", "SSTATE_DIR"]) or ""
params["sstatemirror"] = self.runCommand(["getVariable", "SSTATE_MIRRORS"]) or ""
params["sstatemirror"] = self.runCommand(["getVariable", "SSTATE_MIRROR"]) or ""
num_threads = self.runCommand(["getCpuCount"])
if not num_threads:

View File

@@ -42,7 +42,7 @@ class PackageListModel(gtk.TreeStore):
()),
}
__toolchain_required_packages__ = ["packagegroup-core-standalone-sdk-target", "packagegroup-core-standalone-sdk-target-dbg"]
__toolchain_required_packages__ = ["task-core-standalone-sdk-target", "task-core-standalone-sdk-target-dbg"]
def __init__(self):
@@ -145,12 +145,6 @@ class PackageListModel(gtk.TreeStore):
self.pkg_path = {}
self.rprov_pkg = {}
def getpkgvalue(pkgdict, key, pkgname, defaultval = None):
value = pkgdict.get('%s_%s' % (key, pkgname), None)
if not value:
value = pkgdict.get(key, defaultval)
return value
for pkginfo in pkginfolist:
pn = pkginfo['PN']
pv = pkginfo['PV']
@@ -163,24 +157,25 @@ class PackageListModel(gtk.TreeStore):
self.COL_INC, False)
self.pn_path[pn] = self.get_path(pniter)
# PKG is always present
pkg = pkginfo['PKG']
pkgv = getpkgvalue(pkginfo, 'PKGV', pkg)
pkgr = getpkgvalue(pkginfo, 'PKGR', pkg)
# PKGSIZE is artificial, will always be overridden with the package name if present
pkgsize = pkginfo.get('PKGSIZE_%s' % pkg, "0")
# PKG_%s is the renamed version
pkg_rename = pkginfo.get('PKG_%s' % pkg, "")
# The rest may be overridden or not
section = getpkgvalue(pkginfo, 'SECTION', pkg, "")
summary = getpkgvalue(pkginfo, 'SUMMARY', pkg, "")
rdep = getpkgvalue(pkginfo, 'RDEPENDS', pkg, "")
rrec = getpkgvalue(pkginfo, 'RRECOMMENDS', pkg, "")
rprov = getpkgvalue(pkginfo, 'RPROVIDES', pkg, "")
pkgv = pkginfo['PKGV']
pkgr = pkginfo['PKGR']
pkgsize = pkginfo['PKGSIZE_%s' % pkg] if 'PKGSIZE_%s' % pkg in pkginfo.keys() else "0"
pkg_rename = pkginfo['PKG_%s' % pkg] if 'PKG_%s' % pkg in pkginfo.keys() else ""
section = pkginfo['SECTION_%s' % pkg] if 'SECTION_%s' % pkg in pkginfo.keys() else ""
summary = pkginfo['SUMMARY_%s' % pkg] if 'SUMMARY_%s' % pkg in pkginfo.keys() else ""
rdep = pkginfo['RDEPENDS_%s' % pkg] if 'RDEPENDS_%s' % pkg in pkginfo.keys() else ""
rrec = pkginfo['RRECOMMENDS_%s' % pkg] if 'RRECOMMENDS_%s' % pkg in pkginfo.keys() else ""
rprov = pkginfo['RPROVIDES_%s' % pkg] if 'RPROVIDES_%s' % pkg in pkginfo.keys() else ""
for i in rprov.split():
self.rprov_pkg[i] = pkg
allow_empty = getpkgvalue(pkginfo, 'ALLOW_EMPTY', pkg, "")
if 'ALLOW_EMPTY_%s' % pkg in pkginfo.keys():
allow_empty = pkginfo['ALLOW_EMPTY_%s' % pkg]
elif 'ALLOW_EMPTY' in pkginfo.keys():
allow_empty = pkginfo['ALLOW_EMPTY']
else:
allow_empty = ""
if pkgsize == "0" and not allow_empty:
continue
@@ -337,13 +332,13 @@ class PackageListModel(gtk.TreeStore):
set_selected_packages(), some packages will not be set included.
Return the un-set packages list.
"""
def set_selected_packages(self, packagelist, user_selected=False):
def set_selected_packages(self, packagelist):
left = []
binb = 'User Selected' if user_selected else ''
for pn in packagelist:
if pn in self.pkg_path.keys():
path = self.pkg_path[pn]
self.include_item(item_path=path, binb=binb)
self.include_item(item_path=path,
binb="User Selected")
else:
left.append(pn)
@@ -359,7 +354,7 @@ class PackageListModel(gtk.TreeStore):
while child_it:
if self.get_value(child_it, self.COL_INC):
binb = self.get_value(child_it, self.COL_BINB)
if binb == "User Selected":
if not binb or binb == "User Selected":
name = self.get_value(child_it, self.COL_NAME)
packagelist.append(name)
child_it = self.iter_next(child_it)
@@ -526,24 +521,17 @@ class RecipeListModel(gtk.ListStore):
val2 = model.get_value(iter2, RecipeListModel.COL_INC)
return ((val1 == True) and (val2 == False))
def include_item_sort_func(self, model, iter1, iter2):
val1 = model.get_value(iter1, RecipeListModel.COL_INC)
val2 = model.get_value(iter2, RecipeListModel.COL_INC)
return ((val1 == False) and (val2 == True))
"""
Create, if required, and return a filtered gtk.TreeModelSort
containing only the items which are items specified by filter
"""
def tree_model(self, filter, excluded_items_ahead=False, included_items_ahead=True):
def tree_model(self, filter, excluded_items_ahead=False):
model = self.filter_new()
model.set_visible_func(self.tree_model_filter, filter)
sort = gtk.TreeModelSort(model)
if excluded_items_ahead:
sort.set_default_sort_func(self.exclude_item_sort_func)
elif included_items_ahead:
sort.set_default_sort_func(self.include_item_sort_func)
else:
sort.set_sort_column_id(RecipeListModel.COL_NAME, gtk.SORT_ASCENDING)
sort.set_default_sort_func(None)
@@ -595,8 +583,8 @@ class RecipeListModel(gtk.ListStore):
depends = event_model["depends"].get(item, []) + event_model["rdepends-pn"].get(item, [])
if ('packagegroup.bbclass' in " ".join(inherits)):
atype = 'packagegroup'
if ('task-' in name):
atype = 'task'
elif ('image.bbclass' in " ".join(inherits)):
if name != "hob-image":
atype = 'image'
@@ -672,10 +660,6 @@ class RecipeListModel(gtk.ListStore):
self[dep_path][self.COL_BINB] = ', '.join(dep_bin).lstrip(', ')
elif not dep_included:
self.include_item(dep_path, binb=item_name, image_contents=image_contents)
dep_bin = self[item_path][self.COL_BINB].split(', ')
if self[item_path][self.COL_NAME] in dep_bin:
dep_bin.remove(self[item_path][self.COL_NAME])
self[item_path][self.COL_BINB] = ', '.join(dep_bin).lstrip(', ')
def exclude_item(self, item_path):
if not self.path_included(item_path):

View File

@@ -38,7 +38,6 @@ class HobPage (gtk.VBox):
self.title = "Hob -- Image Creator"
else:
self.title = title
self.title_label = gtk.Label()
self.box_group_area = gtk.VBox(False, 12)
self.box_group_area.set_size_request(self.builder_width - 73 - 73, self.builder_height - 88 - 15 - 15)
@@ -47,9 +46,6 @@ class HobPage (gtk.VBox):
self.group_align.add(self.box_group_area)
self.box_group_area.set_homogeneous(False)
def set_title(self, title):
self.title = title
self.title_label.set_markup("<span size='x-large'>%s</span>" % self.title)
def add_onto_top_bar(self, widget = None, padding = 0):
# the top button occupies 1/7 of the page height
@@ -62,9 +58,9 @@ class HobPage (gtk.VBox):
hbox = gtk.HBox()
self.title_label = gtk.Label()
self.title_label.set_markup("<span size='x-large'>%s</span>" % self.title)
hbox.pack_start(self.title_label, expand=False, fill=False, padding=20)
label = gtk.Label()
label.set_markup("<span size='x-large'>%s</span>" % self.title)
hbox.pack_start(label, expand=False, fill=False, padding=20)
if widget:
# add the widget in the event box

View File

@@ -63,6 +63,35 @@ class hic:
ICON_INDI_TICK_FILE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/tick.png'))
ICON_INDI_INFO_FILE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/info.png'))
class hcc:
SUPPORTED_IMAGE_TYPES = {
"jffs2" : ["jffs2"],
"sum.jffs2" : ["sum.jffs2"],
"cramfs" : ["cramfs"],
"ext2" : ["ext2"],
"ext2.gz" : ["ext2.gz"],
"ext2.bz2" : ["ext2.bz2"],
"ext3" : ["ext3"],
"ext3.gz" : ["ext3.gz"],
"ext2.lzma" : ["ext2.lzma"],
"btrfs" : ["btrfs"],
"live" : ["hddimg", "iso"],
"squashfs" : ["squashfs"],
"squashfs-lzma" : ["squashfs-lzma"],
"ubi" : ["ubi"],
"tar" : ["tar"],
"tar.gz" : ["tar.gz"],
"tar.bz2" : ["tar.bz2"],
"tar.xz" : ["tar.xz"],
"cpio" : ["cpio"],
"cpio.gz" : ["cpio.gz"],
"cpio.xz" : ["cpio.xz"],
"vmdk" : ["vmdk"],
"cpio.lzma" : ["cpio.lzma"],
"elf" : ["elf"],
}
class HobViewTable (gtk.VBox):
"""
A VBox to contain the table for different recipe views and package view
@@ -153,12 +182,7 @@ class HobViewTable (gtk.VBox):
# Just display the first item
if binb:
bin = binb.split(', ')
total_no = len(bin)
if total_no > 1 and bin[0] == "User Selected":
present_binb = bin[1] + ' (+' + str(total_no) + ')'
else:
present_binb = bin[0] + ' (+' + str(total_no) + ')'
cell.set_property('text', present_binb)
cell.set_property('text', bin[0])
else:
cell.set_property('text', "")
return True
@@ -219,7 +243,7 @@ def soften_color(widget, state=gtk.STATE_NORMAL):
color.blue = color.blue * blend + style.base[state].blue * (1.0 - blend)
return color.to_string()
class BaseHobButton(gtk.Button):
class HobButton(gtk.Button):
"""
A gtk.Button subclass which follows the visual design of Hob for primary
action buttons
@@ -233,33 +257,24 @@ class BaseHobButton(gtk.Button):
@staticmethod
def style_button(button):
style = button.get_style()
style = gtk.rc_get_style_by_paths(gtk.settings_get_default(), 'gtk-button', 'gtk-button', gobject.TYPE_NONE)
button_color = gtk.gdk.Color(HobColors.ORANGE)
button.modify_bg(gtk.STATE_NORMAL, button_color)
button.modify_bg(gtk.STATE_PRELIGHT, button_color)
button.modify_bg(gtk.STATE_SELECTED, button_color)
button.set_flags(gtk.CAN_DEFAULT)
button.grab_default()
# label = "<span size='x-large'><b>%s</b></span>" % gobject.markup_escape_text(button.get_label())
label = button.get_label()
label = "<span size='x-large'><b>%s</b></span>" % gobject.markup_escape_text(button.get_label())
button.set_label(label)
button.child.set_use_markup(True)
class HobButton(BaseHobButton):
"""
A gtk.Button subclass which follows the visual design of Hob for primary
action buttons
label: the text to display as the button's label
"""
def __init__(self, label):
BaseHobButton.__init__(self, label)
HobButton.style_button(self)
class HobAltButton(BaseHobButton):
class HobAltButton(gtk.Button):
"""
A gtk.Button subclass which has no relief, and so is more discrete
"""
def __init__(self, label):
BaseHobButton.__init__(self, label)
gtk.Button.__init__(self, label)
HobAltButton.style_button(self)
"""
@@ -285,6 +300,14 @@ class HobAltButton(BaseHobButton):
button.set_label("<span size='large' color='%s'><b>%s</b></span>" % (colour, gobject.markup_escape_text(button.text)))
button.child.set_use_markup(True)
@staticmethod
def style_button(button):
button.text = button.get_label()
button.connect("state-changed", HobAltButton.desensitise_on_state_change_cb)
HobAltButton.set_text(button)
button.child.set_use_markup(True)
button.set_relief(gtk.RELIEF_NONE)
class HobImageButton(gtk.Button):
"""
A gtk.Button with an icon and two rows of text, the second of which is
@@ -337,8 +360,7 @@ class HobInfoButton(gtk.EventBox):
def __init__(self, tip_markup, parent=None):
gtk.EventBox.__init__(self)
self.image = gtk.Image()
self.image.set_from_file(
hic.ICON_INFO_DISPLAY_FILE)
self.image.set_from_file(hic.ICON_INFO_DISPLAY_FILE)
self.image.show()
self.add(self.image)

View File

@@ -138,6 +138,7 @@ class ImageConfigurationPage (HobPage):
self.show_all()
if self.builder.recipe_model.get_selected_image() == self.builder.recipe_model.__custom_image__:
self.just_bake_button.hide()
self.or_label.hide()
def create_config_machine(self):
self.machine_title = gtk.Label()
@@ -167,12 +168,13 @@ class ImageConfigurationPage (HobPage):
markup += "dev-manual.html#understanding-and-using-layers\">reference manual</a>."
self.layer_info_icon = HobInfoButton(markup, self.get_parent())
# self.progress_box = gtk.HBox(False, 6)
self.progress_box = gtk.HBox(False, 6)
self.progress_bar = HobProgressBar()
# self.progress_box.pack_start(self.progress_bar, expand=True, fill=True)
self.progress_box.pack_start(self.progress_bar, expand=True, fill=True)
self.stop_button = HobAltButton("Stop")
self.stop_button.connect("clicked", self.stop_button_clicked_cb)
# self.progress_box.pack_end(stop_button, expand=False, fill=False)
self.progress_box.pack_end(self.stop_button, expand=False, fill=False)
self.machine_separator = gtk.HSeparator()
def set_config_machine_layout(self, show_progress_bar = False):
@@ -182,9 +184,7 @@ class ImageConfigurationPage (HobPage):
self.gtable.attach(self.layer_button, 14, 36, 7, 12)
self.gtable.attach(self.layer_info_icon, 36, 40, 7, 11)
if show_progress_bar:
#self.gtable.attach(self.progress_box, 0, 40, 15, 18)
self.gtable.attach(self.progress_bar, 0, 37, 15, 18)
self.gtable.attach(self.stop_button, 37, 40, 15, 18, 0, 0)
self.gtable.attach(self.progress_box, 0, 40, 15, 19)
self.gtable.attach(self.machine_separator, 0, 40, 13, 14)
def create_config_baseimg(self):
@@ -205,26 +205,17 @@ class ImageConfigurationPage (HobPage):
self.image_desc = gtk.Label()
self.image_desc.set_alignment(0.0, 0.5)
self.image_desc.set_size_request(256, -1)
self.image_desc.set_size_request(360, -1)
self.image_desc.set_justify(gtk.JUSTIFY_LEFT)
self.image_desc.set_line_wrap(True)
# button to view recipes
icon_file = hic.ICON_RCIPE_DISPLAY_FILE
hover_file = hic.ICON_RCIPE_HOVER_FILE
self.view_adv_configuration_button = HobImageButton("Advanced configuration",
"Select image types, package formats, etc",
icon_file, hover_file)
self.view_adv_configuration_button.connect("clicked", self.view_adv_configuration_button_clicked_cb)
self.image_separator = gtk.HSeparator()
def set_config_baseimg_layout(self):
self.gtable.attach(self.image_title, 0, 40, 15, 17)
self.gtable.attach(self.image_title_desc, 0, 40, 18, 22)
self.gtable.attach(self.image_combo, 0, 12, 23, 26)
self.gtable.attach(self.image_desc, 0, 12, 27, 33)
self.gtable.attach(self.view_adv_configuration_button, 14, 36, 23, 28)
self.gtable.attach(self.image_desc, 13, 38, 23, 28)
self.gtable.attach(self.image_separator, 0, 40, 35, 36)
def create_config_build_button(self):
@@ -233,14 +224,18 @@ class ImageConfigurationPage (HobPage):
# create button "Build image"
self.just_bake_button = HobButton("Build image")
#self.just_bake_button.set_size_request(205, 49)
self.just_bake_button.set_size_request(205, 49)
self.just_bake_button.set_tooltip_text("Build target image")
self.just_bake_button.connect("clicked", self.just_bake_button_clicked_cb)
button_box.pack_end(self.just_bake_button, expand=False, fill=False)
# create separator label
self.or_label = gtk.Label(" or ")
button_box.pack_end(self.or_label, expand=False, fill=False)
# create button "Edit Image"
self.edit_image_button = HobAltButton("Edit image")
#self.edit_image_button.set_size_request(205, 49)
self.edit_image_button = HobButton("Edit image")
self.edit_image_button.set_size_request(205, 49)
self.edit_image_button.set_tooltip_text("Edit target image")
self.edit_image_button.connect("clicked", self.edit_image_button_clicked_cb)
button_box.pack_end(self.edit_image_button, expand=False, fill=False)
@@ -338,6 +333,7 @@ class ImageConfigurationPage (HobPage):
if selected_image == self.builder.recipe_model.__custom_image__:
self.just_bake_button.hide()
self.or_label.hide()
glib.idle_add(self.image_combo_changed_idle_cb, selected_image, selected_recipes, selected_packages)
@@ -355,7 +351,6 @@ class ImageConfigurationPage (HobPage):
# populate image combo
filter = {RecipeListModel.COL_TYPE : ['image']}
image_model = recipe_model.tree_model(filter)
image_model.set_sort_column_id(recipe_model.COL_NAME, gtk.SORT_ASCENDING)
active = 0
cnt = 1
@@ -368,7 +363,6 @@ class ImageConfigurationPage (HobPage):
if self.builder.parameters.image_black_pattern:
for i in self.builder.parameters.image_black_pattern.split():
black_pattern.append(re.compile(i))
black_pattern.append(re.compile("hob-image"))
it = image_model.get_iter_first()
self._image_combo_disconnect_signal()
@@ -419,14 +413,6 @@ class ImageConfigurationPage (HobPage):
def layer_button_clicked_cb(self, button):
# Create a layer selection dialog
self.builder.show_layer_selection_dialog()
def view_adv_configuration_button_clicked_cb(self, button):
# Create an advanced settings dialog
response, settings_changed = self.builder.show_adv_settings_dialog()
if not response:
return
if settings_changed:
self.builder.reparse_post_adv_settings()
def just_bake_button_clicked_cb(self, button):
self.builder.just_bake()
@@ -446,7 +432,7 @@ class ImageConfigurationPage (HobPage):
def settings_button_clicked_cb(self, button):
# Create an advanced settings dialog
response, settings_changed = self.builder.show_simple_settings_dialog()
response, settings_changed = self.builder.show_adv_settings_dialog()
if not response:
return
if settings_changed:

View File

@@ -41,10 +41,10 @@ class ImageDetailsPage (HobPage):
style.bg[gtk.STATE_NORMAL] = self.get_colormap().alloc_color(color, False, False)
self.set_style(style)
self.row = gtk.Table(1, 2, False)
self.row.set_border_width(10)
self.add(self.row)
self.hbox = gtk.HBox()
self.hbox.set_border_width(10)
self.add(self.hbox)
total_rows = 0
if widget:
total_rows = 10
@@ -54,8 +54,8 @@ class ImageDetailsPage (HobPage):
self.table = gtk.Table(total_rows, 20, True)
self.table.set_row_spacings(6)
self.table.set_size_request(100, -1)
self.row.attach(self.table, 0, 1, 0, 1, xoptions=gtk.FILL|gtk.EXPAND, yoptions=gtk.FILL)
self.hbox.pack_start(self.table, expand=True, fill=True, padding=15)
colid = 0
rowid = 0
self.line_widgets = {}
@@ -73,80 +73,11 @@ class ImageDetailsPage (HobPage):
# pack the button on the right
if button:
self.bbox = gtk.VBox()
self.bbox.pack_start(button, expand=True, fill=False)
self.bbox.pack_start(button, expand=True, fill=True)
if button2:
self.bbox.pack_start(button2, expand=True, fill=False)
self.bbox.set_size_request(150,-1)
self.row.attach(self.bbox, 1, 2, 0, 1, xoptions=gtk.FILL, yoptions=gtk.EXPAND)
def update_line_widgets(self, variable, value):
if len(self.line_widgets) == 0:
return
if not isinstance(self.line_widgets[variable], gtk.Label):
return
self.line_widgets[variable].set_markup(self.format_line(variable, value))
self.bbox.pack_start(button2, expand=True, fill=True)
self.hbox.pack_end(self.bbox, expand=False, fill=False)
def wrap_line(self, inputs):
# wrap the long text of inputs
wrap_width_chars = 75
outputs = ""
tmps = inputs
less_chars = len(inputs)
while (less_chars - wrap_width_chars) > 0:
less_chars -= wrap_width_chars
outputs += tmps[:wrap_width_chars] + "\n "
tmps = inputs[less_chars:]
outputs += tmps
return outputs
def format_line(self, variable, value):
wraped_value = self.wrap_line(value)
markup = "<span weight=\'bold\'>%s</span>" % variable
markup += "<span weight=\'normal\' foreground=\'#1c1c1c\' font_desc=\'14px\'>%s</span>" % wraped_value
return markup
def text2label(self, variable, value):
# append the name:value to the left box
# such as "Name: hob-core-minimal-variant-2011-12-15-beagleboard"
label = gtk.Label()
label.set_alignment(0.0, 0.5)
label.set_markup(self.format_line(variable, value))
return label
class BuildDetailBox (gtk.EventBox):
def __init__(self, varlist = None, vallist = None, icon = None, color = HobColors.LIGHT_GRAY):
gtk.EventBox.__init__(self)
# set color
style = self.get_style().copy()
style.bg[gtk.STATE_NORMAL] = self.get_colormap().alloc_color(color, False, False)
self.set_style(style)
self.hbox = gtk.HBox()
self.hbox.set_border_width(10)
self.add(self.hbox)
total_rows = 0
if varlist and vallist:
# pack the icon and the text on the left
total_rows += len(varlist)
self.table = gtk.Table(total_rows, 20, True)
self.table.set_row_spacings(6)
self.table.set_size_request(100, -1)
self.hbox.pack_start(self.table, expand=True, fill=True, padding=15)
colid = 0
rowid = 0
self.line_widgets = {}
if icon:
self.table.attach(icon, colid, colid + 2, 0, 1)
colid = colid + 2
if varlist and vallist:
for row in range(rowid, total_rows):
index = row - rowid
self.line_widgets[varlist[index]] = self.text2label(varlist[index], vallist[index])
self.table.attach(self.line_widgets[varlist[index]], colid, 20, row, row + 1)
def update_line_widgets(self, variable, value):
if len(self.line_widgets) == 0:
return
@@ -252,7 +183,7 @@ class ImageDetailsPage (HobPage):
self.pack_start(self.group_align, expand=True, fill=True)
self.build_result = None
if self.build_succeeded and self.builder.current_step == self.builder.IMAGE_GENERATING:
if self.build_succeeded:
# building is the previous step
icon = gtk.Image()
pixmap_path = hic.ICON_INDI_CONFIRM_FILE
@@ -261,7 +192,7 @@ class ImageDetailsPage (HobPage):
icon.set_from_pixbuf(pix_buffer)
varlist = [""]
vallist = ["Your image is ready"]
self.build_result = self.BuildDetailBox(varlist=varlist, vallist=vallist, icon=icon, color=color)
self.build_result = self.DetailBox(varlist=varlist, vallist=vallist, icon=icon, color=color)
self.box_group_area.pack_start(self.build_result, expand=False, fill=False)
# create the buttons at the bottom first because the buttons are used in apply_button_per_image()
@@ -308,7 +239,7 @@ class ImageDetailsPage (HobPage):
is_runnable = self.create_bottom_buttons(self.buttonlist, self.toggled_image)
# Generated image files info
varlist = ["Name: ", "Files created: ", "Directory: "]
varlist = ["Name: ", "FileCreated: ", "Directory: "]
vallist = []
vallist.append(image_name.split('.')[0])
@@ -318,12 +249,12 @@ class ImageDetailsPage (HobPage):
view_files_button = HobAltButton("View files")
view_files_button.connect("clicked", self.view_files_clicked_cb, image_addr)
view_files_button.set_tooltip_text("Open the directory containing the image files")
open_log_button = None
view_log_button = None
if log_file:
open_log_button = HobAltButton("Open log")
open_log_button.connect("clicked", self.open_log_clicked_cb, log_file)
open_log_button.set_tooltip_text("Open the build's log file")
self.image_detail = self.DetailBox(varlist=varlist, vallist=vallist, button=view_files_button, button2=open_log_button)
view_log_button = HobAltButton("View log")
view_log_button.connect("clicked", self.view_log_clicked_cb, log_file)
view_log_button.set_tooltip_text("Open the building log files")
self.image_detail = self.DetailBox(varlist=varlist, vallist=vallist, button=view_files_button, button2=view_log_button)
self.box_group_area.pack_start(self.image_detail, expand=False, fill=True)
# The default kernel box for the qemu images
@@ -332,15 +263,15 @@ class ImageDetailsPage (HobPage):
if 'qemu' in image_name:
self.sel_kernel = self.get_kernel_file_name()
# varlist = ["Kernel: "]
# vallist = []
# vallist.append(self.sel_kernel)
varlist = ["Kernel: "]
vallist = []
vallist.append(self.sel_kernel)
# change_kernel_button = HobAltButton("Change")
# change_kernel_button.connect("clicked", self.change_kernel_cb)
# change_kernel_button.set_tooltip_text("Change qemu kernel file")
# self.kernel_detail = self.DetailBox(varlist=varlist, vallist=vallist, button=change_kernel_button)
# self.box_group_area.pack_start(self.kernel_detail, expand=True, fill=True)
change_kernel_button = HobAltButton("Change")
change_kernel_button.connect("clicked", self.change_kernel_cb)
change_kernel_button.set_tooltip_text("Change qemu kernel file")
self.kernel_detail = self.DetailBox(varlist=varlist, vallist=vallist, button=change_kernel_button)
self.box_group_area.pack_start(self.kernel_detail, expand=False, fill=False)
# Machine, Base image and Layers
layer_num_limit = 15
@@ -385,7 +316,7 @@ class ImageDetailsPage (HobPage):
else: # get to this page from "My images"
edit_packages_button = None
self.package_detail = self.DetailBox(varlist=varlist, vallist=vallist, button=edit_packages_button)
self.box_group_area.pack_start(self.package_detail, expand=True, fill=True)
self.box_group_area.pack_start(self.package_detail, expand=False, fill=False)
# pack the buttons at the bottom, at this time they are already created.
if self.build_succeeded:
@@ -402,7 +333,7 @@ class ImageDetailsPage (HobPage):
def view_files_clicked_cb(self, button, image_addr):
subprocess.call("xdg-open /%s" % image_addr, shell=True)
def open_log_clicked_cb(self, button, log_file):
def view_log_clicked_cb(self, button, log_file):
if log_file:
os.system("xdg-open /%s" % log_file)
@@ -426,8 +357,6 @@ class ImageDetailsPage (HobPage):
return mach_runnable
def test_deployable(self, image_name):
if self.builder.configuration.curr_mach.startswith("qemu"):
return False
deployable = False
for t in self.builder.parameters.deployable_image_types:
if image_name.endswith(t):
@@ -460,13 +389,7 @@ class ImageDetailsPage (HobPage):
label = gtk.Label()
label.set_use_markup(True)
label.set_alignment(0.0, 0.5)
label.set_padding(12,0)
if primary_action == "Run image":
label.set_markup("<span font_desc='12'>Select the image file you want to run:</span>")
elif primary_action == "Deploy image":
label.set_markup("<span font_desc='12'>Select the image file you want to deploy:</span>")
else:
label.set_markup("<span font_desc='12'>Select the image file you want to %s</span>" % primary_action)
label.set_markup("<span font_desc='12'>Select the image file you want to %s</span>" % primary_action)
dialog.vbox.pack_start(label, expand=False, fill=False)
# filter created images as action attribution (deploy or run)
@@ -495,12 +418,12 @@ class ImageDetailsPage (HobPage):
sel_btn.set_active(fileitem['is_toggled'])
sel_btn.connect('toggled', self.table_selected_cb, fileitem)
if curr_row < 10:
table.attach(sel_btn, 0, 4, curr_row, curr_row + 1, xpadding=24)
table.attach(sel_btn, 2, 5, curr_row, curr_row + 1)
else:
table.attach(sel_btn, 5, 9, curr_row - 10, curr_row - 9, xpadding=24)
table.attach(sel_btn, 7, 10, curr_row - 10, curr_row - 9)
curr_row += 1
dialog.vbox.pack_start(table, expand=False, fill=False, padding=6)
dialog.vbox.pack_start(table, expand=False, fill=False, padding = 6)
button = dialog.add_button("Cancel", gtk.RESPONSE_CANCEL)
HobAltButton.style_button(button)
@@ -549,7 +472,7 @@ class ImageDetailsPage (HobPage):
name = "Deploy image"
if name in buttonlist and self.test_deployable(image_name):
deploy_button = HobButton('Deploy image')
#deploy_button.set_size_request(205, 49)
deploy_button.set_size_request(205, 49)
deploy_button.set_tooltip_text("Burn a live image to a USB drive or flash memory")
deploy_button.set_flags(gtk.CAN_DEFAULT)
button_id = deploy_button.connect("clicked", self.deploy_button_clicked_cb)
@@ -562,15 +485,15 @@ class ImageDetailsPage (HobPage):
if name in buttonlist and self.test_type_runnable(image_name) and self.test_mach_runnable(image_name):
if created == True:
# separator
#label = gtk.Label(" or ")
#self.details_bottom_buttons.pack_end(label, expand=False, fill=False)
label = gtk.Label(" or ")
self.details_bottom_buttons.pack_end(label, expand=False, fill=False)
# create button "Run image"
run_button = HobAltButton("Run image")
else:
# create button "Run image" as the primary button
run_button = HobButton("Run image")
#run_button.set_size_request(205, 49)
run_button.set_size_request(205, 49)
run_button.set_flags(gtk.CAN_DEFAULT)
packed = True
run_button.set_tooltip_text("Start up an image with qemu emulator")
@@ -584,14 +507,14 @@ class ImageDetailsPage (HobPage):
if name in buttonlist:
if created == True:
# separator
#label = gtk.Label(" or ")
#self.details_bottom_buttons.pack_end(label, expand=False, fill=False)
label = gtk.Label(" or ")
self.details_bottom_buttons.pack_end(label, expand=False, fill=False)
# create button "Save as template"
save_button = HobAltButton("Save as template")
else:
save_button = HobButton("Save as template")
#save_button.set_size_request(205, 49)
save_button.set_size_request(205, 49)
save_button.set_flags(gtk.CAN_DEFAULT)
packed = True
save_button.set_tooltip_text("Save the image configuration for reuse")
@@ -608,7 +531,7 @@ class ImageDetailsPage (HobPage):
else:
build_new_button = HobButton("Build new image")
build_new_button.set_flags(gtk.CAN_DEFAULT)
#build_new_button.set_size_request(205, 49)
build_new_button.set_size_request(205, 49)
self.details_bottom_buttons.pack_end(build_new_button, expand=False, fill=False)
build_new_button.set_tooltip_text("Create a new image from scratch")
button_id = build_new_button.connect("clicked", self.build_new_button_clicked_cb)
@@ -658,7 +581,7 @@ class ImageDetailsPage (HobPage):
def settings_button_clicked_cb(self, button):
# Create an advanced settings dialog
response, settings_changed = self.builder.show_simple_settings_dialog()
response, settings_changed = self.builder.show_adv_settings_dialog()
if not response:
return
if settings_changed:

View File

@@ -34,19 +34,12 @@ class PackageSelectionPage (HobPage):
pages = [
{
'name' : 'Included packages',
'tooltip' : 'The packages currently included for your image',
'name' : 'Included',
'filter' : { PackageListModel.COL_INC : [True] },
'columns' : [{
'col_name' : 'Package name',
'col_id' : PackageListModel.COL_NAME,
'col_style': 'text',
'col_min' : 100,
'col_max' : 300,
'expand' : 'True'
}, {
'col_name' : 'Size',
'col_id' : PackageListModel.COL_SIZE,
'col_t_id' : PackageListModel.COL_FONT,
'col_style': 'text',
'col_min' : 100,
'col_max' : 300,
@@ -54,24 +47,35 @@ class PackageSelectionPage (HobPage):
}, {
'col_name' : 'Brought in by',
'col_id' : PackageListModel.COL_BINB,
'col_t_id' : PackageListModel.COL_FONT,
'col_style': 'binb',
'col_min' : 100,
'col_max' : 350,
'expand' : 'True'
}, {
'col_name' : 'Size',
'col_id' : PackageListModel.COL_SIZE,
'col_t_id' : PackageListModel.COL_FONT,
'col_style': 'text',
'col_min' : 100,
'col_max' : 300,
'expand' : 'True'
}, {
'col_name' : 'Included',
'col_id' : PackageListModel.COL_INC,
'col_t_id' : PackageListModel.COL_FONT,
'col_style': 'check toggle',
'col_group': 'tree store group',
'col_min' : 100,
'col_max' : 100
}]
}, {
'name' : 'All packages',
'tooltip' : 'All packages that have been built',
'filter' : {},
'columns' : [{
'col_name' : 'Package name',
'col_id' : PackageListModel.COL_NAME,
'col_t_id' : PackageListModel.COL_FONT,
'col_style': 'text',
'col_min' : 100,
'col_max' : 400,
@@ -79,6 +83,7 @@ class PackageSelectionPage (HobPage):
}, {
'col_name' : 'Size',
'col_id' : PackageListModel.COL_SIZE,
'col_t_id' : PackageListModel.COL_FONT,
'col_style': 'text',
'col_min' : 100,
'col_max' : 500,
@@ -87,6 +92,7 @@ class PackageSelectionPage (HobPage):
'col_name' : 'Included',
'col_id' : PackageListModel.COL_INC,
'col_style': 'check toggle',
'col_group': 'tree store group',
'col_min' : 100,
'col_max' : 100
}]
@@ -125,18 +131,16 @@ class PackageSelectionPage (HobPage):
filter = page['filter']
tab.set_model(self.package_model.tree_model(filter))
tab.connect("toggled", self.table_toggled_cb, page['name'])
if page['name'] == "Included packages":
tab.connect_group_selection(self.table_selected_cb)
if page['name'] == "Included":
tab.connect("button-release-event", self.button_click_cb)
tab.connect("cell-fadeinout-stopped", self.after_fadeout_checkin_include)
self.ins.append_page(tab, page['name'], page['tooltip'])
self.ins.append_page(tab, page['name'])
self.tables.append(tab)
self.ins.set_entry("Search packages:")
# set the search entry for each table
for tab in self.tables:
search_tip = "Enter a package name to find it"
self.ins.search.set_tooltip_text(search_tip)
self.ins.search.props.has_tooltip = True
tab.set_search_entry(0, self.ins.search)
# add all into the dialog
@@ -146,16 +150,16 @@ class PackageSelectionPage (HobPage):
self.box_group_area.pack_start(self.button_box, expand=False, fill=False)
self.build_image_button = HobButton('Build image')
#self.build_image_button.set_size_request(205, 49)
self.build_image_button.set_size_request(205, 49)
self.build_image_button.set_tooltip_text("Build target image")
self.build_image_button.set_flags(gtk.CAN_DEFAULT)
self.build_image_button.grab_default()
self.build_image_button.connect("clicked", self.build_image_clicked_cb)
self.button_box.pack_end(self.build_image_button, expand=False, fill=False)
self.back_button = HobAltButton('Cancel')
self.back_button = HobAltButton('<< Back')
self.back_button.connect("clicked", self.back_button_clicked_cb)
self.button_box.pack_end(self.back_button, expand=False, fill=False)
self.button_box.pack_start(self.back_button, expand=False, fill=False)
def button_click_cb(self, widget, event):
path, col = widget.table_tree.get_cursor()
@@ -165,7 +169,7 @@ class PackageSelectionPage (HobPage):
if binb:
self.builder.show_binb_dialog(binb)
def open_log_clicked_cb(self, button, log_file):
def view_log_clicked_cb(self, button, log_file):
if log_file:
os.system("xdg-open /%s" % log_file)
@@ -173,26 +177,25 @@ class PackageSelectionPage (HobPage):
children = self.button_box.get_children() or []
for child in children:
self.button_box.remove(child)
# re-packed the buttons as request, add the 'open log' button if build success
# re-packed the buttons as request, add the 'view log' button if build success
self.button_box.pack_start(self.back_button, expand=False, fill=False)
self.button_box.pack_end(self.build_image_button, expand=False, fill=False)
if log_file:
open_log_button = HobAltButton("Open log")
open_log_button.connect("clicked", self.open_log_clicked_cb, log_file)
open_log_button.set_tooltip_text("Open the build's log file")
self.button_box.pack_end(open_log_button, expand=False, fill=False)
self.button_box.pack_end(self.back_button, expand=False, fill=False)
view_log_button = HobAltButton("View log")
view_log_button.connect("clicked", self.view_log_clicked_cb, log_file)
view_log_button.set_tooltip_text("Open the building log files")
self.button_box.pack_end(view_log_button, expand=False, fill=False)
self.show_all()
def build_image_clicked_cb(self, button):
self.builder.build_image()
def back_button_clicked_cb(self, button):
if self.builder.previous_step == self.builder.IMAGE_GENERATED:
self.builder.restore_initial_selected_packages()
self.refresh_selection()
if self.builder.current_step == self.builder.PACKAGE_GENERATED:
self.builder.show_recipes()
elif self.builder.previous_step == self.builder.IMAGE_GENERATED:
self.builder.show_image_details()
else:
self.builder.show_configuration()
def _expand_all(self):
for tab in self.tables:
@@ -218,13 +221,13 @@ class PackageSelectionPage (HobPage):
self.label.set_label("Packages included: %s\nSelected packages size: %s\nTotal image size: %s" %
(selected_packages_num, selected_packages_size_str, image_total_size_str))
self.ins.show_indicator_icon("Included packages", selected_packages_num)
self.ins.show_indicator_icon("Included", selected_packages_num)
def toggle_item_idle_cb(self, path, view_tree, cell, pagename):
if not self.package_model.path_included(path):
self.package_model.include_item(item_path=path, binb="User Selected")
else:
if pagename == "Included packages":
if pagename == "Included":
self.pre_fadeout_checkout_include(view_tree)
self.package_model.exclude_item(item_path=path)
self.render_fadeout(view_tree, cell)
@@ -281,6 +284,21 @@ class PackageSelectionPage (HobPage):
tree.set_model(self.package_model.tree_model(self.pages[0]['filter']))
tree.expand_all()
def foreach_cell_change_font(self, model, path, iter, paths=None):
# Changed the font for a group cells
if path and iter and path[0] == paths[0]:
self.package_model.set(iter, self.package_model.COL_FONT, "bold")
else:
if iter and model.iter_parent(iter) == None:
self.package_model.set(iter, self.package_model.COL_FONT, '11')
else:
self.package_model.set(iter, self.package_model.COL_FONT, '10')
def table_selected_cb(self, selection):
model, paths = selection.get_selected_rows()
if paths:
child_path = self.package_model.convert_vpath_to_path(model, paths[0])
self.package_model.foreach(self.foreach_cell_change_font, child_path)
def set_packages_curr_tab(self, curr_page):
self.ins.set_current_page(curr_page)

View File

@@ -11,9 +11,6 @@ class ProgressBar(gtk.Dialog):
self.vbox.pack_start(self.progress)
self.show_all()
def set_text(self, msg):
self.progress.set_text(msg)
def update(self, x, y):
self.progress.set_fraction(float(x)/float(y))
self.progress.set_text("%2d %%" % (x*100/y))

View File

@@ -33,10 +33,10 @@ from bb.ui.crumbs.hobpages import HobPage
class RecipeSelectionPage (HobPage):
pages = [
{
'name' : 'Included recipes',
'name' : 'Included',
'tooltip' : 'The recipes currently included for your image',
'filter' : { RecipeListModel.COL_INC : [True],
RecipeListModel.COL_TYPE : ['recipe', 'packagegroup'] },
RecipeListModel.COL_TYPE : ['recipe', 'task'] },
'columns' : [{
'col_name' : 'Recipe name',
'col_id' : RecipeListModel.COL_NAME,
@@ -44,13 +44,6 @@ class RecipeSelectionPage (HobPage):
'col_min' : 100,
'col_max' : 400,
'expand' : 'True'
}, {
'col_name' : 'Group',
'col_id' : RecipeListModel.COL_GROUP,
'col_style': 'text',
'col_min' : 100,
'col_max' : 300,
'expand' : 'True'
}, {
'col_name' : 'Brought in by',
'col_id' : RecipeListModel.COL_BINB,
@@ -58,6 +51,13 @@ class RecipeSelectionPage (HobPage):
'col_min' : 100,
'col_max' : 500,
'expand' : 'True'
}, {
'col_name' : 'Group',
'col_id' : RecipeListModel.COL_GROUP,
'col_style': 'text',
'col_min' : 100,
'col_max' : 300,
'expand' : 'True'
}, {
'col_name' : 'Included',
'col_id' : RecipeListModel.COL_INC,
@@ -67,7 +67,7 @@ class RecipeSelectionPage (HobPage):
}]
}, {
'name' : 'All recipes',
'tooltip' : 'All recipes in your configured layers',
'tooltip' : 'All recipes available in the Yocto Project',
'filter' : { RecipeListModel.COL_TYPE : ['recipe'] },
'columns' : [{
'col_name' : 'Recipe name',
@@ -76,13 +76,6 @@ class RecipeSelectionPage (HobPage):
'col_min' : 100,
'col_max' : 400,
'expand' : 'True'
}, {
'col_name' : 'Group',
'col_id' : RecipeListModel.COL_GROUP,
'col_style': 'text',
'col_min' : 100,
'col_max' : 400,
'expand' : 'True'
}, {
'col_name' : 'License',
'col_id' : RecipeListModel.COL_LIC,
@@ -90,6 +83,13 @@ class RecipeSelectionPage (HobPage):
'col_min' : 100,
'col_max' : 400,
'expand' : 'True'
}, {
'col_name' : 'Group',
'col_id' : RecipeListModel.COL_GROUP,
'col_style': 'text',
'col_min' : 100,
'col_max' : 400,
'expand' : 'True'
}, {
'col_name' : 'Included',
'col_id' : RecipeListModel.COL_INC,
@@ -98,16 +98,23 @@ class RecipeSelectionPage (HobPage):
'col_max' : 100
}]
}, {
'name' : 'Package Groups',
'tooltip' : 'All package groups in your configured layers',
'filter' : { RecipeListModel.COL_TYPE : ['packagegroup'] },
'name' : 'Tasks',
'tooltip' : 'All tasks available in the Yocto Project',
'filter' : { RecipeListModel.COL_TYPE : ['task'] },
'columns' : [{
'col_name' : 'Package group name',
'col_name' : 'Task name',
'col_id' : RecipeListModel.COL_NAME,
'col_style': 'text',
'col_min' : 100,
'col_max' : 400,
'expand' : 'True'
}, {
'col_name' : 'Description',
'col_id' : RecipeListModel.COL_DESC,
'col_style': 'text',
'col_min' : 100,
'col_max' : 400,
'expand' : 'True'
}, {
'col_name' : 'Included',
'col_id' : RecipeListModel.COL_INC,
@@ -123,7 +130,7 @@ class RecipeSelectionPage (HobPage):
TASKS) = range(3)
def __init__(self, builder = None):
super(RecipeSelectionPage, self).__init__(builder, "Step 1 of 2: Edit recipes")
super(RecipeSelectionPage, self).__init__(builder, "Edit recipes")
# set invisible members
self.recipe_model = self.builder.recipe_model
@@ -149,7 +156,7 @@ class RecipeSelectionPage (HobPage):
filter = page['filter']
tab.set_model(self.recipe_model.tree_model(filter))
tab.connect("toggled", self.table_toggled_cb, page['name'])
if page['name'] == "Included recipes":
if page['name'] == "Included":
tab.connect("button-release-event", self.button_click_cb)
tab.connect("cell-fadeinout-stopped", self.after_fadeout_checkin_include)
self.ins.append_page(tab, page['name'], page['tooltip'])
@@ -170,16 +177,16 @@ class RecipeSelectionPage (HobPage):
self.box_group_area.pack_end(button_box, expand=False, fill=False)
self.build_packages_button = HobButton('Build packages')
#self.build_packages_button.set_size_request(205, 49)
self.build_packages_button.set_size_request(205, 49)
self.build_packages_button.set_tooltip_text("Build selected recipes into packages")
self.build_packages_button.set_flags(gtk.CAN_DEFAULT)
self.build_packages_button.grab_default()
self.build_packages_button.connect("clicked", self.build_packages_clicked_cb)
button_box.pack_end(self.build_packages_button, expand=False, fill=False)
self.back_button = HobAltButton('Cancel')
self.back_button = HobAltButton('<< Back')
self.back_button.connect("clicked", self.back_button_clicked_cb)
button_box.pack_end(self.back_button, expand=False, fill=False)
button_box.pack_start(self.back_button, expand=False, fill=False)
def button_click_cb(self, widget, event):
path, col = widget.table_tree.get_cursor()
@@ -198,13 +205,13 @@ class RecipeSelectionPage (HobPage):
def refresh_selection(self):
self.builder.configuration.selected_image = self.recipe_model.get_selected_image()
_, self.builder.configuration.selected_recipes = self.recipe_model.get_selected_recipes()
self.ins.show_indicator_icon("Included recipes", len(self.builder.configuration.selected_recipes))
self.ins.show_indicator_icon("Included", len(self.builder.configuration.selected_recipes))
def toggle_item_idle_cb(self, path, view_tree, cell, pagename):
if not self.recipe_model.path_included(path):
self.recipe_model.include_item(item_path=path, binb="User Selected", image_contents=False)
else:
if pagename == "Included recipes":
if pagename == "Included":
self.pre_fadeout_checkout_include(view_tree)
self.recipe_model.exclude_item(item_path=path)
self.render_fadeout(view_tree, cell)
@@ -236,7 +243,7 @@ class RecipeSelectionPage (HobPage):
# Check out a model which base on the column COL_FADE_INC,
# it's save the prev state of column COL_INC before do exclude_item
filter = { RecipeListModel.COL_FADE_INC : [True],
RecipeListModel.COL_TYPE : ['recipe', 'packagegroup'] }
RecipeListModel.COL_TYPE : ['recipe', 'task'] }
new_model = self.recipe_model.tree_model(filter, excluded_items_ahead=True)
tree.set_model(new_model)

View File

@@ -374,22 +374,7 @@ class RunningBuild (gobject.GObject):
for reason in event._reasons:
msg += ("%s\n" % reason)
self.emit("no-provider", msg)
self.emit("log", "error", msg)
elif isinstance(event, bb.event.LogExecTTY):
icon = "dialog-warning"
color = HobColors.WARNING
if self.sequential or not parent:
tree_add = self.model.append
else:
tree_add = self.model.prepend
tree_add(parent,
(None,
package,
task,
event.msg,
icon,
color,
0))
self.emit("log", msg)
else:
if not isinstance(event, (bb.event.BuildBase,
bb.event.StampUpdate,

View File

@@ -1,85 +0,0 @@
#!/usr/bin/env python
#
# BitBake Graphical GTK User Interface
#
# Copyright (C) 2012 Intel Corporation
#
# Authored by Bogdan Marinescu <bogdan.a.marinescu@intel.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
import gtk, gobject
from bb.ui.crumbs.progressbar import HobProgressBar
from bb.ui.crumbs.hobwidget import hic
from bb.ui.crumbs.hobpages import HobPage
#
# SanityCheckPage
#
class SanityCheckPage (HobPage):
def __init__(self, builder):
super(SanityCheckPage, self).__init__(builder)
self.running = False
self.create_visual_elements()
self.show_all()
def make_label(self, text, bold=True):
label = gtk.Label()
label.set_alignment(0.0, 0.5)
mark = "<span %s>%s</span>" % (self.span_tag('x-large', 'bold') if bold else self.span_tag('medium'), text)
label.set_markup(mark)
return label
def start(self):
if not self.running:
self.running = True
gobject.timeout_add(100, self.timer_func)
def stop(self):
self.running = False
def is_running(self):
return self.running
def timer_func(self):
self.progress_bar.pulse()
return self.running
def create_visual_elements(self):
# Table'd layout. 'rows' and 'cols' give the table size
rows, cols = 30, 50
self.table = gtk.Table(rows, cols, True)
self.pack_start(self.table, expand=False, fill=False)
sx, sy = 2, 2
# 'info' icon
image = gtk.Image()
image.set_from_file(hic.ICON_INFO_DISPLAY_FILE)
self.table.attach(image, sx, sx + 2, sy, sy + 3 )
image.show()
# 'Checking' message
label = self.make_label('Hob is checking for correct build system setup')
self.table.attach(label, sx + 2, cols, sy, sy + 3, xpadding=5 )
label.show()
# 'Shouldn't take long' message.
label = self.make_label("The check shouldn't take long.", False)
self.table.attach(label, sx + 2, cols, sy + 3, sy + 4, xpadding=5)
label.show()
# Progress bar
self.progress_bar = HobProgressBar()
self.table.attach(self.progress_bar, sx + 2, cols - 3, sy + 5, sy + 7, xpadding=5)
self.progress_bar.show()
# All done
self.table.show()

View File

@@ -137,7 +137,7 @@ class RecipeFile(ConfigFile):
class TemplateMgr(gobject.GObject):
__gLocalVars__ = ["MACHINE", "PACKAGE_CLASSES", "DISTRO", "DL_DIR", "SSTATE_DIR", "SSTATE_MIRRORS", "PARALLEL_MAKE", "BB_NUMBER_THREADS", "CONF_VERSION"]
__gLocalVars__ = ["MACHINE", "PACKAGE_CLASSES", "DISTRO", "DL_DIR", "SSTATE_DIR", "SSTATE_MIRROR", "PARALLEL_MAKE", "BB_NUMBER_THREADS", "CONF_VERSION"]
__gBBLayersVars__ = ["BBLAYERS", "LCONF_VERSION"]
__gRecipeVars__ = ["DEPENDS", "IMAGE_INSTALL"]

View File

@@ -198,23 +198,17 @@ class gtkthread(threading.Thread):
def main(server, eventHandler):
try:
cmdline, error = server.runCommand(["getCmdLineAction"])
if error:
print("Error getting bitbake commandline: %s" % error)
return 1
elif not cmdline:
print("Nothing to do. Use 'bitbake world' to build everything, or run 'bitbake --help' for usage information.")
return 1
elif not cmdline or cmdline[0] != "generateDotGraph":
cmdline = server.runCommand(["getCmdLineAction"])
if cmdline and not cmdline['action']:
print(cmdline['msg'])
return
elif not cmdline or (cmdline['action'] and cmdline['action'][0] != "generateDotGraph"):
print("This UI is only compatible with the -g option")
return 1
ret, error = server.runCommand(["generateDepTreeEvent", cmdline[1], cmdline[2]])
if error:
print("Error running command '%s': %s" % (cmdline, error))
return 1
elif ret != True:
print("Error running command '%s': returned %s" % (cmdline, ret))
return 1
return
ret = server.runCommand(["generateDepTreeEvent", cmdline['action'][1], cmdline['action'][2]])
if ret != True:
print("Couldn't run command! %s" % ret)
return
except xmlrpclib.Fault as x:
print("XMLRPC Fault getting commandline:\n %s" % x)
return
@@ -226,8 +220,7 @@ def main(server, eventHandler):
gtk.gdk.threads_enter()
dep = DepExplorer()
bardialog = gtk.Dialog(parent=dep,
flags=gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT)
bardialog = gtk.Dialog(parent=dep)
bardialog.set_default_size(400, 50)
pbar = HobProgressBar()
bardialog.vbox.pack_start(pbar)
@@ -240,9 +233,7 @@ def main(server, eventHandler):
try:
event = eventHandler.waitEvent(0.25)
if gtkthread.quit.isSet():
_, error = server.runCommand(["stateStop"])
if error:
print('Unable to cleanly stop: %s' % error)
server.runCommand(["stateStop"])
break
if event is None:
@@ -318,13 +309,9 @@ def main(server, eventHandler):
break
if shutdown == 1:
print("\nSecond Keyboard Interrupt, stopping...\n")
_, error = server.runCommand(["stateStop"])
if error:
print('Unable to cleanly stop: %s' % error)
server.runCommand(["stateStop"])
if shutdown == 0:
print("\nKeyboard Interrupt, closing down...\n")
_, error = server.runCommand(["stateShutdown"])
if error:
print('Unable to cleanly shutdown: %s' % error)
server.runCommand(["stateShutdown"])
shutdown = shutdown + 1
pass

View File

@@ -80,19 +80,16 @@ def main (server, eventHandler):
running_build.connect ("build-failed", running_build_failed_cb)
try:
cmdline, error = server.runCommand(["getCmdLineAction"])
if err:
print("Error getting bitbake commandline: %s" % error)
return 1
elif not cmdline:
cmdline = server.runCommand(["getCmdLineAction"])
if not cmdline:
print("Nothing to do. Use 'bitbake world' to build everything, or run 'bitbake --help' for usage information.")
return 1
ret, error = server.runCommand(cmdline)
if error:
print("Error running command '%s': %s" % (cmdline, error))
elif not cmdline['action']:
print(cmdline['msg'])
return 1
elif ret != True:
print("Error running command '%s': returned %s" % (cmdline, ret))
ret = server.runCommand(cmdline['action'])
if ret != True:
print("Couldn't get default commandline! %s" % ret)
return 1
except xmlrpclib.Fault as x:
print("XMLRPC Fault getting commandline:\n %s" % x)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@@ -27,7 +27,6 @@ import logging
import progressbar
import signal
import bb.msg
import time
import fcntl
import struct
import copy
@@ -183,11 +182,11 @@ class TerminalFilter(object):
activetasks = self.helper.running_tasks
failedtasks = self.helper.failed_tasks
runningpids = self.helper.running_pids
if self.footer_present and (self.lastcount == self.helper.tasknumber_current) and (self.lastpids == runningpids):
if self.footer_present and (self.lastpids == runningpids):
return
if self.footer_present:
self.clearFooter()
if not self.helper.tasknumber_total or self.helper.tasknumber_current == self.helper.tasknumber_total:
if not activetasks:
return
tasks = []
for t in runningpids:
@@ -195,8 +194,6 @@ class TerminalFilter(object):
if self.main.shutdown:
content = "Waiting for %s running tasks to finish:" % len(activetasks)
elif not len(activetasks):
content = "No currently running tasks (%s of %s)" % (self.helper.tasknumber_current, self.helper.tasknumber_total)
else:
content = "Currently %s running tasks (%s of %s):" % (len(activetasks), self.helper.tasknumber_current, self.helper.tasknumber_total)
print content
@@ -207,7 +204,6 @@ class TerminalFilter(object):
lines = lines + 1 + int(len(content) / (self.columns + 1))
self.footer_present = lines
self.lastpids = runningpids[:]
self.lastcount = self.helper.tasknumber_current
def finish(self):
if self.stdinbackup:
@@ -217,23 +213,9 @@ class TerminalFilter(object):
def main(server, eventHandler, tf = TerminalFilter):
# Get values of variables which control our output
includelogs, error = server.runCommand(["getVariable", "BBINCLUDELOGS"])
if error:
logger.error("Unable to get the value of BBINCLUDELOGS variable: %s" % error)
return 1
loglines, error = server.runCommand(["getVariable", "BBINCLUDELOGS_LINES"])
if error:
logger.error("Unable to get the value of BBINCLUDELOGS_LINES variable: %s" % error)
return 1
consolelogfile, error = server.runCommand(["getVariable", "BB_CONSOLELOG"])
if error:
logger.error("Unable to get the value of BB_CONSOLELOG variable: %s" % error)
return 1
if sys.stdin.isatty() and sys.stdout.isatty():
log_exec_tty = True
else:
log_exec_tty = False
includelogs = server.runCommand(["getVariable", "BBINCLUDELOGS"])
loglines = server.runCommand(["getVariable", "BBINCLUDELOGS_LINES"])
consolelogfile = server.runCommand(["getVariable", "BB_CONSOLELOG"])
helper = uihelper.BBUIHelper()
@@ -250,22 +232,19 @@ def main(server, eventHandler, tf = TerminalFilter):
logger.addHandler(consolelog)
try:
cmdline, error = server.runCommand(["getCmdLineAction"])
if error:
logger.error("Unable to get bitbake commandline arguments: %s" % error)
return 1
elif not cmdline:
cmdline = server.runCommand(["getCmdLineAction"])
if not cmdline:
print("Nothing to do. Use 'bitbake world' to build everything, or run 'bitbake --help' for usage information.")
return 1
ret, error = server.runCommand(cmdline)
if error:
logger.error("Command '%s' failed: %s" % (cmdline, error))
elif not cmdline['action']:
print(cmdline['msg'])
return 1
elif ret != True:
logger.error("Command '%s' failed: returned %s" % (cmdline, ret))
ret = server.runCommand(cmdline['action'])
if ret != True:
print("Couldn't get default commandline! %s" % ret)
return 1
except xmlrpclib.Fault as x:
logger.error("XMLRPC Fault getting commandline:\n %s" % x)
print("XMLRPC Fault getting commandline:\n %s" % x)
return 1
parseprogress = None
@@ -292,20 +271,6 @@ def main(server, eventHandler, tf = TerminalFilter):
if not main.shutdown:
main.shutdown = 1
if isinstance(event, bb.event.LogExecTTY):
if log_exec_tty:
tries = event.retries
while tries:
print "Trying to run: %s" % event.prog
if os.system(event.prog) == 0:
break
time.sleep(event.sleep_delay)
tries -= 1
if tries:
continue
logger.warn(event.msg)
continue
if isinstance(event, logging.LogRecord):
if event.levelno >= format.ERROR:
errors = errors + 1
@@ -449,8 +414,7 @@ def main(server, eventHandler, tf = TerminalFilter):
bb.runqueue.runQueueExitWait,
bb.event.OperationStarted,
bb.event.OperationCompleted,
bb.event.OperationProgress,
bb.event.DiskFull)):
bb.event.OperationProgress)):
continue
logger.error("Unknown event: %s", event)
@@ -461,19 +425,14 @@ def main(server, eventHandler, tf = TerminalFilter):
if ioerror.args[0] == 4:
pass
except KeyboardInterrupt:
import time
termfilter.clearFooter()
if main.shutdown == 1:
print("\nSecond Keyboard Interrupt, stopping...\n")
_, error = server.runCommand(["stateStop"])
if error:
logger.error("Unable to cleanly stop: %s" % error)
server.runCommand(["stateStop"])
if main.shutdown == 0:
print("\nKeyboard Interrupt, closing down...\n")
interrupted = True
_, error = server.runCommand(["stateShutdown"])
if error:
logger.error("Unable to cleanly shutdown: %s" % error)
print("\nKeyboard Interrupt, closing down...\n")
server.runCommand(["stateShutdown"])
main.shutdown = main.shutdown + 1
pass

View File

@@ -236,18 +236,15 @@ class NCursesUI:
shutdown = 0
try:
cmdline, error = server.runCommand(["getCmdLineAction"])
cmdline = server.runCommand(["getCmdLineAction"])
if not cmdline:
print("Nothing to do. Use 'bitbake world' to build everything, or run 'bitbake --help' for usage information.")
return
elif error:
print("Error getting bitbake commandline: %s" % error)
elif not cmdline['action']:
print(cmdline['msg'])
return
ret, error = server.runCommand(cmdline)
if error:
print("Error running command '%s': %s" % (cmdline, error))
return
elif ret != True:
ret = server.runCommand(cmdline['action'])
if ret != True:
print("Couldn't get default commandlind! %s" % ret)
return
except xmlrpclib.Fault as x:
@@ -321,8 +318,6 @@ class NCursesUI:
if isinstance(event, bb.cooker.CookerExit):
exitflag = True
if isinstance(event, bb.event.LogExecTTY):
mw.appendText('WARN: ' + event.msg + '\n')
if helper.needUpdate:
activetasks, failedtasks = helper.getTasks()
taw.erase()
@@ -348,14 +343,10 @@ class NCursesUI:
exitflag = True
if shutdown == 1:
mw.appendText("Second Keyboard Interrupt, stopping...\n")
_, error = server.runCommand(["stateStop"])
if error:
print("Unable to cleanly stop: %s" % error)
server.runCommand(["stateStop"])
if shutdown == 0:
mw.appendText("Keyboard Interrupt, closing down...\n")
_, error = server.runCommand(["stateShutdown"])
if error:
print("Unable to cleanly shutdown: %s" % error)
server.runCommand(["stateShutdown"])
shutdown = shutdown + 1
pass

View File

@@ -138,7 +138,7 @@ def explode_deps(s):
#r[-1] += ' ' + ' '.join(j)
return r
def explode_dep_versions2(s):
def explode_dep_versions(s):
"""
Take an RDEPENDS style string of format:
"DEPEND1 (optional version) DEPEND2 (optional version) ..."
@@ -147,70 +147,24 @@ def explode_dep_versions2(s):
r = {}
l = s.replace(",", "").split()
lastdep = None
lastcmp = ""
lastver = ""
incmp = False
inversion = False
for i in l:
if i[0] == '(':
incmp = True
i = i[1:].strip()
if not i:
continue
if incmp:
incmp = False
inversion = True
# This list is based on behavior and supported comparisons from deb, opkg and rpm.
#
# Even though =<, <<, ==, !=, =>, and >> may not be supported,
# we list each possibly valid item.
# The build system is responsible for validation of what it supports.
if i.startswith(('<=', '=<', '<<', '==', '!=', '>=', '=>', '>>')):
lastcmp = i[0:2]
i = i[2:]
elif i.startswith(('<', '>', '=')):
lastcmp = i[0:1]
i = i[1:]
else:
# This is an unsupported case!
lastcmp = (i or "")
i = ""
i.strip()
if not i:
continue
lastver = i[1:] or ""
#j = []
elif inversion and i.endswith(')'):
inversion = False
lastver = lastver + " " + (i[:-1] or "")
r[lastdep] = lastver
elif not inversion:
r[i] = None
lastdep = i
lastver = ""
elif inversion:
lastver = lastver + " " + i
if inversion:
if i.endswith(')'):
i = i[:-1] or ""
inversion = False
if lastver and i:
lastver += " "
if i:
lastver += i
if lastdep not in r:
r[lastdep] = []
r[lastdep].append(lastcmp + " " + lastver)
continue
#if not inversion:
lastdep = i
lastver = ""
lastcmp = ""
if not (i in r and r[i]):
r[lastdep] = []
return r
def explode_dep_versions(s):
r = explode_dep_versions2(s)
for d in r:
if not r[d]:
r[d] = None
continue
if len(r[d]) > 1:
bb.warn("explode_dep_versions(): Item %s appeared in dependency string '%s' multiple times with different values. explode_dep_versions cannot cope with this." % (d, s))
r[d] = r[d][0]
return r
def join_deps(deps, commasep=True):
@@ -220,11 +174,7 @@ def join_deps(deps, commasep=True):
result = []
for dep in deps:
if deps[dep]:
if isinstance(deps[dep], list):
for v in deps[dep]:
result.append(dep + " (" + v + ")")
else:
result.append(dep + " (" + deps[dep] + ")")
result.append(dep + " (" + deps[dep] + ")")
else:
result.append(dep)
if commasep:

View File

@@ -266,20 +266,17 @@ def is_local_special(host, port):
else:
return False
class PRServiceConfigError(Exception):
pass
def auto_start(d):
global singleton
if (not d.getVar('PRSERV_HOST', True)) or (not d.getVar('PRSERV_PORT', True)):
return
return True
if is_local_special(d.getVar('PRSERV_HOST', True), int(d.getVar('PRSERV_PORT', True))) and not singleton:
import bb.utils
cachedir = (d.getVar("PERSISTENT_DIR", True) or d.getVar("CACHE", True))
if not cachedir:
logger.critical("Please set the 'PERSISTENT_DIR' or 'CACHE' variable")
raise PRServiceConfigError
sys.exit(1)
bb.utils.mkdirhier(cachedir)
dbfile = os.path.join(cachedir, "prserv.sqlite3")
logfile = os.path.join(cachedir, "prserv.log")
@@ -295,7 +292,7 @@ def auto_start(d):
return PRServerConnection(host,port).ping()
except Exception:
logger.critical("PRservice %s:%d not available" % (host, port))
raise PRServiceConfigError
return False
def auto_shutdown(d=None):
global singleton

View File

@@ -24,15 +24,13 @@
# manuals are being generated. The variable BRANCH is used to indicate the
# branch (edison or denzil) and is used only when DOC=dev-manual or
# DOC=mega-manual. If you do not specify a BRANCH, the default branch used
# will be for the latest Yocto Project release. If you build for either
# edison or denzil, you must use BRANCH. You do not need to use BRANCH for
# any release beyond denzil.
# will be for the latest Yocto Project release.
#
# To build a manual, you must invoke Makefile with the DOC argument. If you
# are going to publish the manual, then you must invoke Makefile with both the
# DOC and the VER argument. Furthermore, if you are building or publishing
# the edison or denzil versions of the Yocto Poject Development Manual or
# the mega-manual, you must also use the BRANCH argument.
# DOC and the VER argument. If you are building a particular version of the
# Yocto Project Development Manual or you are building any version of the
# mega-manual, you must use the DOC and BRANCH arguments.
#
# Examples:
#
@@ -49,8 +47,7 @@
# fourth example generates both the PDF and HTML 'edison' versions of the YP
# Development Manual. The last exmample generates the HTML version of the
# mega-manual and uses the 'denzil' branch when choosing figures for the
# tarball of figures. Any example that does not use the BRANCH argument
# builds the current version of the manual set.
# tarball of figures.
#
# Use the publish target to push the generated manuals to the Yocto Project
# website. All files needed for the manual's HTML form are pushed as well as the
@@ -60,13 +57,16 @@
# make publish DOC=bsp-guide VER=1.3
# make publish DOC=adt-manual VER=1.3
# make publish DOC=dev-manual VER=1.1.1 BRANCH=edison
# make publish DOC=dev-manual VER=1.2 BRANCH=denzil
# make publish DOC=dev-manual VER=1.2
# make publish DOC=mega-manual VER=1.3 BRANCH=denzil
#
# The first example publishes the 1.3 version of both the PDF and HTML versions of
# the BSP Guide. The second example publishes the 1.3 version of both the PDF and
# The first example publishes the 1.2 version of both the PDF and HTML versions of
# the BSP Guide. The second example publishes the 1.2 version of both the PDF and
# HTML versions of the ADT Manual. The third example publishes the PDF and HTML
# 'edison' versions of the YP Development Manual. The fourth example publishes
# the PDF and HTML 'denzil' versions of the YP Development Manual.
# the PDF and HTML 'master' versions of the YP Development Manual. The last
# example publishes the 1.3 version of the mega-manual (HTML-only) and the
# version generated and published is based on the 'denzil' branch.
#
ifeq ($(DOC),bsp-guide)
@@ -119,8 +119,11 @@ TARFILES = dev-style.css dev-manual.html dev-manual.pdf \
TARFILES = dev-style.css dev-manual.html dev-manual.pdf \
figures/app-dev-flow.png figures/bsp-dev-flow.png figures/dev-title.png \
figures/git-workflow.png figures/index-downloads.png figures/kernel-dev-flow.png \
figures/kernel-overview-1.png figures/kernel-overview-2-generic.png \
figures/source-repos.png figures/yp-download.png
figures/kernel-example-repos-denzil.png \
figures/kernel-overview-1.png figures/kernel-overview-2.png \
figures/kernel-overview-3-denzil.png \
figures/source-repos.png figures/yp-download.png \
figures/wip.png
endif
MANUALS = $(DOC)/$(DOC).html $(DOC)/$(DOC).pdf
@@ -181,8 +184,11 @@ TARFILES = mega-manual.html mega-style.css figures/yocto-environment.png figures
figures/kernel-title.png figures/kernel-architecture-overview.png \
figures/app-dev-flow.png figures/bsp-dev-flow.png figures/dev-title.png \
figures/git-workflow.png figures/index-downloads.png figures/kernel-dev-flow.png \
figures/kernel-overview-1.png figures/kernel-overview-2-generic.png \
figures/source-repos.png figures/yp-download.png
figures/kernel-example-repos-denzil.png \
figures/kernel-overview-1.png figures/kernel-overview-2.png \
figures/kernel-overview-3-denzil.png \
figures/source-repos.png figures/yp-download.png \
figures/wip.png
endif
MANUALS = $(DOC)/$(DOC).html
@@ -308,4 +314,4 @@ publish:
fi
clean:
rm -f $(MANUALS); rm $(DOC)/$(DOC).*tgz;
rm -f $(MANUALS)

View File

@@ -49,15 +49,6 @@ is located in the tools directory. Also note that the figures folder in the
mega-manual directory contains duplicates of all the figures in the YP folders
directories for all YP manuals and guides.
If you want to find HTML versions of the Yocto Project manuals on the web,
go to http://www.yoctoproject.org and click on the "Documentation" tab. From
there you have access to archived documentation from previous releases, current
documentation for the latest release, and "Docs in Progress" for the release
currently being developed.
In general, the Yocto Project site (http://www.yoctoproject.org) is a great
reference for both information and downloads.
Makefile
========

View File

@@ -8,9 +8,9 @@
<para>
Recall that earlier the manual discussed how to use an existing toolchain
tarball that had been installed into <filename>/opt/poky</filename>,
which is outside of the
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>Build Directory</ulink>
(see the section "<link linkend='using-an-existing-toolchain-tarball'>Using a Cross-Toolchain Tarball)</link>".
which is outside of the build directory
(see the section "<link linkend='using-an-existing-toolchain-tarball'>Using an Existing
Toolchain Tarball)</link>".
And, that sourcing your architecture-specific environment setup script
initializes a suitable cross-toolchain development environment.
During the setup, locations for the compiler, QEMU scripts, QEMU binary,
@@ -32,7 +32,7 @@
For an Autotools-based project, you can use the cross-toolchain by just
passing the appropriate host option to <filename>configure.sh</filename>.
The host option you use is derived from the name of the environment setup
script in <filename>/opt/poky</filename> resulting from installation of the
script in <filename>/opt/poky</filename> resulting from unpacking the
cross-toolchain tarball.
For example, the host option for an ARM-based target that uses the GNU EABI
is <filename>armv5te-poky-linux-gnueabi</filename>.

View File

@@ -54,10 +54,8 @@
<para>
The cross-toolchain consists of a cross-compiler, cross-linker, and cross-debugger
that are used to develop user-space applications for targeted hardware.
This toolchain is created either by running the ADT Installer script, a toolchain installer
script, or through a
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>Build Directory</ulink> that
is based on your metadata
This toolchain is created either by running the ADT Installer script or
through a build directory that is based on your metadata
configuration or extension for your targeted device.
The cross-toolchain works with a matching target sysroot.
</para>
@@ -113,9 +111,7 @@
<listitem><para>If you use the ADT Installer script to install ADT, you can
specify whether or not to install QEMU.</para></listitem>
<listitem><para>If you have downloaded a Yocto Project release and unpacked
it to create a
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink> and
you have sourced
it to create a source directory and you have sourced
the environment setup script, QEMU is installed and automatically
available.</para></listitem>
<listitem><para>If you have installed the cross-toolchain
@@ -143,7 +139,7 @@
<listitem><para><emphasis>PowerTOP:</emphasis> Helps you determine what
software is using the most power.
You can find out more about PowerTOP at
<ulink url='https://01.org/powertop/'></ulink>.</para></listitem>
<ulink url='http://www.linuxpowertop.org/'></ulink>.</para></listitem>
<listitem><para><emphasis>OProfile:</emphasis> A system-wide profiler for Linux
systems that is capable of profiling all running code at low overhead.
You can find out more about OProfile at

View File

@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY % poky SYSTEM "../poky.ent"> %poky; ] >
<book id='adt-manual' lang='en'
<book id='adt-manual' lang='en'
xmlns:xi="http://www.w3.org/2003/XInclude"
xmlns="http://docbook.org/ns/docbook"
>
@@ -10,10 +10,10 @@
<mediaobject>
<imageobject>
<imagedata fileref='figures/adt-title.png'
format='SVG'
<imagedata fileref='figures/adt-title.png'
format='SVG'
align='left' scalefit='1' width='100%'/>
</imageobject>
</imageobject>
</mediaobject>
<title></title>
@@ -51,19 +51,9 @@
</revision>
<revision>
<revnumber>1.3</revnumber>
<date>October 2012</date>
<date>Sometime in 2012</date>
<revremark>Released with the Yocto Project 1.3 Release.</revremark>
</revision>
<revision>
<revnumber>1.3.1</revnumber>
<date>April 2013</date>
<revremark>Released with the Yocto Project 1.3.1 Release.</revremark>
</revision>
<revision>
<revnumber>1.3.2</revnumber>
<date>May 2013</date>
<revremark>Released with the Yocto Project 1.3.2 Release.</revremark>
</revision>
</revhistory>
<copyright>
@@ -73,12 +63,12 @@
<legalnotice>
<para>
Permission is granted to copy, distribute and/or modify this document under
Permission is granted to copy, distribute and/or modify this document under
the terms of the <ulink type="http" url="http://creativecommons.org/licenses/by-sa/2.0/uk/">Creative Commons Attribution-Share Alike 2.0 UK: England &amp; Wales</ulink> as published by Creative Commons.
</para>
<note>
Due to production processes, there could be differences between the Yocto Project
documentation bundled in the release tarball and the
documentation bundled in the release tarball and the
<ulink url='&YOCTO_DOCS_ADT_URL;'>Yocto Project Application Developer's Guide</ulink> on
the <ulink url='&YOCTO_HOME_URL;'>Yocto Project</ulink> website.
For the latest version of this manual, see the manual on the website.
@@ -102,6 +92,6 @@
-->
</book>
<!--
vim: expandtab tw=80 ts=4
<!--
vim: expandtab tw=80 ts=4
-->

View File

@@ -78,7 +78,7 @@
<para>
Next, source the environment setup script found in the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>.
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink>.
Follow that by setting up the installation destination to point to your
sysroot as <filename>&lt;sysroot_dir&gt;</filename>.
Finally, have an OPKG configuration file <filename>&lt;conf_file&gt;</filename>

View File

@@ -29,7 +29,8 @@
<note>
<para>Avoid mixing installation methods when installing toolchains for different architectures.
For example, avoid using the ADT Installer to install some toolchains and then hand-installing
cross-development toolchains by running the toolchain installer for different architectures.
cross-development toolchains from downloaded tarballs to install toolchains
for different architectures.
Mixing installation methods can result in situations where the ADT Installer becomes
unreliable and might not install the toolchain.</para>
<para>If you must mix installation methods, you might avoid problems by deleting
@@ -45,14 +46,14 @@
For example, you can configure the installation to install the QEMU emulator
and the user-space NFS, specify which root filesystem profiles to download,
and define the target sysroot location.</para></listitem>
<listitem><para><emphasis>Use an Existing Toolchain:</emphasis>
<listitem><para><emphasis>Use an Existing Toolchain Tarball:</emphasis>
Using this method, you select and download an architecture-specific
toolchain installer and then run the script to hand-install the toolchain.
toolchain tarball and then hand-install the toolchain.
If you use this method, you just get the cross-toolchain and QEMU - you do not
get any of the other mentioned benefits had you run the ADT Installer script.</para></listitem>
<listitem><para><emphasis>Use the Toolchain from within the Build Directory:</emphasis>
If you already have a
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>Build Directory</ulink>,
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>build directory</ulink>,
you can build the cross-toolchain within the directory.
However, like the previous method mentioned, you only get the cross-toolchain and QEMU - you
do not get any of the other benefits without taking separate steps.</para></listitem>
@@ -63,16 +64,8 @@
<title>Using the ADT Installer</title>
<para>
To run the ADT Installer, you need to get the ADT Installer tarball, be sure
you have the necessary host development packages that support the ADT Installer,
and then run the ADT Installer Script.
</para>
<para>
For a list of the host packages needed to support ADT installation and use, see the
"ADT Installer Extras" lists in the
"<ulink url='&YOCTO_DOCS_REF_URL;#required-packages-for-the-host-development-system'>Required Packages for the Host Development System</ulink>" section
of the Yocto Project Reference Manual.
To run the ADT Installer, you need to first get the ADT Installer tarball and then run the ADT
Installer Script.
</para>
<section id='getting-the-adt-installer-tarball'>
@@ -85,21 +78,21 @@
at
<ulink url='&YOCTO_ADTINSTALLER_DL_URL;'></ulink>.
Or, you can use BitBake to generate the tarball inside the existing
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>Build Directory</ulink>.
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>build directory</ulink>.
</para>
<para>
If you use BitBake to generate the ADT Installer tarball, you must
<filename>source</filename> the environment setup script
(<filename>&OE_INIT_FILE;</filename>) located
in the Source Directory before running the <filename>bitbake</filename>
(<filename>oe-init-build-env</filename>) located
in the source directory before running the <filename>bitbake</filename>
command that creates the tarball.
</para>
<para>
The following example commands download the Poky tarball, set up the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>,
set up the environment while also creating the default Build Directory,
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink>,
set up the environment while also creating the default build directory,
and run the <filename>bitbake</filename> command that results in the tarball
<filename>~/yocto-project/build/tmp/deploy/sdk/adt_installer.tar.bz2</filename>:
<literallayout class='monospaced'>
@@ -128,16 +121,13 @@
$ cp ~/poky/build/tmp/deploy/sdk/adt_installer.tar.bz2 $HOME
$ tar -xjf adt_installer.tar.bz2
</literallayout>
Unpacking the tarball creates the directory <filename>adt-installer</filename>,
which contains the ADT Installer script (<filename>adt_installer</filename>),
its configuration file (<filename>adt_installer.conf</filename>), a
<filename>scripts</filename> directory, and an <filename>opkg</filename>
directory.
Unpacking it creates the directory <filename>adt-installer</filename>,
which contains the ADT Installer script (<filename>adt_installer</filename>)
and its configuration file (<filename>adt_installer.conf</filename>).
</para>
<para>
Before you run the ADT Installer script, however, you should examine
the ADT Installer configuration
Before you run the script, however, you should examine the ADT Installer configuration
file and be sure you are going to get what you want.
Your configurations determine which kernel and filesystem image are downloaded.
</para>
@@ -155,22 +145,7 @@
<filename>YOCTOADT_REPO</filename>, you need to be sure that the
directory structure follows the same layout as the reference directory
set up at <ulink url='http://adtrepo.yoctoproject.org'></ulink>.
Also, your repository needs to be accessible through HTTP.</para>
<para>Additionally, you will need to edit a second configuration file
located in the <filename>adt-installer/opkg</filename> directory.
The configuration file you edit depends on your host development
system.
For 64-bit systems, edit the <filename>opkg-sdk-x86_64.conf</filename>
file.
If your host development system is 32-bit, edit the
<filename>opkg-sdk-i686.conf</filename> file.
For both cases, you need to make sure you are pointing to
the IPKG-based packages specified by the
<filename>YOCTOADT_REPO</filename>.
Here is an example for a 64-bit development system:
<literallayout class='monospaced'>
src yp-x86_64-nativesdk http://my_repo/yp-1.3.1/adt-ipk/x86_64-nativesdk
</literallayout></para></listitem>
Also, your repository needs to be accessible through HTTP.</para></listitem>
<listitem><para><filename>YOCTOADT_TARGETS</filename>: The machine
target architectures for which you want to set up cross-development
environments.</para></listitem>
@@ -213,13 +188,19 @@
When you run the installer, the environment must use a
host <filename>gcc</filename>:
<literallayout class='monospaced'>
$ cd ~/adt-installer
$ ./adt_installer
</literallayout>
Once the installer begins to run, you are asked to enter the location for
cross-toolchain installation.
The default location is <filename>/opt/poky/&lt;release&gt;</filename>.
After selecting the location, you are prompted to run in
</para>
<note>
The ADT Installer requires the <filename>libtool</filename> package to complete.
If you install the recommended packages as described in
"<ulink url='&YOCTO_DOCS_QS_URL;#packages'>The Packages</ulink>"
section of the Yocto Project Quick Start, then you will have libtool installed.
</note>
<para>
Once the installer begins to run, you are asked whether you want to run in
interactive or silent mode.
If you want to closely monitor the installation, choose “I” for interactive
mode rather than “S” for silent mode.
@@ -242,12 +223,10 @@
<title>Using a Cross-Toolchain Tarball</title>
<para>
If you want to simply install the cross-toolchain by hand, you can do so by running the
toolchain installer.
If you want to simply install the cross-toolchain by hand, you can do so by using an existing
cross-toolchain tarball.
If you use this method to install the cross-toolchain and you still need to install the target
sysroot, you will have to extract and install sysroot separately.
For information on how to do this, see the
"<link linkend='extracting-the-root-filesystem'>Extracting the Root Filesystem</link>" section.
sysroot, you will have to install sysroot separately.
</para>
<para>
@@ -258,43 +237,30 @@
and find the folder that matches your host development system
(i.e. <filename>i686</filename> for 32-bit machines or
<filename>x86-64</filename> for 64-bit machines).</para></listitem>
<listitem><para>Go into that folder and download the toolchain installer whose name
<listitem><para>Go into that folder and download the toolchain tarball whose name
includes the appropriate target architecture.
For example, if your host development system is an Intel-based 64-bit system and
you are going to use your cross-toolchain for an Intel-based 32-bit target, go into the
<filename>x86_64</filename> folder and download the following installer:
<filename>x86_64</filename> folder and download the following tarball:
<literallayout class='monospaced'>
poky-eglibc-x86_64-i586-toolchain-gmae-&DISTRO;.sh
poky-eglibc-x86_64-i586-toolchain-gmae-&DISTRO;.tar.bz2
</literallayout>
<note><para>As an alternative to steps one and two, you can build the toolchain installer
if you have a <ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>Build Directory</ulink>.
<note><para>As an alternative to steps one and two, you can build the toolchain tarball
if you have a <ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>build directory</ulink>.
If you need GMAE, you should use the <filename>bitbake meta-toolchain-gmae</filename>
command.
The resulting installation script when run will support such development.
The resulting tarball will support such development.
However, if you are not concerned with GMAE,
you can generate the toolchain installer using
<filename>bitbake meta-toolchain</filename>.</para>
you can generate the tarball using <filename>bitbake meta-toolchain</filename>.</para>
<para>Use the appropriate <filename>bitbake</filename> command only after you have
sourced the <filename>&OE_INIT_PATH;</filename> script located in the Source
Directory.
When the <filename>bitbake</filename> command completes, the toolchain installer will
be in <filename>tmp/deploy/sdk</filename> in the Build Directory.
</para></note>
</para></listitem>
<listitem><para>Once you have the installer, run it to install the toolchain.
You must change the permissions on the toolchain installer
script so that it is executable.</para>
<para>The following command shows how to run the installer given a toolchain tarball
for a 64-bit development host system and a 32-bit target architecture.
The example assumes the toolchain installer is located in <filename>~/Downloads/</filename>.
<literallayout class='monospaced'>
$ ~/Downloads/poky-eglibc-x86_64-i586-toolchain-gmae-&DISTRO;.sh
</literallayout>
<note>
If you do not have write permissions for the directory into which you are installing
the toolchain, the toolchain installer notifies you and exits.
Be sure you have write permissions in the directory and run the installer again.
</note>
sourced the <filename>oe-build-init-env</filename> script located in the source
directory.
When the <filename>bitbake</filename> command completes, the tarball will
be in <filename>tmp/deploy/sdk</filename> in the build directory.
</para></note></para></listitem>
<listitem><para>Make sure you are in the root directory with root privileges and then expand
the tarball.
The tarball expands into <filename>&YOCTO_ADTPATH_DIR;</filename>.
Once the tarball is expanded, the cross-toolchain is installed.
You will notice environment setup files for the cross-toolchain in the directory.
</para></listitem>
@@ -308,7 +274,7 @@
<para>
A final way of making the cross-toolchain available is to use BitBake
to generate the toolchain within an existing
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>Build Directory</ulink>.
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>build directory</ulink>.
This method does not install the toolchain into the
<filename>/opt</filename> directory.
As with the previous method, if you need to install the target sysroot, you must
@@ -316,20 +282,20 @@
</para>
<para>
Follow these steps to generate the toolchain into the Build Directory:
Follow these steps to generate the toolchain into the build directory:
<orderedlist>
<listitem><para>Source the environment setup script
<filename>&OE_INIT_FILE;</filename> located in the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>.
<filename>oe-init-build-env</filename> located in the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink>.
</para></listitem>
<listitem><para>At this point, you should be sure that the
<ulink url='&YOCTO_DOCS_REF_URL;#var-MACHINE'><filename>MACHINE</filename></ulink> variable
in the <filename>local.conf</filename> file found in the
<filename>conf</filename> directory of the Build Directory
<filename>conf</filename> directory of the build directory
is set for the target architecture.
Comments within the <filename>local.conf</filename> file list the values you
can use for the <filename>MACHINE</filename> variable.
<note>You can populate the Build Directory with the cross-toolchains for more
<note>You can populate the build directory with the cross-toolchains for more
than a single architecture.
You just need to edit the <filename>MACHINE</filename> variable in the
<filename>local.conf</filename> file and re-run the BitBake
@@ -343,14 +309,10 @@
after checking or editing the <filename>local.conf</filename> but without
changing out of your working directory.</note>
Once the <filename>bitbake</filename> command finishes,
the cross-toolchain is generated and populated within the Build Directory.
the cross-toolchain is generated and populated within the build directory.
You will notice environment setup files for the cross-toolchain in the
Build Directory in the <filename>tmp</filename> directory.
Setup script filenames contain the strings <filename>environment-setup</filename>.</para>
<para>Be aware that when you use this method to install the toolchain you still need
to separately extract and install the sysroot filesystem.
For information on how to do this, see the
"<link linkend='extracting-the-root-filesystem'>Extracting the Root Filesystem</link>" section.
build directory in the <filename>tmp</filename> directory.
Setup script filenames contain the strings <filename>environment-setup</filename>.
</para></listitem>
</orderedlist>
</para>
@@ -367,9 +329,9 @@
then you can find this script in the <filename>&YOCTO_ADTPATH_DIR;</filename>
directory.
If you installed the toolchain in the
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>Build Directory</ulink>,
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>build directory</ulink>,
you can find the environment setup
script for the toolchain in the Build Directory's <filename>tmp</filename> directory.
script for the toolchain in the build directory's <filename>tmp</filename> directory.
</para>
<para>
@@ -421,15 +383,7 @@
</para>
<para>
If you are planning on developing against your image and you are not
building or using one of the Yocto Project development images
(e.g. core-image-*-dev), you must be sure to include the development
packages as part of your image recipe.
</para>
<para>
Furthermore, if you plan on remotely deploying and debugging your
application from within the
If you plan on remotely deploying and debugging your application from within the
Eclipse IDE, you must have an image that contains the Yocto Target Communication
Framework (TCF) agent (<filename>tcf-agent</filename>).
By default, the Yocto Project provides only one type pre-built image that contains the
@@ -442,7 +396,7 @@
you can do so one of two ways:
<itemizedlist>
<listitem><para>Modify the <filename>conf/local.conf</filename> configuration in
the <ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>Build Directory</ulink>
the <ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>build directory</ulink>
and then rebuild the image.
With this method, you need to modify the
<ulink url='&YOCTO_DOCS_REF_URL;#var-EXTRA_IMAGE_FEATURES'><filename>EXTRA_IMAGE_FEATURES</filename></ulink>

View File

@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY % poky SYSTEM "../poky.ent"> %poky; ] >
<book id='bsp-guide' lang='en'
<book id='bsp-guide' lang='en'
xmlns:xi="http://www.w3.org/2003/XInclude"
xmlns="http://docbook.org/ns/docbook"
>
@@ -10,13 +10,13 @@
<mediaobject>
<imageobject>
<imagedata fileref='figures/bsp-title.png'
format='SVG'
<imagedata fileref='figures/bsp-title.png'
format='SVG'
align='center' scalefit='1' width='100%'/>
</imageobject>
</imageobject>
</mediaobject>
<title></title>
<title></title>
<authorgroup>
<author>
@@ -63,19 +63,9 @@
</revision>
<revision>
<revnumber>1.3</revnumber>
<date>October 2012</date>
<date>Sometime in 2012</date>
<revremark>Released with the Yocto Project 1.3 Release.</revremark>
</revision>
<revision>
<revnumber>1.3.1</revnumber>
<date>April 2013</date>
<revremark>Released with the Yocto Project 1.3.1 Release.</revremark>
</revision>
<revision>
<revnumber>1.3.2</revnumber>
<date>May 2013</date>
<revremark>Released with the Yocto Project 1.3.2 Release.</revremark>
</revision>
</revhistory>
<copyright>
@@ -85,12 +75,12 @@
<legalnotice>
<para>
Permission is granted to copy, distribute and/or modify this document under
Permission is granted to copy, distribute and/or modify this document under
the terms of the <ulink type="http" url="http://creativecommons.org/licenses/by-nc-sa/2.0/uk/">Creative Commons Attribution-Non-Commercial-Share Alike 2.0 UK: England &amp; Wales</ulink> as published by Creative Commons.
</para>
<note>
Due to production processes, there could be differences between the Yocto Project
documentation bundled in the release tarball and the
documentation bundled in the release tarball and the
<ulink url='&YOCTO_DOCS_BSP_URL;'>Yocto Project Board Support Package (BSP) Developer's Guide</ulink> on
the <ulink url='&YOCTO_HOME_URL;'>Yocto Project</ulink> website.
For the latest version of this manual, see the manual on the website.
@@ -107,6 +97,6 @@
-->
</book>
<!--
vim: expandtab tw=80 ts=4
<!--
vim: expandtab tw=80 ts=4
-->

View File

@@ -19,7 +19,8 @@
</para>
<para>
This guide presents information about BSP Layers, defines a structure for components
This chapter (or document if you are reading the BSP Developer's Guide)
talks about BSP Layers, defines a structure for components
so that BSPs follow a commonly understood layout, discusses how to customize
a recipe for a BSP, addresses BSP licensing, and provides information that
shows you how to create and manage a
@@ -47,7 +48,7 @@
This root is what you add to the
<ulink url='&YOCTO_DOCS_REF_URL;#var-BBLAYERS'><filename>BBLAYERS</filename></ulink>
variable in the <filename>conf/bblayers.conf</filename> file found in the
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>Build Directory</ulink>.
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>build directory</ulink>.
Adding the root allows the OpenEmbedded build system to recognize the BSP
definition and from it build an image.
Here is an example:
@@ -55,7 +56,6 @@
BBLAYERS = " \
/usr/local/src/yocto/meta \
/usr/local/src/yocto/meta-yocto \
/usr/local/src/yocto/meta-yocto-bsp \
/usr/local/src/yocto/meta-&lt;bsp_name&gt; \
"
</literallayout>
@@ -83,6 +83,8 @@
For more detailed information on layers, see the
"<ulink url='&YOCTO_DOCS_DEV_URL;#understanding-and-creating-layers'>Understanding and Creating Layers</ulink>"
section of the Yocto Project Development Manual.
You can also see the detailed examples in the appendices of the
<ulink url='&YOCTO_DOCS_DEV_URL;'>Yocto Project Development Manual</ulink>.
</para>
</section>
@@ -170,6 +172,9 @@
meta-crownbay/recipes-bsp/formfactor/formfactor/crownbay/machconfig
meta-crownbay/recipes-bsp/formfactor/formfactor/crownbay-noemgd/
meta-crownbay/recipes-bsp/formfactor/formfactor/crownbay-noemgd/machconfig
meta-crownbay/recipes-core/
meta-crownbay/recipes-core/tasks/
meta-crownbay/recipes-core/tasks/task-core-tools-profile.bbappend
meta-crownbay/recipes-graphics/
meta-crownbay/recipes-graphics/xorg-xserver/
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend
@@ -180,10 +185,9 @@
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config/crownbay-noemgd/xorg.conf
meta-crownbay/recipes-kernel/
meta-crownbay/recipes-kernel/linux/
meta-crownbay/recipes-kernel/linux/linux-yocto-rt_3.2.bbappend
meta-crownbay/recipes-kernel/linux/linux-yocto-rt_3.4.bbappend
meta-crownbay/recipes-kernel/linux/linux-yocto_3.2.bbappend
meta-crownbay/recipes-kernel/linux/linux-yocto_3.4.bbappend
meta-crownbay/recipes-kernel/linux/linux-yocto-rt_3.0.bbappend
meta-crownbay/recipes-kernel/linux/linux-yocto_2.6.37.bbappend
meta-crownbay/recipes-kernel/linux/linux-yocto_3.0.bbappend
</literallayout>
</para>
@@ -387,7 +391,7 @@
<para>
Tuning files are found in the <filename>meta/conf/machine/include</filename>
directory within the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>.
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink>.
Tuning files can also reside in the BSP Layer itself.
For example, the <filename>ia32-base.inc</filename> file resides in the
<filename>meta-intel</filename> BSP Layer in <filename>conf/machine/include</filename>.
@@ -398,8 +402,8 @@
For example, the Crown Bay BSP <filename>crownbay.conf</filename> has the
following statements:
<literallayout class='monospaced'>
require conf/machine/include/tune-atom.inc
require conf/machine/include/ia32-base.inc
include conf/machine/include/tune-atom.inc
include conf/machine/include/ia32-base.inc
</literallayout>
</para>
</section>
@@ -439,10 +443,31 @@
formfactor recipe
<filename>meta/recipes-bsp/formfactor/formfactor_0.0.bb</filename>,
which is found in the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>.
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink>.
</para></note>
</section>
<section id='bsp-filelayout-core-recipes'>
<title>Core Recipe Files</title>
<para>
You can find these files in the BSP Layer at:
<literallayout class='monospaced'>
meta-&lt;bsp_name&gt;/recipes-core/*
</literallayout>
</para>
<para>
This directory contains recipe files that are almost always necessary to build a
useful, working Linux image.
Thus, the term "core" is used to group these recipes.
For example, in the Crown Bay BSP there is the
<filename>task-core-tools-profile.bbappend</filename> file, which is an append file used
to recommend that the
<ulink url='http://sourceware.org/systemtap/wiki'>SystemTap</ulink>
package be included as a package when the image is built.
</para>
</section>
<section id='bsp-filelayout-recipes-graphics'>
<title>Display Support Files</title>
<para>
@@ -484,7 +509,7 @@
</para>
<para>
For your BSP, you typically want to use an existing Yocto Project kernel recipe found in the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink>
at <filename>meta/recipes-kernel/linux</filename>.
You can append your specific changes to the kernel recipe by using a
similarly named append file, which is located in the BSP Layer (e.g.
@@ -494,17 +519,11 @@
Suppose you are using the <filename>linux-yocto_3.4.bb</filename> recipe to build
the kernel.
In other words, you have selected the kernel in your
<filename>&lt;bsp_name&gt;.conf</filename> file by adding these types
of statements:
<filename>&lt;bsp_name&gt;.conf</filename> file by adding the following statements:
<literallayout class='monospaced'>
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
PREFERRED_VERSION_linux-yocto = "3.4%"
</literallayout>
<note>
When the preferred provider is assumed by default, the
<filename>PREFERRED_PROVIDER</filename> statement does not appear in the
<filename>&lt;bsp_name&gt;.conf</filename> file.
</note>
You would use the <filename>linux-yocto_3.4.bbappend</filename> file to append
specific BSP settings to the kernel, thus configuring the kernel for your particular BSP.
</para>
@@ -523,22 +542,17 @@
COMPATIBLE_MACHINE_crownbay = "crownbay"
KMACHINE_crownbay = "crownbay"
KBRANCH_crownbay = "standard/crownbay"
KBRANCH_crownbay = "standard/default/crownbay"
COMPATIBLE_MACHINE_crownbay-noemgd = "crownbay-noemgd"
KMACHINE_crownbay-noemgd = "crownbay"
KBRANCH_crownbay-noemgd = "standard/crownbay"
KBRANCH_crownbay-noemgd = "standard/default/crownbay"
SRCREV_machine_pn-linux-yocto_crownbay ?= "449f7f520350700858f21a5554b81cc8ad23267d"
SRCREV_meta_pn-linux-yocto_crownbay ?= "9e3bdb7344054264b750e53fbbb6394cc1c942ac"
SRCREV_emgd_pn-linux-yocto_crownbay ?= "86643bdd8cbad616a161ab91f51108cf0da827bc"
SRCREV_machine_pn-linux-yocto_crownbay ?= "48101e609711fcfe8d5e737a37a5a69f4bd57d9a"
SRCREV_meta_pn-linux-yocto_crownbay ?= "5b4c9dc78b5ae607173cc3ddab9bce1b5f78129b"
SRCREV_machine_pn-linux-yocto_crownbay-noemgd ?= "449f7f520350700858f21a5554b81cc8ad23267d"
SRCREV_meta_pn-linux-yocto_crownbay-noemgd ?= "9e3bdb7344054264b750e53fbbb6394cc1c942ac"
KSRC_linux_yocto_3_4 ?= "git.yoctoproject.org/linux-yocto-3.4.git"
SRC_URI_crownbay = "git://git.yoctoproject.org/linux-yocto-3.4.git;protocol=git;nocheckout=1;branch=${KBRANCH},meta,emgd-1.14;name=machine,meta,emgd"
SRC_URI_crownbay-noemgd = "git://git.yoctoproject.org/linux-yocto-3.4.git;protocol=git;nocheckout=1;branch=${KBRANCH},meta;name=machine,meta"
SRCREV_machine_pn-linux-yocto_crownbay-noemgd ?= "48101e609711fcfe8d5e737a37a5a69f4bd57d9a"
SRCREV_meta_pn-linux-yocto_crownbay-noemgd ?= "5b4c9dc78b5ae607173cc3ddab9bce1b5f78129b"
</literallayout>
This append file contains statements used to support the Crown Bay BSP for both
<trademark class='registered'>Intel</trademark> EMGD and the VESA graphics.
@@ -551,11 +565,10 @@
COMPATIBLE_MACHINE_crownbay = "crownbay"
KMACHINE_crownbay = "crownbay"
KBRANCH_crownbay = "standard/crownbay"
KBRANCH_crownbay = "standard/default/crownbay"
SRCREV_machine_pn-linux-yocto_crownbay ?= "449f7f520350700858f21a5554b81cc8ad23267d"
SRCREV_meta_pn-linux-yocto_crownbay ?= "9e3bdb7344054264b750e53fbbb6394cc1c942ac"
SRCREV_emgd_pn-linux-yocto_crownbay ?= "86643bdd8cbad616a161ab91f51108cf0da827bc"
SRCREV_machine_pn-linux-yocto_crownbay ?= "48101e609711fcfe8d5e737a37a5a69f4bd57d9a"
SRCREV_meta_pn-linux-yocto_crownbay ?= "5b4c9dc78b5ae607173cc3ddab9bce1b5f78129b"
</literallayout>
The append file defines <filename>crownbay</filename> as the
<ulink url='&YOCTO_DOCS_REF_URL;#var-COMPATIBLE_MACHINE'><filename>COMPATIBLE_MACHINE</filename></ulink>
@@ -567,16 +580,10 @@
<ulink url='&YOCTO_DOCS_REF_URL;#var-KBRANCH'><filename>KBRANCH</filename></ulink> variable
to ensure the build process uses the <filename>standard/default/crownbay</filename>
kernel branch.
Finally, the append file points to specific commits in the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink> Git
Finally, the append file points to the specific top commits in the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink> Git
repository and the <filename>meta</filename> Git repository branches to identify the
exact kernel needed to build the Crown Bay BSP.
<note>
For <filename>crownbay</filename>, a specific commit is also needed to point
to the branch that supports EMGD graphics.
At a minimum, every BSP points to the
<filename>machine</filename> and <filename>meta</filename> commits.
</note>
</para>
<para>
@@ -634,6 +641,13 @@
<filename>meta</filename> branch for your BSP.
The configuration options will likely end up in that location anyway if the BSP gets
added to the Yocto Project.
For an example showing how to change the BSP configuration, see the
"<ulink url='&YOCTO_DOCS_DEV_URL;#changing-the-bsp-configuration'>Changing the BSP Configuration</ulink>"
section in the Yocto Project Development Manual.
For a better understanding of working with a local clone of the kernel repository
and a local bare clone of the kernel, see the
"<ulink url='&YOCTO_DOCS_DEV_URL;#modifying-the-kernel-source-code'>Modifying the Kernel
Source Code</ulink>" section also in the Yocto Project Development Manual.
</para>
<para>
@@ -716,7 +730,7 @@
<filename>recipe-*</filename> subdirectory.
You can find <filename>recipes.txt</filename> in the
<filename>meta</filename> directory of the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>,
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink>,
or in the OpenEmbedded Core Layer
(<filename>openembedded-core</filename>) found at
<ulink url='http://git.openembedded.org/openembedded-core/tree/meta'></ulink>.
@@ -724,7 +738,7 @@
<para>Within any particular <filename>recipes-*</filename> category, the layout
should match what is found in the OpenEmbedded Core
Git repository (<filename>openembedded-core</filename>)
or the Source Directory (<filename>poky</filename>).
or the source directory (<filename>poky</filename>).
In other words, make sure you place related files in appropriately
related <filename>recipes-*</filename> subdirectories specific to the
recipe's function, or within a subdirectory containing a set of closely-related
@@ -740,22 +754,22 @@
You must specify which license to use since there is no
default license if one is not specified.
See the
<ulink url='&YOCTO_GIT_URL;/cgit.cgi/meta-intel/tree/meta-fri2/COPYING.MIT'><filename>COPYING.MIT</filename></ulink>
file for the Fish River Island 2 BSP in the <filename>meta-fri2</filename> BSP layer
<ulink url='&YOCTO_GIT_URL;/cgit.cgi/meta-intel/tree/meta-fishriver/COPYING.MIT'><filename>COPYING.MIT</filename></ulink>
file for the Fish River BSP in the <filename>meta-fishriver</filename> BSP layer
as an example.</para></listitem>
<listitem><para><emphasis>README File:</emphasis>
You must include a <filename>README</filename> file in the
<filename>meta-&lt;bsp_name&gt;</filename> directory.
See the
<ulink url='&YOCTO_GIT_URL;/cgit.cgi/meta-intel/tree/meta-fri2/README'><filename>README</filename></ulink>
file for the Fish River Island 2 BSP in the <filename>meta-fri2</filename> BSP layer
<ulink url='&YOCTO_GIT_URL;/cgit.cgi/meta-intel/tree/meta-fishriver/README'><filename>README</filename></ulink>
file for the Fish River BSP in the <filename>meta-fishriver</filename> BSP layer
as an example.</para>
<para>At a minimum, the <filename>README</filename> file should
contain the following:
<itemizedlist>
<listitem><para>A brief description about the hardware the BSP
targets.</para></listitem>
<listitem><para>A list of all the dependencies
<listitem><para>A list of all the dependencies a
on which a BSP layer depends.
These dependencies are typically a list of required layers needed
to build the BSP.
@@ -788,8 +802,8 @@
generate the binary images contained in the
<filename>/binary</filename> directory, if present.
See the
<ulink url='&YOCTO_GIT_URL;/cgit.cgi/meta-intel/tree/meta-fri2/README.sources'><filename>README.sources</filename></ulink>
file for the Fish River Island 2 BSP in the <filename>meta-fri2</filename> BSP layer
<ulink url='&YOCTO_GIT_URL;/cgit.cgi/meta-intel/tree/meta-fishriver/README.sources'><filename>README.sources</filename></ulink>
file for the Fish River BSP in the <filename>meta-fishriver</filename> BSP layer
as an example.</para></listitem>
<listitem><para><emphasis>Layer Configuration File:</emphasis>
You must include a <filename>conf/layer.conf</filename> in the
@@ -803,13 +817,14 @@
using the BSP layer.
Multiple machine configuration files define variations of machine
configurations that are supported by the BSP.
If a BSP supports multiple machine variations, you need to
If a BSP supports more multiple machine variations, you need to
adequately describe each variation in the BSP
<filename>README</filename> file.
Do not use multiple machine configuration files to describe disparate
hardware.
If you do have very different targets, you should create separate
BSP layers for each target.
Multiple machine configuration files should describe very similar targets.
If you do have very different targets, you should create a separate
BSP.
<note>It is completely possible for a developer to structure the
working repository as a conglomeration of unrelated BSP
files, and to possibly generate specifically targeted 'release' BSPs
@@ -855,7 +870,7 @@
Basing your recipes on these kernels reduces the costs for maintaining
the BSP and increases its scalability.
See the <filename>Yocto Linux Kernel</filename> category in the
<ulink url='&YOCTO_GIT_URL;/cgit.cgi'>Source Repositories</ulink>
<ulink url='&YOCTO_GIT_URL;/cgit.cgi'><filename>Yocto Source Repositories</filename></ulink>
for these kernels.</para></listitem>
</itemizedlist>
</para>
@@ -880,7 +895,7 @@
<para>
To better understand this, consider an example that customizes a recipe by adding
a BSP-specific configuration file named <filename>interfaces</filename> to the
<filename>netbase_5.0.bb</filename> recipe for machine "xyz".
<filename>netbase_4.47.bb</filename> recipe for machine "xyz".
Do the following:
<orderedlist>
<listitem><para>Edit the <filename>netbase_4.47.bbappend</filename> file so that it
@@ -1026,8 +1041,8 @@
<para>
The following sections describe the common location and help features as well
as provide details for the
<filename>yocto-bsp</filename> and <filename>yocto-kernel</filename> tools.
as details for the <filename>yocto-bsp</filename> and <filename>yocto-kernel</filename>
tools.
</para>
<section id='common-features'>
@@ -1046,7 +1061,7 @@
<para>
Both tools reside in the <filename>scripts/</filename> subdirectory
of the <ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>.
of the <ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink>.
Consequently, to use the scripts, you must <filename>source</filename> the
environment just as you would when invoking a build:
<literallayout class='monospaced'>
@@ -1058,27 +1073,30 @@
The most immediately useful function is to get help on both tools.
The built-in help system makes it easy to drill down at
any time and view the syntax required for any specific command.
Simply enter the name of the command with the <filename>help</filename>
switch:
Simply enter the name of the command, or the command along with
<filename>help</filename> to display a list of the available sub-commands.
Here is an example:
<literallayout class='monospaced'>
$ yocto-bsp
$ yocto-bsp help
Usage:
Create a customized Yocto BSP layer.
Usage:
usage: yocto-bsp [--version] [--help] COMMAND [ARGS]
Create a customized Yocto BSP layer.
Current 'yocto-bsp' commands are:
create Create a new Yocto BSP
list List available values for options and BSP properties
usage: yocto-bsp [--version] [--help] COMMAND [ARGS]
See 'yocto-bsp help COMMAND' for more information on a specific command.
The most commonly used 'yocto-bsp' commands are:
create Create a new Yocto BSP
list List available values for options and BSP properties
See 'yocto-bsp help COMMAND' for more information on a specific command.
Options:
--version show program's version number and exit
-h, --help show this help message and exit
-D, --debug output debug information
--version show program's version number and exit
-h, --help show this help message and exit
-D, --debug output debug information
</literallayout>
</para>
@@ -1088,20 +1106,19 @@
<literallayout class='monospaced'>
$ yocto-bsp create
Usage:
Usage:
Create a new Yocto BSP
usage: yocto-bsp create &lt;bsp-name&gt; &lt;karch&gt; [-o &lt;DIRNAME&gt; | --outdir &lt;DIRNAME&gt;]
Create a new Yocto BSP
usage: yocto-bsp create &lt;bsp-name&gt; &lt;karch&gt; [-o &lt;DIRNAME&gt; | --outdir &lt;DIRNAME&gt;]
[-i &lt;JSON PROPERTY FILE&gt; | --infile &lt;JSON PROPERTY_FILE&gt;]
This command creates a Yocto BSP based on the specified parameters.
The new BSP will be a new Yocto BSP layer contained by default within
the top-level directory specified as 'meta-bsp-name'. The -o option
can be used to place the BSP layer in a directory with a different
name and location.
This command creates a Yocto BSP based on the specified parameters.
The new BSP will be a new BSP layer contained by default within
the top-level directory specified as 'meta-bsp-name'. The -o option
can be used to place the BSP layer in a directory with a different
name and location.
...
...
</literallayout>
</para>
@@ -1112,26 +1129,33 @@
$ yocto-bsp help create
NAME
yocto-bsp create - Create a new Yocto BSP
yocto-bsp create - Create a new Yocto BSP
SYNOPSIS
yocto-bsp create &lt;bsp-name&gt; &lt;karch&gt; [-o &lt;DIRNAME&gt; | --outdir &lt;DIRNAME&gt;]
yocto-bsp create &lt;bsp-name&gt; &lt;karch&gt; [-o &lt;DIRNAME&gt; | --outdir &lt;DIRNAME&gt;]
[-i &lt;JSON PROPERTY FILE&gt; | --infile &lt;JSON PROPERTY_FILE&gt;]
DESCRIPTION
This command creates a Yocto BSP based on the specified
parameters. The new BSP will be a new Yocto BSP layer contained
by default within the top-level directory specified as
'meta-bsp-name'. The -o option can be used to place the BSP layer
in a directory with a different name and location.
The value of the 'karch' parameter determines the set of files
that will be generated for the BSP, along with the specific set of
'properties' that will be used to fill out the BSP-specific
portions of the BSP. The possible values for the 'karch' paramter
can be listed via 'yocto-bsp list karch'.
...
This command creates a Yocto BSP based on the specified
parameters. The new BSP will be a new Yocto BSP layer contained
by default within the top-level directory specified as
'meta-bsp-name'. The -o option can be used to place the BSP layer
in a directory with a different name and location.
The value of the 'karch' parameter determines the set of files
that will be generated for the BSP, along with the specific set of
'properties' that will be used to fill out the BSP-specific
portions of the BSP.
...
NOTE: Once created, you should add your new layer to your
bblayers.conf file in order for it to be subsequently seen and
modified by the yocto-kernel tool.
NOTE for x86- and x86_64-based BSPs: The generated BSP assumes the
presence of the of the meta-intel layer, so you should also have a
meta-intel layer present and added to your bblayers.conf as well.
</literallayout>
</para>
@@ -1158,33 +1182,33 @@
For the current set of BSPs, the script prompts you for various important
parameters such as:
<itemizedlist>
<listitem><para>The kernel to use</para></listitem>
<listitem><para>The branch of that kernel to use (or re-use)</para></listitem>
<listitem><para>Whether or not to use X, and if so, which drivers to use</para></listitem>
<listitem><para>Whether to turn on SMP</para></listitem>
<listitem><para>Whether the BSP has a keyboard</para></listitem>
<listitem><para>Whether the BSP has a touchscreen</para></listitem>
<listitem><para>Remaining configurable items associated with the BSP</para></listitem>
<listitem><para>which kernel to use</para></listitem>
<listitem><para>which branch of that kernel to use (or re-use)</para></listitem>
<listitem><para>whether or not to use X, and if so, which drivers to use</para></listitem>
<listitem><para>whether to turn on SMP</para></listitem>
<listitem><para>whether the BSP has a keyboard</para></listitem>
<listitem><para>whether the BSP has a touchscreen</para></listitem>
<listitem><para>any remaining configurable items associated with the BSP</para></listitem>
</itemizedlist>
</para>
<para>
You use the <filename>yocto-bsp create</filename> sub-command to create
a new BSP layer.
This command requires you to specify a particular kernel architecture
(<filename>karch</filename>) on which to base the BSP.
This command requires you to specify a particular architecture on which to
base the BSP.
Assuming you have sourced the environment, you can use the
<filename>yocto-bsp list karch</filename> sub-command to list the
architectures available for BSP creation as follows:
<literallayout class='monospaced'>
$ yocto-bsp list karch
Architectures available:
qemu
x86_64
i386
powerpc
arm
powerpc
i386
mips
x86_64
qemu
</literallayout>
</para>
@@ -1205,46 +1229,53 @@
the prompts appear in brackets.
Pressing enter without supplying anything on the command line or pressing enter
and providing an invalid response causes the script to accept the default value.
Once the script completes, the new <filename>meta-myarm</filename> BSP layer
is created in the current working directory.
This example assumes you have source the &OE_INIT_FILE; and are currently
in the top-level folder of the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>.
</para>
<para>
Following is the complete example:
<literallayout class='monospaced'>
$ yocto-bsp create myarm qemu
Which qemu architecture would you like to use? [default: i386]
1) i386 (32-bit)
2) x86_64 (64-bit)
3) ARM (32-bit)
4) PowerPC (32-bit)
5) MIPS (32-bit)
Which qemu architecture would you like to use? [default: x86]
1) common 32-bit x86
2) common 64-bit x86
3) common 32-bit ARM
4) common 32-bit PowerPC
5) common 32-bit MIPS
3
Would you like to use the default (3.4) kernel? (y/n) [default: y]
Do you need a new machine branch for this BSP (the alternative is to re-use an existing branch)? [y/n] [default: y]
Getting branches from remote repo git://git.yoctoproject.org/linux-yocto-3.4.git...
Please choose a machine branch to base your new BSP branch on: [default: standard/base]
1) standard/arm-versatile-926ejs
Would you like to use the default (3.2) kernel? (Y/n)
Do you need a new machine branch for this BSP (the alternative is to re-use an existing branch)? [Y/n]
Getting branches from remote repo git://git.yoctoproject.org/linux-yocto-3.2...
Please choose a machine branch to base this BSP on => [default: standard/default/common-pc]
1) base
2) standard/base
3) standard/beagleboard
4) standard/cedartrail
5) standard/crownbay
6) standard/emenlow
7) standard/fishriver
8) standard/fri2
9) standard/fsl-mpc8315e-rdb
10) standard/mti-malta32
11) standard/mti-malta64
12) standard/qemuppc
13) standard/routerstationpro
14) standard/sys940x
1
Would you like SMP support? (y/n) [default: y]
Does your BSP have a touchscreen? (y/n) [default: n]
Does your BSP have a keyboard? (y/n) [default: y]
3) standard/default/arm-versatile-926ejs
4) standard/default/base
5) standard/default/beagleboard
6) standard/default/cedartrailbsp (copy).xml
7) standard/default/common-pc-64/base
8) standard/default/common-pc-64/jasperforest
9) standard/default/common-pc-64/romley
10) standard/default/common-pc-64/sugarbay
11) standard/default/common-pc/atom-pc
12) standard/default/common-pc/base
13) standard/default/crownbay
14) standard/default/emenlow
15) standard/default/fishriver
16) standard/default/fri2
17) standard/default/fsl-mpc8315e-rdb
18) standard/default/mti-malta32-be
19) standard/default/mti-malta32-le
20) standard/default/preempt-rt
21) standard/default/qemu-ppc32
22) standard/default/routerstationpro
23) standard/preempt-rt/base
24) standard/preempt-rt/qemu-ppc32
25) standard/preempt-rt/routerstationpro
26) standard/tiny
3
Do you need SMP support? (Y/n)
Does your BSP have a touchscreen? (y/N)
Does your BSP have a keyboard? (Y/n)
New qemu BSP created in meta-myarm
</literallayout>
Let's take a closer look at the example now:
@@ -1254,10 +1285,10 @@
In the example, we use the <filename>arm</filename> architecture.
</para></listitem>
<listitem><para>The script then prompts you for the kernel.
The default 3.4 kernel is acceptable.
The default kernel is 3.2 and is acceptable.
So, the example accepts the default.
If you enter 'n', the script prompts you to further enter the kernel
you do want to use (e.g. 3.0, 3.2_preempt-rt, and so forth.).</para></listitem>
you do want to use (e.g. 3.0, 3.2_preempt-rt, etc.).</para></listitem>
<listitem><para>Next, the script asks whether you would like to have a new
branch created especially for your BSP in the local
<ulink url='&YOCTO_DOCS_DEV_URL;#local-kernel-files'>Linux Yocto Kernel</ulink>
@@ -1270,20 +1301,25 @@
The reason a new branch is the default is that typically
new BSPs do require BSP-specific patches.
The tool thus assumes that most of time a new branch is required.
</para></listitem>
<listitem><para>Regardless of which choice you make in the previous step,
<note>In the current implementation, creation or re-use of a branch does
not actually matter.
The reason is because the generated BSPs assume that patches and
configurations live in recipe-space, which is something that can be done
with or without a dedicated branch.
Generated BSPs, however, are different.
This difference becomes significant once the tool's 'publish' functionality
is implemented.</note></para></listitem>
<listitem><para>Regardless of which choice is made in the previous step,
you are now given the opportunity to select a particular machine branch on
which to base your new BSP-specific machine branch
which to base your new BSP-specific machine branch on
(or to re-use if you had elected to not create a new branch).
Because this example is generating an <filename>arm</filename> BSP, the example
uses <filename>#1</filename> at the prompt, which selects the arm-versatile branch.
uses <filename>#3</filename> at the prompt, which selects the arm-versatile branch.
</para></listitem>
<listitem><para>The remainder of the prompts are routine.
Defaults are accepted for each.</para></listitem>
<listitem><para>By default, the script creates the new BSP Layer in the
current working directory of the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>,
which is <filename>poky</filename> in this case.
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>build directory</ulink>.
</para></listitem>
</orderedlist>
</para>
@@ -1296,7 +1332,6 @@
BBLAYERS = " \
/usr/local/src/yocto/meta \
/usr/local/src/yocto/meta-yocto \
/usr/local/src/yocto/meta-yocto-bsp \
/usr/local/src/yocto/meta-myarm \
"
</literallayout>
@@ -1328,28 +1363,21 @@
is to use the <filename>yocto-kernel</filename> built-in help as follows:
<literallayout class='monospaced'>
$ yocto-kernel
Usage:
Usage:
Modify and list Yocto BSP kernel config items and patches.
Modify and list Yocto BSP kernel config items and patches.
usage: yocto-kernel [--version] [--help] COMMAND [ARGS]
usage: yocto-kernel [--version] [--help] COMMAND [ARGS]
Current 'yocto-kernel' commands are:
config list List the modifiable set of bare kernel config options for a BSP
config add Add or modify bare kernel config options for a BSP
config rm Remove bare kernel config options from a BSP
patch list List the patches associated with a BSP
patch add Patch the Yocto kernel for a BSP
patch rm Remove patches from a BSP
The most commonly used 'yocto-kernel' commands are:
config list List the modifiable set of bare kernel config options for a BSP
config add Add or modify bare kernel config options for a BSP
config rm Remove bare kernel config options from a BSP
patch list List the patches associated with a BSP
patch add Patch the Yocto kernel for a BSP
patch rm Remove patches from a BSP
See 'yocto-kernel help COMMAND' for more information on a specific command.
Options:
--version show program's version number and exit
-h, --help show this help message and exit
-D, --debug output debug information
See 'yocto-kernel help COMMAND' for more information on a specific command.
</literallayout>
</para>

View File

@@ -0,0 +1,716 @@
<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY % poky SYSTEM "../poky.ent"> %poky; ] >
<appendix id='dev-manual-bsp-appendix'>
<title>BSP Development Example</title>
<para>
This appendix provides a complete BSP development example.
The example assumes the following:
<itemizedlist>
<listitem><para>No previous preparation or use of the Yocto Project.</para></listitem>
<listitem><para>Use of the Crown Bay Board Support Package (BSP) as a "base" BSP from
which to work.
The example begins with the Crown Bay BSP as the starting point
but ends by building a new 'atom-pc' BSP, which was based on the Crown Bay BSP.
</para></listitem>
<listitem><para>Shell commands assume <filename>bash</filename></para></listitem>
<listitem><para>Example was developed on an Intel-based Core i7 platform running
Ubuntu 10.04 LTS released in April of 2010.</para></listitem>
</itemizedlist>
</para>
<section id='getting-local-yocto-project-files-and-bsp-files'>
<title>Getting Local Source Files and BSP Files</title>
<para>
You need to have the <link linkend='source-directory'>source directory</link>
available on your host system.
You can set up this directory through tarball extraction or by cloning the
<filename>poky</filename> Git repository.
The following paragraphs describe both methods.
For additional information, see the bulleted item
"<link linkend='local-yp-release'>Yocto Project Release</link>".
</para>
<para>
As mentioned, one way to set up the source directory is to use Git to clone the
<filename>poky</filename> repository.
These commands create a local copy of the Git repository.
By default, the top-level directory of the repository is named <filename>poky</filename>:
<literallayout class='monospaced'>
$ git clone git://git.yoctoproject.org/poky
$ cd poky
</literallayout>
Alternatively, you can start with the downloaded Poky "&DISTRO_NAME;" tarball.
These commands unpack the tarball into a source directory structure.
By default, the top-level directory of the source directory is named
<filename>&YOCTO_POKY;</filename>:
<literallayout class='monospaced'>
$ tar xfj &YOCTO_POKY_TARBALL;
$ cd &YOCTO_POKY;
</literallayout>
<note><para>If you're using the tarball method, you can ignore all the following steps that
ask you to carry out Git operations.
You already have the results of those operations
in the form of the &DISTRO_NAME; release tarballs.
Consequently, there is nothing left to do other than extract those tarballs into the
proper locations.</para>
<para>Once you expand the released tarball, you have a snapshot of the Git repository
that represents a specific release.
Fundamentally, this is different than having a local copy of the Poky Git repository.
Given the tarball method, changes you make are building on top of a release.
With the Git repository method you have the ability to track development
and keep changes in revision control.
See the
"<link linkend='repositories-tags-and-branches'>Repositories, Tags, and Branches</link>" section
for more discussion around these differences.</para></note>
</para>
<para>
With the local <filename>poky</filename> Git repository set up,
you have all the development branches available to you from which you can work.
Next, you need to be sure that your local repository reflects the exact
release in which you are interested.
From inside the repository you can see the development branches that represent
areas of development that have diverged from the main (master) branch
at some point, such as a branch to track a maintenance release's development.
You can also see the tag names used to mark snapshots of stable releases or
points in the repository.
Use the following commands to list out the branches and the tags in the repository,
respectively.
<literallayout class='monospaced'>
$ git branch -a
$ git tag -l
</literallayout>
For this example, we are going to use the Yocto Project &DISTRO; Release, which is code
named "&DISTRO_NAME;".
To make sure we have a local area (branch in Git terms) on our machine that
reflects the &DISTRO; release, we can use the following commands:
<literallayout class='monospaced'>
$ cd ~/poky
$ git fetch --tags
$ git checkout &DISTRO_NAME;-&POKYVERSION; -b &DISTRO_NAME;
Switched to a new branch '&DISTRO_NAME;'
</literallayout>
The <filename>git fetch --tags</filename> is somewhat redundant since you just set
up the repository and should have all the tags.
The <filename>fetch</filename> command makes sure all the tags are available in your
local repository.
The Git <filename>checkout</filename> command with the <filename>-b</filename> option
creates a local branch for you named <filename>&DISTRO_NAME;</filename>.
Your local branch begins in the same state as the Yocto Project &DISTRO; released tarball
marked with the <filename>&DISTRO_NAME;-&POKYVERSION;</filename> tag in the source repositories.
</para>
</section>
<section id='choosing-a-base-bsp-app'>
<title>Choosing a Base BSP</title>
<para>
For this example, the base BSP is the <trademark class='registered'>Intel</trademark>
<trademark class='trade'>Atom</trademark> Processor E660 with Intel Platform
Controller Hub EG20T Development Kit, which is otherwise referred to as "Crown Bay."
The BSP layer is <filename>meta-crownbay</filename>.
The base BSP is simply the BSP
we will be using as a starting point, so don't worry if you don't actually have Crown Bay
hardware.
The remainder of the example transforms the base BSP into a BSP that should be
able to boot on generic atom-pc (netbook) hardware.
</para>
<para>
For information on how to choose a base BSP, see
"<link linkend='developing-a-board-support-package-bsp'>Developing a Board Support Package (BSP)</link>".
</para>
</section>
<section id='getting-your-base-bsp-app'>
<title>Getting Your Base BSP</title>
<para>
You need to have the base BSP layer on your development system.
Similar to the local <link linkend='source-directory'>source directory</link>,
you can get the BSP
layer in a couple of different ways:
download the BSP tarball and extract it, or set up a local Git repository that
has the BSP layers.
You should use the same method that you used to set up the source directory earlier.
See "<link linkend='getting-setup'>Getting Setup</link>" for information on how to get
the BSP files.
</para>
<para>
This example assumes the BSP layer will be located within a directory named
<filename>meta-intel</filename> contained within the <filename>poky</filename>
parent directory.
The following steps will automatically create the
<filename>meta-intel</filename> directory and the contained
<filename>meta-crownbay</filename> starting point in both the Git and the tarball cases.
</para>
<para>
If you're using the Git method, you could do the following to create
the starting layout after you have made sure you are in the <filename>poky</filename>
directory created in the previous steps:
<literallayout class='monospaced'>
$ git clone git://git.yoctoproject.org/meta-intel.git
$ cd meta-intel
</literallayout>
Alternatively, you can start with the downloaded Crown Bay tarball.
You can download the &DISTRO_NAME; version of the BSP tarball from the
<ulink url='&YOCTO_HOME_URL;/download'>Download</ulink> page of the
Yocto Project website.
Here is the specific link for the tarball needed for this example:
<ulink url='&YOCTO_MACHINES_DL_URL;/crownbay-noemgd/crownbay-noemgd-&DISTRO_NAME;-&POKYVERSION;.tar.bz2'></ulink>.
Again, be sure that you are already in the <filename>poky</filename> directory
as described previously before installing the tarball:
<literallayout class='monospaced'>
$ tar xfj crownbay-noemgd-&DISTRO_NAME;-&POKYVERSION;.tar.bz2
$ cd meta-intel
</literallayout>
</para>
<para>
The <filename>meta-intel</filename> directory contains all the metadata
that supports BSP creation.
If you're using the Git method, the following
step will switch to the &DISTRO_NAME; metadata.
If you're using the tarball method, you already have the correct metadata and can
skip to the next step.
Because <filename>meta-intel</filename> is its own Git repository, you will want
to be sure you are in the appropriate branch for your work.
For this example we are going to use the <filename>&DISTRO_NAME;</filename> branch.
<literallayout class='monospaced'>
$ git checkout -b &DISTRO_NAME; origin/&DISTRO_NAME;
Branch &DISTRO_NAME; set up to track remote branch &DISTRO_NAME; from origin.
Switched to a new branch '&DISTRO_NAME;'
</literallayout>
</para>
</section>
<section id='making-a-copy-of-the-base bsp-to-create-your-new-bsp-layer-app'>
<title>Making a Copy of the Base BSP to Create Your New BSP Layer</title>
<para>
Now that you have set up the source directory and included the base BSP files, you need to
create a new layer for your BSP.
To create your BSP layer, you simply copy the <filename>meta-crownbay</filename>
layer to a new layer.
</para>
<para>
For this example, the new layer will be named <filename>meta-mymachine</filename>.
The name should follow the BSP layer naming convention, which is
<filename>meta-&lt;name&gt;</filename>.
The following assumes your working directory is <filename>meta-intel</filename>
inside your source directory.
To start your new layer, just copy the new layer alongside the existing
BSP layers in the <filename>meta-intel</filename> directory:
<literallayout class='monospaced'>
$ cp -a meta-crownbay/ meta-mymachine
</literallayout>
</para>
</section>
<section id='making-changes-to-your-bsp-app'>
<title>Making Changes to Your BSP</title>
<para>
Right now you have two identical BSP layers with different names:
<filename>meta-crownbay</filename> and <filename>meta-mymachine</filename>.
You need to change your configurations so that they work for your new BSP and
your particular hardware.
The following sections look at each of these areas of the BSP.
</para>
<section id='changing-the-bsp-configuration'>
<title>Changing the BSP Configuration</title>
<para>
We will look first at the configurations, which are all done in the layers
<filename>conf</filename> directory.
</para>
<para>
First, since in this example the new BSP will not support EMGD, we will get rid of the
<filename>crownbay.conf</filename> file and then rename the
<filename>crownbay-noemgd.conf</filename> file to <filename>mymachine.conf</filename>.
Much of what we do in the configuration directory is designed to help the OpenEmbedded
build system work with the new layer and to be able to find and use the right software.
The following two commands result in a single machine configuration file named
<filename>mymachine.conf</filename>.
<literallayout class='monospaced'>
$ rm meta-mymachine/conf/machine/crownbay.conf
$ mv meta-mymachine/conf/machine/crownbay-noemgd.conf \
meta-mymachine/conf/machine/mymachine.conf
</literallayout>
</para>
<para>
Next, we need to make changes to the <filename>mymachine.conf</filename> itself.
The only changes we want to make for this example are to the comment lines.
Changing comments, of course, is never strictly necessary, but it's alway good form to make
them reflect reality as much as possible.
Here, simply substitute the Crown Bay name with an appropriate name for the BSP
(<filename>mymachine</filename> in this case) and change the description to
something that describes your hardware.
</para>
<para>
Note that inside the <filename>mymachine.conf</filename> is the
<filename>PREFERRED_VERSION_linux-yocto</filename> statement.
This statement identifies the kernel that the BSP is going to use.
In this case, the BSP is using <filename>linux-yocto</filename>, which is the
current Yocto Project kernel based on the Linux 3.2 release.
</para>
<para>
The next configuration file in the new BSP layer we need to edit is
<filename>meta-mymachine/conf/layer.conf</filename>.
This file identifies build information needed for the new layer.
You can see the
"<ulink url='&YOCTO_DOCS_BSP_URL;#bsp-filelayout-layer'>Layer Configuration File</ulink>" section
in The Board Support Packages (BSP) Development Guide for more information on this configuration file.
Basically, we are changing the existing statements to work with our BSP.
</para>
<para>
The file contains these statements that reference the Crown Bay BSP:
<literallayout class='monospaced'>
BBFILE_COLLECTIONS += "crownbay"
BBFILE_PATTERN_crownbay := "^${LAYERDIR}/"
BBFILE_PRIORITY_crownbay = "6"
LAYERDEPENDS_crownbay = "intel"
</literallayout>
</para>
<para>
Simply substitute the machine string name <filename>crownbay</filename>
with the new machine name <filename>mymachine</filename> to get the following:
<literallayout class='monospaced'>
BBFILE_COLLECTIONS += "mymachine"
BBFILE_PATTERN_mymachine := "^${LAYERDIR}/"
BBFILE_PRIORITY_mymachine = "6"
LAYERDEPENDS_mymachine = "intel"
</literallayout>
</para>
</section>
<section id='changing-the-recipes-in-your-bsp'>
<title>Changing the Recipes in Your BSP</title>
<para>
Now we will take a look at the recipes in your new layer.
The standard BSP structure has areas for BSP, graphics, core, and kernel recipes.
When you create a BSP, you use these areas for appropriate recipes and append files.
Recipes take the form of <filename>.bb</filename> files, while append files take
the form of <filename>.bbappend</filename> files.
If you want to leverage the existing recipes the OpenEmbedded build system uses
but change those recipes, you can use <filename>.bbappend</filename> files.
All new recipes and append files for your layer must go in the layers
<filename>recipes-bsp</filename>, <filename>recipes-kernel</filename>,
<filename>recipes-core</filename>, and
<filename>recipes-graphics</filename> directories.
</para>
<section id='changing-recipes-bsp'>
<title>Changing&nbsp;&nbsp;<filename>recipes-bsp</filename></title>
<para>
First, let's look at <filename>recipes-bsp</filename>.
For this example we are not adding any new BSP recipes.
And, we only need to remove the formfactor we do not want and change the name of
the remaining one that doesn't support EMGD.
These commands take care of the <filename>recipes-bsp</filename> recipes:
<literallayout class='monospaced'>
$ rm -rf meta-mymachine/recipes-bsp/formfactor/formfactor/crownbay
$ mv meta-mymachine/recipes-bsp/formfactor/formfactor/crownbay-noemgd/ \
meta-mymachine/recipes-bsp/formfactor/formfactor/mymachine
</literallayout>
</para>
</section>
<section id='changing-recipes-graphics'>
<title>Changing&nbsp;&nbsp;<filename>recipes-graphics</filename></title>
<para>
Now let's look at <filename>recipes-graphics</filename>.
For this example we want to remove anything that supports EMGD and
be sure to rename remaining directories appropriately.
The following commands clean up the <filename>recipes-graphics</filename> directory:
<literallayout class='monospaced'>
$ rm -rf meta-mymachine/recipes-graphics/xorg-xserver/xserver-xf86-config/crownbay
$ mv meta-mymachine/recipes-graphics/xorg-xserver/xserver-xf86-config/crownbay-noemgd \
meta-mymachine/recipes-graphics/xorg-xserver/xserver-xf86-config/mymachine
</literallayout>
</para>
<para>
At this point the <filename>recipes-graphics</filename> directory just has files that
support Video Electronics Standards Association (VESA) graphics modes and not EMGD.
</para>
</section>
<section id='changing-recipes-core'>
<title>Changing&nbsp;&nbsp;<filename>recipes-core</filename></title>
<para>
Now let's look at changes in <filename>recipes-core</filename>.
The file <filename>task-core-tools.bbappend</filename> in
<filename>recipes-core/tasks</filename> appends the similarly named recipe
located in the <link linkend='source-directory'>source directory</link> at
<filename>meta/recipes-core/tasks</filename>.
The append file in our layer right now is Crown Bay-specific and supports
EMGD and non-EMGD.
Here are the contents of the file:
<literallayout class='monospaced'>
RRECOMMENDS_task-core-tools-profile_append_crownbay = " systemtap"
RRECOMMENDS_task-core-tools-profile_append_crownbay-noemgd = " systemtap"
</literallayout>
</para>
<para>
The <filename>RRECOMMENDS</filename> statements list packages that
extend usability.
The first <filename>RRECOMMENDS</filename> statement can be removed, while the
second one can be changed to reflect <filename>meta-mymachine</filename>:
<literallayout class='monospaced'>
RRECOMMENDS_task-core-tools-profile_append_mymachine = " systemtap"
</literallayout>
</para>
</section>
<section id='changing-recipes-kernel'>
<title>Changing&nbsp;&nbsp;<filename>recipes-kernel</filename></title>
<para>
Finally, let's look at <filename>recipes-kernel</filename> changes.
Recall that the BSP uses the <filename>linux-yocto</filename> kernel as determined
earlier in the <filename>mymachine.conf</filename>.
The recipe for that kernel is not located in the
BSP layer but rather in the source directory at
<filename>meta/recipes-kernel/linux</filename> and is
named <filename>linux-yocto_3.2.bb</filename>.
The <filename>SRCREV_machine</filename> and <filename>SRCREV_meta</filename>
statements point to the exact commits used by the Yocto Project development team
in their source repositories that identify the right kernel for our hardware.
In other words, the <filename>SRCREV</filename> values are simply Git commit
IDs that identify which commit on each
of the kernel branches (machine and meta) will be checked out and used to build
the kernel.
</para>
<para>
However, in the <filename>meta-mymachine</filename> layer in
<filename>recipes-kernel/linux</filename> resides a <filename>.bbappend</filename>
file named <filename>linux-yocto_3.2.bbappend</filename> that
appends information to the recipe of the same name in <filename>meta/recipes-kernel/linux</filename>.
Thus, the <filename>SRCREV</filename> statements in the append file override
the more general statements found in <filename>meta</filename>.
</para>
<para>
The <filename>SRCREV</filename> statements in the append file currently identify
the kernel that supports the Crown Bay BSP with and without EMGD support.
Here are the statements:
<note>The commit ID strings used in this manual might not match the actual commit
ID strings found in the <filename>linux-yocto_3.2.bbappend</filename> file.
For the example, this difference does not matter.</note>
<literallayout class='monospaced'>
SRCREV_machine_pn-linux-yocto_crownbay ?= \
"211fc7f4d10ec2b82b424286aabbaff9254b7cbd"
SRCREV_meta_pn-linux-yocto_crownbay ?= \
"514847185c78c07f52e02750fbe0a03ca3a31d8f"
SRCREV_machine_pn-linux-yocto_crownbay-noemgd ?= \
"211fc7f4d10ec2b82b424286aabbaff9254b7cbd"
SRCREV_meta_pn-linux-yocto_crownbay-noemgd ?= \
"514847185c78c07f52e02750fbe0a03ca3a31d8f"
</literallayout>
</para>
<para>
You will notice that there are two pairs of <filename>SRCREV</filename> statements.
The top pair identifies the kernel that supports
EMGD, which we dont care about in this example.
The bottom pair identifies the kernel that we will use:
<filename>linux-yocto</filename>.
At this point though, the unique commit strings all are still associated with
Crown Bay and not <filename>meta-mymachine</filename>.
</para>
<para>
To fix this situation in <filename>linux-yocto_3.2.bbappend</filename>,
we delete the two <filename>SRCREV</filename> statements that support
EMGD (the top pair).
We also change the remaining pair to specify <filename>mymachine</filename>
and insert the commit identifiers to identify the kernel in which we
are interested, which will be based on the <filename>atom-pc-standard</filename>
kernel.
In this case, because we're working with the &DISTRO_NAME; branch of everything, we
need to use the <filename>SRCREV</filename> values for the atom-pc branch
that are associated with the &DISTRO_NAME; release.
To find those values, we need to find the <filename>SRCREV</filename>
values that &DISTRO_NAME; uses for the atom-pc branch, which we find in the
<filename>poky/meta-yocto/recipes-kernel/linux/linux-yocto_3.2.bbappend</filename>
file.
</para>
<para>
The machine <filename>SRCREV</filename> we want is in the
<filename>SRCREV_machine_atom-pc</filename> variable.
The meta <filename>SRCREV</filename> isn't specified in this file, so it must be
specified in the base kernel recipe in the
<filename>poky/meta/recipes-kernel/linux/linux-yocto_3.2.bb</filename>
file, in the <filename>SRCREV_meta</filename> variable found there.
Here are the final <filename>SRCREV</filename> statements:
<literallayout class='monospaced'>
SRCREV_machine_pn-linux-yocto_mymachine ?= \
"f29531a41df15d74be5ad47d958e4117ca9e489e"
SRCREV_meta_pn-linux-yocto_mymachine ?= \
"b14a08f5c7b469a5077c10942f4e1aec171faa9d"
</literallayout>
</para>
<para>
In this example, we're using the <filename>SRCREV</filename> values we
found already captured in the &DISTRO_NAME; release because we're creating a BSP based on
&DISTRO_NAME;.
If, instead, we had based our BSP on the master branches, we would want to use
the most recent <filename>SRCREV</filename> values taken directly from the kernel repo.
We will not be doing that for this example.
However, if you do base a future BSP on master and
if you are familiar with Git repositories, you probably wont have trouble locating the
exact commit strings in the Yocto Project source repositories you need to change
the <filename>SRCREV</filename> statements.
You can find all the <filename>machine</filename> and <filename>meta</filename>
branch points (commits) for the <filename>linux-yocto-3.2</filename> kernel at
<ulink url='&YOCTO_GIT_URL;/cgit/cgit.cgi/linux-yocto-3.2'></ulink>.
</para>
<para>
If you need a little more assistance after going to the link then do the following:
<orderedlist>
<listitem><para>Expand the list of branches by clicking <filename>[…]</filename></para></listitem>
<listitem><para>Click on the <filename>standard/default/common-pc/atom-pc</filename>
branch</para></listitem>
<listitem><para>Click on the commit column header to view the top commit</para></listitem>
<listitem><para>Copy the commit string for use in the
<filename>linux-yocto_3.2.bbappend</filename> file</para></listitem>
</orderedlist>
</para>
<para>
For the <filename>SRCREV</filename> statement that points to the <filename>meta</filename>
branch use the same procedure except expand the <filename>meta</filename>
branch in step 2 above.
</para>
<para>
Also in the <filename>linux-yocto_3.2.bbappend</filename> file are
<ulink url='&YOCTO_DOCS_REF_URL;#var-COMPATIBLE_MACHINE'><filename>COMPATIBLE_MACHINE</filename></ulink>,
<ulink url='&YOCTO_DOCS_REF_URL;#var-KMACHINE'><filename>KMACHINE</filename></ulink>,
and
<ulink url='&YOCTO_DOCS_REF_URL;#var-KBRANCH'><filename>KBRANCH</filename></ulink> statements.
Two sets of these exist: one set supports EMGD and one set does not.
Because we are not interested in supporting EMGD those three can be deleted.
The remaining three must be changed so that <filename>mymachine</filename> replaces
<filename>crownbay-noemgd</filename> and <filename>crownbay</filename>.
Because we are using the <filename>atom-pc</filename> branch for this new BSP, we can also find
the exact branch we need for the <filename>KMACHINE</filename>
and <filename>KBRANCH</filename> variables in our new BSP from the value
we find in the
<filename>poky/meta-yocto/recipes-kernel/linux/linux-yocto_3.2.bbappend</filename>
file we looked at in a previous step.
In this case, the values we want are in the <filename>KMACHINE_atom-pc</filename> variable
and the <filename>KBRANCH_atom-pc</filename> variables in that file.
Here is the final <filename>linux-yocto_3.2.bbappend</filename> file after all
the edits:
<literallayout class='monospaced'>
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
COMPATIBLE_MACHINE_mymachine = "mymachine"
KMACHINE_mymachine = "atom-pc"
KBRANCH_mymachine = "standard/default/common-pc/atom-pc"
SRCREV_machine_pn-linux-yocto_mymachine ?= \
"f29531a41df15d74be5ad47d958e4117ca9e489e"
SRCREV_meta_pn-linux-yocto_mymachine ?= \
"b14a08f5c7b469a5077c10942f4e1aec171faa9d"
</literallayout>
</para>
</section>
</section>
<section id='bsp-recipe-change-summary'>
<title>BSP Recipe Change Summary</title>
<para>
In summary, the edits to the layers recipe files result in removal of any files and
statements that do not support your targeted hardware in addition to the inclusion
of any new recipes you might need.
In this example, it was simply a matter of ridding the new layer
<filename>meta-mymachine</filename> of any code that supported the EMGD features
and making sure we were identifying the kernel that supports our example, which
is the <filename>atom-pc-standard</filename> kernel.
We did not introduce any new recipes to the layer.
</para>
<para>
Finally, it is also important to update the layers <filename>README</filename>
file so that the information in it reflects your BSP.
</para>
</section>
</section>
<section id='preparing-for-the-build-app'>
<title>Preparing for the Build</title>
<para>
To get ready to build your image that uses the new layer you need to do the following:
<orderedlist>
<listitem><para>Get the environment ready for the build by sourcing the environment
script.
The environment script is in the top-level of the source directory.
The script has the string
<filename>init-build-env</filename> in the files name.
For this example, the following command gets the build environment ready:
<literallayout class='monospaced'>
$ source oe-init-build-env yocto-build
</literallayout>
When you source the script, a build directory is created in the current
working directory.
In our example we were in the <filename>poky</filename> directory.
Thus, entering the previous command created the <filename>yocto-build</filename> directory.
If you do not provide a name for the build directory it defaults to
<filename>build</filename>.
The <filename>yocto-build</filename> directory contains a
<filename>conf</filename> directory that has
two configuration files you will need to check: <filename>bblayers.conf</filename>
and <filename>local.conf</filename>.</para></listitem>
<listitem><para>Check and edit the resulting <filename>local.conf</filename> file.
This file minimally identifies the machine for which to build the image by
configuring the <filename>MACHINE</filename> variable.
For this example you must set the variable to mymachine as follows:
<literallayout class='monospaced'>
MACHINE ??= “mymachine”
</literallayout>
You should also be sure any other variables in which you are interested are set.
Some variables to consider are <filename>BB_NUMBER_THREADS</filename>
and <filename>PARALLEL_MAKE</filename>, both of which can greatly reduce your build time
if your development system supports multiple cores.
For development systems that support multiple cores, a good rule of thumb is to set
both the <filename>BB_NUMBER_THREADS</filename> and <filename>PARALLEL_MAKE</filename>
variables to twice the number of cores your system supports.</para></listitem>
<listitem><para>Update the <filename>bblayers.conf</filename> file so that it includes
both the path to your new BSP layer and the path to the
<filename>meta-intel</filename> layer.
In this example, you need to include both these paths as part of the
<filename>BBLAYERS</filename> variable:
<literallayout class='monospaced'>
$HOME/poky/meta-intel
$HOME/poky/meta-intel/meta-mymachine
</literallayout></para></listitem>
</orderedlist>
</para>
<para>
The
<ulink url='&YOCTO_DOCS_REF_URL;#ref-variables-glos'>Variables Glossary</ulink> chapter in the
Yocto Project Reference Manual has more information on configuration variables.
</para>
</section>
<section id='building-the-image-app'>
<title>Building and Booting the Image</title>
<para>
To build the image for our <filename>meta-mymachine</filename> BSP enter the following command
from the same shell from which you ran the setup script.
You should run the <filename>bitbake</filename> command without any intervening shell commands.
For example, moving your working directory around could cause problems.
Here is the command for this example:
<literallayout class='monospaced'>
$ bitbake -k core-image-sato
</literallayout>
</para>
<para>
This command specifies an image that has Sato support and that can be run from a USB device or
from a CD without having to first install anything.
The build process takes significant time and includes thousands of tasks, which are reported
at the console.
If the build results in any type of error you should check for misspellings in the
files you changed or problems with your host development environment such as missing packages.
</para>
<para>
Finally, once you have an image, you can try booting it from a device
(e.g. a USB device).
To prepare a bootable USB device, insert a USB flash drive into your build system and
copy the <filename>.hddimg</filename> file, located in the
<filename>poky/build/tmp/deploy/images</filename>
directory after a successful build to the flash drive.
Assuming the USB flash drive takes device <filename>/dev/sdf</filename>,
use <filename>dd</filename> to copy the live image to it.
For example:
<literallayout class='monospaced'>
# dd if=core-image-sato-mymachine-20111101223904.hddimg of=/dev/sdf
# sync
# eject /dev/sdf
</literallayout>
You should now have a bootable USB flash device.
</para>
<para>
Insert the device
into a bootable USB socket on the target, and power it on.
The system should boot to the Sato graphical desktop.
<footnote><para>Because
this new image is not in any way tailored to the system you're
booting it on, which is assumed to be some sort of atom-pc (netbook) system for this
example, it might not be completely functional though it should at least boot to a text
prompt.
Specifically, it might fail to boot into graphics without some tweaking.
If this ends up being the case, a possible next step would be to replace the
<filename>mymachine.conf</filename>
contents with the contents of <filename>atom-pc.conf</filename> and replace
<filename>xorg.conf</filename> with <filename>atom-pc xorg.conf</filename>
in <filename>meta-yocto</filename> and see if it fares any better.
In any case, following the previous steps will give you a buildable image that
will probably boot on most systems.
Getting things working like you want
them to for your hardware will normally require some amount of experimentation with
configuration settings.</para></footnote>
</para>
<para>
For reference, the sato image produced by the previous steps for &DISTRO_NAME;
should look like the following in terms of size.
If your sato image is much different from this,
you probably made a mistake in one of the above steps:
<literallayout class='monospaced'>
260538368 2012-04-27 01:44 core-image-sato-mymachine-20120427025051.hddimg
</literallayout>
<note>The previous instructions are also present in the README that was copied
from meta-crownbay, which should also be updated to reflect the specifics of your
new BSP.
That file and the <filename>README.hardware</filename> file in the top-level
<filename>poky</filename> directory
also provides some suggestions for things to try if booting fails and produces
strange error messages.</note>
</para>
</section>
</appendix>
<!--
vim: expandtab tw=80 ts=4
-->

File diff suppressed because it is too large Load Diff

View File

@@ -23,9 +23,9 @@
</para>
<para>
The Yocto Project Development Manual, however, does provide detailed examples
on how to change the kernel source code, reconfigure the kernel, and develop
an application using the popular <trademark class='trade'>Eclipse</trademark> IDE.
The Yocto Project Development Manual, however, does provide detailed examples on how to create a
Board Support Package (BSP), change the kernel source code, and reconfigure the kernel.
You can find this information in the appendices of the manual.
</para>
</section>
@@ -44,7 +44,7 @@
<listitem><para>Development case overviews for both system development and user-space
applications.</para></listitem>
<listitem><para>An overview and understanding of the emulation environment used with
the Yocto Project - the Quick EMUlator (QEMU).</para></listitem>
the Yocto Project (QEMU).</para></listitem>
<listitem><para>An understanding of basic kernel architecture and concepts.</para></listitem>
<listitem><para>Many references to other sources of related information.</para></listitem>
</itemizedlist>
@@ -59,10 +59,9 @@
<itemizedlist>
<listitem><para>Step-by-step instructions if those instructions exist in other Yocto
Project documentation.
For example, the Yocto Project Application Developer's Guide contains detailed
instruction on how to run the
<ulink url='&YOCTO_DOCS_ADT_URL;#installing-the-adt'>Installing the ADT and Toolchains</ulink>,
which is used to set up a cross-development environment.</para></listitem>
For example, the Yocto Project Development Manual contains detailed
instruction on how to obtain and configure the
<trademark class='trade'>Eclipse</trademark> Yocto Plug-in.</para></listitem>
<listitem><para>Reference material.
This type of material resides in an appropriate reference manual.
For example, system variables are documented in the
@@ -115,7 +114,7 @@
<ulink url='&YOCTO_WIKI_URL;/wiki/FAQ'>FAQ</ulink>:</emphasis>
A list of commonly asked questions and their answers.</para></listitem>
<listitem><para><emphasis>
<ulink url='&YOCTO_HOME_URL;/download/yocto/yocto-project-&DISTRO;-release-notes-poky-&POKYVERSION;'>
<ulink url='&YOCTO_HOME_URL;/download/yocto/yocto-project-1.1-release-notes-poky-&POKYVERSION;'>
Release Notes</ulink>:</emphasis> Features, updates and known issues for the current
release of the Yocto Project.</para></listitem>
<listitem><para><emphasis>
@@ -170,13 +169,11 @@
BitBake</ulink>:</emphasis> The tool used by the OpenEmbedded build system
to process project metadata.</para></listitem>
<listitem><para><emphasis>
BitBake User Manual:</emphasis>
A comprehensive guide to the BitBake tool.
If you want information on BitBake, see the user manual inculded in the
<filename>bitbake/doc/manual</filename> directory of the
<link linkend='source-directory'>Source Directory</link>.</para></listitem>
<ulink url='&BITBAKE_DOCS_URL;'>
BitBake User Manual</ulink>:</emphasis> A comprehensive guide to the BitBake tool.
</para></listitem>
<listitem><para><emphasis>
<ulink url='http://wiki.qemu.org/Index.html'>Quick EMUlator (QEMU)</ulink>:
<ulink url='http://wiki.qemu.org/Index.html'>QEMU</ulink>:
</emphasis> An open-source machine emulator and virtualizer.</para></listitem>
</itemizedlist>
</para>

View File

@@ -12,13 +12,6 @@
or even altering the source code itself.
This appendix presents simple examples that modify the kernel source code,
change the kernel configuration, and add a kernel source recipe.
<note>
You can use the <filename>yocto-kernel</filename> script
found in the <link linkend='source-directory'>Source Directory</link>
under <filename>scripts</filename> to manage kernel patches and configuration.
See the "<ulink url='&YOCTO_DOCS_BSP_URL;#managing-kernel-patches-and-config-items-with-yocto-kernel'>Managing kernel Patches and Config Items with yocto-kernel</ulink>"
section in the Yocto Project Board Support Packages (BSP) Developer's Guide for
more information.</note>
</para>
<section id='modifying-the-kernel-source-code'>
@@ -41,11 +34,11 @@
Briefly, you need the following:
<itemizedlist>
<listitem><para>A local
<link linkend='source-directory'>Source Directory</link> for the
<link linkend='source-directory'>source directory</link> for the
poky Git repository</para></listitem>
<listitem><para>Local copies of the
<link linkend='poky-extras-repo'><filename>poky-extras</filename></link>
Git repository placed within the Source Directory.</para></listitem>
Git repository placed within the source directory.</para></listitem>
<listitem><para>A bare clone of the
<link linkend='local-kernel-files'>Yocto Project Kernel</link> upstream Git
repository to which you want to push your modifications.
@@ -66,7 +59,7 @@
</para>
<para>
<imagedata fileref="figures/kernel-example-repos-generic.png" width="7in" depth="5in"
<imagedata fileref="figures/kernel-example-repos-denzil.png" width="7in" depth="5in"
align="center" scale="100" />
</para>
@@ -76,18 +69,16 @@
<listitem><para><emphasis>Local Source Directory:</emphasis>
This area contains all the metadata that supports building images
using the OpenEmbedded build system.
In this example, the
<link linkend='source-directory'>Source Directory</link> also
contains the
<link linkend='build-directory'>Build Directory</link>,
which contains the configuration directory
In this example, the source directory also
contains the build directory, which contains the configuration directory
that lets you control the build.
Also in this example, the Source Directory contains local copies of the
Also in this example, the source directory contains local copies of the
<filename>poky-extras</filename> Git repository.</para>
<para>See the bulleted item
"<link linkend='local-yp-release'>Yocto Project Release</link>"
for information on how to get these files on your local system.</para></listitem>
<listitem><para><emphasis>Local copies of the&nbsp;<filename>poky-extras</filename>&nbsp;Git Repository:</emphasis>
<listitem><para><emphasis>Local copies of the<filename>poky-extras</filename>
Git Repository:</emphasis>
This area contains the <filename>meta-kernel-dev</filename> layer,
which is where you make changes that append the kernel build recipes.
You edit <filename>.bbappend</filename> files to locate your
@@ -134,19 +125,17 @@
<title>Setting Up the Local Source Directory</title>
<para>
You can set up the
<link linkend='source-directory'>Source Directory</link>
through tarball extraction or by
You can set up the source directory through tarball extraction or by
cloning the <filename>poky</filename> Git repository.
This example uses <filename>poky</filename> as the root directory of the
local Source Directory.
local source directory.
See the bulleted item
"<link linkend='local-yp-release'>Yocto Project Release</link>"
for information on how to get these files.
</para>
<para>
Once you have Source Directory set up,
Once you have source directory set up,
you have many development branches from which you can work.
From inside the local repository you can see the branch names and the tag names used
in the upstream Git repository by using either of the following commands:
@@ -172,7 +161,7 @@
<para>
This example creates a local copy of the <filename>poky-extras</filename> Git
repository inside the <filename>poky</filename> Source Directory.
repository inside the <filename>poky</filename> source directory.
See the bulleted item "<link linkend='poky-extras-repo'>The
<filename>poky-extras</filename> Git Repository</link>"
for information on how to set up a local copy of the
@@ -183,12 +172,11 @@
Because this example uses the Yocto Project &DISTRO; Release code
named "&DISTRO_NAME;", which maps to the <filename>&DISTRO_NAME;</filename>
branch in the repository, you need to be sure you are using that
branch for <filename>poky-extras</filename>.
branch for <filename>poky-extra</filename>.
The following commands create and checkout the local
branch you are using for the <filename>&DISTRO_NAME;</filename>
branch:
<literallayout class='monospaced'>
$ cd ~/poky/poky-extras
$ git checkout -b &DISTRO_NAME; origin/&DISTRO_NAME;
Branch &DISTRO_NAME; set up to track remote branch &DISTRO_NAME; from origin.
Switched to a new branch '&DISTRO_NAME;'
@@ -200,7 +188,7 @@
<title>Setting Up the Bare Clone and its Copy</title>
<para>
This example modifies the <filename>linux-yocto-3.4</filename> kernel.
This example modifies the <filename>linux-yocto-3.2</filename> kernel.
Thus, you need to create a bare clone of that kernel and then make a copy of the
bare clone.
See the bulleted item
@@ -212,16 +200,17 @@
The bare clone exists for the kernel build tools and simply as the receiving end
of <filename>git push</filename>
commands after you make edits and commits inside the copy of the clone.
The copy (<filename>my-linux-yocto-3.4-work</filename> in this example) has to have
The copy (<filename>my-linux-yocto-3.2-work</filename> in this example) has to have
a local branch created and checked out for your work.
This example uses <filename>common-pc-base</filename> as the local branch.
The following commands create and checkout the branch:
<literallayout class='monospaced'>
$ cd ~/my-linux-yocto-3.4-work
$ git checkout -b standard-common-pc-base origin/standard/common-pc/base
Branch standard-common-pc-base set up to track remote branch
standard/common-pc/base from origin.
Switched to a new branch 'standard-common-pc-base'
$ cd ~/my-linux-yocto-3.2-work
$ git checkout -b common-pc-base origin/standard/default/common-pc/base
Checking out files: 100% (532/532), done.
Branch common-pc-base set up to track remote branch
standard/default/common-pc/base from origin.
Switched to a new branch 'common-pc-base'
</literallayout>
</para>
</section>
@@ -235,7 +224,7 @@
<note>
Because a full build can take hours, you should check two variables in the
<filename>build</filename> directory that is created after you source the
<filename>&OE_INIT_FILE;</filename> script.
<filename>oe-init-build-env</filename> script.
You can find these variables
<filename>BB_NUMBER_THREADS</filename> and <filename>PARALLEL_MAKE</filename>
in the <filename>build/conf</filename> directory in the
@@ -253,36 +242,11 @@
If necessary, the script creates the build directory:
<literallayout class='monospaced'>
$ cd ~/poky
$ source &OE_INIT_FILE;
You had no conf/local.conf file. This configuration file has therefore been
created for you with some default values. You may wish to edit it to use a
different MACHINE (target hardware) or enable parallel build options to take
advantage of multiple cores for example. See the file for more information as
common configuration options are commented.
$ source oe-init-build-env
The Yocto Project has extensive documentation about OE including a reference manual
which can be found at:
http://yoctoproject.org/documentation
### Shell environment set up for builds. ###
For more information about OpenEmbedded see their website:
http://www.openembedded.org/
You had no conf/bblayers.conf file. The configuration file has been created for
you with some default values. To add additional metadata layers into your
configuration please add entries to this file.
The Yocto Project has extensive documentation about OE including a reference manual
which can be found at:
http://yoctoproject.org/documentation
For more information about OpenEmbedded see their website:
http://www.openembedded.org/
### Shell environment set up for builds. ###
You can now run 'bitbake &lt;target&gt;>'
You can now run 'bitbake &lt;target&gt;'
Common targets are:
core-image-minimal
@@ -337,7 +301,7 @@
<para>
The file you change in this example is named <filename>calibrate.c</filename>
and is located in the <filename>my-linux-yocto-3.4-work</filename> Git repository
and is located in the <filename>my-linux-yocto-3.2-work</filename> Git repository
(the copy of the bare clone) in <filename>init</filename>.
This example simply inserts several <filename>printk</filename> statements
at the beginning of the <filename>calibrate_delay</filename> function.
@@ -401,7 +365,7 @@
<para>
The following command pushes the changes to the bare clone:
<literallayout class='monospaced'>
$ git push origin standard-common-pc-base:standard/default/common-pc/base
$ git push origin common-pc-base:standard/default/common-pc/base
</literallayout>
</para>
</section>
@@ -456,25 +420,21 @@
BBLAYERS = " \
/home/scottrif/poky/meta \
/home/scottrif/poky/meta-yocto \
/home/scottrif/poky/meta-yocto-bsp \
/home/scottrif/poky/poky-extras/meta-kernel-dev \
"
</literallayout></para></listitem>
<listitem><para><emphasis>Identify Your Source Files:</emphasis> In the
<filename>linux-yocto_3.4.bbappend</filename> file located in the
<filename>linux-yocto_3.2.bbappend</filename> file located in the
<filename>poky-extras/meta-kernel-dev/recipes-kernel/linux</filename>
directory, you need to identify the location of the
local source code, which in this example is the bare clone named
<filename>linux-yocto-3.4.git</filename>.
<filename>linux-yocto-3.2.git</filename>.
To do this, set the <filename>KSRC_linux_yocto</filename> variable to point to your
local <filename>linux-yocto-3.4.git</filename> Git repository by adding the
local <filename>linux-yocto-3.2.git</filename> Git repository by adding the
following statement.
Also, be sure the <filename>SRC_URI</filename> variable is pointing to
your kernel source files by removing the comment.
Finally, be sure to substitute your user information in the statement:
Be sure to substitute your user information in the statement:
<literallayout class='monospaced'>
KSRC_linux_yocto_3_4 ?= "/home/scottrif/linux-yocto-3.4.git"
SRC_URI = "git://${KSRC_linux_yocto_3_4};protocol=file;nocheckout=1;branch=${KBRANCH},meta;name=machine,meta"
KSRC_linux_yocto_3_2 ?= "/home/scottrif/linux-yocto-3.2.git"
</literallayout></para></listitem>
</itemizedlist>
</para>
@@ -487,7 +447,7 @@
comment out the <filename>COMPATIBLE_MACHINE</filename> statements in all
unused <filename>.bbappend</filename> files, or simply remove (or rename) all the files
except the one your are using for the build
(i.e. <filename>linux-yocto_3.4.bbappend</filename> in this example).</para>
(i.e. <filename>linux-yocto_3.2.bbappend</filename> in this example).</para>
<para>If you do not make one of these two adjustments, your machine will be compatible
with all the kernel recipes in the <filename>meta-kernel-dev</filename> layer.
When your machine is comapatible with all the kernel recipes, the build attempts
@@ -504,11 +464,11 @@
Do the following:
<orderedlist>
<listitem><para>Your environment should be set up since you previously sourced
the <filename>&OE_INIT_FILE;</filename> script.
the <filename>oe-init-build-env</filename> script.
If it isn't, source the script again from <filename>poky</filename>.
<literallayout class='monospaced'>
$ cd ~/poky
$ source &OE_INIT_FILE;
$ source oe-init-build-env
</literallayout>
</para></listitem>
<listitem><para>Be sure old images are cleaned out by running the
@@ -546,6 +506,299 @@
</para>
</section>
</section>
<section id='changing-the-kernel-configuration'>
<title>Changing the Kernel Configuration</title>
<para>
This example changes the default behavior, which is "on", of the Symmetric
Multi-processing Support (<filename>CONFIG_SMP</filename>) to "off".
It is a simple example that demonstrates how to reconfigure the kernel.
</para>
<section id='getting-set-up-to-run-this-example'>
<title>Getting Set Up to Run this Example</title>
<para>
If you took the time to work through the example that modifies the kernel source code
in "<link linkend='modifying-the-kernel-source-code'>Modifying the Kernel Source
Code</link>" you should already have the source directory set up on your
host machine.
If this is the case, go to the next section, which is titled
"<link linkend='examining-the-default-config-smp-behavior'>Examining the Default
<filename>CONFIG_SMP</filename> Behavior</link>", and continue with the
example.
</para>
<para>
If you don't have the source directory established on your system,
you can get them through tarball extraction or by
cloning the <filename>poky</filename> Git repository.
This example uses <filename>poky</filename> as the root directory of the
<link linkend='source-directory'>source directory</link>.
See the bulleted item
"<link linkend='local-yp-release'>Yocto Project Release</link>"
for information on how to get these files.
</para>
<para>
Once you have the local copy of the repository set up,
you have many development branches from which you can work.
From inside the repository you can see the branch names and the tag names used
in the upstream Git repository using either of the following commands:
<literallayout class='monospaced'>
$ cd poky
$ git branch -a
$ git tag -l
</literallayout>
This example uses the Yocto Project &DISTRO; Release code named "&DISTRO_NAME;",
which maps to the <filename>&DISTRO_NAME;</filename> branch in the repository.
The following commands create and checkout the local <filename>&DISTRO_NAME;</filename>
branch:
<literallayout class='monospaced'>
$ git checkout -b &DISTRO_NAME; origin/&DISTRO_NAME;
Branch &DISTRO_NAME; set up to track remote branch &DISTRO_NAME; from origin.
Switched to a new branch '&DISTRO_NAME;'
</literallayout>
</para>
<para>
Next, you need to build the default <filename>qemux86</filename> image that you
can boot using QEMU.
<note>
Because a full build can take hours, you should check two variables in the
<filename>build</filename> directory that is created after you source the
<filename>oe-init-build-env</filename> script.
You can find these variables
<filename>BB_NUMBER_THREADS</filename> and <filename>PARALLEL_MAKE</filename>
in the <filename>build/conf</filename> directory in the
<filename>local.conf</filename> configuration file.
By default, these variables are commented out.
If your host development system supports multi-core and multi-thread capabilities,
you can uncomment these statements and set the variables to significantly shorten
the full build time.
As a guideline, set both the <filename>BB_NUMBER_THREADS</filename> and the
<filename>PARALLEL_MAKE</filename> variables to twice the number
of cores your machine supports.
</note>
The following two commands <filename>source</filename> the build environment setup script
and build the default <filename>qemux86</filename> image.
If necessary, the script creates the build directory:
<literallayout class='monospaced'>
$ cd ~/poky
$ source oe-init-build-env
### Shell environment set up for builds. ###
You can now run 'bitbake &lt;target&gt;'
Common targets are:
core-image-minimal
core-image-sato
meta-toolchain
meta-toolchain-sdk
adt-installer
meta-ide-support
You can also run generated qemu images with a command like 'runqemu qemux86'
</literallayout>
</para>
<para>
The following <filename>bitbake</filename> command starts the build:
<literallayout class='monospaced'>
$ bitbake -k core-image-minimal
</literallayout>
<note>Be sure to check the settings in the <filename>local.conf</filename>
before starting the build.</note>
</para>
</section>
<section id='examining-the-default-config-smp-behavior'>
<title>Examining the Default&nbsp;&nbsp;<filename>CONFIG_SMP</filename> Behavior</title>
<para>
By default, <filename>CONFIG_SMP</filename> supports multiple processor machines.
To see this default setting from within the QEMU emulator, boot your image using
the emulator as follows:
<literallayout class='monospaced'>
$ runqemu qemux86 qemuparams="-smp 4"
</literallayout>
</para>
<para>
Login to the machine using <filename>root</filename> with no password.
After logging in, enter the following command to see how many processors are
being supported in the emulator.
The emulator reports support for the number of processors you specified using
the <filename>-smp</filename> option, four in this case:
<literallayout class='monospaced'>
# cat /proc/cpuinfo | grep processor
processor : 0
processor : 1
processor : 2
processor : 3
#
</literallayout>
To check the setting for <filename>CONFIG_SMP</filename>, you can use the
following command:
<literallayout class='monospaced'>
zcat /proc/config.gz | grep CONFIG_SMP
</literallayout>
The console returns the following showing that multi-processor machine support
is set:
<literallayout class='monospaced'>
CONFIG_SMP=y
</literallayout>
Logout of the emulator using the <filename>exit</filename> command and
then close it down.
</para>
</section>
<section id='changing-the-config-smp-configuration-using-menuconfig'>
<title>Changing the&nbsp;&nbsp;<filename>CONFIG_SMP</filename> Configuration Using&nbsp;&nbsp;<filename>menuconfig</filename></title>
<para>
The <filename>menuconfig</filename> tool provides an interactive method with which
to set kernel configurations.
You need to run <filename>menuconfig</filename> inside the Yocto BitBake environment.
Thus, the environment must be set up using the <filename>oe-init-build-env</filename>
script found in the build directory.
If you have not sourced this script do so with the following commands:
<literallayout class='monospaced'>
$ cd ~/poky
$ source oe-init-build-env
</literallayout>
</para>
<para>
After setting up the environment to run <filename>menuconfig</filename>, you are ready
to use the tool to interactively change the kernel configuration.
In this example, we are basing our changes on the <filename>linux-yocto-3.2</filename>
kernel.
The OpenEmbedded build system recognizes this kernel as
<filename>linux-yocto</filename>.
Thus, the following commands from the shell in which you previously sourced the
environment initialization script cleans the shared state cache and the
<ulink url='&YOCTO_DOCS_REF_URL;#var-WORKDIR'><filename>WORKDIR</filename></ulink>
directory and then builds and launches <filename>menuconfig</filename>:
<literallayout class='monospaced'>
$ bitbake linux-yocto -c menuconfig
</literallayout>
</para>
<para>
Once <filename>menuconfig</filename> launches, navigate through the user interface
to find the <filename>CONFIG_SMP</filename> configuration setting.
You can find it at <filename>Processor Type and Features</filename>.
The configuration selection is
<filename>Symmetric Multi-processing Support</filename>.
After using the arrow keys to highlight this selection, press "n" to turn it off.
Then, exit out and save your selections.
</para>
<para>
Once you save the selection, the <filename>.config</filename> configuration file
is updated.
This is the file that the build system uses to configure the Yocto Project kernel
when it is built.
You can find and examine this file in the build directory.
This example uses the following:
<literallayout class='monospaced'>
~/poky/build/tmp/work/qemux86-poky-linux/linux-yocto-3.2.11+git1+84f...
...656ed30-r1/linux-qemux86-standard-build
</literallayout>
<note>
The previous example directory is artificially split and many of the characters
in the actual filename are omitted in order to make it more readable.
Also, depending on the kernel you are using, the exact pathname might differ
slightly.
</note>
</para>
<para>
Within the <filename>.config</filename> file, you can see the following setting:
<literallayout class='monospaced'>
# CONFIG_SMP is not set
</literallayout>
</para>
<para>
A good method to isolate changed configurations is to use a combination of the
<filename>menuconfig</filename> tool and simple shell commands.
Before changing configurations with <filename>menuconfig</filename>, copy the
existing <filename>.config</filename> and rename it to something else,
use <filename>menuconfig</filename> to make
as many changes an you want and save them, then compare the renamed configuration
file against the newly created file.
You can use the resulting differences as your base to create configuration fragments
to permanently save in your kernel layer.
<note>
Be sure to make a copy of the <filename>.config</filename> and don't just
rename it.
The build system needs an existing <filename>.config</filename>
from which to work.
</note>
</para>
</section>
<section id='recompiling-the-kernel-and-testing-the-new-configuration'>
<title>Recompiling the Kernel and Testing the New Configuration</title>
<para>
At this point, you are ready to recompile your kernel image with
the new setting in effect using the BitBake command below:
<literallayout class='monospaced'>
$ bitbake linux-yocto
</literallayout>
</para>
<para>
Now run the QEMU emulator and pass it the same multi-processor option as before:
<literallayout class='monospaced'>
$ runqemu qemux86 qemuparams="-smp 4"
</literallayout>
</para>
<para>
Login to the machine using <filename>root</filename> with no password
and test for the number of processors the kernel supports:
<literallayout class='monospaced'>
# cat /proc/cpuinfo | grep processor
processor : 0
#
</literallayout>
</para>
<para>
From the output, you can see that the kernel no longer supports multi-processor systems.
The output indicates support for a single processor. You can verify the
<filename>CONFIG_SMP</filename> setting by using this command:
<literallayout class='monospaced'>
zcat /proc/config.gz | grep CONFIG_SMP
</literallayout>
The console returns the following output:
<literallayout class='monospaced'>
# CONFIG_SMP is not set
</literallayout>
You have successfully reconfigured the kernel.
</para>
</section>
</section>
<section id='adding-kernel-recipes'>
<title>Adding Kernel Recipes</title>
<para>
A future release of this manual will present an example that adds kernel recipes, which provide
new functionality to the kernel.
</para>
<para>
<imagedata fileref="figures/wip.png"
width="2in" depth="3in" align="center" scalefit="1" />
</para>
</section>
</appendix>
<!--

File diff suppressed because it is too large Load Diff

View File

@@ -75,12 +75,12 @@
Experience shows that buildbot is a good fit for this role.
What works well is to configure buildbot to make two types of builds:
incremental and full (from scratch).
See <ulink url='http://autobuilder.yoctoproject.org:8010/'>Welcome to the buildbot for the
See <ulink url='http://autobuilder.yoctoproject.org:8010/'>the buildbot for the
Yocto Project</ulink> for an example implementation that uses buildbot.
</para>
<para>
You can tie an incremental build to a commit hook that triggers the build
You can tie incremental builds to a commit hook that triggers the build
each time a commit is made to the metadata.
This practice results in useful acid tests that determine whether a given commit
breaks the build in some serious way.
@@ -130,7 +130,7 @@
From the interface, you can click on any particular item in the "Name" column and
see the URL at the bottom of the page that you need to set up a Git repository for
that particular item.
Having a local Git repository of the Source Directory (poky) allows you to
Having a local Git repository of the source directory (poky) allows you to
make changes, contribute to the history, and ultimately enhance the Yocto Project's
tools, Board Support Packages, and so forth.
</para>
@@ -148,7 +148,7 @@
<ulink url='&YOCTO_HOME_URL;/download'>download page</ulink> and get a
tarball of the release.
You can also go to this site to download any supported BSP tarballs.
Unpacking the tarball gives you a hierarchical Source Directory that lets you develop
Unpacking the tarball gives you a hierarchical source directory that lets you develop
using the Yocto Project.
</para>
@@ -170,7 +170,7 @@
<listitem><para><anchor id='index-downloads' /><emphasis><ulink url='&YOCTO_DL_URL;/releases/'>Index of /releases:</ulink></emphasis>
This area contains index releases such as
the <trademark class='trade'>Eclipse</trademark>
Yocto Plug-in, miscellaneous support, poky, pseudo, installers for cross-development toolchains,
Yocto Plug-in, miscellaneous support, poky, pseudo, cross-development toolchains,
and all released versions of Yocto Project in the form of images or tarballs.
Downloading and extracting these files does not produce a local copy of the
Git repository but rather a snapshot of a particular release or image.</para>
@@ -207,44 +207,43 @@
<filename>formfactor_0.0.bb</filename> and <filename>formfactor_0.0.bbappend</filename>).
</para>
<para>Information in append files overrides the information in the similarly-named recipe file.
For an example of an append file in use, see the
"<link linkend='using-bbappend-files'>Using .bbappend Files</link>" section.
</para></listitem>
<listitem><para id='bitbake-term'><emphasis>BitBake:</emphasis>
The task executor and scheduler used by
For examples of <filename>.bbappend</filename> file in use, see the
"<link linkend='using-bbappend-files'>Using .bbappend Files</link>" and
"<link linkend='changing-recipes-kernel'>Changing <filename>recipes-kernel</filename></link>"
sections.</para></listitem>
<listitem><para><emphasis>BitBake:</emphasis> The task executor and scheduler used by
the OpenEmbedded build system to build images.
For more information on BitBake, see the BitBake documentation
in the <filename>bitbake/doc/manual</filename> directory of the
<link linkend='source-directory'>Source Directory</link>.</para></listitem>
For more information on BitBake, see the <ulink url='&BITBAKE_DOCS_URL;'>
BitBake documentation</ulink>.</para></listitem>
<listitem>
<para id='build-directory'><emphasis>Build Directory:</emphasis>
This term refers to the area used by the OpenEmbedded build system for builds.
The area is created when you <filename>source</filename> the setup
environment script that is found in the Source Directory
(i.e. <filename>&OE_INIT_FILE;</filename>).
environment script that is found in the source directory
(i.e. <filename>oe-init-build-env</filename>).
The <ulink url='&YOCTO_DOCS_REF_URL;#var-TOPDIR'><filename>TOPDIR</filename></ulink>
variable points to the Build Directory.</para>
variable points to the build directory.</para>
<para>You have a lot of flexibility when creating the Build Directory.
<para>You have a lot of flexibility when creating the build directory.
Following are some examples that show how to create the directory:
<itemizedlist>
<listitem><para>Create the Build Directory in your current working directory
<listitem><para>Create the build directory in your current working directory
and name it <filename>build</filename>.
This is the default behavior.
<literallayout class='monospaced'>
$ source &OE_INIT_PATH;
$ source oe-init-build-env
</literallayout></para></listitem>
<listitem><para>Provide a directory path and specifically name the build
directory.
This next example creates a Build Directory named <filename>YP-&POKYVERSION;</filename>
This next example creates a build directory named <filename>YP-&POKYVERSION;</filename>
in your home directory within the directory <filename>mybuilds</filename>.
If <filename>mybuilds</filename> does not exist, the directory is created for you:
<literallayout class='monospaced'>
$ source &OE_INIT_PATH; $HOME/mybuilds/YP-&POKYVERSION;
</literallayout></para></listitem>
<listitem><para>Provide an existing directory to use as the Build Directory.
<listitem><para>Provide an existing directory to use as the build directory.
This example uses the existing <filename>mybuilds</filename> directory
as the Build Directory.
as the build directory.
<literallayout class='monospaced'>
$ source &OE_INIT_PATH; $HOME/mybuilds/
</literallayout></para></listitem>
@@ -254,7 +253,7 @@
this term refers to the OpenEmbedded build system used by the project.
This build system is based on the project known as "Poky."
For some historical information about Poky, see the
<link linkend='poky'>Poky</link> term further along in this section.
<link linkend='poky'>poky</link> term further along in this section.
</para></listitem>
<listitem><para><emphasis>Classes:</emphasis> Files that provide for logic encapsulation
and inheritance allowing commonly used patterns to be defined once and easily used
@@ -264,14 +263,14 @@
<listitem><para><emphasis>Configuration File:</emphasis> Configuration information in various
<filename>.conf</filename> files provides global definitions of variables.
The <filename>conf/local.conf</filename> configuration file in the
<link linkend='build-directory'>Build Directory</link>
<link linkend='build-directory'>build directory</link>
contains user-defined variables that affect each build.
The <filename>meta-yocto/conf/distro/poky.conf</filename> configuration file
defines Yocto distro configuration
variables used only when building with this policy.
Machine configuration files, which
are located throughout the
<link linkend='source-directory'>Source Directory</link>, define
<link linkend='source-directory'>source directory</link>, define
variables for specific hardware and are only used when building for that target
(e.g. the <filename>machine/beagleboard.conf</filename> configuration file defines
variables for the Texas Instruments ARM Cortex-A8 development board).
@@ -282,16 +281,16 @@
tools and utilities that allow you to develop software for targeted architectures.
This toolchain contains cross-compilers, linkers, and debuggers that are specific to
an architecture.
You can use the OpenEmbedded build system to build a cross-development toolchain
installer that when run installs the toolchain that contains the development tools you
need to cross-compile and test your software.
The Yocto Project ships with images that contain installers for
toolchains for supported architectures as well.
You can use the OpenEmbedded build system to build cross-development toolchains in tarball
form that, when
unpacked, contain the development tools you need to cross-compile and test your software.
The Yocto Project ships with images that contain toolchains for supported architectures
as well.
Sometimes this toolchain is referred to as the meta-toolchain.</para></listitem>
<listitem><para><emphasis>Image:</emphasis> An image is the result produced when
BitBake processes a given collection of recipes and related metadata.
Images are the binary output that run on specific hardware or QEMU
and for specific use cases.
Images are the binary output that run on specific hardware and for specific
use cases.
For a list of the supported image types that the Yocto Project provides, see the
"<ulink url='&YOCTO_DOCS_REF_URL;#ref-images'>Images</ulink>"
chapter in the Yocto Project Reference Manual.</para></listitem>
@@ -303,36 +302,22 @@
<listitem><para id='metadata'><emphasis>Metadata:</emphasis> The files that BitBake parses when
building an image.
Metadata includes recipes, classes, and configuration files.</para></listitem>
<listitem><para id='oe-core'><emphasis>OE-Core:</emphasis> A core set of metadata originating
<listitem><para><emphasis>OE-Core:</emphasis> A core set of metadata originating
with OpenEmbedded (OE) that is shared between OE and the Yocto Project.
This metadata is found in the <filename>meta</filename> directory of the source
directory.</para></listitem>
<listitem><para><emphasis>Package:</emphasis> In the context of the Yocto Project,
this term refers to the packaged output from a baked recipe.
<listitem><para><emphasis>Package:</emphasis> The packaged output from a baked recipe.
A package is generally the compiled binaries produced from the recipe's sources.
You bake something by running it through BitBake.</para>
<para>It is worth noting that the term "package" can, in general, have subtle
meanings. For example, the packages refered to in the
"<ulink url='&YOCTO_DOCS_QS_URL;#packages'>The Packages</ulink>" section are
compiled binaries that when installed add functionality to your Linux
distribution.</para>
<para>Another point worth noting is that historically within the Yocto Project,
recipes were referred to as packages - thus, the existence of several BitBake
variables that are seemingly mis-named,
(e.g. <ulink url='&YOCTO_DOCS_REF_URL;#var-PR'><filename>PR</filename></ulink>,
<ulink url='&YOCTO_DOCS_REF_URL;#var-PRINC'><filename>PRINC</filename></ulink>,
<ulink url='&YOCTO_DOCS_REF_URL;#var-PV'><filename>PV</filename></ulink>, and
<ulink url='&YOCTO_DOCS_REF_URL;#var-PE'><filename>PE</filename></ulink>).
</para></listitem>
You bake something by running it through BitBake.</para></listitem>
<listitem><para id='poky'><emphasis>Poky:</emphasis> The term "poky" can mean several things.
In its most general sense, it is an open-source project that was initially developed
In its most general sence, it is an open-source project that was initially developed
by OpenedHand. With OpenedHand, poky was developed off of the existing OpenEmbedded
build system becoming a build system for embedded images.
After Intel Corporation aquired OpenedHand, the project poky became the basis for
the Yocto Project's build system.
Within the Yocto Project source repositories, poky exists as a separate Git repository
that can be cloned to yield a local copy on the host system.
Thus, "poky" can refer to the local copy of the Source Directory used to develop within
Thus, "poky" can refer to the local copy of the source directory used to develop within
the Yocto Project.</para></listitem>
<listitem><para><emphasis>Recipe:</emphasis> A set of instructions for building packages.
A recipe describes where you get source code and which patches to apply.
@@ -344,20 +329,19 @@
<para id='source-directory'><emphasis>Source Directory:</emphasis>
This term refers to the directory structure created as a result of either downloading
and unpacking a Yocto Project release tarball or creating a local copy of
the <filename>poky</filename> Git repository
<filename>git://git.yoctoproject.org/poky</filename>.
<filename>poky</filename> Git repository <filename>git://git.yoctoproject.org/poky</filename>.
Sometimes you might here the term "poky directory" used to refer to this
directory structure.</para>
<para>The Source Directory contains BitBake, Documentation, metadata and
<para>The source directory contains BitBake, Documentation, metadata and
other files that all support the Yocto Project.
Consequently, you must have the Source Directory in place on your development
Consequently, you must have the source directory in place on your development
system in order to do any development using the Yocto Project.</para>
<para>For tarball expansion, the name of the top-level directory of the Source Directory
<para>For tarball expansion, the name of the top-level directory of the source directory
is derived from the Yocto Project release tarball.
For example, downloading and unpacking <filename>&YOCTO_POKY_TARBALL;</filename>
results in a Source Directory whose top-level folder is named
results in a source directory whose top-level folder is named
<filename>&YOCTO_POKY;</filename>.
If you create a local copy of the Git repository, then you can name the repository
anything you like.
@@ -366,22 +350,22 @@
So, for example, cloning the <filename>poky</filename> Git repository results in a
local Git repository whose top-level folder is also named <filename>poky</filename>.</para>
<para>It is important to understand the differences between the Source Directory created
<para>It is important to understand the differences between the source directory created
by unpacking a released tarball as compared to cloning
<filename>git://git.yoctoproject.org/poky</filename>.
When you unpack a tarball, you have an exact copy of the files based on the time of
release - a fixed release point.
Any changes you make to your local files in the Source Directory are on top of the release.
Any changes you make to your local files in the source directory are on top of the release.
On the other hand, when you clone the <filename>poky</filename> Git repository, you have an
active development repository.
In this case, any local changes you make to the Source Directory can be later applied
In this case, any local changes you make to the source directory can be later applied
to active development branches of the upstream <filename>poky</filename> Git
repository.</para>
<para>Finally, if you want to track a set of local changes while starting from the same point
as a release tarball, you can create a local Git branch that
reflects the exact copy of the files at the time of their release.
You do this by using Git tags that are part of the repository.</para>
You do this using Git tags that are part of the repository.</para>
<para>For more information on concepts around Git repositories, branches, and tags,
see the
@@ -432,13 +416,13 @@
</para>
<para>
When you build an image using the Yocto Project, the build process uses a
known list of licenses to ensure compliance.
When you build an image using Yocto Project, the build process uses a known list of licenses to
ensure compliance.
You can find this list in the Yocto Project files directory at
<filename>meta/files/common-licenses</filename>.
Once the build completes, the list of all licenses found and used during that build are
kept in the
<link linkend='build-directory'>Build Directory</link> at
<link linkend='build-directory'>build directory</link> at
<filename>tmp/deploy/images/licenses</filename>.
</para>
@@ -466,12 +450,6 @@
<ulink url='&YOCTO_GIT_URL;/cgit/cgit.cgi/poky/tree/meta/files/common-licenses'>here</ulink>.
This wiki page discusses the license infrastructure used by the Yocto Project.
</para>
<para>
For information that can help you to maintain compliance with various open source licensing
during the lifecycle of a product created using the Yocto Project, see the
"<link linkend='maintaining-open-source-license-compliance-during-your-products-lifecycle'>Maintaining Open Source License Compliance During Your Product's Lifecycle</link>" section.
</para>
</section>
<section id='git'>
@@ -535,9 +513,10 @@
It is important to understand that Git tracks content change and not files.
Git uses "branches" to organize different development efforts.
For example, the <filename>poky</filename> repository has
<filename>bernard</filename>,
<filename>edison</filename>, <filename>denzil</filename>, <filename>danny</filename>
and <filename>master</filename> branches among others.
<filename>laverne</filename>, <filename>bernard</filename>,
<filename>edison</filename>, <filename>denzil</filename> and
<filename>master</filename> branches among
others.
You can see all the branches by going to
<ulink url='&YOCTO_GIT_URL;/cgit.cgi/poky/'></ulink> and
clicking on the
@@ -582,8 +561,9 @@
at the time you created your local branch, which could be
different than the files at the time of a similarly named release.
In other words, creating and checking out a local branch based on the
<filename>&DISTRO_NAME;</filename> branch name is not the same as
cloning and checking out the <filename>master</filename> branch.
<filename>&DISTRO_NAME;</filename> branch name is not the same as creating and
checking out a local branch based on the <filename>&DISTRO_NAME;-&DISTRO;</filename>
release.
Keep reading to see how you create a local snapshot of a Yocto Project Release.
</para>
@@ -599,7 +579,7 @@
</para>
<para>
Some key tags are <filename>bernard-5.0</filename>, <filename>denzil-7.0</filename>,
Some key tags are <filename>laverne-4.0</filename>, <filename>bernard-5.0</filename>,
and <filename>&DISTRO_NAME;-&POKYVERSION;</filename>.
These tags represent Yocto Project releases.
</para>
@@ -681,18 +661,17 @@
a working branch on your local machine where you can isolate work.
It is a good idea to use local branches when adding specific features or changes.
This way if you dont like what you have done you can easily get rid of the work.</para></listitem>
<listitem><para><emphasis><filename>git branch</filename>:</emphasis> Reports
existing local branches and
tells you the branch in which you are currently working.</para></listitem>
<listitem><para><emphasis><filename>git branch</filename>:</emphasis> Reports existing branches and
tells you which branch in which you are currently working.</para></listitem>
<listitem><para><emphasis><filename>git branch -D &lt;branch-name&gt;</filename>:</emphasis>
Deletes an existing local branch.
You need to be in a local branch other than the one you are deleting
in order to delete <filename>&lt;branch-name&gt;</filename>.</para></listitem>
Deletes an existing branch.
You need to be in a branch other than the one you are deleting
in order to delete &lt;branch-name&gt;.</para></listitem>
<listitem><para><emphasis><filename>git pull</filename>:</emphasis> Retrieves information
from an upstream Git
repository and places it in your local Git repository.
You use this command to make sure you are synchronized with the repository
from which you are basing changes (.e.g. the master branch).</para></listitem>
from which you are basing changes (.e.g. the master repository).</para></listitem>
<listitem><para><emphasis><filename>git push</filename>:</emphasis> Sends all your local changes you
have committed to an upstream Git repository (e.g. a contribution repository).
The maintainer of the project draws from these repositories when adding your changes to the
@@ -774,8 +753,6 @@
A somewhat formal method exists by which developers commit changes and push them into the
"contrib" area and subsequently request that the maintainer include them into "master"
This process is called “submitting a patch” or “submitting a change.”
For information on submitting patches and changes, see the
"<link linkend='how-to-submit-a-change'>How to Submit a Change</link>" section.
</para>
<para>
@@ -838,18 +815,13 @@
<filename>send-pull-request</filename> that ship with the release to facilitate this
workflow.
You can find these scripts in the local Yocto Project files Git repository in
the <filename>scripts</filename> directory.</para>
<para>You can find more information on these scripts in the
"<link linkend='pushing-a-change-upstream'>Using
Scripts to Push a Change Upstream and Request a Pull</link>" section.
</para></listitem>
the <filename>scripts</filename> directory.</para></listitem>
<listitem><para><emphasis>Patch Workflow:</emphasis> This workflow allows you to notify the
maintainer through an email that you have a change (or patch) you would like considered
for the "master" branch of the Git repository.
To send this type of change you format the patch and then send the email using the Git commands
<filename>git format-patch</filename> and <filename>git send-email</filename>.
You can find information on how to submit changes
later in this chapter.</para></listitem>
You can find information on how to submit later in this chapter.</para></listitem>
</itemizedlist>
</para>
</section>
@@ -881,9 +853,8 @@
a bug.</para></listitem>
<listitem><para>When submitting a new bug, be sure to choose the appropriate
Classification, Product, and Component for which the issue was found.
Defects for Yocto Project fall into one of six classifications: Yocto Project
Components, Infrastructure, Build System &amp; Metadata, Documentation,
QA/Testing, and Runtime.
Defects for Yocto Project fall into one of four classifications: Yocto Projects,
Infrastructure, Poky, and Yocto Metadata Layers.
Each of these Classifications break down into multiple Products and, in some
cases, multiple Components.</para></listitem>
<listitem><para>Use the bug form to choose the correct Hardware and Architecture
@@ -932,8 +903,7 @@
<ulink url='&OE_LISTS_URL;/listinfo/bitbake-devel'>bitbake-devel</ulink> mailing list.</para></listitem>
<listitem><para>For changes to <filename>meta-yocto</filename>, send your patch to the
<ulink url='&YOCTO_LISTS_URL;/listinfo/poky'>poky</ulink> mailing list.</para></listitem>
<listitem><para>For changes to other layers hosted on
<filename>yoctoproject.org</filename> (unless the
<listitem><para>For changes to other layers hosted on yoctoproject.org (unless the
layer's documentation specifies otherwise), tools, and Yocto Project
documentation, use the
<ulink url='&YOCTO_LISTS_URL;/listinfo/yocto'>yocto</ulink> mailing list.</para></listitem>
@@ -997,8 +967,7 @@
should almost always provide a more detailed description of what you did (i.e.
the body of the commit message).
The only exceptions for not providing a detailed description would be if your
change is a simple, self-explanatory change that needs no further description
beyond the summary.
change is a simple, self-explanatory change that needs no description.
Here are the guidelines for composing a commit message:
<itemizedlist>
<listitem><para>Provide a single-line, short summary of the change.
@@ -1059,8 +1028,8 @@
pull requests to the Yocto Project.
These scripts are <filename>create-pull-request</filename> and
<filename>send-pull-request</filename>.
You can find these scripts in the <filename>scripts</filename> directory
within the <link linkend='source-directory'>Source Directory</link>.</para>
You can find these scripts in the <filename>scripts</filename> directory of the
Yocto Project file structure.</para>
<para>Using these scripts correctly formats the requests without introducing any
whitespace or HTML formatting.
The maintainer that receives your patches needs to be able to save and apply them

View File

@@ -32,7 +32,7 @@
<para>
You can use the OpenEmbedded build system, which uses
BitBake to develop complete Linux
<ulink url='&BITBAKE_DOCS_URL;'>BitBake</ulink>, to develop complete Linux
images and associated user-space applications for architectures based on ARM, MIPS, PowerPC,
x86 and x86-64.
While the Yocto Project does not provide a strict testing framework,
@@ -54,12 +54,7 @@
Linux-based host system.
You will have the best results with a recent release of Fedora,
OpenSUSE, Ubuntu, or CentOS as these releases are frequently tested against the Yocto Project
and officially supported.
For a list of the distributions under validation and their status, see the
"<ulink url='&YOCTO_DOCS_REF_URL;#detailed-supported-distros'>Supported Linux Distributions</ulink>" section
in the Yocto Project Reference Manual and the wiki page at
<ulink url='&YOCTO_WIKI_URL;/wiki/Distribution_Support'>Distribution Support</ulink>.</para>
<para>
and officially supported.
You should also have about 100 gigabytes of free disk space for building images.
</para></listitem>
<listitem><para><emphasis>Packages:</emphasis> The OpenEmbedded build system
@@ -70,12 +65,12 @@
for the supported distributions.</para></listitem>
<listitem id='local-yp-release'><para><emphasis>Yocto Project Release:</emphasis>
You need a release of the Yocto Project.
You set up a with local <link linkend='source-directory'>Source Directory</link>
You set up a with local <link linkend='source-directory'>source directory</link>
one of two ways depending on whether you
are going to contribute back into the Yocto Project or not.
<note>
Regardless of the method you use, this manual refers to the resulting local
hierarchical set of files as the "Source Directory."
hierarchical set of files as the "source directory."
</note>
<itemizedlist>
<listitem><para><emphasis>Tarball Extraction:</emphasis> If you are not going to contribute
@@ -84,7 +79,7 @@
Once you have the tarball, just extract it into a directory of your choice.</para>
<para>For example, the following command extracts the Yocto Project &DISTRO;
release tarball
into the current working directory and sets up the local Source Directory
into the current working directory and sets up the local source directory
with a top-level folder named <filename>&YOCTO_POKY;</filename>:
<literallayout class='monospaced'>
$ tar xfj &YOCTO_POKY_TARBALL;
@@ -124,26 +119,26 @@
If you are going to be making modifications to a supported Yocto Project kernel, you
need to establish local copies of the source.
You can find Git repositories of supported Yocto Project Kernels organized under
"Yocto Linux Kernel" in the Yocto Project Source Repositories at
"Yocto Project Linux Kernel" in the Yocto Project Source Repositories at
<ulink url='&YOCTO_GIT_URL;/cgit.cgi'></ulink>.</para>
<para>This setup can involve creating a bare clone of the Yocto Project kernel and then
<para>This setup involves creating a bare clone of the Yocto Project kernel and then
copying that cloned repository.
You can create the bare clone and the copy of the bare clone anywhere you like.
For simplicity, it is recommended that you create these structures outside of the
Source Directory (usually <filename>poky</filename>).</para>
source directory (usually <filename>poky</filename>).</para>
<para>As an example, the following transcript shows how to create the bare clone
of the <filename>linux-yocto-3.4</filename> kernel and then create a copy of
of the <filename>linux-yocto-3.2</filename> kernel and then create a copy of
that clone.
<note>When you have a local Yocto Project kernel Git repository, you can
reference that repository rather than the upstream Git repository as
part of the <filename>clone</filename> command.
Doing so can speed up the process.</note></para>
<para>In the following example, the bare clone is named
<filename>linux-yocto-3.4.git</filename>, while the
copy is named <filename>my-linux-yocto-3.4-work</filename>:
<filename>linux-yocto-3.2.git</filename>, while the
copy is named <filename>my-linux-yocto-3.2-work</filename>:
<literallayout class='monospaced'>
$ git clone --bare git://git.yoctoproject.org/linux-yocto-3.4 linux-yocto-3.4.git
Initialized empty Git repository in /home/scottrif/linux-yocto-3.4.git/
$ git clone --bare git://git.yoctoproject.org/linux-yocto-3.2 linux-yocto-3.2.git
Initialized empty Git repository in /home/scottrif/linux-yocto-3.2.git/
remote: Counting objects: 2468027, done.
remote: Compressing objects: 100% (392255/392255), done.
remote: Total 2468027 (delta 2071693), reused 2448773 (delta 2052498)
@@ -152,9 +147,9 @@
</literallayout></para>
<para>Now create a clone of the bare clone just created:
<literallayout class='monospaced'>
$ git clone linux-yocto-3.4.git my-linux-yocto-3.4-work
Cloning into 'my-linux-yocto-3.4-work'...
done.
$ git clone linux-yocto-3.2.git my-linux-yocto-3.2-work
Initialized empty Git repository in /home/scottrif/my-linux-yocto-3.2-work/.git/
Checking out files: 100% (37619/37619), done.
</literallayout></para></listitem>
<listitem id='poky-extras-repo'><para><emphasis>
The <filename>poky-extras</filename> Git Repository</emphasis>:
@@ -169,12 +164,11 @@
<para>You can find the <filename>poky-extras</filename> Git Repository in the
"Yocto Metadata Layers" area of the Yocto Project Source Repositories at
<ulink url='&YOCTO_GIT_URL;/cgit.cgi'></ulink>.
It is good practice to create this Git repository inside the Source Directory.</para>
It is good practice to create this Git repository inside the source directory.</para>
<para>Following is an example that creates the <filename>poky-extras</filename> Git
repository inside the Source Directory, which is named <filename>poky</filename>
repository inside the source directory, which is named <filename>poky</filename>
in this case:
<literallayout class='monospaced'>
$ cd ~/poky
$ git clone git://git.yoctoproject.org/poky-extras poky-extras
Initialized empty Git repository in /home/scottrif/poky/poky-extras/.git/
remote: Counting objects: 618, done.
@@ -193,13 +187,13 @@
layer.
You can get set up for BSP development one of two ways: tarball extraction or
with a local Git repository.
It is a good idea to use the same method that you used to set up the Source Directory.
It is a good idea to use the same method that you used to set up the source directory.
Regardless of the method you use, the Yocto Project uses the following BSP layer
naming scheme:
<literallayout class='monospaced'>
meta-&lt;BSP_name&gt;
</literallayout>
where <filename>&lt;BSP_name&gt;</filename> is the recognized BSP name.
where &lt;BSP_name&gt; is the recognized BSP name.
Here are some examples:
<literallayout class='monospaced'>
meta-crownbay
@@ -219,18 +213,17 @@
Again, this method just produces a snapshot of the BSP layer in the form
of a hierarchical directory structure.</para></listitem>
<listitem><para><emphasis>Git Repository Method:</emphasis> If you are working
with a local Git repository for your Source Directory, you should also use this method
with a local Git repository for your source directory, you should also use this method
to set up the <filename>meta-intel</filename> Git repository.
You can locate the <filename>meta-intel</filename> Git repository in the
"Yocto Metadata Layers" area of the Yocto Project Source Repositories at
<ulink url='&YOCTO_GIT_URL;/cgit.cgi'></ulink>.</para>
<para>Typically, you set up the <filename>meta-intel</filename> Git repository inside
the Source Directory.
the source directory.
For example, the following transcript shows the steps to clone the
<filename>meta-intel</filename>
Git repository inside the local <filename>poky</filename> Git repository.
<literallayout class='monospaced'>
$ cd ~/poky
$ git clone git://git.yoctoproject.org/meta-intel.git
Initialized empty Git repository in /home/scottrif/poky/meta-intel/.git/
remote: Counting objects: 3380, done.
@@ -267,13 +260,13 @@
<para>
The build process is as follows:
<orderedlist>
<listitem><para>Make sure you have set up the Source Directory described in the
<listitem><para>Make sure you have set up the source directory described in the
previous section.</para></listitem>
<listitem><para>Initialize the build environment by sourcing a build environment
script.</para></listitem>
<listitem><para>Optionally ensure the <filename>conf/local.conf</filename> configuration file,
which is found in the
<link linkend='build-directory'>Build Directory</link>,
<link linkend='build-directory'>build directory</link>,
is set up how you want it.
This file defines many aspects of the build environment including
the target machine architecture through the
@@ -284,9 +277,8 @@
a centralized tarball download directory through the
<filename><ulink url='&YOCTO_DOCS_REF_URL;#var-DL_DIR'>DL_DIR</ulink></filename> variable.</para></listitem>
<listitem><para>Build the image using the <filename>bitbake</filename> command.
If you want information on BitBake, see the user manual inculded in the
<filename>bitbake/doc/manual</filename> directory of the
<link linkend='source-directory'>Source Directory</link>.</para></listitem>
If you want information on BitBake, see the user manual at
<ulink url='&OE_DOCS_URL;/bitbake/html'></ulink>.</para></listitem>
<listitem><para>Run the image either on the actual hardware or using the QEMU
emulator.</para></listitem>
</orderedlist>
@@ -299,7 +291,7 @@
<para>
Another option you have to get started is to use pre-built binaries.
The Yocto Project provides many types of binaries with each release.
See the "<ulink url='&YOCTO_DOCS_REF_URL;#ref-images'>Images</ulink>"
See the <ulink url='&YOCTO_DOCS_REF_URL;#ref-images'>Images</ulink>
chapter in the Yocto Project Reference Manual
for descriptions of the types of binaries that ship with a Yocto Project
release.
@@ -320,9 +312,9 @@
Regardless of the type of image you are using, you need to download the pre-built kernel
that you will boot in the QEMU emulator and then download and extract the target root
filesystem for your target machines architecture.
You can get architecture-specific binaries and filesystems from
You can get architecture-specific binaries and filesystem from
<ulink url='&YOCTO_MACHINES_DL_URL;'>machines</ulink>.
You can get installation scripts for stand-alone toolchains from
You can get stand-alone toolchains from
<ulink url='&YOCTO_TOOLCHAIN_DL_URL;'>toolchains</ulink>.
Once you have all your files, you set up the environment to emulate the hardware
by sourcing an environment setup script.

View File

@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY % poky SYSTEM "../poky.ent"> %poky; ] >
<book id='dev-manual' lang='en'
<book id='dev-manual' lang='en'
xmlns:xi="http://www.w3.org/2003/XInclude"
xmlns="http://docbook.org/ns/docbook"
>
@@ -10,13 +10,13 @@
<mediaobject>
<imageobject>
<imagedata fileref='figures/dev-title.png'
format='SVG'
<imagedata fileref='figures/dev-title.png'
format='SVG'
align='left' scalefit='1' width='100%'/>
</imageobject>
</imageobject>
</mediaobject>
<title></title>
<title></title>
<authorgroup>
<author>
@@ -41,19 +41,9 @@
</revision>
<revision>
<revnumber>1.3</revnumber>
<date>October 2012</date>
<date>Sometime in 2012</date>
<revremark>Released with the Yocto Project 1.3 Release.</revremark>
</revision>
<revision>
<revnumber>1.3.1</revnumber>
<date>April 2013</date>
<revremark>Released with the Yocto Project 1.3.1 Release.</revremark>
</revision>
<revision>
<revnumber>1.3.2</revnumber>
<date>May 2013</date>
<revremark>Released with the Yocto Project 1.3.2 Release.</revremark>
</revision>
</revhistory>
<copyright>
@@ -63,9 +53,9 @@
<legalnotice>
<para>
Permission is granted to copy, distribute and/or modify this document under
Permission is granted to copy, distribute and/or modify this document under
the terms of the <ulink type="http" url="http://creativecommons.org/licenses/by-sa/2.0/uk/">
Creative Commons Attribution-Share Alike 2.0 UK: England &amp; Wales</ulink> as published by
Creative Commons Attribution-Share Alike 2.0 UK: England &amp; Wales</ulink> as published by
Creative Commons.
</para>
@@ -86,11 +76,15 @@
<xi:include href="dev-manual-newbie.xml"/>
<xi:include href="dev-manual-model.xml"/>
<xi:include href="dev-manual-common-tasks.xml"/>
<xi:include href="dev-manual-model.xml"/>
<xi:include href="dev-manual-bsp-appendix.xml"/>
<xi:include href="dev-manual-kernel-appendix.xml"/>
</book>
<!--
vim: expandtab tw=80 ts=4
<!--
vim: expandtab tw=80 ts=4
-->

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View File

@@ -320,7 +320,7 @@
Conceptually, configuration of a Yocto Project kernel occurs similarly to that needed for any
Linux kernel.
The build process for a Yocto Project kernel uses a <filename>.config</filename> file, which
is created through the Linux Kernel Configuration (LKC) tool.
is created through the Linux Kernel Coinfiguration (LKC) tool.
You can directly set various configurations in the
<filename>.config</filename> file by using the <filename>menuconfig</filename>
tool as built by BitBake.
@@ -344,7 +344,7 @@
After the tool is built, you can interact with it normally.
You can see how <filename>menuconfig</filename> is used to change a simple
kernel configuration in the
"<ulink url='&YOCTO_DOCS_DEV_URL;#configuring-the-kernel'>Configuring the Kernel</ulink>"
"<ulink url='&YOCTO_DOCS_DEV_URL;#changing-the-config-smp-configuration-using-menuconfig'>Changing the&nbsp;&nbsp;<filename>CONFIG_SMP</filename> Configuration Using&nbsp;&nbsp;<filename>menuconfig</filename></ulink>"
section of the Yocto Project Development Manual.
For general information on <filename>menuconfig</filename>, see
<ulink url='http://en.wikipedia.org/wiki/Menuconfig'></ulink>.

View File

@@ -55,9 +55,7 @@
"<ulink url='&YOCTO_DOCS_DEV_URL;#kernel-modification-workflow'>Kernel Modification Workflow</ulink>"
</para></listitem>
<listitem><para>
"<ulink url='&YOCTO_DOCS_DEV_URL;#patching-the-kernel'>Patching the Kernel</ulink>"</para></listitem>
<listitem><para>
"<ulink url='&YOCTO_DOCS_DEV_URL;#configuring-the-kernel'>Configuring the Kernel</ulink>"</para></listitem>
"<ulink url='&YOCTO_DOCS_DEV_URL;#dev-manual-kernel-appendix'>Kernel Modification Example</ulink>"</para></listitem>
</itemizedlist>
</para>

View File

@@ -159,9 +159,8 @@
</para>
<itemizedlist>
<listitem><para>The
<ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink> points
to the kernel Git repository.</para></listitem>
<listitem><para>The <filename>SRC_URI</filename> points to the kernel Git
repository.</para></listitem>
<listitem><para>A BSP build branch exists.
This branch has the following form:
<literallayout class='monospaced'>
@@ -785,9 +784,9 @@
This section overviews the process of creating a BSP based on an
existing similar BSP.
The information is introductory in nature and does not provide step-by-step examples.
For detailed information on how to create a new BSP, see
the "<ulink url='&YOCTO_DOCS_BSP_URL;#creating-a-new-bsp-layer-using-the-yocto-bsp-script'>Creating a New BSP Layer Using the yocto-bsp Script</ulink>" section in the
Yocto Project Board Support Package (BSP) Developer's Guide, or see the
For detailed information on how to create a BSP given an existing similar BSP, see
the "<ulink url='&YOCTO_DOCS_DEV_URL;#dev-manual-bsp-appendix'>BSP Development
Example</ulink>" appendix in the Yocto Project Development Manual, or see the
<ulink url='&YOCTO_WIKI_URL;/wiki/Transcript:_creating_one_generic_Atom_BSP_from_another'>Transcript:_creating_one_generic_Atom_BSP_from_another</ulink>
wiki page.
</para>
@@ -795,10 +794,9 @@
<para>
The basic steps you need to follow are:
<orderedlist>
<listitem><para><emphasis>Make sure you have set up a local Source Directory:</emphasis>
You must create a local
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>
by either creating a Git repository (recommended) or
<listitem><para><emphasis>Make sure you have set up a local source directory:</emphasis>
You must create a local <ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source
directory</ulink> by either creating a Git repository (recommended) or
extracting a Yocto Project release tarball.</para></listitem>
<listitem><para><emphasis>Choose an existing BSP available with the Yocto Project:</emphasis>
Try to map your board features as closely to the features of a BSP that is

View File

@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY % poky SYSTEM "../poky.ent"> %poky; ] >
<book id='kernel-manual' lang='en'
<book id='kernel-manual' lang='en'
xmlns:xi="http://www.w3.org/2003/XInclude"
xmlns="http://docbook.org/ns/docbook"
>
@@ -10,13 +10,13 @@
<mediaobject>
<imageobject>
<imagedata fileref='figures/kernel-title.png'
format='SVG'
<imagedata fileref='figures/kernel-title.png'
format='SVG'
align='left' scalefit='1' width='100%'/>
</imageobject>
</imageobject>
</mediaobject>
<title></title>
<title></title>
<authorgroup>
<author>
@@ -56,19 +56,9 @@
</revision>
<revision>
<revnumber>1.3</revnumber>
<date>October 2012</date>
<date>Sometime in 2012</date>
<revremark>Released with the Yocto Project 1.3 Release.</revremark>
</revision>
<revision>
<revnumber>1.3.1</revnumber>
<date>April 2013</date>
<revremark>Released with the Yocto Project 1.3.1 Release.</revremark>
</revision>
<revision>
<revnumber>1.3.2</revnumber>
<date>May 2013</date>
<revremark>Released with the Yocto Project 1.3.2 Release.</revremark>
</revision>
</revhistory>
<copyright>
@@ -78,7 +68,7 @@
<legalnotice>
<para>
Permission is granted to copy, distribute and/or modify this document under
Permission is granted to copy, distribute and/or modify this document under
the terms of the <ulink type="http" url="http://creativecommons.org/licenses/by-sa/2.0/uk/">Creative Commons Attribution-Share Alike 2.0 UK: England &amp; Wales</ulink> as published by Creative Commons.
</para>
<note>
@@ -104,6 +94,6 @@
-->
</book>
<!--
vim: expandtab tw=80 ts=4
<!--
vim: expandtab tw=80 ts=4
-->

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View File

@@ -13,16 +13,14 @@
</question>
<answer>
<para>
The term "Poky" refers to the specific reference build system that
the Yocto Project provides.
Poky is based on <ulink url='&YOCTO_DOCS_DEV_URL;#oe-core'>OE-Core</ulink>
and BitBake.
Thus, the generic term used here for the build system is
the "OpenEmbedded build system."
Development in the Yocto Project using Poky is closely tied to OpenEmbedded, with
changes always being merged to OE-Core or BitBake first before being pulled back
into Poky.
This practice benefits both projects immediately.
The term "Poky" is sometimes used to refer to the build system that the
Yocto Project uses.
The build system used in the Yocto project is referred to as the
OpenEmbedded build system because "Poky" was derived from <ulink
url='&OE_HOME_URL;'>OpenEmbedded</ulink>.
Poky is a stable, smaller subset focused on the mobile environment.
Development in the Yocto Project using Poky is closely tied to OpenEmbedded with
features being merged regularly between the two for mutual benefit.
For a fuller description of the term "Poky", see the
<ulink url='&YOCTO_DOCS_DEV_URL;#poky'>poky</ulink> term in the Yocto Project
Development Manual.
@@ -65,7 +63,7 @@
<qandaentry>
<question>
<para>
How can you claim Poky / OpenEmbedded-Core is stable?
How can you claim Poky is stable?
</para>
</question>
<answer>
@@ -73,13 +71,11 @@
There are three areas that help with stability;
<itemizedlist>
<listitem><para>The Yocto Project team keeps
<ulink url='&YOCTO_DOCS_DEV_URL;#oe-core'>OE-Core</ulink> small
and focused, containing around 830 recipes as opposed to the thousands
available in other OpenEmbedded community layers.
Keeping it small makes it easy to test and maintain.</para></listitem>
<listitem><para>The Yocto Project team runs manual and automated tests
using a small, fixed set of reference hardware as well as emulated
targets.</para></listitem>
<ulink url='&YOCTO_DOCS_DEV_URL;#poky'>Poky</ulink> small and focused.
It contains around 650 packages as compared to over 5000 for full
OpenEmbedded.</para></listitem>
<listitem><para>The Yocto Project only supports hardware that the
team has access to for testing.</para></listitem>
<listitem><para>The Yocto Project uses an an autobuilder,
which provides continuous build and integration tests.</para></listitem>
</itemizedlist>
@@ -95,11 +91,13 @@
</question>
<answer>
<para>
Support for an additional board is added by creating a BSP layer for it.
For more information on how to create a BSP layer, see the
<ulink url='&YOCTO_DOCS_BSP_URL;'>Yocto Project Board Support Package (BSP) Developer's Guide</ulink>.
</para>
<para>
There are two main ways to get a board supported in the Yocto Project;
<itemizedlist>
<listitem><para>Send the Yocto Project team information on the board
and if the team does not have it yet they will consider adding it.</para></listitem>
<listitem><para>Send the Yocto Project team the BitBake recipes if you have them.
</para></listitem>
</itemizedlist>
Usually, if the board is not completely exotic, adding support in
the Yocto Project is fairly straightforward.
</para>
@@ -109,15 +107,15 @@
<qandaentry>
<question>
<para>
Are there any products built using the OpenEmbedded build system?
Are there any products using the OpenEmbedded build system (poky)?
</para>
</question>
<answer>
<para>
The software running on the <ulink url='http://vernier.com/labquest/'>Vernier LabQuest</ulink>
is built using the OpenEmbedded build system.
The <ulink url='http://vernier.com/labquest/'>Vernier LabQuest</ulink> is using
the OpenEmbedded build system.
See the <ulink url='http://www.vernier.com/products/interfaces/labq/'>Vernier LabQuest</ulink>
website for more information.
for more information.
There are a number of pre-production devices using the OpenEmbedded build system
and the Yocto Project team
announces them as soon as they are released.
@@ -166,7 +164,7 @@
<answer>
<para>
The OpenEmbedded build system can build packages in various formats such as
<filename>ipk</filename> for <filename>opkg</filename>,
<filename>ipk</filename> for <filename>ipkg</filename>/<filename>opkg</filename>,
Debian package (<filename>.deb</filename>), or RPM.
The packages can then be upgraded using the package tools on the device, much like
on a desktop distribution such as Ubuntu or Fedora.
@@ -309,6 +307,28 @@
</answer>
</qandaentry>
<qandaentry>
<question>
<para>
I'm using Ubuntu Intrepid and am seeing build failures. Whats wrong?
</para>
</question>
<answer>
<para>
In Intrepid, Ubuntu turns on by default the normally optional compile-time security features
and warnings.
There are more details at
<ulink url='https://wiki.ubuntu.com/CompilerFlags'>https://wiki.ubuntu.com/CompilerFlags</ulink>.
You can work around this problem by disabling those options by adding
the following to the <filename>BUILD_CPPFLAGS</filename> variable in the
<filename>conf/bitbake.conf</filename> file.
<literallayout class='monospaced'>
" -Wno-format-security -U_FORTIFY_SOURCE"
</literallayout>
</para>
</answer>
</qandaentry>
<qandaentry>
<question>
<para>
@@ -401,7 +421,7 @@
For example, add the following files to your layer:
<literallayout class='monospaced'>
meta-MACHINE/recipes-bsp/netbase/netbase/MACHINE/interfaces
meta-MACHINE/recipes-bsp/netbase/netbase_5.0.bbappend
meta-MACHINE/recipes-bsp/netbase/netbase_4.44.bbappend
</literallayout>
</para>
</answer>

View File

@@ -87,198 +87,10 @@
<section id='intro-requirements'>
<title>System Requirements</title>
<para>
For general Yocto Project system requirements, see the
"<ulink url='&YOCTO_DOCS_QS_URL;#yp-resources'>What You Need and How You Get It</ulink>" section
in the Yocto Project Quick Start.
The remainder of this section provides details on system requirements
not covered in the Yocto Project Quick Start.
For Yocto Project system requirements, see the
<ulink url='&YOCTO_DOCS_QS_URL;#yp-resources'>
What You Need and How You Get It</ulink> section in the Yocto Project Quick Start.
</para>
<section id='detailed-supported-distros'>
<title>Supported Linux Distributions</title>
<para>
Currently, the Yocto Project is supported on the following distributions:
<itemizedlist>
<listitem><para>Ubuntu 10.04.4 LTS</para></listitem>
<listitem><para>Ubuntu 11.10</para></listitem>
<listitem><para>Ubuntu 12.04.1 LTS</para></listitem>
<listitem><para>Ubuntu 12.04.1 LTS</para></listitem>
<listitem><para>Ubuntu 12.10</para></listitem>
<listitem><para>Fedora release 16 (Verne)</para></listitem>
<listitem><para>Fedora release 17 (Beefy Miracle)</para></listitem>
<listitem><para>Fedora release 18 (Spherical Cow)</para></listitem>
<listitem><para>CentOS release 5.6 (Final)</para></listitem>
<listitem><para>CentOS release 5.7 (Final)</para></listitem>
<listitem><para>CentOS release 5.8 (Final)</para></listitem>
<listitem><para>CentOS release 6.3 (Final)</para></listitem>
<listitem><para>Debian GNU/Linux 6.0.6 (squeeze)</para></listitem>
<listitem><para>openSUSE 11.4</para></listitem>
<listitem><para>openSUSE 12.1</para></listitem>
<listitem><para>openSUSE 12.2</para></listitem>
</itemizedlist>
</para>
<note>
For additional information on distributions that support the
Yocto Project, see the
<ulink url='&YOCTO_WIKI_URL;/wiki/Distribution_Support'>Distribution Support</ulink> wiki page.
</note>
</section>
<section id='required-packages-for-the-host-development-system'>
<title>Required Packages for the Host Development System</title>
<para>
The list of packages you need on the host development system can
be large when covering all build scenarios using the Yocto Project.
This section provides required packages by Linux distribution and
further categorized by function.
</para>
<section id='ubuntu-packages'>
<title>Ubuntu</title>
<para>
The following list shows the required packages by function
given a supported Ubuntu Linux distribution:
<itemizedlist>
<listitem><para><emphasis>Essentials:</emphasis>
Packages needed to build an image on a headless
system:
<literallayout class='monospaced'>
$ sudo apt-get install &UBUNTU_HOST_PACKAGES_ESSENTIAL;
</literallayout></para></listitem>
<listitem><para><emphasis>Graphical Extras:</emphasis>
Packages recommended if the host system has graphics support:
<literallayout class='monospaced'>
$ sudo apt-get install libsdl1.2-dev xterm
</literallayout></para></listitem>
<listitem><para><emphasis>Documentation:</emphasis>
Packages needed if you are going to build out the
Yocto Project documentation manuals:
<literallayout class='monospaced'>
$ sudo apt-get install make xsltproc docbook-utils fop
</literallayout></para></listitem>
<listitem><para><emphasis>ADT Installer Extras:</emphasis>
Packages needed if you are going to be using the
<ulink url='&YOCTO_DOCS_ADT_URL;#using-the-adt-installer'>Application Development Toolkit (ADT) Installer</ulink>:
<literallayout class='monospaced'>
$ sudo apt-get install autoconf automake libtool libglib2.0-dev
</literallayout></para></listitem>
</itemizedlist>
</para>
</section>
<section id='fedora-packages'>
<title>Fedora Packages</title>
<para>
The following list shows the required packages by function
given a supported Fedora Linux distribution:
<itemizedlist>
<listitem><para><emphasis>Essentials:</emphasis>
Packages needed to build an image for a headless
system:
<literallayout class='monospaced'>
$ sudo yum install &FEDORA_HOST_PACKAGES_ESSENTIAL;
</literallayout></para></listitem>
<listitem><para><emphasis>Graphical Extras:</emphasis>
Packages recommended if the host system has graphics support:
<literallayout class='monospaced'>
$ sudo yum install SDL-devel xterm
</literallayout></para></listitem>
<listitem><para><emphasis>Documentation:</emphasis>
Packages needed if you are going to build out the
Yocto Project documentation manuals:
<literallayout class='monospaced'>
$ sudo yum install make docbook-style-dsssl docbook-style-xsl \
docbook-dtds docbook-utils fop libxslt
</literallayout></para></listitem>
<listitem><para><emphasis>ADT Installer Extras:</emphasis>
Packages needed if you are going to be using the
<ulink url='&YOCTO_DOCS_ADT_URL;#using-the-adt-installer'>Application Development Toolkit (ADT) Installer</ulink>:
<literallayout class='monospaced'>
$ sudo yum install autoconf automake libtool glib2-devel
</literallayout></para></listitem>
</itemizedlist>
</para>
</section>
<section id='opensuse-packages'>
<title>OpenSUSE Packages</title>
<para>
The following list shows the required packages by function
given a supported OpenSUSE Linux distribution:
<itemizedlist>
<listitem><para><emphasis>Essentials:</emphasis>
Packages needed to build an image for a headless
system:
<literallayout class='monospaced'>
$ sudo zypper install &OPENSUSE_HOST_PACKAGES_ESSENTIAL;
</literallayout></para></listitem>
<listitem><para><emphasis>Graphical Extras:</emphasis>
Packages recommended if the host system has graphics support:
<literallayout class='monospaced'>
$ sudo zypper install libSDL-devel xterm
</literallayout></para></listitem>
<listitem><para><emphasis>Documentation:</emphasis>
Packages needed if you are going to build out the
Yocto Project documentation manuals:
<literallayout class='monospaced'>
$ sudo zypper install make fop xsltproc
</literallayout></para></listitem>
<listitem><para><emphasis>ADT Installer Extras:</emphasis>
Packages needed if you are going to be using the
<ulink url='&YOCTO_DOCS_ADT_URL;#using-the-adt-installer'>Application Development Toolkit (ADT) Installer</ulink>:
<literallayout class='monospaced'>
$ sudo zypper install autoconf automake libtool glib2-devel
</literallayout></para></listitem>
</itemizedlist>
</para>
</section>
<section id='centos-packages'>
<title>CentOS Packages</title>
<para>
The following list shows the required packages by function
given a supported CentOS Linux distribution:
<itemizedlist>
<listitem><para><emphasis>Essentials:</emphasis>
Packages needed to build an image for a headless
system:
<literallayout class='monospaced'>
$ sudo yum -y install &CENTOS_HOST_PACKAGES_ESSENTIAL;
</literallayout></para></listitem>
<listitem><para><emphasis>Graphical Extras:</emphasis>
Packages recommended if the host system has graphics support:
<literallayout class='monospaced'>
$ sudo yum -y install SDL-devel xterm
</literallayout></para></listitem>
<listitem><para><emphasis>Documentation:</emphasis>
Packages needed if you are going to build out the
Yocto Project documentation manuals:
<literallayout class='monospaced'>
$ sudo yum -y install make docbook-style-dsssl docbook-style-xsl \
docbook-dtds docbook-utils fop libxslt
</literallayout></para></listitem>
<listitem><para><emphasis>ADT Installer Extras:</emphasis>
Packages needed if you are going to be using the
<ulink url='&YOCTO_DOCS_ADT_URL;#using-the-adt-installer'>Application Development Toolkit (ADT) Installer</ulink>:
<literallayout class='monospaced'>
$ sudo yum -y install autoconf automake libtool glib2-devel
</literallayout></para></listitem>
</itemizedlist>
<note>Depending on the CentOS version you are using, other requirements
and dependencies might exist.
For details, you should look at the CentOS sections on the
<ulink url='https://wiki.yoctoproject.org/wiki/Poky/GettingStarted/Dependencies'>Poky/GettingStarted/Dependencies</ulink>
wiki page.</note>
</para>
</section>
</section>
</section>
<section id='intro-getit'>
@@ -291,7 +103,7 @@
<ulink url='&YOCTO_DL_URL;/releases/yocto/'/>.</para></listitem>
<listitem><para><emphasis>Nightly Builds:</emphasis> These releases are available at
<ulink url='http://autobuilder.yoctoproject.org/nightly'/>.
These builds include Yocto Project releases, meta-toolchain tarball installation scripts, and
These builds include Yocto Project releases, meta-toolchain tarballs, and
experimental builds.</para></listitem>
<listitem><para><emphasis>Yocto Project Website:</emphasis> You can find releases
of the Yocto Project and supported BSPs at the
@@ -306,7 +118,7 @@
<title>Development Checkouts</title>
<para>
Development using the Yocto Project requires a local
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>.
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink>.
You can set up the source directory by downloading a Yocto Project release tarball and unpacking it,
or by cloning a copy of the upstream
<ulink url='&YOCTO_DOCS_DEV_URL;#poky'>Poky</ulink> Git repository.

View File

@@ -1,235 +0,0 @@
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY % poky SYSTEM "../poky.ent"> %poky; ] >
<chapter id='migration'>
<title>Migrating to a Newer Yocto Project Release</title>
<para>
This chapter provides information you can use to migrate work to a
newer Yocto Project release. You can find the same information in the
release notes for a given release.
</para>
<section id='moving-to-the-yocto-project-1.3-release'>
<title>Moving to the Yocto Project 1.3 Release</title>
<para>
This section provides migration information for moving to the
Yocto Project 1.3 Release.
</para>
<section id='1.3-local-configuration'>
<title>Local Configuration</title>
<para>
Differences include changes for
<link linkend='var-SSTATE_MIRRORS'><filename>SSTATE_MIRRORS</filename></link>
and <filename>bblayers.conf</filename>.
</para>
<section id='migration-1.3-sstate-mirrors'>
<title>SSTATE_MIRRORS</title>
<para>
The shared state cache (sstate-cache) as pointed to by
<link linkend='var-SSTATE_DIR'><filename>SSTATE_DIR</filename></link> by default
now has two-character subdirectories to prevent there being an issue with too
many files in the same directory.
Also, native sstate-cache packages will go into a subdirectory named using
the distro ID string.
If you copy the newly structured sstate-cache to a mirror location
(either local or remote) and then point to it in
<link linkend='var-SSTATE_MIRRORS'><filename>SSTATE_MIRRORS</filename></link>,
you need to append "PATH" to the end of the mirror URL so that
the path used by BitBake before the mirror substitution is
appended to the path used to access the mirror.
Here is an example:
<literallayout class='monospaced'>
SSTATE_MIRRORS = "file://.* http://someserver.tld/share/sstate/PATH"
</literallayout>
</para>
</section>
<section id='migration-1.3-bblayers-conf'>
<title>bblayers.conf</title>
<para>
The <filename>meta-yocto</filename> layer has been split into
two parts: <filename>meta-yocto</filename> and
<filename>meta-yocto-bsp</filename>, corresponding to the
Poky reference distro configuration and the reference
hardware Board Support Packages (BSPs), respectively.
When running BitBake or Hob for the first time after upgrading,
your <filename>conf/bblayers.conf</filename> file will be
updated to handle this change and you will be asked to
re-run/restart for the changes to take effect.
</para>
</section>
</section>
<section id='1.3-recipes'>
<title>Recipes</title>
<para>
Differences include changes for the following:
<itemizedlist>
<listitem><para>Python function whitespace</para></listitem>
<listitem><para><filename>proto=</filename> in <filename>SRC_URI</filename></para></listitem>
<listitem><para><filename>nativesdk</filename></para></listitem>
<listitem><para>Task recipes</para></listitem>
<listitem><para><filename>IMAGE_FEATURES</filename></para></listitem>
<listitem><para>Removed recipes</para></listitem>
</itemizedlist>
</para>
<section id='migration-1.3-python-function-whitespace'>
<title>Python Function Whitespace</title>
<para>
All Python functions must now use four spaces for indentation.
Previously, an inconsistent mix of spaces and tabs existed,
which made extending these functions using
<filename>_append</filename> or <filename>_prepend</filename>
complicated given that Python treats whitespace as
syntactically significant.
If you are defining or extending any Python functions (e.g.
<filename>populate_packages</filename>, <filename>do_unpack</filename>,
<filename>do_patch</filename> and so forth) in custom recipes
or classes, you need to ensure you are using consistent
four-space indentation.
</para>
</section>
<section id='migration-1.3-proto=-in-src-uri'>
<title>proto= in SRC_URI</title>
<para>
Any use of <filename>proto=</filename> in
<link linkend='var-SRC_URI'><filename>SRC_URI</filename></link>
needs to be changed to <filename>protocol=</filename>.
In particular, this applies to the following URIs:
<itemizedlist>
<listitem><para><filename>svn://</filename></para></listitem>
<listitem><para><filename>bzr://</filename></para></listitem>
<listitem><para><filename>hg://</filename></para></listitem>
<listitem><para><filename>osc://</filename></para></listitem>
</itemizedlist>
Other URIs were already using <filename>protocol=</filename>.
This change improves consistency.
</para>
</section>
<section id='migration-1.3-nativesdk'>
<title>nativesdk</title>
<para>
The suffix <filename>nativesdk</filename> is now implemented
as a prefix, which simplifies a lot of the packaging code for
<filename>nativesdk</filename> recipes.
All custom <filename>nativesdk</filename> recipes and any
references need to be updated to use
<filename>nativesdk-*</filename> instead of
<filename>*-nativesdk</filename>.
</para>
</section>
<section id='migration-1.3-task-recipes'>
<title>Task Recipes</title>
<para>
"Task" recipes are now known as "Package groups" and have
been renamed from <filename>task-*.bb</filename> to
<filename>packagegroup-*.bb</filename>.
Existing references to the previous <filename>task-*</filename>
names should work in most cases as there is an automatic
upgrade path for most packages.
However, you should update references in your own recipes and
configurations as they could be removed in future releases.
You should also rename any custom <filename>task-*</filename>
recipes to <filename>packagegroup-*</filename>, and change
them to inherit <filename>packagegroup</filename> instead of
<filename>task</filename>, as well as taking the opportunity
to remove anything now handled by
<filename>packagegroup.bbclass</filename>, such as providing
<filename>-dev</filename> and <filename>-dbg</filename>
packages, setting
<link linkend='var-LIC_FILES_CHKSUM'><filename>LIC_FILES_CHKSUM</filename></link>,
and so forth.
See the
"<link linkend='ref-classes-packagegroup'>Package Groups - packagegroup.bbclass</link>"
section for further details.
</para>
</section>
<section id='migration-1.3-image-features'>
<title>IMAGE_FEATURES</title>
<para>
Image recipes that previously included "apps-console-core"
in <link linkend='var-IMAGE_FEATURES'><filename>IMAGE_FEATURES</filename></link>
should now include "splash" instead to enable the boot-up
splash screen.
Retaining "apps-console-core" will still include the splash
screen generates a warning.
The "apps-x11-core" and "apps-x11-games"
<filename>IMAGE_FEATURES</filename> features have been removed.
</para>
</section>
<section id='migration-1.3-removed-recipes'>
<title>Removed Recipes</title>
<para>
The following recipes have been removed.
For most of them, it is unlikely that you would have any
references to them in your own metadata.
However, you should check your metadata against this list to be sure:
<itemizedlist>
<listitem><para><emphasis><filename>libx11-trim</filename></emphasis>:
Replaced by <filename>libx11</filename>, which has a negligible
size difference with modern Xorg.</para></listitem>
<listitem><para><emphasis><filename>xserver-xorg-lite</filename></emphasis>:
Use <filename>xserver-xorg</filename>, which has a negligible
size difference when DRI and GLX modules are not installed.</para></listitem>
<listitem><para><emphasis><filename>xserver-kdrive</filename></emphasis>:
Effectively unmaintained for many years.</para></listitem>
<listitem><para><emphasis><filename>mesa-xlib</filename></emphasis>:
No longer serves any purpose.</para></listitem>
<listitem><para><emphasis><filename>galago</filename></emphasis>:
Replaced by telepathy.</para></listitem>
<listitem><para><emphasis><filename>gail</filename></emphasis>:
Functionality was integrated into GTK+ 2.13.</para></listitem>
<listitem><para><emphasis><filename>eggdbus</filename></emphasis>:
No longer needed.</para></listitem>
<listitem><para><emphasis><filename>gcc-*-intermediate</filename></emphasis>:
The build has been restructured to avoid the need for
this step.</para></listitem>
<listitem><para><emphasis><filename>libgsmd</filename></emphasis>:
Unmaintained for many years.
Functionality now provided by
<filename>ofono</filename> instead.</para></listitem>
<listitem><para><emphasis>contacts, dates, tasks, eds-tools</emphasis>:
Largely unmaintained PIM application suite.
It has been moved to <filename>meta-gnome</filename>
in <filename>meta-openembedded</filename>.</para></listitem>
</itemizedlist>
In addition to the previously listed changes, the
<filename>meta-demoapps</filename> directory has also been removed
because the recipes in it were not being maintained and many
had become obsolete or broken.
Additionally, these recipes were not parsed in the default configuration.
Many of these recipes are already provided in an updated and
maintained form within OpenEmbedded community layers such as
<filename>meta-oe</filename> and <filename>meta-gnome</filename>.
For the remainder, you can now find them in the
<filename>meta-extras</filename> repository, which is in the
Yocto Project source repositories.
</para>
</section>
</section>
</section>
</chapter>
<!--
vim: expandtab tw=80 ts=4
-->

View File

@@ -2,18 +2,18 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY % poky SYSTEM "../poky.ent"> %poky; ] >
<book id='poky-ref-manual' lang='en'
<book id='poky-ref-manual' lang='en'
xmlns:xi="http://www.w3.org/2003/XInclude"
xmlns="http://docbook.org/ns/docbook"
>
<bookinfo>
<mediaobject>
<imageobject>
<imagedata fileref='figures/poky-title.png'
format='SVG'
<imagedata fileref='figures/poky-title.png'
format='SVG'
align='left' scalefit='1' width='100%'/>
</imageobject>
</imageobject>
</mediaobject>
<title></title>
@@ -57,19 +57,9 @@
</revision>
<revision>
<revnumber>1.3</revnumber>
<date>October 2012</date>
<date>Sometime in 2012</date>
<revremark>Released with the Yocto Project 1.3 Release.</revremark>
</revision>
<revision>
<revnumber>1.3.1</revnumber>
<date>April 2013</date>
<revremark>Released with the Yocto Project 1.3.1 Release.</revremark>
</revision>
<revision>
<revnumber>1.3.2</revnumber>
<date>May 2013</date>
<revremark>Released with the Yocto Project 1.3.2 Release.</revremark>
</revision>
</revhistory>
<copyright>
@@ -79,7 +69,7 @@
<legalnotice>
<para>
Permission is granted to copy, distribute and/or modify this document under
Permission is granted to copy, distribute and/or modify this document under
the terms of the <ulink type="http" url="http://creativecommons.org/licenses/by-sa/2.0/uk/">Creative Commons Attribution-Share Alike 2.0 UK: England &amp; Wales</ulink> as published by Creative Commons.
</para>
<note>
@@ -99,8 +89,6 @@
<xi:include href="technical-details.xml"/>
<xi:include href="migration.xml"/>
<xi:include href="ref-structure.xml"/>
<xi:include href="ref-bitbake.xml"/>
@@ -121,10 +109,10 @@
<!-- <index id='index'>
<title>Index</title>
</index>
</index>
-->
</book>
<!--
vim: expandtab tw=80 ts=4
<!--
vim: expandtab tw=80 ts=4
-->

View File

@@ -36,7 +36,7 @@
<para>
The first thing BitBake does is look for the <filename>bitbake.conf</filename> file.
This file resides in the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink>
within the <filename>meta/conf/</filename> directory.
BitBake finds it by examining its
<link linkend='var-BBPATH'><filename>BBPATH</filename></link> environment
@@ -124,10 +124,10 @@
Once a provider is selected, BitBake resolves all the dependencies for
the target.
In the case of <filename>core-image-sato</filename>, it would lead to
<filename>packagegroup-core-x11-sato</filename>,
which in turn leads to recipes like <filename>matchbox-terminal</filename>,
<filename>pcmanfm</filename> and <filename>gthumb</filename>.
These recipes in turn depend on <filename>eglibc</filename> and the toolchain.
<filename>task-base.bb</filename>,
which in turn leads to packages like <filename>Contacts</filename>,
<filename>Dates</filename> and <filename>BusyBox</filename>.
These packages in turn depend on <filename>eglibc</filename> and the toolchain.
</para>
<para>
@@ -185,9 +185,8 @@
<para>
Dependencies are defined through several variables.
You can find information about variables BitBake uses in the BitBake documentation,
which is found in the <filename>bitbake/doc/manual</filename> directory within the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>.
You can find information about variables BitBake uses in the
<ulink url='&BITBAKE_DOCS_URL;'>BitBake manual</ulink>.
At a basic level, it is sufficient to know that BitBake uses the
<filename><link linkend='var-DEPENDS'>DEPENDS</link></filename> and
<filename><link linkend='var-RDEPENDS'>RDEPENDS</link></filename> variables when
@@ -275,7 +274,7 @@
<orderedlist>
<listitem><para>Tell BitBake to load what you want from the environment
into the data store.
You can do so through the <filename>BB_ENV_EXTRAWHITE</filename>
You can do so through the <filename>BB_ENV_WHITELIST</filename>
variable.
For example, assume you want to prevent the build system from
accessing your <filename>$HOME/.ccache</filename> directory.
@@ -394,9 +393,7 @@ Options:
Fetchers are usually triggered by entries in
<filename><link linkend='var-SRC_URI'>SRC_URI</link></filename>.
You can find information about the options and formats of entries for specific
fetchers in the BitBake manual located in the
<filename>bitbake/doc/manual</filename> directory of the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>.
fetchers in the <ulink url='&BITBAKE_DOCS_URL;'>BitBake manual</ulink>.
</para>
<para>

View File

@@ -13,7 +13,7 @@
Class files are identified by the extension <filename>.bbclass</filename> and are usually placed
in a <filename>classes/</filename> directory beneath the
<filename>meta*/</filename> directory found in the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>.
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink>.
Class files can also be pointed to by BUILDDIR (e.g. <filename>build/</filename>)in the same way as
<filename>.conf</filename> files in the <filename>conf</filename> directory.
Class files are searched for in <link linkend='var-BBPATH'><filename>BBPATH</filename></link>
@@ -262,28 +262,6 @@
</para>
</section>
<section id='ref-classes-packagegroup'>
<title>Package Groups - <filename>packagegroup.bbclass</filename></title>
<para>
This class sets default values appropriate for package group recipes (such as
<filename><link linkend='var-PACKAGES'>PACKAGES</link></filename>,
<filename><link linkend='var-PACKAGE_ARCH'>PACKAGE_ARCH</link></filename>,
<filename><link linkend='var-ALLOW_EMPTY'>ALLOW_EMPTY</link></filename>,
and so forth.
It is highly recommended that all package group recipes inherit this class.
</para>
<para>
For information on how to use this class, see the
"<ulink url='&YOCTO_DOCS_DEV_URL;#usingpoky-extend-customimage-customtasks'>Customizing Images Using Custom Package Tasks</ulink>"
section in the Yocto Project Development Manual.
</para>
<para>
Previously, this class was named <filename>task.bbclass</filename>.
</para>
</section>
<section id='ref-classes-package'>
<title>Packaging - <filename>package*.bbclass</filename></title>
@@ -302,7 +280,7 @@
<filename><link linkend='var-PACKAGE_CLASSES'>PACKAGE_CLASSES</link></filename>
variable defined in the <filename>local.conf</filename> configuration file,
which is located in the <filename>conf</filename> folder of the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>.
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink>.
When defining the variable, you can specify one or more package types.
Since images are generated from packages, a packaging class is
needed to enable image generation.
@@ -538,7 +516,7 @@
you can use this class to specify those packages and associate the users and groups
with those packages.
The <filename>meta-skeleton/recipes-skeleton/useradd/useradd-example.bb</filename>
recipe in the <ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>
recipe in the <ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink>
provides a simple exmample that shows how to add three
users and groups to two packages.
See the <filename>useradd-example.bb</filename> for more information on how to
@@ -568,7 +546,7 @@
<link linkend='var-B'><filename>B</filename></link> variable to point to the directory in
which the OpenEmbedded build system places the generated objects built from the recipes.
By default, the <filename>B</filename> directory is set to the following, which is separate from the
Source Directory (<filename>S</filename>):
source directory (<filename>S</filename>):
<literallayout class='monospaced'>
${WORKDIR}/${BPN}-{PV}/
</literallayout>
@@ -616,7 +594,7 @@
Thus far, this chapter has discussed only the most useful and important
classes.
However, other classes exist within the <filename>meta/classes</filename> directory
in the <ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>.
in the <ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink>.
You can examine the <filename>.bbclass</filename> files directly for more
information.
</para>
@@ -624,54 +602,33 @@
<!-- Undocumented classes are:
allarch.bbclass
archive*.bbclass
binconfig.bbclass
blacklist.bbclass
bootimg.bbclass
boot-directdisk.bbclass
bugzilla.bbclass
buildhistory.bbclass
buildstats.bbclass
ccache.bbclass
chrpath.bbclass
ccache.inc
cmake.bbclass
cml1.bbclass
copyleft_compliance.bbclass
core-image.bbclass
cross.bbclass
cross-canadian.bbclass
crosssdk.bbclass
deploy.bbclass
distrodata.bbclass
dummy.bbclass
gconf.bbclass
gettext.bbclass
gnomebase.bbclass
gnome.bbclass
gtk-doc.bbclass
gtk-icon-cache.bbclass
gzipnative.bbclass
icecc.bbclass
image-empty.bbclass
image-live.bbclass
image-vmdk.bbclass
image-mklibs.bbclass
image-prelink.bbclass
image-swab.bbclass
imagetest-dummy.bbclass
imagetest-qemu.bbclass
image_types.bbclass
image_types_uboot.bbclass
insserv.bbclass
kernel-arch.bbclass
kernel-yocto.bbclass
lib_package.bbclass
linux-kernel-base.bbclass
license.bbclass
logging.bbclass
meta.bbclass
metadata_scm.bbclass
mime.bbclass
mirrors.bbclass
multilib*.bbclass
native.bbclass
@@ -679,17 +636,14 @@
oelint.bbclass
own-mirrors.bbclass
packagedata.bbclass
packageinfo.bbclass
packagehistory.bbclass
patch.bbclass
perlnative.bbclass
pkg_distribute.bbclass
pkg_metainfo.bbclass
populate_sdk*.bbclass
prexport.bbclass
primport.bbclass
prserv.bbclass
python-dir.bbclass
pythonnative.bbclass
qemu.bbclass
qmake*.bbclass
qt4*.bbclass
@@ -705,6 +659,7 @@
sstate.bbclass
staging.bbclass
syslinux.bbclass
task.bbclass
terminal.bbclass
tinderclient.bbclass
toolchain-scripts.bbclass

View File

@@ -28,9 +28,8 @@
<title>Distro</title>
<para>
The items below are features you can use with
<link linkend='var-DISTRO_FEATURES'><filename>DISTRO_FEATURES</filename></link>.
This list only represents features as shipped with the Yocto Project metadata:
The items below are valid options for
<filename><link linkend='var-DISTRO_FEATURES'>DISTRO_FEATURES</link></filename>:
<itemizedlist>
<listitem><para><emphasis>alsa:</emphasis> ALSA support will be included (OSS compatibility
kernel modules will be installed if available).</para></listitem>
@@ -75,9 +74,8 @@
<title>Machine</title>
<para>
The items below are features you can use with
<link linkend='var-MACHINE_FEATURES'><filename>MACHINE_FEATURES</filename></link>.
This list only represents features as shipped with the Yocto Project metadata:
The items below are valid options for
<filename><link linkend='var-MACHINE_FEATURES'>MACHINE_FEATURES</link></filename>:
<itemizedlist>
<listitem><para><emphasis>acpi:</emphasis> Hardware has ACPI (x86/x86_64 only)
</para></listitem>
@@ -114,7 +112,7 @@
</section>
<section id='ref-features-image'>
<title>Images</title>
<title>Reference: Images</title>
<para>
The contents of images generated by the OpenEmbedded build system can be controlled by the
@@ -130,123 +128,30 @@
Current list of
<filename>IMAGE_FEATURES</filename> contains the following:
<itemizedlist>
<listitem><para><emphasis>splash:</emphasis> Enables showing a splash screen during boot.
By default, this screen is provided by <filename>psplash</filename>, which does
allow customization.
If you prefer to use an alternative splash screen package, you can do so by
setting the <filename>SPLASH</filename> variable
to a different package name (or names) within the image recipe or at the distro
configuration level.</para></listitem>
<listitem><para><emphasis>ssh-server-dropbear:</emphasis> Installs the Dropbear minimal
SSH server.
<listitem><para><emphasis>apps-console-core:</emphasis> Core console applications such as
<filename>ssh</filename>, <filename>daemon</filename>, <filename>avahi daemon</filename>,
<filename>portmap</filename> (for mounting NFS shares)</para></listitem>
<listitem><para><emphasis>x11-base:</emphasis> X11 server + minimal desktop</para></listitem>
<listitem><para><emphasis>x11-sato:</emphasis> OpenedHand Sato environment</para></listitem>
<listitem><para><emphasis>apps-x11-core:</emphasis> Core X11 applications such as an
X Terminal, file manager, and file editor</para></listitem>
<listitem><para><emphasis>apps-x11-games:</emphasis> A set of X11 games</para></listitem>
<listitem><para><emphasis>tools-sdk:</emphasis> A full SDK that runs on the device
</para></listitem>
<listitem><para><emphasis>ssh-server-openssh:</emphasis> Installs the OpenSSH SSH server,
which is more full-featured than Dropbear.
Note that if both the OpenSSH SSH server and the Dropbear minimal SSH server
are present in <filename>IMAGE_FEATURES</filename>, then OpenSSH will take
precedence and Dropbear will not be installed.</para></listitem>
<listitem><para><emphasis>x11:</emphasis> Installs the X server</para></listitem>
<listitem><para><emphasis>x11-base:</emphasis> Installs the X server with a
minimal environment.</para></listitem>
<listitem><para><emphasis>x11-sato:</emphasis> Installs the OpenedHand Sato environment.
<listitem><para><emphasis>tools-debug:</emphasis> Debugging tools such as
<filename>strace</filename> and <filename>gdb</filename>
</para></listitem>
<listitem><para><emphasis>tools-sdk:</emphasis> Installs a full SDK that runs on the device.
</para></listitem>
<listitem><para><emphasis>tools-debug:</emphasis> Installs debugging tools such as
<filename>strace</filename> and <filename>gdb</filename>.
</para></listitem>
<listitem><para><emphasis>tools-profile:</emphasis> Installs profiling tools such as
<listitem><para><emphasis>tools-profile:</emphasis> Profiling tools such as
<filename>oprofile</filename>, <filename>exmap</filename>, and
<filename>LTTng</filename>.</para></listitem>
<listitem><para><emphasis>tools-testapps:</emphasis> Installs device testing tools (e.g.
touchscreen debugging).</para></listitem>
<listitem><para><emphasis>nfs-server:</emphasis> Installs an NFS server.</para></listitem>
<listitem><para><emphasis>dev-pkgs:</emphasis> Installs development packages (headers and
extra library links) for all packages installed in a given image.</para></listitem>
<listitem><para><emphasis>staticdev-pkgs:</emphasis> Installs static development
packages (i.e. static libraries containing <filename>*.a</filename> files) for all
packages installed in a given image.</para></listitem>
<listitem><para><emphasis>dbg-pkgs:</emphasis> Installs debug symbol packages for all packages
installed in a given image.</para></listitem>
<listitem><para><emphasis>doc-pkgs:</emphasis> Installs documentation packages for all packages
installed in a given image.</para></listitem>
</itemizedlist>
</para>
</section>
<section id='ref-features-backfill'>
<title>Feature Backfilling</title>
<para>
Sometimes it is necessary in the OpenEmbedded build system to extend
<link linkend='var-MACHINE_FEATURES'><filename>MACHINE_FEATURES</filename></link>
or <link linkend='var-DISTRO_FEATURES'><filename>DISTRO_FEATURES</filename></link>
to control functionality that was previously enabled and not able
to be disabled.
For these cases, we need to add an
additional feature item to appear in one of these variables,
but we do not want to force developers who have existing values
of the variables in their configuration to add the new feature
in order to retain the same overall level of functionality.
Thus, the OpenEmbedded build system has a mechanism to
automatically "backfill" these added features into existing
distro or machine configurations.
You can see the list of features for which this is done by
finding the
<link linkend='var-DISTRO_FEATURES_BACKFILL'><filename>DISTRO_FEATURES_BACKFILL</filename></link>
and <link linkend='var-MACHINE_FEATURES_BACKFILL'><filename>MACHINE_FEATURES_BACKFILL</filename></link>
variables in the <filename>meta/conf/bitbake.conf</filename> file.
</para>
<para>
Because such features are backfilled by default into all
configurations as described in the previous paragraph, developers
who wish to disable the new features need to be able to selectively
prevent the backfilling from occurring.
They can do this by adding the undesired feature or features to the
<link linkend='var-DISTRO_FEATURES_BACKFILL_CONSIDERED'><filename>DISTRO_FEATURES_BACKFILL_CONSIDERED</filename></link>
or <link linkend='var-MACHINE_FEATURES_BACKFILL_CONSIDERED'><filename>MACHINE_FEATURES_BACKFILL_CONSIDERED</filename></link>
variables for distro features and machine features respectively.
</para>
<para>
Here are two examples to help illustrate feature backfilling:
<itemizedlist>
<listitem><para><emphasis>The "pulseaudio" distro feature option</emphasis>:
Previously, PulseAudio support was enabled within the Qt and
GStreamer frameworks.
Because of this, the feature is backfilled and thus
enabled for all distros through the
<filename>DISTRO_FEATURES_BACKFILL</filename>
variable in the <filename>meta/conf/bitbake.conf</filename> file.
However, your distro needs to disable the feature.
You can disable the feature without affecting
other existing distro configurations that need PulseAudio support
by adding "pulseaudio" to
<filename>DISTRO_FEATURES_BACKFILL_CONSIDERED</filename>
in your distro's <filename>.conf</filename> file.
Adding the feature to this variable when it also
exists in the <filename>DISTRO_FEATURES_BACKFILL</filename>
variable prevents the build system from adding the feature to
your configuration's <filename>DISTRO_FEATURES</filename>, effectively disabling
the feature for that particular distro.</para></listitem>
<listitem><para><emphasis>The "rtc" machine feature option</emphasis>:
Previously, real time clock (RTC) support was enabled for all
target devices.
Because of this, the feature is backfilled and thus enabled
for all machines through the <filename>MACHINE_FEATURES_BACKFILL</filename>
variable in the <filename>meta/conf/bitbake.conf</filename> file.
However, your target device does not have this capability.
You can disable RTC support for your device without
affecting other machines that need RTC support
by adding the feature to your machine's
<filename>MACHINE_FEATURES_BACKFILL_CONSIDERED</filename>
list in the machine's <filename>.conf</filename> file.
Adding the feature to this variable when it also
exists in the <filename>MACHINE_FEATURES_BACKFILL</filename>
variable prevents the build system from adding the feature to
your configuration's <filename>MACHINE_FEATURES</filename>, effectively
disabling RTC support for that particular machine.</para></listitem>
<filename>LTTng</filename></para></listitem>
<listitem><para><emphasis>tools-testapps:</emphasis> Device testing tools (e.g.
touchscreen debugging)</para></listitem>
<listitem><para><emphasis>nfs-server:</emphasis> NFS server (exports / over NFS
to everybody)</para></listitem>
<listitem><para><emphasis>dev-pkgs:</emphasis> Development packages (headers and
extra library links) for all packages installed in a given image</para></listitem>
<listitem><para><emphasis>dbg-pkgs:</emphasis> Debug packages for all packages
installed in a given image</para></listitem>
</itemizedlist>
</para>
</section>

View File

@@ -12,8 +12,8 @@
</para>
<note>
Building an image without GNU General Public License Version 3 (GPLv3) components
is only supported for minimal and base images.
Building an image without GNU Public License Version 3 (GPLv3) components is
only supported for minimal and base images.
Furthermore, if you are going to build an image using non-GPLv3 components,
you must make the following changes in the <filename>local.conf</filename> file
before using the BitBake command to build the minimal or base image:
@@ -40,6 +40,9 @@
<itemizedlist>
<listitem><para><emphasis><filename>core-image-base</filename>:</emphasis>
A console-only image that fully supports the target device hardware.</para></listitem>
<listitem><para><emphasis><filename>core-image-core</filename>:</emphasis>
An X11 image with simple applications such as terminal, editor, and file manager.
</para></listitem>
<listitem><para><emphasis><filename>core-image-minimal</filename>:</emphasis>
A small image just capable of allowing a device to boot.</para></listitem>
<listitem><para><emphasis><filename>core-image-minimal-dev</filename>:</emphasis>
@@ -58,14 +61,12 @@
for the Minimal MTD Utilities, which let the user interact with the
MTD subsystem in the kernel to perform operations on flash devices.
</para></listitem>
<listitem><para><emphasis><filename>core-image-x11</filename>:</emphasis>
A very basic X11 image with a terminal.
</para></listitem>
<listitem><para><emphasis><filename>core-image-basic</filename>:</emphasis>
A console-only image with more full-featured Linux system
functionality installed.</para></listitem>
A foundational basic image without support for X that can be reasonably used for
customization.</para></listitem>
<listitem><para><emphasis><filename>core-image-lsb</filename>:</emphasis>
An image that conforms to the Linux Standard Base (LSB) specification.</para></listitem>
A <filename>core-image-basic</filename> image suitable for implementations
that conform to Linux Standard Base (LSB).</para></listitem>
<listitem><para><emphasis><filename>core-image-lsb-dev</filename>:</emphasis>
A <filename>core-image-lsb</filename> image that is suitable for development work
using the host.
@@ -82,8 +83,8 @@
<listitem><para><emphasis><filename>core-image-sato</filename>:</emphasis>
An image with Sato support, a mobile environment and visual style that works well
with mobile devices.
The image supports X11 with a Sato theme and applications such as
a terminal, editor, file manager, media player, and so forth.</para></listitem>
The image supports X11 with a Sato theme and Pimlico applications and also
contains terminal, editor, and file manager.</para></listitem>
<listitem><para><emphasis><filename>core-image-sato-dev</filename>:</emphasis>
A <filename>core-image-sato</filename> image suitable for development
using the host.

View File

@@ -7,14 +7,14 @@
<title>Source Directory Structure</title>
<para>
The <ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink> consists of several components.
The <ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink> consists of several components.
Understanding them and knowing where they are located is key to using the Yocto Project well.
This chapter describes the Source Directory and gives information about the various
This chapter describes the source directory and gives information about the various
files and directories.
</para>
<para>
For information on how to establish a local Source Directory on your development system, see the
For information on how to establish a local source directory on your development system, see the
"<ulink url='&YOCTO_DOCS_DEV_URL;#getting-setup'>Getting Set Up</ulink>"
section in the Yocto Project Development Manual.
</para>
@@ -26,7 +26,7 @@
<title><filename>bitbake/</filename></title>
<para>
The <ulink url='source-directory'>Source Directory</ulink>
The <ulink url='source-directory'>source directory</ulink>
includes a copy of BitBake for ease of use.
The copy usually matches the current stable BitBake release from the BitBake project.
BitBake, a metadata interpreter, reads the Yocto Project metadata and runs the tasks
@@ -39,16 +39,15 @@
When you run the <filename>bitbake</filename> command, the wrapper script in
<filename>scripts/</filename> is executed to run the main BitBake executable,
which resides in the <filename>bitbake/bin/</filename> directory.
Sourcing the <link linkend="structure-core-script">&OE_INIT_FILE;</link>
Sourcing the <link linkend="structure-core-script">oe-init-build-env</link>
script places the <filename>scripts</filename> and <filename>bitbake/bin</filename>
directories (in that order) into the shell's <filename>PATH</filename> environment
variable.
</para>
<para>
For more information on BitBake, see the BitBake documentation
inculded in the <filename>bitbake/doc/manual</filename> directory of the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>.
For more information on BitBake, see the BitBake on-line manual at
<ulink url="http://docs.openembedded.org/bitbake/html/"/>.
</para>
</section>
@@ -59,19 +58,19 @@
This directory contains user configuration files and the output
generated by the OpenEmbedded build system in its standard configuration where
the source tree is combined with the output.
The <ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>Build Directory</ulink>
The <ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>build directory</ulink>
is created initially when you <filename>source</filename>
the OpenEmbedded build environment setup script <filename>&OE_INIT_FILE;</filename>.
the OpenEmbedded build environment setup script <filename>oe-init-build-env</filename>.
</para>
<para>
It is also possible to place output and configuration
files in a directory separate from the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink>
by providing a directory name when you <filename>source</filename>
the setup script.
For information on separating output from your local Source Directory files, see <link
linkend='structure-core-script'>&OE_INIT_FILE;</link>.
For information on separating output from your local source directory files, see <link
linkend='structure-core-script'>oe-init-build-env</link>.
</para>
</section>
@@ -93,37 +92,25 @@
<para>
This directory contains the OpenEmbedded Core metadata.
The directory holds recipes, common classes, and machine
configuration for emulated targets (qemux86, qemuarm,
and so on.)
The directory holds machine definitions, the Yocto Project distribution,
and the packages that make up a given system.
</para>
</section>
<section id='structure-core-meta-yocto'>
<title><filename>meta-yocto/</filename></title>
<section id='structure-core-meta-demoapps'>
<title><filename>meta-demoapps/</filename></title>
<para>
This directory contains the configuration for the Poky
reference distribution.
This directory contains recipes for applications and demos that are not part of the
OpenEmbedded core.
</para>
</section>
<section id='structure-core-meta-yocto-bsp'>
<title><filename>meta-yocto-bsp/</filename></title>
<section id='structure-core-meta-rt'>
<title><filename>meta-rt/</filename></title>
<para>
This directory contains the Yocto Project reference
hardware BSPs.
</para>
</section>
<section id='structure-meta-hob'>
<title><filename>meta-hob/</filename></title>
<para>
This directory contains template recipes used by the
<ulink url='&YOCTO_HOME_URL;/projects/hob'>Hob</ulink>
build UI.
This directory contains recipes for real-time kernels.
</para>
</section>
@@ -141,7 +128,7 @@
<para>
This directory contains various integration scripts that implement
extra functionality in the Yocto Project environment (e.g. QEMU scripts).
The <link linkend="structure-core-script">&OE_INIT_FILE;</link> script appends this
The <link linkend="structure-core-script">oe-init-build-env</link> script appends this
directory to the shell's <filename>PATH</filename> environment variable.
</para>
@@ -153,7 +140,7 @@
</section>
<section id='structure-core-script'>
<title><filename>&OE_INIT_FILE;</filename></title>
<title><filename>oe-init-build-env</filename></title>
<para>
This script sets up the OpenEmbedded build environment.
@@ -166,16 +153,16 @@
</para>
<para>
By default, running this script without a Build Directory argument creates the
By default, running this script without a build directory argument creates the
<filename>build</filename> directory.
If you provide a Build Directory argument when you <filename>source</filename>
If you provide a build directory argument when you <filename>source</filename>
the script, you direct OpenEmbedded build system to create a
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>Build Directory</ulink> of your choice.
For example, the following command creates a Build Directory named
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>build directory</ulink> of your choice.
For example, the following command creates a build directory named
<filename>mybuilds</filename> that is outside of the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>:
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink>:
<literallayout class='monospaced'>
$ source &OE_INIT_FILE; ~/mybuilds
$ source oe-init-build-env ~/mybuilds
</literallayout>
</para>
</section>
@@ -217,13 +204,9 @@
<para>
Edit this file to set the <filename><link linkend='var-MACHINE'>MACHINE</link></filename>
for which you want to build, which package types you wish to use
(<link linkend='var-PACKAGE_CLASSES'><filename>PACKAGE_CLASSES</filename></link>),
where you want to downloaded files
(<filename><link linkend='var-DL_DIR'>DL_DIR</link></filename>),
and how you want your host machine to use resources
(<link linkend='var-BB_NUMBER_THREADS'><filename>BB_NUMBER_THREADS</filename></link> and
<link linkend='var-PARALLEL_MAKE'><filename>PARALLEL_MAKE</filename></link>).
for which you want to build, which package types you
wish to use (<filename>PACKAGE_CLASSES</filename>), or where you want to downloaded files
(<filename><link linkend='var-DL_DIR'>DL_DIR</link></filename>).
</para>
</section>
@@ -387,7 +370,7 @@
data.
Packages that need to share output with other packages do so within this directory.
The directory is subdivided by architecture so multiple builds can run within
the one Build Directory.
the one build directory.
</para>
</section>

File diff suppressed because it is too large Load Diff

View File

@@ -120,13 +120,20 @@
<para>
This section lists variables that are required for recipes.
<itemizedlist>
<listitem><para><filename><link linkend='var-DESCRIPTION'>DESCRIPTION</link>
</filename></para></listitem>
<listitem><para><filename><link linkend='var-LICENSE'>LICENSE</link>
</filename></para></listitem>
<listitem><para><filename><link linkend='var-LIC_FILES_CHKSUM'>LIC_FILES_CHKSUM</link>
</filename></para></listitem>
<listitem><para><filename><link linkend='var-SRC_URI'>SRC_URI</link></filename> - used
in recipes that fetch local or remote files.
</para></listitem>
<listitem><para><filename><link linkend='var-SECTION'>SECTION</link>
</filename></para></listitem>
<listitem><para><filename><link linkend='var-HOMEPAGE'>HOMEPAGE</link>
</filename></para></listitem>
<listitem><para><filename><link linkend='var-AUTHOR'>AUTHOR</link>
</filename></para></listitem>
<listitem><para><filename><link linkend='var-SRC_URI'>SRC_URI</link>
</filename></para></listitem>
</itemizedlist>
</para>
</section>
@@ -173,6 +180,8 @@
<para>
This section lists variables that define extra build information for recipes.
<itemizedlist>
<listitem><para><filename><link linkend='var-DISTRO_PN_ALIAS'>DISTRO_PN_ALIAS</link>
</filename></para></listitem>
<listitem><para><filename><link linkend='var-EXTRA_OECMAKE'>EXTRA_OECMAKE</link>
</filename></para></listitem>
<listitem><para><filename><link linkend='var-EXTRA_OECONF'>EXTRA_OECONF</link>

View File

@@ -83,11 +83,8 @@
Poky derives from and contributes back to the OpenEmbedded project.</para></listitem>
<listitem><para><emphasis><ulink url='http://developer.berlios.de/projects/bitbake/'>
BitBake</ulink>:</emphasis> The tool used to process metadata.</para></listitem>
<listitem><para><emphasis>BitBake User Manual:</emphasis>
A comprehensive guide to the BitBake tool.
You can find the BitBake User Manual in the <filename>bitbake/doc/manual</filename>
directory, which is found in the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>.
<listitem><para><emphasis><ulink url='&BITBAKE_DOCS_URL;'>
BitBake User Manual</ulink>:</emphasis> A comprehensive guide to the BitBake tool.
</para></listitem>
<listitem><para><emphasis><ulink url='http://wiki.qemu.org/Index.html'>QEMU</ulink>:
</emphasis> An open source machine emulator and virtualizer.</para></listitem>

View File

@@ -129,7 +129,7 @@
between metadata files.
An example is the Autotools class, which contains
common settings for any application that Autotools uses.
The "<link linkend='ref-classes'>Classes</link>" chapter provides details
The "<link linkend='ref-classes'>Reference: Classes</link>" chapter provides details
about common classes and how to use them.
</para>
</section>
@@ -143,7 +143,7 @@
These files fall into several areas that define machine configuration options,
distribution configuration options, compiler tuning options, general common configuration
options and user configuration options (<filename>local.conf</filename>, which is found
in the <ulink url='build-directory'>Build Directory</ulink>).
in the <ulink url='build-directory'>build directory</ulink>).
</para>
</section>
</section>
@@ -304,7 +304,7 @@
Information based on direct inputs is referred to as the "basehash" in the
code.
However, there is still the question of a task's indirect inputs - the
things that were already built and present in the Build Directory.
things that were already built and present in the build directory.
The checksum (or signature) for a particular task needs to add the hashes
of all the tasks on which the particular task depends.
Choosing which dependencies to add is a policy decision.
@@ -442,24 +442,14 @@
<para>
Behind the scenes, the shared state code works by looking in
<link linkend='var-SSTATE_DIR'><filename>SSTATE_DIR</filename></link> and
<link linkend='var-SSTATE_MIRRORS'><filename>SSTATE_MIRRORS</filename></link>
for shared state files.
<filename>SSTATE_DIR</filename> and
<filename>SSTATE_MIRRORS</filename> for shared state files.
Here is an example:
<literallayout class='monospaced'>
SSTATE_MIRRORS ?= "\
file://.* http://someserver.tld/share/sstate/PATH \n \
file://.* file:///some/local/dir/sstate/PATH"
file://.* http://someserver.tld/share/sstate/ \n \
file://.* file:///some/local/dir/sstate/"
</literallayout>
<note>
The shared state directory (<filename>SSTATE_DIR</filename>) is
organized into two-character subdirectories, where the subdirectory
names are based on the first two characters of the hash.
If the shared state directory structure for a mirror has the
same structure as <filename>SSTATE_DIR</filename>, you must
specify "PATH" as part of the URI to enable the build system
to map to the appropriate subdirectory.
</note>
</para>
<para>
@@ -650,7 +640,7 @@
Yocto Project, you can follow these steps to use the x32 spABI:
<itemizedlist>
<listitem><para>Add the <filename>experimental/meta-x32</filename> layer to your local
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>Build Directory</ulink>.
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>build directory</ulink>.
You can find the <filename>experimental/meta-x32</filename> source repository at
<ulink url='&YOCTO_GIT_URL;'></ulink>.</para></listitem>
<listitem><para>Edit your <filename>conf/bblayers.conf</filename> file so that it includes
@@ -660,7 +650,6 @@
BBLAYERS ?= " \
/home/nitin/prj/poky.git/meta \
/home/nitin/prj/poky.git/meta-yocto \
/home/nitin/prj/poky.git/meta-yocto-bsp \
/home/nitin/prj/meta-x32.git \
"
</literallayout></para></listitem>
@@ -698,13 +687,6 @@
which by default are disabled.
</para>
<para>
For information that can help you maintain compliance with various open
source licensing during the lifecycle of the product, see the
"<ulink url='&YOCTO_DOCS_DEV_URL;#maintaining-open-source-license-compliance-during-your-products-lifecycle'>Maintaining Open Source License Compliance During Your Project's Lifecycle</ulink>" section
in the Yocto Project Development Manual.
</para>
<section id="usingpoky-configuring-LIC_FILES_CHKSUM">
<title>Tracking License Changes</title>
@@ -742,7 +724,7 @@
<para>
You can also use relative paths as shown in the following example:
<literallayout class='monospaced'>
LIC_FILES_CHKSUM = "file://src/ls.c;beginline=5;endline=16;\
LIC_FILES_CHKSUM = "file://src/ls.c;startline=5;endline=16;\
md5=bb14ed3c4cda583abc85401304b5cd4e"
LIC_FILES_CHKSUM = "file://../license.html;md5=5c94767cedb5d6987c902ac850ded2c6"
</literallayout>
@@ -827,7 +809,7 @@
LICENSE_FLAGS = "commercial"
</literallayout>
Here is a slightly more complicated example that contains both an
explicit recipe name and version (after variable expansion):
explicit package name and version (after variable expansion):
<literallayout class='monospaced'>
LICENSE_FLAGS = "license_${PN}_${PV}"
</literallayout>
@@ -848,7 +830,7 @@
<literallayout class='monospaced'>
LICENSE_FLAGS_WHITELIST = "commercial_gst-plugins-ugly"
</literallayout>
Likewise, to additionally enable the package built from the recipe containing
Likewise, to additionally enable the package containing
<filename>LICENSE_FLAGS = "license_${PN}_${PV}"</filename>, and assuming
that the actual recipe name was <filename>emgd_1.10.bb</filename>,
the following string would enable that package as well as

View File

@@ -30,20 +30,20 @@
The first thing you need to do is set up the OpenEmbedded build environment by sourcing
the environment setup script as follows:
<literallayout class='monospaced'>
$ source &OE_INIT_FILE; [build_dir]
$ source oe-init-build-env [build_dir]
</literallayout>
</para>
<para>
The <filename>build_dir</filename> is optional and specifies the directory the
OpenEmbedded build system uses for the build -
the <ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>Build Directory</ulink>.
If you do not specify a Build Directory it defaults to <filename>build</filename>
the <ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>build directory</ulink>.
If you do not specify a build directory it defaults to <filename>build</filename>
in your current working directory.
A common practice is to use a different Build Directory for different targets.
A common practice is to use a different build directory for different targets.
For example, <filename>~/build/x86</filename> for a <filename>qemux86</filename>
target, and <filename>~/build/arm</filename> for a <filename>qemuarm</filename> target.
See <link linkend="structure-core-script">&OE_INIT_FILE;</link>
See <link linkend="structure-core-script">oe-init-build-env</link>
for more information on this script.
</para>
@@ -58,7 +58,7 @@
The <filename>target</filename> is the name of the recipe you want to build.
Common targets are the images in <filename>meta/recipes-core/images</filename>,
<filename>/meta/recipes-sato/images</filename>, etc. all found in the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>.
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink>.
Or, the target can be the name of a recipe for a specific piece of software such as
<application>busybox</application>.
For more details about the images the OpenEmbedded build system supports, see the
@@ -66,8 +66,8 @@
</para>
<note>
Building an image without GNU General Public License Version 3 (GPLv3) components
is only supported for minimal and base images.
Building an image without GNU Public License Version 3 (GPLv3) components is
only supported for minimal and base images.
See the "<link linkend='ref-images'>Images</link>" chapter for more information.
</note>
</section>
@@ -78,7 +78,7 @@
<para>
When building an image using GPL components, you need to maintain your original
settings and not switch back and forth applying different versions of the GNU
General Public License.
Public License.
If you rebuild using different versions of GPL, dependency errors might occur
due to some components not being rebuilt.
</para>
@@ -91,7 +91,7 @@
<para>
Once an image has been built, it often needs to be installed.
The images and kernels built by the OpenEmbedded build system are placed in the
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>Build Directory</ulink> in
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>build directory</ulink> in
<filename class="directory">tmp/deploy/images</filename>.
For information on how to run pre-built images such as <filename>qemux86</filename>
and <filename>qemuarm</filename>, see the
@@ -268,7 +268,7 @@
For guidance on how logging is handled in both Python and Bash recipes, see the
<filename>logging.bbclass</filename> file in the
<filename>meta/classes</filename> folder of the
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>.
<ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>source directory</ulink>.
</para>
<section id='logging-with-python'>

Some files were not shown because too many files have changed in this diff Show More