Complete Yocto mirror with license table for TQMa6UL (2038-compliance)
- 264 license table entries with exact download URLs (224/264 resolved) - Complete sources/ directory with all BitBake recipes - Build configuration: tqma6ul-multi-mba6ulx, spaetzle (musl) - Full traceability for Softwarefreigabeantrag - GCC 13.4.0, Linux 6.6.102, U-Boot 2023.04, musl 1.2.4 - License distribution: GPL-2.0 (24), MIT (23), GPL-2.0+ (18), BSD-3 (16)
This commit is contained in:
1
sources/poky/bitbake/doc/.gitignore
vendored
Normal file
1
sources/poky/bitbake/doc/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
_build/
|
||||
339
sources/poky/bitbake/doc/COPYING.GPL
Normal file
339
sources/poky/bitbake/doc/COPYING.GPL
Normal file
@@ -0,0 +1,339 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
||||
17
sources/poky/bitbake/doc/COPYING.MIT
Normal file
17
sources/poky/bitbake/doc/COPYING.MIT
Normal file
@@ -0,0 +1,17 @@
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
|
||||
THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
35
sources/poky/bitbake/doc/Makefile
Normal file
35
sources/poky/bitbake/doc/Makefile
Normal file
@@ -0,0 +1,35 @@
|
||||
# Minimal makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line, and also
|
||||
# from the environment for the first two.
|
||||
SPHINXOPTS ?= -W --keep-going -j auto
|
||||
SPHINXBUILD ?= sphinx-build
|
||||
SOURCEDIR = .
|
||||
BUILDDIR = _build
|
||||
DESTDIR = final
|
||||
|
||||
ifeq ($(shell if which $(SPHINXBUILD) >/dev/null 2>&1; then echo 1; else echo 0; fi),0)
|
||||
$(error "The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed")
|
||||
endif
|
||||
|
||||
# Put it first so that "make" without argument is like "make help".
|
||||
help:
|
||||
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
||||
|
||||
.PHONY: help Makefile clean publish
|
||||
|
||||
publish: Makefile html singlehtml
|
||||
rm -rf $(BUILDDIR)/$(DESTDIR)/
|
||||
mkdir -p $(BUILDDIR)/$(DESTDIR)/
|
||||
cp -r $(BUILDDIR)/html/* $(BUILDDIR)/$(DESTDIR)/
|
||||
cp $(BUILDDIR)/singlehtml/index.html $(BUILDDIR)/$(DESTDIR)/singleindex.html
|
||||
sed -i -e 's@index.html#@singleindex.html#@g' $(BUILDDIR)/$(DESTDIR)/singleindex.html
|
||||
|
||||
clean:
|
||||
@rm -rf $(BUILDDIR)
|
||||
|
||||
# Catch-all target: route all unknown targets to Sphinx using the new
|
||||
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
|
||||
%: Makefile
|
||||
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
||||
55
sources/poky/bitbake/doc/README
Normal file
55
sources/poky/bitbake/doc/README
Normal file
@@ -0,0 +1,55 @@
|
||||
Documentation
|
||||
=============
|
||||
|
||||
This is the directory that contains the BitBake documentation.
|
||||
|
||||
Manual Organization
|
||||
===================
|
||||
|
||||
Folders exist for individual manuals as follows:
|
||||
|
||||
* bitbake-user-manual --- The BitBake User Manual
|
||||
|
||||
Each folder is self-contained regarding content and figures.
|
||||
|
||||
If you want to find HTML versions of the BitBake manuals on the web,
|
||||
go to https://www.openembedded.org/wiki/Documentation.
|
||||
|
||||
Sphinx
|
||||
======
|
||||
|
||||
The BitBake documentation was migrated from the original DocBook
|
||||
format to Sphinx based documentation for the Yocto Project 3.2
|
||||
release.
|
||||
|
||||
Additional information related to the Sphinx migration, and guidelines
|
||||
for developers willing to contribute to the BitBake documentation can
|
||||
be found in the Yocto Project Documentation README file:
|
||||
|
||||
https://git.yoctoproject.org/cgit/cgit.cgi/yocto-docs/tree/documentation/README
|
||||
|
||||
How to build the Yocto Project documentation
|
||||
============================================
|
||||
|
||||
Sphinx is written in Python. While it might work with Python2, for
|
||||
obvious reasons, we will only support building the BitBake
|
||||
documentation with Python3.
|
||||
|
||||
Sphinx might be available in your Linux distro packages repositories,
|
||||
however it is not recommend using distro packages, as they might be
|
||||
old versions, especially if you are using an LTS version of your
|
||||
distro. The recommended method to install Sphinx and all required
|
||||
dependencies is to use the Python Package Index (pip).
|
||||
|
||||
To install all required packages run:
|
||||
|
||||
$ pip3 install sphinx sphinx_rtd_theme pyyaml
|
||||
|
||||
To build the documentation locally, run:
|
||||
|
||||
$ cd doc
|
||||
$ make html
|
||||
|
||||
The resulting HTML index page will be _build/html/index.html, and you
|
||||
can browse your own copy of the locally generated documentation with
|
||||
your browser.
|
||||
14
sources/poky/bitbake/doc/_templates/breadcrumbs.html
vendored
Normal file
14
sources/poky/bitbake/doc/_templates/breadcrumbs.html
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
{% extends "!breadcrumbs.html" %}
|
||||
|
||||
{% block breadcrumbs %}
|
||||
<li>
|
||||
<span class="doctype_switcher_placeholder">{{ doctype or 'single' }}</span>
|
||||
<span class="version_switcher_placeholder">{{ release }}</span>
|
||||
</li>
|
||||
<li> »</li>
|
||||
{% for doc in parents %}
|
||||
<li><a href="{{ doc.link|e }}">{{ doc.title }}</a> »</li>
|
||||
{% endfor %}
|
||||
<li>{{ title }}</li>
|
||||
{% endblock %}
|
||||
|
||||
9
sources/poky/bitbake/doc/_templates/footer.html
vendored
Normal file
9
sources/poky/bitbake/doc/_templates/footer.html
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
<footer>
|
||||
<hr/>
|
||||
<div role="contentinfo">
|
||||
<p>© Copyright {{ copyright }}
|
||||
<br>Last updated on {{ last_updated }} from the <a href="https://git.openembedded.org/bitbake/">bitbake</a> git repository.
|
||||
</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
7
sources/poky/bitbake/doc/_templates/layout.html
vendored
Normal file
7
sources/poky/bitbake/doc/_templates/layout.html
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
{% extends "!layout.html" %}
|
||||
|
||||
{% block extrabody %}
|
||||
<div id="outdated-warning" style="text-align: center; background-color: #FFBABA; color: #6A0E0E;">
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
@@ -0,0 +1,761 @@
|
||||
.. SPDX-License-Identifier: CC-BY-2.5
|
||||
|
||||
=========
|
||||
Execution
|
||||
=========
|
||||
|
||||
|
|
||||
|
||||
The primary purpose for running BitBake is to produce some kind of
|
||||
output such as a single installable package, a kernel, a software
|
||||
development kit, or even a full, board-specific bootable Linux image,
|
||||
complete with bootloader, kernel, and root filesystem. Of course, you
|
||||
can execute the ``bitbake`` command with options that cause it to
|
||||
execute single tasks, compile single recipe files, capture or clear
|
||||
data, or simply return information about the execution environment.
|
||||
|
||||
This chapter describes BitBake's execution process from start to finish
|
||||
when you use it to create an image. The execution process is launched
|
||||
using the following command form::
|
||||
|
||||
$ bitbake target
|
||||
|
||||
For information on
|
||||
the BitBake command and its options, see ":ref:`The BitBake Command
|
||||
<bitbake-user-manual-command>`" section.
|
||||
|
||||
.. note::
|
||||
|
||||
Prior to executing BitBake, you should take advantage of available
|
||||
parallel thread execution on your build host by setting the
|
||||
:term:`BB_NUMBER_THREADS` variable in
|
||||
your project's ``local.conf`` configuration file.
|
||||
|
||||
A common method to determine this value for your build host is to run
|
||||
the following::
|
||||
|
||||
$ grep processor /proc/cpuinfo
|
||||
|
||||
This command returns
|
||||
the number of processors, which takes into account hyper-threading.
|
||||
Thus, a quad-core build host with hyper-threading most likely shows
|
||||
eight processors, which is the value you would then assign to
|
||||
:term:`BB_NUMBER_THREADS`.
|
||||
|
||||
A possibly simpler solution is that some Linux distributions (e.g.
|
||||
Debian and Ubuntu) provide the ``ncpus`` command.
|
||||
|
||||
Parsing the Base Configuration Metadata
|
||||
=======================================
|
||||
|
||||
The first thing BitBake does is parse base configuration metadata. Base
|
||||
configuration metadata consists of your project's ``bblayers.conf`` file
|
||||
to determine what layers BitBake needs to recognize, all necessary
|
||||
``layer.conf`` files (one from each layer), and ``bitbake.conf``. The
|
||||
data itself is of various types:
|
||||
|
||||
- **Recipes:** Details about particular pieces of software.
|
||||
|
||||
- **Class Data:** An abstraction of common build information (e.g. how to
|
||||
build a Linux kernel).
|
||||
|
||||
- **Configuration Data:** Machine-specific settings, policy decisions,
|
||||
and so forth. Configuration data acts as the glue to bind everything
|
||||
together.
|
||||
|
||||
The ``layer.conf`` files are used to construct key variables such as
|
||||
:term:`BBPATH` and :term:`BBFILES`.
|
||||
:term:`BBPATH` is used to search for configuration and class files under the
|
||||
``conf`` and ``classes`` directories, respectively. :term:`BBFILES` is used
|
||||
to locate both recipe and recipe append files (``.bb`` and
|
||||
``.bbappend``). If there is no ``bblayers.conf`` file, it is assumed the
|
||||
user has set the :term:`BBPATH` and :term:`BBFILES` directly in the environment.
|
||||
|
||||
Next, the ``bitbake.conf`` file is located using the :term:`BBPATH` variable
|
||||
that was just constructed. The ``bitbake.conf`` file may also include
|
||||
other configuration files using the ``include`` or ``require``
|
||||
directives.
|
||||
|
||||
Prior to parsing configuration files, BitBake looks at certain
|
||||
variables, including:
|
||||
|
||||
- :term:`BB_ENV_PASSTHROUGH`
|
||||
- :term:`BB_ENV_PASSTHROUGH_ADDITIONS`
|
||||
- :term:`BB_PRESERVE_ENV`
|
||||
- :term:`BB_ORIGENV`
|
||||
- :term:`BITBAKE_UI`
|
||||
|
||||
The first four variables in this list relate to how BitBake treats shell
|
||||
environment variables during task execution. By default, BitBake cleans
|
||||
the environment variables and provides tight control over the shell
|
||||
execution environment. However, through the use of these first four
|
||||
variables, you can apply your control regarding the environment
|
||||
variables allowed to be used by BitBake in the shell during execution of
|
||||
tasks. See the
|
||||
":ref:`bitbake-user-manual/bitbake-user-manual-metadata:Passing Information Into the Build Task Environment`"
|
||||
section and the information about these variables in the variable
|
||||
glossary for more information on how they work and on how to use them.
|
||||
|
||||
The base configuration metadata is global and therefore affects all
|
||||
recipes and tasks that are executed.
|
||||
|
||||
BitBake first searches the current working directory for an optional
|
||||
``conf/bblayers.conf`` configuration file. This file is expected to
|
||||
contain a :term:`BBLAYERS` variable that is a
|
||||
space-delimited list of 'layer' directories. Recall that if BitBake
|
||||
cannot find a ``bblayers.conf`` file, then it is assumed the user has
|
||||
set the :term:`BBPATH` and :term:`BBFILES` variables directly in the
|
||||
environment.
|
||||
|
||||
For each directory (layer) in this list, a ``conf/layer.conf`` file is
|
||||
located and parsed with the :term:`LAYERDIR` variable
|
||||
being set to the directory where the layer was found. The idea is these
|
||||
files automatically set up :term:`BBPATH` and other
|
||||
variables correctly for a given build directory.
|
||||
|
||||
BitBake then expects to find the ``conf/bitbake.conf`` file somewhere in
|
||||
the user-specified :term:`BBPATH`. That configuration file generally has
|
||||
include directives to pull in any other metadata such as files specific
|
||||
to the architecture, the machine, the local environment, and so forth.
|
||||
|
||||
Only variable definitions and include directives are allowed in BitBake
|
||||
``.conf`` files. Some variables directly influence BitBake's behavior.
|
||||
These variables might have been set from the environment depending on
|
||||
the environment variables previously mentioned or set in the
|
||||
configuration files. The ":ref:`bitbake-user-manual/bitbake-user-manual-ref-variables:Variables Glossary`"
|
||||
chapter presents a full list of
|
||||
variables.
|
||||
|
||||
After parsing configuration files, BitBake uses its rudimentary
|
||||
inheritance mechanism, which is through class files, to inherit some
|
||||
standard classes. BitBake parses a class when the inherit directive
|
||||
responsible for getting that class is encountered.
|
||||
|
||||
The ``base.bbclass`` file is always included. Other classes that are
|
||||
specified in the configuration using the
|
||||
:term:`INHERIT` variable are also included. BitBake
|
||||
searches for class files in a ``classes`` subdirectory under the paths
|
||||
in :term:`BBPATH` in the same way as configuration files.
|
||||
|
||||
A good way to get an idea of the configuration files and the class files
|
||||
used in your execution environment is to run the following BitBake
|
||||
command::
|
||||
|
||||
$ bitbake -e > mybb.log
|
||||
|
||||
Examining the top of the ``mybb.log``
|
||||
shows you the many configuration files and class files used in your
|
||||
execution environment.
|
||||
|
||||
.. note::
|
||||
|
||||
You need to be aware of how BitBake parses curly braces. If a recipe
|
||||
uses a closing curly brace within the function and the character has
|
||||
no leading spaces, BitBake produces a parsing error. If you use a
|
||||
pair of curly braces in a shell function, the closing curly brace
|
||||
must not be located at the start of the line without leading spaces.
|
||||
|
||||
Here is an example that causes BitBake to produce a parsing error::
|
||||
|
||||
fakeroot create_shar() {
|
||||
cat << "EOF" > ${SDK_DEPLOY}/${TOOLCHAIN_OUTPUTNAME}.sh
|
||||
usage()
|
||||
{
|
||||
echo "test"
|
||||
###### The following "}" at the start of the line causes a parsing error ######
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
Writing the recipe this way avoids the error:
|
||||
fakeroot create_shar() {
|
||||
cat << "EOF" > ${SDK_DEPLOY}/${TOOLCHAIN_OUTPUTNAME}.sh
|
||||
usage()
|
||||
{
|
||||
echo "test"
|
||||
###### The following "}" with a leading space at the start of the line avoids the error ######
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
Locating and Parsing Recipes
|
||||
============================
|
||||
|
||||
During the configuration phase, BitBake will have set
|
||||
:term:`BBFILES`. BitBake now uses it to construct a
|
||||
list of recipes to parse, along with any append files (``.bbappend``) to
|
||||
apply. :term:`BBFILES` is a space-separated list of available files and
|
||||
supports wildcards. An example would be::
|
||||
|
||||
BBFILES = "/path/to/bbfiles/*.bb /path/to/appends/*.bbappend"
|
||||
|
||||
BitBake parses each
|
||||
recipe and append file located with :term:`BBFILES` and stores the values of
|
||||
various variables into the datastore.
|
||||
|
||||
.. note::
|
||||
|
||||
Append files are applied in the order they are encountered in BBFILES.
|
||||
|
||||
For each file, a fresh copy of the base configuration is made, then the
|
||||
recipe is parsed line by line. Any inherit statements cause BitBake to
|
||||
find and then parse class files (``.bbclass``) using
|
||||
:term:`BBPATH` as the search path. Finally, BitBake
|
||||
parses in order any append files found in :term:`BBFILES`.
|
||||
|
||||
One common convention is to use the recipe filename to define pieces of
|
||||
metadata. For example, in ``bitbake.conf`` the recipe name and version
|
||||
are used to set the variables :term:`PN` and
|
||||
:term:`PV`::
|
||||
|
||||
PN = "${@bb.parse.vars_from_file(d.getVar('FILE', False),d)[0] or 'defaultpkgname'}"
|
||||
PV = "${@bb.parse.vars_from_file(d.getVar('FILE', False),d)[1] or '1.0'}"
|
||||
|
||||
In this example, a recipe called "something_1.2.3.bb" would set
|
||||
:term:`PN` to "something" and :term:`PV` to "1.2.3".
|
||||
|
||||
By the time parsing is complete for a recipe, BitBake has a list of
|
||||
tasks that the recipe defines and a set of data consisting of keys and
|
||||
values as well as dependency information about the tasks.
|
||||
|
||||
BitBake does not need all of this information. It only needs a small
|
||||
subset of the information to make decisions about the recipe.
|
||||
Consequently, BitBake caches the values in which it is interested and
|
||||
does not store the rest of the information. Experience has shown it is
|
||||
faster to re-parse the metadata than to try and write it out to the disk
|
||||
and then reload it.
|
||||
|
||||
Where possible, subsequent BitBake commands reuse this cache of recipe
|
||||
information. The validity of this cache is determined by first computing
|
||||
a checksum of the base configuration data (see
|
||||
:term:`BB_HASHCONFIG_IGNORE_VARS`) and
|
||||
then checking if the checksum matches. If that checksum matches what is
|
||||
in the cache and the recipe and class files have not changed, BitBake is
|
||||
able to use the cache. BitBake then reloads the cached information about
|
||||
the recipe instead of reparsing it from scratch.
|
||||
|
||||
Recipe file collections exist to allow the user to have multiple
|
||||
repositories of ``.bb`` files that contain the same exact package. For
|
||||
example, one could easily use them to make one's own local copy of an
|
||||
upstream repository, but with custom modifications that one does not
|
||||
want upstream. Here is an example::
|
||||
|
||||
BBFILES = "/stuff/openembedded/*/*.bb /stuff/openembedded.modified/*/*.bb"
|
||||
BBFILE_COLLECTIONS = "upstream local"
|
||||
BBFILE_PATTERN_upstream = "^/stuff/openembedded/"
|
||||
BBFILE_PATTERN_local = "^/stuff/openembedded.modified/"
|
||||
BBFILE_PRIORITY_upstream = "5"
|
||||
BBFILE_PRIORITY_local = "10"
|
||||
|
||||
.. note::
|
||||
|
||||
The layers mechanism is now the preferred method of collecting code.
|
||||
While the collections code remains, its main use is to set layer
|
||||
priorities and to deal with overlap (conflicts) between layers.
|
||||
|
||||
.. _bb-bitbake-providers:
|
||||
|
||||
Providers
|
||||
=========
|
||||
|
||||
Assuming BitBake has been instructed to execute a target and that all
|
||||
the recipe files have been parsed, BitBake starts to figure out how to
|
||||
build the target. BitBake looks through the :term:`PROVIDES` list for each
|
||||
of the recipes. A :term:`PROVIDES` list is the list of names by which the
|
||||
recipe can be known. Each recipe's :term:`PROVIDES` list is created
|
||||
implicitly through the recipe's :term:`PN` variable and
|
||||
explicitly through the recipe's :term:`PROVIDES`
|
||||
variable, which is optional.
|
||||
|
||||
When a recipe uses :term:`PROVIDES`, that recipe's functionality can be
|
||||
found under an alternative name or names other than the implicit :term:`PN`
|
||||
name. As an example, suppose a recipe named ``keyboard_1.0.bb``
|
||||
contained the following::
|
||||
|
||||
PROVIDES += "fullkeyboard"
|
||||
|
||||
The :term:`PROVIDES`
|
||||
list for this recipe becomes "keyboard", which is implicit, and
|
||||
"fullkeyboard", which is explicit. Consequently, the functionality found
|
||||
in ``keyboard_1.0.bb`` can be found under two different names.
|
||||
|
||||
.. _bb-bitbake-preferences:
|
||||
|
||||
Preferences
|
||||
===========
|
||||
|
||||
The :term:`PROVIDES` list is only part of the solution for figuring out a
|
||||
target's recipes. Because targets might have multiple providers, BitBake
|
||||
needs to prioritize providers by determining provider preferences.
|
||||
|
||||
A common example in which a target has multiple providers is
|
||||
"virtual/kernel", which is on the :term:`PROVIDES` list for each kernel
|
||||
recipe. Each machine often selects the best kernel provider by using a
|
||||
line similar to the following in the machine configuration file::
|
||||
|
||||
PREFERRED_PROVIDER_virtual/kernel = "linux-yocto"
|
||||
|
||||
The default :term:`PREFERRED_PROVIDER` is the provider
|
||||
with the same name as the target. BitBake iterates through each target
|
||||
it needs to build and resolves them and their dependencies using this
|
||||
process.
|
||||
|
||||
Understanding how providers are chosen is made complicated by the fact
|
||||
that multiple versions might exist for a given provider. BitBake
|
||||
defaults to the highest version of a provider. Version comparisons are
|
||||
made using the same method as Debian. You can use the
|
||||
:term:`PREFERRED_VERSION` variable to
|
||||
specify a particular version. You can influence the order by using the
|
||||
:term:`DEFAULT_PREFERENCE` variable.
|
||||
|
||||
By default, files have a preference of "0". Setting
|
||||
:term:`DEFAULT_PREFERENCE` to "-1" makes the recipe unlikely to be used
|
||||
unless it is explicitly referenced. Setting :term:`DEFAULT_PREFERENCE` to
|
||||
"1" makes it likely the recipe is used. :term:`PREFERRED_VERSION` overrides
|
||||
any :term:`DEFAULT_PREFERENCE` setting. :term:`DEFAULT_PREFERENCE` is often used
|
||||
to mark newer and more experimental recipe versions until they have
|
||||
undergone sufficient testing to be considered stable.
|
||||
|
||||
When there are multiple "versions" of a given recipe, BitBake defaults
|
||||
to selecting the most recent version, unless otherwise specified. If the
|
||||
recipe in question has a
|
||||
:term:`DEFAULT_PREFERENCE` set lower than
|
||||
the other recipes (default is 0), then it will not be selected. This
|
||||
allows the person or persons maintaining the repository of recipe files
|
||||
to specify their preference for the default selected version.
|
||||
Additionally, the user can specify their preferred version.
|
||||
|
||||
If the first recipe is named ``a_1.1.bb``, then the
|
||||
:term:`PN` variable will be set to "a", and the
|
||||
:term:`PV` variable will be set to 1.1.
|
||||
|
||||
Thus, if a recipe named ``a_1.2.bb`` exists, BitBake will choose 1.2 by
|
||||
default. However, if you define the following variable in a ``.conf``
|
||||
file that BitBake parses, you can change that preference::
|
||||
|
||||
PREFERRED_VERSION_a = "1.1"
|
||||
|
||||
.. note::
|
||||
|
||||
It is common for a recipe to provide two versions -- a stable,
|
||||
numbered (and preferred) version, and a version that is automatically
|
||||
checked out from a source code repository that is considered more
|
||||
"bleeding edge" but can be selected only explicitly.
|
||||
|
||||
For example, in the OpenEmbedded codebase, there is a standard,
|
||||
versioned recipe file for BusyBox, ``busybox_1.22.1.bb``, but there
|
||||
is also a Git-based version, ``busybox_git.bb``, which explicitly
|
||||
contains the line ::
|
||||
|
||||
DEFAULT_PREFERENCE = "-1"
|
||||
|
||||
to ensure that the
|
||||
numbered, stable version is always preferred unless the developer
|
||||
selects otherwise.
|
||||
|
||||
.. _bb-bitbake-dependencies:
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
Each target BitBake builds consists of multiple tasks such as ``fetch``,
|
||||
``unpack``, ``patch``, ``configure``, and ``compile``. For best
|
||||
performance on multi-core systems, BitBake considers each task as an
|
||||
independent entity with its own set of dependencies.
|
||||
|
||||
Dependencies are defined through several variables. You can find
|
||||
information about variables BitBake uses in the
|
||||
:doc:`bitbake-user-manual-ref-variables` near the end of this manual. At a
|
||||
basic level, it is sufficient to know that BitBake uses the
|
||||
:term:`DEPENDS` and
|
||||
:term:`RDEPENDS` variables when calculating
|
||||
dependencies.
|
||||
|
||||
For more information on how BitBake handles dependencies, see the
|
||||
:ref:`bitbake-user-manual/bitbake-user-manual-metadata:Dependencies`
|
||||
section.
|
||||
|
||||
.. _ref-bitbake-tasklist:
|
||||
|
||||
The Task List
|
||||
=============
|
||||
|
||||
Based on the generated list of providers and the dependency information,
|
||||
BitBake can now calculate exactly what tasks it needs to run and in what
|
||||
order it needs to run them. The
|
||||
:ref:`bitbake-user-manual/bitbake-user-manual-execution:executing tasks`
|
||||
section has more information on how BitBake chooses which task to
|
||||
execute next.
|
||||
|
||||
The build now starts with BitBake forking off threads up to the limit
|
||||
set in the :term:`BB_NUMBER_THREADS`
|
||||
variable. BitBake continues to fork threads as long as there are tasks
|
||||
ready to run, those tasks have all their dependencies met, and the
|
||||
thread threshold has not been exceeded.
|
||||
|
||||
It is worth noting that you can greatly speed up the build time by
|
||||
properly setting the :term:`BB_NUMBER_THREADS` variable.
|
||||
|
||||
As each task completes, a timestamp is written to the directory
|
||||
specified by the :term:`STAMP` variable. On subsequent
|
||||
runs, BitBake looks in the build directory within ``tmp/stamps`` and
|
||||
does not rerun tasks that are already completed unless a timestamp is
|
||||
found to be invalid. Currently, invalid timestamps are only considered
|
||||
on a per recipe file basis. So, for example, if the configure stamp has
|
||||
a timestamp greater than the compile timestamp for a given target, then
|
||||
the compile task would rerun. Running the compile task again, however,
|
||||
has no effect on other providers that depend on that target.
|
||||
|
||||
The exact format of the stamps is partly configurable. In modern
|
||||
versions of BitBake, a hash is appended to the stamp so that if the
|
||||
configuration changes, the stamp becomes invalid and the task is
|
||||
automatically rerun. This hash, or signature used, is governed by the
|
||||
signature policy that is configured (see the
|
||||
:ref:`bitbake-user-manual/bitbake-user-manual-execution:checksums (signatures)`
|
||||
section for information). It is also
|
||||
possible to append extra metadata to the stamp using the
|
||||
``[stamp-extra-info]`` task flag. For example, OpenEmbedded uses this
|
||||
flag to make some tasks machine-specific.
|
||||
|
||||
.. note::
|
||||
|
||||
Some tasks are marked as "nostamp" tasks. No timestamp file is
|
||||
created when these tasks are run. Consequently, "nostamp" tasks are
|
||||
always rerun.
|
||||
|
||||
For more information on tasks, see the
|
||||
:ref:`bitbake-user-manual/bitbake-user-manual-metadata:tasks` section.
|
||||
|
||||
Executing Tasks
|
||||
===============
|
||||
|
||||
Tasks can be either a shell task or a Python task. For shell tasks,
|
||||
BitBake writes a shell script to
|
||||
``${``\ :term:`T`\ ``}/run.do_taskname.pid`` and then
|
||||
executes the script. The generated shell script contains all the
|
||||
exported variables, and the shell functions with all variables expanded.
|
||||
Output from the shell script goes to the file
|
||||
``${``\ :term:`T`\ ``}/log.do_taskname.pid``. Looking at the expanded shell functions in
|
||||
the run file and the output in the log files is a useful debugging
|
||||
technique.
|
||||
|
||||
For Python tasks, BitBake executes the task internally and logs
|
||||
information to the controlling terminal. Future versions of BitBake will
|
||||
write the functions to files similar to the way shell tasks are handled.
|
||||
Logging will be handled in a way similar to shell tasks as well.
|
||||
|
||||
The order in which BitBake runs the tasks is controlled by its task
|
||||
scheduler. It is possible to configure the scheduler and define custom
|
||||
implementations for specific use cases. For more information, see these
|
||||
variables that control the behavior:
|
||||
|
||||
- :term:`BB_SCHEDULER`
|
||||
|
||||
- :term:`BB_SCHEDULERS`
|
||||
|
||||
It is possible to have functions run before and after a task's main
|
||||
function. This is done using the ``[prefuncs]`` and ``[postfuncs]``
|
||||
flags of the task that lists the functions to run.
|
||||
|
||||
.. _checksums:
|
||||
|
||||
Checksums (Signatures)
|
||||
======================
|
||||
|
||||
A checksum is a unique signature of a task's inputs. The signature of a
|
||||
task can be used to determine if a task needs to be run. Because it is a
|
||||
change in a task's inputs that triggers running the task, BitBake needs
|
||||
to detect all the inputs to a given task. For shell tasks, this turns
|
||||
out to be fairly easy because BitBake generates a "run" shell script for
|
||||
each task and it is possible to create a checksum that gives you a good
|
||||
idea of when the task's data changes.
|
||||
|
||||
To complicate the problem, some things should not be included in the
|
||||
checksum. First, there is the actual specific build path of a given task
|
||||
- the working directory. It does not matter if the working directory
|
||||
changes because it should not affect the output for target packages. The
|
||||
simplistic approach for excluding the working directory is to set it to
|
||||
some fixed value and create the checksum for the "run" script. BitBake
|
||||
goes one step better and uses the
|
||||
:term:`BB_BASEHASH_IGNORE_VARS` variable
|
||||
to define a list of variables that should never be included when
|
||||
generating the signatures.
|
||||
|
||||
Another problem results from the "run" scripts containing functions that
|
||||
might or might not get called. The incremental build solution contains
|
||||
code that figures out dependencies between shell functions. This code is
|
||||
used to prune the "run" scripts down to the minimum set, thereby
|
||||
alleviating this problem and making the "run" scripts much more readable
|
||||
as a bonus.
|
||||
|
||||
So far we have solutions for shell scripts. What about Python tasks? The
|
||||
same approach applies even though these tasks are more difficult. The
|
||||
process needs to figure out what variables a Python function accesses
|
||||
and what functions it calls. Again, the incremental build solution
|
||||
contains code that first figures out the variable and function
|
||||
dependencies, and then creates a checksum for the data used as the input
|
||||
to the task.
|
||||
|
||||
Like the working directory case, situations exist where dependencies
|
||||
should be ignored. For these cases, you can instruct the build process
|
||||
to ignore a dependency by using a line like the following::
|
||||
|
||||
PACKAGE_ARCHS[vardepsexclude] = "MACHINE"
|
||||
|
||||
This example ensures that the
|
||||
``PACKAGE_ARCHS`` variable does not depend on the value of ``MACHINE``,
|
||||
even if it does reference it.
|
||||
|
||||
Equally, there are cases where we need to add dependencies BitBake is
|
||||
not able to find. You can accomplish this by using a line like the
|
||||
following::
|
||||
|
||||
PACKAGE_ARCHS[vardeps] = "MACHINE"
|
||||
|
||||
This example explicitly
|
||||
adds the ``MACHINE`` variable as a dependency for ``PACKAGE_ARCHS``.
|
||||
|
||||
Consider a case with in-line Python, for example, where BitBake is not
|
||||
able to figure out dependencies. When running in debug mode (i.e. using
|
||||
``-DDD``), BitBake produces output when it discovers something for which
|
||||
it cannot figure out dependencies.
|
||||
|
||||
Thus far, this section has limited discussion to the direct inputs into
|
||||
a task. Information based on direct inputs is referred to as the
|
||||
"basehash" in the code. However, there is still the question of a task's
|
||||
indirect inputs --- the things that were already built and present in the
|
||||
build directory. The checksum (or signature) for a particular task needs
|
||||
to add the hashes of all the tasks on which the particular task depends.
|
||||
Choosing which dependencies to add is a policy decision. However, the
|
||||
effect is to generate a master checksum that combines the basehash and
|
||||
the hashes of the task's dependencies.
|
||||
|
||||
At the code level, there are a variety of ways both the basehash and the
|
||||
dependent task hashes can be influenced. Within the BitBake
|
||||
configuration file, we can give BitBake some extra information to help
|
||||
it construct the basehash. The following statement effectively results
|
||||
in a list of global variable dependency excludes --- variables never
|
||||
included in any checksum. This example uses variables from OpenEmbedded
|
||||
to help illustrate the concept::
|
||||
|
||||
BB_BASEHASH_IGNORE_VARS ?= "TMPDIR FILE PATH PWD BB_TASKHASH BBPATH DL_DIR \
|
||||
SSTATE_DIR THISDIR FILESEXTRAPATHS FILE_DIRNAME HOME LOGNAME SHELL \
|
||||
USER FILESPATH STAGING_DIR_HOST STAGING_DIR_TARGET COREBASE PRSERV_HOST \
|
||||
PRSERV_DUMPDIR PRSERV_DUMPFILE PRSERV_LOCKDOWN PARALLEL_MAKE \
|
||||
CCACHE_DIR EXTERNAL_TOOLCHAIN CCACHE CCACHE_DISABLE LICENSE_PATH SDKPKGSUFFIX"
|
||||
|
||||
The previous example excludes the work directory, which is part of
|
||||
``TMPDIR``.
|
||||
|
||||
The rules for deciding which hashes of dependent tasks to include
|
||||
through dependency chains are more complex and are generally
|
||||
accomplished with a Python function. The code in
|
||||
``meta/lib/oe/sstatesig.py`` shows two examples of this and also
|
||||
illustrates how you can insert your own policy into the system if so
|
||||
desired. This file defines the basic signature generator
|
||||
OpenEmbedded-Core uses: "OEBasicHash". By default, there
|
||||
is a dummy "noop" signature handler enabled in BitBake. This means that
|
||||
behavior is unchanged from previous versions. ``OE-Core`` uses the
|
||||
"OEBasicHash" signature handler by default through this setting in the
|
||||
``bitbake.conf`` file::
|
||||
|
||||
BB_SIGNATURE_HANDLER ?= "OEBasicHash"
|
||||
|
||||
The main feature of the "OEBasicHash" :term:`BB_SIGNATURE_HANDLER` is that
|
||||
it adds the task hash to the stamp files. Thanks to this, any metadata
|
||||
change will change the task hash, automatically causing the task to be run
|
||||
again. This removes the need to bump :term:`PR` values, and changes to
|
||||
metadata automatically ripple across the build.
|
||||
|
||||
It is also worth noting that the end result of signature
|
||||
generators is to make some dependency and hash information available to
|
||||
the build. This information includes:
|
||||
|
||||
- ``BB_BASEHASH_task-``\ *taskname*: The base hashes for each task in the
|
||||
recipe.
|
||||
|
||||
- ``BB_BASEHASH_``\ *filename:taskname*: The base hashes for each
|
||||
dependent task.
|
||||
|
||||
- :term:`BB_TASKHASH`: The hash of the currently running task.
|
||||
|
||||
It is worth noting that BitBake's "-S" option lets you debug BitBake's
|
||||
processing of signatures. The options passed to -S allow different
|
||||
debugging modes to be used, either using BitBake's own debug functions
|
||||
or possibly those defined in the metadata/signature handler itself. The
|
||||
simplest parameter to pass is "none", which causes a set of signature
|
||||
information to be written out into ``STAMPS_DIR`` corresponding to the
|
||||
targets specified. The other currently available parameter is
|
||||
"printdiff", which causes BitBake to try to establish the most recent
|
||||
signature match it can (e.g. in the sstate cache) and then run
|
||||
compare the matched signatures to determine the stamps and delta
|
||||
where these two stamp trees diverge. This can be used to determine why
|
||||
tasks need to be re-run in situations where that is not expected.
|
||||
|
||||
.. note::
|
||||
|
||||
It is likely that future versions of BitBake will provide other
|
||||
signature handlers triggered through additional "-S" parameters.
|
||||
|
||||
You can find more information on checksum metadata in the
|
||||
:ref:`bitbake-user-manual/bitbake-user-manual-metadata:task checksums and setscene`
|
||||
section.
|
||||
|
||||
Setscene
|
||||
========
|
||||
|
||||
The setscene process enables BitBake to handle "pre-built" artifacts.
|
||||
The ability to handle and reuse these artifacts allows BitBake the
|
||||
luxury of not having to build something from scratch every time.
|
||||
Instead, BitBake can use, when possible, existing build artifacts.
|
||||
|
||||
BitBake needs to have reliable data indicating whether or not an
|
||||
artifact is compatible. Signatures, described in the previous section,
|
||||
provide an ideal way of representing whether an artifact is compatible.
|
||||
If a signature is the same, an object can be reused.
|
||||
|
||||
If an object can be reused, the problem then becomes how to replace a
|
||||
given task or set of tasks with the pre-built artifact. BitBake solves
|
||||
the problem with the "setscene" process.
|
||||
|
||||
When BitBake is asked to build a given target, before building anything,
|
||||
it first asks whether cached information is available for any of the
|
||||
targets it's building, or any of the intermediate targets. If cached
|
||||
information is available, BitBake uses this information instead of
|
||||
running the main tasks.
|
||||
|
||||
BitBake first calls the function defined by the
|
||||
:term:`BB_HASHCHECK_FUNCTION` variable
|
||||
with a list of tasks and corresponding hashes it wants to build. This
|
||||
function is designed to be fast and returns a list of the tasks for
|
||||
which it believes in can obtain artifacts.
|
||||
|
||||
Next, for each of the tasks that were returned as possibilities, BitBake
|
||||
executes a setscene version of the task that the possible artifact
|
||||
covers. Setscene versions of a task have the string "_setscene" appended
|
||||
to the task name. So, for example, the task with the name ``xxx`` has a
|
||||
setscene task named ``xxx_setscene``. The setscene version of the task
|
||||
executes and provides the necessary artifacts returning either success
|
||||
or failure.
|
||||
|
||||
As previously mentioned, an artifact can cover more than one task. For
|
||||
example, it is pointless to obtain a compiler if you already have the
|
||||
compiled binary. To handle this, BitBake calls the
|
||||
:term:`BB_SETSCENE_DEPVALID` function for
|
||||
each successful setscene task to know whether or not it needs to obtain
|
||||
the dependencies of that task.
|
||||
|
||||
You can find more information on setscene metadata in the
|
||||
:ref:`bitbake-user-manual/bitbake-user-manual-metadata:task checksums and setscene`
|
||||
section.
|
||||
|
||||
Logging
|
||||
=======
|
||||
|
||||
In addition to the standard command line option to control how verbose
|
||||
builds are when execute, bitbake also supports user defined
|
||||
configuration of the `Python
|
||||
logging <https://docs.python.org/3/library/logging.html>`__ facilities
|
||||
through the :term:`BB_LOGCONFIG` variable. This
|
||||
variable defines a JSON or YAML `logging
|
||||
configuration <https://docs.python.org/3/library/logging.config.html>`__
|
||||
that will be intelligently merged into the default configuration. The
|
||||
logging configuration is merged using the following rules:
|
||||
|
||||
- The user defined configuration will completely replace the default
|
||||
configuration if top level key ``bitbake_merge`` is set to the value
|
||||
``False``. In this case, all other rules are ignored.
|
||||
|
||||
- The user configuration must have a top level ``version`` which must
|
||||
match the value of the default configuration.
|
||||
|
||||
- Any keys defined in the ``handlers``, ``formatters``, or ``filters``,
|
||||
will be merged into the same section in the default configuration,
|
||||
with the user specified keys taking replacing a default one if there
|
||||
is a conflict. In practice, this means that if both the default
|
||||
configuration and user configuration specify a handler named
|
||||
``myhandler``, the user defined one will replace the default. To
|
||||
prevent the user from inadvertently replacing a default handler,
|
||||
formatter, or filter, all of the default ones are named with a prefix
|
||||
of "``BitBake.``"
|
||||
|
||||
- If a logger is defined by the user with the key ``bitbake_merge`` set
|
||||
to ``False``, that logger will be completely replaced by user
|
||||
configuration. In this case, no other rules will apply to that
|
||||
logger.
|
||||
|
||||
- All user defined ``filter`` and ``handlers`` properties for a given
|
||||
logger will be merged with corresponding properties from the default
|
||||
logger. For example, if the user configuration adds a filter called
|
||||
``myFilter`` to the ``BitBake.SigGen``, and the default configuration
|
||||
adds a filter called ``BitBake.defaultFilter``, both filters will be
|
||||
applied to the logger
|
||||
|
||||
As a first example, you can create a ``hashequiv.json`` user logging
|
||||
configuration file to log all Hash Equivalence related messages of ``VERBOSE``
|
||||
or higher priority to a file called ``hashequiv.log``::
|
||||
|
||||
{
|
||||
"version": 1,
|
||||
"handlers": {
|
||||
"autobuilderlog": {
|
||||
"class": "logging.FileHandler",
|
||||
"formatter": "logfileFormatter",
|
||||
"level": "DEBUG",
|
||||
"filename": "hashequiv.log",
|
||||
"mode": "w"
|
||||
}
|
||||
},
|
||||
"formatters": {
|
||||
"logfileFormatter": {
|
||||
"format": "%(name)s: %(levelname)s: %(message)s"
|
||||
}
|
||||
},
|
||||
"loggers": {
|
||||
"BitBake.SigGen.HashEquiv": {
|
||||
"level": "VERBOSE",
|
||||
"handlers": ["autobuilderlog"]
|
||||
},
|
||||
"BitBake.RunQueue.HashEquiv": {
|
||||
"level": "VERBOSE",
|
||||
"handlers": ["autobuilderlog"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Then set the :term:`BB_LOGCONFIG` variable in ``conf/local.conf``::
|
||||
|
||||
BB_LOGCONFIG = "hashequiv.json"
|
||||
|
||||
Another example is this ``warn.json`` file to log all ``WARNING`` and
|
||||
higher priority messages to a ``warn.log`` file::
|
||||
|
||||
{
|
||||
"version": 1,
|
||||
"formatters": {
|
||||
"warnlogFormatter": {
|
||||
"()": "bb.msg.BBLogFormatter",
|
||||
"format": "%(levelname)s: %(message)s"
|
||||
}
|
||||
},
|
||||
|
||||
"handlers": {
|
||||
"warnlog": {
|
||||
"class": "logging.FileHandler",
|
||||
"formatter": "warnlogFormatter",
|
||||
"level": "WARNING",
|
||||
"filename": "warn.log"
|
||||
}
|
||||
},
|
||||
|
||||
"loggers": {
|
||||
"BitBake": {
|
||||
"handlers": ["warnlog"]
|
||||
}
|
||||
},
|
||||
|
||||
"@disable_existing_loggers": false
|
||||
}
|
||||
|
||||
Note that BitBake's helper classes for structured logging are implemented in
|
||||
``lib/bb/msg.py``.
|
||||
@@ -0,0 +1,851 @@
|
||||
.. SPDX-License-Identifier: CC-BY-2.5
|
||||
|
||||
=====================
|
||||
File Download Support
|
||||
=====================
|
||||
|
||||
|
|
||||
|
||||
BitBake's fetch module is a standalone piece of library code that deals
|
||||
with the intricacies of downloading source code and files from remote
|
||||
systems. Fetching source code is one of the cornerstones of building
|
||||
software. As such, this module forms an important part of BitBake.
|
||||
|
||||
The current fetch module is called "fetch2" and refers to the fact that
|
||||
it is the second major version of the API. The original version is
|
||||
obsolete and has been removed from the codebase. Thus, in all cases,
|
||||
"fetch" refers to "fetch2" in this manual.
|
||||
|
||||
The Download (Fetch)
|
||||
====================
|
||||
|
||||
BitBake takes several steps when fetching source code or files. The
|
||||
fetcher codebase deals with two distinct processes in order: obtaining
|
||||
the files from somewhere (cached or otherwise) and then unpacking those
|
||||
files into a specific location and perhaps in a specific way. Getting
|
||||
and unpacking the files is often optionally followed by patching.
|
||||
Patching, however, is not covered by this module.
|
||||
|
||||
The code to execute the first part of this process, a fetch, looks
|
||||
something like the following::
|
||||
|
||||
src_uri = (d.getVar('SRC_URI') or "").split()
|
||||
fetcher = bb.fetch2.Fetch(src_uri, d)
|
||||
fetcher.download()
|
||||
|
||||
This code sets up an instance of the fetch class. The instance uses a
|
||||
space-separated list of URLs from the :term:`SRC_URI`
|
||||
variable and then calls the ``download`` method to download the files.
|
||||
|
||||
The instantiation of the fetch class is usually followed by::
|
||||
|
||||
rootdir = l.getVar('WORKDIR')
|
||||
fetcher.unpack(rootdir)
|
||||
|
||||
This code unpacks the downloaded files to the specified by ``WORKDIR``.
|
||||
|
||||
.. note::
|
||||
|
||||
For convenience, the naming in these examples matches the variables
|
||||
used by OpenEmbedded. If you want to see the above code in action,
|
||||
examine the OpenEmbedded class file ``base.bbclass``
|
||||
.
|
||||
|
||||
The :term:`SRC_URI` and ``WORKDIR`` variables are not hardcoded into the
|
||||
fetcher, since those fetcher methods can be (and are) called with
|
||||
different variable names. In OpenEmbedded for example, the shared state
|
||||
(sstate) code uses the fetch module to fetch the sstate files.
|
||||
|
||||
When the ``download()`` method is called, BitBake tries to resolve the
|
||||
URLs by looking for source files in a specific search order:
|
||||
|
||||
- *Pre-mirror Sites:* BitBake first uses pre-mirrors to try and find
|
||||
source files. These locations are defined using the
|
||||
:term:`PREMIRRORS` variable.
|
||||
|
||||
- *Source URI:* If pre-mirrors fail, BitBake uses the original URL (e.g
|
||||
from :term:`SRC_URI`).
|
||||
|
||||
- *Mirror Sites:* If fetch failures occur, BitBake next uses mirror
|
||||
locations as defined by the :term:`MIRRORS` variable.
|
||||
|
||||
For each URL passed to the fetcher, the fetcher calls the submodule that
|
||||
handles that particular URL type. This behavior can be the source of
|
||||
some confusion when you are providing URLs for the :term:`SRC_URI` variable.
|
||||
Consider the following two URLs::
|
||||
|
||||
https://git.yoctoproject.org/git/poky;protocol=git
|
||||
git://git.yoctoproject.org/git/poky;protocol=http
|
||||
|
||||
In the former case, the URL is passed to the ``wget`` fetcher, which does not
|
||||
understand "git". Therefore, the latter case is the correct form since the Git
|
||||
fetcher does know how to use HTTP as a transport.
|
||||
|
||||
Here are some examples that show commonly used mirror definitions::
|
||||
|
||||
PREMIRRORS ?= "\
|
||||
bzr://.*/.\* http://somemirror.org/sources/ \
|
||||
cvs://.*/.\* http://somemirror.org/sources/ \
|
||||
git://.*/.\* http://somemirror.org/sources/ \
|
||||
hg://.*/.\* http://somemirror.org/sources/ \
|
||||
osc://.*/.\* http://somemirror.org/sources/ \
|
||||
p4://.*/.\* http://somemirror.org/sources/ \
|
||||
svn://.*/.\* http://somemirror.org/sources/"
|
||||
|
||||
MIRRORS =+ "\
|
||||
ftp://.*/.\* http://somemirror.org/sources/ \
|
||||
http://.*/.\* http://somemirror.org/sources/ \
|
||||
https://.*/.\* http://somemirror.org/sources/"
|
||||
|
||||
It is useful to note that BitBake
|
||||
supports cross-URLs. It is possible to mirror a Git repository on an
|
||||
HTTP server as a tarball. This is what the ``git://`` mapping in the
|
||||
previous example does.
|
||||
|
||||
Since network accesses are slow, BitBake maintains a cache of files
|
||||
downloaded from the network. Any source files that are not local (i.e.
|
||||
downloaded from the Internet) are placed into the download directory,
|
||||
which is specified by the :term:`DL_DIR` variable.
|
||||
|
||||
File integrity is of key importance for reproducing builds. For
|
||||
non-local archive downloads, the fetcher code can verify SHA-256 and MD5
|
||||
checksums to ensure the archives have been downloaded correctly. You can
|
||||
specify these checksums by using the :term:`SRC_URI` variable with the
|
||||
appropriate varflags as follows::
|
||||
|
||||
SRC_URI[md5sum] = "value"
|
||||
SRC_URI[sha256sum] = "value"
|
||||
|
||||
You can also specify the checksums as
|
||||
parameters on the :term:`SRC_URI` as shown below::
|
||||
|
||||
SRC_URI = "http://example.com/foobar.tar.bz2;md5sum=4a8e0f237e961fd7785d19d07fdb994d"
|
||||
|
||||
If multiple URIs exist, you can specify the checksums either directly as
|
||||
in the previous example, or you can name the URLs. The following syntax
|
||||
shows how you name the URIs::
|
||||
|
||||
SRC_URI = "http://example.com/foobar.tar.bz2;name=foo"
|
||||
SRC_URI[foo.md5sum] = 4a8e0f237e961fd7785d19d07fdb994d
|
||||
|
||||
After a file has been downloaded and
|
||||
has had its checksum checked, a ".done" stamp is placed in :term:`DL_DIR`.
|
||||
BitBake uses this stamp during subsequent builds to avoid downloading or
|
||||
comparing a checksum for the file again.
|
||||
|
||||
.. note::
|
||||
|
||||
It is assumed that local storage is safe from data corruption. If
|
||||
this were not the case, there would be bigger issues to worry about.
|
||||
|
||||
If :term:`BB_STRICT_CHECKSUM` is set, any
|
||||
download without a checksum triggers an error message. The
|
||||
:term:`BB_NO_NETWORK` variable can be used to
|
||||
make any attempted network access a fatal error, which is useful for
|
||||
checking that mirrors are complete as well as other things.
|
||||
|
||||
If :term:`BB_CHECK_SSL_CERTS` is set to ``0`` then SSL certificate checking will
|
||||
be disabled. This variable defaults to ``1`` so SSL certificates are normally
|
||||
checked.
|
||||
|
||||
.. _bb-the-unpack:
|
||||
|
||||
The Unpack
|
||||
==========
|
||||
|
||||
The unpack process usually immediately follows the download. For all
|
||||
URLs except Git URLs, BitBake uses the common ``unpack`` method.
|
||||
|
||||
A number of parameters exist that you can specify within the URL to
|
||||
govern the behavior of the unpack stage:
|
||||
|
||||
- *unpack:* Controls whether the URL components are unpacked. If set to
|
||||
"1", which is the default, the components are unpacked. If set to
|
||||
"0", the unpack stage leaves the file alone. This parameter is useful
|
||||
when you want an archive to be copied in and not be unpacked.
|
||||
|
||||
- *dos:* Applies to ``.zip`` and ``.jar`` files and specifies whether
|
||||
to use DOS line ending conversion on text files.
|
||||
|
||||
- *striplevel:* Strip specified number of leading components (levels)
|
||||
from file names on extraction
|
||||
|
||||
- *subdir:* Unpacks the specific URL to the specified subdirectory
|
||||
within the root directory.
|
||||
|
||||
The unpack call automatically decompresses and extracts files with ".Z",
|
||||
".z", ".gz", ".xz", ".zip", ".jar", ".ipk", ".rpm". ".srpm", ".deb" and
|
||||
".bz2" extensions as well as various combinations of tarball extensions.
|
||||
|
||||
As mentioned, the Git fetcher has its own unpack method that is
|
||||
optimized to work with Git trees. Basically, this method works by
|
||||
cloning the tree into the final directory. The process is completed
|
||||
using references so that there is only one central copy of the Git
|
||||
metadata needed.
|
||||
|
||||
.. _bb-fetchers:
|
||||
|
||||
Fetchers
|
||||
========
|
||||
|
||||
As mentioned earlier, the URL prefix determines which fetcher submodule
|
||||
BitBake uses. Each submodule can support different URL parameters, which
|
||||
are described in the following sections.
|
||||
|
||||
.. _local-file-fetcher:
|
||||
|
||||
Local file fetcher (``file://``)
|
||||
--------------------------------
|
||||
|
||||
This submodule handles URLs that begin with ``file://``. The filename
|
||||
you specify within the URL can be either an absolute or relative path to
|
||||
a file. If the filename is relative, the contents of the
|
||||
:term:`FILESPATH` variable is used in the same way
|
||||
``PATH`` is used to find executables. If the file cannot be found, it is
|
||||
assumed that it is available in :term:`DL_DIR` by the
|
||||
time the ``download()`` method is called.
|
||||
|
||||
If you specify a directory, the entire directory is unpacked.
|
||||
|
||||
Here are a couple of example URLs, the first relative and the second
|
||||
absolute::
|
||||
|
||||
SRC_URI = "file://relativefile.patch"
|
||||
SRC_URI = "file:///Users/ich/very_important_software"
|
||||
|
||||
.. _http-ftp-fetcher:
|
||||
|
||||
HTTP/FTP wget fetcher (``http://``, ``ftp://``, ``https://``)
|
||||
-------------------------------------------------------------
|
||||
|
||||
This fetcher obtains files from web and FTP servers. Internally, the
|
||||
fetcher uses the wget utility.
|
||||
|
||||
The executable and parameters used are specified by the
|
||||
``FETCHCMD_wget`` variable, which defaults to sensible values. The
|
||||
fetcher supports a parameter "downloadfilename" that allows the name of
|
||||
the downloaded file to be specified. Specifying the name of the
|
||||
downloaded file is useful for avoiding collisions in
|
||||
:term:`DL_DIR` when dealing with multiple files that
|
||||
have the same name.
|
||||
|
||||
If a username and password are specified in the ``SRC_URI``, a Basic
|
||||
Authorization header will be added to each request, including across redirects.
|
||||
To instead limit the Authorization header to the first request, add
|
||||
"redirectauth=0" to the list of parameters.
|
||||
|
||||
Some example URLs are as follows::
|
||||
|
||||
SRC_URI = "http://oe.handhelds.org/not_there.aac"
|
||||
SRC_URI = "ftp://oe.handhelds.org/not_there_as_well.aac"
|
||||
SRC_URI = "ftp://you@oe.handhelds.org/home/you/secret.plan"
|
||||
|
||||
.. note::
|
||||
|
||||
Because URL parameters are delimited by semi-colons, this can
|
||||
introduce ambiguity when parsing URLs that also contain semi-colons,
|
||||
for example::
|
||||
|
||||
SRC_URI = "http://abc123.org/git/?p=gcc/gcc.git;a=snapshot;h=a5dd47"
|
||||
|
||||
|
||||
Such URLs should should be modified by replacing semi-colons with '&'
|
||||
characters::
|
||||
|
||||
SRC_URI = "http://abc123.org/git/?p=gcc/gcc.git&a=snapshot&h=a5dd47"
|
||||
|
||||
|
||||
In most cases this should work. Treating semi-colons and '&' in
|
||||
queries identically is recommended by the World Wide Web Consortium
|
||||
(W3C). Note that due to the nature of the URL, you may have to
|
||||
specify the name of the downloaded file as well::
|
||||
|
||||
SRC_URI = "http://abc123.org/git/?p=gcc/gcc.git&a=snapshot&h=a5dd47;downloadfilename=myfile.bz2"
|
||||
|
||||
|
||||
.. _cvs-fetcher:
|
||||
|
||||
CVS fetcher (``(cvs://``)
|
||||
-------------------------
|
||||
|
||||
This submodule handles checking out files from the CVS version control
|
||||
system. You can configure it using a number of different variables:
|
||||
|
||||
- :term:`FETCHCMD_cvs <FETCHCMD>`: The name of the executable to use when running
|
||||
the ``cvs`` command. This name is usually "cvs".
|
||||
|
||||
- :term:`SRCDATE`: The date to use when fetching the CVS source code. A
|
||||
special value of "now" causes the checkout to be updated on every
|
||||
build.
|
||||
|
||||
- :term:`CVSDIR`: Specifies where a temporary
|
||||
checkout is saved. The location is often ``DL_DIR/cvs``.
|
||||
|
||||
- CVS_PROXY_HOST: The name to use as a "proxy=" parameter to the
|
||||
``cvs`` command.
|
||||
|
||||
- CVS_PROXY_PORT: The port number to use as a "proxyport="
|
||||
parameter to the ``cvs`` command.
|
||||
|
||||
As well as the standard username and password URL syntax, you can also
|
||||
configure the fetcher with various URL parameters:
|
||||
|
||||
The supported parameters are as follows:
|
||||
|
||||
- *"method":* The protocol over which to communicate with the CVS
|
||||
server. By default, this protocol is "pserver". If "method" is set to
|
||||
"ext", BitBake examines the "rsh" parameter and sets ``CVS_RSH``. You
|
||||
can use "dir" for local directories.
|
||||
|
||||
- *"module":* Specifies the module to check out. You must supply this
|
||||
parameter.
|
||||
|
||||
- *"tag":* Describes which CVS TAG should be used for the checkout. By
|
||||
default, the TAG is empty.
|
||||
|
||||
- *"date":* Specifies a date. If no "date" is specified, the
|
||||
:term:`SRCDATE` of the configuration is used to
|
||||
checkout a specific date. The special value of "now" causes the
|
||||
checkout to be updated on every build.
|
||||
|
||||
- *"localdir":* Used to rename the module. Effectively, you are
|
||||
renaming the output directory to which the module is unpacked. You
|
||||
are forcing the module into a special directory relative to
|
||||
:term:`CVSDIR`.
|
||||
|
||||
- *"rsh":* Used in conjunction with the "method" parameter.
|
||||
|
||||
- *"scmdata":* Causes the CVS metadata to be maintained in the tarball
|
||||
the fetcher creates when set to "keep". The tarball is expanded into
|
||||
the work directory. By default, the CVS metadata is removed.
|
||||
|
||||
- *"fullpath":* Controls whether the resulting checkout is at the
|
||||
module level, which is the default, or is at deeper paths.
|
||||
|
||||
- *"norecurse":* Causes the fetcher to only checkout the specified
|
||||
directory with no recurse into any subdirectories.
|
||||
|
||||
- *"port":* The port to which the CVS server connects.
|
||||
|
||||
Some example URLs are as follows::
|
||||
|
||||
SRC_URI = "cvs://CVSROOT;module=mymodule;tag=some-version;method=ext"
|
||||
SRC_URI = "cvs://CVSROOT;module=mymodule;date=20060126;localdir=usethat"
|
||||
|
||||
.. _svn-fetcher:
|
||||
|
||||
Subversion (SVN) Fetcher (``svn://``)
|
||||
-------------------------------------
|
||||
|
||||
This fetcher submodule fetches code from the Subversion source control
|
||||
system. The executable used is specified by ``FETCHCMD_svn``, which
|
||||
defaults to "svn". The fetcher's temporary working directory is set by
|
||||
:term:`SVNDIR`, which is usually ``DL_DIR/svn``.
|
||||
|
||||
The supported parameters are as follows:
|
||||
|
||||
- *"module":* The name of the svn module to checkout. You must provide
|
||||
this parameter. You can think of this parameter as the top-level
|
||||
directory of the repository data you want.
|
||||
|
||||
- *"path_spec":* A specific directory in which to checkout the
|
||||
specified svn module.
|
||||
|
||||
- *"protocol":* The protocol to use, which defaults to "svn". If
|
||||
"protocol" is set to "svn+ssh", the "ssh" parameter is also used.
|
||||
|
||||
- *"rev":* The revision of the source code to checkout.
|
||||
|
||||
- *"scmdata":* Causes the ".svn" directories to be available during
|
||||
compile-time when set to "keep". By default, these directories are
|
||||
removed.
|
||||
|
||||
- *"ssh":* An optional parameter used when "protocol" is set to
|
||||
"svn+ssh". You can use this parameter to specify the ssh program used
|
||||
by svn.
|
||||
|
||||
- *"transportuser":* When required, sets the username for the
|
||||
transport. By default, this parameter is empty. The transport
|
||||
username is different than the username used in the main URL, which
|
||||
is passed to the subversion command.
|
||||
|
||||
Following are three examples using svn::
|
||||
|
||||
SRC_URI = "svn://myrepos/proj1;module=vip;protocol=http;rev=667"
|
||||
SRC_URI = "svn://myrepos/proj1;module=opie;protocol=svn+ssh"
|
||||
SRC_URI = "svn://myrepos/proj1;module=trunk;protocol=http;path_spec=${MY_DIR}/proj1"
|
||||
|
||||
.. _git-fetcher:
|
||||
|
||||
Git Fetcher (``git://``)
|
||||
------------------------
|
||||
|
||||
This fetcher submodule fetches code from the Git source control system.
|
||||
The fetcher works by creating a bare clone of the remote into
|
||||
:term:`GITDIR`, which is usually ``DL_DIR/git2``. This
|
||||
bare clone is then cloned into the work directory during the unpack
|
||||
stage when a specific tree is checked out. This is done using alternates
|
||||
and by reference to minimize the amount of duplicate data on the disk
|
||||
and make the unpack process fast. The executable used can be set with
|
||||
``FETCHCMD_git``.
|
||||
|
||||
This fetcher supports the following parameters:
|
||||
|
||||
- *"protocol":* The protocol used to fetch the files. The default is
|
||||
"git" when a hostname is set. If a hostname is not set, the Git
|
||||
protocol is "file". You can also use "http", "https", "ssh" and
|
||||
"rsync".
|
||||
|
||||
.. note::
|
||||
|
||||
When ``protocol`` is "ssh", the URL expected in :term:`SRC_URI` differs
|
||||
from the one that is typically passed to ``git clone`` command and provided
|
||||
by the Git server to fetch from. For example, the URL returned by GitLab
|
||||
server for ``mesa`` when cloning over SSH is
|
||||
``git@gitlab.freedesktop.org:mesa/mesa.git``, however the expected URL in
|
||||
:term:`SRC_URI` is the following::
|
||||
|
||||
SRC_URI = "git://git@gitlab.freedesktop.org/mesa/mesa.git;branch=main;protocol=ssh;..."
|
||||
|
||||
Note the ``:`` character changed for a ``/`` before the path to the project.
|
||||
|
||||
- *"nocheckout":* Tells the fetcher to not checkout source code when
|
||||
unpacking when set to "1". Set this option for the URL where there is
|
||||
a custom routine to checkout code. The default is "0".
|
||||
|
||||
- *"rebaseable":* Indicates that the upstream Git repository can be
|
||||
rebased. You should set this parameter to "1" if revisions can become
|
||||
detached from branches. In this case, the source mirror tarball is
|
||||
done per revision, which has a loss of efficiency. Rebasing the
|
||||
upstream Git repository could cause the current revision to disappear
|
||||
from the upstream repository. This option reminds the fetcher to
|
||||
preserve the local cache carefully for future use. The default value
|
||||
for this parameter is "0".
|
||||
|
||||
- *"nobranch":* Tells the fetcher to not check the SHA validation for
|
||||
the branch when set to "1". The default is "0". Set this option for
|
||||
the recipe that refers to the commit that is valid for any namespace
|
||||
(branch, tag, ...) instead of the branch.
|
||||
|
||||
- *"bareclone":* Tells the fetcher to clone a bare clone into the
|
||||
destination directory without checking out a working tree. Only the
|
||||
raw Git metadata is provided. This parameter implies the "nocheckout"
|
||||
parameter as well.
|
||||
|
||||
- *"branch":* The branch(es) of the Git tree to clone. Unless
|
||||
"nobranch" is set to "1", this is a mandatory parameter. The number of
|
||||
branch parameters must match the number of name parameters.
|
||||
|
||||
- *"rev":* The revision to use for the checkout. The default is
|
||||
"master".
|
||||
|
||||
- *"tag":* Specifies a tag to use for the checkout. To correctly
|
||||
resolve tags, BitBake must access the network. For that reason, tags
|
||||
are often not used. As far as Git is concerned, the "tag" parameter
|
||||
behaves effectively the same as the "rev" parameter.
|
||||
|
||||
- *"subpath":* Limits the checkout to a specific subpath of the tree.
|
||||
By default, the whole tree is checked out.
|
||||
|
||||
- *"destsuffix":* The name of the path in which to place the checkout.
|
||||
By default, the path is ``git/``.
|
||||
|
||||
- *"usehead":* Enables local ``git://`` URLs to use the current branch
|
||||
HEAD as the revision for use with ``AUTOREV``. The "usehead"
|
||||
parameter implies no branch and only works when the transfer protocol
|
||||
is ``file://``.
|
||||
|
||||
Here are some example URLs::
|
||||
|
||||
SRC_URI = "git://github.com/fronteed/icheck.git;protocol=https;branch=${PV};tag=${PV}"
|
||||
SRC_URI = "git://github.com/asciidoc/asciidoc-py;protocol=https;branch=main"
|
||||
SRC_URI = "git://git@gitlab.freedesktop.org/mesa/mesa.git;branch=main;protocol=ssh;..."
|
||||
|
||||
.. note::
|
||||
|
||||
When using ``git`` as the fetcher of the main source code of your software,
|
||||
``S`` should be set accordingly::
|
||||
|
||||
S = "${WORKDIR}/git"
|
||||
|
||||
.. note::
|
||||
|
||||
Specifying passwords directly in ``git://`` urls is not supported.
|
||||
There are several reasons: :term:`SRC_URI` is often written out to logs and
|
||||
other places, and that could easily leak passwords; it is also all too
|
||||
easy to share metadata without removing passwords. SSH keys, ``~/.netrc``
|
||||
and ``~/.ssh/config`` files can be used as alternatives.
|
||||
|
||||
Using tags with the git fetcher may cause surprising behaviour. Bitbake needs to
|
||||
resolve the tag to a specific revision and to do that, it has to connect to and use
|
||||
the upstream repository. This is because the revision the tags point at can change and
|
||||
we've seen cases of this happening in well known public repositories. This can mean
|
||||
many more network connections than expected and recipes may be reparsed at every build.
|
||||
Source mirrors will also be bypassed as the upstream repository is the only source
|
||||
of truth to resolve the revision accurately. For these reasons, whilst the fetcher
|
||||
can support tags, we recommend being specific about revisions in recipes.
|
||||
|
||||
.. _gitsm-fetcher:
|
||||
|
||||
Git Submodule Fetcher (``gitsm://``)
|
||||
------------------------------------
|
||||
|
||||
This fetcher submodule inherits from the :ref:`Git
|
||||
fetcher<bitbake-user-manual/bitbake-user-manual-fetching:git fetcher
|
||||
(\`\`git://\`\`)>` and extends that fetcher's behavior by fetching a
|
||||
repository's submodules. :term:`SRC_URI` is passed to the Git fetcher as
|
||||
described in the :ref:`bitbake-user-manual/bitbake-user-manual-fetching:git
|
||||
fetcher (\`\`git://\`\`)` section.
|
||||
|
||||
.. note::
|
||||
|
||||
You must clean a recipe when switching between '``git://``' and
|
||||
'``gitsm://``' URLs.
|
||||
|
||||
The Git Submodules fetcher is not a complete fetcher implementation.
|
||||
The fetcher has known issues where it does not use the normal source
|
||||
mirroring infrastructure properly. Further, the submodule sources it
|
||||
fetches are not visible to the licensing and source archiving
|
||||
infrastructures.
|
||||
|
||||
.. _clearcase-fetcher:
|
||||
|
||||
ClearCase Fetcher (``ccrc://``)
|
||||
-------------------------------
|
||||
|
||||
This fetcher submodule fetches code from a
|
||||
`ClearCase <http://en.wikipedia.org/wiki/Rational_ClearCase>`__
|
||||
repository.
|
||||
|
||||
To use this fetcher, make sure your recipe has proper
|
||||
:term:`SRC_URI`, :term:`SRCREV`, and
|
||||
:term:`PV` settings. Here is an example::
|
||||
|
||||
SRC_URI = "ccrc://cc.example.org/ccrc;vob=/example_vob;module=/example_module"
|
||||
SRCREV = "EXAMPLE_CLEARCASE_TAG"
|
||||
PV = "${@d.getVar("SRCREV", False).replace("/", "+")}"
|
||||
|
||||
The fetcher uses the ``rcleartool`` or
|
||||
``cleartool`` remote client, depending on which one is available.
|
||||
|
||||
Following are options for the :term:`SRC_URI` statement:
|
||||
|
||||
- *vob*: The name, which must include the prepending "/" character,
|
||||
of the ClearCase VOB. This option is required.
|
||||
|
||||
- *module*: The module, which must include the prepending "/"
|
||||
character, in the selected VOB.
|
||||
|
||||
.. note::
|
||||
|
||||
The module and vob options are combined to create the load rule in the
|
||||
view config spec. As an example, consider the vob and module values from
|
||||
the SRC_URI statement at the start of this section. Combining those values
|
||||
results in the following::
|
||||
|
||||
load /example_vob/example_module
|
||||
|
||||
- *proto*: The protocol, which can be either ``http`` or ``https``.
|
||||
|
||||
By default, the fetcher creates a configuration specification. If you
|
||||
want this specification written to an area other than the default, use
|
||||
the ``CCASE_CUSTOM_CONFIG_SPEC`` variable in your recipe to define where
|
||||
the specification is written.
|
||||
|
||||
.. note::
|
||||
|
||||
the SRCREV loses its functionality if you specify this variable. However,
|
||||
SRCREV is still used to label the archive after a fetch even though it does
|
||||
not define what is fetched.
|
||||
|
||||
Here are a couple of other behaviors worth mentioning:
|
||||
|
||||
- When using ``cleartool``, the login of ``cleartool`` is handled by
|
||||
the system. The login require no special steps.
|
||||
|
||||
- In order to use ``rcleartool`` with authenticated users, an
|
||||
"rcleartool login" is necessary before using the fetcher.
|
||||
|
||||
.. _perforce-fetcher:
|
||||
|
||||
Perforce Fetcher (``p4://``)
|
||||
----------------------------
|
||||
|
||||
This fetcher submodule fetches code from the
|
||||
`Perforce <https://www.perforce.com/>`__ source control system. The
|
||||
executable used is specified by ``FETCHCMD_p4``, which defaults to "p4".
|
||||
The fetcher's temporary working directory is set by
|
||||
:term:`P4DIR`, which defaults to "DL_DIR/p4".
|
||||
The fetcher does not make use of a perforce client, instead it
|
||||
relies on ``p4 files`` to retrieve a list of
|
||||
files and ``p4 print`` to transfer the content
|
||||
of those files locally.
|
||||
|
||||
To use this fetcher, make sure your recipe has proper
|
||||
:term:`SRC_URI`, :term:`SRCREV`, and
|
||||
:term:`PV` values. The p4 executable is able to use the
|
||||
config file defined by your system's ``P4CONFIG`` environment variable
|
||||
in order to define the Perforce server URL and port, username, and
|
||||
password if you do not wish to keep those values in a recipe itself. If
|
||||
you choose not to use ``P4CONFIG``, or to explicitly set variables that
|
||||
``P4CONFIG`` can contain, you can specify the ``P4PORT`` value, which is
|
||||
the server's URL and port number, and you can specify a username and
|
||||
password directly in your recipe within :term:`SRC_URI`.
|
||||
|
||||
Here is an example that relies on ``P4CONFIG`` to specify the server URL
|
||||
and port, username, and password, and fetches the Head Revision::
|
||||
|
||||
SRC_URI = "p4://example-depot/main/source/..."
|
||||
SRCREV = "${AUTOREV}"
|
||||
PV = "p4-${SRCPV}"
|
||||
S = "${WORKDIR}/p4"
|
||||
|
||||
Here is an example that specifies the server URL and port, username, and
|
||||
password, and fetches a Revision based on a Label::
|
||||
|
||||
P4PORT = "tcp:p4server.example.net:1666"
|
||||
SRC_URI = "p4://user:passwd@example-depot/main/source/..."
|
||||
SRCREV = "release-1.0"
|
||||
PV = "p4-${SRCPV}"
|
||||
S = "${WORKDIR}/p4"
|
||||
|
||||
.. note::
|
||||
|
||||
You should always set S to "${WORKDIR}/p4" in your recipe.
|
||||
|
||||
By default, the fetcher strips the depot location from the local file paths. In
|
||||
the above example, the content of ``example-depot/main/source/`` will be placed
|
||||
in ``${WORKDIR}/p4``. For situations where preserving parts of the remote depot
|
||||
paths locally is desirable, the fetcher supports two parameters:
|
||||
|
||||
- *"module":*
|
||||
The top-level depot location or directory to fetch. The value of this
|
||||
parameter can also point to a single file within the depot, in which case
|
||||
the local file path will include the module path.
|
||||
- *"remotepath":*
|
||||
When used with the value "``keep``", the fetcher will mirror the full depot
|
||||
paths locally for the specified location, even in combination with the
|
||||
``module`` parameter.
|
||||
|
||||
Here is an example use of the the ``module`` parameter::
|
||||
|
||||
SRC_URI = "p4://user:passwd@example-depot/main;module=source/..."
|
||||
|
||||
In this case, the content of the top-level directory ``source/`` will be fetched
|
||||
to ``${P4DIR}``, including the directory itself. The top-level directory will
|
||||
be accesible at ``${P4DIR}/source/``.
|
||||
|
||||
Here is an example use of the the ``remotepath`` parameter::
|
||||
|
||||
SRC_URI = "p4://user:passwd@example-depot/main;module=source/...;remotepath=keep"
|
||||
|
||||
In this case, the content of the top-level directory ``source/`` will be fetched
|
||||
to ``${P4DIR}``, but the complete depot paths will be mirrored locally. The
|
||||
top-level directory will be accessible at
|
||||
``${P4DIR}/example-depot/main/source/``.
|
||||
|
||||
.. _repo-fetcher:
|
||||
|
||||
Repo Fetcher (``repo://``)
|
||||
--------------------------
|
||||
|
||||
This fetcher submodule fetches code from ``google-repo`` source control
|
||||
system. The fetcher works by initiating and syncing sources of the
|
||||
repository into :term:`REPODIR`, which is usually
|
||||
``${DL_DIR}/repo``.
|
||||
|
||||
This fetcher supports the following parameters:
|
||||
|
||||
- *"protocol":* Protocol to fetch the repository manifest (default:
|
||||
git).
|
||||
|
||||
- *"branch":* Branch or tag of repository to get (default: master).
|
||||
|
||||
- *"manifest":* Name of the manifest file (default: ``default.xml``).
|
||||
|
||||
Here are some example URLs::
|
||||
|
||||
SRC_URI = "repo://REPOROOT;protocol=git;branch=some_branch;manifest=my_manifest.xml"
|
||||
SRC_URI = "repo://REPOROOT;protocol=file;branch=some_branch;manifest=my_manifest.xml"
|
||||
|
||||
.. _az-fetcher:
|
||||
|
||||
Az Fetcher (``az://``)
|
||||
--------------------------
|
||||
|
||||
This submodule fetches data from an
|
||||
`Azure Storage account <https://docs.microsoft.com/en-us/azure/storage/>`__ ,
|
||||
it inherits its functionality from the HTTP wget fetcher, but modifies its
|
||||
behavior to accomodate the usage of a
|
||||
`Shared Access Signature (SAS) <https://docs.microsoft.com/en-us/azure/storage/common/storage-sas-overview>`__
|
||||
for non-public data.
|
||||
|
||||
Such functionality is set by the variable:
|
||||
|
||||
- :term:`AZ_SAS`: The Azure Storage Shared Access Signature provides secure
|
||||
delegate access to resources, if this variable is set, the Az Fetcher will
|
||||
use it when fetching artifacts from the cloud.
|
||||
|
||||
You can specify the AZ_SAS variable as shown below::
|
||||
|
||||
AZ_SAS = "se=2021-01-01&sp=r&sv=2018-11-09&sr=c&skoid=<skoid>&sig=<signature>"
|
||||
|
||||
Here is an example URL::
|
||||
|
||||
SRC_URI = "az://<azure-storage-account>.blob.core.windows.net/<foo_container>/<bar_file>"
|
||||
|
||||
It can also be used when setting mirrors definitions using the :term:`PREMIRRORS` variable.
|
||||
|
||||
.. _gcp-fetcher:
|
||||
|
||||
GCP Fetcher (``gs://``)
|
||||
--------------------------
|
||||
|
||||
This submodule fetches data from a
|
||||
`Google Cloud Storage Bucket <https://cloud.google.com/storage/docs/buckets>`__.
|
||||
It uses the `Google Cloud Storage Python Client <https://cloud.google.com/python/docs/reference/storage/latest>`__
|
||||
to check the status of objects in the bucket and download them.
|
||||
The use of the Python client makes it substantially faster than using command
|
||||
line tools such as gsutil.
|
||||
|
||||
The fetcher requires the Google Cloud Storage Python Client to be installed, along
|
||||
with the gsutil tool.
|
||||
|
||||
The fetcher requires that the machine has valid credentials for accessing the
|
||||
chosen bucket. Instructions for authentication can be found in the
|
||||
`Google Cloud documentation <https://cloud.google.com/docs/authentication/provide-credentials-adc#local-dev>`__.
|
||||
|
||||
If it used from the OpenEmbedded build system, the fetcher can be used for
|
||||
fetching sstate artifacts from a GCS bucket by specifying the
|
||||
``SSTATE_MIRRORS`` variable as shown below::
|
||||
|
||||
SSTATE_MIRRORS ?= "\
|
||||
file://.* gs://<bucket name>/PATH \
|
||||
"
|
||||
|
||||
The fetcher can also be used in recipes::
|
||||
|
||||
SRC_URI = "gs://<bucket name>/<foo_container>/<bar_file>"
|
||||
|
||||
However, the checksum of the file should be also be provided::
|
||||
|
||||
SRC_URI[sha256sum] = "<sha256 string>"
|
||||
|
||||
.. _crate-fetcher:
|
||||
|
||||
Crate Fetcher (``crate://``)
|
||||
----------------------------
|
||||
|
||||
This submodule fetches code for
|
||||
`Rust language "crates" <https://doc.rust-lang.org/reference/glossary.html?highlight=crate#crate>`__
|
||||
corresponding to Rust libraries and programs to compile. Such crates are typically shared
|
||||
on https://crates.io/ but this fetcher supports other crate registries too.
|
||||
|
||||
The format for the :term:`SRC_URI` setting must be::
|
||||
|
||||
SRC_URI = "crate://REGISTRY/NAME/VERSION"
|
||||
|
||||
Here is an example URL::
|
||||
|
||||
SRC_URI = "crate://crates.io/glob/0.2.11"
|
||||
|
||||
.. _npm-fetcher:
|
||||
|
||||
NPM Fetcher (``npm://``)
|
||||
------------------------
|
||||
|
||||
This submodule fetches source code from an
|
||||
`NPM <https://en.wikipedia.org/wiki/Npm_(software)>`__
|
||||
Javascript package registry.
|
||||
|
||||
The format for the :term:`SRC_URI` setting must be::
|
||||
|
||||
SRC_URI = "npm://some.registry.url;ParameterA=xxx;ParameterB=xxx;..."
|
||||
|
||||
This fetcher supports the following parameters:
|
||||
|
||||
- *"package":* The NPM package name. This is a mandatory parameter.
|
||||
|
||||
- *"version":* The NPM package version. This is a mandatory parameter.
|
||||
|
||||
- *"downloadfilename":* Specifies the filename used when storing the downloaded file.
|
||||
|
||||
- *"destsuffix":* Specifies the directory to use to unpack the package (default: ``npm``).
|
||||
|
||||
Note that NPM fetcher only fetches the package source itself. The dependencies
|
||||
can be fetched through the `npmsw-fetcher`_.
|
||||
|
||||
Here is an example URL with both fetchers::
|
||||
|
||||
SRC_URI = " \
|
||||
npm://registry.npmjs.org/;package=cute-files;version=${PV} \
|
||||
npmsw://${THISDIR}/${BPN}/npm-shrinkwrap.json \
|
||||
"
|
||||
|
||||
See :yocto_docs:`Creating Node Package Manager (NPM) Packages
|
||||
</dev-manual/packages.html#creating-node-package-manager-npm-packages>`
|
||||
in the Yocto Project manual for details about using
|
||||
:yocto_docs:`devtool <https://docs.yoctoproject.org/ref-manual/devtool-reference.html>`
|
||||
to automatically create a recipe from an NPM URL.
|
||||
|
||||
.. _npmsw-fetcher:
|
||||
|
||||
NPM shrinkwrap Fetcher (``npmsw://``)
|
||||
-------------------------------------
|
||||
|
||||
This submodule fetches source code from an
|
||||
`NPM shrinkwrap <https://docs.npmjs.com/cli/v8/commands/npm-shrinkwrap>`__
|
||||
description file, which lists the dependencies
|
||||
of an NPM package while locking their versions.
|
||||
|
||||
The format for the :term:`SRC_URI` setting must be::
|
||||
|
||||
SRC_URI = "npmsw://some.registry.url;ParameterA=xxx;ParameterB=xxx;..."
|
||||
|
||||
This fetcher supports the following parameters:
|
||||
|
||||
- *"dev":* Set this parameter to ``1`` to install "devDependencies".
|
||||
|
||||
- *"destsuffix":* Specifies the directory to use to unpack the dependencies
|
||||
(``${S}`` by default).
|
||||
|
||||
Note that the shrinkwrap file can also be provided by the recipe for
|
||||
the package which has such dependencies, for example::
|
||||
|
||||
SRC_URI = " \
|
||||
npm://registry.npmjs.org/;package=cute-files;version=${PV} \
|
||||
npmsw://${THISDIR}/${BPN}/npm-shrinkwrap.json \
|
||||
"
|
||||
|
||||
Such a file can automatically be generated using
|
||||
:yocto_docs:`devtool <https://docs.yoctoproject.org/ref-manual/devtool-reference.html>`
|
||||
as described in the :yocto_docs:`Creating Node Package Manager (NPM) Packages
|
||||
</dev-manual/packages.html#creating-node-package-manager-npm-packages>`
|
||||
section of the Yocto Project.
|
||||
|
||||
Other Fetchers
|
||||
--------------
|
||||
|
||||
Fetch submodules also exist for the following:
|
||||
|
||||
- Bazaar (``bzr://``)
|
||||
|
||||
- Mercurial (``hg://``)
|
||||
|
||||
- OSC (``osc://``)
|
||||
|
||||
- S3 (``s3://``)
|
||||
|
||||
- Secure FTP (``sftp://``)
|
||||
|
||||
- Secure Shell (``ssh://``)
|
||||
|
||||
- Trees using Git Annex (``gitannex://``)
|
||||
|
||||
No documentation currently exists for these lesser used fetcher
|
||||
submodules. However, you might find the code helpful and readable.
|
||||
|
||||
Auto Revisions
|
||||
==============
|
||||
|
||||
We need to document ``AUTOREV`` and :term:`SRCREV_FORMAT` here.
|
||||
@@ -0,0 +1,408 @@
|
||||
.. SPDX-License-Identifier: CC-BY-2.5
|
||||
|
||||
===================
|
||||
Hello World Example
|
||||
===================
|
||||
|
||||
BitBake Hello World
|
||||
===================
|
||||
|
||||
The simplest example commonly used to demonstrate any new programming
|
||||
language or tool is the "`Hello
|
||||
World <http://en.wikipedia.org/wiki/Hello_world_program>`__" example.
|
||||
This appendix demonstrates, in tutorial form, Hello World within the
|
||||
context of BitBake. The tutorial describes how to create a new project
|
||||
and the applicable metadata files necessary to allow BitBake to build
|
||||
it.
|
||||
|
||||
Obtaining BitBake
|
||||
=================
|
||||
|
||||
See the :ref:`bitbake-user-manual/bitbake-user-manual-intro:obtaining bitbake` section for
|
||||
information on how to obtain BitBake. Once you have the source code on
|
||||
your machine, the BitBake directory appears as follows::
|
||||
|
||||
$ ls -al
|
||||
total 108
|
||||
drwxr-xr-x 9 fawkh 10000 4096 feb 24 12:10 .
|
||||
drwx------ 36 fawkh 10000 4096 mar 2 17:00 ..
|
||||
-rw-r--r-- 1 fawkh 10000 365 feb 24 12:10 AUTHORS
|
||||
drwxr-xr-x 2 fawkh 10000 4096 feb 24 12:10 bin
|
||||
-rw-r--r-- 1 fawkh 10000 16501 feb 24 12:10 ChangeLog
|
||||
drwxr-xr-x 2 fawkh 10000 4096 feb 24 12:10 classes
|
||||
drwxr-xr-x 2 fawkh 10000 4096 feb 24 12:10 conf
|
||||
drwxr-xr-x 5 fawkh 10000 4096 feb 24 12:10 contrib
|
||||
drwxr-xr-x 6 fawkh 10000 4096 feb 24 12:10 doc
|
||||
drwxr-xr-x 8 fawkh 10000 4096 mar 2 16:26 .git
|
||||
-rw-r--r-- 1 fawkh 10000 31 feb 24 12:10 .gitattributes
|
||||
-rw-r--r-- 1 fawkh 10000 392 feb 24 12:10 .gitignore
|
||||
drwxr-xr-x 13 fawkh 10000 4096 feb 24 12:11 lib
|
||||
-rw-r--r-- 1 fawkh 10000 1224 feb 24 12:10 LICENSE
|
||||
-rw-r--r-- 1 fawkh 10000 15394 feb 24 12:10 LICENSE.GPL-2.0-only
|
||||
-rw-r--r-- 1 fawkh 10000 1286 feb 24 12:10 LICENSE.MIT
|
||||
-rw-r--r-- 1 fawkh 10000 229 feb 24 12:10 MANIFEST.in
|
||||
-rw-r--r-- 1 fawkh 10000 2413 feb 24 12:10 README
|
||||
-rw-r--r-- 1 fawkh 10000 43 feb 24 12:10 toaster-requirements.txt
|
||||
-rw-r--r-- 1 fawkh 10000 2887 feb 24 12:10 TODO
|
||||
|
||||
At this point, you should have BitBake cloned to a directory that
|
||||
matches the previous listing except for dates and user names.
|
||||
|
||||
Setting Up the BitBake Environment
|
||||
==================================
|
||||
|
||||
First, you need to be sure that you can run BitBake. Set your working
|
||||
directory to where your local BitBake files are and run the following
|
||||
command::
|
||||
|
||||
$ ./bin/bitbake --version
|
||||
BitBake Build Tool Core version 2.3.1
|
||||
|
||||
The console output tells you what version
|
||||
you are running.
|
||||
|
||||
The recommended method to run BitBake is from a directory of your
|
||||
choice. To be able to run BitBake from any directory, you need to add
|
||||
the executable binary to your binary to your shell's environment
|
||||
``PATH`` variable. First, look at your current ``PATH`` variable by
|
||||
entering the following::
|
||||
|
||||
$ echo $PATH
|
||||
|
||||
Next, add the directory location
|
||||
for the BitBake binary to the ``PATH``. Here is an example that adds the
|
||||
``/home/scott-lenovo/bitbake/bin`` directory to the front of the
|
||||
``PATH`` variable::
|
||||
|
||||
$ export PATH=/home/scott-lenovo/bitbake/bin:$PATH
|
||||
|
||||
You should now be able to enter the ``bitbake`` command from the command
|
||||
line while working from any directory.
|
||||
|
||||
The Hello World Example
|
||||
=======================
|
||||
|
||||
The overall goal of this exercise is to build a complete "Hello World"
|
||||
example utilizing task and layer concepts. Because this is how modern
|
||||
projects such as OpenEmbedded and the Yocto Project utilize BitBake, the
|
||||
example provides an excellent starting point for understanding BitBake.
|
||||
|
||||
To help you understand how to use BitBake to build targets, the example
|
||||
starts with nothing but the ``bitbake`` command, which causes BitBake to
|
||||
fail and report problems. The example progresses by adding pieces to the
|
||||
build to eventually conclude with a working, minimal "Hello World"
|
||||
example.
|
||||
|
||||
While every attempt is made to explain what is happening during the
|
||||
example, the descriptions cannot cover everything. You can find further
|
||||
information throughout this manual. Also, you can actively participate
|
||||
in the :oe_lists:`/g/bitbake-devel`
|
||||
discussion mailing list about the BitBake build tool.
|
||||
|
||||
.. note::
|
||||
|
||||
This example was inspired by and drew heavily from
|
||||
`Mailing List post - The BitBake equivalent of "Hello, World!"
|
||||
<https://www.mail-archive.com/yocto@yoctoproject.org/msg09379.html>`_.
|
||||
|
||||
As stated earlier, the goal of this example is to eventually compile
|
||||
"Hello World". However, it is unknown what BitBake needs and what you
|
||||
have to provide in order to achieve that goal. Recall that BitBake
|
||||
utilizes three types of metadata files:
|
||||
:ref:`bitbake-user-manual/bitbake-user-manual-intro:configuration files`,
|
||||
:ref:`bitbake-user-manual/bitbake-user-manual-intro:classes`, and
|
||||
:ref:`bitbake-user-manual/bitbake-user-manual-intro:recipes`.
|
||||
But where do they go? How does BitBake find
|
||||
them? BitBake's error messaging helps you answer these types of
|
||||
questions and helps you better understand exactly what is going on.
|
||||
|
||||
Following is the complete "Hello World" example.
|
||||
|
||||
#. **Create a Project Directory:** First, set up a directory for the
|
||||
"Hello World" project. Here is how you can do so in your home
|
||||
directory::
|
||||
|
||||
$ mkdir ~/hello
|
||||
$ cd ~/hello
|
||||
|
||||
This is the directory that
|
||||
BitBake will use to do all of its work. You can use this directory
|
||||
to keep all the metafiles needed by BitBake. Having a project
|
||||
directory is a good way to isolate your project.
|
||||
|
||||
#. **Run BitBake:** At this point, you have nothing but a project
|
||||
directory. Run the ``bitbake`` command and see what it does::
|
||||
|
||||
$ bitbake
|
||||
ERROR: The BBPATH variable is not set and bitbake did not find a conf/bblayers.conf file in the expected location.
|
||||
Maybe you accidentally invoked bitbake from the wrong directory?
|
||||
|
||||
When you run BitBake, it begins looking for metadata files. The
|
||||
:term:`BBPATH` variable is what tells BitBake where
|
||||
to look for those files. :term:`BBPATH` is not set and you need to set
|
||||
it. Without :term:`BBPATH`, BitBake cannot find any configuration files
|
||||
(``.conf``) or recipe files (``.bb``) at all. BitBake also cannot
|
||||
find the ``bitbake.conf`` file.
|
||||
|
||||
#. **Setting BBPATH:** For this example, you can set :term:`BBPATH` in
|
||||
the same manner that you set ``PATH`` earlier in the appendix. You
|
||||
should realize, though, that it is much more flexible to set the
|
||||
:term:`BBPATH` variable up in a configuration file for each project.
|
||||
|
||||
From your shell, enter the following commands to set and export the
|
||||
:term:`BBPATH` variable::
|
||||
|
||||
$ BBPATH="projectdirectory"
|
||||
$ export BBPATH
|
||||
|
||||
Use your actual project directory in the command. BitBake uses that
|
||||
directory to find the metadata it needs for your project.
|
||||
|
||||
.. note::
|
||||
|
||||
When specifying your project directory, do not use the tilde
|
||||
("~") character as BitBake does not expand that character as the
|
||||
shell would.
|
||||
|
||||
#. **Run BitBake:** Now that you have :term:`BBPATH` defined, run the
|
||||
``bitbake`` command again::
|
||||
|
||||
$ bitbake
|
||||
ERROR: Unable to parse /home/scott-lenovo/bitbake/lib/bb/parse/__init__.py
|
||||
Traceback (most recent call last):
|
||||
File "/home/scott-lenovo/bitbake/lib/bb/parse/__init__.py", line 127, in resolve_file(fn='conf/bitbake.conf', d=<bb.data_smart.DataSmart object at 0x7f22919a3df0>):
|
||||
if not newfn:
|
||||
> raise IOError(errno.ENOENT, "file %s not found in %s" % (fn, bbpath))
|
||||
fn = newfn
|
||||
FileNotFoundError: [Errno 2] file conf/bitbake.conf not found in <projectdirectory>
|
||||
|
||||
|
||||
This sample output shows that BitBake could not find the
|
||||
``conf/bitbake.conf`` file in the project directory. This file is
|
||||
the first thing BitBake must find in order to build a target. And,
|
||||
since the project directory for this example is empty, you need to
|
||||
provide a ``conf/bitbake.conf`` file.
|
||||
|
||||
#. **Creating conf/bitbake.conf:** The ``conf/bitbake.conf`` includes
|
||||
a number of configuration variables BitBake uses for metadata and
|
||||
recipe files. For this example, you need to create the file in your
|
||||
project directory and define some key BitBake variables. For more
|
||||
information on the ``bitbake.conf`` file, see
|
||||
https://git.openembedded.org/bitbake/tree/conf/bitbake.conf.
|
||||
|
||||
Use the following commands to create the ``conf`` directory in the
|
||||
project directory::
|
||||
|
||||
$ mkdir conf
|
||||
|
||||
From within the ``conf`` directory,
|
||||
use some editor to create the ``bitbake.conf`` so that it contains
|
||||
the following::
|
||||
|
||||
PN = "${@bb.parse.vars_from_file(d.getVar('FILE', False),d)[0] or 'defaultpkgname'}"
|
||||
|
||||
TMPDIR = "${TOPDIR}/tmp"
|
||||
CACHE = "${TMPDIR}/cache"
|
||||
STAMP = "${TMPDIR}/${PN}/stamps"
|
||||
T = "${TMPDIR}/${PN}/work"
|
||||
B = "${TMPDIR}/${PN}"
|
||||
|
||||
.. note::
|
||||
|
||||
Without a value for :term:`PN`, the variables :term:`STAMP`, :term:`T`, and :term:`B`, prevent more
|
||||
than one recipe from working. You can fix this by either setting :term:`PN` to
|
||||
have a value similar to what OpenEmbedded and BitBake use in the default
|
||||
``bitbake.conf`` file (see previous example). Or, by manually updating each
|
||||
recipe to set :term:`PN`. You will also need to include :term:`PN` as part of the :term:`STAMP`,
|
||||
:term:`T`, and :term:`B` variable definitions in the ``local.conf`` file.
|
||||
|
||||
The ``TMPDIR`` variable establishes a directory that BitBake uses
|
||||
for build output and intermediate files other than the cached
|
||||
information used by the
|
||||
:ref:`bitbake-user-manual/bitbake-user-manual-execution:setscene`
|
||||
process. Here, the ``TMPDIR`` directory is set to ``hello/tmp``.
|
||||
|
||||
.. tip::
|
||||
|
||||
You can always safely delete the tmp directory in order to rebuild a
|
||||
BitBake target. The build process creates the directory for you when you
|
||||
run BitBake.
|
||||
|
||||
For information about each of the other variables defined in this
|
||||
example, check :term:`PN`, :term:`TOPDIR`, :term:`CACHE`, :term:`STAMP`,
|
||||
:term:`T` or :term:`B` to take you to the definitions in the
|
||||
glossary.
|
||||
|
||||
#. **Run BitBake:** After making sure that the ``conf/bitbake.conf`` file
|
||||
exists, you can run the ``bitbake`` command again::
|
||||
|
||||
$ bitbake
|
||||
ERROR: Unable to parse /home/scott-lenovo/bitbake/lib/bb/parse/parse_py/BBHandler.py
|
||||
Traceback (most recent call last):
|
||||
File "/home/scott-lenovo/bitbake/lib/bb/parse/parse_py/BBHandler.py", line 67, in inherit(files=['base'], fn='configuration INHERITs', lineno=0, d=<bb.data_smart.DataSmart object at 0x7fab6815edf0>):
|
||||
if not os.path.exists(file):
|
||||
> raise ParseError("Could not inherit file %s" % (file), fn, lineno)
|
||||
|
||||
bb.parse.ParseError: ParseError in configuration INHERITs: Could not inherit file classes/base.bbclass
|
||||
|
||||
|
||||
In the sample output,
|
||||
BitBake could not find the ``classes/base.bbclass`` file. You need
|
||||
to create that file next.
|
||||
|
||||
#. **Creating classes/base.bbclass:** BitBake uses class files to
|
||||
provide common code and functionality. The minimally required class
|
||||
for BitBake is the ``classes/base.bbclass`` file. The ``base`` class
|
||||
is implicitly inherited by every recipe. BitBake looks for the class
|
||||
in the ``classes`` directory of the project (i.e ``hello/classes``
|
||||
in this example).
|
||||
|
||||
Create the ``classes`` directory as follows::
|
||||
|
||||
$ cd $HOME/hello
|
||||
$ mkdir classes
|
||||
|
||||
Move to the ``classes`` directory and then create the
|
||||
``base.bbclass`` file by inserting this single line::
|
||||
|
||||
addtask build
|
||||
|
||||
The minimal task that BitBake runs is the ``do_build`` task. This is
|
||||
all the example needs in order to build the project. Of course, the
|
||||
``base.bbclass`` can have much more depending on which build
|
||||
environments BitBake is supporting.
|
||||
|
||||
#. **Run BitBake:** After making sure that the ``classes/base.bbclass``
|
||||
file exists, you can run the ``bitbake`` command again::
|
||||
|
||||
$ bitbake
|
||||
Nothing to do. Use 'bitbake world' to build everything, or run 'bitbake --help' for usage information.
|
||||
|
||||
BitBake is finally reporting
|
||||
no errors. However, you can see that it really does not have
|
||||
anything to do. You need to create a recipe that gives BitBake
|
||||
something to do.
|
||||
|
||||
#. **Creating a Layer:** While it is not really necessary for such a
|
||||
small example, it is good practice to create a layer in which to
|
||||
keep your code separate from the general metadata used by BitBake.
|
||||
Thus, this example creates and uses a layer called "mylayer".
|
||||
|
||||
.. note::
|
||||
|
||||
You can find additional information on layers in the
|
||||
":ref:`bitbake-user-manual/bitbake-user-manual-intro:Layers`" section.
|
||||
|
||||
Minimally, you need a recipe file and a layer configuration file in
|
||||
your layer. The configuration file needs to be in the ``conf``
|
||||
directory inside the layer. Use these commands to set up the layer
|
||||
and the ``conf`` directory::
|
||||
|
||||
$ cd $HOME
|
||||
$ mkdir mylayer
|
||||
$ cd mylayer
|
||||
$ mkdir conf
|
||||
|
||||
Move to the ``conf`` directory and create a ``layer.conf`` file that has the
|
||||
following::
|
||||
|
||||
BBPATH .= ":${LAYERDIR}"
|
||||
BBFILES += "${LAYERDIR}/*.bb"
|
||||
BBFILE_COLLECTIONS += "mylayer"
|
||||
BBFILE_PATTERN_mylayer := "^${LAYERDIR_RE}/"
|
||||
LAYERSERIES_CORENAMES = "hello_world_example"
|
||||
LAYERSERIES_COMPAT_mylayer = "hello_world_example"
|
||||
|
||||
For information on these variables, click on :term:`BBFILES`,
|
||||
:term:`LAYERDIR`, :term:`BBFILE_COLLECTIONS`, :term:`BBFILE_PATTERN_mylayer <BBFILE_PATTERN>`
|
||||
or :term:`LAYERSERIES_COMPAT` to go to the definitions in the glossary.
|
||||
|
||||
.. note::
|
||||
|
||||
We are setting both ``LAYERSERIES_CORENAMES`` and :term:`LAYERSERIES_COMPAT` in this particular case, because we
|
||||
are using bitbake without OpenEmbedded.
|
||||
You should usually just use :term:`LAYERSERIES_COMPAT` to specify the OE-Core versions for which your layer
|
||||
is compatible, and add the meta-openembedded layer to your project.
|
||||
|
||||
You need to create the recipe file next. Inside your layer at the
|
||||
top-level, use an editor and create a recipe file named
|
||||
``printhello.bb`` that has the following::
|
||||
|
||||
DESCRIPTION = "Prints Hello World"
|
||||
PN = 'printhello'
|
||||
PV = '1'
|
||||
|
||||
python do_build() {
|
||||
bb.plain("********************");
|
||||
bb.plain("* *");
|
||||
bb.plain("* Hello, World! *");
|
||||
bb.plain("* *");
|
||||
bb.plain("********************");
|
||||
}
|
||||
|
||||
The recipe file simply provides
|
||||
a description of the recipe, the name, version, and the ``do_build``
|
||||
task, which prints out "Hello World" to the console. For more
|
||||
information on :term:`DESCRIPTION`, :term:`PN` or :term:`PV`
|
||||
follow the links to the glossary.
|
||||
|
||||
#. **Run BitBake With a Target:** Now that a BitBake target exists, run
|
||||
the command and provide that target::
|
||||
|
||||
$ cd $HOME/hello
|
||||
$ bitbake printhello
|
||||
ERROR: no recipe files to build, check your BBPATH and BBFILES?
|
||||
|
||||
Summary: There was 1 ERROR message shown, returning a non-zero exit code.
|
||||
|
||||
We have created the layer with the recipe and
|
||||
the layer configuration file but it still seems that BitBake cannot
|
||||
find the recipe. BitBake needs a ``conf/bblayers.conf`` that lists
|
||||
the layers for the project. Without this file, BitBake cannot find
|
||||
the recipe.
|
||||
|
||||
#. **Creating conf/bblayers.conf:** BitBake uses the
|
||||
``conf/bblayers.conf`` file to locate layers needed for the project.
|
||||
This file must reside in the ``conf`` directory of the project (i.e.
|
||||
``hello/conf`` for this example).
|
||||
|
||||
Set your working directory to the ``hello/conf`` directory and then
|
||||
create the ``bblayers.conf`` file so that it contains the following::
|
||||
|
||||
BBLAYERS ?= " \
|
||||
/home/<you>/mylayer \
|
||||
"
|
||||
|
||||
You need to provide your own information for ``you`` in the file.
|
||||
|
||||
#. **Run BitBake With a Target:** Now that you have supplied the
|
||||
``bblayers.conf`` file, run the ``bitbake`` command and provide the
|
||||
target::
|
||||
|
||||
$ bitbake printhello
|
||||
Loading cache: 100% |
|
||||
Loaded 0 entries from dependency cache.
|
||||
Parsing recipes: 100% |##################################################################################|
|
||||
Parsing of 1 .bb files complete (0 cached, 1 parsed). 1 targets, 0 skipped, 0 masked, 0 errors.
|
||||
NOTE: Resolving any missing task queue dependencies
|
||||
Initialising tasks: 100% |###############################################################################|
|
||||
NOTE: No setscene tasks
|
||||
NOTE: Executing Tasks
|
||||
********************
|
||||
* *
|
||||
* Hello, World! *
|
||||
* *
|
||||
********************
|
||||
NOTE: Tasks Summary: Attempted 1 tasks of which 0 didn't need to be rerun and all succeeded.
|
||||
|
||||
.. note::
|
||||
|
||||
After the first execution, re-running bitbake printhello again will not
|
||||
result in a BitBake run that prints the same console output. The reason
|
||||
for this is that the first time the printhello.bb recipe's do_build task
|
||||
executes successfully, BitBake writes a stamp file for the task. Thus,
|
||||
the next time you attempt to run the task using that same bitbake
|
||||
command, BitBake notices the stamp and therefore determines that the task
|
||||
does not need to be re-run. If you delete the tmp directory or run
|
||||
bitbake -c clean printhello and then re-run the build, the "Hello,
|
||||
World!" message will be printed again.
|
||||
@@ -0,0 +1,653 @@
|
||||
.. SPDX-License-Identifier: CC-BY-2.5
|
||||
|
||||
========
|
||||
Overview
|
||||
========
|
||||
|
||||
|
|
||||
|
||||
Welcome to the BitBake User Manual. This manual provides information on
|
||||
the BitBake tool. The information attempts to be as independent as
|
||||
possible regarding systems that use BitBake, such as OpenEmbedded and
|
||||
the Yocto Project. In some cases, scenarios or examples within the
|
||||
context of a build system are used in the manual to help with
|
||||
understanding. For these cases, the manual clearly states the context.
|
||||
|
||||
.. _intro:
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
Fundamentally, BitBake is a generic task execution engine that allows
|
||||
shell and Python tasks to be run efficiently and in parallel while
|
||||
working within complex inter-task dependency constraints. One of
|
||||
BitBake's main users, OpenEmbedded, takes this core and builds embedded
|
||||
Linux software stacks using a task-oriented approach.
|
||||
|
||||
Conceptually, BitBake is similar to GNU Make in some regards but has
|
||||
significant differences:
|
||||
|
||||
- BitBake executes tasks according to the provided metadata that builds up
|
||||
the tasks. Metadata is stored in recipe (``.bb``) and related recipe
|
||||
"append" (``.bbappend``) files, configuration (``.conf``) and
|
||||
underlying include (``.inc``) files, and in class (``.bbclass``)
|
||||
files. The metadata provides BitBake with instructions on what tasks
|
||||
to run and the dependencies between those tasks.
|
||||
|
||||
- BitBake includes a fetcher library for obtaining source code from
|
||||
various places such as local files, source control systems, or
|
||||
websites.
|
||||
|
||||
- The instructions for each unit to be built (e.g. a piece of software)
|
||||
are known as "recipe" files and contain all the information about the
|
||||
unit (dependencies, source file locations, checksums, description and
|
||||
so on).
|
||||
|
||||
- BitBake includes a client/server abstraction and can be used from a
|
||||
command line or used as a service over XML-RPC and has several
|
||||
different user interfaces.
|
||||
|
||||
History and Goals
|
||||
=================
|
||||
|
||||
BitBake was originally a part of the OpenEmbedded project. It was
|
||||
inspired by the Portage package management system used by the Gentoo
|
||||
Linux distribution. On December 7, 2004, OpenEmbedded project team
|
||||
member Chris Larson split the project into two distinct pieces:
|
||||
|
||||
- BitBake, a generic task executor
|
||||
|
||||
- OpenEmbedded, a metadata set utilized by BitBake
|
||||
|
||||
Today, BitBake is the primary basis of the
|
||||
`OpenEmbedded <https://www.openembedded.org/>`__ project, which is being
|
||||
used to build and maintain Linux distributions such as the `Poky
|
||||
Reference Distribution <https://www.yoctoproject.org/software-item/poky/>`__,
|
||||
developed under the umbrella of the `Yocto Project <https://www.yoctoproject.org>`__.
|
||||
|
||||
Prior to BitBake, no other build tool adequately met the needs of an
|
||||
aspiring embedded Linux distribution. All of the build systems used by
|
||||
traditional desktop Linux distributions lacked important functionality,
|
||||
and none of the ad hoc Buildroot-based systems, prevalent in the
|
||||
embedded space, were scalable or maintainable.
|
||||
|
||||
Some important original goals for BitBake were:
|
||||
|
||||
- Handle cross-compilation.
|
||||
|
||||
- Handle inter-package dependencies (build time on target architecture,
|
||||
build time on native architecture, and runtime).
|
||||
|
||||
- Support running any number of tasks within a given package,
|
||||
including, but not limited to, fetching upstream sources, unpacking
|
||||
them, patching them, configuring them, and so forth.
|
||||
|
||||
- Be Linux distribution agnostic for both build and target systems.
|
||||
|
||||
- Be architecture agnostic.
|
||||
|
||||
- Support multiple build and target operating systems (e.g. Cygwin, the
|
||||
BSDs, and so forth).
|
||||
|
||||
- Be self-contained, rather than tightly integrated into the build
|
||||
machine's root filesystem.
|
||||
|
||||
- Handle conditional metadata on the target architecture, operating
|
||||
system, distribution, and machine.
|
||||
|
||||
- Be easy to use the tools to supply local metadata and packages
|
||||
against which to operate.
|
||||
|
||||
- Be easy to use BitBake to collaborate between multiple projects for
|
||||
their builds.
|
||||
|
||||
- Provide an inheritance mechanism to share common metadata between
|
||||
many packages.
|
||||
|
||||
Over time it became apparent that some further requirements were
|
||||
necessary:
|
||||
|
||||
- Handle variants of a base recipe (e.g. native, sdk, and multilib).
|
||||
|
||||
- Split metadata into layers and allow layers to enhance or override
|
||||
other layers.
|
||||
|
||||
- Allow representation of a given set of input variables to a task as a
|
||||
checksum. Based on that checksum, allow acceleration of builds with
|
||||
prebuilt components.
|
||||
|
||||
BitBake satisfies all the original requirements and many more with
|
||||
extensions being made to the basic functionality to reflect the
|
||||
additional requirements. Flexibility and power have always been the
|
||||
priorities. BitBake is highly extensible and supports embedded Python
|
||||
code and execution of any arbitrary tasks.
|
||||
|
||||
.. _Concepts:
|
||||
|
||||
Concepts
|
||||
========
|
||||
|
||||
BitBake is a program written in the Python language. At the highest
|
||||
level, BitBake interprets metadata, decides what tasks are required to
|
||||
run, and executes those tasks. Similar to GNU Make, BitBake controls how
|
||||
software is built. GNU Make achieves its control through "makefiles",
|
||||
while BitBake uses "recipes".
|
||||
|
||||
BitBake extends the capabilities of a simple tool like GNU Make by
|
||||
allowing for the definition of much more complex tasks, such as
|
||||
assembling entire embedded Linux distributions.
|
||||
|
||||
The remainder of this section introduces several concepts that should be
|
||||
understood in order to better leverage the power of BitBake.
|
||||
|
||||
Recipes
|
||||
-------
|
||||
|
||||
BitBake Recipes, which are denoted by the file extension ``.bb``, are
|
||||
the most basic metadata files. These recipe files provide BitBake with
|
||||
the following:
|
||||
|
||||
- Descriptive information about the package (author, homepage, license,
|
||||
and so on)
|
||||
|
||||
- The version of the recipe
|
||||
|
||||
- Existing dependencies (both build and runtime dependencies)
|
||||
|
||||
- Where the source code resides and how to fetch it
|
||||
|
||||
- Whether the source code requires any patches, where to find them, and
|
||||
how to apply them
|
||||
|
||||
- How to configure and compile the source code
|
||||
|
||||
- How to assemble the generated artifacts into one or more installable
|
||||
packages
|
||||
|
||||
- Where on the target machine to install the package or packages
|
||||
created
|
||||
|
||||
Within the context of BitBake, or any project utilizing BitBake as its
|
||||
build system, files with the ``.bb`` extension are referred to as
|
||||
recipes.
|
||||
|
||||
.. note::
|
||||
|
||||
The term "package" is also commonly used to describe recipes.
|
||||
However, since the same word is used to describe packaged output from
|
||||
a project, it is best to maintain a single descriptive term -
|
||||
"recipes". Put another way, a single "recipe" file is quite capable
|
||||
of generating a number of related but separately installable
|
||||
"packages". In fact, that ability is fairly common.
|
||||
|
||||
Configuration Files
|
||||
-------------------
|
||||
|
||||
Configuration files, which are denoted by the ``.conf`` extension,
|
||||
define various configuration variables that govern the project's build
|
||||
process. These files fall into several areas that define machine
|
||||
configuration, distribution configuration, possible compiler tuning,
|
||||
general common configuration, and user configuration. The main
|
||||
configuration file is the sample ``bitbake.conf`` file, which is located
|
||||
within the BitBake source tree ``conf`` directory.
|
||||
|
||||
Classes
|
||||
-------
|
||||
|
||||
Class files, which are denoted by the ``.bbclass`` extension, contain
|
||||
information that is useful to share between metadata files. The BitBake
|
||||
source tree currently comes with one class metadata file called
|
||||
``base.bbclass``. You can find this file in the ``classes`` directory.
|
||||
The ``base.bbclass`` class files is special since it is always included
|
||||
automatically for all recipes and classes. This class contains
|
||||
definitions for standard basic tasks such as fetching, unpacking,
|
||||
configuring (empty by default), compiling (runs any Makefile present),
|
||||
installing (empty by default) and packaging (empty by default). These
|
||||
tasks are often overridden or extended by other classes added during the
|
||||
project development process.
|
||||
|
||||
Layers
|
||||
------
|
||||
|
||||
Layers allow you to isolate different types of customizations from each
|
||||
other. While you might find it tempting to keep everything in one layer
|
||||
when working on a single project, the more modular your metadata, the
|
||||
easier it is to cope with future changes.
|
||||
|
||||
To illustrate how you can use layers to keep things modular, consider
|
||||
customizations you might make to support a specific target machine.
|
||||
These types of customizations typically reside in a special layer,
|
||||
rather than a general layer, called a Board Support Package (BSP) layer.
|
||||
Furthermore, the machine customizations should be isolated from recipes
|
||||
and metadata that support a new GUI environment, for example. This
|
||||
situation gives you a couple of layers: one for the machine
|
||||
configurations and one for the GUI environment. It is important to
|
||||
understand, however, that the BSP layer can still make machine-specific
|
||||
additions to recipes within the GUI environment layer without polluting
|
||||
the GUI layer itself with those machine-specific changes. You can
|
||||
accomplish this through a recipe that is a BitBake append
|
||||
(``.bbappend``) file.
|
||||
|
||||
.. _append-bbappend-files:
|
||||
|
||||
Append Files
|
||||
------------
|
||||
|
||||
Append files, which are files that have the ``.bbappend`` file
|
||||
extension, extend or override information in an existing recipe file.
|
||||
|
||||
BitBake expects every append file to have a corresponding recipe file.
|
||||
Furthermore, the append file and corresponding recipe file must use the
|
||||
same root filename. The filenames can differ only in the file type
|
||||
suffix used (e.g. ``formfactor_0.0.bb`` and
|
||||
``formfactor_0.0.bbappend``).
|
||||
|
||||
Information in append files extends or overrides the information in the
|
||||
underlying, similarly-named recipe files.
|
||||
|
||||
When you name an append file, you can use the "``%``" wildcard character
|
||||
to allow for matching recipe names. For example, suppose you have an
|
||||
append file named as follows::
|
||||
|
||||
busybox_1.21.%.bbappend
|
||||
|
||||
That append file
|
||||
would match any ``busybox_1.21.``\ x\ ``.bb`` version of the recipe. So,
|
||||
the append file would match the following recipe names::
|
||||
|
||||
busybox_1.21.1.bb
|
||||
busybox_1.21.2.bb
|
||||
busybox_1.21.3.bb
|
||||
|
||||
.. note::
|
||||
|
||||
The use of the " % " character is limited in that it only works directly in
|
||||
front of the .bbappend portion of the append file's name. You cannot use the
|
||||
wildcard character in any other location of the name.
|
||||
|
||||
If the ``busybox`` recipe was updated to ``busybox_1.3.0.bb``, the
|
||||
append name would not match. However, if you named the append file
|
||||
``busybox_1.%.bbappend``, then you would have a match.
|
||||
|
||||
In the most general case, you could name the append file something as
|
||||
simple as ``busybox_%.bbappend`` to be entirely version independent.
|
||||
|
||||
Obtaining BitBake
|
||||
=================
|
||||
|
||||
You can obtain BitBake several different ways:
|
||||
|
||||
- **Cloning BitBake:** Using Git to clone the BitBake source code
|
||||
repository is the recommended method for obtaining BitBake. Cloning
|
||||
the repository makes it easy to get bug fixes and have access to
|
||||
stable branches and the master branch. Once you have cloned BitBake,
|
||||
you should use the latest stable branch for development since the
|
||||
master branch is for BitBake development and might contain less
|
||||
stable changes.
|
||||
|
||||
You usually need a version of BitBake that matches the metadata you
|
||||
are using. The metadata is generally backwards compatible but not
|
||||
forward compatible.
|
||||
|
||||
Here is an example that clones the BitBake repository::
|
||||
|
||||
$ git clone git://git.openembedded.org/bitbake
|
||||
|
||||
This command clones the BitBake
|
||||
Git repository into a directory called ``bitbake``. Alternatively,
|
||||
you can designate a directory after the ``git clone`` command if you
|
||||
want to call the new directory something other than ``bitbake``. Here
|
||||
is an example that names the directory ``bbdev``::
|
||||
|
||||
$ git clone git://git.openembedded.org/bitbake bbdev
|
||||
|
||||
- **Installation using your Distribution Package Management System:**
|
||||
This method is not recommended because the BitBake version that is
|
||||
provided by your distribution, in most cases, is several releases
|
||||
behind a snapshot of the BitBake repository.
|
||||
|
||||
- **Taking a snapshot of BitBake:** Downloading a snapshot of BitBake
|
||||
from the source code repository gives you access to a known branch or
|
||||
release of BitBake.
|
||||
|
||||
.. note::
|
||||
|
||||
Cloning the Git repository, as described earlier, is the preferred
|
||||
method for getting BitBake. Cloning the repository makes it easier
|
||||
to update as patches are added to the stable branches.
|
||||
|
||||
The following example downloads a snapshot of BitBake version 1.17.0::
|
||||
|
||||
$ wget https://git.openembedded.org/bitbake/snapshot/bitbake-1.17.0.tar.gz
|
||||
$ tar zxpvf bitbake-1.17.0.tar.gz
|
||||
|
||||
After extraction of the tarball using
|
||||
the tar utility, you have a directory entitled ``bitbake-1.17.0``.
|
||||
|
||||
- **Using the BitBake that Comes With Your Build Checkout:** A final
|
||||
possibility for getting a copy of BitBake is that it already comes
|
||||
with your checkout of a larger BitBake-based build system, such as
|
||||
Poky. Rather than manually checking out individual layers and gluing
|
||||
them together yourself, you can check out an entire build system. The
|
||||
checkout will already include a version of BitBake that has been
|
||||
thoroughly tested for compatibility with the other components. For
|
||||
information on how to check out a particular BitBake-based build
|
||||
system, consult that build system's supporting documentation.
|
||||
|
||||
.. _bitbake-user-manual-command:
|
||||
|
||||
The BitBake Command
|
||||
===================
|
||||
|
||||
The ``bitbake`` command is the primary interface to the BitBake tool.
|
||||
This section presents the BitBake command syntax and provides several
|
||||
execution examples.
|
||||
|
||||
Usage and syntax
|
||||
----------------
|
||||
|
||||
Following is the usage and syntax for BitBake::
|
||||
|
||||
$ bitbake -h
|
||||
Usage: bitbake [options] [recipename/target recipe:do_task ...]
|
||||
|
||||
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 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.
|
||||
-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 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.
|
||||
-R POSTFILE, --postread=POSTFILE
|
||||
Read the specified file after bitbake.conf.
|
||||
-v, --verbose Enable tracing of shell tasks (with 'set -x'). Also
|
||||
print bb.note(...) messages to stdout (in addition to
|
||||
writing them to ${T}/log.do_<task>).
|
||||
-D, --debug Increase the debug level. You can specify this more
|
||||
than once. -D sets the debug level to 1, where only
|
||||
bb.debug(1, ...) messages are printed to stdout; -DD
|
||||
sets the debug level to 2, where both bb.debug(1, ...)
|
||||
and bb.debug(2, ...) messages are printed; etc.
|
||||
Without -D, no debug messages are printed. Note that
|
||||
-D only affects output to stdout. All debug messages
|
||||
are written to ${T}/log.do_taskname, regardless of the
|
||||
debug level.
|
||||
-q, --quiet Output less log message data to the terminal. You can
|
||||
specify this more than once.
|
||||
-n, --dry-run Don't execute, just go through the motions.
|
||||
-S SIGNATURE_HANDLER, --dump-signatures=SIGNATURE_HANDLER
|
||||
Dump out the signature construction information, with
|
||||
no task execution. The SIGNATURE_HANDLER parameter is
|
||||
passed to the handler. Two common values are none and
|
||||
printdiff but the handler may define more/less. none
|
||||
means only dump the signature, printdiff means compare
|
||||
the dumped signature with the cached one.
|
||||
-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-recipe 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 save reports.
|
||||
-u UI, --ui=UI The user interface to use (knotty, ncurses, taskexp or
|
||||
teamcity - default knotty).
|
||||
--token=XMLRPCTOKEN Specify the connection token to be used when
|
||||
connecting to a remote server.
|
||||
--revisions-changed Set the exit code depending on whether upstream
|
||||
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 xmlrpc server to bind
|
||||
to.
|
||||
-T SERVER_TIMEOUT, --idle-timeout=SERVER_TIMEOUT
|
||||
Set timeout to unload bitbake server due to
|
||||
inactivity, set to -1 means no unload, default:
|
||||
Environment variable BB_SERVER_TIMEOUT.
|
||||
--no-setscene Do not run any setscene tasks. sstate will be ignored
|
||||
and everything needed, built.
|
||||
--skip-setscene Skip setscene tasks if they would be executed. Tasks
|
||||
previously restored from sstate will be kept, unlike
|
||||
--no-setscene
|
||||
--setscene-only Only run setscene tasks, don't run any real tasks.
|
||||
--remote-server=REMOTE_SERVER
|
||||
Connect to the specified server.
|
||||
-m, --kill-server Terminate any running bitbake server.
|
||||
--observe-only Connect to a server as an observing-only client.
|
||||
--status-only Check the status of the remote bitbake server.
|
||||
-w WRITEEVENTLOG, --write-log=WRITEEVENTLOG
|
||||
Writes the event log of the build to a bitbake event
|
||||
json file. Use '' (empty string) to assign the name
|
||||
automatically.
|
||||
--runall=RUNALL Run the specified task for any recipe in the taskgraph
|
||||
of the specified target (even if it wouldn't otherwise
|
||||
have run).
|
||||
--runonly=RUNONLY Run only the specified task within the taskgraph of
|
||||
the specified targets (and any task dependencies those
|
||||
tasks may have).
|
||||
|
||||
.. _bitbake-examples:
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
This section presents some examples showing how to use BitBake.
|
||||
|
||||
.. _example-executing-a-task-against-a-single-recipe:
|
||||
|
||||
Executing a Task Against a Single Recipe
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Executing tasks for a single recipe file is relatively simple. You
|
||||
specify the file in question, and BitBake parses it and executes the
|
||||
specified task. If you do not specify a task, BitBake executes the
|
||||
default task, which is "build". BitBake obeys inter-task dependencies
|
||||
when doing so.
|
||||
|
||||
The following command runs the build task, which is the default task, on
|
||||
the ``foo_1.0.bb`` recipe file::
|
||||
|
||||
$ bitbake -b foo_1.0.bb
|
||||
|
||||
The following command runs the clean task on the ``foo.bb`` recipe file::
|
||||
|
||||
$ bitbake -b foo.bb -c clean
|
||||
|
||||
.. note::
|
||||
|
||||
The "-b" option explicitly does not handle recipe dependencies. Other
|
||||
than for debugging purposes, it is instead recommended that you use
|
||||
the syntax presented in the next section.
|
||||
|
||||
Executing Tasks Against a Set of Recipe Files
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
There are a number of additional complexities introduced when one wants
|
||||
to manage multiple ``.bb`` files. Clearly there needs to be a way to
|
||||
tell BitBake what files are available and, of those, which you want to
|
||||
execute. There also needs to be a way for each recipe to express its
|
||||
dependencies, both for build-time and runtime. There must be a way for
|
||||
you to express recipe preferences when multiple recipes provide the same
|
||||
functionality, or when there are multiple versions of a recipe.
|
||||
|
||||
The ``bitbake`` command, when not using "--buildfile" or "-b" only
|
||||
accepts a "PROVIDES". You cannot provide anything else. By default, a
|
||||
recipe file generally "PROVIDES" its "packagename" as shown in the
|
||||
following example::
|
||||
|
||||
$ bitbake foo
|
||||
|
||||
This next example "PROVIDES" the
|
||||
package name and also uses the "-c" option to tell BitBake to just
|
||||
execute the ``do_clean`` task::
|
||||
|
||||
$ bitbake -c clean foo
|
||||
|
||||
Executing a List of Task and Recipe Combinations
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The BitBake command line supports specifying different tasks for
|
||||
individual targets when you specify multiple targets. For example,
|
||||
suppose you had two targets (or recipes) ``myfirstrecipe`` and
|
||||
``mysecondrecipe`` and you needed BitBake to run ``taskA`` for the first
|
||||
recipe and ``taskB`` for the second recipe::
|
||||
|
||||
$ bitbake myfirstrecipe:do_taskA mysecondrecipe:do_taskB
|
||||
|
||||
Generating Dependency Graphs
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
BitBake is able to generate dependency graphs using the ``dot`` syntax.
|
||||
You can convert these graphs into images using the ``dot`` tool from
|
||||
`Graphviz <http://www.graphviz.org>`__.
|
||||
|
||||
When you generate a dependency graph, BitBake writes two files to the
|
||||
current working directory:
|
||||
|
||||
- ``task-depends.dot``: Shows dependencies between tasks. These
|
||||
dependencies match BitBake's internal task execution list.
|
||||
|
||||
- ``pn-buildlist``: Shows a simple list of targets that are to be
|
||||
built.
|
||||
|
||||
To stop depending on common depends, use the ``-I`` depend option and
|
||||
BitBake omits them from the graph. Leaving this information out can
|
||||
produce more readable graphs. This way, you can remove from the graph
|
||||
:term:`DEPENDS` from inherited classes such as ``base.bbclass``.
|
||||
|
||||
Here are two examples that create dependency graphs. The second example
|
||||
omits depends common in OpenEmbedded from the graph::
|
||||
|
||||
$ bitbake -g foo
|
||||
|
||||
$ bitbake -g -I virtual/kernel -I eglibc foo
|
||||
|
||||
Executing a Multiple Configuration Build
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
BitBake is able to build multiple images or packages using a single
|
||||
command where the different targets require different configurations
|
||||
(multiple configuration builds). Each target, in this scenario, is
|
||||
referred to as a "multiconfig".
|
||||
|
||||
To accomplish a multiple configuration build, you must define each
|
||||
target's configuration separately using a parallel configuration file in
|
||||
the build directory. The location for these multiconfig configuration
|
||||
files is specific. They must reside in the current build directory in a
|
||||
sub-directory of ``conf`` named ``multiconfig``. Following is an example
|
||||
for two separate targets:
|
||||
|
||||
.. image:: figures/bb_multiconfig_files.png
|
||||
:align: center
|
||||
|
||||
The reason for this required file hierarchy is because the :term:`BBPATH`
|
||||
variable is not constructed until the layers are parsed. Consequently,
|
||||
using the configuration file as a pre-configuration file is not possible
|
||||
unless it is located in the current working directory.
|
||||
|
||||
Minimally, each configuration file must define the machine and the
|
||||
temporary directory BitBake uses for the build. Suggested practice
|
||||
dictates that you do not overlap the temporary directories used during
|
||||
the builds.
|
||||
|
||||
Aside from separate configuration files for each target, you must also
|
||||
enable BitBake to perform multiple configuration builds. Enabling is
|
||||
accomplished by setting the
|
||||
:term:`BBMULTICONFIG` variable in the
|
||||
``local.conf`` configuration file. As an example, suppose you had
|
||||
configuration files for ``target1`` and ``target2`` defined in the build
|
||||
directory. The following statement in the ``local.conf`` file both
|
||||
enables BitBake to perform multiple configuration builds and specifies
|
||||
the two extra multiconfigs::
|
||||
|
||||
BBMULTICONFIG = "target1 target2"
|
||||
|
||||
Once the target configuration files are in place and BitBake has been
|
||||
enabled to perform multiple configuration builds, use the following
|
||||
command form to start the builds::
|
||||
|
||||
$ bitbake [mc:multiconfigname:]target [[[mc:multiconfigname:]target] ... ]
|
||||
|
||||
Here is an example for two extra multiconfigs: ``target1`` and ``target2``::
|
||||
|
||||
$ bitbake mc::target mc:target1:target mc:target2:target
|
||||
|
||||
.. _bb-enabling-multiple-configuration-build-dependencies:
|
||||
|
||||
Enabling Multiple Configuration Build Dependencies
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Sometimes dependencies can exist between targets (multiconfigs) in a
|
||||
multiple configuration build. For example, suppose that in order to
|
||||
build an image for a particular architecture, the root filesystem of
|
||||
another build for a different architecture needs to exist. In other
|
||||
words, the image for the first multiconfig depends on the root
|
||||
filesystem of the second multiconfig. This dependency is essentially
|
||||
that the task in the recipe that builds one multiconfig is dependent on
|
||||
the completion of the task in the recipe that builds another
|
||||
multiconfig.
|
||||
|
||||
To enable dependencies in a multiple configuration build, you must
|
||||
declare the dependencies in the recipe using the following statement
|
||||
form::
|
||||
|
||||
task_or_package[mcdepends] = "mc:from_multiconfig:to_multiconfig:recipe_name:task_on_which_to_depend"
|
||||
|
||||
To better show how to use this statement, consider an example with two
|
||||
multiconfigs: ``target1`` and ``target2``::
|
||||
|
||||
image_task[mcdepends] = "mc:target1:target2:image2:rootfs_task"
|
||||
|
||||
In this example, the
|
||||
``from_multiconfig`` is "target1" and the ``to_multiconfig`` is "target2". The
|
||||
task on which the image whose recipe contains image_task depends on the
|
||||
completion of the rootfs_task used to build out image2, which is
|
||||
associated with the "target2" multiconfig.
|
||||
|
||||
Once you set up this dependency, you can build the "target1" multiconfig
|
||||
using a BitBake command as follows::
|
||||
|
||||
$ bitbake mc:target1:image1
|
||||
|
||||
This command executes all the tasks needed to create ``image1`` for the "target1"
|
||||
multiconfig. Because of the dependency, BitBake also executes through
|
||||
the ``rootfs_task`` for the "target2" multiconfig build.
|
||||
|
||||
Having a recipe depend on the root filesystem of another build might not
|
||||
seem that useful. Consider this change to the statement in the image1
|
||||
recipe::
|
||||
|
||||
image_task[mcdepends] = "mc:target1:target2:image2:image_task"
|
||||
|
||||
In this case, BitBake must create ``image2`` for the "target2" build since
|
||||
the "target1" build depends on it.
|
||||
|
||||
Because "target1" and "target2" are enabled for multiple configuration
|
||||
builds and have separate configuration files, BitBake places the
|
||||
artifacts for each build in the respective temporary build directories.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,91 @@
|
||||
.. SPDX-License-Identifier: CC-BY-2.5
|
||||
|
||||
================
|
||||
Variable Context
|
||||
================
|
||||
|
||||
|
|
||||
|
||||
Variables might only have an impact or can be used in certain contexts. Some
|
||||
should only be used in global files like ``.conf``, while others are intended only
|
||||
for local files like ``.bb``. This chapter aims to describe some important variable
|
||||
contexts.
|
||||
|
||||
.. _ref-varcontext-configuration:
|
||||
|
||||
BitBake's own configuration
|
||||
===========================
|
||||
|
||||
Variables starting with ``BB_`` usually configure the behaviour of BitBake itself.
|
||||
For example, one could configure:
|
||||
|
||||
- System resources, like disk space to be used (:term:`BB_DISKMON_DIRS`),
|
||||
or the number of tasks to be run in parallel by BitBake (:term:`BB_NUMBER_THREADS`).
|
||||
|
||||
- How the fetchers shall behave, e.g., :term:`BB_FETCH_PREMIRRORONLY` is used
|
||||
by BitBake to determine if BitBake's fetcher shall search only
|
||||
:term:`PREMIRRORS` for files.
|
||||
|
||||
Those variables are usually configured globally.
|
||||
|
||||
BitBake configuration
|
||||
=====================
|
||||
|
||||
There are variables:
|
||||
|
||||
- Like :term:`B` or :term:`T`, that are used to specify directories used by
|
||||
BitBake during the build of a particular recipe. Those variables are
|
||||
specified in ``bitbake.conf``. Some, like :term:`B`, are quite often
|
||||
overwritten in recipes.
|
||||
|
||||
- Starting with ``FAKEROOT``, to configure how the ``fakeroot`` command is
|
||||
handled. Those are usually set by ``bitbake.conf`` and might get adapted in a
|
||||
``bbclass``.
|
||||
|
||||
- Detailing where BitBake will store and fetch information from, for
|
||||
data reuse between build runs like :term:`CACHE`, :term:`DL_DIR` or
|
||||
:term:`PERSISTENT_DIR`. Those are usually global.
|
||||
|
||||
|
||||
Layers and files
|
||||
================
|
||||
|
||||
Variables starting with ``LAYER`` configure how BitBake handles layers.
|
||||
Additionally, variables starting with ``BB`` configure how layers and files are
|
||||
handled. For example:
|
||||
|
||||
- :term:`LAYERDEPENDS` is used to configure on which layers a given layer
|
||||
depends.
|
||||
|
||||
- The configured layers are contained in :term:`BBLAYERS` and files in
|
||||
:term:`BBFILES`.
|
||||
|
||||
Those variables are often used in the files ``layer.conf`` and ``bblayers.conf``.
|
||||
|
||||
Recipes and packages
|
||||
====================
|
||||
|
||||
Variables handling recipes and packages can be split into:
|
||||
|
||||
- :term:`PN`, :term:`PV` or :term:`PF` for example, contain information about
|
||||
the name or revision of a recipe or package. Usually, the default set in
|
||||
``bitbake.conf`` is used, but those are from time to time overwritten in
|
||||
recipes.
|
||||
|
||||
- :term:`SUMMARY`, :term:`DESCRIPTION`, :term:`LICENSE` or :term:`HOMEPAGE`
|
||||
contain the expected information and should be set specifically for every
|
||||
recipe.
|
||||
|
||||
- In recipes, variables are also used to control build and runtime
|
||||
dependencies between recipes/packages with other recipes/packages. The
|
||||
most common should be: :term:`PROVIDES`, :term:`RPROVIDES`, :term:`DEPENDS`,
|
||||
and :term:`RDEPENDS`.
|
||||
|
||||
- There are further variables starting with ``SRC`` that specify the sources in
|
||||
a recipe like :term:`SRC_URI` or :term:`SRCDATE`. Those are also usually set
|
||||
in recipes.
|
||||
|
||||
- Which version or provider of a recipe should be given preference when
|
||||
multiple recipes would provide the same item, is controlled by variables
|
||||
starting with ``PREFERRED_``. Those are normally set in the configuration
|
||||
files of a ``MACHINE`` or ``DISTRO``.
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 5.0 KiB |
142
sources/poky/bitbake/doc/bitbake.1
Normal file
142
sources/poky/bitbake/doc/bitbake.1
Normal file
@@ -0,0 +1,142 @@
|
||||
.\" Hey, EMACS: -*- nroff -*-
|
||||
.\" First parameter, NAME, should be all caps
|
||||
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
||||
.\" other parameters are allowed: see man(7), man(1)
|
||||
.TH BITBAKE 1 "November 19, 2006"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\"
|
||||
.\" Some roff macros, for reference:
|
||||
.\" .nh disable hyphenation
|
||||
.\" .hy enable hyphenation
|
||||
.\" .ad l left justify
|
||||
.\" .ad b justify to both left and right margins
|
||||
.\" .nf disable filling
|
||||
.\" .fi enable filling
|
||||
.\" .br insert line break
|
||||
.\" .sp <n> insert n+1 empty lines
|
||||
.\" for manpage-specific macros, see man(7)
|
||||
.SH NAME
|
||||
BitBake \- simple tool for the execution of tasks
|
||||
.SH SYNOPSIS
|
||||
.B bitbake
|
||||
.RI [ options ] " packagenames"
|
||||
.br
|
||||
.SH DESCRIPTION
|
||||
This manual page documents briefly the
|
||||
.B bitbake
|
||||
command.
|
||||
.PP
|
||||
.\" TeX users may be more comfortable with the \fB<whatever>\fP and
|
||||
.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
|
||||
.\" respectively.
|
||||
\fBbitbake\fP is a program that executes the specified task (default is 'build')
|
||||
for a given set of BitBake files.
|
||||
.br
|
||||
It expects that BBFILES is defined, which is a space separated list of files to
|
||||
be executed. BBFILES does support wildcards.
|
||||
.br
|
||||
Default BBFILES are the .bb files in the current directory.
|
||||
.SH OPTIONS
|
||||
This program follow the usual GNU command line syntax, with long
|
||||
options starting with two dashes (`-').
|
||||
.TP
|
||||
.B \-h, \-\-help
|
||||
Show summary of options.
|
||||
.TP
|
||||
.B \-\-version
|
||||
Show version of program.
|
||||
.TP
|
||||
.B \-bBUILDFILE, \-\-buildfile=BUILDFILE
|
||||
execute the task against this .bb file, rather than a package from BBFILES.
|
||||
.TP
|
||||
.B \-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.
|
||||
.TP
|
||||
.B \-a, \-\-tryaltconfigs
|
||||
continue with builds by trying to use alternative providers where possible.
|
||||
.TP
|
||||
.B \-f, \-\-force
|
||||
force run of specified cmd, regardless of stamp status
|
||||
.TP
|
||||
.B \-i, \-\-interactive
|
||||
drop into the interactive mode also called the BitBake shell.
|
||||
.TP
|
||||
.B \-cCMD, \-\-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 task is defined and will show
|
||||
available tasks.
|
||||
.TP
|
||||
.B \-rFILE, \-\-read=FILE
|
||||
read the specified file before bitbake.conf
|
||||
.TP
|
||||
.B \-v, \-\-verbose
|
||||
output more chit-chat to the terminal
|
||||
.TP
|
||||
.B \-D, \-\-debug
|
||||
Increase the debug level. You can specify this more than once.
|
||||
.TP
|
||||
.B \-n, \-\-dry-run
|
||||
don't execute, just go through the motions
|
||||
.TP
|
||||
.B \-p, \-\-parse-only
|
||||
quit after parsing the BB files (developers only)
|
||||
.TP
|
||||
.B \-s, \-\-show-versions
|
||||
show current and preferred versions of all packages
|
||||
.TP
|
||||
.B \-e, \-\-environment
|
||||
show the global or per-recipe environment (this is what used to be bbread)
|
||||
.TP
|
||||
.B \-g, \-\-graphviz
|
||||
emit the dependency trees of the specified packages in the dot syntax
|
||||
.TP
|
||||
.B \-IIGNORED\_DOT\_DEPS, \-\-ignore-deps=IGNORED_DOT_DEPS
|
||||
Stop processing at the given list of dependencies when generating dependency
|
||||
graphs. This can help to make the graph more appealing
|
||||
.TP
|
||||
.B \-lDEBUG_DOMAINS, \-\-log-domains=DEBUG_DOMAINS
|
||||
Show debug logging for the specified logging domains
|
||||
.TP
|
||||
.B \-P, \-\-profile
|
||||
profile the command and print a report
|
||||
.TP
|
||||
.B \-uUI, \-\-ui=UI
|
||||
User interface to use. Currently, knotty, taskexp or ncurses can be specified as UI.
|
||||
.TP
|
||||
.B \-tSERVERTYPE, \-\-servertype=SERVERTYPE
|
||||
Choose which server to use, none, process or xmlrpc.
|
||||
.TP
|
||||
.B \-\-revisions-changed
|
||||
Set the exit code depending on whether upstream floating revisions have changed or not.
|
||||
.TP
|
||||
.B \-\-server-only
|
||||
Run bitbake without UI, the frontend can connect with bitbake server itself.
|
||||
.TP
|
||||
.B \-BBIND, \-\-bind=BIND
|
||||
The name/address for the bitbake server to bind to.
|
||||
.TP
|
||||
.B \-\-no\-setscene
|
||||
Do not run any setscene tasks, forces builds.
|
||||
|
||||
.SH ENVIRONMENT VARIABLES
|
||||
bitbake uses the following environment variables to control its
|
||||
operation:
|
||||
.TP
|
||||
.B BITBAKE_UI
|
||||
The bitbake user interface; overridden by the \fB-u\fP commandline option.
|
||||
|
||||
.SH AUTHORS
|
||||
BitBake was written by
|
||||
Phil Blundell,
|
||||
Holger Freyther,
|
||||
Chris Larson,
|
||||
Mickey Lauer,
|
||||
Richard Purdie,
|
||||
Holger Schurig
|
||||
.PP
|
||||
This manual page was written by Marcin Juszkiewicz <marcin@hrw.one.pl>
|
||||
for the Debian project (but may be used by others).
|
||||
101
sources/poky/bitbake/doc/conf.py
Normal file
101
sources/poky/bitbake/doc/conf.py
Normal file
@@ -0,0 +1,101 @@
|
||||
# Configuration file for the Sphinx documentation builder.
|
||||
#
|
||||
# This file only contains a selection of the most common options. For a full
|
||||
# list see the documentation:
|
||||
# https://www.sphinx-doc.org/en/master/usage/configuration.html
|
||||
|
||||
# -- Path setup --------------------------------------------------------------
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
#
|
||||
# import os
|
||||
# import sys
|
||||
# sys.path.insert(0, os.path.abspath('.'))
|
||||
|
||||
import sys
|
||||
import datetime
|
||||
|
||||
current_version = "dev"
|
||||
|
||||
# String used in sidebar
|
||||
version = 'Version: ' + current_version
|
||||
if current_version == 'dev':
|
||||
version = 'Version: Current Development'
|
||||
# Version seen in documentation_options.js and hence in js switchers code
|
||||
release = current_version
|
||||
|
||||
# -- Project information -----------------------------------------------------
|
||||
|
||||
project = 'Bitbake'
|
||||
copyright = '2004-%s, Richard Purdie, Chris Larson, and Phil Blundell' \
|
||||
% datetime.datetime.now().year
|
||||
author = 'Richard Purdie, Chris Larson, and Phil Blundell'
|
||||
|
||||
# external links and substitutions
|
||||
extlinks = {
|
||||
'yocto_docs': ('https://docs.yoctoproject.org%s', None),
|
||||
'oe_lists': ('https://lists.openembedded.org%s', None),
|
||||
}
|
||||
|
||||
# -- General configuration ---------------------------------------------------
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be
|
||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||
# ones.
|
||||
extensions = [
|
||||
'sphinx.ext.autosectionlabel',
|
||||
'sphinx.ext.extlinks',
|
||||
]
|
||||
autosectionlabel_prefix_document = True
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
# This pattern also affects html_static_path and html_extra_path.
|
||||
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
|
||||
|
||||
# master document name. The default changed from contents to index. so better
|
||||
# set it ourselves.
|
||||
master_doc = 'index'
|
||||
|
||||
# create substitution for project configuration variables
|
||||
rst_prolog = """
|
||||
.. |project_name| replace:: %s
|
||||
.. |copyright| replace:: %s
|
||||
.. |author| replace:: %s
|
||||
""" % (project, copyright, author)
|
||||
|
||||
# -- Options for HTML output -------------------------------------------------
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
#
|
||||
try:
|
||||
import sphinx_rtd_theme
|
||||
html_theme = 'sphinx_rtd_theme'
|
||||
except ImportError:
|
||||
sys.stderr.write("The Sphinx sphinx_rtd_theme HTML theme was not found.\
|
||||
\nPlease make sure to install the sphinx_rtd_theme python package.\n")
|
||||
sys.exit(1)
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = ['sphinx-static']
|
||||
|
||||
# Add customm CSS and JS files
|
||||
html_css_files = ['theme_overrides.css']
|
||||
html_js_files = ['switchers.js']
|
||||
|
||||
# Hide 'Created using Sphinx' text
|
||||
html_show_sphinx = False
|
||||
|
||||
# Add 'Last updated' on each page
|
||||
html_last_updated_fmt = '%b %d, %Y'
|
||||
|
||||
# Remove the trailing 'dot' in section numbers
|
||||
html_secnumber_suffix = " "
|
||||
3
sources/poky/bitbake/doc/genindex.rst
Normal file
3
sources/poky/bitbake/doc/genindex.rst
Normal file
@@ -0,0 +1,3 @@
|
||||
=====
|
||||
Index
|
||||
=====
|
||||
39
sources/poky/bitbake/doc/index.rst
Normal file
39
sources/poky/bitbake/doc/index.rst
Normal file
@@ -0,0 +1,39 @@
|
||||
.. SPDX-License-Identifier: CC-BY-2.5
|
||||
|
||||
===================
|
||||
BitBake User Manual
|
||||
===================
|
||||
|
||||
|
|
||||
|
||||
.. toctree::
|
||||
:caption: Table of Contents
|
||||
:numbered:
|
||||
|
||||
bitbake-user-manual/bitbake-user-manual-intro
|
||||
bitbake-user-manual/bitbake-user-manual-execution
|
||||
bitbake-user-manual/bitbake-user-manual-metadata
|
||||
bitbake-user-manual/bitbake-user-manual-ref-variables-context
|
||||
bitbake-user-manual/bitbake-user-manual-fetching
|
||||
bitbake-user-manual/bitbake-user-manual-ref-variables
|
||||
bitbake-user-manual/bitbake-user-manual-hello
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:hidden:
|
||||
|
||||
genindex
|
||||
releases
|
||||
|
||||
----
|
||||
|
||||
.. include:: <xhtml1-lat1.txt>
|
||||
|
||||
| BitBake Community
|
||||
| Copyright |copy| |copyright|
|
||||
| <bitbake-devel@lists.openembedded.org>
|
||||
|
||||
This work is licensed under the Creative Commons Attribution License. To view a
|
||||
copy of this license, visit http://creativecommons.org/licenses/by/2.5/ or send
|
||||
a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View,
|
||||
California 94041, USA.
|
||||
174
sources/poky/bitbake/doc/releases.rst
Normal file
174
sources/poky/bitbake/doc/releases.rst
Normal file
@@ -0,0 +1,174 @@
|
||||
.. SPDX-License-Identifier: CC-BY-2.5
|
||||
|
||||
=================================
|
||||
BitBake Supported Release Manuals
|
||||
=================================
|
||||
|
||||
*******************************
|
||||
Release Series 4.2 (mickledore)
|
||||
*******************************
|
||||
|
||||
- :yocto_docs:`BitBake 2.4 User Manual </bitbake/2.4/>`
|
||||
|
||||
******************************
|
||||
Release Series 4.0 (kirkstone)
|
||||
******************************
|
||||
|
||||
- :yocto_docs:`BitBake 2.0 User Manual </bitbake/2.0/>`
|
||||
|
||||
****************************
|
||||
Release Series 3.1 (dunfell)
|
||||
****************************
|
||||
|
||||
- :yocto_docs:`BitBake 1.46 User Manual </bitbake/1.46/>`
|
||||
|
||||
================================
|
||||
BitBake Outdated Release Manuals
|
||||
================================
|
||||
|
||||
*****************************
|
||||
Release Series 4.1 (langdale)
|
||||
*****************************
|
||||
|
||||
- :yocto_docs:`BitBake 2.2 User Manual </bitbake/2.2/>`
|
||||
|
||||
******************************
|
||||
Release Series 3.4 (honister)
|
||||
******************************
|
||||
|
||||
- :yocto_docs:`BitBake 1.52 User Manual </bitbake/1.52/>`
|
||||
|
||||
******************************
|
||||
Release Series 3.3 (hardknott)
|
||||
******************************
|
||||
|
||||
- :yocto_docs:`BitBake 1.50 User Manual </bitbake/1.50/>`
|
||||
|
||||
*******************************
|
||||
Release Series 3.2 (gatesgarth)
|
||||
*******************************
|
||||
|
||||
- :yocto_docs:`BitBake 1.48 User Manual </bitbake/1.48/>`
|
||||
|
||||
*******************************************
|
||||
Release Series 3.1 (dunfell first versions)
|
||||
*******************************************
|
||||
|
||||
- :yocto_docs:`3.1 BitBake User Manual </3.1/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`3.1.1 BitBake User Manual </3.1.1/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`3.1.2 BitBake User Manual </3.1.2/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`3.1.3 BitBake User Manual </3.1.3/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
|
||||
*************************
|
||||
Release Series 3.0 (zeus)
|
||||
*************************
|
||||
|
||||
- :yocto_docs:`3.0 BitBake User Manual </3.0/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`3.0.1 BitBake User Manual </3.0.1/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`3.0.2 BitBake User Manual </3.0.2/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`3.0.3 BitBake User Manual </3.0.3/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`3.0.4 BitBake User Manual </3.0.4/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
|
||||
****************************
|
||||
Release Series 2.7 (warrior)
|
||||
****************************
|
||||
|
||||
- :yocto_docs:`2.7 BitBake User Manual </2.7/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.7.1 BitBake User Manual </2.7.1/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.7.2 BitBake User Manual </2.7.2/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.7.3 BitBake User Manual </2.7.3/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.7.4 BitBake User Manual </2.7.4/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
|
||||
*************************
|
||||
Release Series 2.6 (thud)
|
||||
*************************
|
||||
|
||||
- :yocto_docs:`2.6 BitBake User Manual </2.6/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.6.1 BitBake User Manual </2.6.1/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.6.2 BitBake User Manual </2.6.2/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.6.3 BitBake User Manual </2.6.3/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.6.4 BitBake User Manual </2.6.4/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
|
||||
*************************
|
||||
Release Series 2.5 (sumo)
|
||||
*************************
|
||||
|
||||
- :yocto_docs:`2.5 Documentation </2.5>`
|
||||
- :yocto_docs:`2.5.1 Documentation </2.5.1>`
|
||||
- :yocto_docs:`2.5.2 Documentation </2.5.2>`
|
||||
- :yocto_docs:`2.5.3 Documentation </2.5.3>`
|
||||
|
||||
**************************
|
||||
Release Series 2.4 (rocko)
|
||||
**************************
|
||||
|
||||
- :yocto_docs:`2.4 BitBake User Manual </2.4/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.4.1 BitBake User Manual </2.4.1/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.4.2 BitBake User Manual </2.4.2/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.4.3 BitBake User Manual </2.4.3/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.4.4 BitBake User Manual </2.4.4/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
|
||||
*************************
|
||||
Release Series 2.3 (pyro)
|
||||
*************************
|
||||
|
||||
- :yocto_docs:`2.3 BitBake User Manual </2.3/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.3.1 BitBake User Manual </2.3.1/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.3.2 BitBake User Manual </2.3.2/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.3.3 BitBake User Manual </2.3.3/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.3.4 BitBake User Manual </2.3.4/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
|
||||
**************************
|
||||
Release Series 2.2 (morty)
|
||||
**************************
|
||||
|
||||
- :yocto_docs:`2.2 BitBake User Manual </2.2/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.2.1 BitBake User Manual </2.2.1/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.2.2 BitBake User Manual </2.2.2/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.2.3 BitBake User Manual </2.2.3/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
|
||||
****************************
|
||||
Release Series 2.1 (krogoth)
|
||||
****************************
|
||||
|
||||
- :yocto_docs:`2.1 BitBake User Manual </2.1/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.1.1 BitBake User Manual </2.1.1/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.1.2 BitBake User Manual </2.1.2/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.1.3 BitBake User Manual </2.1.3/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
|
||||
***************************
|
||||
Release Series 2.0 (jethro)
|
||||
***************************
|
||||
|
||||
- :yocto_docs:`1.9 BitBake User Manual </1.9/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.0 BitBake User Manual </2.0/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.0.1 BitBake User Manual </2.0.1/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.0.2 BitBake User Manual </2.0.2/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`2.0.3 BitBake User Manual </2.0.3/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
|
||||
*************************
|
||||
Release Series 1.8 (fido)
|
||||
*************************
|
||||
|
||||
- :yocto_docs:`1.8 BitBake User Manual </1.8/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`1.8.1 BitBake User Manual </1.8.1/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`1.8.2 BitBake User Manual </1.8.2/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
|
||||
**************************
|
||||
Release Series 1.7 (dizzy)
|
||||
**************************
|
||||
|
||||
- :yocto_docs:`1.7 BitBake User Manual </1.7/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`1.7.1 BitBake User Manual </1.7.1/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`1.7.2 BitBake User Manual </1.7.2/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`1.7.3 BitBake User Manual </1.7.3/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
|
||||
**************************
|
||||
Release Series 1.6 (daisy)
|
||||
**************************
|
||||
|
||||
- :yocto_docs:`1.6 BitBake User Manual </1.6/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`1.6.1 BitBake User Manual </1.6.1/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`1.6.2 BitBake User Manual </1.6.2/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
- :yocto_docs:`1.6.3 BitBake User Manual </1.6.3/bitbake-user-manual/bitbake-user-manual.html>`
|
||||
|
||||
233
sources/poky/bitbake/doc/sphinx-static/switchers.js
Normal file
233
sources/poky/bitbake/doc/sphinx-static/switchers.js
Normal file
@@ -0,0 +1,233 @@
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
var all_versions = {
|
||||
'dev': 'dev (3.2)',
|
||||
'3.1.2': '3.1.2',
|
||||
'3.0.3': '3.0.3',
|
||||
'2.7.4': '2.7.4',
|
||||
};
|
||||
|
||||
var all_doctypes = {
|
||||
'single': 'Individual Webpages',
|
||||
'mega': "All-in-one 'Mega' Manual",
|
||||
};
|
||||
|
||||
// Simple version comparision
|
||||
// Return 1 if a > b
|
||||
// Return -1 if a < b
|
||||
// Return 0 if a == b
|
||||
function ver_compare(a, b) {
|
||||
if (a == "dev") {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (a === b) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
var a_components = a.split(".");
|
||||
var b_components = b.split(".");
|
||||
|
||||
var len = Math.min(a_components.length, b_components.length);
|
||||
|
||||
// loop while the components are equal
|
||||
for (var i = 0; i < len; i++) {
|
||||
// A bigger than B
|
||||
if (parseInt(a_components[i]) > parseInt(b_components[i])) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// B bigger than A
|
||||
if (parseInt(a_components[i]) < parseInt(b_components[i])) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
// If one's a prefix of the other, the longer one is greater.
|
||||
if (a_components.length > b_components.length) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (a_components.length < b_components.length) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Otherwise they are the same.
|
||||
return 0;
|
||||
}
|
||||
|
||||
function build_version_select(current_series, current_version) {
|
||||
var buf = ['<select>'];
|
||||
|
||||
$.each(all_versions, function(version, title) {
|
||||
var series = version.substr(0, 3);
|
||||
if (series == current_series) {
|
||||
if (version == current_version)
|
||||
buf.push('<option value="' + version + '" selected="selected">' + title + '</option>');
|
||||
else
|
||||
buf.push('<option value="' + version + '">' + title + '</option>');
|
||||
|
||||
if (version != current_version)
|
||||
buf.push('<option value="' + current_version + '" selected="selected">' + current_version + '</option>');
|
||||
} else {
|
||||
buf.push('<option value="' + version + '">' + title + '</option>');
|
||||
}
|
||||
});
|
||||
|
||||
buf.push('</select>');
|
||||
return buf.join('');
|
||||
}
|
||||
|
||||
function build_doctype_select(current_doctype) {
|
||||
var buf = ['<select>'];
|
||||
|
||||
$.each(all_doctypes, function(doctype, title) {
|
||||
if (doctype == current_doctype)
|
||||
buf.push('<option value="' + doctype + '" selected="selected">' +
|
||||
all_doctypes[current_doctype] + '</option>');
|
||||
else
|
||||
buf.push('<option value="' + doctype + '">' + title + '</option>');
|
||||
});
|
||||
if (!(current_doctype in all_doctypes)) {
|
||||
// In case we're browsing a doctype that is not yet in all_doctypes.
|
||||
buf.push('<option value="' + current_doctype + '" selected="selected">' +
|
||||
current_doctype + '</option>');
|
||||
all_doctypes[current_doctype] = current_doctype;
|
||||
}
|
||||
buf.push('</select>');
|
||||
return buf.join('');
|
||||
}
|
||||
|
||||
function navigate_to_first_existing(urls) {
|
||||
// Navigate to the first existing URL in urls.
|
||||
var url = urls.shift();
|
||||
|
||||
// Web browsers won't redirect file:// urls to file urls using ajax but
|
||||
// its useful for local testing
|
||||
if (url.startsWith("file://")) {
|
||||
window.location.href = url;
|
||||
return;
|
||||
}
|
||||
|
||||
if (urls.length == 0) {
|
||||
window.location.href = url;
|
||||
return;
|
||||
}
|
||||
$.ajax({
|
||||
url: url,
|
||||
success: function() {
|
||||
window.location.href = url;
|
||||
},
|
||||
error: function() {
|
||||
navigate_to_first_existing(urls);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function get_docroot_url() {
|
||||
var url = window.location.href;
|
||||
var root = DOCUMENTATION_OPTIONS.URL_ROOT;
|
||||
|
||||
var urlarray = url.split('/');
|
||||
// Trim off anything after '/'
|
||||
urlarray.pop();
|
||||
var depth = (root.match(/\.\.\//g) || []).length;
|
||||
for (var i = 0; i < depth; i++) {
|
||||
urlarray.pop();
|
||||
}
|
||||
|
||||
return urlarray.join('/') + '/';
|
||||
}
|
||||
|
||||
function on_version_switch() {
|
||||
var selected_version = $(this).children('option:selected').attr('value');
|
||||
var url = window.location.href;
|
||||
var current_version = DOCUMENTATION_OPTIONS.VERSION;
|
||||
var docroot = get_docroot_url()
|
||||
|
||||
var new_versionpath = selected_version + '/';
|
||||
if (selected_version == "dev")
|
||||
new_versionpath = '';
|
||||
|
||||
// dev versions have no version prefix
|
||||
if (current_version == "dev") {
|
||||
var new_url = docroot + new_versionpath + url.replace(docroot, "");
|
||||
var fallback_url = docroot + new_versionpath;
|
||||
} else {
|
||||
var new_url = url.replace('/' + current_version + '/', '/' + new_versionpath);
|
||||
var fallback_url = new_url.replace(url.replace(docroot, ""), "");
|
||||
}
|
||||
|
||||
console.log(get_docroot_url())
|
||||
console.log(url + " to url " + new_url);
|
||||
console.log(url + " to fallback " + fallback_url);
|
||||
|
||||
if (new_url != url) {
|
||||
navigate_to_first_existing([
|
||||
new_url,
|
||||
fallback_url,
|
||||
'https://www.yoctoproject.org/docs/',
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
function on_doctype_switch() {
|
||||
var selected_doctype = $(this).children('option:selected').attr('value');
|
||||
var url = window.location.href;
|
||||
if (selected_doctype == 'mega') {
|
||||
var docroot = get_docroot_url()
|
||||
var current_version = DOCUMENTATION_OPTIONS.VERSION;
|
||||
// Assume manuals before 3.2 are using old docbook mega-manual
|
||||
if (ver_compare(current_version, "3.2") < 0) {
|
||||
var new_url = docroot + "mega-manual/mega-manual.html";
|
||||
} else {
|
||||
var new_url = docroot + "singleindex.html";
|
||||
}
|
||||
} else {
|
||||
var new_url = url.replace("singleindex.html", "index.html")
|
||||
}
|
||||
|
||||
if (new_url != url) {
|
||||
navigate_to_first_existing([
|
||||
new_url,
|
||||
'https://www.yoctoproject.org/docs/',
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// Returns the current doctype based upon the url
|
||||
function doctype_segment_from_url(url) {
|
||||
if (url.includes("singleindex") || url.includes("mega-manual"))
|
||||
return "mega";
|
||||
return "single";
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
var release = DOCUMENTATION_OPTIONS.VERSION;
|
||||
var current_doctype = doctype_segment_from_url(window.location.href);
|
||||
var current_series = release.substr(0, 3);
|
||||
var version_select = build_version_select(current_series, release);
|
||||
|
||||
$('.version_switcher_placeholder').html(version_select);
|
||||
$('.version_switcher_placeholder select').bind('change', on_version_switch);
|
||||
|
||||
var doctype_select = build_doctype_select(current_doctype);
|
||||
|
||||
$('.doctype_switcher_placeholder').html(doctype_select);
|
||||
$('.doctype_switcher_placeholder select').bind('change', on_doctype_switch);
|
||||
|
||||
if (ver_compare(release, "3.1") < 0) {
|
||||
$('#outdated-warning').html('Version ' + release + ' of the project is now considered obsolete, please select and use a more recent version');
|
||||
$('#outdated-warning').css('padding', '.5em');
|
||||
} else if (release != "dev") {
|
||||
$.each(all_versions, function(version, title) {
|
||||
var series = version.substr(0, 3);
|
||||
if (series == current_series && version != release) {
|
||||
$('#outdated-warning').html('This document is for outdated version ' + release + ', you should select the latest release version in this series, ' + version + '.');
|
||||
$('#outdated-warning').css('padding', '.5em');
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
})();
|
||||
162
sources/poky/bitbake/doc/sphinx-static/theme_overrides.css
Normal file
162
sources/poky/bitbake/doc/sphinx-static/theme_overrides.css
Normal file
@@ -0,0 +1,162 @@
|
||||
/*
|
||||
SPDX-License-Identifier: CC-BY-2.0-UK
|
||||
*/
|
||||
|
||||
body {
|
||||
font-family: Verdana, Sans, sans-serif;
|
||||
margin: 0em auto;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
h1,h2,h3,h4,h5,h6,h7 {
|
||||
font-family: Arial, Sans;
|
||||
color: #00557D;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2em;
|
||||
text-align: left;
|
||||
padding: 0em 0em 0em 0em;
|
||||
margin: 2em 0em 0em 0em;
|
||||
}
|
||||
|
||||
h2.subtitle {
|
||||
margin: 0.10em 0em 3.0em 0em;
|
||||
padding: 0em 0em 0em 0em;
|
||||
font-size: 1.8em;
|
||||
padding-left: 20%;
|
||||
font-weight: normal;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin: 2em 0em 0.66em 0em;
|
||||
padding: 0.5em 0em 0em 0em;
|
||||
font-size: 1.5em;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
h3.subtitle {
|
||||
margin: 0em 0em 1em 0em;
|
||||
padding: 0em 0em 0em 0em;
|
||||
font-size: 142.14%;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
h3 {
|
||||
margin: 1em 0em 0.5em 0em;
|
||||
padding: 1em 0em 0em 0em;
|
||||
font-size: 140%;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
h4 {
|
||||
margin: 1em 0em 0.5em 0em;
|
||||
padding: 1em 0em 0em 0em;
|
||||
font-size: 120%;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
h5 {
|
||||
margin: 1em 0em 0.5em 0em;
|
||||
padding: 1em 0em 0em 0em;
|
||||
font-size: 110%;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
h6 {
|
||||
margin: 1em 0em 0em 0em;
|
||||
padding: 1em 0em 0em 0em;
|
||||
font-size: 110%;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
em {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.pre {
|
||||
font-size: medium;
|
||||
font-family: Courier, monospace;
|
||||
}
|
||||
|
||||
.wy-nav-content a {
|
||||
text-decoration: underline;
|
||||
color: #444;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.wy-nav-content a:hover {
|
||||
text-decoration: underline;
|
||||
background-color: #dedede;
|
||||
}
|
||||
|
||||
.wy-nav-content a:visited {
|
||||
color: #444;
|
||||
}
|
||||
|
||||
[alt='Permalink'] { color: #eee; }
|
||||
[alt='Permalink']:hover { color: black; }
|
||||
|
||||
@media screen {
|
||||
/* content column
|
||||
*
|
||||
* RTD theme's default is 800px as max width for the content, but we have
|
||||
* tables with tons of columns, which need the full width of the view-port.
|
||||
*/
|
||||
|
||||
.wy-nav-content{max-width: none; }
|
||||
|
||||
/* inline literal: drop the borderbox, padding and red color */
|
||||
code, .rst-content tt, .rst-content code {
|
||||
color: inherit;
|
||||
border: none;
|
||||
padding: unset;
|
||||
background: inherit;
|
||||
font-size: 85%;
|
||||
}
|
||||
|
||||
.rst-content tt.literal,.rst-content tt.literal,.rst-content code.literal {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
/* Admonition should be gray, not blue or green */
|
||||
.rst-content .note .admonition-title,
|
||||
.rst-content .tip .admonition-title,
|
||||
.rst-content .warning .admonition-title,
|
||||
.rst-content .caution .admonition-title,
|
||||
.rst-content .important .admonition-title {
|
||||
background: #f0f0f2;
|
||||
color: #00557D;
|
||||
|
||||
}
|
||||
|
||||
.rst-content .note,
|
||||
.rst-content .tip,
|
||||
.rst-content .important,
|
||||
.rst-content .warning,
|
||||
.rst-content .caution {
|
||||
background: #f0f0f2;
|
||||
}
|
||||
|
||||
/* Remove the icon in front of note/tip element, and before the logo */
|
||||
.icon-home:before, .rst-content .admonition-title:before {
|
||||
display: none
|
||||
}
|
||||
|
||||
/* a custom informalexample container is used in some doc */
|
||||
.informalexample {
|
||||
border: 1px solid;
|
||||
border-color: #aaa;
|
||||
margin: 1em 0em;
|
||||
padding: 1em;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
|
||||
/* Remove the blue background in the top left corner, around the logo */
|
||||
.wy-side-nav-search {
|
||||
background: inherit;
|
||||
}
|
||||
|
||||
}
|
||||
BIN
sources/poky/bitbake/doc/template/Vera.ttf
vendored
Normal file
BIN
sources/poky/bitbake/doc/template/Vera.ttf
vendored
Normal file
Binary file not shown.
BIN
sources/poky/bitbake/doc/template/VeraMoBd.ttf
vendored
Normal file
BIN
sources/poky/bitbake/doc/template/VeraMoBd.ttf
vendored
Normal file
Binary file not shown.
BIN
sources/poky/bitbake/doc/template/VeraMono.ttf
vendored
Normal file
BIN
sources/poky/bitbake/doc/template/VeraMono.ttf
vendored
Normal file
Binary file not shown.
BIN
sources/poky/bitbake/doc/template/draft.png
vendored
Normal file
BIN
sources/poky/bitbake/doc/template/draft.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
Reference in New Issue
Block a user