Compare commits
192 Commits
1.5_M5.rc5
...
toaster-do
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1182665de0 | ||
|
|
6302d1baf5 | ||
|
|
3390674247 | ||
|
|
0e6bbf8181 | ||
|
|
3b113312fd | ||
|
|
6f9c4d9778 | ||
|
|
f20de8ac90 | ||
|
|
e5cf3e598e | ||
|
|
46814c99ee | ||
|
|
b0c24033bb | ||
|
|
25f50e24c7 | ||
|
|
a6b357a9af | ||
|
|
57beaf994f | ||
|
|
e1aebfe018 | ||
|
|
f6847b0cd2 | ||
|
|
1e6e27d98d | ||
|
|
73293c6481 | ||
|
|
d7b8f82a64 | ||
|
|
4b64eb444a | ||
|
|
db2a7845a9 | ||
|
|
cb1338dedc | ||
|
|
faf8f8660f | ||
|
|
ee9a3c191c | ||
|
|
102bf5e0f6 | ||
|
|
bc37596e8f | ||
|
|
c5a2104c82 | ||
|
|
c042b16d2b | ||
|
|
ac7522bd17 | ||
|
|
c65ae4383d | ||
|
|
82846e69d8 | ||
|
|
5948aaa534 | ||
|
|
28bab2eb20 | ||
|
|
ceb56b7331 | ||
|
|
f52b7f2315 | ||
|
|
75ac719f3e | ||
|
|
4570c2e937 | ||
|
|
5dfb1de6ff | ||
|
|
8229b470b0 | ||
|
|
4404c69019 | ||
|
|
b5ad5ba24b | ||
|
|
7754bd215b | ||
|
|
5445f71fc8 | ||
|
|
5416b958be | ||
|
|
81e678bc0a | ||
|
|
3c5b6af991 | ||
|
|
e57bd62e17 | ||
|
|
e0e30c6239 | ||
|
|
7c72144419 | ||
|
|
f18194c088 | ||
|
|
06afe1fafe | ||
|
|
266a7d8c97 | ||
|
|
22d5782ef5 | ||
|
|
a333693c7f | ||
|
|
ee7e64f116 | ||
|
|
45392cc67a | ||
|
|
95915910df | ||
|
|
0b9c3393c1 | ||
|
|
abeea1be5f | ||
|
|
816b6be64d | ||
|
|
b77cb9b719 | ||
|
|
5f59b3c070 | ||
|
|
7f88c9bf53 | ||
|
|
280045cc66 | ||
|
|
854fa8ef7b | ||
|
|
69a9c18b33 | ||
|
|
105a709bc7 | ||
|
|
869d732517 | ||
|
|
adf8a6364e | ||
|
|
a72f4a9bfc | ||
|
|
0c7b734f96 | ||
|
|
28eedee1d4 | ||
|
|
a59aa9eebb | ||
|
|
acf547084a | ||
|
|
540c27906a | ||
|
|
113398d258 | ||
|
|
479fcbfd30 | ||
|
|
47129f300f | ||
|
|
0d8cbc38ab | ||
|
|
17b5f2f162 | ||
|
|
56ea7aca3e | ||
|
|
9d64f3de4a | ||
|
|
9def5c9542 | ||
|
|
2a013e290d | ||
|
|
20a86e16bc | ||
|
|
4e537df727 | ||
|
|
f81f4c5f21 | ||
|
|
6dff1bc80f | ||
|
|
d299444adc | ||
|
|
104166c804 | ||
|
|
bdfd716b7b | ||
|
|
e7a20238dc | ||
|
|
42b115bb53 | ||
|
|
35a74ee360 | ||
|
|
56f39bcf22 | ||
|
|
a02280f99f | ||
|
|
85a8645347 | ||
|
|
20979ec523 | ||
|
|
30f85cede8 | ||
|
|
43a960abf4 | ||
|
|
b618f74d6e | ||
|
|
d80472c4e3 | ||
|
|
75c143a7ae | ||
|
|
9fc88f96d4 | ||
|
|
53a1d9a788 | ||
|
|
e5d09762c2 | ||
|
|
62e0a4a425 | ||
|
|
0f066bbddb | ||
|
|
218d251fbd | ||
|
|
aa8edc08b0 | ||
|
|
5b973c4924 | ||
|
|
bdede3b8fc | ||
|
|
1cd0b1ea1c | ||
|
|
a81bfcb91f | ||
|
|
6b9cff42a8 | ||
|
|
320f90d917 | ||
|
|
22909d0a47 | ||
|
|
a8a2404053 | ||
|
|
0d194a8c62 | ||
|
|
df2e70a3af | ||
|
|
28144187da | ||
|
|
d8d5841188 | ||
|
|
ec84110a74 | ||
|
|
e2dd4ee7cf | ||
|
|
63bc84cdf5 | ||
|
|
ec51951f96 | ||
|
|
7bd3a81ef5 | ||
|
|
155961db71 | ||
|
|
89d3e75087 | ||
|
|
eb36aaa07f | ||
|
|
b8bdd92ae6 | ||
|
|
7fa2c8f6f7 | ||
|
|
18d6adb73e | ||
|
|
aca7aeadcb | ||
|
|
fcc3b98c5f | ||
|
|
a8d5d06964 | ||
|
|
0f902628fa | ||
|
|
45ace75bbf | ||
|
|
46b76d4b40 | ||
|
|
5cb0828129 | ||
|
|
e44538f4e4 | ||
|
|
56c4de93b9 | ||
|
|
a1d9b6df86 | ||
|
|
b43c8126de | ||
|
|
0fe5d9d657 | ||
|
|
331159d90d | ||
|
|
58825b9b20 | ||
|
|
df18dc084e | ||
|
|
cf2ebed2ff | ||
|
|
072c4e123f | ||
|
|
d2736102f3 | ||
|
|
7509c0f647 | ||
|
|
d4b0a4bee3 | ||
|
|
2471296e25 | ||
|
|
2e1cb79170 | ||
|
|
08d902ac8f | ||
|
|
db51dd22fa | ||
|
|
f9c26fbefb | ||
|
|
4312f5a534 | ||
|
|
66bf6562d2 | ||
|
|
9f3706fcb4 | ||
|
|
1abb7e7829 | ||
|
|
636cbfd8a8 | ||
|
|
e8e3b62d6b | ||
|
|
0ac89346de | ||
|
|
ec9f4c3c25 | ||
|
|
fde2911983 | ||
|
|
4a0ff9c74d | ||
|
|
5a2d11e845 | ||
|
|
24ffda4701 | ||
|
|
197f1fe1cc | ||
|
|
bb8e360657 | ||
|
|
b049d532f6 | ||
|
|
724a466f4c | ||
|
|
b88d1fb377 | ||
|
|
2f64fae60b | ||
|
|
1bff3fc86f | ||
|
|
e5fcc7e1ca | ||
|
|
601e1a740b | ||
|
|
68ec3d4925 | ||
|
|
32edeb391f | ||
|
|
b8819b02dc | ||
|
|
5454f92e57 | ||
|
|
41875facc9 | ||
|
|
d7e22e5f20 | ||
|
|
1ffa203dd5 | ||
|
|
2f8ce2c784 | ||
|
|
41f88ee1db | ||
|
|
141d4f3179 | ||
|
|
d43d7b1893 | ||
|
|
5b5e1b9008 | ||
|
|
c54076ed8a | ||
|
|
e58266dd3b |
@@ -75,14 +75,32 @@ Intel x86 based PCs and devices (genericx86)
|
||||
|
||||
The genericx86 MACHINE is tested on the following platforms:
|
||||
|
||||
o Asus EeePC 901
|
||||
o Acer Aspire One
|
||||
o Toshiba NB305
|
||||
o Intel Embedded Development Board 1-N450 (Black Sand)
|
||||
Intel Xeon/Core i-Series:
|
||||
+ Intel Romley Server: Sandy Bridge Xeon processor, C600 PCH (Patsburg), (Canoe Pass CRB)
|
||||
+ Intel Romley Server: Ivy Bridge Xeon processor, C600 PCH (Patsburg), (Intel SDP S2R3)
|
||||
+ Intel Crystal Forest Server: Sandy Bridge Xeon processor, DH89xx PCH (Cave Creek), (Stargo CRB)
|
||||
+ Intel Chief River Mobile: Ivy Bridge Mobile processor, QM77 PCH (Panther Point-M), (Emerald Lake II CRB, Sabino Canyon CRB)
|
||||
+ Intel Huron River Mobile: Sandy Bridge processor, QM67 PCH (Cougar Point), (Emerald Lake CRB, EVOC EC7-1817LNAR board)
|
||||
+ Intel Calpella Platform: Core i7 processor, QM57 PCH (Ibex Peak-M), (Red Fort CRB, Emerson MATXM CORE-411-B)
|
||||
+ Intel Nehalem/Westmere-EP Server: Xeon 56xx/55xx processors, 5520 chipset, ICH10R IOH (82801), (Hanlan Creek CRB)
|
||||
+ Intel Nehalem Workstation: Xeon 56xx/55xx processors, System SC5650SCWS (Greencity CRB)
|
||||
+ Intel Picket Post Server: Xeon 56xx/55xx processors (Jasper Forest), 3420 chipset (Ibex Peak), (Osage CRB)
|
||||
+ Intel Storage Platform: Sandy Bridge Xeon processor, C600 PCH (Patsburg), (Oak Creek Canyon CRB)
|
||||
+ Intel Shark Bay Client Platform: Haswell processor, LynxPoint PCH, (Walnut Canyon CRB, Lava Canyon CRB, Basking Ridge CRB, Flathead Creek CRB)
|
||||
+ Intel Shark Bay Ultrabook Platform: Haswell ULT processor, Lynx Point-LP PCH, (WhiteTip Mountain 1 CRB)
|
||||
|
||||
and is likely to work on many unlisted Atom based devices. The MACHINE type
|
||||
supports ethernet, wifi, sound, and i915 graphics by default in addition to
|
||||
common PC input devices, busses, and so on.
|
||||
Intel Atom platforms:
|
||||
+ Intel embedded Menlow: Intel Atom Z510/530 CPU, System Controller Hub US15W (Portwell NANO-8044)
|
||||
+ Intel Luna Pier: Intel Atom N4xx/D5xx series CPU (aka: Pineview-D & -M), 82801HM I/O Hub (ICH8M), (Advantech AIMB-212, Moon Creek CRB)
|
||||
+ Intel Queens Bay platform: Intel Atom E6xx CPU (aka: Tunnel Creek), Topcliff EG20T I/O Hub (Emerson NITX-315, Crown Bay CRB, Minnow Board)
|
||||
+ Intel Fish River Island platform: Intel Atom E6xx CPU (aka: Tunnel Creek), Topcliff EG20T I/O Hub (Kontron KM2M806)
|
||||
+ Intel Cedar Trail platform: Intel Atom N2000 & D2000 series CPU (aka: Cedarview), NM10 Express Chipset (Norco kit BIS-6630, Cedar Rock CRB)
|
||||
|
||||
and is likely to work on many unlisted Atom/Core/Xeon based devices. The MACHINE
|
||||
type supports ethernet, wifi, sound, and Intel/vesa graphics by default in
|
||||
addition to common PC input devices, busses, and so on. Note that it does not
|
||||
included the binary-only graphic drivers used on some Atom platforms, for
|
||||
accelerated graphics on these machines please refer to meta-intel.
|
||||
|
||||
Depending on the device, it can boot from a traditional hard-disk, a USB device,
|
||||
or over the network. Writing generated images to physical media is
|
||||
|
||||
10
bitbake/LICENSE
Normal file
@@ -0,0 +1,10 @@
|
||||
BitBake is licensed under the GNU General Public License version 2.0. See COPYING for further details.
|
||||
|
||||
The following external components are distributed with this software:
|
||||
|
||||
* The Toaster Simple UI application is based upon the Django project template, the files of which are covered by the BSD license and are copyright (c) Django Software
|
||||
Foundation and individual contributors.
|
||||
|
||||
* Twitter Bootstrap (including Glyphicons), redistributed under the Apache License 2.0.
|
||||
|
||||
* jQuery is redistributed under the MIT license.
|
||||
@@ -262,8 +262,8 @@ def main():
|
||||
if not configParams.bind:
|
||||
sys.exit("FATAL: The '--server-only' option requires a name/address to bind to with the -B option.\n")
|
||||
if configParams.remote_server:
|
||||
sys.exit("FATAL: The '--server-only' option conflicts with the '--remote-server' option. %s\n" %
|
||||
("Please check your BBSERVER environment" if "BBSERVER" in os.environ else "" ))
|
||||
sys.exit("FATAL: The '--server-only' option conflicts with %s.\n" %
|
||||
("the BBSERVER environment variable" if "BBSERVER" in os.environ else "the '--remote-server' option" ))
|
||||
|
||||
if configParams.bind and configParams.servertype != "xmlrpc":
|
||||
sys.exit("FATAL: If '-B' or '--bind' is defined, we must set the servertype as 'xmlrpc'.\n")
|
||||
@@ -292,13 +292,12 @@ def main():
|
||||
if not configParams.remote_server:
|
||||
# we start a server with a given configuration
|
||||
server = start_server(servermodule, configParams, configuration)
|
||||
bb.event.ui_queue = []
|
||||
else:
|
||||
# we start a stub server that is actually a XMLRPClient that connects to a real server
|
||||
server = servermodule.BitBakeXMLRPCClient(configParams.observe_only)
|
||||
server.saveConnectionDetails(configParams.remote_server)
|
||||
|
||||
logger.removeHandler(handler)
|
||||
|
||||
if not configParams.server_only:
|
||||
# Collect the feature set for the UI
|
||||
featureset = getattr(ui_module, "featureSet", [])
|
||||
@@ -310,6 +309,8 @@ def main():
|
||||
for k in cleanedvars:
|
||||
os.environ[k] = cleanedvars[k]
|
||||
|
||||
logger.removeHandler(handler)
|
||||
|
||||
try:
|
||||
return ui_module.main(server_connection.connection, server_connection.events, configParams)
|
||||
finally:
|
||||
@@ -323,6 +324,8 @@ def main():
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
ret = main()
|
||||
except bb.BBHandledException:
|
||||
ret = 1
|
||||
except Exception:
|
||||
ret = 1
|
||||
import traceback
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# bitbake-diffsigs
|
||||
# BitBake task signature data comparison utility
|
||||
#
|
||||
# Copyright (C) 2012 Intel Corporation
|
||||
# Copyright (C) 2012-2013 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
|
||||
@@ -30,7 +30,18 @@ sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(sys.argv[0])), '
|
||||
import bb.tinfoil
|
||||
import bb.siggen
|
||||
|
||||
logger = logging.getLogger('BitBake')
|
||||
def logger_create(name, output=sys.stderr):
|
||||
logger = logging.getLogger(name)
|
||||
console = logging.StreamHandler(output)
|
||||
format = bb.msg.BBLogFormatter("%(levelname)s: %(message)s")
|
||||
if output.isatty():
|
||||
format.enable_color()
|
||||
console.setFormatter(format)
|
||||
logger.addHandler(console)
|
||||
logger.setLevel(logging.INFO)
|
||||
return logger
|
||||
|
||||
logger = logger_create('bitbake-diffsigs')
|
||||
|
||||
def find_compare_task(bbhandler, pn, taskname):
|
||||
""" Find the most recent signature files for the specified PN/task and compare them """
|
||||
@@ -39,6 +50,9 @@ def find_compare_task(bbhandler, pn, taskname):
|
||||
logger.error('Metadata does not support finding signature data files')
|
||||
sys.exit(1)
|
||||
|
||||
if not taskname.startswith('do_'):
|
||||
taskname = 'do_%s' % taskname
|
||||
|
||||
filedates = bb.siggen.find_siginfo(pn, taskname, None, bbhandler.config_data)
|
||||
latestfiles = sorted(filedates.keys(), key=lambda f: filedates[f])[-2:]
|
||||
if not latestfiles:
|
||||
@@ -71,6 +85,7 @@ def find_compare_task(bbhandler, pn, taskname):
|
||||
|
||||
|
||||
parser = optparse.OptionParser(
|
||||
description = "Compares siginfo/sigdata files written out by BitBake",
|
||||
usage = """
|
||||
%prog -t recipename taskname
|
||||
%prog sigdatafile1 sigdatafile2
|
||||
@@ -78,25 +93,30 @@ parser = optparse.OptionParser(
|
||||
|
||||
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")
|
||||
action="store", dest="taskargs", nargs=2, metavar='recipename taskname')
|
||||
|
||||
options, args = parser.parse_args(sys.argv)
|
||||
|
||||
if len(args) == 1:
|
||||
parser.print_help()
|
||||
if options.taskargs:
|
||||
tinfoil = bb.tinfoil.Tinfoil()
|
||||
tinfoil.prepare(config_only = True)
|
||||
find_compare_task(tinfoil, options.taskargs[0], options.taskargs[1])
|
||||
else:
|
||||
if options.taskmode:
|
||||
tinfoil = bb.tinfoil.Tinfoil()
|
||||
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])
|
||||
if len(args) == 1:
|
||||
parser.print_help()
|
||||
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])
|
||||
import cPickle
|
||||
try:
|
||||
if len(args) == 2:
|
||||
output = bb.siggen.dump_sigfile(sys.argv[1])
|
||||
else:
|
||||
output = bb.siggen.compare_sigfiles(sys.argv[1], sys.argv[2])
|
||||
except IOError as e:
|
||||
logger.error(str(e))
|
||||
sys.exit(1)
|
||||
except cPickle.UnpicklingError, EOFError:
|
||||
logger.error('Invalid signature data - ensure you are specifying sigdata/siginfo files')
|
||||
sys.exit(1)
|
||||
|
||||
if output:
|
||||
print '\n'.join(output)
|
||||
if output:
|
||||
print '\n'.join(output)
|
||||
|
||||
@@ -1,11 +1,65 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# bitbake-dumpsig
|
||||
# BitBake task signature dump utility
|
||||
#
|
||||
# Copyright (C) 2013 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 optparse
|
||||
import logging
|
||||
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(sys.argv[0])), 'lib'))
|
||||
|
||||
import bb.siggen
|
||||
|
||||
output = bb.siggen.dump_sigfile(sys.argv[1])
|
||||
if output:
|
||||
print '\n'.join(output)
|
||||
def logger_create(name, output=sys.stderr):
|
||||
logger = logging.getLogger(name)
|
||||
console = logging.StreamHandler(output)
|
||||
format = bb.msg.BBLogFormatter("%(levelname)s: %(message)s")
|
||||
if output.isatty():
|
||||
format.enable_color()
|
||||
console.setFormatter(format)
|
||||
logger.addHandler(console)
|
||||
logger.setLevel(logging.INFO)
|
||||
return logger
|
||||
|
||||
logger = logger_create('bitbake-dumpsig')
|
||||
|
||||
parser = optparse.OptionParser(
|
||||
description = "Dumps siginfo/sigdata files written out by BitBake",
|
||||
usage = """
|
||||
%prog sigdatafile""")
|
||||
|
||||
options, args = parser.parse_args(sys.argv)
|
||||
|
||||
if len(args) == 1:
|
||||
parser.print_help()
|
||||
else:
|
||||
import cPickle
|
||||
try:
|
||||
output = bb.siggen.dump_sigfile(args[1])
|
||||
except IOError as e:
|
||||
logger.error(str(e))
|
||||
sys.exit(1)
|
||||
except cPickle.UnpicklingError, EOFError:
|
||||
logger.error('Invalid signature data - ensure you are specifying a sigdata/siginfo file')
|
||||
sys.exit(1)
|
||||
|
||||
if output:
|
||||
print '\n'.join(output)
|
||||
|
||||
164
bitbake/bin/toaster
Executable file
@@ -0,0 +1,164 @@
|
||||
#!/bin/bash
|
||||
# (c) 2013 Intel Corp.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
# This script enables toaster event logging and
|
||||
# starts bitbake resident server
|
||||
# use as: source toaster [start|stop]
|
||||
|
||||
# Helper function to kill a background toaster development server
|
||||
|
||||
function webserverKillAll()
|
||||
{
|
||||
local pidfile
|
||||
for pidfile in ${BUILDDIR}/.toastermain.pid; do
|
||||
if [ -f ${pidfile} ]; then
|
||||
while kill -0 $(< ${pidfile}) 2>/dev/null; do
|
||||
kill -SIGTERM -$(< ${pidfile}) 2>/dev/null
|
||||
sleep 1;
|
||||
done;
|
||||
rm ${pidfile}
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
function webserverStartAll()
|
||||
{
|
||||
retval=0
|
||||
python $BBBASEDIR/lib/toaster/manage.py syncdb || retval=1
|
||||
if [ $retval -eq 1 ]; then
|
||||
echo "Failed db sync, stopping system start" 1>&2
|
||||
else
|
||||
python $BBBASEDIR/lib/toaster/manage.py runserver 0.0.0.0:8000 </dev/null >${BUILDDIR}/toaster_web.log 2>&1 & echo $! >${BUILDDIR}/.toastermain.pid
|
||||
fi
|
||||
return $retval
|
||||
}
|
||||
|
||||
# Helper functions to add a special configuration file
|
||||
|
||||
function addtoConfiguration()
|
||||
{
|
||||
echo "#Created by toaster start script" > ${BUILDDIR}/conf/$2
|
||||
echo $1 >> ${BUILDDIR}/conf/$2
|
||||
}
|
||||
|
||||
# define the stop command
|
||||
function stop_system()
|
||||
{
|
||||
if [ -f ${BUILDDIR}/.toasterui.pid ]; then
|
||||
kill $(< ${BUILDDIR}/.toasterui.pid )
|
||||
rm ${BUILDDIR}/.toasterui.pid
|
||||
fi
|
||||
BBSERVER=localhost:8200 bitbake -m
|
||||
unset BBSERVER
|
||||
webserverKillAll
|
||||
# force stop any misbehaving bitbake server
|
||||
lsof bitbake.lock | awk '{print $2}' | grep "[0-9]\+" | xargs -n1 -r kill
|
||||
}
|
||||
|
||||
# We make sure we're running in the current shell and in a good environment
|
||||
|
||||
if [ -z "$ZSH_NAME" ] && [ `basename \"$0\"` = `basename \"$BASH_SOURCE\"` ]; then
|
||||
echo "Error: This script needs to be sourced. Please run as 'source toaster [start|stop]'" 1>&2;
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$BUILDDIR" ] || [ -z `which bitbake` ]; then
|
||||
echo "Error: Build environment is not setup or bitbake is not in path." 1>&2;
|
||||
return 2
|
||||
fi
|
||||
|
||||
BBBASEDIR=`dirname ${BASH_SOURCE}`/..
|
||||
|
||||
|
||||
# Verify prerequisites
|
||||
|
||||
if ! echo "import django; print (1,4,5) == django.VERSION[0:3]" | python 2>/dev/null | grep True >/dev/null; then
|
||||
echo -e "This program needs Django 1.4.5. Please install with\n\nsudo pip install django==1.4.5"
|
||||
return 2
|
||||
fi
|
||||
|
||||
|
||||
|
||||
# Determine the action. If specified by arguments, fine, if not, toggle it
|
||||
if [ "x$1" == "xstart" ] || [ "x$1" == "xstop" ]; then
|
||||
CMD="$1"
|
||||
else
|
||||
if [ -z "$BBSERVER" ]; then
|
||||
CMD="start"
|
||||
else
|
||||
CMD="stop"
|
||||
fi;
|
||||
fi
|
||||
|
||||
NOTOASTERUI=0
|
||||
if [ "x$2" == "xnoui" ]; then
|
||||
NOTOASTERUI=1
|
||||
fi
|
||||
|
||||
echo "The system will $CMD."
|
||||
|
||||
# Make sure it's safe to run by checking bitbake lock
|
||||
|
||||
lock=1
|
||||
if [ -e $BUILDDIR/bitbake.lock ]; then
|
||||
(flock -n 200 ) 200<$BUILDDIR/bitbake.lock || lock=0
|
||||
fi
|
||||
|
||||
if [ ${CMD} == "start" ] && ( [ $lock -eq 0 ] || [ -e $BUILDDIR/.toastermain.pid ] ); then
|
||||
echo "Error: bitbake lock state error. System is already on." 2>&1
|
||||
return 3
|
||||
elif [ ${CMD} == "stop" ] && ( [ $lock -eq 1 ] || ! [ -e $BUILDDIR/.toastermain.pid ] ) ; then
|
||||
echo "Error: bitbake lock state error. Trying to stop a stopped system ?
|
||||
If you think the system is hanged up, you can try to manually stop system with the commands
|
||||
|
||||
# BBSERVER=localhost:8200 bitbake -m
|
||||
|
||||
and
|
||||
|
||||
# webserverKillAll
|
||||
" 2>&1
|
||||
return 3
|
||||
fi
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Execute the commands
|
||||
|
||||
case $CMD in
|
||||
start )
|
||||
addtoConfiguration "INHERIT+=\"toaster buildhistory\"" toaster.conf
|
||||
webserverStartAll || return 4
|
||||
unset BBSERVER
|
||||
bitbake --postread conf/toaster.conf --server-only -t xmlrpc -B localhost:8200
|
||||
export BBSERVER=localhost:8200
|
||||
if [ $NOTOASTERUI == 0 ]; then # we start the TOASTERUI only if not inhibited
|
||||
bitbake --observe-only -u toasterui >${BUILDDIR}/toaster_ui.log 2>&1 & echo $! >${BUILDDIR}/.toasterui.pid
|
||||
fi
|
||||
# stop system on terminal exit
|
||||
trap stop_system SIGHUP
|
||||
;;
|
||||
stop )
|
||||
stop_system
|
||||
trap '' SIGHUP
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "Successful ${CMD}."
|
||||
|
||||
@@ -91,6 +91,9 @@ class TaskBase(event.Event):
|
||||
|
||||
class TaskStarted(TaskBase):
|
||||
"""Task execution started"""
|
||||
def __init__(self, t, logfile, taskflags, d):
|
||||
super(TaskStarted, self).__init__(t, logfile, d)
|
||||
self.taskflags = taskflags
|
||||
|
||||
class TaskSucceeded(TaskBase):
|
||||
"""Task execution completed"""
|
||||
@@ -422,7 +425,9 @@ def _exec_task(fn, task, d, quieterr):
|
||||
localdata.setVar('BB_LOGFILE', logfn)
|
||||
localdata.setVar('BB_RUNTASK', task)
|
||||
|
||||
event.fire(TaskStarted(task, logfn, localdata), localdata)
|
||||
flags = localdata.getVarFlags(task)
|
||||
|
||||
event.fire(TaskStarted(task, logfn, flags, localdata), localdata)
|
||||
try:
|
||||
for func in (prefuncs or '').split():
|
||||
exec_func(func, localdata)
|
||||
|
||||
@@ -241,6 +241,13 @@ class CommandsSync:
|
||||
op = params[3]
|
||||
command.cooker.modifyConfigurationVar(var, val, default_file, op)
|
||||
|
||||
def removeVarFile(self, command, params):
|
||||
"""
|
||||
Remove a variable declaration from a file
|
||||
"""
|
||||
var = params[0]
|
||||
command.cooker.removeConfigurationVar(var)
|
||||
|
||||
def createConfigFile(self, command, params):
|
||||
"""
|
||||
Create an extra configuration file
|
||||
|
||||
@@ -81,7 +81,7 @@ class SkippedPackage:
|
||||
|
||||
|
||||
class CookerFeatures(object):
|
||||
_feature_list = [HOB_EXTRA_CACHES, SEND_DEPENDS_TREE] = range(2)
|
||||
_feature_list = [HOB_EXTRA_CACHES, SEND_DEPENDS_TREE, BASEDATASTORE_TRACKING] = range(3)
|
||||
|
||||
def __init__(self):
|
||||
self._features=set()
|
||||
@@ -177,6 +177,9 @@ class BBCooker:
|
||||
self.data.disableTracking()
|
||||
|
||||
def loadConfigurationData(self):
|
||||
if CookerFeatures.BASEDATASTORE_TRACKING in self.featureset:
|
||||
self.enableDataTracking()
|
||||
|
||||
self.initConfigurationData()
|
||||
self.databuilder.parseBaseConfiguration()
|
||||
self.data = self.databuilder.data
|
||||
@@ -189,11 +192,18 @@ class BBCooker:
|
||||
bb.data.update_data(self.event_data)
|
||||
bb.parse.init_parser(self.event_data)
|
||||
|
||||
if CookerFeatures.BASEDATASTORE_TRACKING in self.featureset:
|
||||
self.disableDataTracking()
|
||||
|
||||
|
||||
def modifyConfigurationVar(self, var, val, default_file, op):
|
||||
if op == "append":
|
||||
self.appendConfigurationVar(var, val, default_file)
|
||||
elif op == "set":
|
||||
self.saveConfigurationVar(var, val, default_file)
|
||||
self.saveConfigurationVar(var, val, default_file, "=")
|
||||
elif op == "earlyAssign":
|
||||
self.saveConfigurationVar(var, val, default_file, "?=")
|
||||
|
||||
|
||||
def appendConfigurationVar(self, var, val, default_file):
|
||||
#add append var operation to the end of default_file
|
||||
@@ -207,7 +217,7 @@ class BBCooker:
|
||||
for c in contents:
|
||||
total += c
|
||||
|
||||
total += "#added by bitbake"
|
||||
total += "#added by hob"
|
||||
total += "\n%s += \"%s\"\n" % (var, val)
|
||||
|
||||
with open(default_file, 'w') as f:
|
||||
@@ -218,7 +228,7 @@ class BBCooker:
|
||||
loginfo = {"op":append, "file":default_file, "line":total.count("\n")}
|
||||
self.data.appendVar(var, val, **loginfo)
|
||||
|
||||
def saveConfigurationVar(self, var, val, default_file):
|
||||
def saveConfigurationVar(self, var, val, default_file, op):
|
||||
|
||||
replaced = False
|
||||
#do not save if nothing changed
|
||||
@@ -260,8 +270,8 @@ class BBCooker:
|
||||
#check if the variable was saved before in the same way
|
||||
#if true it replace the place where the variable was declared
|
||||
#else it comments it
|
||||
if contents[begin_line-1]== "#added by bitbake\n":
|
||||
contents[begin_line] = "%s = \"%s\"\n" % (var, val)
|
||||
if contents[begin_line-1]== "#added by hob\n":
|
||||
contents[begin_line] = "%s %s \"%s\"\n" % (var, op, val)
|
||||
replaced = True
|
||||
else:
|
||||
for ii in range(begin_line, end_line):
|
||||
@@ -290,8 +300,8 @@ class BBCooker:
|
||||
total += c
|
||||
|
||||
#add the variable on a single line, to be easy to replace the second time
|
||||
total += "\n#added by bitbake"
|
||||
total += "\n%s = \"%s\"\n" % (var, val)
|
||||
total += "\n#added by hob"
|
||||
total += "\n%s %s \"%s\"\n" % (var, op, val)
|
||||
|
||||
with open(default_file, 'w') as f:
|
||||
f.write(total)
|
||||
@@ -301,13 +311,50 @@ class BBCooker:
|
||||
loginfo = {"op":set, "file":default_file, "line":total.count("\n")}
|
||||
self.data.setVar(var, val, **loginfo)
|
||||
|
||||
def removeConfigurationVar(self, var):
|
||||
conf_files = self.data.varhistory.get_variable_files(var)
|
||||
topdir = self.data.getVar("TOPDIR")
|
||||
|
||||
for conf_file in conf_files:
|
||||
if topdir in conf_file:
|
||||
with open(conf_file, 'r') as f:
|
||||
contents = f.readlines()
|
||||
f.close()
|
||||
|
||||
lines = self.data.varhistory.get_variable_lines(var, conf_file)
|
||||
for line in lines:
|
||||
total = ""
|
||||
i = 0
|
||||
for c in contents:
|
||||
total += c
|
||||
i = i + 1
|
||||
if i==int(line):
|
||||
end_index = len(total)
|
||||
index = total.rfind(var, 0, end_index)
|
||||
|
||||
begin_line = total.count("\n",0,index)
|
||||
|
||||
#check if the variable was saved before in the same way
|
||||
if contents[begin_line-1]== "#added by hob\n":
|
||||
contents[begin_line-1] = contents[begin_line] = "\n"
|
||||
else:
|
||||
contents[begin_line] = "\n"
|
||||
#remove var from history
|
||||
self.data.varhistory.del_var_history(var, conf_file, line)
|
||||
|
||||
total = ""
|
||||
for c in contents:
|
||||
total += c
|
||||
with open(conf_file, 'w') as f:
|
||||
f.write(total)
|
||||
f.close()
|
||||
|
||||
def createConfigFile(self, name):
|
||||
path = os.getcwd()
|
||||
confpath = os.path.join(path, "conf", name)
|
||||
open(confpath, 'w').close()
|
||||
|
||||
def parseConfiguration(self):
|
||||
|
||||
# Set log file verbosity
|
||||
verboselogs = bb.utils.to_boolean(self.data.getVar("BB_VERBOSE_LOGS", "0"))
|
||||
if verboselogs:
|
||||
@@ -470,6 +517,7 @@ class BBCooker:
|
||||
depend_tree["packages"] = {}
|
||||
depend_tree["rdepends-pkg"] = {}
|
||||
depend_tree["rrecs-pkg"] = {}
|
||||
depend_tree["layer-priorities"] = self.recipecache.bbfile_config_priorities
|
||||
|
||||
for task in xrange(len(rq.rqdata.runq_fnid)):
|
||||
taskname = rq.rqdata.runq_task[task]
|
||||
@@ -481,6 +529,7 @@ class BBCooker:
|
||||
depend_tree["pn"][pn] = {}
|
||||
depend_tree["pn"][pn]["filename"] = fn
|
||||
depend_tree["pn"][pn]["version"] = version
|
||||
depend_tree["pn"][pn]["inherits"] = self.recipecache.inherits.get(fn, None)
|
||||
|
||||
# if we have extra caches, list all attributes they bring in
|
||||
extra_info = []
|
||||
@@ -1042,7 +1091,6 @@ class BBCooker:
|
||||
|
||||
self.buildSetVars()
|
||||
|
||||
self.recipecache = bb.cache.CacheData(self.caches_array)
|
||||
infos = bb.cache.Cache.parse(fn, self.collection.get_file_appends(fn), \
|
||||
self.data,
|
||||
self.caches_array)
|
||||
@@ -1161,7 +1209,10 @@ class BBCooker:
|
||||
try:
|
||||
v = self.data.getVar(k, True)
|
||||
if not k.startswith("__") and not isinstance(v, bb.data_smart.DataSmart):
|
||||
dump[k] = { 'v' : v }
|
||||
dump[k] = {
|
||||
'v' : v ,
|
||||
'history' : self.data.varhistory.variable(k),
|
||||
}
|
||||
for d in flaglist:
|
||||
dump[k][d] = self.data.getVarFlag(k, d)
|
||||
except Exception as e:
|
||||
|
||||
@@ -281,9 +281,13 @@ class VariableHistory(object):
|
||||
lines.append(line)
|
||||
return lines
|
||||
|
||||
def del_var_history(self, var):
|
||||
def del_var_history(self, var, f=None, line=None):
|
||||
"""If file f and line are not given, the entire history of var is deleted"""
|
||||
if var in self.variables:
|
||||
self.variables[var] = []
|
||||
if f and line:
|
||||
self.variables[var] = [ x for x in self.variables[var] if x['file']!=f and x['line']!=line]
|
||||
else:
|
||||
self.variables[var] = []
|
||||
|
||||
class DataSmart(MutableMapping):
|
||||
def __init__(self, special = COWDictBase.copy(), seen = COWDictBase.copy() ):
|
||||
|
||||
@@ -225,7 +225,7 @@ class diskMonitor:
|
||||
self.preFreeS[k] = freeSpace
|
||||
|
||||
if action == "STOPTASKS" and not self.checked[k]:
|
||||
logger.error("No new tasks can be excuted since the disk space monitor action is \"STOPTASKS\"!")
|
||||
logger.error("No new tasks can be executed since the disk space monitor action is \"STOPTASKS\"!")
|
||||
self.checked[k] = True
|
||||
rq.finish_runqueue(False)
|
||||
bb.event.fire(bb.event.DiskFull(dev, 'disk', freeSpace, path), self.configuration)
|
||||
@@ -253,7 +253,7 @@ class diskMonitor:
|
||||
self.preFreeI[k] = freeInode
|
||||
|
||||
if action == "STOPTASKS" and not self.checked[k]:
|
||||
logger.error("No new tasks can be excuted since the disk space monitor action is \"STOPTASKS\"!")
|
||||
logger.error("No new tasks can be executed since the disk space monitor action is \"STOPTASKS\"!")
|
||||
self.checked[k] = True
|
||||
rq.finish_runqueue(False)
|
||||
bb.event.fire(bb.event.DiskFull(dev, 'inode', freeInode, path), self.configuration)
|
||||
|
||||
@@ -354,9 +354,12 @@ class BitBakeXMLRPCClient(BitBakeBaseServer):
|
||||
s.close()
|
||||
except:
|
||||
return None
|
||||
self.serverImpl = XMLRPCProxyServer(host, port)
|
||||
self.connection = BitBakeXMLRPCServerConnection(self.serverImpl, (ip, 0), self.observer_only, featureset)
|
||||
return self.connection.connect()
|
||||
try:
|
||||
self.serverImpl = XMLRPCProxyServer(host, port)
|
||||
self.connection = BitBakeXMLRPCServerConnection(self.serverImpl, (ip, 0), self.observer_only, featureset)
|
||||
return self.connection.connect()
|
||||
except Exception as e:
|
||||
bb.fatal("Could not connect to server at %s:%s (%s)" % (host, port, str(e)))
|
||||
|
||||
def endSession(self):
|
||||
self.connection.removeClient()
|
||||
|
||||
738
bitbake/lib/bb/ui/buildinfohelper.py
Normal file
@@ -0,0 +1,738 @@
|
||||
#
|
||||
# BitBake ToasterUI Implementation
|
||||
#
|
||||
# Copyright (C) 2013 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 datetime
|
||||
import sys
|
||||
import bb
|
||||
import re
|
||||
import subprocess
|
||||
|
||||
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "toaster.toastermain.settings")
|
||||
|
||||
import toaster.toastermain.settings as toaster_django_settings
|
||||
from toaster.orm.models import Build, Task, Recipe, Layer_Version, Layer, Target, LogMessage
|
||||
from toaster.orm.models import Variable, VariableHistory
|
||||
from toaster.orm.models import Target_Package, Build_Package, Build_File
|
||||
from toaster.orm.models import Task_Dependency, Build_Package_Dependency
|
||||
from toaster.orm.models import Target_Package_Dependency, Recipe_Dependency
|
||||
from bb.msg import BBLogFormatter as format
|
||||
|
||||
class ORMWrapper(object):
|
||||
""" This class creates the dictionaries needed to store information in the database
|
||||
following the format defined by the Django models. It is also used to save this
|
||||
information in the database.
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
|
||||
def create_build_object(self, build_info):
|
||||
|
||||
build = Build.objects.create(
|
||||
machine=build_info['machine'],
|
||||
image_fstypes=build_info['image_fstypes'],
|
||||
distro=build_info['distro'],
|
||||
distro_version=build_info['distro_version'],
|
||||
started_on=build_info['started_on'],
|
||||
completed_on=build_info['completed_on'],
|
||||
cooker_log_path=build_info['cooker_log_path'],
|
||||
build_name=build_info['build_name'],
|
||||
bitbake_version=build_info['bitbake_version'])
|
||||
|
||||
return build
|
||||
|
||||
def create_target_objects(self, target_info):
|
||||
targets = []
|
||||
for tgt_name in target_info['targets']:
|
||||
tgt_object = Target.objects.create( build = target_info['build'],
|
||||
target = tgt_name,
|
||||
is_image = False,
|
||||
file_name = "",
|
||||
file_size = 0);
|
||||
targets.append(tgt_object)
|
||||
return targets
|
||||
|
||||
def update_build_object(self, build, errors, warnings, taskfailures):
|
||||
|
||||
outcome = Build.SUCCEEDED
|
||||
if errors or taskfailures:
|
||||
outcome = Build.FAILED
|
||||
|
||||
build.completed_on = datetime.datetime.now()
|
||||
build.errors_no = errors
|
||||
build.warnings_no = warnings
|
||||
build.outcome = outcome
|
||||
build.save()
|
||||
|
||||
|
||||
def get_update_task_object(self, task_information):
|
||||
task_object, created = Task.objects.get_or_create(
|
||||
build=task_information['build'],
|
||||
recipe=task_information['recipe'],
|
||||
task_name=task_information['task_name'],
|
||||
)
|
||||
|
||||
for v in vars(task_object):
|
||||
if v in task_information.keys():
|
||||
vars(task_object)[v] = task_information[v]
|
||||
# if we got covered by a setscene task, we're SSTATE
|
||||
if task_object.outcome == Task.OUTCOME_COVERED and 1 == Task.objects.filter(task_executed=True, build = task_object.build, recipe = task_object.recipe, task_name=task_object.task_name+"_setscene").count():
|
||||
task_object.outcome = Task.OUTCOME_SSTATE
|
||||
outcome_task_setscene = Task.objects.get(task_executed=True, build = task_object.build,
|
||||
recipe = task_object.recipe, task_name=task_object.task_name+"_setscene").outcome
|
||||
if outcome_task_setscene == Task.OUTCOME_SUCCESS:
|
||||
task_object.sstate_result = Task.SSTATE_RESTORED
|
||||
elif outcome_task_setscene == Task.OUTCOME_FAILED:
|
||||
task_object.sstate_result = Task.SSTATE_FAILED
|
||||
|
||||
# mark down duration if we have a start time
|
||||
if 'start_time' in task_information.keys():
|
||||
duration = datetime.datetime.now() - task_information['start_time']
|
||||
task_object.elapsed_time = duration.total_seconds()
|
||||
|
||||
task_object.save()
|
||||
return task_object
|
||||
|
||||
|
||||
def get_update_recipe_object(self, recipe_information):
|
||||
|
||||
recipe_object, created = Recipe.objects.get_or_create(
|
||||
layer_version=recipe_information['layer_version'],
|
||||
file_path=recipe_information['file_path'])
|
||||
|
||||
for v in vars(recipe_object):
|
||||
if v in recipe_information.keys():
|
||||
vars(recipe_object)[v] = recipe_information[v]
|
||||
|
||||
recipe_object.save()
|
||||
|
||||
return recipe_object
|
||||
|
||||
def get_layer_version_object(self, layer_version_information):
|
||||
|
||||
layer_version_object = Layer_Version.objects.get_or_create(
|
||||
layer = layer_version_information['layer'],
|
||||
branch = layer_version_information['branch'],
|
||||
commit = layer_version_information['commit'],
|
||||
priority = layer_version_information['priority']
|
||||
)
|
||||
|
||||
layer_version_object[0].save()
|
||||
|
||||
return layer_version_object[0]
|
||||
|
||||
def get_update_layer_object(self, layer_information):
|
||||
|
||||
layer_object = Layer.objects.get_or_create(
|
||||
name=layer_information['name'],
|
||||
local_path=layer_information['local_path'],
|
||||
layer_index_url=layer_information['layer_index_url'])
|
||||
layer_object[0].save()
|
||||
|
||||
return layer_object[0]
|
||||
|
||||
|
||||
def save_target_package_information(self, target_obj, packagedict, bldpkgs, recipes):
|
||||
for p in packagedict:
|
||||
packagedict[p]['object'] = Target_Package.objects.create( target = target_obj,
|
||||
name = p,
|
||||
size = packagedict[p]['size'])
|
||||
if p in bldpkgs:
|
||||
packagedict[p]['object'].version = bldpkgs[p]['version']
|
||||
packagedict[p]['object'].recipe = recipes[bldpkgs[p]['pn']]
|
||||
packagedict[p]['object'].save()
|
||||
|
||||
for p in packagedict:
|
||||
for (px,deptype) in packagedict[p]['depends']:
|
||||
Target_Package_Dependency.objects.create( package = packagedict[p]['object'],
|
||||
depends_on = packagedict[px]['object'],
|
||||
dep_type = deptype);
|
||||
|
||||
|
||||
def create_logmessage(self, log_information):
|
||||
log_object = LogMessage.objects.create(
|
||||
build = log_information['build'],
|
||||
level = log_information['level'],
|
||||
message = log_information['message'])
|
||||
|
||||
for v in vars(log_object):
|
||||
if v in log_information.keys():
|
||||
vars(log_object)[v] = log_information[v]
|
||||
|
||||
return log_object.save()
|
||||
|
||||
|
||||
def save_build_package_information(self, build_obj, package_info, recipes):
|
||||
# create and save the object
|
||||
bp_object = Build_Package.objects.create( build = build_obj,
|
||||
recipe = recipes[package_info['PN']],
|
||||
name = package_info['PKG'],
|
||||
version = package_info['PKGV'],
|
||||
revision = package_info['PKGR'],
|
||||
summary = package_info['SUMMARY'],
|
||||
description = package_info['DESCRIPTION'],
|
||||
size = int(package_info['PKGSIZE']) * 1024,
|
||||
section = package_info['SECTION'],
|
||||
license = package_info['LICENSE'],
|
||||
)
|
||||
# save any attached file information
|
||||
for path in package_info['FILES_INFO']:
|
||||
fo = Build_File.objects.create( bpackage = bp_object,
|
||||
path = path,
|
||||
size = package_info['FILES_INFO'][path] )
|
||||
|
||||
# save soft dependency information
|
||||
if 'RDEPENDS' in package_info and package_info['RDEPENDS']:
|
||||
for p in bb.utils.explode_deps(package_info['RDEPENDS']):
|
||||
Build_Package_Dependency.objects.get_or_create( package = bp_object,
|
||||
depends_on = p, dep_type = Build_Package_Dependency.TYPE_RDEPENDS)
|
||||
if 'RPROVIDES' in package_info and package_info['RPROVIDES']:
|
||||
for p in bb.utils.explode_deps(package_info['RPROVIDES']):
|
||||
Build_Package_Dependency.objects.get_or_create( package = bp_object,
|
||||
depends_on = p, dep_type = Build_Package_Dependency.TYPE_RPROVIDES)
|
||||
if 'RRECOMMENDS' in package_info and package_info['RRECOMMENDS']:
|
||||
for p in bb.utils.explode_deps(package_info['RRECOMMENDS']):
|
||||
Build_Package_Dependency.objects.get_or_create( package = bp_object,
|
||||
depends_on = p, dep_type = Build_Package_Dependency.TYPE_RRECOMMENDS)
|
||||
if 'RSUGGESTS' in package_info and package_info['RSUGGESTS']:
|
||||
for p in bb.utils.explode_deps(package_info['RSUGGESTS']):
|
||||
Build_Package_Dependency.objects.get_or_create( package = bp_object,
|
||||
depends_on = p, dep_type = Build_Package_Dependency.TYPE_RSUGGESTS)
|
||||
if 'RREPLACES' in package_info and package_info['RREPLACES']:
|
||||
for p in bb.utils.explode_deps(package_info['RREPLACES']):
|
||||
Build_Package_Dependency.objects.get_or_create( package = bp_object,
|
||||
depends_on = p, dep_type = Build_Package_Dependency.TYPE_RREPLACES)
|
||||
if 'RCONFLICTS' in package_info and package_info['RCONFLICTS']:
|
||||
for p in bb.utils.explode_deps(package_info['RCONFLICTS']):
|
||||
Build_Package_Dependency.objects.get_or_create( package = bp_object,
|
||||
depends_on = p, dep_type = Build_Package_Dependency.TYPE_RCONFLICTS)
|
||||
|
||||
return bp_object
|
||||
|
||||
def save_build_variables(self, build_obj, vardump):
|
||||
for k in vardump:
|
||||
if not bool(vardump[k]['func']):
|
||||
value = vardump[k]['v'];
|
||||
if value is None:
|
||||
value = ''
|
||||
desc = vardump[k]['doc'];
|
||||
if desc is None:
|
||||
var_words = [word for word in k.split('_')]
|
||||
root_var = "_".join([word for word in var_words if word.isupper()])
|
||||
if root_var and root_var != k and root_var in vardump:
|
||||
desc = vardump[root_var]['doc']
|
||||
if desc is None:
|
||||
desc = ''
|
||||
variable_obj = Variable.objects.create( build = build_obj,
|
||||
variable_name = k,
|
||||
variable_value = value,
|
||||
description = desc)
|
||||
for vh in vardump[k]['history']:
|
||||
VariableHistory.objects.create( variable = variable_obj,
|
||||
file_name = vh['file'],
|
||||
line_number = vh['line'],
|
||||
operation = vh['op'])
|
||||
|
||||
class BuildInfoHelper(object):
|
||||
""" This class gathers the build information from the server and sends it
|
||||
towards the ORM wrapper for storing in the database
|
||||
It is instantiated once per build
|
||||
Keeps in memory all data that needs matching before writing it to the database
|
||||
"""
|
||||
|
||||
def __init__(self, server, has_build_history = False):
|
||||
self._configure_django()
|
||||
self.internal_state = {}
|
||||
self.task_order = 0
|
||||
self.server = server
|
||||
self.orm_wrapper = ORMWrapper()
|
||||
self.has_build_history = has_build_history
|
||||
self.tmp_dir = self.server.runCommand(["getVariable", "TMPDIR"])[0]
|
||||
|
||||
def _configure_django(self):
|
||||
# Add toaster to sys path for importing modules
|
||||
sys.path.append(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'toaster'))
|
||||
|
||||
###################
|
||||
## methods to convert event/external info into objects that the ORM layer uses
|
||||
|
||||
def _get_layer_dict(self, layer_path):
|
||||
|
||||
layer_info = {}
|
||||
layer_name = layer_path.split('/')[-1]
|
||||
layer_url = 'http://layers.openembedded.org/layerindex/layer/{layer}/'
|
||||
layer_url_name = self._get_url_map_name(layer_name)
|
||||
|
||||
layer_info['name'] = layer_name
|
||||
layer_info['local_path'] = layer_path
|
||||
layer_info['layer_index_url'] = layer_url.format(layer=layer_url_name)
|
||||
|
||||
return layer_info
|
||||
|
||||
def _get_url_map_name(self, layer_name):
|
||||
""" Some layers have a different name on openembedded.org site,
|
||||
this method returns the correct name to use in the URL
|
||||
"""
|
||||
|
||||
url_name = layer_name
|
||||
url_mapping = {'meta': 'openembedded-core'}
|
||||
|
||||
for key in url_mapping.keys():
|
||||
if key == layer_name:
|
||||
url_name = url_mapping[key]
|
||||
|
||||
return url_name
|
||||
|
||||
def _get_layer_information(self):
|
||||
|
||||
layer_info = {}
|
||||
|
||||
return layer_info
|
||||
|
||||
def _get_layer_version_information(self, layer_object):
|
||||
|
||||
layer_version_info = {}
|
||||
layer_version_info['build'] = self.internal_state['build']
|
||||
layer_version_info['layer'] = layer_object
|
||||
layer_version_info['branch'] = self._get_git_branch(layer_object.local_path)
|
||||
layer_version_info['commit'] = self._get_git_revision(layer_object.local_path)
|
||||
layer_version_info['priority'] = 0
|
||||
|
||||
return layer_version_info
|
||||
|
||||
|
||||
def _get_git_branch(self, layer_path):
|
||||
branch = subprocess.Popen("git symbolic-ref HEAD 2>/dev/null ", cwd=layer_path, shell=True, stdout=subprocess.PIPE).communicate()[0]
|
||||
branch = branch.replace('refs/heads/', '').rstrip()
|
||||
return branch
|
||||
|
||||
def _get_git_revision(self, layer_path):
|
||||
revision = subprocess.Popen("git rev-parse HEAD 2>/dev/null ", cwd=layer_path, shell=True, stdout=subprocess.PIPE).communicate()[0].rstrip()
|
||||
return revision
|
||||
|
||||
|
||||
def _get_build_information(self):
|
||||
build_info = {}
|
||||
# Generate an identifier for each new build
|
||||
|
||||
build_info['machine'] = self.server.runCommand(["getVariable", "MACHINE"])[0]
|
||||
build_info['distro'] = self.server.runCommand(["getVariable", "DISTRO"])[0]
|
||||
build_info['distro_version'] = self.server.runCommand(["getVariable", "DISTRO_VERSION"])[0]
|
||||
build_info['started_on'] = datetime.datetime.now()
|
||||
build_info['completed_on'] = datetime.datetime.now()
|
||||
build_info['image_fstypes'] = self._remove_redundant(self.server.runCommand(["getVariable", "IMAGE_FSTYPES"])[0] or "")
|
||||
build_info['cooker_log_path'] = self.server.runCommand(["getVariable", "BB_CONSOLELOG"])[0]
|
||||
build_info['build_name'] = self.server.runCommand(["getVariable", "BUILDNAME"])[0]
|
||||
build_info['bitbake_version'] = self.server.runCommand(["getVariable", "BB_VERSION"])[0]
|
||||
|
||||
return build_info
|
||||
|
||||
def _get_task_information(self, event, recipe):
|
||||
|
||||
|
||||
task_information = {}
|
||||
task_information['build'] = self.internal_state['build']
|
||||
task_information['outcome'] = Task.OUTCOME_NA
|
||||
task_information['recipe'] = recipe
|
||||
task_information['task_name'] = event.taskname
|
||||
try:
|
||||
# some tasks don't come with a hash. and that's ok
|
||||
task_information['sstate_checksum'] = event.taskhash
|
||||
except AttributeError:
|
||||
pass
|
||||
return task_information
|
||||
|
||||
def _get_layer_version_for_path(self, path):
|
||||
def _slkey(layer_version):
|
||||
return len(layer_version.layer.local_path)
|
||||
|
||||
# Heuristics: we always match recipe to the deepest layer path that
|
||||
# we can match to the recipe file path
|
||||
for bl in sorted(self.internal_state['layer_versions'], reverse=True, key=_slkey):
|
||||
if (path.startswith(bl.layer.local_path)):
|
||||
return bl
|
||||
|
||||
#TODO: if we get here, we didn't read layers correctly
|
||||
assert False
|
||||
return None
|
||||
|
||||
def _get_recipe_information_from_build_event(self, event):
|
||||
|
||||
layer_version_obj = self._get_layer_version_for_path(re.split(':', event.taskfile)[-1])
|
||||
|
||||
recipe_info = {}
|
||||
recipe_info['layer_version'] = layer_version_obj
|
||||
recipe_info['file_path'] = re.split(':', event.taskfile)[-1]
|
||||
|
||||
return recipe_info
|
||||
|
||||
def _get_task_build_stats(self, task_object):
|
||||
bs_path = self._get_path_information(task_object)
|
||||
for bp in bs_path: # TODO: split for each target
|
||||
task_build_stats = self._get_build_stats_from_file(bp, task_object.task_name)
|
||||
|
||||
return task_build_stats
|
||||
|
||||
def _get_path_information(self, task_object):
|
||||
build_stats_format = "{tmpdir}/buildstats/{target}-{machine}/{buildname}/{package}/"
|
||||
build_stats_path = []
|
||||
|
||||
for t in self.internal_state['targets']:
|
||||
target = t.target
|
||||
machine = self.internal_state['build'].machine
|
||||
buildname = self.internal_state['build'].build_name
|
||||
pe, pv = task_object.recipe.version.split(":",1)
|
||||
if len(pe) > 0:
|
||||
package = task_object.recipe.name + "-" + pe + "_" + pv
|
||||
else:
|
||||
package = task_object.recipe.name + "-" + pv
|
||||
|
||||
build_stats_path.append(build_stats_format.format(tmpdir=self.tmp_dir, target=target,
|
||||
machine=machine, buildname=buildname,
|
||||
package=package))
|
||||
|
||||
return build_stats_path
|
||||
|
||||
def _get_build_stats_from_file(self, bs_path, task_name):
|
||||
|
||||
task_bs_filename = str(bs_path) + str(task_name)
|
||||
task_bs = open(task_bs_filename, 'r')
|
||||
|
||||
cpu_usage = 0
|
||||
disk_io = 0
|
||||
startio = ''
|
||||
endio = ''
|
||||
|
||||
for line in task_bs.readlines():
|
||||
if line.startswith('CPU usage: '):
|
||||
cpu_usage = line[11:]
|
||||
elif line.startswith('EndTimeIO: '):
|
||||
endio = line[11:]
|
||||
elif line.startswith('StartTimeIO: '):
|
||||
startio = line[13:]
|
||||
|
||||
task_bs.close()
|
||||
|
||||
if startio and endio:
|
||||
disk_io = int(endio.strip('\n ')) - int(startio.strip('\n '))
|
||||
|
||||
if cpu_usage:
|
||||
cpu_usage = float(cpu_usage.strip('% \n'))
|
||||
|
||||
task_build_stats = {'cpu_usage': cpu_usage, 'disk_io': disk_io}
|
||||
|
||||
return task_build_stats
|
||||
|
||||
def _remove_redundant(self, string):
|
||||
ret = []
|
||||
for i in string.split():
|
||||
if i not in ret:
|
||||
ret.append(i)
|
||||
return " ".join(ret)
|
||||
|
||||
|
||||
################################
|
||||
## external available methods to store information
|
||||
|
||||
def store_layer_info(self):
|
||||
layers = self.server.runCommand(["getVariable", "BBLAYERS"])[0].strip().split(" ")
|
||||
self.internal_state['layers'] = []
|
||||
for layer_path in { l for l in layers if len(l) }:
|
||||
layer_information = self._get_layer_dict(layer_path)
|
||||
self.internal_state['layers'].append(self.orm_wrapper.get_update_layer_object(layer_information))
|
||||
|
||||
def store_started_build(self, event):
|
||||
|
||||
build_information = self._get_build_information()
|
||||
|
||||
build_obj = self.orm_wrapper.create_build_object(build_information)
|
||||
self.internal_state['build'] = build_obj
|
||||
|
||||
# create target information
|
||||
target_information = {}
|
||||
target_information['targets'] = event.getPkgs()
|
||||
target_information['build'] = build_obj
|
||||
|
||||
self.internal_state['targets'] = self.orm_wrapper.create_target_objects(target_information)
|
||||
|
||||
# Load layer information for the build
|
||||
self.internal_state['layer_versions'] = []
|
||||
for layer_object in self.internal_state['layers']:
|
||||
layer_version_information = self._get_layer_version_information(layer_object)
|
||||
self.internal_state['layer_versions'].append(self.orm_wrapper.get_layer_version_object(layer_version_information))
|
||||
|
||||
del self.internal_state['layers']
|
||||
# Save build configuration
|
||||
self.orm_wrapper.save_build_variables(build_obj, self.server.runCommand(["getAllKeysWithFlags", ["doc", "func"]])[0])
|
||||
|
||||
|
||||
def update_build_information(self, event, errors, warnings, taskfailures):
|
||||
if 'build' in self.internal_state:
|
||||
self.orm_wrapper.update_build_object(self.internal_state['build'], errors, warnings, taskfailures)
|
||||
|
||||
def store_started_task(self, event):
|
||||
identifier = event.taskfile + event.taskname
|
||||
|
||||
recipe_information = self._get_recipe_information_from_build_event(event)
|
||||
recipe = self.orm_wrapper.get_update_recipe_object(recipe_information)
|
||||
|
||||
task_information = self._get_task_information(event, recipe)
|
||||
task_information['outcome'] = Task.OUTCOME_NA
|
||||
|
||||
if isinstance(event, bb.runqueue.runQueueTaskSkipped):
|
||||
task_information['task_executed'] = False
|
||||
if event.reason == "covered":
|
||||
task_information['outcome'] = Task.OUTCOME_COVERED
|
||||
if event.reason == "existing":
|
||||
task_information['outcome'] = Task.OUTCOME_EXISTING
|
||||
else:
|
||||
task_information['task_executed'] = True
|
||||
if 'noexec' in vars(event) and event.noexec == True:
|
||||
task_information['script_type'] = Task.CODING_NOEXEC
|
||||
|
||||
self.task_order += 1
|
||||
task_information['order'] = self.task_order
|
||||
task_obj = self.orm_wrapper.get_update_task_object(task_information)
|
||||
|
||||
self.internal_state[identifier] = {'start_time': datetime.datetime.now()}
|
||||
|
||||
def update_and_store_task(self, event):
|
||||
identifier = event.taskfile + event.taskname
|
||||
recipe_information = self._get_recipe_information_from_build_event(event)
|
||||
recipe = self.orm_wrapper.get_update_recipe_object(recipe_information)
|
||||
task_information = self._get_task_information(event,recipe)
|
||||
try:
|
||||
task_information['start_time'] = self.internal_state[identifier]['start_time']
|
||||
except:
|
||||
pass
|
||||
|
||||
if 'logfile' in vars(event):
|
||||
task_information['logfile'] = event.logfile
|
||||
|
||||
if '_message' in vars(event):
|
||||
task_information['message'] = event._message
|
||||
|
||||
if 'taskflags' in vars(event):
|
||||
# with TaskStarted, we get even more information
|
||||
if 'python' in event.taskflags.keys() and event.taskflags['python'] == '1':
|
||||
task_information['script_type'] = Task.CODING_PYTHON
|
||||
else:
|
||||
task_information['script_type'] = Task.CODING_SHELL
|
||||
|
||||
if isinstance(event, (bb.runqueue.runQueueTaskCompleted, bb.runqueue.sceneQueueTaskCompleted)):
|
||||
task_information['outcome'] = Task.OUTCOME_SUCCESS
|
||||
task_build_stats = self._get_task_build_stats(self.orm_wrapper.get_update_task_object(task_information))
|
||||
task_information['cpu_usage'] = task_build_stats['cpu_usage']
|
||||
task_information['disk_io'] = task_build_stats['disk_io']
|
||||
del self.internal_state[identifier]
|
||||
|
||||
if isinstance(event, (bb.runqueue.runQueueTaskFailed, bb.runCommand.sceneQueueTaskFailed)):
|
||||
task_information['outcome'] = Task.OUTCOME_FAILED
|
||||
del self.internal_state[identifier]
|
||||
|
||||
self.orm_wrapper.get_update_task_object(task_information)
|
||||
|
||||
|
||||
def read_target_package_dep_data(self, event):
|
||||
# for all targets
|
||||
for target in self.internal_state['targets']:
|
||||
# verify that we have something to read
|
||||
if not target.is_image or not self.has_build_history:
|
||||
print "not collecting package info ", target.is_image, self.has_build_history
|
||||
break
|
||||
|
||||
# TODO this is a temporary replication of the code in buildhistory.bbclass
|
||||
# This MUST be changed to query the actual BUILD_DIR_IMAGE in the target context when
|
||||
# the capability will be implemented in Bitbake
|
||||
|
||||
MACHINE_ARCH, error = self.server.runCommand(['getVariable', 'MACHINE_ARCH'])
|
||||
TCLIBC, error = self.server.runCommand(['getVariable', 'TCLIBC'])
|
||||
BUILDHISTORY_DIR, error = self.server.runCommand(['getVariable', 'BUILDHISTORY_DIR'])
|
||||
BUILDHISTORY_DIR_IMAGE = "%s/images/%s/%s/%s" % (BUILDHISTORY_DIR, MACHINE_ARCH, TCLIBC, target.target)
|
||||
|
||||
self.internal_state['packages'] = {}
|
||||
|
||||
with open("%s/installed-package-sizes.txt" % BUILDHISTORY_DIR_IMAGE, "r") as fin:
|
||||
for line in fin:
|
||||
line = line.rstrip(";")
|
||||
psize, px = line.split("\t")
|
||||
punit, pname = px.split(" ")
|
||||
self.internal_state['packages'][pname.strip()] = {'size':int(psize)*1024, 'depends' : []}
|
||||
|
||||
with open("%s/depends.dot" % BUILDHISTORY_DIR_IMAGE, "r") as fin:
|
||||
p = re.compile(r' -> ')
|
||||
dot = re.compile(r'.*style=dotted')
|
||||
for line in fin:
|
||||
line = line.rstrip(';')
|
||||
linesplit = p.split(line)
|
||||
if len(linesplit) == 2:
|
||||
pname = linesplit[0].rstrip('"').strip('"')
|
||||
dependsname = linesplit[1].split(" ")[0].strip().strip(";").strip('"').rstrip('"')
|
||||
deptype = Target_Package_Dependency.TYPE_DEPENDS
|
||||
if dot.match(line):
|
||||
deptype = Target_Package_Dependency.TYPE_RECOMMENDS
|
||||
if not pname in self.internal_state['packages']:
|
||||
self.internal_state['packages'][pname] = {'size': 0, 'depends' : []}
|
||||
if not dependsname in self.internal_state['packages']:
|
||||
self.internal_state['packages'][dependsname] = {'size': 0, 'depends' : []}
|
||||
self.internal_state['packages'][pname]['depends'].append((dependsname, deptype))
|
||||
|
||||
self.orm_wrapper.save_target_package_information(target,
|
||||
self.internal_state['packages'],
|
||||
self.internal_state['bldpkgs'], self.internal_state['recipes'])
|
||||
|
||||
|
||||
def store_dependency_information(self, event):
|
||||
# save layer version priorities
|
||||
if 'layer-priorities' in event._depgraph.keys():
|
||||
for lv in event._depgraph['layer-priorities']:
|
||||
(name, path, regexp, priority) = lv
|
||||
layer_version_obj = self._get_layer_version_for_path(path[1:]) # paths start with a ^
|
||||
assert layer_version_obj is not None
|
||||
layer_version_obj.priority = priority
|
||||
layer_version_obj.save()
|
||||
|
||||
# save build time package information
|
||||
self.internal_state['bldpkgs'] = {}
|
||||
for pkg in event._depgraph['packages']:
|
||||
self.internal_state['bldpkgs'][pkg] = event._depgraph['packages'][pkg]
|
||||
|
||||
# save recipe information
|
||||
self.internal_state['recipes'] = {}
|
||||
for pn in event._depgraph['pn']:
|
||||
|
||||
file_name = re.split(':', event._depgraph['pn'][pn]['filename'])[-1]
|
||||
layer_version_obj = self._get_layer_version_for_path(re.split(':', file_name)[-1])
|
||||
|
||||
assert layer_version_obj is not None
|
||||
|
||||
recipe_info = {}
|
||||
recipe_info['name'] = pn
|
||||
recipe_info['version'] = event._depgraph['pn'][pn]['version']
|
||||
recipe_info['layer_version'] = layer_version_obj
|
||||
recipe_info['summary'] = event._depgraph['pn'][pn]['summary']
|
||||
recipe_info['license'] = event._depgraph['pn'][pn]['license']
|
||||
recipe_info['description'] = event._depgraph['pn'][pn]['description']
|
||||
recipe_info['section'] = event._depgraph['pn'][pn]['section']
|
||||
recipe_info['licensing_info'] = 'Not Available'
|
||||
recipe_info['homepage'] = event._depgraph['pn'][pn]['homepage']
|
||||
recipe_info['bugtracker'] = event._depgraph['pn'][pn]['bugtracker']
|
||||
recipe_info['file_path'] = file_name
|
||||
recipe = self.orm_wrapper.get_update_recipe_object(recipe_info)
|
||||
if 'inherits' in event._depgraph['pn'][pn].keys():
|
||||
recipe.is_image = True in map(lambda x: x.endswith('image.bbclass'), event._depgraph['pn'][pn]['inherits'])
|
||||
else:
|
||||
recipe.is_image = False
|
||||
if recipe.is_image:
|
||||
for t in self.internal_state['targets']:
|
||||
if pn == t.target:
|
||||
t.is_image = True
|
||||
t.save()
|
||||
self.internal_state['recipes'][pn] = recipe
|
||||
|
||||
# save recipe dependency
|
||||
# buildtime
|
||||
for recipe in event._depgraph['depends']:
|
||||
try:
|
||||
target = self.internal_state['recipes'][recipe]
|
||||
for dep in event._depgraph['depends'][recipe]:
|
||||
dependency = self.internal_state['recipes'][dep]
|
||||
Recipe_Dependency.objects.get_or_create( recipe = target,
|
||||
depends_on = dependency, dep_type = Recipe_Dependency.TYPE_DEPENDS)
|
||||
except KeyError: # we'll not get recipes for key w/ values listed in ASSUME_PROVIDED
|
||||
pass
|
||||
|
||||
# runtime
|
||||
for recipe in event._depgraph['rdepends-pn']:
|
||||
try:
|
||||
target = self.internal_state['recipes'][recipe]
|
||||
for dep in event._depgraph['rdepends-pn'][recipe]:
|
||||
dependency = self.internal_state['recipes'][dep]
|
||||
Recipe_Dependency.objects.get_or_create( recipe = target,
|
||||
depends_on = dependency, dep_type = Recipe_Dependency.TYPE_RDEPENDS)
|
||||
|
||||
except KeyError: # we'll not get recipes for key w/ values listed in ASSUME_PROVIDED
|
||||
pass
|
||||
|
||||
# save all task information
|
||||
def _save_a_task(taskdesc):
|
||||
spec = re.split(r'\.', taskdesc);
|
||||
pn = ".".join(spec[0:-1])
|
||||
taskname = spec[-1]
|
||||
e = event
|
||||
e.taskname = pn
|
||||
recipe = self.internal_state['recipes'][pn]
|
||||
task_info = self._get_task_information(e, recipe)
|
||||
task_info['task_name'] = taskname
|
||||
task_obj = self.orm_wrapper.get_update_task_object(task_info)
|
||||
return task_obj
|
||||
|
||||
for taskdesc in event._depgraph['tdepends']:
|
||||
target = _save_a_task(taskdesc)
|
||||
for taskdesc1 in event._depgraph['tdepends'][taskdesc]:
|
||||
dep = _save_a_task(taskdesc1)
|
||||
Task_Dependency.objects.get_or_create( task = target, depends_on = dep )
|
||||
|
||||
def store_build_package_information(self, event):
|
||||
package_info = event.data
|
||||
self.orm_wrapper.save_build_package_information(self.internal_state['build'],
|
||||
package_info,
|
||||
self.internal_state['recipes'],
|
||||
)
|
||||
|
||||
def _store_log_information(self, level, text):
|
||||
log_information = {}
|
||||
log_information['build'] = self.internal_state['build']
|
||||
log_information['level'] = level
|
||||
log_information['message'] = text
|
||||
self.orm_wrapper.create_logmessage(log_information)
|
||||
|
||||
def store_log_info(self, text):
|
||||
self._store_log_information(LogMessage.INFO, text)
|
||||
|
||||
def store_log_warn(self, text):
|
||||
self._store_log_information(LogMessage.WARNING, text)
|
||||
|
||||
def store_log_error(self, text):
|
||||
self._store_log_information(LogMessage.ERROR, text)
|
||||
|
||||
def store_log_event(self, event):
|
||||
# look up license files info from insane.bbclass
|
||||
m = re.match("([^:]*): md5 checksum matched for ([^;]*)", event.msg)
|
||||
if m:
|
||||
(pn, fn) = m.groups()
|
||||
self.internal_state['recipes'][pn].licensing_info = fn
|
||||
self.internal_state['recipes'][pn].save()
|
||||
|
||||
if event.levelno < format.WARNING:
|
||||
return
|
||||
if not 'build' in self.internal_state:
|
||||
return
|
||||
log_information = {}
|
||||
log_information['build'] = self.internal_state['build']
|
||||
if event.levelno >= format.ERROR:
|
||||
log_information['level'] = LogMessage.ERROR
|
||||
elif event.levelno == format.WARNING:
|
||||
log_information['level'] = LogMessage.WARNING
|
||||
log_information['message'] = event.msg
|
||||
log_information['pathname'] = event.pathname
|
||||
log_information['lineno'] = event.lineno
|
||||
self.orm_wrapper.create_logmessage(log_information)
|
||||
|
||||
@@ -31,6 +31,7 @@ import re
|
||||
import logging
|
||||
import sys
|
||||
import signal
|
||||
import time
|
||||
from bb.ui.crumbs.imageconfigurationpage import ImageConfigurationPage
|
||||
from bb.ui.crumbs.recipeselectionpage import RecipeSelectionPage
|
||||
from bb.ui.crumbs.packageselectionpage import PackageSelectionPage
|
||||
@@ -197,7 +198,7 @@ class Configuration:
|
||||
handler.set_var_in_file("BBLAYERS", self.layers, "bblayers.conf")
|
||||
# local.conf
|
||||
if not defaults:
|
||||
handler.set_var_in_file("MACHINE", self.curr_mach, "local.conf")
|
||||
handler.early_assign_var_in_file("MACHINE", self.curr_mach, "local.conf")
|
||||
handler.set_var_in_file("DISTRO", self.curr_distro, "local.conf")
|
||||
handler.set_var_in_file("DL_DIR", self.dldir, "local.conf")
|
||||
handler.set_var_in_file("SSTATE_DIR", self.sstatedir, "local.conf")
|
||||
@@ -217,7 +218,7 @@ class Configuration:
|
||||
handler.set_var_in_file("SDKMACHINE", self.curr_sdk_machine, "local.conf")
|
||||
handler.set_var_in_file("CONF_VERSION", self.conf_version, "local.conf")
|
||||
handler.set_var_in_file("LCONF_VERSION", self.lconf_version, "bblayers.conf")
|
||||
handler.set_var_in_file("EXTRA_SETTING", self.extra_setting, "local.conf")
|
||||
handler.set_extra_config(self.extra_setting)
|
||||
handler.set_var_in_file("TOOLCHAIN_BUILD", self.toolchain_build, "local.conf")
|
||||
handler.set_var_in_file("IMAGE_FSTYPES", self.image_fstypes, "local.conf")
|
||||
if not defaults:
|
||||
@@ -1466,3 +1467,10 @@ class Builder(gtk.Window):
|
||||
|
||||
def get_topdir(self):
|
||||
return self.handler.get_topdir()
|
||||
|
||||
def wait(self, delay):
|
||||
time_start = time.time()
|
||||
time_end = time_start + delay
|
||||
while time_end > time.time():
|
||||
while gtk.events_pending():
|
||||
gtk.main_iteration()
|
||||
|
||||
@@ -234,7 +234,10 @@ class AdvancedSettingsDialog (CrumbsDialog, SettingsUIHelper):
|
||||
article = ""
|
||||
if image_type.startswith(("a", "e", "i", "o", "u")):
|
||||
article = "n"
|
||||
self.image_types_checkbuttons[image_type].set_tooltip_text("Build a%s %s image" % (article, image_type))
|
||||
if image_type == "live":
|
||||
self.image_types_checkbuttons[image_type].set_tooltip_text("Build iso and hddimg images")
|
||||
else:
|
||||
self.image_types_checkbuttons[image_type].set_tooltip_text("Build a%s %s image" % (article, image_type))
|
||||
table.attach(self.image_types_checkbuttons[image_type], j - 1, j + 3, i, i + 1)
|
||||
if image_type in self.configuration.image_fstypes.split():
|
||||
self.image_types_checkbuttons[image_type].set_active(True)
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
import gobject
|
||||
import logging
|
||||
import ast
|
||||
from bb.ui.crumbs.runningbuild import RunningBuild
|
||||
|
||||
class HobHandler(gobject.GObject):
|
||||
@@ -315,7 +316,7 @@ class HobHandler(gobject.GObject):
|
||||
|
||||
def set_machine(self, machine):
|
||||
if machine:
|
||||
self.set_var_in_file("MACHINE", machine, "local.conf")
|
||||
self.early_assign_var_in_file("MACHINE", machine, "local.conf")
|
||||
|
||||
def set_sdk_machine(self, sdk_machine):
|
||||
self.set_var_in_file("SDKMACHINE", sdk_machine, "local.conf")
|
||||
@@ -357,7 +358,20 @@ class HobHandler(gobject.GObject):
|
||||
def set_incompatible_license(self, incompat_license):
|
||||
self.set_var_in_file("INCOMPATIBLE_LICENSE", incompat_license, "local.conf")
|
||||
|
||||
def set_extra_setting(self, extra_setting):
|
||||
self.set_var_in_file("EXTRA_SETTING", extra_setting, "local.conf")
|
||||
|
||||
def set_extra_config(self, extra_setting):
|
||||
old_extra_setting = ast.literal_eval(self.runCommand(["getVariable", "EXTRA_SETTING"]) or "{}")
|
||||
if extra_setting:
|
||||
self.set_var_in_file("EXTRA_SETTING", extra_setting, "local.conf")
|
||||
else:
|
||||
self.remove_var_from_file("EXTRA_SETTING")
|
||||
|
||||
#remove not needed settings from conf
|
||||
for key in old_extra_setting:
|
||||
if key not in extra_setting:
|
||||
self.remove_var_from_file(key)
|
||||
for key in extra_setting.keys():
|
||||
value = extra_setting[key]
|
||||
self.set_var_in_file(key, value, "local.conf")
|
||||
@@ -472,6 +486,14 @@ class HobHandler(gobject.GObject):
|
||||
self.server.runCommand(["setVarFile", var, val, default_file, "set"])
|
||||
self.runCommand(["disableDataTracking"])
|
||||
|
||||
def early_assign_var_in_file(self, var, val, default_file=None):
|
||||
self.runCommand(["enableDataTracking"])
|
||||
self.server.runCommand(["setVarFile", var, val, default_file, "earlyAssign"])
|
||||
self.runCommand(["disableDataTracking"])
|
||||
|
||||
def remove_var_from_file(self, var):
|
||||
self.server.runCommand(["removeVarFile", var])
|
||||
|
||||
def append_var_in_file(self, var, val, default_file=None):
|
||||
self.server.runCommand(["setVarFile", var, val, default_file, "append"])
|
||||
|
||||
|
||||
@@ -300,7 +300,12 @@ class ImageConfigurationPage (HobPage):
|
||||
def view_warnings_button_clicked_cb(self, button):
|
||||
self.builder.show_warning_dialog()
|
||||
|
||||
def machine_combo_changed_idle_cb(self):
|
||||
self.builder.window.set_cursor(None)
|
||||
|
||||
def machine_combo_changed_cb(self, machine_combo):
|
||||
self.builder.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
|
||||
self.builder.wait(0.1) #wait for combo and cursor to update
|
||||
self.stopping = False
|
||||
self.builder.parsing_warnings = []
|
||||
combo_item = machine_combo.get_active_text()
|
||||
@@ -324,6 +329,8 @@ class ImageConfigurationPage (HobPage):
|
||||
# Do reparse recipes
|
||||
self.builder.populate_recipe_package_info_async()
|
||||
|
||||
glib.idle_add(self.machine_combo_changed_idle_cb)
|
||||
|
||||
def update_machine_combo(self):
|
||||
self.disable_warnings_bar()
|
||||
all_machines = [self.__dummy_machine__] + self.builder.parameters.all_machines
|
||||
@@ -527,7 +534,10 @@ class ImageConfigurationPage (HobPage):
|
||||
if not response:
|
||||
return
|
||||
if settings_changed:
|
||||
self.builder.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
|
||||
self.builder.wait(0.1) #wait for adv_settings_dialog to terminate
|
||||
self.builder.reparse_post_adv_settings()
|
||||
self.builder.window.set_cursor(None)
|
||||
|
||||
def just_bake_button_clicked_cb(self, button):
|
||||
self.builder.parsing_warnings = []
|
||||
|
||||
272
bitbake/lib/bb/ui/toasterui.py
Normal file
@@ -0,0 +1,272 @@
|
||||
#
|
||||
# BitBake ToasterUI Implementation
|
||||
# based on (No)TTY UI Implementation by Richard Purdie
|
||||
#
|
||||
# Handling output to TTYs or files (no TTY)
|
||||
#
|
||||
# Copyright (C) 2006-2012 Richard Purdie
|
||||
# Copyright (C) 2013 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.
|
||||
|
||||
from __future__ import division
|
||||
try:
|
||||
import bb
|
||||
except RuntimeError as exc:
|
||||
sys.exit(str(exc))
|
||||
|
||||
from bb.ui import uihelper
|
||||
from bb.ui.buildinfohelper import BuildInfoHelper
|
||||
|
||||
import bb.msg
|
||||
import copy
|
||||
import fcntl
|
||||
import logging
|
||||
import os
|
||||
import progressbar
|
||||
import signal
|
||||
import struct
|
||||
import sys
|
||||
import time
|
||||
import xmlrpclib
|
||||
|
||||
featureSet = [bb.cooker.CookerFeatures.HOB_EXTRA_CACHES, bb.cooker.CookerFeatures.SEND_DEPENDS_TREE, bb.cooker.CookerFeatures.BASEDATASTORE_TRACKING]
|
||||
|
||||
logger = logging.getLogger("BitBake")
|
||||
interactive = sys.stdout.isatty()
|
||||
|
||||
|
||||
|
||||
def _log_settings_from_server(server):
|
||||
# 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)
|
||||
raise BaseException(error)
|
||||
loglines, error = server.runCommand(["getVariable", "BBINCLUDELOGS_LINES"])
|
||||
if error:
|
||||
logger.error("Unable to get the value of BBINCLUDELOGS_LINES variable: %s" % error)
|
||||
raise BaseException(error)
|
||||
return includelogs, loglines
|
||||
|
||||
def main(server, eventHandler, params ):
|
||||
|
||||
includelogs, loglines = _log_settings_from_server(server)
|
||||
|
||||
# verify and warn
|
||||
build_history_enabled = True
|
||||
inheritlist, error = server.runCommand(["getVariable", "INHERIT"])
|
||||
if not "buildhistory" in inheritlist.split(" "):
|
||||
logger.warn("buildhistory is not enabled. Please enable INHERIT += \"buildhistory\" to see image details.")
|
||||
build_history_enabled = False
|
||||
|
||||
helper = uihelper.BBUIHelper()
|
||||
|
||||
console = logging.StreamHandler(sys.stdout)
|
||||
format_str = "%(levelname)s: %(message)s"
|
||||
format = bb.msg.BBLogFormatter(format_str)
|
||||
bb.msg.addDefaultlogFilter(console)
|
||||
console.setFormatter(format)
|
||||
logger.addHandler(console)
|
||||
|
||||
if not params.observe_only:
|
||||
logger.error("ToasterUI can only work in observer mode")
|
||||
return
|
||||
|
||||
|
||||
main.shutdown = 0
|
||||
interrupted = False
|
||||
return_value = 0
|
||||
errors = 0
|
||||
warnings = 0
|
||||
taskfailures = []
|
||||
|
||||
buildinfohelper = BuildInfoHelper(server, build_history_enabled)
|
||||
buildinfohelper.store_layer_info()
|
||||
|
||||
|
||||
while True:
|
||||
try:
|
||||
event = eventHandler.waitEvent(0.25)
|
||||
|
||||
if event is None:
|
||||
if main.shutdown > 0:
|
||||
break
|
||||
continue
|
||||
|
||||
helper.eventHandler(event)
|
||||
|
||||
if isinstance(event, bb.event.BuildStarted):
|
||||
buildinfohelper.store_started_build(event)
|
||||
|
||||
if isinstance(event, (bb.build.TaskStarted, bb.build.TaskSucceeded, bb.build.TaskFailedSilent)):
|
||||
buildinfohelper.update_and_store_task(event)
|
||||
continue
|
||||
|
||||
if isinstance(event, bb.event.LogExecTTY):
|
||||
logger.warn(event.msg)
|
||||
continue
|
||||
|
||||
if isinstance(event, logging.LogRecord):
|
||||
buildinfohelper.store_log_event(event)
|
||||
if event.levelno >= format.ERROR:
|
||||
errors = errors + 1
|
||||
return_value = 1
|
||||
elif event.levelno == format.WARNING:
|
||||
warnings = warnings + 1
|
||||
# For "normal" logging conditions, don't show note logs from tasks
|
||||
# but do show them if the user has changed the default log level to
|
||||
# include verbose/debug messages
|
||||
if event.taskpid != 0 and event.levelno <= format.NOTE:
|
||||
continue
|
||||
|
||||
logger.handle(event)
|
||||
continue
|
||||
|
||||
if isinstance(event, bb.build.TaskFailed):
|
||||
buildinfohelper.update_and_store_task(event)
|
||||
return_value = 1
|
||||
logfile = event.logfile
|
||||
if logfile and os.path.exists(logfile):
|
||||
bb.error("Logfile of failure stored in: %s" % logfile)
|
||||
continue
|
||||
|
||||
# these events are unprocessed now, but may be used in the future to log
|
||||
# timing and error informations from the parsing phase in Toaster
|
||||
if isinstance(event, bb.event.ParseStarted):
|
||||
continue
|
||||
if isinstance(event, bb.event.ParseProgress):
|
||||
continue
|
||||
if isinstance(event, bb.event.ParseCompleted):
|
||||
continue
|
||||
if isinstance(event, bb.event.CacheLoadStarted):
|
||||
continue
|
||||
if isinstance(event, bb.event.CacheLoadProgress):
|
||||
continue
|
||||
if isinstance(event, bb.event.CacheLoadCompleted):
|
||||
continue
|
||||
if isinstance(event, bb.event.MultipleProviders):
|
||||
continue
|
||||
if isinstance(event, bb.event.NoProvider):
|
||||
return_value = 1
|
||||
errors = errors + 1
|
||||
if event._runtime:
|
||||
r = "R"
|
||||
else:
|
||||
r = ""
|
||||
|
||||
if event._dependees:
|
||||
text = "Nothing %sPROVIDES '%s' (but %s %sDEPENDS on or otherwise requires it)" % (r, event._item, ", ".join(event._dependees), r)
|
||||
else:
|
||||
text = "Nothing %sPROVIDES '%s'" % (r, event._item)
|
||||
|
||||
logger.error(text)
|
||||
if event._reasons:
|
||||
for reason in event._reasons:
|
||||
logger.error("%s", reason)
|
||||
text += reason
|
||||
buildinfohelper.store_log_error(text)
|
||||
continue
|
||||
|
||||
if isinstance(event, bb.event.ConfigParsed):
|
||||
continue
|
||||
if isinstance(event, bb.event.RecipeParsed):
|
||||
continue
|
||||
|
||||
# end of saved events
|
||||
|
||||
if isinstance(event, (bb.runqueue.sceneQueueTaskStarted, bb.runqueue.runQueueTaskStarted, bb.runqueue.runQueueTaskSkipped)):
|
||||
buildinfohelper.store_started_task(event)
|
||||
continue
|
||||
|
||||
if isinstance(event, bb.runqueue.runQueueTaskCompleted):
|
||||
buildinfohelper.update_and_store_task(event)
|
||||
continue
|
||||
|
||||
if isinstance(event, bb.runqueue.runQueueTaskFailed):
|
||||
buildinfohelper.update_and_store_task(event)
|
||||
taskfailures.append(event.taskstring)
|
||||
logger.error("Task %s (%s) failed with exit code '%s'",
|
||||
event.taskid, event.taskstring, event.exitcode)
|
||||
continue
|
||||
|
||||
if isinstance(event, (bb.runqueue.sceneQueueTaskCompleted, bb.runqueue.sceneQueueTaskFailed)):
|
||||
buildinfohelper.update_and_store_task(event)
|
||||
continue
|
||||
|
||||
|
||||
if isinstance(event, (bb.event.TreeDataPreparationStarted, bb.event.TreeDataPreparationCompleted)):
|
||||
continue
|
||||
|
||||
if isinstance(event, (bb.event.BuildCompleted)):
|
||||
buildinfohelper.read_target_package_dep_data(event)
|
||||
buildinfohelper.update_build_information(event, errors, warnings, taskfailures)
|
||||
continue
|
||||
|
||||
if isinstance(event, (bb.command.CommandCompleted,
|
||||
bb.command.CommandFailed,
|
||||
bb.command.CommandExit)):
|
||||
|
||||
buildinfohelper.update_build_information(event, errors, warnings, taskfailures)
|
||||
|
||||
# we start a new build info
|
||||
errors = 0
|
||||
warnings = 0
|
||||
taskfailures = []
|
||||
buildinfohelper = BuildInfoHelper(server, build_history_enabled)
|
||||
buildinfohelper.store_layer_info()
|
||||
continue
|
||||
|
||||
if isinstance(event, bb.event.MetadataEvent):
|
||||
if event.type == "SinglePackageInfo":
|
||||
buildinfohelper.store_build_package_information(event)
|
||||
continue
|
||||
|
||||
# ignore
|
||||
if isinstance(event, (bb.event.BuildBase,
|
||||
bb.event.StampUpdate,
|
||||
bb.event.RecipePreFinalise,
|
||||
bb.runqueue.runQueueEvent,
|
||||
bb.runqueue.runQueueExitWait,
|
||||
bb.event.OperationProgress,
|
||||
bb.command.CommandFailed,
|
||||
bb.command.CommandExit,
|
||||
bb.command.CommandCompleted,
|
||||
bb.cooker.CookerExit)):
|
||||
continue
|
||||
|
||||
if isinstance(event, bb.event.DepTreeGenerated):
|
||||
buildinfohelper.store_dependency_information(event)
|
||||
continue
|
||||
|
||||
logger.error("Unknown event: %s", event)
|
||||
|
||||
except EnvironmentError as ioerror:
|
||||
# ignore interrupted io
|
||||
if ioerror.args[0] == 4:
|
||||
pass
|
||||
except KeyboardInterrupt:
|
||||
main.shutdown = 1
|
||||
pass
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
pass
|
||||
|
||||
if interrupted:
|
||||
if return_value == 0:
|
||||
return_value = 1
|
||||
|
||||
return return_value
|
||||
@@ -724,7 +724,7 @@ def copyfile(src, dest, newmtime = None, sstat = None):
|
||||
if not sstat:
|
||||
sstat = os.lstat(src)
|
||||
except Exception as e:
|
||||
print("copyfile: Stating source file failed...", e)
|
||||
logger.warn("copyfile: stat of %s failed (%s)" % (src, e))
|
||||
return False
|
||||
|
||||
destexists = 1
|
||||
@@ -751,7 +751,7 @@ def copyfile(src, dest, newmtime = None, sstat = None):
|
||||
#os.lchown(dest,sstat[stat.ST_UID],sstat[stat.ST_GID])
|
||||
return os.lstat(dest)
|
||||
except Exception as e:
|
||||
print("copyfile: failed to properly create symlink:", dest, "->", target, e)
|
||||
logger.warn("copyfile: failed to create symlink %s to %s (%s)" % (dest, target, e))
|
||||
return False
|
||||
|
||||
if stat.S_ISREG(sstat[stat.ST_MODE]):
|
||||
@@ -766,7 +766,7 @@ def copyfile(src, dest, newmtime = None, sstat = None):
|
||||
shutil.copyfile(src, dest + "#new")
|
||||
os.rename(dest + "#new", dest)
|
||||
except Exception as e:
|
||||
print('copyfile: copy', src, '->', dest, 'failed.', e)
|
||||
logger.warn("copyfile: copy %s to %s failed (%s)" % (src, dest, e))
|
||||
return False
|
||||
finally:
|
||||
if srcchown:
|
||||
@@ -777,13 +777,13 @@ def copyfile(src, dest, newmtime = None, sstat = None):
|
||||
#we don't yet handle special, so we need to fall back to /bin/mv
|
||||
a = getstatusoutput("/bin/cp -f " + "'" + src + "' '" + dest + "'")
|
||||
if a[0] != 0:
|
||||
print("copyfile: Failed to copy special file:" + src + "' to '" + dest + "'", a)
|
||||
logger.warn("copyfile: failed to copy special file %s to %s (%s)" % (src, dest, a))
|
||||
return False # failure
|
||||
try:
|
||||
os.lchown(dest, sstat[stat.ST_UID], sstat[stat.ST_GID])
|
||||
os.chmod(dest, stat.S_IMODE(sstat[stat.ST_MODE])) # Sticky is reset on chown
|
||||
except Exception as e:
|
||||
print("copyfile: Failed to chown/chmod/unlink", dest, e)
|
||||
logger.warn("copyfile: failed to chown/chmod %s (%s)" % (dest, e))
|
||||
return False
|
||||
|
||||
if newmtime:
|
||||
|
||||
0
bitbake/lib/toaster/__init__.py
Normal file
0
bitbake/lib/toaster/bldviewer/__init__.py
Normal file
37
bitbake/lib/toaster/bldviewer/api.py
Normal file
@@ -0,0 +1,37 @@
|
||||
#
|
||||
# BitBake Toaster Implementation
|
||||
#
|
||||
# Copyright (C) 2013 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.
|
||||
|
||||
from django.conf.urls import patterns, include, url
|
||||
|
||||
|
||||
urlpatterns = patterns('bldviewer.views',
|
||||
url(r'^builds$', 'model_explorer', {'model_name':'build'}, name='builds'),
|
||||
url(r'^targets$', 'model_explorer', {'model_name':'target'}, name='targets'),
|
||||
url(r'^tasks$', 'model_explorer', {'model_name':'task'}, name='task'),
|
||||
url(r'^task_dependencies$', 'model_explorer', {'model_name':'task_dependency'}, name='task_dependencies'),
|
||||
url(r'^packages$', 'model_explorer', {'model_name':'build_package'}, name='build_packages'),
|
||||
url(r'^package_dependencies$', 'model_explorer', {'model_name':'build_package_dependency'}, name='build_package_dependencies'),
|
||||
url(r'^target_packages$', 'model_explorer', {'model_name':'target_package'}, name='target_packages'),
|
||||
url(r'^package_files$', 'model_explorer', {'model_name':'build_file'}, name='build_files'),
|
||||
url(r'^layers$', 'model_explorer', {'model_name':'layer'}, name='layer'),
|
||||
url(r'^layerversions$', 'model_explorer', {'model_name':'layerversion'}, name='layerversion'),
|
||||
url(r'^recipes$', 'model_explorer', {'model_name':'recipe'}, name='recipe'),
|
||||
url(r'^recipe_dependencies$', 'model_explorer', {'model_name':'recipe_dependency'}, name='recipe_dependencies'),
|
||||
url(r'^variables$', 'model_explorer', {'model_name':'variable'}, name='variables'),
|
||||
url(r'^logmessages$', 'model_explorer', {'model_name':'logmessage'}, name='logmessages'),
|
||||
)
|
||||
4797
bitbake/lib/toaster/bldviewer/static/css/bootstrap.css
vendored
Normal file
1982
bitbake/lib/toaster/bldviewer/static/js/bootstrap.js
vendored
Normal file
6
bitbake/lib/toaster/bldviewer/static/js/jquery-2.0.3.js
vendored
Normal file
30
bitbake/lib/toaster/bldviewer/templates/base.html
Normal file
@@ -0,0 +1,30 @@
|
||||
<!DOCTYPE html>
|
||||
{% load static %}
|
||||
<html>
|
||||
<head>
|
||||
<title>Toaster Simple Explorer</title>
|
||||
<script src="{% static 'js/jquery-2.0.3.js' %}">
|
||||
</script>
|
||||
<script src="{% static 'js/bootstrap.js' %}">
|
||||
</script>
|
||||
<link href="{% static 'css/bootstrap.css' %}" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
||||
<body style="height: 100%">
|
||||
<div style="width:100%; height: 100%; position:absolute">
|
||||
<div style="width: 100%; height: 3em" class="nav">
|
||||
<ul class="nav nav-tabs">
|
||||
<li><a href="{% url all-builds %}">All Builds</a></li>
|
||||
<li><a href="{% url all-layers %}">All Layers</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div style="overflow-y:scroll; width: 100%; position: absolute; top: 3em; bottom:70px ">
|
||||
{% block pagecontent %}
|
||||
{% endblock %}
|
||||
</div>
|
||||
<div class="navbar" style="position: absolute; bottom: 0; width:100%"><br/>About Toaster | Yocto Project </div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
17
bitbake/lib/toaster/bldviewer/templates/basebuildpage.html
Normal file
@@ -0,0 +1,17 @@
|
||||
{% extends "basetable.html" %}
|
||||
|
||||
{% block pagename %}
|
||||
<ul class="nav nav-tabs" style="display: inline-block">
|
||||
<li><a>Build {{build.target_set.all|join:" "}} at {{build.started_on}} : </a></li>
|
||||
<li><a href="{% url task build.id %}"> Tasks </a></li>
|
||||
<li><a href="{% url bpackage build.id %}"> Build Packages </a></li>
|
||||
{% for t in build.target_set.all %}
|
||||
{% if t.is_image %}
|
||||
<li><a href="{% url tpackage build.id t.pk %}"> Packages for {{t.target}} </a> </li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
<li><a href="{% url configuration build.id %}"> Configuration </a> </li>
|
||||
</ul>
|
||||
<h1>Toaster - Build {% block pagetitle %} {% endblock %}</h1>
|
||||
{% endblock %}
|
||||
|
||||
46
bitbake/lib/toaster/bldviewer/templates/basetable.html
Normal file
@@ -0,0 +1,46 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block pagecontent %}
|
||||
<script>
|
||||
function showhideTableColumn(i, sh) {
|
||||
if (sh)
|
||||
$('td:nth-child('+i+'),th:nth-child('+i+')').show();
|
||||
else
|
||||
$('td:nth-child('+i+'),th:nth-child('+i+')').hide();
|
||||
}
|
||||
|
||||
|
||||
function filterTableRows(test) {
|
||||
if (test.length > 0) {
|
||||
var r = test.split(/[ ,]+/).map(function (e) { return new RegExp(e, 'i') });
|
||||
$('tr.data').map( function (i, el) {
|
||||
(! r.map(function (j) { return j.test($(el).html())}).reduce(function (c, p) { return c && p;} )) ? $(el).hide() : $(el).show();
|
||||
});
|
||||
} else
|
||||
{
|
||||
$('tr.data').show();
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<div style="margin-bottom: 0.5em">
|
||||
|
||||
{% block pagename %}
|
||||
{% endblock %}
|
||||
<div align="left" style="display:inline-block; width: 40%; margin-left: 2em"> Search: <input type="search" id="filterstring" style="width: 80%" onkeyup="filterTableRows($('#filterstring').val())" autocomplete="off">
|
||||
</div>
|
||||
{% if hideshowcols %}
|
||||
<div align="right" style="display: inline-block; width: 40%">Show/Hide columns:
|
||||
{% for i in hideshowcols %}
|
||||
<span>{{i.name}} <input type="checkbox" id="ct{{i.name}}" onchange="showhideTableColumn({{i.order}}, $('#ct{{i.name}}').is(':checked'))" checked autocomplete="off"></span> |
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div>
|
||||
<table class="table table-striped table-condensed" style="width:95%">
|
||||
{% block pagetable %}
|
||||
{% endblock %}
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
24
bitbake/lib/toaster/bldviewer/templates/bfile.html
Normal file
@@ -0,0 +1,24 @@
|
||||
{% extends "basebuildpage.html" %}
|
||||
|
||||
{% block pagetitle %}Files for package {{files.0.bpackage.name}} {% endblock %}
|
||||
{% block pagetable %}
|
||||
{% if not files %}
|
||||
<p>No files were recorded for this package!</p>
|
||||
{% else %}
|
||||
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Size (Bytes)</th>
|
||||
</tr>
|
||||
|
||||
{% for file in files %}
|
||||
|
||||
<tr class="data">
|
||||
<td>{{file.path}}</td>
|
||||
<td>{{file.size}}</td>
|
||||
|
||||
{% endfor %}
|
||||
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
||||
44
bitbake/lib/toaster/bldviewer/templates/bpackage.html
Normal file
@@ -0,0 +1,44 @@
|
||||
{% extends "basebuildpage.html" %}
|
||||
|
||||
{% block pagetitle %}Packages{% endblock %}
|
||||
{% block pagetable %}
|
||||
{% if not packages %}
|
||||
<p>No packages were recorded for this target!</p>
|
||||
{% else %}
|
||||
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Version</th>
|
||||
<th>Recipe</th>
|
||||
<th>Summary</th>
|
||||
<th>Section</th>
|
||||
<th>Description</th>
|
||||
<th>Size on host disk (Bytes)</th>
|
||||
<th>License</th>
|
||||
<th>Dependencies List (all)</th>
|
||||
</tr>
|
||||
|
||||
{% for package in packages %}
|
||||
|
||||
<tr class="data">
|
||||
<td><a name="#{{package.name}}" href="{% url bfile build.pk package.pk %}">{{package.name}} ({{package.filelist_bpackage.count}} files)</a></td>
|
||||
<td>{{package.version}}-{{package.revision}}</td>
|
||||
<td><a href="{% url layer_versions_recipes package.recipe.layer_version_id %}#{{package.recipe.name}}">{{package.recipe.name}}</a>{{package.package_name}}</a></td>
|
||||
|
||||
<td>{{package.summary}}</td>
|
||||
<td>{{package.section}}</td>
|
||||
<td>{{package.description}}</td>
|
||||
<td>{{package.size}}</td>
|
||||
<td>{{package.license}}</td>
|
||||
<td>
|
||||
<div style="height: 3em; overflow:auto">
|
||||
{% for bpd in package.bpackage_dependencies_package.all %}
|
||||
{{bpd.dep_type}}: {{bpd.depends_on}} <br/>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</td>
|
||||
{% endfor %}
|
||||
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
||||
43
bitbake/lib/toaster/bldviewer/templates/build.html
Normal file
@@ -0,0 +1,43 @@
|
||||
{% extends "basetable.html" %}
|
||||
|
||||
{% block pagename %}
|
||||
<h1>Toaster - Builds</h1>
|
||||
{% endblock %}
|
||||
|
||||
{% block pagetable %}
|
||||
|
||||
{% load projecttags %}
|
||||
<tr>
|
||||
<th>Outcome</th>
|
||||
<th>Started On</th>
|
||||
<th>Completed On</th>
|
||||
<th>Target</th>
|
||||
<th>Machine</th>
|
||||
<th>Time</th>
|
||||
<th>Errors</th>
|
||||
<th>Warnings</th>
|
||||
<th>Output</th>
|
||||
<th>Log</th>
|
||||
<th>Bitbake Version</th>
|
||||
<th>Build Name</th>
|
||||
</tr>
|
||||
{% for build in builds %}
|
||||
<tr class="data">
|
||||
<td><a href="{% url configuration build.id %}">{{build.get_outcome_display}}</a></td>
|
||||
<td>{{build.started_on}}</td>
|
||||
<td>{{build.completed_on}}</td>
|
||||
<td>{% for t in build.target_set.all %}<a href="{% url tpackage build.id t.id %}">{{t.target}}</a>{% if t.is_image %} (Img){% endif %}<br/>{% endfor %}</td>
|
||||
<td>{{build.machine}}</td>
|
||||
<td>{% time_difference build.started_on build.completed_on %}</td>
|
||||
<td>{{build.errors_no}}:{% if build.errors_no %}{% for error in logs %}{% if error.build == build %}{% if error.level == 2 %}<p>{{error.message}}</p>{% endif %}{% endif %}{% endfor %}{% else %}None{% endif %}</td>
|
||||
<td>{{build.warnings_no}}:{% if build.warnings_no %}{% for warning in logs %}{% if warning.build == build %}{% if warning.level == 1 %}<p>{{warning.message}}</p>{% endif %}{% endif %}{% endfor %}{% else %}None{% endif %}</td>
|
||||
<td>{% if build.outcome == 0 %}{% for t in build.target_set.all %}{% if t.is_image %}{{build.image_fstypes}}{% endif %}{% endfor %}{% endif %}</td>
|
||||
<td>{{build.cooker_log_path}}</td>
|
||||
<td>{{build.bitbake_version}}</td>
|
||||
<td>{{build.build_name}}</td>
|
||||
</tr>
|
||||
|
||||
{% endfor %}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
22
bitbake/lib/toaster/bldviewer/templates/configuration.html
Normal file
@@ -0,0 +1,22 @@
|
||||
{% extends "basebuildpage.html" %}
|
||||
|
||||
{% block pagetitle %}Configuration{% endblock %}
|
||||
{% block pagetable %}
|
||||
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Description</th>
|
||||
<th>Definition history</th>
|
||||
<th>Value</th>
|
||||
</tr>
|
||||
|
||||
{% for variable in configuration %}
|
||||
|
||||
<tr class="data">
|
||||
<td>{{variable.variable_name}}</td>
|
||||
<td>{% if variable.description %}{{variable.description}}{% endif %}</td>
|
||||
<td>{% for vh in variable.variablehistory_set.all %}{{vh.operation}} in {{vh.file_name}}:{{vh.line_number}}<br/>{%endfor%}</td>
|
||||
<td>{{variable.variable_value}}</td>
|
||||
{% endfor %}
|
||||
|
||||
{% endblock %}
|
||||
34
bitbake/lib/toaster/bldviewer/templates/layer.html
Normal file
@@ -0,0 +1,34 @@
|
||||
{% extends "basetable.html" %}
|
||||
|
||||
{% block pagename %}
|
||||
<h1>Toaster - Layers</h1>
|
||||
{% endblock %}
|
||||
|
||||
{% block pagetable %}
|
||||
{% load projecttags %}
|
||||
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Local Path</th>
|
||||
<th>Layer Index URL</th>
|
||||
<th>Known Versions</th>
|
||||
</tr>
|
||||
|
||||
{% for layer in layers %}
|
||||
|
||||
<tr class="data">
|
||||
<td>{{layer.name}}</td>
|
||||
<td>{{layer.local_path}}</td>
|
||||
<td><a href='{{layer.layer_index_url}}'>{{layer.layer_index_url}}</a></td>
|
||||
<td><table>
|
||||
{% for lv in layer.versions %}
|
||||
<tr><td>
|
||||
<a href="{% url layer_versions_recipes lv.id %}">({{lv.priority}}){{lv.branch}}:{{lv.commit}} ({{lv.count}} recipes)</a>
|
||||
</td></tr>
|
||||
{% endfor %}
|
||||
</table></td>
|
||||
</tr>
|
||||
|
||||
{% endfor %}
|
||||
|
||||
{% endblock %}
|
||||
36
bitbake/lib/toaster/bldviewer/templates/package.html
Normal file
@@ -0,0 +1,36 @@
|
||||
{% extends "basebuildpage.html" %}
|
||||
|
||||
{% block pagetable %}
|
||||
{% if not packages %}
|
||||
<p>No packages were recorded for this target!</p>
|
||||
{% else %}
|
||||
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Version</th>
|
||||
<th>Size (Bytes)</th>
|
||||
<th>Recipe</th>
|
||||
<th>Depends on</th>
|
||||
</tr>
|
||||
|
||||
{% for package in packages %}
|
||||
|
||||
<tr class="data">
|
||||
<td><a name="#{{package.name}}">{{package.name}}</a></td>
|
||||
<td>{{package.version}}</td>
|
||||
<td>{{package.size}}</td>
|
||||
<td>{%if package.recipe %}<a name="{{package.recipe.name}}.{{package.package_name}}">
|
||||
<a href="{% url layer_versions_recipes package.recipe.layer_version_id %}#{{package.recipe.name}}">{{package.recipe.name}}</a>{{package.package_name}}</a>{%endif%}</td>
|
||||
<td>
|
||||
<div style="height: 4em; overflow:auto">
|
||||
{% for d in package.tpackage_dependencies_package.all %}
|
||||
<a href="#{{d.name}}">{{d.depends_on.name}}</a><br/>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</td>
|
||||
|
||||
{% endfor %}
|
||||
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
||||
53
bitbake/lib/toaster/bldviewer/templates/recipe.html
Normal file
@@ -0,0 +1,53 @@
|
||||
{% extends "basetable.html" %}
|
||||
|
||||
{% block pagename %}
|
||||
<ul class="nav nav-tabs" style="display: inline-block">
|
||||
<li><a>Layer {{layer_version.layer.name}} : {{layer_version.branch}} : {{layer_version.commit}} : {{layer_version.priority}}</a></li>
|
||||
</ul>
|
||||
<h1>Toaster - Recipes for a Layer</h1>
|
||||
{% endblock %}
|
||||
|
||||
{% block pagetable %}
|
||||
{% load projecttags %}
|
||||
|
||||
<tr>
|
||||
</tr>
|
||||
<th>Name</th>
|
||||
<th>Version</th>
|
||||
<th>Summary</th>
|
||||
<th>Description</th>
|
||||
<th>Section</th>
|
||||
<th>License</th>
|
||||
<th>License file</th>
|
||||
<th>Homepage</th>
|
||||
<th>Bugtracker</th>
|
||||
<th>Author</th>
|
||||
<th>File_path</th>
|
||||
<th style="width: 30em">Recipe Dependency</th>
|
||||
|
||||
|
||||
{% for recipe in recipes %}
|
||||
|
||||
<tr class="data">
|
||||
<td><a name="{{recipe.name}}">{{recipe.name}}</a></td>
|
||||
<td>{{recipe.version}}</td>
|
||||
<td>{{recipe.summary}}</td>
|
||||
<td>{{recipe.description}}</td>
|
||||
<td>{{recipe.section}}</td>
|
||||
<td>{{recipe.license}}</td>
|
||||
<td>{{recipe.licensing_info}}</td>
|
||||
<td>{{recipe.homepage}}</td>
|
||||
<td>{{recipe.bugtracker}}</td>
|
||||
<td>{{recipe.file_path}}</td>
|
||||
<td>
|
||||
<div style="height: 5em; overflow:auto">
|
||||
{% for rr in recipe.r_dependencies_recipe.all %}
|
||||
<a href="#{{rr.depends_on.name}}">{{rr.depends_on.name}}</a><br/>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
{% endfor %}
|
||||
|
||||
{% endblock %}
|
||||
63
bitbake/lib/toaster/bldviewer/templates/task.html
Normal file
@@ -0,0 +1,63 @@
|
||||
{% extends "basebuildpage.html" %}
|
||||
|
||||
{% block pagetitle %}Tasks{% endblock %}
|
||||
{% block pagetable %}
|
||||
{% if not tasks %}
|
||||
<p>No tasks were executed in this build!</p>
|
||||
{% else %}
|
||||
|
||||
<tr>
|
||||
<th>Order</th>
|
||||
<th>Task</th>
|
||||
<th>Recipe Version</th>
|
||||
<th>Task Type</th>
|
||||
<th>Checksum</th>
|
||||
<th>Outcome</th>
|
||||
<th>Message</th>
|
||||
<th>Logfile</th>
|
||||
<th>Time</th>
|
||||
<th>CPU usage</th>
|
||||
<th>Disk I/O</th>
|
||||
<th>Script type</th>
|
||||
<th>File path</th>
|
||||
<th>Depends</th>
|
||||
</tr>
|
||||
|
||||
{% for task in tasks %}
|
||||
|
||||
<tr class="data">
|
||||
<td>{{task.order}}</td>
|
||||
<td><a name="{{task.recipe.name}}.{{task.task_name}}">
|
||||
<a href="{% url layer_versions_recipes task.recipe.layer_version_id %}#{{task.recipe.name}}">{{task.recipe.name}}</a>.{{task.task_name}}</a></td>
|
||||
<td>{{task.recipe.version}}</td>
|
||||
|
||||
{% if task.task_executed %}
|
||||
<td>Executed</td>
|
||||
{% else %}
|
||||
<td>Prebuilt</td>
|
||||
{% endif %}
|
||||
|
||||
<td>{{task.sstate_checksum}}</td>
|
||||
<td>{{task.get_outcome_display}}{% if task.provider %}</br>(by <a href="#{{task.provider.recipe.name}}.{{task.provider.task_name}}">{{task.provider.recipe.name}}.{{task.provider.task_name}}</a>){% endif %}</td>
|
||||
<td><p>{{task.message}}</td>
|
||||
<td><a target="_fileview" href="file:///{{task.logfile}}">{{task.logfile}}</a></td>
|
||||
<td>{{task.elapsed_time}}</td>
|
||||
<td>{{task.cpu_usage}}</td>
|
||||
<td>{{task.disk_io}}</td>
|
||||
<td>{{task.get_script_type_display}}</td>
|
||||
<td><a target="_fileview" href="file:///{{task.recipe.file_path}}">{{task.recipe.file_path}}</a></td>
|
||||
<td>
|
||||
<div style="height: 3em; overflow:auto">
|
||||
{% for tt in task.task_dependencies_task.all %}
|
||||
<a href="#{{tt.depends_on.recipe.name}}.{{tt.depends_on.task_name}}">
|
||||
{{tt.depends_on.recipe.name}}.{{tt.depends_on.task_name}}</a><br/>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
{% endfor %}
|
||||
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
||||
26
bitbake/lib/toaster/bldviewer/templatetags/projecttags.py
Normal file
@@ -0,0 +1,26 @@
|
||||
#
|
||||
# BitBake Toaster Implementation
|
||||
#
|
||||
# Copyright (C) 2013 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.
|
||||
|
||||
from datetime import datetime
|
||||
from django import template
|
||||
|
||||
register = template.Library()
|
||||
|
||||
@register.simple_tag
|
||||
def time_difference(start_time, end_time):
|
||||
return end_time - start_time
|
||||
32
bitbake/lib/toaster/bldviewer/urls.py
Normal file
@@ -0,0 +1,32 @@
|
||||
#
|
||||
# BitBake Toaster Implementation
|
||||
#
|
||||
# Copyright (C) 2013 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.
|
||||
|
||||
from django.conf.urls import patterns, include, url
|
||||
from django.views.generic.simple import redirect_to
|
||||
|
||||
urlpatterns = patterns('bldviewer.views',
|
||||
url(r'^builds/$', 'build', name='all-builds'),
|
||||
url(r'^build/(?P<build_id>\d+)/task/$', 'task', name='task'),
|
||||
url(r'^build/(?P<build_id>\d+)/packages/$', 'bpackage', name='bpackage'),
|
||||
url(r'^build/(?P<build_id>\d+)/package/(?P<package_id>\d+)/files/$', 'bfile', name='bfile'),
|
||||
url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/packages/$', 'tpackage', name='tpackage'),
|
||||
url(r'^build/(?P<build_id>\d+)/configuration/$', 'configuration', name='configuration'),
|
||||
url(r'^layers/$', 'layer', name='all-layers'),
|
||||
url(r'^layerversions/(?P<layerversion_id>\d+)/recipes/.*$', 'layer_versions_recipes', name='layer_versions_recipes'),
|
||||
url(r'^$', redirect_to, {'url': 'builds/'}),
|
||||
)
|
||||
260
bitbake/lib/toaster/bldviewer/views.py
Normal file
@@ -0,0 +1,260 @@
|
||||
#
|
||||
# BitBake Toaster Implementation
|
||||
#
|
||||
# Copyright (C) 2013 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 operator
|
||||
|
||||
from django.db.models import Q
|
||||
from django.shortcuts import render
|
||||
from orm.models import Build, Target, Task, Layer, Layer_Version, Recipe, Target_Package, LogMessage, Variable
|
||||
from orm.models import Task_Dependency, Recipe_Dependency, Build_Package, Build_File, Build_Package_Dependency
|
||||
from django.views.decorators.cache import cache_control
|
||||
|
||||
@cache_control(no_store=True)
|
||||
def build(request):
|
||||
template = 'build.html'
|
||||
build_info = Build.objects.all()
|
||||
|
||||
logs = LogMessage.objects.all()
|
||||
|
||||
context = {'builds': build_info, 'logs': logs ,
|
||||
'hideshowcols' : [
|
||||
{'name': 'Output', 'order':10},
|
||||
{'name': 'Log', 'order':11},
|
||||
]}
|
||||
|
||||
return render(request, template, context)
|
||||
|
||||
|
||||
def _find_task_revdep(task):
|
||||
tp = []
|
||||
for p in Task_Dependency.objects.filter(depends_on=task):
|
||||
tp.append(p.task);
|
||||
return tp
|
||||
|
||||
def _find_task_provider(task):
|
||||
task_revdeps = _find_task_revdep(task)
|
||||
for tr in task_revdeps:
|
||||
if tr.outcome != Task.OUTCOME_COVERED:
|
||||
return tr
|
||||
for tr in task_revdeps:
|
||||
trc = _find_task_provider(tr)
|
||||
if trc is not None:
|
||||
return trc
|
||||
return None
|
||||
|
||||
def task(request, build_id):
|
||||
template = 'task.html'
|
||||
|
||||
tasks = Task.objects.filter(build=build_id)
|
||||
|
||||
for t in tasks:
|
||||
if t.outcome == Task.OUTCOME_COVERED:
|
||||
t.provider = _find_task_provider(t)
|
||||
|
||||
context = {'build': Build.objects.filter(pk=build_id)[0], 'tasks': tasks}
|
||||
|
||||
return render(request, template, context)
|
||||
|
||||
def configuration(request, build_id):
|
||||
template = 'configuration.html'
|
||||
variables = Variable.objects.filter(build=build_id)
|
||||
context = {'build': Build.objects.filter(pk=build_id)[0], 'configuration' : variables}
|
||||
return render(request, template, context)
|
||||
|
||||
def bpackage(request, build_id):
|
||||
template = 'bpackage.html'
|
||||
packages = Build_Package.objects.filter(build = build_id)
|
||||
context = {'build': Build.objects.filter(pk=build_id)[0], 'packages' : packages}
|
||||
return render(request, template, context)
|
||||
|
||||
def bfile(request, build_id, package_id):
|
||||
template = 'bfile.html'
|
||||
files = Build_File.objects.filter(bpackage = package_id)
|
||||
context = {'build': Build.objects.filter(pk=build_id)[0], 'files' : files}
|
||||
return render(request, template, context)
|
||||
|
||||
def tpackage(request, build_id, target_id):
|
||||
template = 'package.html'
|
||||
|
||||
packages = Target_Package.objects.filter(target=target_id)
|
||||
|
||||
context = {'build' : Build.objects.filter(pk=build_id)[0],'packages': packages}
|
||||
|
||||
return render(request, template, context)
|
||||
|
||||
def layer(request):
|
||||
template = 'layer.html'
|
||||
layer_info = Layer.objects.all()
|
||||
|
||||
for li in layer_info:
|
||||
li.versions = Layer_Version.objects.filter(layer = li)
|
||||
for liv in li.versions:
|
||||
liv.count = Recipe.objects.filter(layer_version__id = liv.id).count()
|
||||
|
||||
context = {'layers': layer_info}
|
||||
|
||||
return render(request, template, context)
|
||||
|
||||
|
||||
def layer_versions_recipes(request, layerversion_id):
|
||||
template = 'recipe.html'
|
||||
recipes = Recipe.objects.filter(layer_version__id = layerversion_id)
|
||||
|
||||
context = {'recipes': recipes,
|
||||
'layer_version' : Layer_Version.objects.filter( id = layerversion_id )[0]
|
||||
}
|
||||
|
||||
return render(request, template, context)
|
||||
|
||||
#### API
|
||||
|
||||
import json
|
||||
from django.core import serializers
|
||||
from django.http import HttpResponse, HttpResponseBadRequest
|
||||
|
||||
|
||||
def model_explorer(request, model_name):
|
||||
|
||||
DESCENDING = 'desc'
|
||||
response_data = {}
|
||||
model_mapping = {
|
||||
'build': Build,
|
||||
'target': Target,
|
||||
'target_package': Target_Package,
|
||||
'task': Task,
|
||||
'task_dependency': Task_Dependency,
|
||||
'package': Build_Package,
|
||||
'layer': Layer,
|
||||
'layerversion': Layer_Version,
|
||||
'recipe': Recipe,
|
||||
'recipe_dependency': Recipe_Dependency,
|
||||
'build_package': Build_Package,
|
||||
'build_package_dependency': Build_Package_Dependency,
|
||||
'build_file': Build_File,
|
||||
'variable': Variable,
|
||||
'logmessage': LogMessage,
|
||||
}
|
||||
|
||||
if model_name not in model_mapping.keys():
|
||||
return HttpResponseBadRequest()
|
||||
|
||||
model = model_mapping[model_name]
|
||||
|
||||
try:
|
||||
limit = int(request.GET.get('limit', 0))
|
||||
except ValueError:
|
||||
limit = 0
|
||||
|
||||
try:
|
||||
offset = int(request.GET.get('offset', 0))
|
||||
except ValueError:
|
||||
offset = 0
|
||||
|
||||
ordering_string, invalid = _validate_input(request.GET.get('orderby', ''),
|
||||
model)
|
||||
if invalid:
|
||||
return HttpResponseBadRequest()
|
||||
|
||||
filter_string, invalid = _validate_input(request.GET.get('filter', ''),
|
||||
model)
|
||||
if invalid:
|
||||
return HttpResponseBadRequest()
|
||||
|
||||
search_term = request.GET.get('search', '')
|
||||
|
||||
if filter_string:
|
||||
filter_terms = _get_filtering_terms(filter_string)
|
||||
try:
|
||||
queryset = model.objects.filter(**filter_terms)
|
||||
except ValueError:
|
||||
queryset = []
|
||||
else:
|
||||
queryset = model.objects.all()
|
||||
|
||||
if search_term:
|
||||
queryset = _get_search_results(search_term, queryset, model)
|
||||
|
||||
if ordering_string and queryset:
|
||||
column, order = ordering_string.split(':')
|
||||
if order.lower() == DESCENDING:
|
||||
queryset = queryset.order_by('-' + column)
|
||||
else:
|
||||
queryset = queryset.order_by(column)
|
||||
|
||||
if offset and limit:
|
||||
queryset = queryset[offset:(offset+limit)]
|
||||
elif offset:
|
||||
queryset = queryset[offset:]
|
||||
elif limit:
|
||||
queryset = queryset[:limit]
|
||||
|
||||
if queryset:
|
||||
response_data['count'] = queryset.count()
|
||||
else:
|
||||
response_data['count'] = 0
|
||||
|
||||
response_data['list'] = serializers.serialize('json', queryset)
|
||||
|
||||
return HttpResponse(json.dumps(response_data),
|
||||
content_type='application/json')
|
||||
|
||||
def _get_filtering_terms(filter_string):
|
||||
|
||||
search_terms = filter_string.split(":")
|
||||
keys = search_terms[0].split(',')
|
||||
values = search_terms[1].split(',')
|
||||
|
||||
return dict(zip(keys, values))
|
||||
|
||||
def _validate_input(input, model):
|
||||
|
||||
invalid = 0
|
||||
|
||||
if input:
|
||||
input_list = input.split(":")
|
||||
|
||||
# Check we have only one colon
|
||||
if len(input_list) != 2:
|
||||
invalid = 1
|
||||
return None, invalid
|
||||
|
||||
# Check we have an equal number of terms both sides of the colon
|
||||
if len(input_list[0].split(',')) != len(input_list[1].split(',')):
|
||||
invalid = 1
|
||||
return None, invalid
|
||||
|
||||
# Check we are looking for a valid field
|
||||
valid_fields = model._meta.get_all_field_names()
|
||||
for field in input_list[0].split(','):
|
||||
if field not in valid_fields:
|
||||
invalid = 1
|
||||
return None, invalid
|
||||
|
||||
return input, invalid
|
||||
|
||||
def _get_search_results(search_term, queryset, model):
|
||||
search_objects = []
|
||||
for st in search_term.split(" "):
|
||||
q_map = map(lambda x: Q(**{x+'__icontains': st}),
|
||||
model.search_allowed_fields)
|
||||
|
||||
search_objects.append(reduce(operator.or_, q_map))
|
||||
search_object = reduce(operator.and_, search_objects)
|
||||
queryset = queryset.filter(search_object)
|
||||
|
||||
return queryset
|
||||
10
bitbake/lib/toaster/manage.py
Executable file
@@ -0,0 +1,10 @@
|
||||
#!/usr/bin/env python
|
||||
import os
|
||||
import sys
|
||||
|
||||
if __name__ == "__main__":
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "toastermain.settings")
|
||||
|
||||
from django.core.management import execute_from_command_line
|
||||
|
||||
execute_from_command_line(sys.argv)
|
||||
0
bitbake/lib/toaster/orm/__init__.py
Normal file
265
bitbake/lib/toaster/orm/models.py
Normal file
@@ -0,0 +1,265 @@
|
||||
#
|
||||
# BitBake Toaster Implementation
|
||||
#
|
||||
# Copyright (C) 2013 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.
|
||||
|
||||
from django.db import models
|
||||
from django.utils.encoding import python_2_unicode_compatible
|
||||
|
||||
|
||||
class Build(models.Model):
|
||||
SUCCEEDED = 0
|
||||
FAILED = 1
|
||||
IN_PROGRESS = 2
|
||||
|
||||
BUILD_OUTCOME = (
|
||||
(SUCCEEDED, 'Succeeded'),
|
||||
(FAILED, 'Failed'),
|
||||
(IN_PROGRESS, 'In Progress'),
|
||||
)
|
||||
|
||||
search_allowed_fields = ['machine',
|
||||
'cooker_log_path']
|
||||
|
||||
machine = models.CharField(max_length=100)
|
||||
image_fstypes = models.CharField(max_length=100)
|
||||
distro = models.CharField(max_length=100)
|
||||
distro_version = models.CharField(max_length=100)
|
||||
started_on = models.DateTimeField()
|
||||
completed_on = models.DateTimeField()
|
||||
outcome = models.IntegerField(choices=BUILD_OUTCOME, default=IN_PROGRESS)
|
||||
errors_no = models.IntegerField(default=0)
|
||||
warnings_no = models.IntegerField(default=0)
|
||||
cooker_log_path = models.CharField(max_length=500)
|
||||
build_name = models.CharField(max_length=100)
|
||||
bitbake_version = models.CharField(max_length=50)
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class Target(models.Model):
|
||||
search_allowed_fields = ['target', 'image_fstypes', 'file_name']
|
||||
build = models.ForeignKey(Build)
|
||||
target = models.CharField(max_length=100)
|
||||
is_image = models.BooleanField(default = False)
|
||||
file_name = models.CharField(max_length=100)
|
||||
file_size = models.IntegerField()
|
||||
|
||||
def __str__(self):
|
||||
return self.target
|
||||
|
||||
|
||||
class Task(models.Model):
|
||||
|
||||
SSTATE_NA = 0
|
||||
SSTATE_MISS = 1
|
||||
SSTATE_FAILED = 2
|
||||
SSTATE_RESTORED = 3
|
||||
|
||||
SSTATE_RESULT = (
|
||||
(SSTATE_NA, 'Not Applicable'), # For rest of tasks, but they still need checking.
|
||||
(SSTATE_MISS, 'Missing'), # it is a miss
|
||||
(SSTATE_FAILED, 'Failed'), # there was a pkg, but the script failed
|
||||
(SSTATE_RESTORED, 'Restored'), # succesfully restored
|
||||
)
|
||||
|
||||
CODING_NA = 0
|
||||
CODING_NOEXEC = 1
|
||||
CODING_PYTHON = 2
|
||||
CODING_SHELL = 3
|
||||
|
||||
TASK_CODING = (
|
||||
(CODING_NA, 'N/A'),
|
||||
(CODING_NOEXEC, 'NoExec'),
|
||||
(CODING_PYTHON, 'Python'),
|
||||
(CODING_SHELL, 'Shell'),
|
||||
)
|
||||
|
||||
OUTCOME_SUCCESS = 0
|
||||
OUTCOME_COVERED = 1
|
||||
OUTCOME_SSTATE = 2
|
||||
OUTCOME_EXISTING = 3
|
||||
OUTCOME_FAILED = 4
|
||||
OUTCOME_NA = 5
|
||||
|
||||
TASK_OUTCOME = (
|
||||
(OUTCOME_SUCCESS, 'Succeeded'),
|
||||
(OUTCOME_COVERED, 'Covered'),
|
||||
(OUTCOME_SSTATE, 'Sstate'),
|
||||
(OUTCOME_EXISTING, 'Existing'),
|
||||
(OUTCOME_FAILED, 'Failed'),
|
||||
(OUTCOME_NA, 'Not Available'),
|
||||
)
|
||||
|
||||
build = models.ForeignKey(Build, related_name='task_build')
|
||||
order = models.IntegerField(null=True)
|
||||
task_executed = models.BooleanField(default=False) # True means Executed, False means Prebuilt
|
||||
outcome = models.IntegerField(choices=TASK_OUTCOME, default=OUTCOME_NA)
|
||||
sstate_checksum = models.CharField(max_length=100, blank=True)
|
||||
path_to_sstate_obj = models.FilePathField(max_length=500, blank=True)
|
||||
recipe = models.ForeignKey('Recipe', related_name='build_recipe')
|
||||
task_name = models.CharField(max_length=100)
|
||||
source_url = models.FilePathField(max_length=255, blank=True)
|
||||
work_directory = models.FilePathField(max_length=255, blank=True)
|
||||
script_type = models.IntegerField(choices=TASK_CODING, default=CODING_NA)
|
||||
line_number = models.IntegerField(default=0)
|
||||
disk_io = models.IntegerField(null=True)
|
||||
cpu_usage = models.DecimalField(max_digits=6, decimal_places=2, null=True)
|
||||
elapsed_time = models.CharField(max_length=50, default=0)
|
||||
sstate_result = models.IntegerField(choices=SSTATE_RESULT, default=SSTATE_NA)
|
||||
message = models.CharField(max_length=240)
|
||||
logfile = models.FilePathField(max_length=255, blank=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ('order', 'recipe' ,)
|
||||
|
||||
|
||||
class Task_Dependency(models.Model):
|
||||
task = models.ForeignKey(Task, related_name='task_dependencies_task')
|
||||
depends_on = models.ForeignKey(Task, related_name='task_dependencies_depends')
|
||||
|
||||
|
||||
class Build_Package(models.Model):
|
||||
build = models.ForeignKey('Build')
|
||||
recipe = models.ForeignKey('Recipe', null=True)
|
||||
name = models.CharField(max_length=100)
|
||||
version = models.CharField(max_length=100, blank=True)
|
||||
revision = models.CharField(max_length=32, blank=True)
|
||||
summary = models.CharField(max_length=200, blank=True)
|
||||
description = models.CharField(max_length=200, blank=True)
|
||||
size = models.IntegerField(default=0)
|
||||
section = models.CharField(max_length=80, blank=True)
|
||||
license = models.CharField(max_length=80, blank=True)
|
||||
|
||||
class Build_Package_Dependency(models.Model):
|
||||
TYPE_RDEPENDS = 0
|
||||
TYPE_RPROVIDES = 1
|
||||
TYPE_RRECOMMENDS = 2
|
||||
TYPE_RSUGGESTS = 3
|
||||
TYPE_RREPLACES = 4
|
||||
TYPE_RCONFLICTS = 5
|
||||
DEPENDS_TYPE = (
|
||||
(TYPE_RDEPENDS, "rdepends"),
|
||||
(TYPE_RPROVIDES, "rprovides"),
|
||||
(TYPE_RRECOMMENDS, "rrecommends"),
|
||||
(TYPE_RSUGGESTS, "rsuggests"),
|
||||
(TYPE_RREPLACES, "rreplaces"),
|
||||
(TYPE_RCONFLICTS, "rconflicts"),
|
||||
)
|
||||
package = models.ForeignKey(Build_Package, related_name='bpackage_dependencies_package')
|
||||
depends_on = models.CharField(max_length=100) # soft dependency
|
||||
dep_type = models.IntegerField(choices=DEPENDS_TYPE)
|
||||
|
||||
|
||||
class Target_Package(models.Model):
|
||||
target = models.ForeignKey('Target')
|
||||
recipe = models.ForeignKey('Recipe', null=True)
|
||||
name = models.CharField(max_length=100)
|
||||
version = models.CharField(max_length=100, blank=True)
|
||||
size = models.IntegerField()
|
||||
|
||||
|
||||
class Target_Package_Dependency(models.Model):
|
||||
TYPE_DEPENDS = 0
|
||||
TYPE_RDEPENDS = 1
|
||||
TYPE_RECOMMENDS = 2
|
||||
|
||||
DEPENDS_TYPE = (
|
||||
(TYPE_DEPENDS, "depends"),
|
||||
(TYPE_RDEPENDS, "rdepends"),
|
||||
(TYPE_RECOMMENDS, "recommends"),
|
||||
)
|
||||
package = models.ForeignKey(Target_Package, related_name='tpackage_dependencies_package')
|
||||
depends_on = models.ForeignKey(Target_Package, related_name='tpackage_dependencies_depends')
|
||||
dep_type = models.IntegerField(choices=DEPENDS_TYPE)
|
||||
|
||||
|
||||
class Build_File(models.Model):
|
||||
bpackage = models.ForeignKey(Build_Package, related_name='filelist_bpackage')
|
||||
path = models.FilePathField(max_length=255, blank=True)
|
||||
size = models.IntegerField()
|
||||
|
||||
class Target_File(models.Model):
|
||||
tpackage = models.ForeignKey(Target_Package, related_name='filelist_tpackage')
|
||||
path = models.FilePathField(max_length=255, blank=True)
|
||||
size = models.IntegerField()
|
||||
|
||||
|
||||
class Recipe(models.Model):
|
||||
name = models.CharField(max_length=100, blank=True)
|
||||
version = models.CharField(max_length=100, blank=True)
|
||||
layer_version = models.ForeignKey('Layer_Version', related_name='recipe_layer_version')
|
||||
summary = models.CharField(max_length=100, blank=True)
|
||||
description = models.CharField(max_length=100, blank=True)
|
||||
section = models.CharField(max_length=100, blank=True)
|
||||
license = models.CharField(max_length=200, blank=True)
|
||||
licensing_info = models.TextField(blank=True)
|
||||
homepage = models.URLField(blank=True)
|
||||
bugtracker = models.URLField(blank=True)
|
||||
file_path = models.FilePathField(max_length=255)
|
||||
|
||||
|
||||
class Recipe_Dependency(models.Model):
|
||||
TYPE_DEPENDS = 0
|
||||
TYPE_RDEPENDS = 1
|
||||
|
||||
DEPENDS_TYPE = (
|
||||
(TYPE_DEPENDS, "depends"),
|
||||
(TYPE_RDEPENDS, "rdepends"),
|
||||
)
|
||||
recipe = models.ForeignKey(Recipe, related_name='r_dependencies_recipe')
|
||||
depends_on = models.ForeignKey(Recipe, related_name='r_dependencies_depends')
|
||||
dep_type = models.IntegerField(choices=DEPENDS_TYPE)
|
||||
|
||||
class Layer(models.Model):
|
||||
name = models.CharField(max_length=100)
|
||||
local_path = models.FilePathField(max_length=255)
|
||||
layer_index_url = models.URLField()
|
||||
|
||||
|
||||
class Layer_Version(models.Model):
|
||||
layer = models.ForeignKey(Layer, related_name='layer_version_layer')
|
||||
branch = models.CharField(max_length=50)
|
||||
commit = models.CharField(max_length=100)
|
||||
priority = models.IntegerField()
|
||||
|
||||
|
||||
class Variable(models.Model):
|
||||
build = models.ForeignKey(Build, related_name='variable_build')
|
||||
variable_name = models.CharField(max_length=100)
|
||||
variable_value = models.TextField(blank=True)
|
||||
changed = models.BooleanField(default=False)
|
||||
human_readable_name = models.CharField(max_length=200)
|
||||
description = models.TextField(blank=True)
|
||||
|
||||
class VariableHistory(models.Model):
|
||||
variable = models.ForeignKey(Variable)
|
||||
file_name = models.FilePathField(max_length=255)
|
||||
line_number = models.IntegerField(null=True)
|
||||
operation = models.CharField(max_length=16)
|
||||
|
||||
class LogMessage(models.Model):
|
||||
INFO = 0
|
||||
WARNING = 1
|
||||
ERROR = 2
|
||||
|
||||
LOG_LEVEL = ( (INFO, "info"),
|
||||
(WARNING, "warn"),
|
||||
(ERROR, "error") )
|
||||
|
||||
build = models.ForeignKey(Build)
|
||||
level = models.IntegerField(choices=LOG_LEVEL, default=INFO)
|
||||
message=models.CharField(max_length=240)
|
||||
pathname = models.FilePathField(max_length=255, blank=True)
|
||||
lineno = models.IntegerField(null=True)
|
||||
0
bitbake/lib/toaster/toastergui/__init__.py
Normal file
BIN
bitbake/lib/toaster/toastergui/static/images/yocto.jpg
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
13
bitbake/lib/toaster/toastergui/templates/index.html
Normal file
@@ -0,0 +1,13 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>GUI Page</title>
|
||||
</head>
|
||||
<body>
|
||||
{% load staticfiles %}
|
||||
|
||||
<img src="{% static "/static/images/yocto.jpg" %}" alt="Yocto"/>
|
||||
|
||||
This is your basic index page!
|
||||
</body>
|
||||
|
||||
</html>
|
||||
27
bitbake/lib/toaster/toastergui/urls.py
Normal file
@@ -0,0 +1,27 @@
|
||||
#
|
||||
# BitBake Toaster Implementation
|
||||
#
|
||||
# Copyright (C) 2013 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
|
||||
|
||||
from django.conf import settings
|
||||
from django.conf.urls import patterns, include, url
|
||||
|
||||
|
||||
urlpatterns = patterns('toastergui.views',
|
||||
url(r'^$', 'guihome', name='guihome'),
|
||||
)
|
||||
26
bitbake/lib/toaster/toastergui/views.py
Normal file
@@ -0,0 +1,26 @@
|
||||
#
|
||||
# BitBake Toaster Implementation
|
||||
#
|
||||
# Copyright (C) 2013 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.
|
||||
|
||||
from django.shortcuts import render
|
||||
from orm.models import Build, Task
|
||||
|
||||
|
||||
def guihome(request):
|
||||
template = 'index.html'
|
||||
|
||||
return render(request, template)
|
||||
0
bitbake/lib/toaster/toastermain/__init__.py
Normal file
191
bitbake/lib/toaster/toastermain/settings.py
Normal file
@@ -0,0 +1,191 @@
|
||||
#
|
||||
# BitBake Toaster Implementation
|
||||
#
|
||||
# Copyright (C) 2013 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.
|
||||
|
||||
# Django settings for Toaster project.
|
||||
|
||||
DEBUG = True
|
||||
TEMPLATE_DEBUG = DEBUG
|
||||
|
||||
ADMINS = (
|
||||
# ('Your Name', 'your_email@example.com'),
|
||||
)
|
||||
|
||||
MANAGERS = ADMINS
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
'NAME': 'toaster.sqlite', # Or path to database file if using sqlite3.
|
||||
'USER': '',
|
||||
'PASSWORD': '',
|
||||
'HOST': '127.0.0.1', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
|
||||
'PORT': '3306', # Set to empty string for default.
|
||||
}
|
||||
}
|
||||
|
||||
# Hosts/domain names that are valid for this site; required if DEBUG is False
|
||||
# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts
|
||||
ALLOWED_HOSTS = []
|
||||
|
||||
# Local time zone for this installation. Choices can be found here:
|
||||
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
|
||||
# although not all choices may be available on all operating systems.
|
||||
# In a Windows environment this must be set to your system time zone.
|
||||
|
||||
# Always use local computer's time zone
|
||||
import time
|
||||
TIME_ZONE = time.tzname[0]
|
||||
|
||||
# Language code for this installation. All choices can be found here:
|
||||
# http://www.i18nguy.com/unicode/language-identifiers.html
|
||||
LANGUAGE_CODE = 'en-us'
|
||||
|
||||
SITE_ID = 1
|
||||
|
||||
# If you set this to False, Django will make some optimizations so as not
|
||||
# to load the internationalization machinery.
|
||||
USE_I18N = True
|
||||
|
||||
# If you set this to False, Django will not format dates, numbers and
|
||||
# calendars according to the current locale.
|
||||
USE_L10N = True
|
||||
|
||||
# If you set this to False, Django will not use timezone-aware datetimes.
|
||||
USE_TZ = True
|
||||
|
||||
# Absolute filesystem path to the directory that will hold user-uploaded files.
|
||||
# Example: "/var/www/example.com/media/"
|
||||
MEDIA_ROOT = ''
|
||||
|
||||
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
|
||||
# trailing slash.
|
||||
# Examples: "http://example.com/media/", "http://media.example.com/"
|
||||
MEDIA_URL = ''
|
||||
|
||||
# Absolute path to the directory static files should be collected to.
|
||||
# Don't put anything in this directory yourself; store your static files
|
||||
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
|
||||
# Example: "/var/www/example.com/static/"
|
||||
STATIC_ROOT = ''
|
||||
|
||||
# URL prefix for static files.
|
||||
# Example: "http://example.com/static/", "http://static.example.com/"
|
||||
STATIC_URL = '/static/'
|
||||
|
||||
# Additional locations of static files
|
||||
STATICFILES_DIRS = (
|
||||
# Put strings here, like "/home/html/static" or "C:/www/django/static".
|
||||
# Always use forward slashes, even on Windows.
|
||||
# Don't forget to use absolute paths, not relative paths.
|
||||
)
|
||||
|
||||
# List of finder classes that know how to find static files in
|
||||
# various locations.
|
||||
STATICFILES_FINDERS = (
|
||||
'django.contrib.staticfiles.finders.FileSystemFinder',
|
||||
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
|
||||
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
|
||||
)
|
||||
|
||||
# Make this unique, and don't share it with anybody.
|
||||
SECRET_KEY = 'NOT_SUITABLE_FOR_HOSTED_DEPLOYMENT'
|
||||
|
||||
# List of callables that know how to import templates from various sources.
|
||||
TEMPLATE_LOADERS = (
|
||||
'django.template.loaders.filesystem.Loader',
|
||||
'django.template.loaders.app_directories.Loader',
|
||||
# 'django.template.loaders.eggs.Loader',
|
||||
)
|
||||
|
||||
MIDDLEWARE_CLASSES = (
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.csrf.CsrfViewMiddleware',
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
# Uncomment the next line for simple clickjacking protection:
|
||||
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
)
|
||||
|
||||
ROOT_URLCONF = 'toastermain.urls'
|
||||
|
||||
# Python dotted path to the WSGI application used by Django's runserver.
|
||||
WSGI_APPLICATION = 'toastermain.wsgi.application'
|
||||
|
||||
TEMPLATE_DIRS = (
|
||||
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
|
||||
# Always use forward slashes, even on Windows.
|
||||
# Don't forget to use absolute paths, not relative paths.
|
||||
)
|
||||
|
||||
INSTALLED_APPS = (
|
||||
#'django.contrib.auth',
|
||||
#'django.contrib.contenttypes',
|
||||
#'django.contrib.sessions',
|
||||
#'django.contrib.sites',
|
||||
#'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
# Uncomment the next line to enable the admin:
|
||||
# 'django.contrib.admin',
|
||||
# Uncomment the next line to enable admin documentation:
|
||||
# 'django.contrib.admindocs',
|
||||
'orm',
|
||||
'toastermain',
|
||||
'bldviewer',
|
||||
'toastergui',
|
||||
)
|
||||
|
||||
# A sample logging configuration. The only tangible logging
|
||||
# performed by this configuration is to send an email to
|
||||
# the site admins on every HTTP 500 error when DEBUG=False.
|
||||
# See http://docs.djangoproject.com/en/dev/topics/logging for
|
||||
# more details on how to customize your logging configuration.
|
||||
LOGGING = {
|
||||
'version': 1,
|
||||
'disable_existing_loggers': False,
|
||||
'filters': {
|
||||
'require_debug_false': {
|
||||
'()': 'django.utils.log.RequireDebugFalse'
|
||||
}
|
||||
},
|
||||
'handlers': {
|
||||
'mail_admins': {
|
||||
'level': 'ERROR',
|
||||
'filters': ['require_debug_false'],
|
||||
'class': 'django.utils.log.AdminEmailHandler'
|
||||
}
|
||||
},
|
||||
'loggers': {
|
||||
'django.request': {
|
||||
'handlers': ['mail_admins'],
|
||||
'level': 'ERROR',
|
||||
'propagate': True,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
# If we're using sqlite, we need to tweak the performance a bit
|
||||
from django.db.backends.signals import connection_created
|
||||
def activate_synchronous_off(sender, connection, **kwargs):
|
||||
if connection.vendor == 'sqlite':
|
||||
cursor = connection.cursor()
|
||||
cursor.execute('PRAGMA synchronous = 0;')
|
||||
connection_created.connect(activate_synchronous_off)
|
||||
#
|
||||
|
||||
|
||||
41
bitbake/lib/toaster/toastermain/urls.py
Normal file
@@ -0,0 +1,41 @@
|
||||
#
|
||||
# BitBake Toaster Implementation
|
||||
#
|
||||
# Copyright (C) 2013 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.
|
||||
|
||||
from django.conf.urls import patterns, include, url
|
||||
from django.views.generic.simple import redirect_to
|
||||
from django.views.decorators.cache import never_cache
|
||||
|
||||
|
||||
# Uncomment the next two lines to enable the admin:
|
||||
# from django.contrib import admin
|
||||
# admin.autodiscover()
|
||||
|
||||
urlpatterns = patterns('',
|
||||
url(r'^simple/', include('bldviewer.urls')),
|
||||
url(r'^api/1.0/', include('bldviewer.api')),
|
||||
url(r'^gui/', include('toastergui.urls')),
|
||||
url(r'^$', never_cache(redirect_to), {'url': '/simple/'}),
|
||||
# Examples:
|
||||
# url(r'^toaster/', include('toaster.foo.urls')),
|
||||
|
||||
# Uncomment the admin/doc line below to enable admin documentation:
|
||||
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
|
||||
|
||||
# Uncomment the next line to enable the admin:
|
||||
# url(r'^admin/', include(admin.site.urls)),
|
||||
)
|
||||
32
bitbake/lib/toaster/toastermain/wsgi.py
Normal file
@@ -0,0 +1,32 @@
|
||||
"""
|
||||
WSGI config for Toaster project.
|
||||
|
||||
This module contains the WSGI application used by Django's development server
|
||||
and any production WSGI deployments. It should expose a module-level variable
|
||||
named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover
|
||||
this application via the ``WSGI_APPLICATION`` setting.
|
||||
|
||||
Usually you will have the standard Django WSGI application here, but it also
|
||||
might make sense to replace the whole Django WSGI application with a custom one
|
||||
that later delegates to the Django one. For example, you could introduce WSGI
|
||||
middleware here, or combine a Django application with an application of another
|
||||
framework.
|
||||
|
||||
"""
|
||||
import os
|
||||
|
||||
# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
|
||||
# if running multiple sites in the same mod_wsgi process. To fix this, use
|
||||
# mod_wsgi daemon mode with each site in its own daemon process, or use
|
||||
# os.environ["DJANGO_SETTINGS_MODULE"] = "Toaster.settings"
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "toastermain.settings")
|
||||
|
||||
# This application object is used by any WSGI server configured to use this
|
||||
# file. This includes Django's development server, if the WSGI_APPLICATION
|
||||
# setting points here.
|
||||
from django.core.wsgi import get_wsgi_application
|
||||
application = get_wsgi_application()
|
||||
|
||||
# Apply WSGI middleware here.
|
||||
# from helloworld.wsgi import HelloWorldApplication
|
||||
# application = HelloWorldApplication(application)
|
||||
@@ -63,7 +63,7 @@
|
||||
</revision>
|
||||
<revision>
|
||||
<revnumber>1.5</revnumber>
|
||||
<date>Sometime in 2013</date>
|
||||
<date>October 2013</date>
|
||||
<revremark>Released with the Yocto Project 1.5 Release.</revremark>
|
||||
</revision>
|
||||
</revhistory>
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
</revision>
|
||||
<revision>
|
||||
<revnumber>1.5</revnumber>
|
||||
<date>Sometime in 2013</date>
|
||||
<date>October 2013</date>
|
||||
<revremark>Released with the Yocto Project 1.5 Release.</revremark>
|
||||
</revision>
|
||||
</revhistory>
|
||||
|
||||
@@ -183,17 +183,15 @@
|
||||
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config/
|
||||
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config/crownbay/
|
||||
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config/crownbay/xorg.conf
|
||||
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config/crownbay-noemgd/
|
||||
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_3.2.bbappend
|
||||
meta-crownbay/recipes-kernel/linux/linux-yocto_3.4.bbappend
|
||||
meta-crownbay/recipes-kernel/linux/linux-yocto_3.8.bbappend
|
||||
meta-crownbay/recipes-kernel/linux/linux-yocto_3.10.bbappend
|
||||
meta-crownbay/recipes-kernel/linux/linux-yocto-dev.bbappend
|
||||
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-rt_3.8.bbappend
|
||||
meta-crownbay/recipes-kernel/linux/linux-yocto-rt_3.10.bbappend
|
||||
</literallayout>
|
||||
</para>
|
||||
|
||||
@@ -376,15 +374,6 @@
|
||||
<para>
|
||||
Each BSP Layer requires at least one machine file.
|
||||
However, you can supply more than one file.
|
||||
For example, in the Crown Bay BSP shown earlier in this section, the
|
||||
<filename>conf/machine</filename> directory contains two configuration files:
|
||||
<filename>crownbay.conf</filename> and <filename>crownbay-noemgd.conf</filename>.
|
||||
The <filename>crownbay.conf</filename> file is used for the Crown Bay BSP
|
||||
that supports the <trademark class='registered'>Intel</trademark> Embedded
|
||||
Media and Graphics Driver (<trademark class='registered'>Intel</trademark>
|
||||
EMGD), while the <filename>crownbay-noemgd</filename> file is used for the
|
||||
Crown Bay BSP that supports Video Electronics Standards Association (VESA)
|
||||
graphics only.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
@@ -428,15 +417,13 @@
|
||||
This optional directory contains miscellaneous recipe files for the BSP.
|
||||
Most notably would be the formfactor files.
|
||||
For example, in the Crown Bay BSP there is the
|
||||
<filename>formfactor_0.0.bbappend</filename> file, which is an append file used
|
||||
to augment the recipe that starts the build.
|
||||
Furthermore, there are machine-specific settings used during the build that are
|
||||
defined by the <filename>machconfig</filename> files.
|
||||
In the Crown Bay example, two <filename>machconfig</filename> files exist:
|
||||
one that supports the
|
||||
<trademark class='registered'>Intel</trademark> Embedded
|
||||
Media and Graphics Driver (<trademark class='registered'>Intel</trademark>
|
||||
EMGD) and one that does not:
|
||||
<filename>formfactor_0.0.bbappend</filename> file, which is an
|
||||
append file used to augment the recipe that starts the build.
|
||||
Furthermore, there are machine-specific settings used during the
|
||||
build that are defined by the <filename>machconfig</filename>.
|
||||
In the Crown Bay example, two <filename>machconfig</filename> files
|
||||
exist: one that supports the Intel® Embedded Media and Graphics
|
||||
Driver (Intel® EMGD) and one that does not:
|
||||
<literallayout class='monospaced'>
|
||||
meta-crownbay/recipes-bsp/formfactor/formfactor/crownbay/machconfig
|
||||
meta-crownbay/recipes-bsp/formfactor/formfactor/crownbay-noemgd/machconfig
|
||||
@@ -467,15 +454,12 @@
|
||||
This optional directory contains recipes for the BSP if it has
|
||||
special requirements for graphics support.
|
||||
All files that are needed for the BSP to support a display are kept here.
|
||||
For example, the Crown Bay BSP contains two versions of the
|
||||
<filename>xorg.conf</filename> file.
|
||||
The version in <filename>crownbay</filename> builds a BSP that supports the
|
||||
<trademark class='registered'>Intel</trademark> Embedded Media Graphics Driver (EMGD),
|
||||
while the version in <filename>crownbay-noemgd</filename> builds
|
||||
a BSP that supports Video Electronics Standards Association (VESA) graphics only:
|
||||
For example, the Crown Bay BSP's <filename>xorg.conf</filename> file
|
||||
detects the graphics support needed (i.e. the Intel® Embedded Media
|
||||
Graphics Driver (EMGD) or the Video Electronics Standards Association
|
||||
(VESA) graphics):
|
||||
<literallayout class='monospaced'>
|
||||
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend
|
||||
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config/crownbay/xorg.conf
|
||||
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config/crownbay-noemgd/xorg.conf
|
||||
</literallayout>
|
||||
</para>
|
||||
@@ -502,28 +486,28 @@
|
||||
the <filename>meta-<bsp_name>/recipes-kernel/linux</filename> directory).
|
||||
</para>
|
||||
<para>
|
||||
Suppose you are using the <filename>linux-yocto_3.8.bb</filename> recipe to build
|
||||
Suppose you are using the <filename>linux-yocto_3.10.bb</filename> recipe to build
|
||||
the kernel.
|
||||
In other words, you have selected the kernel in your
|
||||
<filename><bsp_name>.conf</filename> file by adding these types
|
||||
of statements:
|
||||
<literallayout class='monospaced'>
|
||||
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
|
||||
PREFERRED_VERSION_linux-yocto ?= "3.8%"
|
||||
PREFERRED_VERSION_linux-yocto ?= "3.10%"
|
||||
</literallayout>
|
||||
<note>
|
||||
When the preferred provider is assumed by default, the
|
||||
<filename>PREFERRED_PROVIDER</filename> statement does not appear in the
|
||||
<filename><bsp_name>.conf</filename> file.
|
||||
</note>
|
||||
You would use the <filename>linux-yocto_3.8.bbappend</filename> file to append
|
||||
You would use the <filename>linux-yocto_3.10.bbappend</filename> file to append
|
||||
specific BSP settings to the kernel, thus configuring the kernel for your particular BSP.
|
||||
</para>
|
||||
<para>
|
||||
As an example, look at the existing Crown Bay BSP.
|
||||
The append file used is:
|
||||
<literallayout class='monospaced'>
|
||||
meta-crownbay/recipes-kernel/linux/linux-yocto_3.8.bbappend
|
||||
meta-crownbay/recipes-kernel/linux/linux-yocto_3.10.bbappend
|
||||
</literallayout>
|
||||
The following listing shows the file.
|
||||
Be aware that the actual commit ID strings in this example listing might be different
|
||||
@@ -532,46 +516,18 @@
|
||||
<literallayout class='monospaced'>
|
||||
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
|
||||
|
||||
COMPATIBLE_MACHINE_crownbay = "crownbay"
|
||||
KMACHINE_crownbay = "crownbay"
|
||||
KBRANCH_crownbay = "standard/crownbay"
|
||||
KERNEL_FEATURES_crownbay_append = " features/drm-emgd/drm-emgd-1.16 cfg/vesafb"
|
||||
|
||||
COMPATIBLE_MACHINE_crownbay-noemgd = "crownbay-noemgd"
|
||||
KMACHINE_crownbay-noemgd = "crownbay"
|
||||
KBRANCH_crownbay-noemgd = "standard/crownbay"
|
||||
KERNEL_FEATURES_crownbay-noemgd_append = " cfg/vesafb"
|
||||
KERNEL_FEATURES_append_crownbay-noemgd = " cfg/vesafb"
|
||||
|
||||
LINUX_VERSION = "3.8.4"
|
||||
LINUX_VERSION = "3.10.11"
|
||||
|
||||
SRCREV_meta_crownbay = "2a6d36e75ca0a121570a389d7bab76ec240cbfda"
|
||||
SRCREV_machine_crownbay = "47aed0c17c1c55988198ad39f86ae88894c8e0a4"
|
||||
SRCREV_emgd_crownbay = "c780732f175ff0ec866fac2130175876b519b576"
|
||||
|
||||
SRCREV_meta_crownbay-noemgd = "2a6d36e75ca0a121570a389d7bab76ec240cbfda"
|
||||
SRCREV_machine_crownbay-noemgd = "47aed0c17c1c55988198ad39f86ae88894c8e0a4"
|
||||
|
||||
SRC_URI_crownbay = "git://git.yoctoproject.org/linux-yocto-3.8.git;protocol=git;nocheckout=1;branch=${KBRANCH},${KMETA},emgd-1.16;name=machine,meta,emgd"
|
||||
SRCREV_meta_crownbay-noemgd = "285f93bf942e8f6fa678ffc6cc53696ed5400718"
|
||||
SRCREV_machine_crownbay-noemgd = "702040ac7c7ec66a29b4d147665ccdd0ff015577"
|
||||
</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.
|
||||
The build process, in this case, recognizes and uses only the statements that
|
||||
apply to the defined machine name - <filename>crownbay</filename> in this case.
|
||||
So, the applicable statements in the <filename>linux-yocto_3.8.bbappend</filename>
|
||||
file are follows:
|
||||
<literallayout class='monospaced'>
|
||||
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
|
||||
|
||||
COMPATIBLE_MACHINE_crownbay = "crownbay"
|
||||
KMACHINE_crownbay = "crownbay"
|
||||
KBRANCH_crownbay = "standard/crownbay"
|
||||
KERNEL_FEATURES_crownbay_append = " features/drm-emgd/drm-emgd-1.16 cfg/vesafb"
|
||||
|
||||
SRCREV_meta_crownbay = "2a6d36e75ca0a121570a389d7bab76ec240cbfda"
|
||||
SRCREV_machine_crownbay = "47aed0c17c1c55988198ad39f86ae88894c8e0a4"
|
||||
SRCREV_emgd_crownbay = "c780732f175ff0ec866fac2130175876b519b576"
|
||||
</literallayout>
|
||||
The append file defines <filename>crownbay</filename> as the
|
||||
This append file contains statements used to support the Crown Bay BSP.
|
||||
The file defines <filename>crownbay</filename> as the
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#var-COMPATIBLE_MACHINE'><filename>COMPATIBLE_MACHINE</filename></ulink>
|
||||
and uses the
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#var-KMACHINE'><filename>KMACHINE</filename></ulink> variable to
|
||||
@@ -588,12 +544,6 @@
|
||||
<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>
|
||||
@@ -1281,31 +1231,35 @@
|
||||
Following is the complete example:
|
||||
<literallayout class='monospaced'>
|
||||
$ yocto-bsp create myarm qemu
|
||||
Checking basic git connectivity...
|
||||
Done.
|
||||
|
||||
Which qemu architecture would you like to use? [default: i386]
|
||||
1) i386 (32-bit)
|
||||
1) i386 (32-bit)
|
||||
2) x86_64 (64-bit)
|
||||
3) ARM (32-bit)
|
||||
4) PowerPC (32-bit)
|
||||
5) MIPS (32-bit)
|
||||
3
|
||||
Would you like to use the default (3.8) kernel? (y/n) [default: y]
|
||||
Would you like to use the default (3.10) kernel? (y/n) [default: y] 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.8.git...
|
||||
Getting branches from remote repo git://git.yoctoproject.org/linux-yocto-3.10.git...
|
||||
Please choose a machine branch to base your new BSP branch on: [default: standard/base]
|
||||
1) standard/arm-versatile-926ejs
|
||||
2) standard/base
|
||||
3) standard/beagleboard
|
||||
4) standard/ck
|
||||
5) standard/crownbay
|
||||
6) standard/edf
|
||||
7) standard/emenlow
|
||||
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) standard/arm-versatile-926ejs
|
||||
2) standard/base
|
||||
3) standard/beagleboard
|
||||
4) standard/ck
|
||||
5) standard/crownbay
|
||||
6) standard/edf
|
||||
7) standard/emenlow
|
||||
8) standard/fri2
|
||||
9) standard/fsl-mpc8315e-rdb
|
||||
10) standard/minnow
|
||||
11) standard/mti-malta32
|
||||
12) standard/mti-malta64
|
||||
13) standard/qemuppc
|
||||
14) standard/routerstationpro
|
||||
15) standard/sys940x
|
||||
1
|
||||
Would you like SMP support? (y/n) [default: y]
|
||||
Does your BSP have a touchscreen? (y/n) [default: n]
|
||||
@@ -1320,7 +1274,7 @@
|
||||
In the example, we use the ARM architecture.
|
||||
</para></listitem>
|
||||
<listitem><para>The script then prompts you for the kernel.
|
||||
The default 3.8 kernel is acceptable.
|
||||
The default 3.10 kernel 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.2, 3.2_preempt-rt, and so forth.).</para></listitem>
|
||||
|
||||
@@ -3064,7 +3064,7 @@
|
||||
</para></listitem>
|
||||
<listitem><para>Handling optional module packaging
|
||||
</para></listitem>
|
||||
<listitem><para>Setting up Runtime Package Management
|
||||
<listitem><para>Using Runtime Package Management
|
||||
</para></listitem>
|
||||
<listitem><para>Setting up and running package test
|
||||
(ptest)
|
||||
@@ -3605,56 +3605,226 @@
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section id='setting-up-runtime-package-management'>
|
||||
<title>Setting Up Runtime Package Management</title>
|
||||
<section id='using-runtime-package-management'>
|
||||
<title>Using Runtime Package Management</title>
|
||||
|
||||
<para>
|
||||
For RPM, IPK, and DEB package formats, it is possible to set
|
||||
up a repository that is a host-based
|
||||
package feed from which you can install packages on the
|
||||
target system during runtime.
|
||||
Doing so is optional and depends on the following:
|
||||
During a build, BitBake always transforms a recipe into one or
|
||||
more packages.
|
||||
For example, BitBake takes the <filename>bash</filename> recipe
|
||||
and currently produces the <filename>bash-dbg</filename>,
|
||||
<filename>bash-staticdev</filename>,
|
||||
<filename>bash-dev</filename>, <filename>bash-doc</filename>,
|
||||
<filename>bash-locale</filename>, and
|
||||
<filename>bash</filename> packages.
|
||||
Not all generated packages are included in an image.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
In several situations, you might need to update, add, remove,
|
||||
or query the packages on a target device at runtime
|
||||
(i.e. without having to generate a new image).
|
||||
Examples of such situations include:
|
||||
<itemizedlist>
|
||||
<listitem><para>
|
||||
You take specific steps to set up the feed.
|
||||
You want to provide in-the-field updates to deployed
|
||||
devices (e.g. security updates).
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
When you build your image, you select to use the
|
||||
appropriate package manager by setting the
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#var-PACKAGE_CLASSES'><filename>PACKAGE_CLASSES</filename></ulink>
|
||||
variable.
|
||||
You want to have a fast turn-around development cycle
|
||||
for one or more applications that run on your device.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
You have a web server, such as Apache 2,
|
||||
installed and configured on the development host.
|
||||
You want to temporarily install the "debug" packages
|
||||
of various applications on your device so that
|
||||
debugging can be greatly improved by allowing
|
||||
access to symbols and source debugging.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
You have <filename>createrepo</filename> installed on
|
||||
the development host.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
You enable package management on the target by
|
||||
listing "package-management" in the
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#var-IMAGE_FEATURES'><filename>IMAGE_FEATURES</filename></ulink>
|
||||
variable.
|
||||
You want to deploy a more minimal package selection of
|
||||
your device but allow in-the-field updates to add a
|
||||
larger selection for customization.
|
||||
</para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Following are the steps to set up the optional repository.
|
||||
This example assumes you are using RPM and the Apache 2
|
||||
server:
|
||||
<orderedlist>
|
||||
<listitem><para>
|
||||
Add the directory to your Apache configuration, which
|
||||
you can find at
|
||||
<filename>/etc/httpd/conf/httpd.conf</filename>.
|
||||
Use commands similar to these on the development system.
|
||||
These example commands assume a top-level
|
||||
<link linkend='source-directory'>Source Directory</link>
|
||||
named <filename>poky</filename> in your home directory:
|
||||
<literallayout class='monospaced'>
|
||||
In all these situations, you have something similar to a more
|
||||
traditional Linux distribution in that in-field devices
|
||||
are able to receive pre-compiled packages from a server for
|
||||
installation or update.
|
||||
Being able to install these packages on a running,
|
||||
in-field device is what is termed "runtime package
|
||||
management".
|
||||
</para>
|
||||
|
||||
<para>
|
||||
In order to use runtime package management, you
|
||||
need a host/server machine that serves up the pre-compiled
|
||||
packages plus the required metadata.
|
||||
You also need package manipulation tools on the target.
|
||||
The build machine is a likely candidate to act as the server.
|
||||
However, that machine does not necessarily have to be the
|
||||
package server.
|
||||
The build machine could push its artifacts to another machine
|
||||
that acts as the server (e.g. Internet-facing).
|
||||
</para>
|
||||
|
||||
<para>
|
||||
A simple build that targets just one device produces
|
||||
more than one package database.
|
||||
In other words, the packages produced by a build are separated
|
||||
out into a couple of different package groupings based on
|
||||
criteria such as the target's CPU architecture, the target
|
||||
board, or the C library used on the target.
|
||||
For example, a build targeting the <filename>qemuarm</filename>
|
||||
device produces the following three package databases:
|
||||
<filename>all</filename>, <filename>armv5te</filename>, and
|
||||
<filename>qemuarm</filename>.
|
||||
If you wanted your <filename>qemuarm</filename> device to be
|
||||
aware of all the packages that were available to it,
|
||||
you would need to point it to each of these databases
|
||||
individually.
|
||||
In a similar way, a traditional Linux distribution usually is
|
||||
configured to be aware of a number of software repositories
|
||||
from which it retrieves packages.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Using runtime package management is completely optional and
|
||||
not required for a successful build or deployment in any
|
||||
way.
|
||||
But if you want to make use of runtime package management,
|
||||
you need to do a couple things above and beyond the basics.
|
||||
The remainder of this section describes what you need to do.
|
||||
</para>
|
||||
|
||||
<section id='runtime-package-management-build'>
|
||||
<title>Build Considerations</title>
|
||||
|
||||
<para>
|
||||
This section describes build considerations that you need
|
||||
to be aware of in order to provide support for runtime
|
||||
package management.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
When BitBake generates packages it needs to know
|
||||
what format(s) to use.
|
||||
In your configuration, you use the
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#var-PACKAGE_CLASSES'><filename>PACKAGE_CLASSES</filename></ulink>
|
||||
variable to specify the format.
|
||||
<note>
|
||||
You can choose to have more than one format but you must
|
||||
provide at least one.
|
||||
</note>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
If you would like your image to start off with a basic
|
||||
package database of the packages in your current build
|
||||
as well as have the relevant tools available on the
|
||||
target for runtime package management, you can include
|
||||
"package-management" in the
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#var-IMAGE_FEATURES'><filename>IMAGE_FEATURES</filename></ulink>
|
||||
variable.
|
||||
Including "package-management" in this
|
||||
configuration variable ensures that when the image
|
||||
is assembled for your target, the image includes
|
||||
the currently-known package databases as well as
|
||||
the target-specific tools required for runtime
|
||||
package management to be performed on the target.
|
||||
However, this is not strictly necessary.
|
||||
You could start your image off without any databases
|
||||
but only include the required on-target package
|
||||
tool(s).
|
||||
As an example, you could include "opkg" in your
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#var-IMAGE_INSTALL'><filename>IMAGE_INSTALL</filename></ulink>
|
||||
variable if you are using the IPK package format.
|
||||
You can then initialize your target's package database(s)
|
||||
later once your image is up and running.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Whenever you perform any sort of build step that can
|
||||
potentially generate a package or modify an existing
|
||||
package, it is always a good idea to re-generate the
|
||||
package index with:
|
||||
<literallayout class='monospaced'>
|
||||
$ bitbake package-index
|
||||
</literallayout>
|
||||
Realize that it is not sufficient to simply do the
|
||||
following:
|
||||
<literallayout class='monospaced'>
|
||||
$ bitbake <some-package> package-index
|
||||
</literallayout>
|
||||
This is because BitBake does not properly schedule the
|
||||
<filename>package-index</filename> target fully after any
|
||||
other target has completed.
|
||||
Thus, be sure to run the package update step separately.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
As described below in the
|
||||
"<link linkend='runtime-package-management-target-ipk'>Using IPK</link>"
|
||||
section, if you are using IPK as your package format, you
|
||||
can make use of the
|
||||
<filename>distro-feed-configs</filename> recipe provided
|
||||
by <filename>meta-oe</filename> in order to configure your
|
||||
target to use your IPK databases.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
When your build is complete, your packages reside in the
|
||||
<filename>${TMPDIR}/deploy/<package-format></filename>
|
||||
directory.
|
||||
For example, if <filename>${TMPDIR}</filename>
|
||||
is <filename>tmp</filename> and your selected package type
|
||||
is IPK, then your IPK packages are available in
|
||||
<filename>tmp/deploy/ipk</filename>.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='runtime-package-management-server'>
|
||||
<title>Host or Server Machine Setup</title>
|
||||
|
||||
<para>
|
||||
Typically, packages are served from a server using
|
||||
HTTP.
|
||||
However, other protocols are possible.
|
||||
If you want to use HTTP, then setup and configure a
|
||||
web server, such as Apache 2 or lighttpd, on the machine
|
||||
serving the packages.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
As previously mentioned, the build machine can act as the
|
||||
package server.
|
||||
In the following sections that describe server machine
|
||||
setups, the build machine is assumed to also be the server.
|
||||
</para>
|
||||
|
||||
<section id='package-server-apache'>
|
||||
<title>Serving Packages via Apache 2</title>
|
||||
|
||||
<para>
|
||||
This example assumes you are using the Apache 2
|
||||
server:
|
||||
<orderedlist>
|
||||
<listitem><para>
|
||||
Add the directory to your Apache
|
||||
configuration, which you can find at
|
||||
<filename>/etc/httpd/conf/httpd.conf</filename>.
|
||||
Use commands similar to these on the
|
||||
development system.
|
||||
These example commands assume a top-level
|
||||
<link linkend='source-directory'>Source Directory</link>
|
||||
named <filename>poky</filename> in your home
|
||||
directory.
|
||||
The example also assumes an RPM package type.
|
||||
If you are using a different package type, such
|
||||
as IPK, use "ipk" in the pathnames:
|
||||
<literallayout class='monospaced'>
|
||||
<VirtualHost *:80>
|
||||
....
|
||||
Alias /rpm ~/poky/build/tmp/deploy/rpm
|
||||
@@ -3662,93 +3832,199 @@
|
||||
Options +Indexes
|
||||
</Directory>
|
||||
</VirtualHost>
|
||||
</literallayout>
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
Reload the Apache configuration as follows.
|
||||
For all commands, be sure you have root privileges.
|
||||
</para>
|
||||
<para>
|
||||
If your development system is using Fedora or
|
||||
CentOS, use the following:
|
||||
</literallayout></para></listitem>
|
||||
<listitem><para>
|
||||
Reload the Apache configuration as described
|
||||
in this step.
|
||||
For all commands, be sure you have root
|
||||
privileges.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
If your development system is using Fedora or
|
||||
CentOS, use the following:
|
||||
<literallayout class='monospaced'>
|
||||
# service httpd reload
|
||||
</literallayout>
|
||||
For Ubuntu and Debian, use the following:
|
||||
<literallayout class='monospaced'>
|
||||
# /etc/init.d/apache2 reload
|
||||
</literallayout>
|
||||
For OpenSUSE, use the following:
|
||||
<literallayout class='monospaced'>
|
||||
# /etc/init.d/apache2 reload
|
||||
</literallayout></para></listitem>
|
||||
<listitem><para>
|
||||
If you are using Security-Enhanced Linux
|
||||
(SELinux), you need to label the files as
|
||||
being accessible through Apache.
|
||||
Use the following command from the development
|
||||
host.
|
||||
This example assumes RPM package types:
|
||||
<literallayout class='monospaced'>
|
||||
# chcon -R -h -t httpd_sys_content_t tmp/deploy/rpm
|
||||
</literallayout></para></listitem>
|
||||
</orderedlist>
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='package-server-lighttpd'>
|
||||
<title>Serving Packages via lighttpd</title>
|
||||
|
||||
<para>
|
||||
If you are using lighttpd, all you need
|
||||
to do is to provide a link from your
|
||||
<filename>${TMPDIR}/deploy/<package-format></filename>
|
||||
directory to lighttpd's document-root.
|
||||
You can determine the specifics of your lighttpd
|
||||
installation by looking through its configuration file,
|
||||
which is usually found at:
|
||||
<filename>/etc/lighttpd/lighttpd.conf</filename>.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
For example, if you are using IPK, lighttpd's
|
||||
document-root is set to
|
||||
<filename>/var/www/lighttpd</filename>, and you had
|
||||
packages for a target named "BOARD",
|
||||
then you might create a link from your build location
|
||||
to lighttpd's document-root as follows:
|
||||
<literallayout class='monospaced'>
|
||||
service httpd reload
|
||||
# ln -s $(PWD)/tmp/deploy/ipk /var/www/lighttpd/BOARD-dir
|
||||
</literallayout>
|
||||
For Ubuntu and Debian, use the following:
|
||||
</para>
|
||||
|
||||
<para>
|
||||
At this point, you need to start the lighttpd server.
|
||||
The method used to start the server varies by
|
||||
distribution.
|
||||
However, one basic method that starts it by hand is:
|
||||
<literallayout class='monospaced'>
|
||||
/etc/init.d/apache2 reload
|
||||
# lighttpd -f /etc/lighttpd/lighttpd.conf
|
||||
</literallayout>
|
||||
For OpenSUSE, use the following:
|
||||
</para>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section id='runtime-package-management-target'>
|
||||
<title>Target Setup</title>
|
||||
|
||||
<para>
|
||||
Setting up the target differs depending on the
|
||||
package management system.
|
||||
This section provides information for RPM and IPK.
|
||||
</para>
|
||||
|
||||
<section id='runtime-package-management-target-rpm'>
|
||||
<title>Using RPM</title>
|
||||
|
||||
<para>
|
||||
The application for performing runtime package
|
||||
management of RPM packages on the target is called
|
||||
<filename>smart</filename>.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
On the target machine, you need to inform
|
||||
<filename>smart</filename> of every package database
|
||||
you want to use.
|
||||
As an example, suppose your target device can use the
|
||||
following three package databases from a server named
|
||||
<filename>server.name</filename>:
|
||||
<filename>all</filename>, <filename>i586</filename>,
|
||||
and <filename>qemux86</filename>.
|
||||
Given this example, issue the following commands on the
|
||||
target:
|
||||
<literallayout class='monospaced'>
|
||||
/etc/init.d/apache2 reload
|
||||
# smart channel --add all type=rpm-md baseurl=http://server.name/rpm/all
|
||||
# smart channel --add i585 type=rpm-md baseurl=http://server.name/rpm/i586
|
||||
# smart channel --add qemux86 type=rpm-md baseurl=http://server.name/rpm/qemux86
|
||||
</literallayout>
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
Change your working directory to
|
||||
<filename>tmp/deploy/rpm</filename> in the
|
||||
<link linkend='build-directory'>Build Directory</link>.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
Create the repository data on the host using
|
||||
this command:
|
||||
<literallayout class='monospaced'>
|
||||
createrepo .
|
||||
</literallayout>
|
||||
</para>
|
||||
<para>
|
||||
<note>
|
||||
If you're updating, add
|
||||
<filename>‐‐update</filename> to save some time.
|
||||
</note>
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
If you are using Security-Enhanced Linux (SELinux),
|
||||
you need to label the files as being accessible
|
||||
through Apache.
|
||||
Use the following command from the development host:
|
||||
<literallayout class='monospaced'>
|
||||
chcon -R -h -t httpd_sys_content_t .
|
||||
</literallayout>
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
On the target machine, add the repository to Smart.
|
||||
For <filename>somealias</filename>, provide a local
|
||||
alias for the repository:
|
||||
<literallayout class='monospaced'>
|
||||
smart channel ‐‐add <somealias> type=rpm-md baseurl=http://server.name/rpm
|
||||
</literallayout>
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
Also from the target machine, fetch the repository
|
||||
information using this command:
|
||||
<literallayout class='monospaced'>
|
||||
smart update
|
||||
# smart update
|
||||
</literallayout>
|
||||
</para></listitem>
|
||||
</orderedlist>
|
||||
</para>
|
||||
You can now use the <filename>smart query</filename>
|
||||
and <filename>smart install</filename> commands to
|
||||
find and install packages from the repositories.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<para>
|
||||
After taking these steps and making sure that the other
|
||||
requirements mentioned at the beginning of the section are met,
|
||||
reboot the target device to take advantage of runtime package
|
||||
installations.
|
||||
</para>
|
||||
<section id='runtime-package-management-target-ipk'>
|
||||
<title>Using IPK</title>
|
||||
|
||||
<para>
|
||||
If your packages are IPK, you can install packages onto an
|
||||
existing running system by first sharing the
|
||||
<filename>tmp/deploy/ipk/</filename> directory
|
||||
through a web server and then by changing
|
||||
<filename>/etc/opkg/base-feeds.conf</filename>
|
||||
to point at the shared server.
|
||||
Following is an example:
|
||||
<literallayout class='monospaced'>
|
||||
$ src/gz all http://www.mysite.com/somedir/deploy/ipk/all
|
||||
$ src/gz armv7a http://www.mysite.com/somedir/deploy/ipk/armv7a
|
||||
$ src/gz beagleboard http://www.mysite.com/somedir/deploy/ipk/beagleboard
|
||||
</literallayout>
|
||||
</para>
|
||||
<para>
|
||||
The application for performing runtime package
|
||||
management of IPK packages on the target is called
|
||||
<filename>opkg</filename>.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
In order to inform <filename>opkg</filename> of the
|
||||
package databases you want to use, simply create one
|
||||
or more <filename>*.conf</filename> files in the
|
||||
<filename>/etc/opkg</filename> directory on the target.
|
||||
The <filename>opkg</filename> application uses them
|
||||
to find its available package databases.
|
||||
As an example, suppose you configured your HTTP server
|
||||
on your machine named
|
||||
<filename>www.mysite.com</filename> to serve files
|
||||
from a <filename>BOARD-dir</filename> directory under
|
||||
its document-root.
|
||||
In this case, you might create a configuration
|
||||
file on the target called
|
||||
<filename>/etc/opkg/base-feeds.conf</filename> that
|
||||
contains:
|
||||
<literallayout class='monospaced'>
|
||||
src/gz all http://www.mysite.com/BOARD-dir/all
|
||||
src/gz armv7a http://www.mysite.com/BOARD-dir/armv7a
|
||||
src/gz beagleboard http://www.mysite.com/BOARD-dir/beagleboard
|
||||
</literallayout>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
As a way of making it easier to generate and make
|
||||
these IPK configuration files available on your
|
||||
target, the <filename>meta-oe</filename> layer
|
||||
provides a recipe called
|
||||
<filename>distro-feed-configs</filename>, which
|
||||
provides a package by the same name.
|
||||
When you include this package into your image, it will
|
||||
automatically generate and include a set of
|
||||
<filename>*.conf</filename> files in the image's
|
||||
<filename>/etc/opkg</filename> directory that will
|
||||
provide your target's <filename>opkg</filename>
|
||||
tool with any and all package databases your build will
|
||||
generate.
|
||||
The only catch is that this recipe cannot possibly
|
||||
imagine your server's DNS name/IP address.
|
||||
Consequently, somewhere in your configuration you need
|
||||
to set a variable called
|
||||
<filename>DISTRO_FEED_URI</filename> to point
|
||||
to your server and the location within the
|
||||
document-root that contains the databases.
|
||||
For example: if you are serving your packages over HTTP,
|
||||
your server's IP address is 192.168.7.1, and your
|
||||
databases are located in a directory called
|
||||
<filename>BOARD-dir</filename> underneath your HTTP
|
||||
server's document-root, you need to set
|
||||
<filename>DISTRO_FEED_URI</filename> to
|
||||
<filename>http://192.168.7.1/BOARD-dir</filename>.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
On the target machine, fetch (or refresh) the
|
||||
repository information using this command:
|
||||
<literallayout class='monospaced'>
|
||||
# opkg update
|
||||
</literallayout>
|
||||
You can now use the <filename>opkg list</filename> and
|
||||
<filename>opkg install</filename> commands to find and
|
||||
install packages from the repositories.
|
||||
</para>
|
||||
</section>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section id='testing-packages-with-ptest'>
|
||||
@@ -4252,24 +4528,22 @@
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section id="running-and-writing-tests-for-a-qemu-image">
|
||||
<title>Running and Writing Tests for a QEMU Image</title>
|
||||
<section id="performing-automated-runtime-testing">
|
||||
<title>Performing Automated Runtime Testing</title>
|
||||
|
||||
<para>
|
||||
The OpenEmbedded build system makes available a series of automated
|
||||
tests for QEMU images.
|
||||
These tests are commands that run on the target system over
|
||||
<filename>ssh</filename> and are written in Python, thus making
|
||||
use of the <filename>unittest</filename> module.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
tests for images to verify runtime functionality.
|
||||
<note>
|
||||
Currently, there is only support for running these tests
|
||||
under QEMU.
|
||||
</note>
|
||||
These tests are written in Python making use of the
|
||||
<filename>unittest</filename> module, and the majority of them
|
||||
run commands on the target system over
|
||||
<filename>ssh</filename>.
|
||||
This section describes how you set up the environment to use these
|
||||
tests, run available tests, and write and add your own tests.
|
||||
You can the same information in a different form and with example
|
||||
log files of test runs on the
|
||||
<ulink url='https://wiki.yoctoproject.org/wiki/Image_tests'>Image Tests</ulink>
|
||||
Wiki page.
|
||||
</para>
|
||||
|
||||
<section id="qemu-image-enabling-tests">
|
||||
@@ -4278,9 +4552,8 @@
|
||||
<para>
|
||||
In order to run tests, you need to do the following:
|
||||
<itemizedlist>
|
||||
<listitem><para><emphasis>Ensure you run the test
|
||||
automatically with no interaction and under
|
||||
<filename>sudo</filename>:</emphasis>
|
||||
<listitem><para><emphasis>Set up to avoid interaction
|
||||
with <filename>sudo</filename> for networking:</emphasis>
|
||||
To accomplish this, you must do one of the
|
||||
following:
|
||||
<itemizedlist>
|
||||
@@ -4300,12 +4573,13 @@
|
||||
<listitem><para>Manually configure a tap interface
|
||||
for your system.</para></listitem>
|
||||
<listitem><para>Run as root the script in
|
||||
<filename>scripts/runqemu-gen-tapdev</filename>,
|
||||
<filename>scripts/runqemu-gen-tapdevs</filename>,
|
||||
which should generate a list of tap devices.
|
||||
List generation is usually done in environments
|
||||
similar to AutoBuilder.</para></listitem>
|
||||
This is the option typically chosen for
|
||||
Autobuilder-type environments.
|
||||
</para></listitem>
|
||||
</itemizedlist></para></listitem>
|
||||
<listitem><para><emphasis>Set up the
|
||||
<listitem><para><emphasis>Set the
|
||||
<filename>DISPLAY</filename> variable:</emphasis>
|
||||
You need to set this variable so that you have an X
|
||||
server available (e.g. start
|
||||
@@ -4321,30 +4595,14 @@
|
||||
<filename>${DEPLOY_DIR}/rpm</filename> so it can run
|
||||
smart channel commands. That means your host's firewall
|
||||
must accept incoming connections from 192.168.7.0/24,
|
||||
which is the default class used for
|
||||
<filename>tap0</filename> devices by
|
||||
<filename>runqemu</filename>.</para></listitem>
|
||||
<listitem><para><emphasis>Have your QEMU image built:</emphasis>
|
||||
The QEMU image on which you want to run tests needs to
|
||||
be built.
|
||||
For example, the following command would build the
|
||||
<filename>core-image-sato</filename> image when
|
||||
<filename>MACHINE</filename> is set to "qemu".
|
||||
<literallayout class='monospaced'>
|
||||
bitbake core-image-sato
|
||||
</literallayout></para></listitem>
|
||||
<listitem><para><emphasis>Globally inherit
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#ref-classes-testimage'><filename>testimage.class</filename>:</ulink></emphasis>
|
||||
Edit your <filename>local.conf</filename> file as
|
||||
follows:
|
||||
<literallayout class='monospaced'>
|
||||
INHERIT += "testimage"
|
||||
</literallayout></para></listitem>
|
||||
which is the default IP range used for tap devices
|
||||
by <filename>runqemu</filename>.</para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
|
||||
<note>
|
||||
If you built your QEMU image using <filename>rm_work</filename>,
|
||||
Regardless of how you initiate the tests, if you built your
|
||||
image using <filename>rm_work</filename>,
|
||||
most of the tests will fail with errors because they rely on
|
||||
<filename>${WORKDIR}/installed_pkgs.txt</filename>.
|
||||
</note>
|
||||
@@ -4354,15 +4612,42 @@
|
||||
<title>Running Tests</title>
|
||||
|
||||
<para>
|
||||
After setting up to run the tests, use BitBake to start
|
||||
the standard suite of tests:
|
||||
<literallayout class='monospaced'>
|
||||
bitbake core-image-sato -c testimage
|
||||
</literallayout>
|
||||
You can start the tests automatically or manually:
|
||||
<itemizedlist>
|
||||
<listitem><para><emphasis>Automatically Running Tests:</emphasis>
|
||||
To run the tests automatically after the
|
||||
OpenEmbedded build system successfully creates an image,
|
||||
first set the
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#var-TEST_IMAGE'><filename>TEST_IMAGE</filename></ulink>
|
||||
variable to "1" in your <filename>local.conf</filename>
|
||||
file in the
|
||||
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>Build Directory</ulink>:
|
||||
<literallayout class='monospaced'>
|
||||
TEST_IMAGE = "1"
|
||||
</literallayout>
|
||||
Next, simply build your image.
|
||||
If the image successfully builds, the tests will be
|
||||
run:
|
||||
<literallayout class='monospaced'>
|
||||
bitbake core-image-sato
|
||||
</literallayout></para></listitem>
|
||||
<listitem><para><emphasis>Manually Running Tests:</emphasis>
|
||||
To manually run the tests, first globally inherit
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#ref-classes-testimage'><filename>testimage.class</filename></ulink>
|
||||
by editing your <filename>local.conf</filename> file:
|
||||
<literallayout class='monospaced'>
|
||||
INHERIT += "testimage"
|
||||
</literallayout>
|
||||
Next, use BitBake to run the tests:
|
||||
<literallayout class='monospaced'>
|
||||
bitbake -c testimage <image>
|
||||
</literallayout></para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Once you start the tests, the following happens:
|
||||
Regardless of how you run the tests, once they start, the
|
||||
following happens:
|
||||
<itemizedlist>
|
||||
<listitem><para>A copy of the root filesystem is written
|
||||
to <filename>${WORKDIR}/testimage</filename>.
|
||||
@@ -4400,11 +4685,10 @@
|
||||
All test files reside in
|
||||
<filename>meta/lib/oeqa/runtime</filename> in the
|
||||
<link linkend='source-directory'>Source Directory</link>.
|
||||
Tests (also referred to as modules) have a one-to-one
|
||||
relationship with the filenames in <filename>runtime</filename>.
|
||||
Modules can have multiple classes and test methods and are
|
||||
usually grouped together by the area tested (e.g tests for
|
||||
<filename>systemd</filename> reside in
|
||||
A test name maps directly to a Python module.
|
||||
Each test module may contain a number of individual tests.
|
||||
Tests are usually grouped together by the area
|
||||
tested (e.g tests for <filename>systemd</filename> reside in
|
||||
<filename>meta/lib/oeqa/runtime/systemd.py</filename>).
|
||||
</para>
|
||||
|
||||
@@ -4412,12 +4696,13 @@
|
||||
You can add tests to any layer provided you place them in the
|
||||
proper area and you extend
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#var-BBPATH'><filename>BBPATH</filename></ulink>
|
||||
in the <filename>local.conf</filename> file.
|
||||
in the <filename>local.conf</filename> file as normal.
|
||||
Be sure that tests reside in
|
||||
<filename><layer>/lib/oeqa/runtime</filename>.
|
||||
<note>
|
||||
Be sure that module names do not collide with module names
|
||||
provided by the Yocto Project.
|
||||
used in the default set of test modules in
|
||||
<filename>meta/lib/oeqa/runtime</filename>.
|
||||
</note>
|
||||
</para>
|
||||
|
||||
@@ -4427,12 +4712,13 @@
|
||||
variable in <filename>local.conf</filename>.
|
||||
Each name in <filename>TEST_SUITES</filename> represents a
|
||||
required test for the image.
|
||||
Module skipping is not allowed even if a test is not suitable
|
||||
for an image (e.g. running the <filename>rpm</filename> tests on
|
||||
an image without <filename>rpm</filename>).
|
||||
Test modules named within <filename>TEST_SUITES</filename>
|
||||
cannot be skipped even if a test is not suitable for an image
|
||||
(e.g. running the rpm tests on an image without
|
||||
<filename>rpm</filename>).
|
||||
Appending "auto" to <filename>TEST_SUITES</filename> causes the
|
||||
build system to try to run all tests that are suitable for the
|
||||
image (i.e. the build system decides whether to run each test).
|
||||
image (i.e. each test module may elect to skip itself).
|
||||
</para>
|
||||
|
||||
<para>
|
||||
@@ -4453,17 +4739,12 @@
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The following list summarizes how to run the tests:
|
||||
Here are some things to keep in mind when running tests:
|
||||
<itemizedlist>
|
||||
<listitem><para>Run the default set of tests simply by
|
||||
running the following:
|
||||
<literallayout class='monospaced'>
|
||||
bitbake <qemu_image> -c testimage
|
||||
</literallayout></para></listitem>
|
||||
<listitem><para>The default tests for the image are defined
|
||||
as:
|
||||
<literallayout class='monospaced'>
|
||||
DEFAULT_TEST_SUITES_pn-<qemu_image> = "ping ssh df connman syslog xorg scp vnc date rpm smart dmesg"
|
||||
DEFAULT_TEST_SUITES_pn-<image> = "ping ssh df connman syslog xorg scp vnc date rpm smart dmesg"
|
||||
</literallayout></para></listitem>
|
||||
<listitem><para>Add your own test to the list of the
|
||||
by using the following:
|
||||
@@ -4487,15 +4768,16 @@
|
||||
<para>
|
||||
As mentioned previously, all new test files need to be in the
|
||||
proper place for the build system to find them.
|
||||
New tests can go in the
|
||||
<link linkend='source-directory'>Source Directory</link> at
|
||||
<filename>meta/lib/oeqa/runtime</filename>.
|
||||
Alternatively, a layer can add its own tests in
|
||||
<filename><layer>/lib/oeqa/runtime</filename> as long
|
||||
as you extend <filename>BBPATH</filename>.
|
||||
Just remember that filenames need to map directory to test
|
||||
(module) names and you not use module names that collide with
|
||||
existing core tests.
|
||||
New tests for additional functionality outside of the core
|
||||
should be added to the layer that adds the functionality, in
|
||||
<filename><layer>/lib/oeqa/runtime</filename> (as
|
||||
long as
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#var-BBPATH'><filename>BBPATH</filename></ulink>
|
||||
is extended in the layer's
|
||||
<filename>layer.conf</filename> file as normal).
|
||||
Just remember that filenames need to map directly to test
|
||||
(module) names and that you do not use module names that
|
||||
collide with existing core tests.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
@@ -4950,8 +5232,11 @@
|
||||
</para>
|
||||
|
||||
<para>
|
||||
For more information on installing and running Toaster, see the
|
||||
"<ulink url='https://wiki.yoctoproject.org/wiki/Web_Hob#Installation_and_Running'>Installation and Running</ulink>"
|
||||
section of the "Toaster" wiki page.
|
||||
For complete information on the API and its search operation
|
||||
URI, parameters, and reposes, see the
|
||||
URI, parameters, and responses, see the
|
||||
<ulink url='https://wiki.yoctoproject.org/wiki/REST_API_Contracts'>REST API Contracts</ulink>
|
||||
Wiki page.
|
||||
</para>
|
||||
|
||||
@@ -24,17 +24,6 @@
|
||||
set up your host development system and build an image, which you
|
||||
find in the
|
||||
<ulink url='&YOCTO_DOCS_QS_URL;'>Yocto Project Quick Start</ulink>.
|
||||
<note>
|
||||
By default, using the Yocto Project creates a Poky distribution.
|
||||
However, you can create your own distribution by providing key
|
||||
<link linkend='metadata'>Metadata</link>.
|
||||
A good example is Angstrom, which has had a distribution
|
||||
based on the Yocto Project since its inception.
|
||||
Other examples include commercial distributions like
|
||||
Wind River Linux, Mentor Embedded Linux, and ENEA Linux.
|
||||
See the "<link linkend='creating-your-own-distribution'>Creating Your Own Distribution</link>"
|
||||
section for more information.
|
||||
</note>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
@@ -43,13 +32,25 @@
|
||||
reconfigure the kernel, and develop an application using the
|
||||
popular <trademark class='trade'>Eclipse</trademark> IDE.
|
||||
</para>
|
||||
|
||||
<note>
|
||||
By default, using the Yocto Project creates a Poky distribution.
|
||||
However, you can create your own distribution by providing key
|
||||
<link linkend='metadata'>Metadata</link>.
|
||||
A good example is Angstrom, which has had a distribution
|
||||
based on the Yocto Project since its inception.
|
||||
Other examples include commercial distributions like
|
||||
Wind River Linux, Mentor Embedded Linux, and ENEA Linux.
|
||||
See the "<link linkend='creating-your-own-distribution'>Creating Your Own Distribution</link>"
|
||||
section for more information.
|
||||
</note>
|
||||
</section>
|
||||
|
||||
<section id='what-this-manual-provides'>
|
||||
<title>What This Manual Provides</title>
|
||||
|
||||
<para>
|
||||
The following list describes what you can get from this guide:
|
||||
The following list describes what you can get from this manual:
|
||||
<itemizedlist>
|
||||
<listitem><para>Information that lets you get set
|
||||
up to develop using the Yocto Project.</para></listitem>
|
||||
@@ -75,17 +76,17 @@
|
||||
<para>
|
||||
This manual will not give you the following:
|
||||
<itemizedlist>
|
||||
<listitem><para>Step-by-step instructions if those instructions exist in other Yocto
|
||||
Project documentation.
|
||||
<listitem><para><emphasis>Step-by-step instructions when those instructions exist in other Yocto
|
||||
Project documentation:</emphasis>
|
||||
For example, the Yocto Project Application Developer's Guide contains detailed
|
||||
instructions on how to run the
|
||||
<ulink url='&YOCTO_DOCS_ADT_URL;#installing-the-adt'>Installing the ADT and Toolchains</ulink>,
|
||||
<ulink url='&YOCTO_DOCS_ADT_URL;#installing-the-adt'>ADT Installer</ulink>,
|
||||
which is used to set up a cross-development environment.</para></listitem>
|
||||
<listitem><para>Reference material.
|
||||
<listitem><para><emphasis>Reference material:</emphasis>
|
||||
This type of material resides in an appropriate reference manual.
|
||||
For example, system variables are documented in the
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;'>Yocto Project Reference Manual</ulink>.</para></listitem>
|
||||
<listitem><para>Detailed public information that is not specific to the Yocto Project.
|
||||
<listitem><para><emphasis>Detailed public information that is not specific to the Yocto Project:</emphasis>
|
||||
For example, exhaustive information on how to use Git is covered better through the
|
||||
Internet than in this manual.</para></listitem>
|
||||
</itemizedlist>
|
||||
@@ -109,7 +110,8 @@
|
||||
with the Yocto Project and quickly begin building an image.</para></listitem>
|
||||
<listitem><para><emphasis>
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;'>Yocto Project Reference Manual</ulink>:</emphasis> This manual is a reference
|
||||
guide to the OpenEmbedded build system known as "Poky."
|
||||
guide to the OpenEmbedded build system, which is based on BitBake.
|
||||
The build system is sometimes referred to as "Poky".
|
||||
</para></listitem>
|
||||
<listitem><para><emphasis>
|
||||
<ulink url='&YOCTO_DOCS_ADT_URL;'>Yocto Project Application Developer's Guide</ulink>:</emphasis>
|
||||
|
||||
@@ -269,15 +269,15 @@
|
||||
Within this group, you will find several kernels supported by
|
||||
the Yocto Project:
|
||||
<itemizedlist>
|
||||
<listitem><para><emphasis><filename>linux-yocto-3.2</filename></emphasis> - The
|
||||
stable Yocto Project kernel to use with the Yocto Project Release 1.2. This kernel
|
||||
is based on the Linux 3.2 released kernel.</para></listitem>
|
||||
<listitem><para><emphasis><filename>linux-yocto-3.4</filename></emphasis> - The
|
||||
stable Yocto Project kernel to use with the Yocto Project Release 1.3. This kernel
|
||||
is based on the Linux 3.4 released kernel.</para></listitem>
|
||||
<listitem><para><emphasis><filename>linux-yocto-3.8</filename></emphasis> - The
|
||||
stable Yocto Project kernel to use with the Yocto Project Release 1.4. This kernel
|
||||
is based on the Linux 3.8 released kernel.</para></listitem>
|
||||
<listitem><para><emphasis><filename>linux-yocto-3.10</filename></emphasis> - The
|
||||
stable Yocto Project kernel to use with the Yocto Project Release 1.5. This kernel
|
||||
is based on the Linux 3.10 released kernel.</para></listitem>
|
||||
<listitem><para><emphasis><filename>linux-yocto-dev</filename></emphasis> - A development
|
||||
kernel based on the latest upstream release candidate available.</para></listitem>
|
||||
</itemizedlist>
|
||||
@@ -749,12 +749,8 @@
|
||||
<para>
|
||||
You can install the Eclipse Yocto Plug-in into the Eclipse
|
||||
IDE one of two ways: use the Yocto Project's Eclipse
|
||||
Update site to install the pre-built plug-in, or build and
|
||||
Update site to install the pre-built plug-in or build and
|
||||
install the plug-in from the latest source code.
|
||||
If you do not want to permanently install the plug-in but
|
||||
just want to try it out within the Eclipse environment,
|
||||
you can import the plug-in project from the Yocto Project's
|
||||
Source Repositories.
|
||||
</para>
|
||||
|
||||
<section id='new-software'>
|
||||
@@ -807,10 +803,29 @@
|
||||
To install the Eclipse Yocto Plug-in from the latest
|
||||
source code, follow these steps:
|
||||
<orderedlist>
|
||||
<listitem><para>Open a shell and create a Git
|
||||
<listitem><para>Be sure your development system
|
||||
is not using OpenJDK to build the plug-in
|
||||
by doing the following:
|
||||
<orderedlist>
|
||||
<listitem><para>Use the Oracle JDK.
|
||||
If you don't have that, go to
|
||||
<ulink url='http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html'></ulink>
|
||||
and download the appropriate tarball
|
||||
for your development system and
|
||||
extract it into your home directory.
|
||||
</para></listitem>
|
||||
<listitem><para>In the shell you are going
|
||||
to do your work, export the location of
|
||||
the Oracle Java as follows:
|
||||
<literallayout class='monospaced'>
|
||||
export PATH=~/jdk1.7.0_40/bin:$PATH
|
||||
</literallayout></para></listitem>
|
||||
</orderedlist></para></listitem>
|
||||
<listitem><para>In the same shell, create a Git
|
||||
repository with:
|
||||
<literallayout class='monospaced'>
|
||||
$ git clone git://git.yoctoproject.org/eclipse-poky-kepler yocto-eclipse
|
||||
$ cd ~
|
||||
$ git clone git://git.yoctoproject.org/eclipse-poky-kepler
|
||||
</literallayout>
|
||||
<note>
|
||||
If you are using Juno, the repository is
|
||||
@@ -818,19 +833,19 @@
|
||||
<filename>git://git.yoctoproject.org/eclipse-poky-juno</filename>.
|
||||
</note>
|
||||
For this example, the repository is named
|
||||
<filename>~/yocto-eclipse</filename>.
|
||||
<filename>~/eclipse-poky-kepler</filename>.
|
||||
</para></listitem>
|
||||
<listitem><para>Change to the directory where you
|
||||
set up the Git repository:
|
||||
<literallayout class='monospaced'>
|
||||
$ cd ~/yocto-eclipse
|
||||
$ cd ~/eclipse-poky-kepler
|
||||
</literallayout></para></listitem>
|
||||
<listitem><para>Be sure you are in the right branch
|
||||
for your Git repository.
|
||||
For this release set the branch to
|
||||
<filename>&DISTRO_NAME;</filename>:
|
||||
<literallayout class='monospaced'>
|
||||
$ git checkout -b &DISTRO_NAME; origin/&DISTRO_NAME;
|
||||
$ git checkout &DISTRO_NAME;
|
||||
</literallayout></para></listitem>
|
||||
<listitem><para>Change to the
|
||||
<filename>scripts</filename>
|
||||
@@ -857,7 +872,7 @@
|
||||
Here is an example that uses the
|
||||
<filename>&DISTRO_NAME;</filename> branch:
|
||||
<literallayout class='monospaced'>
|
||||
$ ECLIPSE_HOME=/home/scottrif/yocto-eclipse/scripts/eclipse ./build.sh &DISTRO_NAME; &DISTRO_NAME;
|
||||
$ ECLIPSE_HOME=/home/scottrif/eclipse-poky-kepler/scripts/eclipse ./build.sh &DISTRO_NAME; &DISTRO_NAME;
|
||||
</literallayout>
|
||||
After running the script, the file
|
||||
<filename>org.yocto.sdk-<release>-<date>-archive.zip</filename>
|
||||
@@ -879,7 +894,7 @@
|
||||
</para></listitem>
|
||||
<listitem><para>Click through the "Okay" buttons.
|
||||
</para></listitem>
|
||||
<listitem><para>Check the box next to the new entry
|
||||
<listitem><para>Check the boxes
|
||||
in the installation window and complete
|
||||
the installation.</para></listitem>
|
||||
<listitem><para>Restart the Eclipse IDE if
|
||||
@@ -893,61 +908,6 @@
|
||||
"<link linkend='configuring-the-eclipse-yocto-plug-in'>Configuring the Eclipse Yocto Plug-in</link>"
|
||||
section.</para>
|
||||
</section>
|
||||
|
||||
<section id='yocto-project-source'>
|
||||
<title>Importing the Plug-in Project into the Eclipse Environment</title>
|
||||
|
||||
<para>
|
||||
Importing the Eclipse Yocto Plug-in project from the
|
||||
Yocto Project source repositories is useful when you
|
||||
want to try out the latest plug-in from the tip of
|
||||
plug-in's development tree.
|
||||
It is important to understand when you import the
|
||||
plug-in you are not installing it into the Eclipse
|
||||
application.
|
||||
Rather, you are importing the project and just using it.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
To import the plug-in project, follow these steps:
|
||||
<orderedlist>
|
||||
<listitem><para>Open a shell and create a Git
|
||||
repository with:
|
||||
<literallayout class='monospaced'>
|
||||
$ git clone git://git.yoctoproject.org/eclipse-poky-kepler yocto-eclipse
|
||||
</literallayout>
|
||||
<note>
|
||||
The Juno repository is located at
|
||||
<filename>git://git.yoctoproject.org/eclipse-poky-juno</filename>
|
||||
</note>
|
||||
For this example, the repository is named
|
||||
<filename>~/yocto-eclipse</filename>.
|
||||
</para></listitem>
|
||||
<listitem><para>In Eclipse, select "Import" from
|
||||
the "File" menu.</para></listitem>
|
||||
<listitem><para>Expand the "General" box and select
|
||||
"existing projects into workspace" and then
|
||||
click "Next".</para></listitem>
|
||||
<listitem><para>Select the root directory and
|
||||
browse to
|
||||
<filename>~/yocto-eclipse/plugins</filename>.
|
||||
</para></listitem>
|
||||
<listitem><para>Three plug-ins exist:
|
||||
<filename>org.yocto.bc.ui</filename>,
|
||||
<filename>org.yocto.sdk.ide</filename>, and
|
||||
<filename>org.yocto.sdk.remotetools</filename>.
|
||||
Select and import all of them.</para></listitem>
|
||||
</orderedlist>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The left navigation pane in the Eclipse application
|
||||
shows the default projects.
|
||||
Right-click on one of these projects and run it as an
|
||||
Eclipse application to bring up a second instance of
|
||||
Eclipse IDE that has the Yocto Plug-in.
|
||||
</para>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section id='configuring-the-eclipse-yocto-plug-in'>
|
||||
@@ -1701,7 +1661,7 @@
|
||||
For example, here is the work directory for recipes and resulting packages that are
|
||||
not device-dependent:
|
||||
<literallayout class='monospaced'>
|
||||
${TMPDIR}/work/${PACKAGE_ARCH}-poky-${TARGET_OS}/${PN}-${PV}-${PR}
|
||||
${TMPDIR}/work/${PACKAGE_ARCH}-poky-${TARGET_OS}/${PN}/${EXTENDPE}${PV}-${PR}
|
||||
</literallayout>
|
||||
Let's look at an example without variables.
|
||||
Assuming a top-level <link linkend='source-directory'>Source Directory</link>
|
||||
@@ -1710,7 +1670,7 @@
|
||||
the following is the work directory for the <filename>acl</filename> recipe that
|
||||
creates the <filename>acl</filename> package:
|
||||
<literallayout class='monospaced'>
|
||||
~/poky/build/tmp/work/i586-poky-linux/acl-2.2.51-r3
|
||||
~/poky/build/tmp/work/i586-poky-linux/acl/2.2.51-r3/
|
||||
</literallayout>
|
||||
</para>
|
||||
|
||||
@@ -1718,7 +1678,7 @@
|
||||
If your resulting package is dependent on the target device,
|
||||
the work directory varies slightly:
|
||||
<literallayout class='monospaced'>
|
||||
${TMPDIR}/work/${MACHINE}-poky-${TARGET_OS}/${PN}-${PV}-${PR}
|
||||
${TMPDIR}/work/${MACHINE}-poky-${TARGET_OS}/${PN}/${EXTENDPE}${PV}-${PR}
|
||||
</literallayout>
|
||||
Again, assuming top-level Source Directory named <filename>poky</filename>
|
||||
and a default Build Directory of <filename>poky/build</filename>, the
|
||||
@@ -1726,8 +1686,8 @@
|
||||
for the <filename>acl</filename> package that is being
|
||||
built for a MIPS-based device:
|
||||
<literallayout class='monospaced'>
|
||||
~/poky/build/tmp/work/mips-poky-linux/acl-2.2.51-r2
|
||||
~/poky/build/tmp/work/mips-poky-linux/acl-2.2.51-r2/acl-2.2.51
|
||||
~/poky/build/tmp/work/mips-poky-linux/acl/2.2.51-r2
|
||||
~/poky/build/tmp/work/mips-poky-linux/acl/2.2.51-r2/acl-2.2.51
|
||||
</literallayout>
|
||||
</para>
|
||||
|
||||
@@ -1741,6 +1701,7 @@
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#var-TARGET_OS'><filename>TARGET_OS</filename></ulink>,
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#var-PN'><filename>PN</filename></ulink>,
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#var-PV'><filename>PV</filename></ulink>,
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#var-EXTENDPE'><filename>EXTENDPE</filename></ulink>,
|
||||
and
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#var-PR'><filename>PR</filename></ulink>
|
||||
variables in the Yocto Project Reference Manual.
|
||||
|
||||
@@ -254,9 +254,9 @@
|
||||
<listitem><para><ulink url='http://sitaramc.github.com/gitolite/master-toc.html'>The <filename>gitolite</filename> master index</ulink>:
|
||||
All topics for <filename>gitolite</filename>.
|
||||
</para></listitem>
|
||||
<listitem><para><ulink url='http://hjemli.net/git/cgit/tree/README'><filename>cgit</filename> index</ulink>:
|
||||
A <filename>README</filename> file on how to create a
|
||||
fast web interface for Git.</para></listitem>
|
||||
<listitem><para><ulink url='https://git.wiki.kernel.org/index.php/Interfaces,_frontends,_and_tools'>Interfaces, frontends, and tools</ulink>:
|
||||
Documentation on how to create interfaces and frontends
|
||||
for Git.</para></listitem>
|
||||
</itemizedlist>
|
||||
</note>
|
||||
</section>
|
||||
@@ -275,9 +275,8 @@
|
||||
</para>
|
||||
|
||||
<para>
|
||||
See "<ulink url='http://autobuilder.yoctoproject.org:8010/'>Welcome to the buildbot for the Yocto Project</ulink>"
|
||||
for the Yocto Project's reference implementation that uses
|
||||
buildbot.
|
||||
See "<ulink url='http://autobuilder.yoctoproject.org'>Yocto Project Autobuilder</ulink>"
|
||||
for more information and links to buildbot.
|
||||
The Yocto Project team has found this implementation
|
||||
works well in this role.
|
||||
A public example of this is the Yocto Project
|
||||
@@ -394,7 +393,7 @@
|
||||
For some guidance on mailing lists to use, see the list in the
|
||||
"<link linkend='how-to-submit-a-change'>How to Submit a Change</link>"
|
||||
section.
|
||||
For a description of the available mailing lists, see
|
||||
For a description of the available mailing lists, see the
|
||||
"<ulink url='&YOCTO_DOCS_REF_URL;#resources-mailinglist'>Mailing Lists</ulink>"
|
||||
section in the Yocto Project Reference Manual.
|
||||
</para></listitem>
|
||||
@@ -615,7 +614,7 @@
|
||||
"<ulink url='&YOCTO_DOCS_BSP_URL;#bsp-layers'>BSP Layers</ulink>"
|
||||
section in the Yocto Project Board Support Packages (BSP)
|
||||
Developer's Guide.</para></listitem>
|
||||
<listitem><para id='meta-toochain'><emphasis>Meta-Toolchain:</emphasis>
|
||||
<listitem><para id='meta-toolchain'><emphasis>Meta-Toolchain:</emphasis>
|
||||
A term sometimes used for
|
||||
<link linkend='cross-development-toolchain'>Cross-Development Toolchain</link>.
|
||||
</para></listitem>
|
||||
@@ -689,7 +688,7 @@
|
||||
For example, downloading and unpacking <filename>&YOCTO_POKY_TARBALL;</filename>
|
||||
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
|
||||
If you create a local copy of the Git repository, you can name the repository
|
||||
anything you like.
|
||||
Throughout much of the documentation, <filename>poky</filename> is used as the name of
|
||||
the top-level folder of the local copy of the poky Git repository.
|
||||
@@ -865,8 +864,8 @@
|
||||
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>
|
||||
<filename>denzil</filename>, <filename>danny</filename>,
|
||||
<filename>dylan</filename>, <filename>dora</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
|
||||
@@ -1233,6 +1232,10 @@
|
||||
occurred.</para></listitem>
|
||||
<listitem><para>Be sure to indicate the Severity of the bug.
|
||||
Severity communicates how the bug impacted your work.</para></listitem>
|
||||
<listitem><para>Select the appropriate "Documentation change" item
|
||||
for the bug.
|
||||
Fixing a bug may or may not affect the Yocto Project
|
||||
documentation.</para></listitem>
|
||||
<listitem><para>Provide a brief summary of the issue.
|
||||
Try to limit your summary to just a line or two and be sure to capture the
|
||||
essence of the issue.</para></listitem>
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
<para>
|
||||
You can use the OpenEmbedded build system, which uses
|
||||
BitBake to develop complete Linux
|
||||
BitBake, to develop complete Linux
|
||||
images and associated user-space applications for architectures based
|
||||
on ARM, MIPS, PowerPC, x86 and x86-64.
|
||||
<note>
|
||||
@@ -122,11 +122,11 @@
|
||||
<literallayout class='monospaced'>
|
||||
$ git clone git://git.yoctoproject.org/poky
|
||||
Cloning into 'poky'...
|
||||
remote: Counting objects: 183981, done.
|
||||
remote: Compressing objects: 100% (47428/47428), done.
|
||||
remote: Total 183981 (delta 132271), reused 183703 (delta 132044)
|
||||
Receiving objects: 100% (183981/183981), 89.71 MiB | 2.93 MiB/s, done.
|
||||
Resolving deltas: 100% (132271/132271), done.
|
||||
remote: Counting objects: 203728, done.
|
||||
remote: Compressing objects: 100% (52371/52371), done.
|
||||
remote: Total 203728 (delta 147444), reused 202891 (delta 146614)
|
||||
Receiving objects: 100% (203728/203728), 95.54 MiB | 308 KiB/s, done.
|
||||
Resolving deltas: 100% (147444/147444), done.
|
||||
</literallayout></para>
|
||||
<para>For another example of how to set up your own local Git repositories, see this
|
||||
<ulink url='&YOCTO_WIKI_URL;/wiki/Transcript:_from_git_checkout_to_meta-intel_BSP'>
|
||||
@@ -145,27 +145,28 @@
|
||||
For simplicity, it is recommended that you create these structures outside of the
|
||||
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.8</filename> kernel and then create a copy of
|
||||
of the <filename>linux-yocto-3.10</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.8.git</filename>, while the
|
||||
copy is named <filename>my-linux-yocto-3.8-work</filename>:
|
||||
<filename>linux-yocto-3.10.git</filename>, while the
|
||||
copy is named <filename>my-linux-yocto-3.10-work</filename>:
|
||||
<literallayout class='monospaced'>
|
||||
$ git clone --bare git://git.yoctoproject.org/linux-yocto-3.8 linux-yocto-3.8.git
|
||||
Cloning into bare repository 'linux-yocto-3.8.git'...
|
||||
remote: Counting objects: 2847090, done.
|
||||
remote: Compressing objects: 100% (454675/454675), done.
|
||||
remote: Total 2847090 (delta 2386170), reused 2825793 (delta 2364886)
|
||||
Receiving objects: 100% (2847090/2847090), 603.19 MiB | 3.54 MiB/s, done.
|
||||
Resolving deltas: 100% (2386170/2386170), done. </literallayout></para>
|
||||
$ git clone --bare git://git.yoctoproject.org/linux-yocto-3.10 linux-yocto-3.10.git
|
||||
Cloning into bare repository 'linux-yocto-3.10.git'...
|
||||
remote: Counting objects: 3364487, done.
|
||||
remote: Compressing objects: 100% (507178/507178), done.
|
||||
remote: Total 3364487 (delta 2827715), reused 3364481 (delta 2827709)
|
||||
Receiving objects: 100% (3364487/3364487), 722.95 MiB | 423 KiB/s, done.
|
||||
Resolving deltas: 100% (2827715/2827715), done.
|
||||
</literallayout></para>
|
||||
<para>Now create a clone of the bare clone just created:
|
||||
<literallayout class='monospaced'>
|
||||
$ git clone linux-yocto-3.8.git my-linux-yocto-3.8-work
|
||||
Cloning into 'my-linux-yocto-3.8-work'...
|
||||
$ git clone linux-yocto-3.10.git my-linux-yocto-3.10-work
|
||||
Cloning into 'my-linux-yocto-3.10-work'...
|
||||
done.
|
||||
</literallayout></para></listitem>
|
||||
<listitem id='meta-yocto-kernel-extras-repo'><para><emphasis>
|
||||
@@ -189,11 +190,12 @@
|
||||
$ cd ~/poky
|
||||
$ git clone git://git.yoctoproject.org/meta-yocto-kernel-extras meta-yocto-kernel-extras
|
||||
Cloning into 'meta-yocto-kernel-extras'...
|
||||
remote: Counting objects: 690, done.
|
||||
remote: Compressing objects: 100% (431/431), done.
|
||||
remote: Total 690 (delta 238), reused 690 (delta 238)
|
||||
Receiving objects: 100% (690/690), 532.60 KiB, done.
|
||||
Resolving deltas: 100% (238/238), done. </literallayout></para></listitem>
|
||||
remote: Counting objects: 727, done.
|
||||
remote: Compressing objects: 100% (452/452), done.
|
||||
remote: Total 727 (delta 260), reused 719 (delta 252)
|
||||
Receiving objects: 100% (727/727), 536.36 KiB | 102 KiB/s, done.
|
||||
Resolving deltas: 100% (260/260), done.
|
||||
</literallayout></para></listitem>
|
||||
<listitem><para id='supported-board-support-packages-(bsps)'><emphasis>Supported Board
|
||||
Support Packages (BSPs):</emphasis>
|
||||
The Yocto Project provides a layer called <filename>meta-intel</filename> and
|
||||
@@ -226,8 +228,8 @@
|
||||
BSP tarball from the same "Downloads" page of the
|
||||
<ulink url='&YOCTO_HOME_URL;'>Yocto Project Website</ulink>
|
||||
to get the Yocto Project release.
|
||||
Once on the "Download" page, look for "BSP" under the
|
||||
"Type" heading.</para>
|
||||
Once on the "Download" page, look to the right of the
|
||||
page and scroll down to find the BSP tarballs.</para>
|
||||
<para>Once you have the tarball, just extract it into a directory of your choice.
|
||||
Again, this method just produces a snapshot of the BSP layer in the form
|
||||
of a hierarchical directory structure.</para></listitem>
|
||||
@@ -246,16 +248,17 @@
|
||||
$ cd ~/poky
|
||||
$ git clone git://git.yoctoproject.org/meta-intel.git
|
||||
Cloning into 'meta-intel'...
|
||||
remote: Counting objects: 6264, done.
|
||||
remote: Compressing objects: 100% (2135/2135), done.
|
||||
remote: Total 6264 (delta 3321), reused 6235 (delta 3293)
|
||||
Receiving objects: 100% (6264/6264), 2.17 MiB | 2.63 MiB/s, done.
|
||||
Resolving deltas: 100% (3321/3321), done.
|
||||
remote: Counting objects: 7366, done.
|
||||
remote: Compressing objects: 100% (2491/2491), done.
|
||||
remote: Total 7366 (delta 3997), reused 7299 (delta 3930)
|
||||
Receiving objects: 100% (7366/7366), 2.31 MiB | 95 KiB/s, done.
|
||||
Resolving deltas: 100% (3997/3997), done.
|
||||
</literallayout></para>
|
||||
<para>The same
|
||||
<ulink url='&YOCTO_WIKI_URL;/wiki/Transcript:_from_git_checkout_to_meta-intel_BSP'>
|
||||
wiki page</ulink> referenced earlier covers how to
|
||||
set up the <filename>meta-intel</filename> Git repository.</para></listitem>
|
||||
<ulink url='&YOCTO_WIKI_URL;/wiki/Transcript:_from_git_checkout_to_meta-intel_BSP'>wiki page</ulink>
|
||||
referenced earlier covers how to
|
||||
set up the <filename>meta-intel</filename> Git repository.
|
||||
</para></listitem>
|
||||
</itemizedlist></para></listitem>
|
||||
<listitem><para><emphasis>Eclipse Yocto Plug-in:</emphasis> If you are developing
|
||||
applications using the Eclipse Integrated Development Environment (IDE),
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
</revision>
|
||||
<revision>
|
||||
<revnumber>1.5</revnumber>
|
||||
<date>Sometime in 2013</date>
|
||||
<date>October 2013</date>
|
||||
<revremark>Released with the Yocto Project 1.5 Release.</revremark>
|
||||
</revision>
|
||||
</revhistory>
|
||||
|
||||
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 210 KiB After Width: | Height: | Size: 189 KiB |
@@ -38,7 +38,7 @@
|
||||
</revision>
|
||||
<revision>
|
||||
<revnumber>1.5</revnumber>
|
||||
<date>Sometime in 2013</date>
|
||||
<date>October 2013</date>
|
||||
<revremark>Released with the Yocto Project 1.5 Release.</revremark>
|
||||
</revision>
|
||||
</revhistory>
|
||||
|
||||
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 189 KiB |
@@ -36,7 +36,7 @@
|
||||
<!ENTITY YOCTO_RELEASE_DL_URL "&YOCTO_DL_URL;/releases/yocto/yocto-&DISTRO;">
|
||||
<!ENTITY YOCTO_TOOLCHAIN_DL_URL "&YOCTO_RELEASE_DL_URL;/toolchain/">
|
||||
<!ENTITY YOCTO_ECLIPSE_DL_URL "&YOCTO_RELEASE_DL_URL;/eclipse-plugin/indigo;">
|
||||
<!ENTITY YOCTO_ADTINSTALLER_DL_URL "&YOCTO_RELEASE_DL_URL;/adt_installer">
|
||||
<!ENTITY YOCTO_ADTINSTALLER_DL_URL "&YOCTO_RELEASE_DL_URL;/adt-installer">
|
||||
<!ENTITY YOCTO_POKY_DL_URL "&YOCTO_RELEASE_DL_URL;/&YOCTO_POKY;.tar.bz2">
|
||||
<!ENTITY YOCTO_MACHINES_DL_URL "&YOCTO_RELEASE_DL_URL;/machines">
|
||||
<!ENTITY YOCTO_QEMU_DL_URL "&YOCTO_MACHINES_DL_URL;/qemu">
|
||||
@@ -57,8 +57,8 @@
|
||||
<!ENTITY UBUNTU_HOST_PACKAGES_ESSENTIAL "gawk wget git-core diffstat unzip texinfo \
|
||||
build-essential chrpath">
|
||||
<!ENTITY FEDORA_HOST_PACKAGES_ESSENTIAL "gawk make wget tar bzip2 gzip python unzip perl patch \
|
||||
diffutils diffstat git cpp gcc gcc-c++ eglibc-devel texinfo chrpath \
|
||||
ccache">
|
||||
diffutils diffstat git cpp gcc gcc-c++ glibc-devel texinfo chrpath \
|
||||
ccache perl-Data-Dumper perl-Text-ParseWords">
|
||||
<!ENTITY OPENSUSE_HOST_PACKAGES_ESSENTIAL "python gcc gcc-c++ git chrpath make wget python-xml \
|
||||
diffstat texinfo python-curses patch">
|
||||
<!ENTITY CENTOS_HOST_PACKAGES_ESSENTIAL "gawk make wget tar bzip2 gzip python unzip perl patch \
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
</revision>
|
||||
<revision>
|
||||
<revnumber>1.5</revnumber>
|
||||
<date>Sometime in 2013</date>
|
||||
<date>October 2013</date>
|
||||
<revremark>Released with the Yocto Project 1.5 Release.</revremark>
|
||||
</revision>
|
||||
</revhistory>
|
||||
|
||||
@@ -1078,7 +1078,8 @@
|
||||
variable points to the <filename>deploy</filename> directory,
|
||||
while the
|
||||
<link linkend='var-DEPLOY_DIR_IMAGE'><filename>DEPLOY_DIR_IMAGE</filename></link>
|
||||
variable points to the machine-specific directory.
|
||||
variable points to the appropriate directory containing images for
|
||||
the current configuration.
|
||||
<itemizedlist>
|
||||
<listitem><para><filename><kernel-image></filename>:
|
||||
A kernel binary file.
|
||||
|
||||
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 42 KiB |
@@ -133,17 +133,26 @@
|
||||
</para>
|
||||
</note>
|
||||
<itemizedlist>
|
||||
<listitem><para>Ubuntu 10.04</para></listitem>
|
||||
<listitem><para>Ubuntu 11.10</para></listitem>
|
||||
<!-- <listitem><para>Ubuntu 10.04</para></listitem>
|
||||
<listitem><para>Ubuntu 11.10</para></listitem> -->
|
||||
<listitem><para>Ubuntu 12.04 (LTS)</para></listitem>
|
||||
<listitem><para>Ubuntu 12.10</para></listitem>
|
||||
<listitem><para>Ubuntu 13.04</para></listitem>
|
||||
<listitem><para>Fedora release 17 (Beefy Miracle)</para></listitem>
|
||||
<!-- <listitem><para>Fedora 16 (Verne)</para></listitem>
|
||||
<listitem><para>Fedora 17 (Spherical)</para></listitem> -->
|
||||
<listitem><para>Fedora release 18 (Spherical Cow)</para></listitem>
|
||||
<listitem><para>CentOS release 6.3 (Final)</para></listitem>
|
||||
<listitem><para>CentOS release 6.4 (Final)</para></listitem>
|
||||
<listitem><para>Debian GNU/Linux 6.0 (Squeeze)</para></listitem>
|
||||
<listitem><para>Fedora release 19 (Schrödinger's Cat)</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>CentOS release 6.4</para></listitem>
|
||||
<!-- <listitem><para>Debian GNU/Linux 6.0 (Squeeze)</para></listitem> -->
|
||||
<listitem><para>Debian GNU/Linux 6.0.7 (Squeeze)</para></listitem>
|
||||
<listitem><para>Debian GNU/Linux 7.0 (Wheezy)</para></listitem>
|
||||
<listitem><para>Debian GNU/Linux 7.1 (Wheezy)</para></listitem>
|
||||
<!-- <listitem><para>openSUSE 11.4</para></listitem>
|
||||
<listitem><para>openSUSE 12.1</para></listitem> -->
|
||||
<listitem><para>openSUSE 12.2</para></listitem>
|
||||
<listitem><para>openSUSE 12.3</para></listitem>
|
||||
</itemizedlist>
|
||||
|
||||
@@ -580,6 +580,509 @@
|
||||
</para>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section id='moving-to-the-yocto-project-1.5-release'>
|
||||
<title>Moving to the Yocto Project 1.5 Release</title>
|
||||
|
||||
<para>
|
||||
This section provides migration information for moving to the
|
||||
Yocto Project 1.5 Release from the prior release.
|
||||
</para>
|
||||
|
||||
<section id='migration-1.5-host-dependency-changes'>
|
||||
<title>Host Dependency Changes</title>
|
||||
|
||||
<para>
|
||||
The OpenEmbedded build system now has some additional requirements
|
||||
on the host system:
|
||||
<itemizedlist>
|
||||
<listitem><para>Python 2.7.3+</para></listitem>
|
||||
<listitem><para>Tar 1.24+</para></listitem>
|
||||
<listitem><para>Git 1.7.5+</para></listitem>
|
||||
<listitem><para>Patched version of Make if you are using
|
||||
3.82.
|
||||
Most distributions that provide Make 3.82 use the patched
|
||||
version.</para></listitem>
|
||||
</itemizedlist>
|
||||
If the Linux distribution you are using on your build host
|
||||
does not provide packages for these, you can install and use
|
||||
the Buildtools tarball, which provides an SDK-like environment
|
||||
containing them.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
For more information on this requirement, see the
|
||||
"<link linkend='required-git-tar-and-python-versions'>Required Git, tar, and Python Versions</link>"
|
||||
section.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='migration-1.5-atom-pc-bsp'>
|
||||
<title><filename>atom-pc</filename> Board Support Package (BSP)</title>
|
||||
|
||||
<para>
|
||||
The <filename>atom-pc</filename> hardware reference BSP has been
|
||||
replaced by a <filename>genericx86</filename> BSP.
|
||||
This BSP is not necessarily guaranteed to work on all x86
|
||||
hardware, but it will run on a wider range of systems than the
|
||||
<filename>atom-pc</filename> did.
|
||||
<note>
|
||||
Additionally, a <filename>genericx86-64</filename> BSP has been
|
||||
added for 64-bit systems.
|
||||
</note>
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='migration-1.5-bitbake'>
|
||||
<title>BitBake</title>
|
||||
|
||||
<para>
|
||||
The following changes have been made that relate to BitBake:
|
||||
<itemizedlist>
|
||||
<listitem><para>
|
||||
BitBake now supports a <filename>_remove</filename>
|
||||
operator.
|
||||
The addition of this operator means you will have to
|
||||
rename any items in recipe space (functions, variables)
|
||||
whose names currently contain
|
||||
<filename>_remove_</filename> or end with
|
||||
<filename>_remove</filename> to avoid unexpected behavior.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
BitBake's global method pool has been removed.
|
||||
This method is not particularly useful and led to clashes
|
||||
between recipes containing functions that had the
|
||||
same name.</para></listitem>
|
||||
<listitem><para>
|
||||
The "none" server backend has been removed.
|
||||
The "process" server backend has been serving well as the
|
||||
default for a long time now.</para></listitem>
|
||||
<listitem><para>
|
||||
The <filename>bitbake-runtask</filename> script has been
|
||||
removed.</para></listitem>
|
||||
<listitem><para>
|
||||
<filename>${</filename><link linkend='var-P'><filename>P</filename></link><filename>}</filename>
|
||||
and
|
||||
<filename>${</filename><link linkend='var-PF'><filename>PF</filename></link><filename>}</filename>
|
||||
are no longer added to
|
||||
<link linkend='var-PROVIDES'><filename>PROVIDES</filename></link>
|
||||
by default in <filename>bitbake.conf</filename>.
|
||||
These version-specific <filename>PROVIDES</filename>
|
||||
items were seldom used.
|
||||
Attempting to use them could result in two versions being
|
||||
built simultaneously rather than just one version due to
|
||||
the way BitBake resolves dependencies.</para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='migration-1.5-qa-warnings'>
|
||||
<title>QA Warnings</title>
|
||||
|
||||
<para>
|
||||
The following changes have been made to the package QA checks:
|
||||
<itemizedlist>
|
||||
<listitem><para>
|
||||
If you have customized
|
||||
<link linkend='var-ERROR_QA'><filename>ERROR_QA</filename></link>
|
||||
or <link linkend='var-WARN_QA'><filename>WARN_QA</filename></link>
|
||||
values in your configuration, check that they contain all of
|
||||
the issues that you wish to be reported.
|
||||
Previous Yocto Project versions contained a bug that meant
|
||||
that any item not mentioned in <filename>ERROR_QA</filename>
|
||||
or <filename>WARN_QA</filename> would be treated as a
|
||||
warning.
|
||||
Consequently, several important items were not already in
|
||||
the default value of <filename>WARN_QA</filename>.
|
||||
All of the possible QA checks are now documented in the
|
||||
"<link linkend='ref-classes-insane'><filename>insane.bbclass</filename></link>"
|
||||
section.</para></listitem>
|
||||
<listitem><para>
|
||||
An additional QA check has been added to check if
|
||||
<filename>/usr/share/info/dir</filename> is being installed.
|
||||
Your recipe should delete this file within
|
||||
<filename>do_install</filename> if "make install" is
|
||||
installing it.</para></listitem>
|
||||
<listitem><para>
|
||||
If you are using the buildhistory class, the check for the
|
||||
package version going backwards is now controlled using a
|
||||
standard QA check.
|
||||
Thus, if you have customized your
|
||||
<filename>ERROR_QA</filename> or
|
||||
<filename>WARN_QA</filename> values and still wish to have
|
||||
this check performed, you should add
|
||||
"version-going-backwards" to your value for one or the
|
||||
other variables depending on how you wish it to be handled.
|
||||
See the documented QA checks in the
|
||||
"<link linkend='ref-classes-insane'><filename>insane.bbclass</filename></link>"
|
||||
section.
|
||||
</para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='migration-1.5-directory-layout-changes'>
|
||||
<title>Directory Layout Changes</title>
|
||||
|
||||
<para>
|
||||
The following directory changes exist:
|
||||
<itemizedlist>
|
||||
<listitem><para>
|
||||
Output SDK installer files are now named to include the
|
||||
image name and tuning architecture through the
|
||||
<link linkend='var-SDK_NAME'><filename>SDK_NAME</filename></link>
|
||||
variable.</para></listitem>
|
||||
<listitem><para>
|
||||
Images and related files are now installed into a directory
|
||||
that is specific to the machine, instead of a parent
|
||||
directory containing output files for multiple machines.
|
||||
The
|
||||
<link linkend='var-DEPLOY_DIR_IMAGE'><filename>DEPLOY_DIR_IMAGE</filename></link>
|
||||
variable continues to point to the directory containing
|
||||
images for the current
|
||||
<link linkend='var-MACHINE'><filename>MACHINE</filename></link>
|
||||
and should be used anywhere there is a need to refer to
|
||||
this directory.
|
||||
The <filename>runqemu</filename> script now uses this
|
||||
variable to find images and kernel binaries and will use
|
||||
BitBake to determine the directory.
|
||||
Alternatively, you can set the
|
||||
<filename>DEPLOY_DIR_IMAGE</filename> variable in the
|
||||
external environment.</para></listitem>
|
||||
<listitem><para>
|
||||
When buildhistory is enabled, its output is now written
|
||||
under the
|
||||
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>Build Directory</ulink>
|
||||
rather than
|
||||
<link linkend='var-TMPDIR'><filename>TMPDIR</filename></link>.
|
||||
Doing so makes it a easier to delete
|
||||
<filename>TMPDIR</filename> and preserve the build history.
|
||||
Additionally, data for produced SDKs is now split by
|
||||
<link linkend='var-IMAGE_NAME'><filename>IMAGE_NAME</filename></link>.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
The <filename>pkgdata</filename> directory produced as
|
||||
part of the packaging process has been collapsed into a
|
||||
single machine-specific directory.
|
||||
This directory is located under
|
||||
<filename>sysroots</filename> and uses a machine-specific
|
||||
name (i.e.
|
||||
<filename>tmp/sysroots/<machine>/pkgdata</filename>).
|
||||
</para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='migration-1.5-shortened-git-srcrev-values'>
|
||||
<title>Shortened Git <filename>SRCREV</filename> Values</title>
|
||||
|
||||
<para>
|
||||
BitBake will now shorten revisions from Git repositories from the
|
||||
normal 40 characters down to 10 characters within
|
||||
<link linkend='var-SRCPV'><filename>SRCPV</filename></link>
|
||||
for improved usability in path and file names.
|
||||
This change should be safe within contexts where these revisions
|
||||
are used because the chances of spatially close collisions
|
||||
is very low.
|
||||
Distant collisions are not a major issue in the way
|
||||
the values are used.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='migration-1.5-image-features'>
|
||||
<title><filename>IMAGE_FEATURES</filename></title>
|
||||
|
||||
<para>
|
||||
The following changes have been made that relate to
|
||||
<link linkend='var-IMAGE_FEATURES'><filename>IMAGE_FEATURES</filename></link>:
|
||||
<itemizedlist>
|
||||
<listitem><para>
|
||||
The value of
|
||||
<link linkend='var-IMAGE_FEATURES'><filename>IMAGE_FEATURES</filename></link>
|
||||
is now validated to ensure invalid feature items are not
|
||||
added.
|
||||
Some users mistakenly add package names to this variable
|
||||
instead of using
|
||||
<link linkend='var-IMAGE_INSTALL'><filename>IMAGE_INSTALL</filename></link>
|
||||
in order to have the package added to the image, which does
|
||||
not work.
|
||||
This change is intended to catch those kinds of situations.
|
||||
Valid <filename>IMAGE_FEATURES</filename> are drawn from
|
||||
<link linkend='var-PACKAGE_GROUP'><filename>PACKAGE_GROUP</filename></link>
|
||||
definitions,
|
||||
<link linkend='var-COMPLEMENTARY_GLOB'><filename>COMPLEMENTARY_GLOB</filename></link>
|
||||
and a new "validitems" varflag on
|
||||
<filename>IMAGE_FEATURES</filename>.
|
||||
The "validitems" varflag change allows additional features
|
||||
to be added if they are not provided using the previous
|
||||
two mechanisms.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
The previously deprecated "apps-console-core"
|
||||
<filename>IMAGE_FEATURES</filename> item is no longer
|
||||
supported.
|
||||
Add "splash" to <filename>IMAGE_FEATURES</filename> if you
|
||||
wish to have the splash screen enabled, since this is
|
||||
all that apps-console-core was doing.</para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='migration-1.5-run'>
|
||||
<title><filename>/run</filename></title>
|
||||
|
||||
<para>
|
||||
The <filename>/run</filename> directory from the Filesystem
|
||||
Hierarchy Standard 3.0 has been introduced.
|
||||
You can find some of the implications for this change
|
||||
<ulink url='http://cgit.openembedded.org/openembedded-core/commit/?id=0e326280a15b0f2c4ef2ef4ec441f63f55b75873'>here</ulink>.
|
||||
The change also means that recipes that install files to
|
||||
<filename>/var/run</filename> must be changed.
|
||||
You can find a guide on how to make these changes
|
||||
<ulink url='http://permalink.gmane.org/gmane.comp.handhelds.openembedded/58530'>here</ulink>.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='migration-1.5-removal-of-package-manager-database-within-image-recipes'>
|
||||
<title>Removal of Package Manager Database Within Image Recipes</title>
|
||||
|
||||
<para>
|
||||
The image <filename>core-image-minimal</filename> no longer adds
|
||||
<filename>remove_packaging_data_files</filename> to
|
||||
<link linkend='var-ROOTFS_POSTPROCESS_COMMAND'><filename>ROOTFS_POSTPROCESS_COMMAND</filename></link>.
|
||||
This addition is now handled automatically when "package-management"
|
||||
is not in
|
||||
<link linkend='var-IMAGE_FEATURES'><filename>IMAGE_FEATURES</filename></link>.
|
||||
If you have custom image recipes that make this addition,
|
||||
you should remove the lines, as they are not needed and might
|
||||
interfere with correct operation of postinstall scripts.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='migration-1.5-images-now-rebuild-only-on-changes-instead-of-every-time'>
|
||||
<title>Images Now Rebuild Only on Changes Instead of Every Time</title>
|
||||
|
||||
<para>
|
||||
The <filename>do_rootfs</filename> and other related image
|
||||
construction tasks are no longer marked as "nostamp".
|
||||
Consequently, they will only be re-executed when their inputs have
|
||||
changed.
|
||||
Previous versions of the OpenEmbedded build system always rebuilt
|
||||
the image when requested rather when necessary.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='migration-1.5-task-recipes'>
|
||||
<title>Task Recipes</title>
|
||||
|
||||
<para>
|
||||
The previously deprecated <filename>task.bbclass</filename> has
|
||||
now been dropped.
|
||||
For recipes that previously inherited from this task, you should
|
||||
rename them from <filename>task-*</filename> to
|
||||
<filename>packagegroup-*</filename> and inherit packagegroup
|
||||
instead.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
For more information, see the
|
||||
"<link linkend='ref-classes-packagegroup'>Package Groups - <filename>packagegroup.bbclass</filename></link>"
|
||||
section.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='migration-1.5-busybox'>
|
||||
<title>BusyBox</title>
|
||||
|
||||
<para>
|
||||
By default, we now split BusyBox into two binaries:
|
||||
one that is suid root for those components that need it, and
|
||||
another for the rest of the components.
|
||||
Splitting BusyBox allows for optimization that eliminates the
|
||||
<filename>tinylogin</filename> recipe as recommended by upstream.
|
||||
You can disable this split by setting
|
||||
<link linkend='var-BUSYBOX_SPLIT_SUID'><filename>BUSYBOX_SPLIT_SUID</filename></link>
|
||||
to "0".
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='migration-1.5-automated-image-testing'>
|
||||
<title>Automated Image Testing</title>
|
||||
|
||||
<para>
|
||||
A new automated image testing framework has been added
|
||||
through the
|
||||
<link linkend='ref-classes-testimage'><filename>testimage*.bbclass</filename></link>
|
||||
class.
|
||||
This framework replaces the older
|
||||
<filename>imagetest-qemu</filename> framework.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
You can learn more about performing automated image tests in the
|
||||
"<ulink url='&YOCTO_DOCS_DEV_URL;#performing-automated-runtime-testing'>Performing Automated Runtime Testing</ulink>"
|
||||
section.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='migration-1.5-build-history'>
|
||||
<title>Build History</title>
|
||||
|
||||
<para>
|
||||
Following are changes to Build History:
|
||||
<itemizedlist>
|
||||
<listitem><para>
|
||||
Installed package sizes:
|
||||
<filename>installed-package-sizes.txt</filename> for an
|
||||
image now records the size of the files installed by each
|
||||
package instead of the size of each compressed package
|
||||
archive file.</para></listitem>
|
||||
<listitem><para>
|
||||
The dependency graphs (<filename>depends*.dot</filename>)
|
||||
now use the actual package names instead of replacing
|
||||
dashes, dots and plus signs with underscores.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
The <filename>buildhistory-diff</filename> and
|
||||
<filename>buildhistory-collect-srcrevs</filename>
|
||||
utilities have improved command-line handling.
|
||||
Use the <filename>‐‐help</filename> option for
|
||||
each utility for more information on the new syntax.
|
||||
</para></listitem>
|
||||
</itemizedlist>
|
||||
For more information on Build History, see the
|
||||
"<link linkend='maintaining-build-output-quality'>Maintaining Build Output Quality</link>"
|
||||
section.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='migration-1.5-udev'>
|
||||
<title><filename>udev</filename></title>
|
||||
|
||||
<para>
|
||||
Following are changes to <filename>udev</filename>:
|
||||
<itemizedlist>
|
||||
<listitem><para>
|
||||
<filename>udev</filename> no longer brings in
|
||||
<filename>udev-extraconf</filename> automatically
|
||||
through
|
||||
<link linkend='var-RRECOMMENDS'><filename>RRECOMMENDS</filename></link>,
|
||||
since this was originally intended to be optional.
|
||||
If you need the extra rules, then add
|
||||
<filename>udev-extraconf</filename> to your image.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<filename>udev</filename> no longer brings in
|
||||
<filename>pciutils-ids</filename> or
|
||||
<filename>usbutils-ids</filename> through
|
||||
<filename>RRECOMMENDS</filename>.
|
||||
These are not needed by <filename>udev</filename> itself
|
||||
and removing them saves around 350KB.
|
||||
</para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='removed-renamed-recipes'>
|
||||
<title>Removed and Renamed Recipes</title>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem><para>
|
||||
The <filename>linux-yocto</filename> 3.2 kernel has been
|
||||
removed.</para></listitem>
|
||||
<listitem><para>
|
||||
<filename>libtool-nativesdk</filename> has been renamed to
|
||||
<filename>nativesdk-libtool</filename>.</para></listitem>
|
||||
<listitem><para>
|
||||
<filename>tinylogin</filename> has been removed.
|
||||
It has been replaced by a suid portion of Busybox.
|
||||
See the
|
||||
"<link linkend='migration-1.5-busybox'>BusyBox</link>" section
|
||||
for more information.</para></listitem>
|
||||
<listitem><para>
|
||||
<filename>external-python-tarball</filename> has been renamed
|
||||
to <filename>buildtools-tarball</filename>.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<filename>web-webkit</filename> has been removed.
|
||||
It has been functionally replaced by
|
||||
<filename>midori</filename>.</para></listitem>
|
||||
<listitem><para>
|
||||
<filename>imake</filename> has been removed.
|
||||
It is no longer needed by any other recipe.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<filename>transfig-native</filename> has been removed.
|
||||
It is no longer needed by any other recipe.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<filename>anjuta-remote-run</filename> has been removed.
|
||||
Anjuta IDE integration has not been officially supported for
|
||||
several releases.</para></listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
|
||||
<section id='migration-1.5-other-changes'>
|
||||
<title>Other Changes</title>
|
||||
|
||||
<para>
|
||||
Following is a list of short entries describing other changes:
|
||||
<itemizedlist>
|
||||
<listitem><para>
|
||||
<filename>run-postinsts</filename>: Make this generic.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<filename>base-files</filename>: Remove the unnecessary
|
||||
<filename>/media/xxx</filename> directories.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<filename>alsa-state</filename>: Provide an empty
|
||||
<filename>asound.conf</filename> by default.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<filename>classes/image</filename>: Ensure
|
||||
<link linkend='var-BAD_RECOMMENDATIONS'><filename>BAD_RECOMMENDATIONS</filename></link>
|
||||
supports pre-renamed package names.</para></listitem>
|
||||
<listitem><para>
|
||||
<filename>classes/rootfs_rpm</filename>: Implement
|
||||
<link linkend='var-BAD_RECOMMENDATIONS'><filename>BAD_RECOMMENDATIONS</filename></link>
|
||||
for RPM.</para></listitem>
|
||||
<listitem><para>
|
||||
<filename>systemd</filename>: Remove
|
||||
<filename>systemd_unitdir</filename> if
|
||||
<filename>systemd</filename> is not in
|
||||
<link linkend='var-DISTRO_FEATURES'><filename>DISTRO_FEATURES</filename></link>.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<filename>systemd</filename>: Remove
|
||||
<filename>init.d</filename> dir if
|
||||
<filename>systemd</filename> unit file is present and
|
||||
<filename>sysvinit</filename> is not a distro feature.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<filename>libpam</filename>: Deny all services for the
|
||||
<filename>OTHER</filename> entries.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<filename>image.bbclass</filename>: Move
|
||||
<filename>runtime_mapping_rename</filename> to avoid
|
||||
conflict with <filename>multilib</filename>.
|
||||
See
|
||||
<ulink url='https://bugzilla.yoctoproject.org/show_bug.cgi?id=4993'><filename>YOCTO #4993</filename></ulink>
|
||||
in Bugzilla for more information.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<filename>linux-dtb</filename>: Use kernel build system
|
||||
to generate the <filename>dtb</filename> files.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<filename>kern-tools</filename>: Switch from guilt to
|
||||
new <filename>kgit-s2q</filename> tool.
|
||||
</para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
</section>
|
||||
</section>
|
||||
</chapter>
|
||||
<!--
|
||||
vim: expandtab tw=80 ts=4
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<note>
|
||||
BitBake strives to be a generic "task" executor that is capable of handling complex dependency relationships.
|
||||
As such, it has no real knowledge of what the tasks being executed actually do.
|
||||
BitBake just considers a list of tasks with dependencies and handles
|
||||
BitBake just considers a list of tasks with dependencies and handles
|
||||
<ulink url='&YOCTO_DOCS_DEV_URL;#metadata'>Metadata</ulink>
|
||||
consisting of variables in a certain format that get passed to the tasks.
|
||||
</note>
|
||||
@@ -320,76 +320,74 @@
|
||||
|
||||
<screen>
|
||||
$ bitbake --help
|
||||
Usage: bitbake [options] [package ...]
|
||||
Usage: bitbake [options] [recipename/target ...]
|
||||
|
||||
Executes the specified task (default is 'build') for a given set of BitBake files.
|
||||
It expects that BBFILES is defined, which is a space separated list of files to
|
||||
be executed. BBFILES does support wildcards.
|
||||
Default BBFILES are the .bb files in the current directory.
|
||||
Executes the specified task (default is 'build') for a given set of target recipes (.bb files).
|
||||
It is assumed there is a conf/bblayers.conf available in cwd or in BBPATH which
|
||||
will provide the layer, BBFILES and other configuration information.
|
||||
|
||||
Options:
|
||||
--version show program's version number and exit
|
||||
-h, --help show this help message and exit
|
||||
-b BUILDFILE, --buildfile=BUILDFILE
|
||||
execute the task against this .bb file, rather than a
|
||||
package from BBFILES. Does not handle any
|
||||
dependencies.
|
||||
-k, --continue continue as much as possible after an error. While the
|
||||
target that failed, and those that depend on it,
|
||||
cannot be remade, the other dependencies of these
|
||||
targets can be processed all the same.
|
||||
-a, --tryaltconfigs continue with builds by trying to use alternative
|
||||
Execute tasks from a specific .bb recipe directly.
|
||||
WARNING: Does not handle any dependencies from other
|
||||
recipes.
|
||||
-k, --continue Continue as much as possible after an error. While the
|
||||
target that failed and anything depending on it cannot
|
||||
be built, as much as possible will be built before
|
||||
stopping.
|
||||
-a, --tryaltconfigs Continue with builds by trying to use alternative
|
||||
providers where possible.
|
||||
-f, --force force run of specified cmd, regardless of stamp status
|
||||
-c CMD, --cmd=CMD Specify task to execute. Note that this only executes
|
||||
the specified task for the providee and the packages
|
||||
it depends on, i.e. 'compile' does not implicitly call
|
||||
stage for the dependencies (IOW: use only if you know
|
||||
what you are doing). Depending on the base.bbclass a
|
||||
listtasks tasks is defined and will show available
|
||||
tasks
|
||||
-f, --force Force the specified targets/task to run (invalidating
|
||||
any existing stamp file).
|
||||
-c CMD, --cmd=CMD Specify the task to execute. The exact options
|
||||
available depend on the metadata. Some examples might
|
||||
be 'compile' or 'populate_sysroot' or 'listtasks' may
|
||||
give a list of the tasks available.
|
||||
-C INVALIDATE_STAMP, --clear-stamp=INVALIDATE_STAMP
|
||||
Invalidate the stamp for the specified cmd such as
|
||||
'compile' and run the default task for the specified
|
||||
target(s)
|
||||
Invalidate the stamp for the specified task such as
|
||||
'compile' and then run the default task for the
|
||||
specified target(s).
|
||||
-r PREFILE, --read=PREFILE
|
||||
read the specified file before bitbake.conf
|
||||
Read the specified file before bitbake.conf.
|
||||
-R POSTFILE, --postread=POSTFILE
|
||||
read the specified file after bitbake.conf
|
||||
-v, --verbose output more chit-chat to the terminal
|
||||
Read the specified file after bitbake.conf.
|
||||
-v, --verbose Output more log message data to the terminal.
|
||||
-D, --debug Increase the debug level. You can specify this more
|
||||
than once.
|
||||
-n, --dry-run don't execute, just go through the motions
|
||||
-n, --dry-run Don't execute, just go through the motions.
|
||||
-S, --dump-signatures
|
||||
don't execute, just dump out the signature
|
||||
construction information
|
||||
-p, --parse-only quit after parsing the BB files (developers only)
|
||||
-s, --show-versions show current and preferred versions of all recipes
|
||||
-e, --environment show the global or per-package environment (this is
|
||||
what used to be bbread)
|
||||
-g, --graphviz emit the dependency trees of the specified packages in
|
||||
the dot syntax, and the pn-buildlist to show the build
|
||||
list
|
||||
Don't execute, just dump out the signature
|
||||
construction information.
|
||||
-p, --parse-only Quit after parsing the BB recipes.
|
||||
-s, --show-versions Show current and preferred versions of all recipes.
|
||||
-e, --environment Show the global or per-package environment complete
|
||||
with information about where variables were
|
||||
set/changed.
|
||||
-g, --graphviz Save dependency tree information for the specified
|
||||
targets in the dot syntax.
|
||||
-I EXTRA_ASSUME_PROVIDED, --ignore-deps=EXTRA_ASSUME_PROVIDED
|
||||
Assume these dependencies don't exist and are already
|
||||
provided (equivalent to ASSUME_PROVIDED). Useful to
|
||||
make dependency graphs more appealing
|
||||
-l DEBUG_DOMAINS, --log-domains=DEBUG_DOMAINS
|
||||
Show debug logging for the specified logging domains
|
||||
-P, --profile profile the command and print a report
|
||||
-u UI, --ui=UI userinterface to use
|
||||
-P, --profile Profile the command and save reports.
|
||||
-u UI, --ui=UI The user interface to use (e.g. knotty, hob, depexp).
|
||||
-t SERVERTYPE, --servertype=SERVERTYPE
|
||||
Choose which server to use, process or xmlrpc
|
||||
Choose which server to use, process or xmlrpc.
|
||||
--revisions-changed Set the exit code depending on whether upstream
|
||||
floating revisions have changed or not
|
||||
--server-only Run bitbake without UI, the frontend can connect with
|
||||
bitbake server itself
|
||||
-B BIND, --bind=BIND The name/address for the bitbake server to bind to
|
||||
--no-setscene Do not run any setscene tasks, forces builds
|
||||
floating revisions have changed or not.
|
||||
--server-only Run bitbake without a UI, only starting a server
|
||||
(cooker) process.
|
||||
-B BIND, --bind=BIND The name/address for the bitbake server to bind to.
|
||||
--no-setscene Do not run any setscene tasks. sstate will be ignored
|
||||
and everything needed, built.
|
||||
--remote-server=REMOTE_SERVER
|
||||
Connect to the specified server
|
||||
-m, --kill-server Terminate the remote server
|
||||
--observe-only Connect to a server as an observing-only client
|
||||
Connect to the specified server.
|
||||
-m, --kill-server Terminate the remote server.
|
||||
--observe-only Connect to a server as an observing-only client.
|
||||
</screen>
|
||||
</section>
|
||||
|
||||
|
||||
@@ -86,9 +86,9 @@
|
||||
the <filename><link linkend='var-EXTRA_OEMAKE'>EXTRA_OEMAKE</link></filename> variable.
|
||||
</para></listitem>
|
||||
<listitem><para><filename>do_install</filename> ‐ Runs <filename>make install</filename>
|
||||
and passes a destination directory option, which takes its value
|
||||
from the standard
|
||||
<filename><link linkend='var-DESTDIR'>DESTDIR</link></filename> variable.
|
||||
and passes in
|
||||
<filename>${</filename><link linkend='var-D'><filename>D</filename></link><filename>}</filename>
|
||||
as <filename>DESTDIR</filename>.
|
||||
</para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
@@ -341,9 +341,9 @@
|
||||
on the development host that can be used by Smart, you can
|
||||
install packages from the feed while you are running the image
|
||||
on the target (i.e. runtime installation of packages).
|
||||
For information on how to set up this repository, see the
|
||||
"<ulink url='&YOCTO_DOCS_DEV_URL;#setting-up-runtime-package-management'>Setting Up Runtime Package Management</ulink>"
|
||||
in the Yocto Project Development Manual.
|
||||
For more information, see the
|
||||
"<ulink url='&YOCTO_DOCS_DEV_URL;#using-runtime-package-management'>Using Runtime Package Management</ulink>"
|
||||
section in the Yocto Project Development Manual.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
@@ -797,6 +797,21 @@
|
||||
<listitem><para><emphasis><filename>perms:</filename></emphasis>
|
||||
Currently, this check is unused but reserved.
|
||||
</para></listitem>
|
||||
<listitem><para><emphasis><filename>version-going-backwards:</filename></emphasis>
|
||||
If Build History is enabled, reports when a package
|
||||
being written out has a lower version than the previously
|
||||
written package under the same name.
|
||||
If you are placing output packages into a feed and
|
||||
upgrading packages on a target system using that feed, the
|
||||
version of a package going backwards can result in the target
|
||||
system not correctly upgrading to the "new" version of the
|
||||
package.
|
||||
<note>
|
||||
If you are not using runtime package management on your
|
||||
target system, then you do not need to worry about
|
||||
this situation.
|
||||
</note>
|
||||
</para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
</section>
|
||||
@@ -940,8 +955,12 @@
|
||||
|
||||
<para>
|
||||
You can use this class to enable running a series of automated tests
|
||||
for QEMU images.
|
||||
The class handles loading the tests and starting the QEMU image.
|
||||
for images.
|
||||
The class handles loading the tests and starting the image.
|
||||
<note>
|
||||
Currently, there is only support for running these tests
|
||||
under QEMU.
|
||||
</note>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
@@ -950,15 +969,13 @@
|
||||
The tests are commands that run on the target system over
|
||||
<filename>ssh</filename>.
|
||||
they are written in Python and make use of the
|
||||
<filename>unittest modulebuild</filename> software.
|
||||
<filename>unittest</filename> module.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
For information on how to enable, run, and create new tests, see the
|
||||
"<ulink url='running-and-writing-tests-for-a-qemu-image'>Running and Writing Tests for a QEMU Image</ulink>"
|
||||
section and the
|
||||
<ulink url='https://wiki.yoctoproject.org/wiki/Image_tests'>Image Tests</ulink>
|
||||
Wiki page.
|
||||
"<ulink url='&YOCTO_DOCS_DEV_URL;#performing-automated-runtime-testing'>Performing Automated Runtime Testing</ulink>"
|
||||
section.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
@@ -979,6 +996,7 @@
|
||||
allarch.bbclass
|
||||
archive*.bbclass
|
||||
binconfig.bbclass
|
||||
bin_package.bbclass
|
||||
blacklist.bbclass
|
||||
bootimg.bbclass
|
||||
boot-directdisk.bbclass
|
||||
@@ -987,6 +1005,7 @@
|
||||
buildstats.bbclass
|
||||
ccache.bbclass
|
||||
chrpath.bbclass
|
||||
clutter.bbclass
|
||||
cmake.bbclass
|
||||
cml1.bbclass
|
||||
copyleft_compliance.bbclass
|
||||
@@ -996,7 +1015,9 @@
|
||||
crosssdk.bbclass
|
||||
deploy.bbclass
|
||||
distrodata.bbclass
|
||||
distro_features_check.bbclass
|
||||
dummy.bbclass
|
||||
extrausers.bbclass
|
||||
fontcache.bbclass
|
||||
gconf.bbclass
|
||||
gettext.bbclass
|
||||
@@ -1015,12 +1036,11 @@
|
||||
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-module-split.bbclass
|
||||
kernel-yocto.bbclass
|
||||
lib_package.bbclass
|
||||
linux-kernel-base.bbclass
|
||||
@@ -1061,6 +1081,7 @@
|
||||
sip.bbclass
|
||||
siteconfig.bbclass
|
||||
sourcepkg.bbclass
|
||||
spdx.bbclass
|
||||
sstate.bbclass
|
||||
staging.bbclass
|
||||
syslinux.bbclass
|
||||
@@ -1069,8 +1090,11 @@
|
||||
tinderclient.bbclass
|
||||
toolchain-scripts.bbclass
|
||||
typecheck.bbclass
|
||||
uboot-config.bbclass
|
||||
utility-tasks.bbclass
|
||||
utils.bbclass
|
||||
vala.bbclass
|
||||
waf.bbclass
|
||||
-->
|
||||
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
</revision>
|
||||
<revision>
|
||||
<revnumber>1.5</revnumber>
|
||||
<date>Sometime in 2013</date>
|
||||
<date>October 2013</date>
|
||||
<revremark>Released with the Yocto Project 1.5 Release.</revremark>
|
||||
</revision>
|
||||
</revhistory>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<link linkend='var-FILES'>F</link>
|
||||
<!-- <link linkend='var-glossary-g'>G</link> -->
|
||||
<link linkend='var-HOMEPAGE'>H</link>
|
||||
<link linkend='var-IMAGE_CLASSES'>I</link>
|
||||
<link linkend='var-IMAGE_BASENAME'>I</link>
|
||||
<!-- <link linkend='var-glossary-j'>J</link> -->
|
||||
<link linkend='var-KARCH'>K</link>
|
||||
<link linkend='var-LAYERDEPENDS'>L</link>
|
||||
@@ -36,7 +36,7 @@
|
||||
<link linkend='var-RCONFLICTS'>R</link>
|
||||
<link linkend='var-S'>S</link>
|
||||
<link linkend='var-T'>T</link>
|
||||
<link linkend='var-USER_CLASSES'>U</link>
|
||||
<link linkend='var-UBOOT_ENTRYPOINT'>U</link>
|
||||
<!-- <link linkend='var-glossary-v'>V</link> -->
|
||||
<link linkend='var-WARN_QA'>W</link>
|
||||
<!-- <link linkend='var-glossary-x'>X</link> -->
|
||||
@@ -724,8 +724,26 @@ Core layer for images cannot be removed
|
||||
|
||||
<glossentry id='var-BBPATH'><glossterm>BBPATH</glossterm>
|
||||
<glossdef>
|
||||
<para>Used by BitBake to locate <filename>.bbclass</filename> and configuration files.
|
||||
This variable is analogous to the <filename>PATH</filename> variable.</para>
|
||||
<para>
|
||||
Used by BitBake to locate
|
||||
<filename>.bbclass</filename> and configuration files.
|
||||
This variable is analogous to the
|
||||
<filename>PATH</filename> variable.
|
||||
<note>
|
||||
If you run BitBake from a directory outside of the
|
||||
<ulink url='&YOCTO_DOCS_DEV_URL;build-directory'>Build Directory</ulink>,
|
||||
you must be sure to set
|
||||
<filename>BBPATH</filename> to point to the
|
||||
Build Directory.
|
||||
Set the variable as you would any environment variable
|
||||
and then run BitBake:
|
||||
<literallayout class='monospaced'>
|
||||
$ BBPATH = "<build_directory>"
|
||||
$ export BBPATH
|
||||
$ bitbake <target>
|
||||
</literallayout>
|
||||
</note>
|
||||
</para>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
@@ -819,6 +837,25 @@ Core layer for images cannot be removed
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-BUSYBOX_SPLIT_SUID'><glossterm>BUSYBOX_SPLIT_SUID</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
For the BusyBox recipe, specifies whether to split the
|
||||
output executable file into two parts: one for features
|
||||
that require <filename>setuid root</filename>, and one for
|
||||
the remaining features (i.e. those that do not require
|
||||
<filename>setuid root</filename>).
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The <filename>BUSYBOX_SPLIT_SUID</filename> variable
|
||||
defaults to "1", which results in a single output
|
||||
executable file.
|
||||
Set the variable to "0" to split the output file.
|
||||
</para>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
</glossdiv>
|
||||
|
||||
<glossdiv id='var-glossary-c'><title>C</title>
|
||||
@@ -885,6 +922,33 @@ Core layer for images cannot be removed
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-COMPLEMENTARY_GLOB'><glossterm>COMPLEMENTARY_GLOB</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
Defines wildcards to match when installing a list of
|
||||
complementary packages for all the packages explicitly
|
||||
(or implicitly) installed in an image.
|
||||
The resulting list of complementary packages is associated
|
||||
with an item that can be added to
|
||||
<link linkend='var-IMAGE_FEATURES'><filename>IMAGE_FEATURES</filename></link>.
|
||||
An example usage of this is the "dev-pkgs" item that when
|
||||
added to <filename>IMAGE_FEATURES</filename> will
|
||||
install -dev packages (containing headers and other
|
||||
development files) for every package in the image.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
To add a new feature item pointing to a wildcard, use a
|
||||
variable flag to specify the feature item name and
|
||||
use the value to specify the wildcard.
|
||||
Here is an example:
|
||||
<literallayout class='monospaced'>
|
||||
COMPLEMENTARY_GLOB[dev-pkgs] = '*-dev'
|
||||
</literallayout>
|
||||
</para>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-CONFFILES'><glossterm>CONFFILES</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
@@ -994,6 +1058,15 @@ Core layer for images cannot be removed
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-DATETIME'><glossterm>DATETIME</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
The date and time on which the current build started.
|
||||
The format is suitable for timestamps.
|
||||
</para>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-DEBUG_BUILD'><glossterm>DEBUG_BUILD</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
@@ -1138,12 +1211,6 @@ Core layer for images cannot be removed
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-DESTDIR'><glossterm>DESTDIR</glossterm>
|
||||
<glossdef>
|
||||
<para>the destination directory.</para>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-DISTRO'><glossterm>DISTRO</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
@@ -1363,19 +1430,24 @@ Core layer for images cannot be removed
|
||||
<para>
|
||||
Directs BitBake to exclude a recipe from world builds (i.e.
|
||||
<filename>bitbake world</filename>).
|
||||
This variable is intrinsically understood by BitBake.
|
||||
</para>
|
||||
|
||||
<note>
|
||||
During world builds, BitBake locates, parses and builds all
|
||||
recipes found in every layer exposed in the
|
||||
<filename>bblayers.conf</filename> configuration file.
|
||||
</note>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
To exclude a recipe from a world build using this variable,
|
||||
set the variable to "1" in the recipe.
|
||||
</para>
|
||||
|
||||
<note>
|
||||
Recipes added to <filename>EXCLUDE_FROM_WORLD</filename>
|
||||
may still be built during a world build in order to satisfy
|
||||
dependencies of other recipes.
|
||||
Adding a recipe to <filename>EXCLUDE_FROM_WORLD</filename>
|
||||
only ensures that the recipe is not explicitly added
|
||||
to the list of build targets in a world build.
|
||||
</note>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
@@ -1854,6 +1926,16 @@ Core layer for images cannot be removed
|
||||
|
||||
<glossdiv id='var-glossary-i'><title>I</title>
|
||||
|
||||
<glossentry id='var-IMAGE_BASENAME'><glossterm>IMAGE_BASENAME</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
The base name of image output files.
|
||||
This variable defaults to the recipe name
|
||||
(<filename>${</filename><link linkend='var-PN'><filename>PN</filename></link><filename>}</filename>).
|
||||
</para>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-IMAGE_CLASSES'><glossterm>IMAGE_CLASSES</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
@@ -1993,6 +2075,23 @@ Core layer for images cannot be removed
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-IMAGE_NAME'><glossterm>IMAGE_NAME</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
The name of the output image files minus the extension.
|
||||
This variable is derived using the
|
||||
<link linkend='var-IMAGE_BASENAME'><filename>IMAGE_BASENAME</filename></link>,
|
||||
<link linkend='var-MACHINE'><filename>MACHINE</filename></link>,
|
||||
and
|
||||
<link linkend='var-DATETIME'><filename>DATETIME</filename></link>
|
||||
variables:
|
||||
<literallayout class='monospaced'>
|
||||
IMAGE_NAME = "${IMAGE_BASENAME}-${MACHINE}-${DATETIME}"
|
||||
</literallayout>
|
||||
</para>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-IMAGE_OVERHEAD_FACTOR'><glossterm>IMAGE_OVERHEAD_FACTOR</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
@@ -3621,6 +3720,34 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-PACKAGE_GROUP'><glossterm>PACKAGE_GROUP</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
Defines one or more packages to include in an image when
|
||||
a specific item is included in
|
||||
<link linkend='var-IMAGE_FEATURES'><filename>IMAGE_FEATURES</filename></link>.
|
||||
When setting the value, <filename>PACKAGE_GROUP</filename>
|
||||
should have the name of the feature item as an override.
|
||||
Here is an example:
|
||||
<literallayout class='monospaced'>
|
||||
PACKAGE_GROUP_widget = "package1 package2"
|
||||
</literallayout>
|
||||
In this example, if "widget" were added to
|
||||
<filename>IMAGE_FEATURES</filename>, "package1" and
|
||||
"package2" would be included in the image.
|
||||
<note>
|
||||
Packages installed by features defined through
|
||||
<filename>PACKAGE_GROUP</filename> are often package
|
||||
groups.
|
||||
While similarly named, you should not confuse the
|
||||
<filename>PACKAGE_GROUP</filename> variable with
|
||||
package groups, which are discussed elsewhere in the
|
||||
documentation.
|
||||
</note>
|
||||
</para>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-PACKAGE_INSTALL'><glossterm>PACKAGE_INSTALL</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
@@ -3647,20 +3774,29 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
|
||||
<para>
|
||||
This variable provides a means of enabling or disabling
|
||||
features of a recipe on a per-recipe basis.
|
||||
<filename>PACKAGECONFIG</filename> blocks are defined
|
||||
in recipes when you specify features and then arguments
|
||||
that define feature behaviors.
|
||||
Here is the basic block structure:
|
||||
<literallayout class='monospaced'>
|
||||
PACKAGECONFIG ??= "f1 f2 f3 ..."
|
||||
PACKAGECONFIG[f1] = "--with-f1,--without-f1,build-deps-f1,rt-deps-f1"
|
||||
PACKAGECONFIG[f2] = "--with-f2,--without-f2,build-deps-f2,rt-deps-f2"
|
||||
PACKAGECONFIG[f3] = "--with-f3,--without-f3,build-deps-f3,rt-deps-f3"
|
||||
</literallayout>
|
||||
The <filename>PACKAGECONFIG</filename>
|
||||
variable itself specifies a space-separated list of the
|
||||
features to enable.
|
||||
The features themselves are specified as flags on the
|
||||
<filename>PACKAGECONFIG</filename> variable.
|
||||
You can provide up to four arguments, which are separated by
|
||||
commas, to determine the behavior of each feature
|
||||
when it is enabled or disabled.
|
||||
Following the features, you can determine the behavior of
|
||||
each feature by providing up to four order-dependent
|
||||
arguments, which are separated by commas.
|
||||
You can omit any argument you like but must retain the
|
||||
separating commas.
|
||||
The arguments specify the following:
|
||||
The order is important and specifies the following:
|
||||
<orderedlist>
|
||||
<listitem><para>Extra arguments
|
||||
that should be added to the configure script argument list
|
||||
that should be added to the configure script
|
||||
argument list
|
||||
(<link linkend='var-EXTRA_OECONF'><filename>EXTRA_OECONF</filename></link>)
|
||||
if the feature is enabled.</para></listitem>
|
||||
<listitem><para>Extra arguments
|
||||
@@ -3679,14 +3815,16 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Consider the following example taken from the
|
||||
Consider the following
|
||||
<filename>PACKAGECONFIG</filename> block taken from the
|
||||
<filename>librsvg</filename> recipe.
|
||||
In this example the feature is <filename>croco</filename>, which
|
||||
has three arguments that determine the feature's behavior.
|
||||
<literallayout class='monospaced'>
|
||||
In this example the feature is <filename>croco</filename>,
|
||||
which has three arguments that determine the feature's
|
||||
behavior.
|
||||
<literallayout class='monospaced'>
|
||||
PACKAGECONFIG ??= "croco"
|
||||
PACKAGECONFIG[croco] = "--with-croco,--without-croco,libcroco"
|
||||
</literallayout>
|
||||
</literallayout>
|
||||
The <filename>--with-croco</filename> and
|
||||
<filename>libcroco</filename> arguments apply only if
|
||||
the feature is enabled.
|
||||
@@ -3700,6 +3838,49 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
|
||||
added to the configure script rather than
|
||||
<filename>--with-croco</filename>.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The basic <filename>PACKAGECONFIG</filename> structure
|
||||
previously described holds true regardless of whether you
|
||||
are creating a block or changing a block.
|
||||
When creating a block, use the structure inside your
|
||||
recipe.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
If you want to change an existing
|
||||
<filename>PACKAGECONFIG</filename> block, you can do so
|
||||
one of two ways:
|
||||
<itemizedlist>
|
||||
<listitem><para><emphasis>Append file:</emphasis>
|
||||
Create an append file named
|
||||
<filename><recipename>.bbappend</filename> in your
|
||||
layer and override the value of
|
||||
<filename>PACKAGECONFIG</filename>.
|
||||
You can either completely override the variable:
|
||||
<literallayout class='monospaced'>
|
||||
PACKAGECONFIG="f4 f5"
|
||||
</literallayout>
|
||||
Or, you can just amended the variable:
|
||||
<literallayout class='monospaced'>
|
||||
PACKAGECONFIG_append = " f4"
|
||||
</literallayout></para></listitem>
|
||||
<listitem><para><emphasis>Configuration file:</emphasis>
|
||||
This method is identical to changing the block
|
||||
through an append file except you edit your
|
||||
<filename>local.conf</filename> or
|
||||
<filename><mydistro>.conf</filename> file.
|
||||
As with append files previously described,
|
||||
you can either completely override the variable:
|
||||
<literallayout class='monospaced'>
|
||||
PACKAGECONFIG_pn-<recipename>="f4 f5"
|
||||
</literallayout>
|
||||
Or, you can just amended the variable:
|
||||
<literallayout class='monospaced'>
|
||||
PACKAGECONFIG_append_pn-<recipename> = " f4"
|
||||
</literallayout></para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
@@ -3751,15 +3932,54 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
|
||||
|
||||
<glossentry id='var-PARALLEL_MAKE'><glossterm>PARALLEL_MAKE</glossterm>
|
||||
<glossdef>
|
||||
<para>Specifies extra options that are passed to the <filename>make</filename> command during the
|
||||
compile tasks.
|
||||
This variable is usually in the form <filename>-j 4</filename>, where the number
|
||||
represents the maximum number of parallel threads make can run.
|
||||
If you development host supports multiple cores a good rule of thumb is to set
|
||||
this variable to twice the number of cores on the host.</para>
|
||||
<para>
|
||||
Extra options that are passed to the
|
||||
<filename>make</filename> command during the
|
||||
<filename>do_compile</filename> task in order to specify
|
||||
parallel compilation.
|
||||
This variable is usually in the form
|
||||
<filename>-j 4</filename>, where the number
|
||||
represents the maximum number of parallel threads make can
|
||||
run.
|
||||
If you development host supports multiple cores a good
|
||||
rule of thumb is to set this variable to twice the number
|
||||
of cores on the host.
|
||||
<note>
|
||||
Individual recipes might clear out this variable if
|
||||
the software being built has problems running its
|
||||
<filename>make</filename> process in parallel.
|
||||
</note>
|
||||
</para>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-PARALLEL_MAKEINST'><glossterm>PARALLEL_MAKEINST</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
Extra options passed to the
|
||||
<filename>make install</filename> command during the
|
||||
<filename>do_install</filename> task in order to specify
|
||||
parallel installation.
|
||||
This variable defaults to the value of
|
||||
<link linkend='var-PARALLEL_MAKE'><filename>PARALLEL_MAKE</filename></link>.
|
||||
<note>
|
||||
Individual recipes might clear out this variable if
|
||||
the software being built has problems running its
|
||||
<filename>make install</filename> process in parallel.
|
||||
</note>
|
||||
</para>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
|
||||
|
||||
|
||||
PARALLEL_MAKEINST with the description ".
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<glossentry id='var-PATCHRESOLVE'><glossterm>PATCHRESOLVE</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
@@ -4529,6 +4749,36 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-SDK_ARCH'><glossterm>SDK_ARCH</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
The target architecture for the SDK.
|
||||
Typically, you do not directly set this variable.
|
||||
Instead, use
|
||||
<link linkend='var-SDKMACHINE'><filename>SDKMACHINE</filename></link>.
|
||||
</para>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-SDK_NAME'><glossterm>SDK_NAME</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
The base name for SDK output files.
|
||||
The name is derived from the
|
||||
<link linkend='var-DISTRO'><filename>DISTRO</filename></link>,
|
||||
<link linkend='var-TCLIBC'><filename>TCLIBC</filename></link>,
|
||||
<link linkend='var-SDK_ARCH'><filename>SDK_ARCH</filename></link>,
|
||||
<link linkend='var-IMAGE_BASENAME'><filename>IMAGE_BASENAME</filename></link>,
|
||||
and
|
||||
<link linkend='var-TUNE_PKGARCH'><filename>TUNE_PKGARCH</filename></link>
|
||||
variables:
|
||||
<literallayout class='monospaced'>
|
||||
SDK_NAME = "${DISTRO}-${TCLIBC}-${SDK_ARCH}-${IMAGE_BASENAME}-${TUNE_PKGARCH}"
|
||||
</literallayout>
|
||||
</para>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-SDKIMAGE_FEATURES'><glossterm>SDKIMAGE_FEATURES</glossterm>
|
||||
<glossdef>
|
||||
<para>Equivalent to
|
||||
@@ -4599,7 +4849,8 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
|
||||
SERIAL_CONSOLE = "115200 ttyS0"
|
||||
</literallayout>
|
||||
<note>
|
||||
The <filename>SERIAL_CONSOLE</filename> is deprecated.
|
||||
The <filename>SERIAL_CONSOLE</filename> variable
|
||||
is deprecated.
|
||||
Please use the
|
||||
<link linkend='var-SERIAL_CONSOLES'><filename>SERIAL_CONSOLES</filename></link>
|
||||
variable.
|
||||
@@ -4860,6 +5111,10 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
|
||||
<listitem><para><emphasis><filename>striplevel</filename> -</emphasis> Which
|
||||
striplevel to use when applying the patch.
|
||||
The default level is 1.</para></listitem>
|
||||
<listitem><para><emphasis><filename>patchdir</filename> -</emphasis> Specifies
|
||||
the directory in which the patch should be applied.
|
||||
The default is <filename>${</filename><link linkend='var-S'><filename>S</filename></link><filename>}</filename>.
|
||||
</para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
<para>Here are options specific to recipes building code from a revision control system:
|
||||
@@ -5217,27 +5472,52 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-TEST_IMAGE'><glossterm>TEST_IMAGE</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
Automatically runs the series of automated tests for
|
||||
images when an image is successfully built.
|
||||
<note>
|
||||
Currently, there is only support for running these tests
|
||||
under QEMU.
|
||||
</note>
|
||||
These tests are written in Python making use of the
|
||||
<filename>unittest</filename> module, and the majority of
|
||||
them run commands on the target system over
|
||||
<filename>ssh</filename>.
|
||||
You can set this variable to "1" in your
|
||||
<filename>local.conf</filename> file in the
|
||||
<ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>Build Directory</ulink>
|
||||
to have the OpenEmbedded build system automatically run
|
||||
these tests after an image successfully builds:
|
||||
<literallayout class='monospaced'>
|
||||
TEST_IMAGE = "1"
|
||||
</literallayout>
|
||||
For more information on enabling, running, and writing
|
||||
these tests, see the
|
||||
"<ulink url='&YOCTO_DOCS_DEV_URL;#performing-automated-runtime-testing'>Performing Automated Runtime Testing</ulink>"
|
||||
section in the Yocto Project Development Manual and the
|
||||
"<link linkend='ref-classes-testimage'><filename>testimage.bbclass</filename></link>"
|
||||
section.
|
||||
</para>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-TEST_QEMUBOOT_TIMEOUT'><glossterm>TEST_QEMUBOOT_TIMEOUT</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
The time in seconds allowed for a QEMU image to boot before
|
||||
tests begin to run against the image using the following
|
||||
command:
|
||||
<literallayout class='monospaced'>
|
||||
bitbake <qemu_image> -c testimage
|
||||
</literallayout>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The time in seconds allowed for an image to boot before
|
||||
automated runtime tests begin to run against an
|
||||
image.
|
||||
The default timeout period to allow the boot process to
|
||||
reach the login prompt is 500 seconds.
|
||||
You can edit this default value in the
|
||||
You can specify a different value in the
|
||||
<filename>local.conf</filename> file.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
For more information on testing QEMU images, see the
|
||||
"<ulink url='running-and-writing-tests-for-a-qemu-image'>Running and Writing Tests for a QEMU Image</ulink>"
|
||||
For more information on testing images, see the
|
||||
"<ulink url='&YOCTO_DOCS_DEV_URL;#performing-automated-runtime-testing'>Performing Automated Runtime Testing</ulink>"
|
||||
section in the Yocto Project Development Manual.
|
||||
</para>
|
||||
</glossdef>
|
||||
@@ -5247,15 +5527,16 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
|
||||
<glossdef>
|
||||
<para>
|
||||
An ordered list of tests (modules) to run against
|
||||
a QEMU image using the following command:
|
||||
<literallayout class='monospaced'>
|
||||
bitbake <qemu_image> -c testimage
|
||||
</literallayout>
|
||||
an image when performing automated runtime testing.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The Yocto Project provides a core set of tests that can
|
||||
be used against QEMU images.
|
||||
The OpenEmbedded build system provides a core set of tests
|
||||
that can be used against images.
|
||||
<note>
|
||||
Currently, there is only support for running these tests
|
||||
under QEMU.
|
||||
</note>
|
||||
Tests include <filename>ping</filename>,
|
||||
<filename>ssh</filename>, <filename>df</filename> among
|
||||
others.
|
||||
@@ -5264,6 +5545,14 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
|
||||
<literallayout class='monospaced'>
|
||||
TEST_SUITES_append = " mytest"
|
||||
</literallayout>
|
||||
Alternatively, you can provide the "auto" option to
|
||||
have all applicable tests run against the image.
|
||||
<literallayout class='monospaced'>
|
||||
TEST_SUITES_append = " auto"
|
||||
</literallayout>
|
||||
Using this option causes the build system to automatically
|
||||
run tests that are applicable to the image.
|
||||
Tests that are not applicable are skipped.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
@@ -5282,8 +5571,8 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
|
||||
</para>
|
||||
|
||||
<para>
|
||||
For more information on testing QEMU images, see the
|
||||
"<ulink url='running-and-writing-tests-for-a-qemu-image'>Running and Writing Tests for a QEMU Image</ulink>"
|
||||
For more information on testing images, see the
|
||||
"<ulink url='&YOCTO_DOCS_DEV_URL;#performing-automated-runtime-testing'>Performing Automated Runtime Testing</ulink>"
|
||||
section in the Yocto Project Development Manual.
|
||||
</para>
|
||||
</glossdef>
|
||||
@@ -5403,10 +5692,71 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-TUNE_PKGARCH'><glossterm>TUNE_PKGARCH</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
The package architecture understood by the packaging
|
||||
system to define the architecture, ABI, and tuning of
|
||||
output packages.
|
||||
</para>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
</glossdiv>
|
||||
|
||||
<glossdiv id='var-glossary-u'><title>U</title>
|
||||
|
||||
<glossentry id='var-UBOOT_ENTRYPOINT'><glossterm>UBOOT_ENTRYPOINT</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
Specifies the entry point for the U-Boot image.
|
||||
During U-Boot image creation, the
|
||||
<filename>UBOOT_ENTRYPOINT</filename> variable is passed
|
||||
as a command-line parameter to the
|
||||
<filename>uboot-mkimage</filename> utility.
|
||||
</para>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-UBOOT_LOADADDRESS'><glossterm>UBOOT_LOADADDRESS</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
Specifies the load address for the U-Boot image.
|
||||
During U-Boot image creation, the
|
||||
<filename>UBOOT_LOADADDRESS</filename> variable is passed
|
||||
as a command-line parameter to the
|
||||
<filename>uboot-mkimage</filename> utility.
|
||||
</para>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-UBOOT_MACHINE'><glossterm>UBOOT_MACHINE</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
Specifies the value passed on the
|
||||
<filename>make</filename> command line when building
|
||||
a U-Boot image.
|
||||
The value indicates the target platform configuration.
|
||||
You typically set this variable from the machine
|
||||
configuration file (i.e.
|
||||
<filename>conf/machine/<machine_name>.conf</filename>).
|
||||
</para>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-UBOOT_TARGET'><glossterm>UBOOT_TARGET</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
Specifies the target used for building U-Boot.
|
||||
The target is passed directly as part of the "make" command
|
||||
(e.g. SPL and AIS).
|
||||
If you do not specifically set this variable, the
|
||||
OpenEmbedded build process passes and uses "all" for the
|
||||
target during the U-Boot building process.
|
||||
</para>
|
||||
</glossdef>
|
||||
</glossentry>
|
||||
|
||||
<glossentry id='var-USER_CLASSES'><glossterm>USER_CLASSES</glossterm>
|
||||
<glossdef>
|
||||
<para>
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
<title>Build Overview</title>
|
||||
|
||||
<para>
|
||||
The first thing you need to do is set up the OpenEmbedded build
|
||||
The first thing you need to do is set up the OpenEmbedded build
|
||||
environment by sourcing an environment setup script
|
||||
(i.e.
|
||||
<link linkend='structure-core-script'><filename>&OE_INIT_FILE;</filename></link>
|
||||
@@ -508,7 +508,8 @@
|
||||
<imagedata fileref="figures/buildhistory.png" align="center" width="6in" depth="4in" />
|
||||
</para>
|
||||
|
||||
<para>At the top level, there is a <filename>metadata-revs</filename> file
|
||||
<para>
|
||||
At the top level, there is a <filename>metadata-revs</filename> file
|
||||
that lists the revisions of the repositories for the layers enabled
|
||||
when the build was produced.
|
||||
The rest of the data splits into separate
|
||||
@@ -632,6 +633,12 @@
|
||||
<para>
|
||||
The files produced for each image are as follows:
|
||||
<itemizedlist>
|
||||
<listitem><para><filename>image-files:</filename>
|
||||
A directory containing selected files from the root
|
||||
filesystem.
|
||||
The files are defined by
|
||||
<filename>BUILDHISTORY_IMAGE_FILES</filename>.
|
||||
</para></listitem>
|
||||
<listitem><para><filename>build-id:</filename>
|
||||
Human-readable information about the build configuration
|
||||
and metadata source revisions.</para></listitem>
|
||||
|
||||
@@ -88,13 +88,6 @@
|
||||
new to the Yocto Project but familiar with Linux build systems.</para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
<note>
|
||||
Due to production processes, there could be differences between the Yocto Project
|
||||
documentation bundled in a released tarball and the
|
||||
<ulink url='&YOCTO_DOCS_QS_URL;'>Yocto Project Quick Start</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.
|
||||
</note>
|
||||
</section>
|
||||
|
||||
<section id='yp-intro'>
|
||||
@@ -288,8 +281,9 @@
|
||||
<title>Ubuntu and Debian</title>
|
||||
|
||||
<para>
|
||||
The essential packages you need for a supported Ubuntu
|
||||
or Debian distribution are shown in the following command:
|
||||
The essential and graphical support packages you need for a
|
||||
supported Ubuntu or Debian distribution are shown in the
|
||||
following command:
|
||||
<literallayout class='monospaced'>
|
||||
$ sudo apt-get install &UBUNTU_HOST_PACKAGES_ESSENTIAL; libsdl1.2-dev xterm
|
||||
</literallayout>
|
||||
@@ -300,8 +294,8 @@
|
||||
<title>Fedora</title>
|
||||
|
||||
<para>
|
||||
The essential packages you need for a supported Fedora distribution
|
||||
are shown in the following command:
|
||||
The essential and graphical packages you need for a supported
|
||||
Fedora distribution are shown in the following command:
|
||||
<literallayout class='monospaced'>
|
||||
$ sudo yum install &FEDORA_HOST_PACKAGES_ESSENTIAL; SDL-devel xterm
|
||||
</literallayout>
|
||||
@@ -309,11 +303,11 @@
|
||||
</section>
|
||||
|
||||
<section id='opensuse'>
|
||||
<title>openSUSE</title>
|
||||
<title>OpenSUSE</title>
|
||||
|
||||
<para>
|
||||
The essential packages you need for a supported openSUSE
|
||||
distribution are shown in the following command:
|
||||
The essential and graphical packages you need for a supported
|
||||
OpenSUSE distribution are shown in the following command:
|
||||
<literallayout class='monospaced'>
|
||||
$ sudo zypper install &OPENSUSE_HOST_PACKAGES_ESSENTIAL; libSDL-devel xterm
|
||||
</literallayout>
|
||||
@@ -324,8 +318,8 @@
|
||||
<title>CentOS</title>
|
||||
|
||||
<para>
|
||||
The essential packages you need for a supported CentOS
|
||||
distribution are shown in the following command:
|
||||
The essential and graphical packages you need for a supported
|
||||
CentOS distribution are shown in the following command:
|
||||
<literallayout class='monospaced'>
|
||||
$ sudo yum install &CENTOS_HOST_PACKAGES_ESSENTIAL; SDL-devel xterm
|
||||
</literallayout>
|
||||
@@ -346,8 +340,8 @@
|
||||
<ulink url="&YOCTO_HOME_URL;">Yocto Project website</ulink>
|
||||
clicking "Downloads" in the navigation pane to the left to view all
|
||||
available Yocto Project releases.
|
||||
Be sure to scroll down and look for "Yocto Project" under the
|
||||
"Type" heading in the list.
|
||||
Current and archived releases are available for download to the
|
||||
right.
|
||||
Nightly and developmental builds are also maintained at
|
||||
<ulink url="&YOCTO_AB_NIGHTLY_URL;"></ulink>.
|
||||
However, for this document a released version of Yocto Project is used.
|
||||
@@ -482,8 +476,9 @@
|
||||
By default, the target architecture for the build is <filename>qemux86</filename>,
|
||||
which produces an image that can be used in the QEMU emulator and is targeted at an
|
||||
<trademark class='registered'>Intel</trademark> 32-bit based architecture.
|
||||
To change this default, edit the value of the <filename>MACHINE</filename> variable
|
||||
in the configuration file before launching the build.
|
||||
To change this default, edit the value of the
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#var-MACHINE'><filename>MACHINE</filename></ulink>
|
||||
variable in the configuration file before launching the build.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
@@ -719,10 +714,10 @@
|
||||
|
||||
Where:
|
||||
<<emphasis>profile</emphasis>> is the filesystem image's profile:
|
||||
lsb, lsb-dev, lsb-sdk, lsb-qt3, minimal, minimal-dev, sato, sato-dev, or sato-sdk.
|
||||
For information on these types of image profiles, see the
|
||||
"<ulink url='&YOCTO_DOCS_REF_URL;#ref-images'>Images</ulink>" chapter
|
||||
in the Yocto Project Reference Manual.
|
||||
lsb, lsb-dev, lsb-sdk, lsb-qt3, minimal, minimal-dev, sato,
|
||||
sato-dev, or sato-sdk. For information on these types of image
|
||||
profiles, see the "<ulink url='&YOCTO_DOCS_REF_URL;#ref-images'>Images</ulink>" chapter in the Yocto Project
|
||||
Reference Manual.
|
||||
|
||||
<<emphasis>arch</emphasis>> is a string representing the target architecture:
|
||||
x86, x86-64, ppc, mips, or arm.
|
||||
|
||||
@@ -13,19 +13,23 @@ DISTRO_PN_ALIAS_pn-aaina = "Intel"
|
||||
DISTRO_PN_ALIAS_pn-abiword-embedded = "Fedora=abiword Ubuntu=abiword"
|
||||
DISTRO_PN_ALIAS_pn-adt-installer = "Intel"
|
||||
DISTRO_PN_ALIAS_pn-alsa-state = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-alsa-utils-alsaconf = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-atk = "Fedora=atk OpenSuSE=atk"
|
||||
DISTRO_PN_ALIAS_pn-atk-native = "Fedora=atk OpenSuSE=atk"
|
||||
DISTRO_PN_ALIAS_pn-augeas = "Ubuntu=libaugeas0 Debian=libaugeas0"
|
||||
DISTRO_PN_ALIAS_pn-avahi-ui = "Ubuntu=avahi-discover Debian=avahi-discover"
|
||||
DISTRO_PN_ALIAS_pn-babeltrace = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-bdwgc = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-bigreqsproto = "Meego=xorg-x11-proto-bigreqsproto"
|
||||
DISTRO_PN_ALIAS_pn-bjam-native = "OpenSuSE=boost-jam Debina=bjam"
|
||||
DISTRO_PN_ALIAS_pn-blktool = "Debian=blktool Mandriva=blktool"
|
||||
DISTRO_PN_ALIAS_pn-bluez4= "Fedora=bluez Ubuntu=bluez Debian=bluez-utils Opensuse=bluez"
|
||||
DISTRO_PN_ALIAS_pn-bluez4="Meego=bluz Fedora=bluz Ubuntu=bluz OpenSuSE=bluz Mandriva=bluz"
|
||||
DISTRO_PN_ALIAS_pn-bluez4 = "Ubuntu=bluez Debian=bluez-utils"
|
||||
DISTRO_PN_ALIAS_pn-bluez5 = "Fedora=bluez Opensuse=bluez"
|
||||
DISTRO_PN_ALIAS_pn-bluez-dtl1-workaround = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-btrfs-tools = "Debian=btrfs-tools Fedora=btrfs-progs"
|
||||
DISTRO_PN_ALIAS_pn-builder = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-build-appliance-image = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-calibrateproto = "OSPDT upstream=http://cgit.freedesktop.org/xorg/lib/libXCalibrate/"
|
||||
DISTRO_PN_ALIAS_pn-builder = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-buildtools-tarball = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-calibrateproto = "OSPDT upstream=http://cgit.freedesktop.org/xorg/proto/calibrateproto"
|
||||
DISTRO_PN_ALIAS_pn-cdrtools = "OpenSUSE=cdrtools OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-chkconfig-alternatives-native = "Mandriva=chkconfig Debian=chkconfig"
|
||||
@@ -36,44 +40,51 @@ DISTRO_PN_ALIAS_pn-claws-plugin-rssyl = "Fedora=claws-mail-plugins OpenSuSE=claw
|
||||
DISTRO_PN_ALIAS_pn-clipboard-manager = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-clutter = "Fedora=clutter OpenSuse=clutter Ubuntu=clutter-1.0 Mandriva=clutter Debian=clutter"
|
||||
DISTRO_PN_ALIAS_pn-clutter-1.8 = "Fedora=clutter OpenSuse=clutter Ubuntu=clutter-1.0 Mandriva=clutter Debian=clutter"
|
||||
DISTRO_PN_ALIAS_pn-clutter-gst-1.0 = "Debian=clutter-gst Ubuntu=clutter-gst Fedora=clutter-gst"
|
||||
DISTRO_PN_ALIAS_pn-clutter-gst-1.8 = "Fedora=clutter-gst Debian=libclutter-gst"
|
||||
DISTRO_PN_ALIAS_pn-clutter-gtk-1.0 = "Debian=clutter-gtk Ubuntu=clutter-gtk Fedora=clutter-gtk"
|
||||
DISTRO_PN_ALIAS_pn-clutter-gtk-1.8 = "Fedora=clutter-gtk OpenSuSE=clutter-gtk Ubuntu=clutter-gtk-0.10 Mandriva=clutter-gtk Debian=clutter-gtk"
|
||||
DISTRO_PN_ALIAS_pn-cogl-1.0 = "Debian=cogl Ubuntu=cogl Fedora=cogl"
|
||||
DISTRO_PN_ALIAS_pn-cogl = "Fedora=cogl OpenSuse=cogl Ubuntu=cogl Mandriva=cogl Debian=cogl"
|
||||
DISTRO_PN_ALIAS_pn-compositeproto = "Meego=xorg-x11-proto-compositeproto"
|
||||
DISTRO_PN_ALIAS_pn-connman-gnome = "Intel"
|
||||
DISTRO_PN_ALIAS_pn-connman = "Meego=connman"
|
||||
DISTRO_PN_ALIAS_pn-connman-conf = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-connman-gnome = "Intel"
|
||||
DISTRO_PN_ALIAS_pn-console-tools = "Debian=console-tools Ubuntu=console-tools"
|
||||
DISTRO_PN_ALIAS_pn-core-console = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-base = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-basic = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-clutter = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-core = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-lsb-dev = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-lsb = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-lsb-dev = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-lsb-qt3 = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-lsb-sdk = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-minimal = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-minimal-dev = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-minimal-directdisk = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-minimal-initramfs = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-minimal-live = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-minimal-mtdutils = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-minimal = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-rt = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-rt-sdk = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-sato = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-sato-dev = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-sato-directdisk = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-sato-live = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-sato = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-sato-sdk = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-sato-sdk-directdisk = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-sato-sdk-live = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-sato-sdk = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-sdk = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-weston = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-core-image-x11 = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-cross-localedef = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-cwautomacros= "OSPDT upstream=http://cwautomacros.berlios.de/"
|
||||
DISTRO_PN_ALIAS_pn-cwautomacros = "OSPDT upstream=http://cwautomacros.berlios.de/"
|
||||
DISTRO_PN_ALIAS_pn-damageproto = "Meego=xorg-x11-proto-damageproto"
|
||||
DISTRO_PN_ALIAS_pn-db = "Debian=db5.1 Ubuntu=db5.1"
|
||||
DISTRO_PN_ALIAS_pn-dbus-ptest = "Fedora=dbus Ubuntu=dbus"
|
||||
DISTRO_PN_ALIAS_pn-dbus-wait = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-depmodwrapper-cross = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-directfb-examples = "Debian=directfb Fedora=directfb"
|
||||
DISTRO_PN_ALIAS_pn-distcc = "Debian=distcc Fedora=distcc"
|
||||
DISTRO_PN_ALIAS_pn-distcc-config = "OpenedHand"
|
||||
@@ -91,6 +102,10 @@ DISTRO_PN_ALIAS_pn-eee-acpi-scripts = "Debian=eeepc-acpi-scripts Ubuntu=eeepc-ac
|
||||
DISTRO_PN_ALIAS_pn-eglibc = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-eglibc-initial = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-eglibc-locale = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-eglibc-mtrace = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-eglibc-scripts = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-eglinfo-fb = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-eglinfo-x11 = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-emgd-driver-bin = "Intel"
|
||||
DISTRO_PN_ALIAS_pn-encodings = "Ubuntu=xfonts-encodings Mandriva=x11-font-encodings Debian=xfonts-encodings"
|
||||
DISTRO_PN_ALIAS_pn-evieext = "Meego=xorg-x11-proto-evieext Debian=x11proto-evie"
|
||||
@@ -113,26 +128,34 @@ DISTRO_PN_ALIAS_pn-gcc-crosssdk-initial = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-gccmakedep = "Mandriva=gccmakedep Ubuntu=xutils-dev"
|
||||
DISTRO_PN_ALIAS_pn-gcc-runtime = "Ubuntu=gcc Fedora=gcc"
|
||||
DISTRO_PN_ALIAS_pn-gconf-dbus = "Meego=GConf-dbus"
|
||||
DISTRO_PN_ALIAS_pn-gdk-pixbuf-csource-native = "Debian=libgdk-pixbuf2.0-0 Fedora=gdk-pixbuf2"
|
||||
DISTRO_PN_ALIAS_pn-gdk-pixbuf = "Debian=libgdk-pixbuf2.0 Fedora=gdk-pixbuf"
|
||||
DISTRO_PN_ALIAS_pn-gdk-pixbuf-csource-native = "Debian=libgdk-pixbuf2.0-0 Fedora=gdk-pixbuf2"
|
||||
DISTRO_PN_ALIAS_pn-gettext-minimal-native = "Debian=gettext Fedora=gettext"
|
||||
DISTRO_PN_ALIAS_pn-glib-2.0 = "Meego=glib2 Fedora=glib2 OpenSuSE=glib2 Ubuntu=glib2.0 Mandriva=glib2.0 Debian=glib2.0"
|
||||
DISTRO_PN_ALIAS_pn-glproto = "Meego=xorg-x11-proto-glproto"
|
||||
DISTRO_PN_ALIAS_pn-gnu-config = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-grub-efi-i586 = "Ubuntu=grub Fedora=grub"
|
||||
DISTRO_PN_ALIAS_pn-grub-efi-x86-64-native = "Ubuntu=grub Fedora=grub"
|
||||
DISTRO_PN_ALIAS_pn-gst-ffmpeg = "Mandriva=gstreamer0.10-ffmpeg Debian=gstreamer0.10-ffmpeg"
|
||||
DISTRO_PN_ALIAS_pn-gst-fluendo-mp3 = "Debian=gstreamer0.10-fluendo-mp3 Ubuntu=gstreamer0.10-fluendo-mp3"
|
||||
DISTRO_PN_ALIAS_pn-gst-fluendo-mpegdemux = "Ubuntu=gstreamer0.10-fluendo-mpegdemux Debian=gstreamer0.10-fluendo-mpegdemux"
|
||||
DISTRO_PN_ALIAS_pn-gst-meta-base = "Meego=gstreamer Fedora=gstreamer OpenSuSE=gstreamer Ubuntu=gstreamer0.10 Mandriva=gstreamer0.10 Debian=gstreamer0.10"
|
||||
DISTRO_PN_ALIAS_pn-gst-openmax="OSPDT upstream=http://cgit.freedesktop.org/gstreamer/gst-openmax"
|
||||
DISTRO_PN_ALIAS_pn-gst-openmax = "OSPDT upstream=http://cgit.freedesktop.org/gstreamer/gst-openmax"
|
||||
DISTRO_PN_ALIAS_pn-gst-plugin-bluetooth = "Ubuntu=libgstreamer-plugins-base Fedora=gstreamer-plugins-base"
|
||||
DISTRO_PN_ALIAS_pn-gst-plugins-bad = "Fedora=gstreamer-plugins-bad-free OpenSuSE=gstreamer-plugins-bad Debian=gst-plugins-bad0.10"
|
||||
DISTRO_PN_ALIAS_pn-gst-plugins-base = "Meego=gst-plugins-base Fedora=gstreamer-plugins-base OpenSuSE=gstreamer-plugins-base Ubuntu=gst-plugins-base0.10 Mandriva=gstreamer0.10-plugins-base Debian=gst-plugins-base0.10"
|
||||
DISTRO_PN_ALIAS_pn-gst-plugins-gl = "Debian=gstreamer0.10-plugins-gl OpenSuSE=gstreamer-0_10-plugins-gl"
|
||||
DISTRO_PN_ALIAS_pn-gst-plugins-good = "Meego=gst-plugins-good Fedora=gstreamer-plugins-good OpenSuSE=gstreamer-plugins-good Ubuntu=gst-plugins-good0.10 Mandriva=gstreamer0.10-plugins-good Debian=gst-plugins-good0.10"
|
||||
DISTRO_PN_ALIAS_pn-gst-plugins-ugly = "OpenSuSE=gstreamer-plugins-ugly Mandriva=gstreamer0.10-plugins-ugly Debian=gst-plugins-ugly0.10"
|
||||
DISTRO_PN_ALIAS_pn-gstreamer1.0 = "Debian=gstreamer1.0 Ubuntu=gstreamer1.0"
|
||||
DISTRO_PN_ALIAS_pn-gstreamer1.0-plugins-bad = "Debian=gstreamer1.0-plugins-bad Ubuntu=gstreamer1.0-plugins-bad"
|
||||
DISTRO_PN_ALIAS_pn-gstreamer1.0-plugins-base = "Debian=gstreamer1.0-plugins-base Ubuntu=gstreamer1.0-plugins-base"
|
||||
DISTRO_PN_ALIAS_pn-gstreamer1.0-plugins-good = "Debian=gstreamer1.0-plugins-good Ubuntu=gstreamer1.0-plugins-bad"
|
||||
DISTRO_PN_ALIAS_pn-gstreamer = "Debian=gstreamer1.0 Ubuntu=gstreamer1.0"
|
||||
DISTRO_PN_ALIAS_pn-gtk+ = "Meego=gtk2 Fedora=gtk2 OpenSuSE=gtk2 Ubuntu=gtk+2.0 Mandriva=gtk+2.0 Debian=gtk+2.0"
|
||||
DISTRO_PN_ALIAS_pn-gtk+3 = "Ubuntu=gtk+3.0 Debian=gtk+3.0 Fedora=gtk3"
|
||||
DISTRO_PN_ALIAS_pn-gtk-doc-stub = "Fedora=gtk-doc Ubuntu=gtk-doc"
|
||||
DISTRO_PN_ALIAS_pn-gtk-engines = "Fedora=gtk2-engines OpenSuSE=gtk2-engines Ubuntu=gtk2-engines Mandriva=gtk-engines2 Debian=gtk2-engines"
|
||||
DISTRO_PN_ALIAS_pn-gtk+ = "Meego=gtk2 Fedora=gtk2 OpenSuSE=gtk2 Ubuntu=gtk+2.0 Mandriva=gtk+2.0 Debian=gtk+2.0"
|
||||
DISTRO_PN_ALIAS_pn-gtk-sato-engine = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-gtk-theme-torturer = "OSPDT upstream=http://wiki.laptop.org/go/GTK_for_OLPC"
|
||||
DISTRO_PN_ALIAS_pn-gtk-update-icon-cache-native = "OSPDT"
|
||||
@@ -140,19 +163,19 @@ DISTRO_PN_ALIAS_pn-hello-mod = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-hostap-conf = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-hwlatdetect = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-icecc-create-env = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-imake = "Mandriva=xutils Ubuntu=xutils"
|
||||
DISTRO_PN_ALIAS_pn-init-ifupdown = "Debian=ifupdown Ubuntu=ifupdown"
|
||||
DISTRO_PN_ALIAS_pn-initramfs-boot = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-initramfs-framework = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-initramfs-live-boot = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-initramfs-live-install = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-initramfs-live-install-efi = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-initscripts = "Fedora=initscripts Mandravia=initscripts"
|
||||
DISTRO_PN_ALIAS_pn-inputproto = "Meego=xorg-x11-proto-inputproto"
|
||||
DISTRO_PN_ALIAS_pn-iproute2 = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-jpeg="OpenSuSE=libjpeg Ubuntu=libjpeg62"
|
||||
DISTRO_PN_ALIAS_pn-jpeg = "OpenSuSE=libjpeg Ubuntu=libjpeg62"
|
||||
DISTRO_PN_ALIAS_pn-kbproto = "Meego=xorg-x11-proto-kbproto Ubuntu=x11proto-kb-dev Debian=x11proto-kb-dev"
|
||||
DISTRO_PN_ALIAS_pn-kconfig-frontends = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-kernelshark = "Mandriva=kernelshark Ubuntu=kernelshark"
|
||||
DISTRO_PN_ALIAS_pn-kern-tools-native = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-kern-tools-native = "Windriver"
|
||||
DISTRO_PN_ALIAS_pn-keymaps = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-kf = "OSPDT"
|
||||
@@ -160,50 +183,59 @@ DISTRO_PN_ALIAS_pn-lame = "Debian=lame Ubuntu=lame"
|
||||
DISTRO_PN_ALIAS_pn-latencytop = "Meego=latencytop Fedora=latencytop Debian=latencytop OpenSuSE=latencytop"
|
||||
DISTRO_PN_ALIAS_pn-ldconfig-native = "Ubuntu=libc-bin Fedora=glibc"
|
||||
DISTRO_PN_ALIAS_pn-liba52 = "Mandriva=a52dec Debian=a52dec"
|
||||
DISTRO_PN_ALIAS_pn-libacpi="Ubuntu=libacpi Mandriva=libacpi"
|
||||
DISTRO_PN_ALIAS_pn-libacpi = "Ubuntu=libacpi Mandriva=libacpi"
|
||||
DISTRO_PN_ALIAS_pn-libatomics-ops = "Meego=libatomic-ops Debian=libatomic-ops Ubuntu=libatomic-ops OpenSuSE=libatomic-ops Mandriva=libatomic-ops"
|
||||
DISTRO_PN_ALIAS_pn-libcgroup = "Ubuntu=libcgroup1 Debian=libcgroup1"
|
||||
DISTRO_PN_ALIAS_pn-libcheck = "Ubuntu=check Fedora=check OpenSuSE=check"
|
||||
DISTRO_PN_ALIAS_pn-libclass-isa-perl = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-libdrm-poulsbo = "Debian=libdrm-intel1 Ubuntu=libdrm-intel1"
|
||||
DISTRO_PN_ALIAS_pn-libdumpvalue-perl = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-libenv-perl = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-libfakekey="Meego1.0=libfakekey Debian=libfakekey"
|
||||
DISTRO_PN_ALIAS_pn-libfakekey = "Meego1.0=libfakekey Debian=libfakekey"
|
||||
DISTRO_PN_ALIAS_pn-libfile-checktree-perl = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-libfribidi = "OpenSuSE=fribidi Ubuntu=fribidi Mandriva=fribidi Debian=fribidi"
|
||||
DISTRO_PN_ALIAS_pn-libgcc = "Debian=libgcc4 Ubuntu=libgcc1 OpenSuSE=libgcc46"
|
||||
DISTRO_PN_ALIAS_pn-libgdbus = "Intel"
|
||||
DISTRO_PN_ALIAS_pn-libglade = "Meego=libglade2 Fedora=libglade2 OpenSuSE=libglade2 Ubuntu=libglade2 Mandriva=libglade2.0 Debian=libglade2"
|
||||
DISTRO_PN_ALIAS_pn-libgu = "OpenSuSE=glu OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-libglu = "Debian=libglu Ubuntu=libglu Opensuse=mesa-libglu"
|
||||
DISTRO_PN_ALIAS_pn-libgsmd = "Fedora=gsm Ubuntu=libgsm Debian=libgsm Opensuse=libgsm"
|
||||
DISTRO_PN_ALIAS_pn-libgtkstylus = "Debian=libgtkstylus Ubuntu=libgtkstylus"
|
||||
DISTRO_PN_ALIAS_pn-libgu = "OpenSuSE=glu OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-libi18n-collate-perl = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-libical = "Ubuntu=libical Fedora=libical"
|
||||
DISTRO_PN_ALIAS_pn-libiconv = "Fedora=mingw-libiconv Opensuse=cross-mingw-libiconv"
|
||||
DISTRO_PN_ALIAS_pn-libjson = "Ubuntu=libjson0-dev Debian=libjson0-dev"
|
||||
DISTRO_PN_ALIAS_pn-libksba = "Fedora=libksba Debian=libksba8"
|
||||
DISTRO_PN_ALIAS_pn-liblbxutil = "Mandriva=liblbxutil OpenSuse=xorg-x11-devel"
|
||||
DISTRO_PN_ALIAS_pn-libmpc = "Fedora=libmpc OpenSuse=libmpc2"
|
||||
DISTRO_PN_ALIAS_pn-libnewt = "Debian=libnewt0.52 Fedora=newt"
|
||||
DISTRO_PN_ALIAS_pn-libnewt-python = "Ubuntu=python-newt Fedora=newt-python"
|
||||
DISTRO_PN_ALIAS_pn-libnss-mdns = "Meego=nss-mdns OpenSuSE=nss-mdns Ubuntu=nss-mdns Mandriva=nss_mdns Debian=nss-mdns"
|
||||
DISTRO_PN_ALIAS_pn-libomxil = "OSPDT upstream=http://omxil.sourceforge.net/"
|
||||
DISTRO_PN_ALIAS_pn-libowl-av = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-libowl = "Debian=owl OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-libowl-av = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-libpam = "Meego=pam Fedora=pam OpenSuSE=pam Ubuntu=pam Mandriva=pam Debian=pam"
|
||||
DISTRO_PN_ALIAS_pn-libpcre = "Mandriva=libpcre0 Fedora=pcre"
|
||||
DISTRO_PN_ALIAS_pn-libpng12 = "Debian=libpng12-0 Fedora=libpng"
|
||||
DISTRO_PN_ALIAS_pn-libpod-plainer-perl = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-libsamplerate0 = "Meego=libsamplerate Fedora=libsamplerate OpenSuSE=libsamplerate Ubuntu=libsamplerate Mandriva=libsamplerate Debian=libsamplerate"
|
||||
DISTRO_PN_ALIAS_pn-libsdl = "Fedora=SDL Opensuse=SDL"
|
||||
DISTRO_PN_ALIAS_pn-libsdl2 = "Fedora=sdl2 Opensuse=libsdl2 Ubuntu=libsdl2 Debian=libsdl2"
|
||||
DISTRO_PN_ALIAS_pn-libsndfile1 = "Meego=libsndfile Fedora=libsndfile OpenSuSE=libsndfile Ubuntu=libsndfile Mandriva=libsndfile Debian=libsndfile"
|
||||
DISTRO_PN_ALIAS_pn-libsoup-2.4 = "Meego=libsoup Fedora=libsoup OpenSuSE=libsoup Ubuntu=libsoup2.4 Mandriva=libsoup Debian=libsoup2.4"
|
||||
DISTRO_PN_ALIAS_pn-libsync = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-libtelepathy = "Debian=libtelepathy2 Ubuntu=libtelepathy2"
|
||||
DISTRO_PN_ALIAS_pn-libtimedate-perl = "Debian=libtimedate-perl Ubuntu=libtimedate-perl"
|
||||
DISTRO_PN_ALIAS_pn-liburcu = "Fedora=userspace-rcu Ubuntu=liburcu0"
|
||||
DISTRO_PN_ALIAS_pn-libusb1 = "Debian=libusb-1.0-0 Fedora=libusb1"
|
||||
DISTRO_PN_ALIAS_pn-libusb1-native = "Debian=libusb-1.0-0 Fedora=libusb1"
|
||||
DISTRO_PN_ALIAS_pn-libusb-compat = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-libx11 = "Debian=libx11-6 Fedora=libX11 Ubuntu=libx11-6 OpenSuSE=xorg-x11-libX11"
|
||||
DISTRO_PN_ALIAS_pn-libx11-diet = "Debian=libx11-6 Fedora=libX11 Ubuntu=libx11-6 OpenSuSE=xorg-x11-libX11"
|
||||
DISTRO_PN_ALIAS_pn-libxcalibrate = "OSPDT upstream=http://cgit.freedesktop.org/xorg/lib/libXCalibrate/"
|
||||
DISTRO_PN_ALIAS_pn-libxfontcache = "Mandriva=libxfontcache Debian=libxfontcache"
|
||||
DISTRO_PN_ALIAS_pn-libxft = "Mandriva=libxft Debian=libxft2 Ubuntu=libxft2"
|
||||
DISTRO_PN_ALIAS_pn-libxkbcommon = "Fedora=libxkbcommon Debian=libxkbcommon"
|
||||
DISTRO_PN_ALIAS_pn-libxprintapputil = "Debian=libxprintapputil Ubuntu=libxprintapputil1 Mandriva=libxprintapputil"
|
||||
DISTRO_PN_ALIAS_pn-libxscrnsaver = "Fedora=libXScrnSaver Ubuntu=libxss1 Mandriva=libxscrnsaver"
|
||||
DISTRO_PN_ALIAS_pn-libxsettings-client = "Debian=libxsettings-client0 Ubuntu=libxsettings-client0 Mandriva=libXsettings-client0"
|
||||
@@ -218,10 +250,13 @@ DISTRO_PN_ALIAS_pn-linux-yocto-tiny = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-lsbinitscripts = "Windriver"
|
||||
DISTRO_PN_ALIAS_pn-lsbsetup = "Windriver"
|
||||
DISTRO_PN_ALIAS_pn-lsbtest = "Windriver"
|
||||
DISTRO_PN_ALIAS_pn-ltp = "Ubuntu=ltp"
|
||||
DISTRO_PN_ALIAS_pn-ltp = "Mandriva=ltp Ubuntu=ltp"
|
||||
DISTRO_PN_ALIAS_pn-lttng-modules = "OSPDT upstream=http://lttng.org/"
|
||||
DISTRO_PN_ALIAS_pn-lttng-tools = "OSPDT upstream=http://lttng.org/"
|
||||
DISTRO_PN_ALIAS_pn-lttng-ust = "OSPDT upstream=http://lttng.org/"
|
||||
DISTRO_PN_ALIAS_pn-lzo = "Debian=liblzo Ubuntu=liblzo Fedora=lzp"
|
||||
DISTRO_PN_ALIAS_pn-lzo-native = "Debian=liblzo Ubuntu=liblzo Fedora=lzp"
|
||||
DISTRO_PN_ALIAS_pn-mailx = "Debian=bsd-mailx Ubuntu=bsd-mailx"
|
||||
DISTRO_PN_ALIAS_pn-makedepend = "Mandriva=makedepend Ubuntu=xutils-dev"
|
||||
DISTRO_PN_ALIAS_pn-makedevs = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-matchbox-config-gtk = "OpenedHand"
|
||||
@@ -232,94 +267,117 @@ DISTRO_PN_ALIAS_pn-matchbox-panel-2 = "Debian=matchbox-panel Mandriva=matchbox-p
|
||||
DISTRO_PN_ALIAS_pn-matchbox-session = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-matchbox-session-sato = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-matchbox-terminal = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-matchbox-theme-sato-2 = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-matchbox-theme-sato = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-matchbox-theme-sato-2 = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-matchbox-themes-extra = "Ubuntu=matchbox-themes-extra Mandriva=matchbox-themes-extra"
|
||||
DISTRO_PN_ALIAS_pn-matchbox-themes-gtk = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-matchbox-wm-2 = "Mandriva=matchbox-window-manager Debian=matchbox-window-manager"
|
||||
DISTRO_PN_ALIAS_pn-matchbox-wm = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-matchbox-wm-2 = "Mandriva=matchbox-window-manager Debian=matchbox-window-manager"
|
||||
DISTRO_PN_ALIAS_pn-menu-cache = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-mesa = "Fedora=mesa Ubuntu=libgl1-mesa-dri"
|
||||
DISTRO_PN_ALIAS_pn-mesa-gl = "Fedora=mesa Ubuntu=libgl1-mesa-dri"
|
||||
DISTRO_PN_ALIAS_pn-mesa-glsl-native = "Fedora=mesa Ubuntu=libgl1-mesa-dri"
|
||||
DISTRO_PN_ALIAS_pn-meta-environment-i586 = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-meta-environment-qemux86 = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-meta-environment-qemux86-64 = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-meta-ide-support = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-meta-toolchain-gmae = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-meta-toolchain = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-meta-toolchain-gmae = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-meta-toolchain-qt = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-meta-toolchain-qte = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-mkfontdir = "Mandriva=mkfontdir Ubuntu=xfonts-utils Fedora=xorg-x11-font-utils"
|
||||
DISTRO_PN_ALIAS_pn-meta-toolchain-sdk = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-mini-x-session = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-mkfontdir = "Mandriva=mkfontdir Ubuntu=xfonts-utils Fedora=xorg-x11-font-utils"
|
||||
DISTRO_PN_ALIAS_pn-mkfontscale = "Mandriva=mkfontscale Ubuntu=xfonts-utils Fedora=xorg-x11-font-utils"
|
||||
DISTRO_PN_ALIAS_pn-mktemp = "Mandriva=mktemp Fedora=mktemp"
|
||||
DISTRO_PN_ALIAS_pn-moblin-proto = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-modutils-collateral = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-modutils-initscripts = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-msynctool = "OpenSuse=msynctool Mandriva=msynctool"
|
||||
DISTRO_PN_ALIAS_pn-mtd-utils = "Debian=mtd-utils Ubuntu=mtd-utils"
|
||||
DISTRO_PN_ALIAS_pn-mx-1.0 = "Ubuntu=mx Debian=mx Fedora=mx"
|
||||
DISTRO_PN_ALIAS_pn-n450-audio = "Intel"
|
||||
DISTRO_PN_ALIAS_pn-nativesdk-libusb1 = "Debian=libusb-1.0-0 Fedora=libusb1"
|
||||
DISTRO_PN_ALIAS_pn-nativesdk-lzo = "Debian=liblzo Ubuntu=liblzo Fedora=lzp"
|
||||
DISTRO_PN_ALIAS_pn-nativesdk-packagegroup-qt-toolchain-host = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-nativesdk-pkgconfig = "Ubuntu=pkg-config Fedora=pkgconfig"
|
||||
DISTRO_PN_ALIAS_pn-nativesdk-python-git = "Debian=python-git Fedora=GitPython"
|
||||
DISTRO_PN_ALIAS_pn-nativesdk-readline = "Fedora=readline Ubuntu=readline-common"
|
||||
DISTRO_PN_ALIAS_pn-neard = "Intel"
|
||||
DISTRO_PN_ALIAS_pn-network-suspend-scripts = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-nfs-export-root = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-nss-myhostname = "Meego=nss-mdns OpenSuSE=nss-mdns Ubuntu=nss-mdns Mandriva=nss_mdns Debian=nss-mdns"
|
||||
DISTRO_PN_ALIAS_pn-npth = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-nss-myhostname = "Meego=nss-mdns OpenSuSE=nss-mdns Ubuntu=nss-mdns Mandriva=nss_mdns Debian=nss-mdns"
|
||||
DISTRO_PN_ALIAS_pn-ocf-linux = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-ofono = "Debian=ofono Ubuntu=ofono"
|
||||
DISTRO_PN_ALIAS_pn-oh-puzzles = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-opkg = "OSPDT upstream=http://svn.openmoko.org/trunk/src/tar"
|
||||
DISTRO_PN_ALIAS_pn-opkg-collateral = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-opkg-config-base = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-opkg-nogpg = "OSPDT upstream=http://svn.openmoko.org/trunk/src/tar"
|
||||
DISTRO_PN_ALIAS_pn-opkg = "OSPDT upstream=http://svn.openmoko.org/trunk/src/tar"
|
||||
DISTRO_PN_ALIAS_pn-opkg-utils = "OSPDT upstream=http://svn.openmoko.org/trunk/src/target/opkg/"
|
||||
DISTRO_PN_ALIAS_pn-oprofileui = "Fedora=oprofileui Ubuntu=oprofile-gui Debian=oprofile-gui"
|
||||
DISTRO_PN_ALIAS_pn-oprofileui-server = "Fedora=oprofileui Ubuntu=oprofile-gui Debian=oprofile-gui"
|
||||
DISTRO_PN_ALIAS_pn-owl-video = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-package-index = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-base = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-basic = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-boot = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-buildessential = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-clutter = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-console = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-device-devel = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-directfb = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-eclipse-debug = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-lsb = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-nfs = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-qt = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-qt4e = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-sdk-gmae = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-sdk = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-sdk-gmae = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-ssh-dropbear = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-ssh-openssh = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-standalone-gmae-sdk-target = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-standalone-sdk-target = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-tools-debug = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-tools = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-tools-debug = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-tools-profile = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-tools-testapps = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-x11-mini = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-x11 = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-x11-base = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-x11-mini = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-x11-sato = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-core-x11-xserver = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-cross-canadian-i586 = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-cross-canadian-qemux86 = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-cross-canadian-qemux86-64 = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-qt4e = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-qte-toolchain-host = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-qte-toolchain-target = "Intel"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-qt-toolchain-target = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-sdk-host = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-self-hosted = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-packagegroup-toolset-native = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-package-index = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-perf = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-pkgconfig = "Ubuntu=pkg-config Fedora=pkgconfig"
|
||||
DISTRO_PN_ALIAS_pn-pkgconfig-native = "Ubuntu=pkg-config Fedora=pkgconfig"
|
||||
DISTRO_PN_ALIAS_pn-pointercal = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-pointercal-xinput = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-poky-feed-config-opkg = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-pong-clock = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-portmap = "OpenSuSE=portmap"
|
||||
DISTRO_PN_ALIAS_pn-powertop ="Meego=powertop Fedora=powertop Debian=powertop OpenSuSE=powertop Mandriva=powertop"
|
||||
DISTRO_PN_ALIAS_pn-portmap = "Debian=rpcbind Fedora=rpcbind"
|
||||
DISTRO_PN_ALIAS_pn-powertop = "Meego=powertop Fedora=powertop Debian=powertop OpenSuSE=powertop Mandriva=powertop"
|
||||
DISTRO_PN_ALIAS_pn-ppp-dialin = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-printproto = "Debian=x11proto-print-dev Ubuntu=x11proto-print-dev Mandriva=x11-proto-devel"
|
||||
DISTRO_PN_ALIAS_pn-pseudo = "Windriver"
|
||||
DISTRO_PN_ALIAS_pn-psplash = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-ptest-runner = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-puzzles = "Debian=sgt-puzzles"
|
||||
DISTRO_PN_ALIAS_pn-puzzles = "Debian=sgt-puzzles Fedora=puzzles"
|
||||
DISTRO_PN_ALIAS_pn-python-argparse = "Fedora=python-argparse OpenSuSE=python-argparse"
|
||||
DISTRO_PN_ALIAS_pn-python-argparse-native = "Fedora=python-argparse OpenSuSE=python-argparse"
|
||||
DISTRO_PN_ALIAS_pn-python-dbus = "Ubuntu=python-dbus Debian=python-dbus Mandriva=python-dbus"
|
||||
DISTRO_PN_ALIAS_pn-python-git = "Debian=python-git Fedora=GitPython"
|
||||
DISTRO_PN_ALIAS_pn-python-gst = "OpenSuSE=python-gstreamer Ubuntu=gst0.10-python Debian=gst0.10-python"
|
||||
DISTRO_PN_ALIAS_pn-python-pycairo = "Meego=pycairo Fedora=pycairo Ubuntu=pycairo Debian=pycairo"
|
||||
DISTRO_PN_ALIAS_pn-python-pycurl = "Debian=python-pycurl Ubuntu=python-pycurl"
|
||||
@@ -328,18 +386,18 @@ DISTRO_PN_ALIAS_pn-python-pygtk = "Debian=python-gtk2 Fedora=pygtk2 OpenSuSE=pyt
|
||||
DISTRO_PN_ALIAS_pn-python-pyrex = "Mandriva=python-pyrex Ubuntu=python-pyrex"
|
||||
DISTRO_PN_ALIAS_pn-python-scons = "Fedora=scons OpenSuSE=scons Ubuntu=scons Mandriva=scons Debian=scons"
|
||||
DISTRO_PN_ALIAS_pn-python-setuptools = "Mandriva=python-setup OpenSuSE=python-setup-git"
|
||||
DISTRO_PN_ALIAS_pn-python-smartpm = "Debian=smart OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-python-smartpm = "Debian=smart OpenSuSE=smart"
|
||||
DISTRO_PN_ALIAS_pn-python-ZSI = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-qemu-helper = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-qemu-config = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-qemugl = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-qemu-helper = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-qemu-helper-native = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-qemu-helper-nativesdk = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-qmmp = "Fedora=qmmp"
|
||||
DISTRO_PN_ALIAS_pn-qemuwrapper-cross = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-qmmp = "Fedora=qmmp Debian=qmmp"
|
||||
DISTRO_PN_ALIAS_pn-qt4e-demo-image = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-qt4-embedded = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-qt4-graphics-system = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-qt4-native = "Fedora=qt4 Debian=qt4-dev-tools"
|
||||
DISTRO_PN_ALIAS_pn-qt4-native = "Mandriva=libqt4-devel Ubuntu=libqt4-dev"
|
||||
DISTRO_PN_ALIAS_pn-qt4-tools = "Mandriva=libqt4-devel Ubuntu=libqt4-dev"
|
||||
DISTRO_PN_ALIAS_pn-qt4-x11-free = "Ubuntu=qt-x11-free Debian=qt-x11-free"
|
||||
@@ -348,6 +406,8 @@ DISTRO_PN_ALIAS_pn-qt-mobility-embedded = "Ubuntu=qtmobility-dev Debian=qtmobili
|
||||
DISTRO_PN_ALIAS_pn-qt-mobility-x11 = "Ubuntu=qtmobility-dev Debian=qtmobility-dev"
|
||||
DISTRO_PN_ALIAS_pn-quicky = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-randrproto = "Meego=xorg-x11-proto-randrproto"
|
||||
DISTRO_PN_ALIAS_pn-readline = "Fedora=readline Debian=readline-common"
|
||||
DISTRO_PN_ALIAS_pn-readline-native = "Fedora=readline Debian=readline-common"
|
||||
DISTRO_PN_ALIAS_pn-recordproto = "Meego=xorg-x11-proto-recordproto"
|
||||
DISTRO_PN_ALIAS_pn-remake = "Mandriva=remake Debian=remake"
|
||||
DISTRO_PN_ALIAS_pn-renderproto = "Meego=xorg-x11-proto-renderproto"
|
||||
@@ -358,9 +418,12 @@ DISTRO_PN_ALIAS_pn-rt-tests = "Debian=rt-tests Ubuntu=rt-tests"
|
||||
DISTRO_PN_ALIAS_pn-run-postinsts = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-sato-icon-theme = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-sato-screenshot = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-sbc = "Fedora=sbc Debian=libsbc1"
|
||||
DISTRO_PN_ALIAS_pn-screenshot = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-scrnsaverproto = "Meego=xorg-x11-proto-scrnsaverproto Ubuntu=x11proto-scrnsaver-dev Debian=x11proto-scrnsaver-dev"
|
||||
DISTRO_PN_ALIAS_pn-settings-daemon = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-sgml-common = "OpenSuSE=sgml-common Fedora=sgml-common"
|
||||
DISTRO_PN_ALIAS_pn-sgml-common-native = "OpenSuSE=sgml-common Fedora=sgml-common"
|
||||
DISTRO_PN_ALIAS_pn-sgmlspl = "Debian=sgmlspl Ubuntu=sgmlspl"
|
||||
DISTRO_PN_ALIAS_pn-shadow-securetty = "Ubuntu=shadow Fedora=shadow"
|
||||
DISTRO_PN_ALIAS_pn-shadow-sysroot = "Ubuntu=shadow Fedora=shadow"
|
||||
@@ -369,9 +432,12 @@ DISTRO_PN_ALIAS_pn-shutdown-desktop = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-signgp-native = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-stat = "Debian=coreutils Fedora=coreutils"
|
||||
DISTRO_PN_ALIAS_pn-swabber-native = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-systemtap-uprobes = "Ubuntu=systemtap Debian=systemtap"
|
||||
DISTRO_PN_ALIAS_pn-sysklogd = "Debian=sysklogd Mandriva=sysklogd"
|
||||
DISTRO_PN_ALIAS_pn-sysprof = "Fedora=sysprof Debian=sysprof"
|
||||
DISTRO_PN_ALIAS_pn-systemd-compat-units = "Fedora=systemd Ubuntu=systemd"
|
||||
DISTRO_PN_ALIAS_pn-systemd-systemctl-native = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-systemd-systemdctl-native = "Fedora=systemd Ubuntu=systemd"
|
||||
DISTRO_PN_ALIAS_pn-systemtap-uprobes = "Ubuntu=systemtap Debian=systemtap"
|
||||
DISTRO_PN_ALIAS_pn-sysvinit-inittab = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-table = "Intel"
|
||||
DISTRO_PN_ALIAS_pn-tar-replacement-native = "OE-Core"
|
||||
@@ -399,14 +465,16 @@ DISTRO_PN_ALIAS_pn-videoproto = "Meego=xorg-x11-proto-videoproto"
|
||||
DISTRO_PN_ALIAS_pn-watchdog = "Debian=watchdog Ubuntu=watchdog Mandriva=watchdog"
|
||||
DISTRO_PN_ALIAS_pn-webkit-gtk = "Fedora=webkitgtk Ubuntu=libwebkit"
|
||||
DISTRO_PN_ALIAS_pn-web-webkit = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-weston = "Fedora=weston OpenSuSE=weston"
|
||||
DISTRO_PN_ALIAS_pn-weston-init = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-which = "Mandriva=which Fedora=which"
|
||||
DISTRO_PN_ALIAS_pn-wpa-supplicant = "Meego=wpa_supplicant Fedora=wpa_supplicant OpenSuSE=wpa_supplicant Ubuntu=wpasupplicant Mandriva=wpa_supplicant Debian=wpasupplicant"
|
||||
DISTRO_PN_ALIAS_pn-x11-common = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-x11perf = "Fedora=xorg-x11-apps Ubuntu=x11-apps"
|
||||
DISTRO_PN_ALIAS_pn-x11vnc = "Fedora=x11vnc Ubuntu=x11vnc"
|
||||
DISTRO_PN_ALIAS_pn-xcb-util-wm = "Debian=xcb-util Fedora=xcb-util"
|
||||
DISTRO_PN_ALIAS_pn-xcb-util-image = "Debian=xcb-util Fedora=xcb-util"
|
||||
DISTRO_PN_ALIAS_pn-xcb-util-keysyms = "Debian=xcb-util Fedora=xcb-util"
|
||||
DISTRO_PN_ALIAS_pn-xcb-util-wm = "Debian=xcb-util Fedora=xcb-util"
|
||||
DISTRO_PN_ALIAS_pn-xcmiscproto = "Meego=xorg-x11-proto-xcmiscproto"
|
||||
DISTRO_PN_ALIAS_pn-xcursor-transparent-theme = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-xdpyinfo = "Fedora=xorg-x11-utils Ubuntu=x11-utils"
|
||||
@@ -425,15 +493,17 @@ DISTRO_PN_ALIAS_pn-xf86miscproto = "Meego=xorg-x11-proto-xf86miscproto"
|
||||
DISTRO_PN_ALIAS_pn-xf86rushproto = "Meego=xorg-x11-proto-xf86rushproto"
|
||||
DISTRO_PN_ALIAS_pn-xf86-video-fbdev = "Ubuntu=xserver-xorg-video-fbdev Debian=xserver-xorg-video-fbdev"
|
||||
DISTRO_PN_ALIAS_pn-xf86-video-intel = "Debian=xserver-xorg-video-intel Fedora=xorg-x11-drv-intel Mandriva=x11-driver-video-intel Meego=xorg-x11-drv-intel Ubuntu=xserver-xorg-video-intel"
|
||||
DISTRO_PN_ALIAS_pn-xf86-video-modesetting = "Debian=xserver-xorg-video-modesetting Fedora=xf86-video-modesetting"
|
||||
DISTRO_PN_ALIAS_pn-xf86-video-omap = "Ubuntu=xf86-video-omap Debian=xf86-video-omap"
|
||||
DISTRO_PN_ALIAS_pn-xf86-video-omapfb = "OSPDT"
|
||||
DISTRO_PN_ALIAS_pn-xf86-video-vesa = "Debian=xserver-xorg-video-vesa Fedora=xorg-x11-drv-vesa Mandriva=x11-driver-video-vesa Ubuntu=xserver-xorg-video-vesa"
|
||||
DISTRO_PN_ALIAS_pn-xf86-video-vmware = "Debian=xserver-xorg-video-vmware Fedora=xorg-x11-drv-vmware Mandriva=x11-driver-video-vmware Ubuntu=xserver-xorg-video-vmware"
|
||||
DISTRO_PN_ALIAS_pn-xf86vidmodeproto = "Meego=xorg-x11-proto-xf86vidmodeproto Ubuntu=x11proto-xf86vidmode Debian=x11proto-xf86vidmode"
|
||||
DISTRO_PN_ALIAS_pn-xhost = "Ubuntu=x11-xserver-utils Fedora=xorg-x11-server-utils"
|
||||
DISTRO_PN_ALIAS_pn-xineramaproto = "Meego=xorg-x11-proto-xineramaproto Ubuntu=x11proto-xinerama Debian=x11proto-xinerama"
|
||||
DISTRO_PN_ALIAS_pn-xinput-calibrator = "Fedora=xinput-calibrator Mandravia=xinput-calibrator Ubuntu=xinput-calibrator"
|
||||
DISTRO_PN_ALIAS_pn-xkbcomp = "Ubuntu=x11-xkb-utils Fedora=xorg-x11-xkb-utils"
|
||||
DISTRO_PN_ALIAS_pn-xmodmap = "Meego=xorg-x11-utils-xmodmap Fedora=xorg-x11-server-utils Ubuntu=x11-xserver-utils"
|
||||
DISTRO_PN_ALIAS_pn-xorg-cf-files = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-xorg-minimal-fonts = "Ubuntu=xfonts-base Fedora=xorg-x11-fonts-base"
|
||||
DISTRO_PN_ALIAS_pn-xprop = "Meego=xorg-x11-utils-xprop Fedora=xorg-x11-utils Ubuntu=x11-utils"
|
||||
DISTRO_PN_ALIAS_pn-xproto = "Meego=xorg-x11-proto-xproto Fedora=xorg-x11-proto-devel Ubuntu=x11proto-core-dev Debian=x11proto-core-dev Opensuse=xorg-x11-proto-devel Mandriva=x11-proto-devel"
|
||||
@@ -447,6 +517,7 @@ DISTRO_PN_ALIAS_pn-xserver-xf86-lite = "Fedora=xorg-x11-server Ubuntu=xserver-xo
|
||||
DISTRO_PN_ALIAS_pn-xserver-xorg = "Fedora=xorg-x11-server Ubuntu=xserver-xorg"
|
||||
DISTRO_PN_ALIAS_pn-xset = "Fedora=xorg-x11-server-utils Ubuntu=x11-xserver-utils Debian=x11-xserver-utils Opensuse=xorg-x11"
|
||||
DISTRO_PN_ALIAS_pn-xtscal = "OSPDT upstream=http://gpe.linuxtogo.org/download/source/"
|
||||
DISTRO_PN_ALIAS_pn-xuser-account = "OE-Core"
|
||||
DISTRO_PN_ALIAS_pn-xvideo-tests = "OpenedHand"
|
||||
DISTRO_PN_ALIAS_pn-xvinfo = "Fedora=xorg-x11-utils Ubuntu=x11-utils"
|
||||
DISTRO_PN_ALIAS_pn-xwininfo = "Fedora=xorg-x11-utils Ubuntu=x11-utils"
|
||||
|
||||
@@ -42,6 +42,8 @@ RECIPE_MAINTAINER_pn-apt = "Cristiana Voicu <cristiana.voicu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-aspell = "Cristiana Voicu <cristiana.voicu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-atk = "Cristiana Voicu <cristiana.voicu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-at = "Cristiana Voicu <cristiana.voicu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-at-spi2-atk = "Cristiana Voicu <cristiana.voicu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-at-spi2-core = "Cristiana Voicu <cristiana.voicu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-attr = "Saul Wold <sgw@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-augeas = "Paul Eggleton <paul.eggleton@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-autoconf = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
@@ -63,6 +65,7 @@ RECIPE_MAINTAINER_pn-bison = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-blktool = "Paul Eggleton <paul.eggleton@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-blktrace = "Tom Zanussi <tom.zanussi@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-bluez4 = "Cristian Iorga <cristian.iorga@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-bluez5 = "Cristian Iorga <cristian.iorga@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-bluez-hcidump = "Cristian Iorga <cristian.iorga@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-boost = "Saul Wold <sgw@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-btrfs-tools = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
@@ -81,9 +84,11 @@ RECIPE_MAINTAINER_pn-chrpath = "Paul Eggleton <paul.eggleton@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-clutter-gst-1.0 = "Ross Burton <ross.burton@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-clutter-gtk-1.0 = "Ross Burton <ross.burton@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-clutter = "Ross Burton <ross.burton@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-clutter-1.0 = "Ross Burton <ross.burton@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-cmake-native = "Paul Eggleton <paul.eggleton@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-cmake = "Paul Eggleton <paul.eggleton@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-cogl = "Ross Burton <ross.burton@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-cogl-1.0 = "Ross Burton <ross.burton@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-compositeproto = "Ross Burton <ross.burton@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-connman = "Cristian Iorga <cristian.iorga@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-connman-gnome = "Cristian Iorga <cristian.iorga@intel.com>"
|
||||
@@ -201,6 +206,7 @@ RECIPE_MAINTAINER_pn-gpgme = "Paul Eggleton <paul.eggleton@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-grep = "Cristiana Voicu <cristiana.voicu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-groff = "Valentin Popa <valentin.popa@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-grub = "Paul Eggleton <paul.eggleton@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-gsettings-desktop-schemas = "Valentin Popa <valentin.popa@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-gst-ffmpeg = "Cristian Iorga <cristian.iorga@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-gst-fluendo-mp3 = "Cristian Iorga <cristian.iorga@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-gst-fluendo-mpegdemux = "Cristian Iorga <cristian.iorga@intel.com>"
|
||||
@@ -239,7 +245,6 @@ RECIPE_MAINTAINER_pn-hostap-utils = "Cristian Iorga <cristian.iorga@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-hwlatdetect = "Darren Hart <dvhart@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-icecc-create-env-native = "Saul Wold <sgw@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-icu = "Valentin Popa <valentin.popa@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-imake = "Cristiana Voicu <cristiana.voicu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-initramfs-boot = "Saul Wold <sgw@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-initramfs-framework = "Saul Wold <sgw@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-initramfs-live-boot = "Saul Wold <sgw@linux.intel.com>"
|
||||
@@ -277,6 +282,7 @@ RECIPE_MAINTAINER_pn-libart-lgpl = "Ross Burton <ross.burton@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-libassuan = "Cristiana Voicu <cristiana.voicu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-libatomics-ops = "Cristian Iorga <cristian.iorga@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-libav = "Paul Eggleton <paul.eggleton@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-libbsd = "Saul Wold <sgw@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-libcap = "Saul Wold <sgw@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-libcgroup = "Saul Wold <sgw@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-libcheck = "Saul Wold <sgw@linux.intel.com>"
|
||||
@@ -314,6 +320,7 @@ RECIPE_MAINTAINER_pn-libmpc = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-libnewt = "Kai Kang <kai.kang@windriver.com>"
|
||||
RECIPE_MAINTAINER_pn-libnfsidmap = "Paul Eggleton <paul.eggleton@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-libnl = "Saul Wold <sgw@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-libnotify = "Ross Burton <ross.burton@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-libnss-mdns = "Saul Wold <sgw@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-libogg = "Cristian Iorga <cristian.iorga@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-liboil = "Cristiana Voicu <cristiana.voicu@intel.com>"
|
||||
@@ -436,6 +443,7 @@ RECIPE_MAINTAINER_pn-meta-ide-support = "Jessica Zhang <jessica.zhang@intel.com>
|
||||
RECIPE_MAINTAINER_pn-meta-toolchain-gmae = "Jessica Zhang <jessica.zhang@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-meta-toolchain-qte = "Paul Eggleton <paul.eggleton@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-meta-toolchain = "Jessica Zhang <jessica.zhang@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-midori = "Ross Burton <ross.burton@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-mingetty = "Kai Kang <kai.kang@windriver.com>"
|
||||
RECIPE_MAINTAINER_pn-minicom = "Cristian Iorga <cristian.iorga@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-mini-x-session = "Saul Wold <sgw@linux.intel.com>"
|
||||
@@ -544,6 +552,7 @@ RECIPE_MAINTAINER_pn-puzzles = "Valentin Popa <valentin.popa@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-python-argparse = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-python = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-python-dbus = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-python-docutils = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-python-gst = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-python-imaging = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-python-pycairo = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
@@ -635,7 +644,6 @@ RECIPE_MAINTAINER_pn-tiff = "Saul Wold <sgw@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-time = "Saul Wold <sgw@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-tiny-init = "Saul Wold <sgw@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-trace-cmd = "Darren Hart <dvhart@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-transfig = "Cristiana Voicu <cristiana.voicu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-tremor = "Cristian Iorga <cristian.iorga@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-tslib = "Paul Eggleton <paul.eggleton@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-ttf-bitstream-vera = "Valentin Popa <valentin.popa@intel.com>"
|
||||
@@ -654,6 +662,7 @@ RECIPE_MAINTAINER_pn-usbutils = "Cristiana Voicu <cristiana.voicu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-util-linux = "Saul Wold <sgw@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-util-macros = "Saul Wold <sgw@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-v86d = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-vala = "Ross Burton <ross.burton@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-valgrind = "Cristiana Voicu <cristiana.voicu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-videoproto = "Valentin Popa <valentin.popa@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-vte ="Saul Wold <sgw@linux.intel.com>"
|
||||
@@ -704,10 +713,10 @@ RECIPE_MAINTAINER_pn-xineramaproto = "Laurentiu Palcu <laurentiu.palcu@intel.com
|
||||
RECIPE_MAINTAINER_pn-xinetd = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-xinit = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-xinput = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-xinput-calibrator = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-xkbcomp = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-xkeyboard-config = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-xmodmap = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-xorg-cf-files = "Saul Wold <sgw@linux.intel.com>"
|
||||
RECIPE_MAINTAINER_pn-xorg-minimal-fonts = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-xprop = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
RECIPE_MAINTAINER_pn-xproto = "Laurentiu Palcu <laurentiu.palcu@intel.com>"
|
||||
|
||||
@@ -215,6 +215,8 @@ REGEX_pn-prelink = "(?P<pver>cross_prelink)"
|
||||
REGEX_URI_pn-psmisc = "http://sourceforge.net/projects/psmisc/files/psmisc/"
|
||||
REGEX_pn-psmisc = "[hH][rR][eE][fF]=\"http://sourceforge.net/projects/psmisc/files/psmisc/psmisc\-(?P<pver>((\d+[\.\-_]*)+))\.tar\.gz/download\""
|
||||
REGEX_URI_pn-python-argparse = "https://code.google.com/p/argparse/downloads/list"
|
||||
REGEX_URI_pn-python-docutils = "http://sourceforge.net/projects/docutils/files/docutils/"
|
||||
REGEX_pn-python-docutils = "[hH][rR][eE][fF]=\"/projects/docutils/files/docutils/docutils\-(?P<pver>((\d+[\.\-_]*)+)).*/\""
|
||||
REGEX_URI_pn-python-pycurl = "http://pycurl.sourceforge.net/download/"
|
||||
REGEX_pn-python-pycurl = "[hH][rR][eE][fF]=\"pycurl-(?P<pver>((\d+[\.\-_]*)+)).tar.gz\""
|
||||
REGEX_URI_pn-python-scons = "http://sourceforge.net/projects/scons/files/scons/"
|
||||
@@ -257,8 +259,6 @@ REGEX_URI_pn-tiff = "ftp://ftp.remotesensing.org/pub/libtiff/"
|
||||
REGEX_pn-tiff = "[hH][rR][eE][fF]=\"ftp://ftp.remotesensing.org:21/pub/libtiff/tiff-(?P<pver>((\d+[\.\-_]*)+))\.tar\.gz\""
|
||||
REGEX_URI_pn-tiff-native = "ftp://ftp.remotesensing.org/pub/libtiff/"
|
||||
REGEX_pn-tiff-native = "[hH][rR][eE][fF]=\"ftp://ftp.remotesensing.org:21/pub/libtiff/tiff-(?P<pver>((\d+[\.\-_]*)+))\.tar\.gz\""
|
||||
REGEX_URI_pn-transfig-native = "http://sourceforge.net/projects/mcj/files/mcj-source/"
|
||||
REGEX_pn-transfig-native = "[hH][rR][eE][fF]=\"http://sourceforge.net/projects/mcj/files/mcj-source/transfig.(?P<pver>((\d+[\.\-_]*)+[a-z]?)).tar.gz/download\""
|
||||
REGEX_URI_pn-tslib = "http://sourceforge.net/projects/tslib.berlios/files/"
|
||||
REGEX_pn-tslib = "[hH][rR][eE][fF]=\"http://sourceforge.net/projects/tslib.berlios/files/tslib\-(?P<pver>((\d+[\.\-_]*)+))\.tar\.bz2/download\""
|
||||
REGEX_URI_pn-tzdata = "ftp://ftp.iana.org/tz/releases/"
|
||||
|
||||
@@ -127,7 +127,6 @@ RECIPE_COLOR_pn-hostap-conf = "red"
|
||||
RECIPE_COLOR_pn-hostap-utils="yellow"
|
||||
RECIPE_COLOR_pn-icon-naming-utils = "red"
|
||||
RECIPE_COLOR_pn-icu = "yellow"
|
||||
RECIPE_COLOR_pn-imake = "red"
|
||||
RECIPE_COLOR_pn-initramfs-boot = "yellow"
|
||||
RECIPE_COLOR_pn-initramfs-live-boot = "yellow"
|
||||
RECIPE_COLOR_pn-initramfs-live-install = "yellow"
|
||||
@@ -383,7 +382,6 @@ RECIPE_COLOR_pn-telepathy-gabble = "red"
|
||||
RECIPE_COLOR_pn-tidy = "red"
|
||||
RECIPE_COLOR_pn-time = "yellow"
|
||||
RECIPE_COLOR_pn-tinylogin = "yellow"
|
||||
RECIPE_COLOR_pn-transfig = "yellow"
|
||||
RECIPE_COLOR_pn-trapproto = "yellow"
|
||||
RECIPE_COLOR_pn-tslib = "yellow"
|
||||
RECIPE_COLOR_pn-ttf-bitstream-vera = "yellow"
|
||||
|
||||
@@ -137,11 +137,13 @@ RECIPE_UPSTREAM_VERSION_pn-libiconv = "1.14"
|
||||
RECIPE_UPSTREAM_DATE_pn-libiconv = "Aug 07, 2011"
|
||||
CHECK_DATE_pn-libiconv = "Aug 30, 2012"
|
||||
RECIPE_NO_UPDATE_REASON_pn-libnl = "libnl-3.2.2 is incompatible with libnl2, so no Upgrade"
|
||||
RECIPE_NO_UPDATE_REASON_pn-libpng = "1.4.3 and later changes the API and breaks libmatchbox. Sticking with the 1.2.x series instead"
|
||||
RECIPE_UPSTREAM_VERSION_pn-libsoup = "2.41.90"
|
||||
RECIPE_UPSTREAM_VERSION_pn-libpng = "1.6.6"
|
||||
RECIPE_UPSTREAM_DATE_pn-libpng = "Sep 16, 2013"
|
||||
CHECK_DATE_pn-libpng = "Oct 02, 2013"
|
||||
RECIPE_UPSTREAM_VERSION_pn-libpng12 = "1.2.50"
|
||||
RECIPE_UPSTREAM_DATE_pn-libpng12 = "Jul 10, 2012"
|
||||
CHECK_DATE_pn-libpng12 = "Aug 21, 2013"
|
||||
CHECK_DATE_pn-libpng12 = "Oct 02, 2013"
|
||||
RECIPE_UPSTREAM_DATE_pn-libsoup = "Feb 19, 2013"
|
||||
CHECK_DATE_pn-libsoup = "Mar 5, 2013"
|
||||
RECIPE_NO_UPDATE_REASON_pn-libsoup = "2.41.90 is unstable"
|
||||
@@ -164,7 +166,7 @@ CHECK_DATE_pn-makedevs = "Aug 31, 2012"
|
||||
RECIPE_UPSTREAM_VERSION_pn-meta-ide-support = "check"
|
||||
RECIPE_UPSTREAM_VERSION_pn-minicom = "2.6.2"
|
||||
RECIPE_UPSTREAM_DATE_pn-minicom = "Feb 06, 2013"
|
||||
CHECK_DATE_pn-minicom = "Jun 10, 2013"
|
||||
CHECK_DATE_pn-minicom = "Oct 02, 2013"
|
||||
RECIPE_UPSTREAM_DATE_pn-module-init-tools = "Jun 02, 2011"
|
||||
RECIPE_UPSTREAM_VERSION_pn-module-init-tools = "3.15"
|
||||
CHECK_DATE_pn-module-init-tools = "Aug 31, 2012"
|
||||
@@ -203,9 +205,9 @@ CHECK_DATE_pn-rpm = "Sep 03, 2012"
|
||||
RECIPE_UPSTREAM_VERSION_pn-run-postinsts = "check"
|
||||
RECIPE_NO_UPDATE_REASON_pn-sato-screenshot = "PRS Reports Incorrectly"
|
||||
RECIPE_NO_UPDATE_REASON_pn-socat = "2.0.0 is beta"
|
||||
RECIPE_UPSTREAM_VERSION_pn-sqlite3 = "3.7.17"
|
||||
RECIPE_UPSTREAM_DATE_pn-sqlite3 = "Aug 20, 2013"
|
||||
CHECK_DATE_pn-sqlite3= "Aug 21, 2013"
|
||||
RECIPE_UPSTREAM_VERSION_pn-sqlite3 = "3.8.0.2"
|
||||
RECIPE_UPSTREAM_DATE_pn-sqlite3 = "Sep 03, 2013"
|
||||
CHECK_DATE_pn-sqlite3= "Oct 02, 2013"
|
||||
RECIPE_UPSTREAM_VERSION_pn-squashfs-tools = "4.2"
|
||||
RECIPE_UPSTREAM_DATE_pn-squashfs-tools = "Feb 28, 2011"
|
||||
CHECK_DATE_pn-squashfs-tools = "Nov 09, 2012"
|
||||
|
||||
@@ -72,22 +72,20 @@ CONNECTIVITY_CHECK_URIS ?= " \
|
||||
http://bugzilla.yoctoproject.org/report.cgi"
|
||||
|
||||
SANITY_TESTED_DISTROS ?= " \
|
||||
Poky-1.3 \n \
|
||||
Poky-1.4 \n \
|
||||
Poky-1.5 \n \
|
||||
Ubuntu-12.04 \n \
|
||||
Ubuntu-12.10 \n \
|
||||
Ubuntu-13.04 \n \
|
||||
Fedora-17 \n \
|
||||
Fedora-18 \n \
|
||||
CentOS-6.3 \n \
|
||||
Fedora-19 \n \
|
||||
CentOS-6.4 \n \
|
||||
Debian-6.0 \n \
|
||||
Debian-6.0.7 \n \
|
||||
Debian-7.0 \n \
|
||||
Debian-7.1 \n \
|
||||
SUSE-LINUX-12.2 \n \
|
||||
openSUSE-project-12.3 \n \
|
||||
"
|
||||
"
|
||||
|
||||
# Default hash policy for distro
|
||||
BB_SIGNATURE_HANDLER ?= 'OEBasicHash'
|
||||
|
||||
@@ -61,15 +61,15 @@ DISK_SIGNATURE ?= "${DISK_SIGNATURE_GENERATED}"
|
||||
SYSLINUX_ROOT ?= "root=/dev/sda2"
|
||||
SYSLINUX_TIMEOUT ?= "10"
|
||||
|
||||
populate() {
|
||||
DEST=$1
|
||||
install -d ${DEST}
|
||||
boot_direct_populate() {
|
||||
dest=$1
|
||||
install -d $dest
|
||||
|
||||
# Install bzImage, initrd, and rootfs.img in DEST for all loaders to use.
|
||||
install -m 0644 ${STAGING_KERNEL_DIR}/bzImage ${DEST}/vmlinuz
|
||||
install -m 0644 ${STAGING_KERNEL_DIR}/bzImage $dest/vmlinuz
|
||||
|
||||
if [ -n "${INITRD}" ] && [ -s "${INITRD}" ]; then
|
||||
install -m 0644 ${INITRD} ${DEST}/initrd
|
||||
install -m 0644 ${INITRD} $dest/initrd
|
||||
fi
|
||||
|
||||
}
|
||||
@@ -79,13 +79,13 @@ build_boot_dd() {
|
||||
HDDIMG="${S}/hdd.image"
|
||||
IMAGE=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.hdddirect
|
||||
|
||||
populate ${HDDDIR}
|
||||
boot_direct_populate $HDDDIR
|
||||
|
||||
if [ "${PCBIOS}" = "1" ]; then
|
||||
syslinux_hddimg_populate
|
||||
syslinux_hddimg_populate $HDDDIR
|
||||
fi
|
||||
if [ "${EFI}" = "1" ]; then
|
||||
grubefi_hddimg_populate
|
||||
grubefi_hddimg_populate $HDDDIR
|
||||
fi
|
||||
|
||||
BLOCKS=`du -bks $HDDDIR | cut -f 1`
|
||||
@@ -148,7 +148,12 @@ python do_bootdirectdisk() {
|
||||
def generate_disk_signature():
|
||||
import uuid
|
||||
|
||||
return str(uuid.uuid4())[:8]
|
||||
signature = str(uuid.uuid4())[:8]
|
||||
|
||||
if signature != '00000000':
|
||||
return signature
|
||||
else:
|
||||
return 'ffffffff'
|
||||
|
||||
def validate_disk_signature(d):
|
||||
import re
|
||||
|
||||
@@ -19,19 +19,24 @@
|
||||
|
||||
# External variables (also used by syslinux.bbclass)
|
||||
# ${INITRD} - indicates a filesystem image to use as an initrd (optional)
|
||||
# ${COMPRESSISO} - Transparent compress ISO, reduce size ~40% if set to 1
|
||||
# ${NOISO} - skip building the ISO image if set to 1
|
||||
# ${NOHDD} - skip building the HDD image if set to 1
|
||||
# ${ROOTFS} - indicates a filesystem image to include as the root filesystem (optional)
|
||||
|
||||
do_bootimg[depends] += "dosfstools-native:do_populate_sysroot \
|
||||
mtools-native:do_populate_sysroot \
|
||||
cdrtools-native:do_populate_sysroot"
|
||||
cdrtools-native:do_populate_sysroot \
|
||||
${@oe.utils.ifelse(d.getVar('COMPRESSISO'),'zisofs-tools-native:do_populate_sysroot','')}"
|
||||
|
||||
PACKAGES = " "
|
||||
EXCLUDE_FROM_WORLD = "1"
|
||||
|
||||
HDDDIR = "${S}/hddimg"
|
||||
ISODIR = "${S}/iso"
|
||||
EFIIMGDIR = "${S}/efi_img"
|
||||
COMPACT_ISODIR = "${S}/iso.z"
|
||||
COMPRESSISO ?= "0"
|
||||
|
||||
BOOTIMG_VOLUME_ID ?= "boot"
|
||||
BOOTIMG_EXTRA_SPACE ?= "512"
|
||||
@@ -48,15 +53,10 @@ def pcbios(d):
|
||||
pcbios = base_contains("MACHINE_FEATURES", "efi", "0", "1", d)
|
||||
return pcbios
|
||||
|
||||
def pcbios_class(d):
|
||||
if d.getVar("PCBIOS", True) == "1":
|
||||
return "syslinux"
|
||||
return ""
|
||||
|
||||
PCBIOS = "${@pcbios(d)}"
|
||||
PCBIOS_CLASS = "${@pcbios_class(d)}"
|
||||
|
||||
inherit ${PCBIOS_CLASS}
|
||||
# The syslinux is required for the isohybrid command and boot catalog
|
||||
inherit syslinux
|
||||
inherit ${EFI_CLASS}
|
||||
|
||||
populate() {
|
||||
@@ -86,25 +86,54 @@ build_iso() {
|
||||
populate ${ISODIR}
|
||||
|
||||
if [ "${PCBIOS}" = "1" ]; then
|
||||
syslinux_iso_populate
|
||||
syslinux_iso_populate ${ISODIR}
|
||||
fi
|
||||
if [ "${EFI}" = "1" ]; then
|
||||
grubefi_iso_populate
|
||||
grubefi_iso_populate ${ISODIR}
|
||||
build_fat_img ${EFIIMGDIR} ${ISODIR}/efi.img
|
||||
fi
|
||||
|
||||
if [ "${PCBIOS}" = "1" ]; then
|
||||
# EFI only
|
||||
if [ "${PCBIOS}" != "1" ] && [ "${EFI}" = "1" ] ; then
|
||||
# Work around bug in isohybrid where it requires isolinux.bin
|
||||
# In the boot catalog, even though it is not used
|
||||
mkdir -p ${ISODIR}/${ISOLINUXDIR}
|
||||
install -m 0644 ${STAGING_DATADIR}/syslinux/isolinux.bin ${ISODIR}${ISOLINUXDIR}
|
||||
fi
|
||||
|
||||
if [ "${COMPRESSISO}" = "1" ] ; then
|
||||
# create compact directory, compress iso
|
||||
mkdir -p ${COMPACT_ISODIR}
|
||||
mkzftree -z 9 -p 4 -F ${ISODIR}/rootfs.img ${COMPACT_ISODIR}/rootfs.img
|
||||
|
||||
# move compact iso to iso, then remove compact directory
|
||||
mv ${COMPACT_ISODIR}/rootfs.img ${ISODIR}/rootfs.img
|
||||
rm -Rf ${COMPACT_ISODIR}
|
||||
mkisofs_compress_opts="-R -z -D -l"
|
||||
else
|
||||
mkisofs_compress_opts="-r"
|
||||
fi
|
||||
|
||||
if [ "${PCBIOS}" = "1" ] && [ "${EFI}" != "1" ] ; then
|
||||
# PCBIOS only media
|
||||
mkisofs -V ${BOOTIMG_VOLUME_ID} \
|
||||
-o ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.iso \
|
||||
-b ${ISO_BOOTIMG} -c ${ISO_BOOTCAT} -r \
|
||||
-b ${ISO_BOOTIMG} -c ${ISO_BOOTCAT} \
|
||||
$mkisofs_compress_opts \
|
||||
${MKISOFS_OPTIONS} ${ISODIR}
|
||||
else
|
||||
bbnote "EFI-only ISO images are untested, please provide feedback."
|
||||
mkisofs -V ${BOOTIMG_VOLUME_ID} \
|
||||
# EFI only OR EFI+PCBIOS
|
||||
mkisofs -A ${BOOTIMG_VOLUME_ID} -V ${BOOTIMG_VOLUME_ID} \
|
||||
-o ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.iso \
|
||||
-r ${ISODIR}
|
||||
-b ${ISO_BOOTIMG} -c ${ISO_BOOTCAT} \
|
||||
$mkisofs_compress_opts ${MKISOFS_OPTIONS} \
|
||||
-eltorito-alt-boot -eltorito-platform efi \
|
||||
-b efi.img -no-emul-boot \
|
||||
${ISODIR}
|
||||
isohybrid_args="-u"
|
||||
fi
|
||||
|
||||
isohybrid ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.iso
|
||||
isohybrid $isohybrid_args ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.iso
|
||||
|
||||
cd ${DEPLOY_DIR_IMAGE}
|
||||
rm -f ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.iso
|
||||
@@ -174,10 +203,10 @@ build_hddimg() {
|
||||
populate ${HDDDIR}
|
||||
|
||||
if [ "${PCBIOS}" = "1" ]; then
|
||||
syslinux_hddimg_populate
|
||||
syslinux_hddimg_populate ${HDDDIR}
|
||||
fi
|
||||
if [ "${EFI}" = "1" ]; then
|
||||
grubefi_hddimg_populate
|
||||
grubefi_hddimg_populate ${HDDDIR}
|
||||
fi
|
||||
|
||||
build_fat_img ${HDDDIR} ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.hddimg
|
||||
|
||||
@@ -73,12 +73,12 @@ target_exec_prefix := "${exec_prefix}"
|
||||
base_prefix = "${SDKPATHNATIVE}"
|
||||
prefix = "${SDKPATHNATIVE}${prefix_nativesdk}"
|
||||
exec_prefix = "${SDKPATHNATIVE}${prefix_nativesdk}"
|
||||
bindir = "${exec_prefix}/bin/${TUNE_PKGARCH}${TARGET_VENDOR}-${TARGET_OS}"
|
||||
bindir = "${exec_prefix}/bin/${TARGET_ARCH}${TARGET_VENDOR}-${TARGET_OS}"
|
||||
sbindir = "${bindir}"
|
||||
base_bindir = "${bindir}"
|
||||
base_sbindir = "${bindir}"
|
||||
libdir = "${exec_prefix}/lib/${TUNE_PKGARCH}${TARGET_VENDOR}-${TARGET_OS}"
|
||||
libexecdir = "${exec_prefix}/libexec/${TUNE_PKGARCH}${TARGET_VENDOR}-${TARGET_OS}"
|
||||
libdir = "${exec_prefix}/lib/${TARGET_ARCH}${TARGET_VENDOR}-${TARGET_OS}"
|
||||
libexecdir = "${exec_prefix}/libexec/${TARGET_ARCH}${TARGET_VENDOR}-${TARGET_OS}"
|
||||
|
||||
FILES_${PN} = "${prefix}"
|
||||
FILES_${PN}-dbg += "${prefix}/.debug \
|
||||
@@ -91,3 +91,7 @@ export PKG_CONFIG_SYSROOT_DIR = "${STAGING_DIR_HOST}"
|
||||
do_populate_sysroot[stamp-extra-info] = ""
|
||||
|
||||
USE_NLS = "${SDKUSE_NLS}"
|
||||
|
||||
# We have to us TARGET_ARCH but we care about the absolute value
|
||||
# and not any particular tune that is enabled.
|
||||
TARGET_ARCH[vardepsexclude] = "TUNE_ARCH"
|
||||
|
||||
@@ -56,6 +56,7 @@ libexecdir = "${exec_prefix}/libexec/${CROSS_TARGET_SYS_DIR}"
|
||||
|
||||
do_populate_sysroot[sstate-inputdirs] = "${SYSROOT_DESTDIR}/${STAGING_DIR_NATIVE}/"
|
||||
do_populate_sysroot[stamp-extra-info] = ""
|
||||
do_packagedata[stamp-extra-info] = ""
|
||||
|
||||
python cross_virtclass_handler () {
|
||||
classextend = e.data.getVar('BBCLASSEXTEND', True) or ""
|
||||
|
||||
@@ -27,6 +27,7 @@ target_exec_prefix = "${SDKPATHNATIVE}${prefix_nativesdk}"
|
||||
baselib = "lib"
|
||||
|
||||
do_populate_sysroot[stamp-extra-info] = ""
|
||||
do_packagedata[stamp-extra-info] = ""
|
||||
|
||||
# Need to force this to ensure consitency accross architectures
|
||||
EXTRA_OECONF_FPU = ""
|
||||
|
||||
@@ -47,14 +47,18 @@ distutils_do_install() {
|
||||
|
||||
if test -e ${D}${bindir} ; then
|
||||
for i in ${D}${bindir}/* ; do \
|
||||
sed -i -e s:${STAGING_BINDIR_NATIVE}/python-native/python:${bindir}/env\ python:g $i
|
||||
if [ ${PN} != "${BPN}-native" ]; then
|
||||
sed -i -e s:${STAGING_BINDIR_NATIVE}/python-native/python:${bindir}/env\ python:g $i
|
||||
fi
|
||||
sed -i -e s:${STAGING_BINDIR_NATIVE}:${bindir}:g $i
|
||||
done
|
||||
fi
|
||||
|
||||
if test -e ${D}${sbindir}; then
|
||||
for i in ${D}${sbindir}/* ; do \
|
||||
sed -i -e s:${STAGING_BINDIR_NATIVE}/python-native/python:${bindir}/env\ python:g $i
|
||||
if [ ${PN} != "${BPN}-native" ]; then
|
||||
sed -i -e s:${STAGING_BINDIR_NATIVE}/python-native/python:${bindir}/env\ python:g $i
|
||||
fi
|
||||
sed -i -e s:${STAGING_BINDIR_NATIVE}:${bindir}:g $i
|
||||
done
|
||||
fi
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
# External variables
|
||||
# ${INITRD} - indicates a filesystem image to use as an initrd (optional)
|
||||
# ${ROOTFS} - indicates a filesystem image to include as the root filesystem (optional)
|
||||
# ${GRUB_GFXSERIAL} - set this to 1 to have graphics and serial in the boot menu
|
||||
# ${LABELS} - a list of targets for the automatic config
|
||||
# ${APPEND} - an override list of append strings for each label
|
||||
# ${GRUB_OPTS} - additional options to add to the config, ';' delimited # (optional)
|
||||
@@ -16,6 +17,7 @@
|
||||
|
||||
do_bootimg[depends] += "grub-efi-${TRANSLATED_TARGET_ARCH}-native:do_deploy"
|
||||
|
||||
GRUB_SERIAL ?= "console=ttyS0,115200"
|
||||
GRUBCFG = "${S}/grub.cfg"
|
||||
GRUB_TIMEOUT ?= "10"
|
||||
#FIXME: build this from the machine config
|
||||
@@ -40,11 +42,20 @@ grubefi_populate() {
|
||||
}
|
||||
|
||||
grubefi_iso_populate() {
|
||||
grubefi_populate ${ISODIR}
|
||||
iso_dir=$1
|
||||
grubefi_populate $iso_dir
|
||||
# Build a EFI directory to create efi.img
|
||||
mkdir -p ${EFIIMGDIR}/${EFIDIR}
|
||||
cp $iso_dir/${EFIDIR}/* ${EFIIMGDIR}${EFIDIR}
|
||||
cp $iso_dir/vmlinuz ${EFIIMGDIR}
|
||||
echo "EFI\\BOOT\\${GRUB_IMAGE}" > ${EFIIMGDIR}/startup.nsh
|
||||
if [ -f "$iso_dir/initrd" ] ; then
|
||||
cp $iso_dir/initrd ${EFIIMGDIR}
|
||||
fi
|
||||
}
|
||||
|
||||
grubefi_hddimg_populate() {
|
||||
grubefi_populate ${HDDDIR}
|
||||
grubefi_populate $1
|
||||
}
|
||||
|
||||
python build_grub_cfg() {
|
||||
@@ -55,6 +66,8 @@ python build_grub_cfg() {
|
||||
bb.error("WORKDIR not defined, unable to package")
|
||||
return
|
||||
|
||||
gfxserial = d.getVar('GRUB_GFXSERIAL', True) or ""
|
||||
|
||||
labels = d.getVar('LABELS', True)
|
||||
if not labels:
|
||||
bb.debug(1, "LABELS not defined, nothing to do")
|
||||
@@ -88,6 +101,12 @@ python build_grub_cfg() {
|
||||
else:
|
||||
cfgfile.write('timeout=50\n')
|
||||
|
||||
if gfxserial == "1":
|
||||
btypes = [ [ " graphics console", "" ],
|
||||
[ " serial console", d.getVar('GRUB_SERIAL', True) or "" ] ]
|
||||
else:
|
||||
btypes = [ [ "", "" ] ]
|
||||
|
||||
for label in labels.split():
|
||||
localdata = d.createCopy()
|
||||
|
||||
@@ -95,24 +114,27 @@ python build_grub_cfg() {
|
||||
if not overrides:
|
||||
raise bb.build.FuncFailed('OVERRIDES not defined')
|
||||
|
||||
localdata.setVar('OVERRIDES', label + ':' + overrides)
|
||||
bb.data.update_data(localdata)
|
||||
for btype in btypes:
|
||||
localdata.setVar('OVERRIDES', label + ':' + overrides)
|
||||
bb.data.update_data(localdata)
|
||||
|
||||
cfgfile.write('\nmenuentry \'%s\'{\n' % (label))
|
||||
if label == "install":
|
||||
label = "install-efi"
|
||||
cfgfile.write('linux /vmlinuz LABEL=%s' % (label))
|
||||
cfgfile.write('\nmenuentry \'%s%s\'{\n' % (label, btype[0]))
|
||||
lb = label
|
||||
if label == "install":
|
||||
lb = "install-efi"
|
||||
cfgfile.write('linux /vmlinuz LABEL=%s' % (lb))
|
||||
|
||||
append = localdata.getVar('APPEND', True)
|
||||
initrd = localdata.getVar('INITRD', True)
|
||||
append = localdata.getVar('APPEND', True)
|
||||
initrd = localdata.getVar('INITRD', True)
|
||||
|
||||
if append:
|
||||
cfgfile.write('%s' % (append))
|
||||
cfgfile.write('\n')
|
||||
if append:
|
||||
cfgfile.write('%s' % (append))
|
||||
cfgfile.write(' %s' % btype[1])
|
||||
cfgfile.write('\n')
|
||||
|
||||
if initrd:
|
||||
cfgfile.write('initrd /initrd')
|
||||
cfgfile.write('\n}\n')
|
||||
if initrd:
|
||||
cfgfile.write('initrd /initrd')
|
||||
cfgfile.write('\n}\n')
|
||||
|
||||
cfgfile.close()
|
||||
}
|
||||
|
||||
@@ -83,6 +83,8 @@ KERNEL_IMAGETYPE_FOR_MAKE = "${@(lambda s: s[:-3] if s[-3:] == ".gz" else s)(d.g
|
||||
|
||||
copy_initramfs() {
|
||||
echo "Copying initramfs into ./usr ..."
|
||||
# In case the directory is not created yet from the first pass compile:
|
||||
mkdir -p ${B}/usr
|
||||
# Find and use the first initramfs image archive type we find
|
||||
rm -f ${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.cpio
|
||||
for img in cpio.gz cpio.lzo cpio.lzma cpio.xz; do
|
||||
@@ -156,6 +158,12 @@ kernel_do_compile() {
|
||||
# different initramfs image. The way to do that in the kernel
|
||||
# is to specify:
|
||||
# make ...args... CONFIG_INITRAMFS_SOURCE=some_other_initramfs.cpio
|
||||
if [ "$use_alternate_initrd" = "" ] && [ "${INITRAMFS_TASK}" != "" ] ; then
|
||||
# The old style way of copying an prebuilt image and building it
|
||||
# is turned on via INTIRAMFS_TASK != ""
|
||||
copy_initramfs
|
||||
use_alternate_initrd=CONFIG_INITRAMFS_SOURCE=${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.cpio
|
||||
fi
|
||||
oe_runmake ${KERNEL_IMAGETYPE_FOR_MAKE} ${KERNEL_ALT_IMAGETYPE} CC="${KERNEL_CC}" LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS} $use_alternate_initrd
|
||||
if test "${KERNEL_IMAGETYPE_FOR_MAKE}.gz" = "${KERNEL_IMAGETYPE}"; then
|
||||
gzip -9c < "${KERNEL_IMAGETYPE_FOR_MAKE}" > "${KERNEL_OUTPUT}"
|
||||
|
||||
@@ -128,12 +128,14 @@ def add_package_and_files(d):
|
||||
d.setVar('RRECOMMENDS_' + pn, "%s" % (pn_lic))
|
||||
|
||||
def copy_license_files(lic_files_paths, destdir):
|
||||
import shutil
|
||||
|
||||
bb.utils.mkdirhier(destdir)
|
||||
for (basename, path) in lic_files_paths:
|
||||
ret = bb.utils.copyfile(path, os.path.join(destdir, basename))
|
||||
# If the copy didn't occur, something horrible went wrong and we fail out
|
||||
if not ret:
|
||||
bb.warn("%s could not be copied for some reason. It may not exist. WARN for now." % path)
|
||||
try:
|
||||
ret = shutil.copyfile(path, os.path.join(destdir, basename))
|
||||
except Exception as e:
|
||||
bb.warn("Could not copy license file %s: %s" % (basename, e))
|
||||
|
||||
def find_license_files(d):
|
||||
"""
|
||||
|
||||
@@ -54,7 +54,7 @@ DEPENDS_GETTEXT = "gettext-native"
|
||||
PTEST_ENABLED = "0"
|
||||
|
||||
# Don't use site files for native builds
|
||||
export CONFIG_SITE = ""
|
||||
export CONFIG_SITE = "${COREBASE}/meta/site/native"
|
||||
|
||||
# set the compiler as well. It could have been set to something else
|
||||
export CC = "${CCACHE}${HOST_PREFIX}gcc ${HOST_CC_ARCH}"
|
||||
@@ -157,6 +157,7 @@ do_package_write_ipk[noexec] = "1"
|
||||
do_package_write_deb[noexec] = "1"
|
||||
do_package_write_rpm[noexec] = "1"
|
||||
|
||||
do_packagedata[stamp-extra-info] = ""
|
||||
do_populate_sysroot[stamp-extra-info] = ""
|
||||
|
||||
USE_NLS = "no"
|
||||
|
||||
@@ -87,5 +87,6 @@ addhandler nativesdk_virtclass_handler
|
||||
nativesdk_virtclass_handler[eventmask] = "bb.event.RecipePreFinalise"
|
||||
|
||||
do_populate_sysroot[stamp-extra-info] = ""
|
||||
do_packagedata[stamp-extra-info] = ""
|
||||
|
||||
USE_NLS = "${SDKUSE_NLS}"
|
||||
|
||||
@@ -953,6 +953,9 @@ python populate_packages () {
|
||||
|
||||
seen = []
|
||||
|
||||
# os.mkdir masks the permissions with umask so we have to unset it first
|
||||
oldumask = os.umask(0)
|
||||
|
||||
for pkg in package_list:
|
||||
root = os.path.join(pkgdest, pkg)
|
||||
bb.utils.mkdirhier(root)
|
||||
@@ -1025,6 +1028,7 @@ python populate_packages () {
|
||||
if ret is False or ret == 0:
|
||||
raise bb.build.FuncFailed("File population failed")
|
||||
|
||||
os.umask(oldumask)
|
||||
os.chdir(workdir)
|
||||
|
||||
unshipped = []
|
||||
|
||||
@@ -35,6 +35,11 @@ package_update_index_rpm () {
|
||||
done
|
||||
done
|
||||
|
||||
# FIXME stopgap for broken "bitbake package-index" since MULTILIB_PREFIX_LIST isn't set for that
|
||||
if [ "$target_archs" = "" ] ; then
|
||||
target_archs="${ALL_MULTILIB_PACKAGE_ARCHS}"
|
||||
fi
|
||||
|
||||
target_archs=`echo "$target_archs" | tr - _`
|
||||
|
||||
archs=`for arch in $target_archs $sdk_archs ; do
|
||||
@@ -386,6 +391,10 @@ EOF
|
||||
fi
|
||||
|
||||
# Construct install scriptlet wrapper
|
||||
# Scripts need to be ordered when executed, this ensures numeric order
|
||||
# If we ever run into needing more the 899 scripts, we'll have to
|
||||
# change num to start with 1000.
|
||||
#
|
||||
cat << EOF > ${WORKDIR}/scriptlet_wrapper
|
||||
#!/bin/bash
|
||||
|
||||
@@ -401,11 +410,13 @@ export NATIVE_ROOT=${STAGING_DIR_NATIVE}
|
||||
if [ \$? -ne 0 ]; then
|
||||
if [ \$4 -eq 1 ]; then
|
||||
mkdir -p \$1/etc/rpm-postinsts
|
||||
num=100
|
||||
while [ -e \$1/etc/rpm-postinsts/\${num}-* ]; do num=\$((num + 1)); done
|
||||
name=\`head -1 \$1/\$3 | cut -d' ' -f 2\`
|
||||
echo "#!\$2" > \$1/etc/rpm-postinsts/\${name}
|
||||
echo "# Arg: \$4" >> \$1/etc/rpm-postinsts/\${name}
|
||||
cat \$1/\$3 >> \$1/etc/rpm-postinsts/\${name}
|
||||
chmod +x \$1/etc/rpm-postinsts/\${name}
|
||||
echo "#!\$2" > \$1/etc/rpm-postinsts/\${num}-\${name}
|
||||
echo "# Arg: \$4" >> \$1/etc/rpm-postinsts/\${num}-\${name}
|
||||
cat \$1/\$3 >> \$1/etc/rpm-postinsts/\${num}-\${name}
|
||||
chmod +x \$1/etc/rpm-postinsts/\${num}-\${name}
|
||||
else
|
||||
echo "Error: pre/post remove scriptlet failed"
|
||||
fi
|
||||
@@ -473,7 +484,7 @@ EOF
|
||||
echo "Note: see `dirname ${BB_LOGFILE}`/log.do_${task}_attemptonly.${PID}"
|
||||
translate_oe_to_smart ${sdk_mode} --attemptonly $package_attemptonly
|
||||
echo "Attempting $pkgs_to_install" >> "`dirname ${BB_LOGFILE}`/log.do_${task}_attemptonly.${PID}"
|
||||
smart --data-dir=${target_rootfs}/var/lib/smart install --attempt -y ${pkgs_to_install} >> "`dirname ${BB_LOGFILE}`/log.do_${task}_attemptonly.${PID}" 2>&1
|
||||
smart --data-dir=${target_rootfs}/var/lib/smart install --attempt -y ${pkgs_to_install} >> "`dirname ${BB_LOGFILE}`/log.do_${task}_attemptonly.${PID}" 2>&1 || :
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
@@ -107,9 +107,14 @@ delayed_postinsts () {
|
||||
}
|
||||
|
||||
save_postinsts () {
|
||||
# Scripts need to be ordered when executed, this ensures numeric order
|
||||
# If we ever run into needing more the 899 scripts, we'll have to
|
||||
# change num to start with 1000.
|
||||
num=100
|
||||
for p in $(delayed_postinsts); do
|
||||
install -d ${IMAGE_ROOTFS}${sysconfdir}/deb-postinsts
|
||||
cp ${IMAGE_ROOTFS}/var/lib/dpkg/info/$p.postinst ${IMAGE_ROOTFS}${sysconfdir}/deb-postinsts/$p
|
||||
cp ${IMAGE_ROOTFS}/var/lib/dpkg/info/$p.postinst ${IMAGE_ROOTFS}${sysconfdir}/deb-postinsts/$num-$p
|
||||
num=`echo \$((num+1))`
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
@@ -106,9 +106,14 @@ delayed_postinsts () {
|
||||
}
|
||||
|
||||
save_postinsts () {
|
||||
# Scripts need to be ordered when executed, this ensures numeric order
|
||||
# If we ever run into needing more the 899 scripts, we'll have to
|
||||
# change num to start with 1000.
|
||||
num=100
|
||||
for p in $(delayed_postinsts); do
|
||||
install -d ${IMAGE_ROOTFS}${sysconfdir}/ipk-postinsts
|
||||
cp ${IMAGE_ROOTFS}${OPKGLIBDIR}/opkg/info/$p.postinst ${IMAGE_ROOTFS}${sysconfdir}/ipk-postinsts/$p
|
||||
cp ${IMAGE_ROOTFS}${OPKGLIBDIR}/opkg/info/$p.postinst ${IMAGE_ROOTFS}${sysconfdir}/ipk-postinsts/$num-$p
|
||||
num=`echo \$((num+1))`
|
||||
done
|
||||
}
|
||||
|
||||
|
||||