From 5f7bdff8b74c47a73fa3d15d189ff728de31b9db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Kl=C3=B6tzke?= Date: Fri, 22 Nov 2024 22:50:18 +0100 Subject: [PATCH] doc: add first documentation draft Fixes #42. --- .gitattributes | 2 + doc/.gitignore | 1 + doc/BOB_Logo.png | Bin 0 -> 52308 bytes doc/Makefile | 20 ++++ doc/_static/.gitkeep | 0 doc/_templates/.gitkeep | 0 doc/conf.py | 31 +++++++ doc/contribution.rst | 199 ++++++++++++++++++++++++++++++++++++++++ doc/index.rst | 47 ++++++++++ doc/introduction.rst | 53 +++++++++++ doc/make.bat | 35 +++++++ doc/usage.rst | 69 ++++++++++++++ 12 files changed, 457 insertions(+) create mode 100644 doc/.gitignore create mode 100644 doc/BOB_Logo.png create mode 100644 doc/Makefile create mode 100644 doc/_static/.gitkeep create mode 100644 doc/_templates/.gitkeep create mode 100644 doc/conf.py create mode 100644 doc/contribution.rst create mode 100644 doc/index.rst create mode 100644 doc/introduction.rst create mode 100644 doc/make.bat create mode 100644 doc/usage.rst diff --git a/.gitattributes b/.gitattributes index 49bade0e..c2adc49e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,4 @@ +*.bat -text +*.png binary .git* eol=lf export-ignore * eol=lf diff --git a/doc/.gitignore b/doc/.gitignore new file mode 100644 index 00000000..ba65b13a --- /dev/null +++ b/doc/.gitignore @@ -0,0 +1 @@ +/_build/ diff --git a/doc/BOB_Logo.png b/doc/BOB_Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6aa39eaf4c99bea79d6d7b8e2cd018d1f9e8c099 GIT binary patch literal 52308 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 Wc-^s6hzEEZgtCH$e1)7@$o~OBEj57v literal 0 HcmV?d00001 diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 00000000..d4bb2cbb --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# 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) diff --git a/doc/_static/.gitkeep b/doc/_static/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/doc/_templates/.gitkeep b/doc/_templates/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/doc/conf.py b/doc/conf.py new file mode 100644 index 00000000..8323174a --- /dev/null +++ b/doc/conf.py @@ -0,0 +1,31 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = 'Basement recipes' +copyright = '2024, Jan Klötzke' +author = 'Jan Klötzke' + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [ 'sphinx.ext.intersphinx' ] + +templates_path = ['_templates'] +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +highlight_language = "yaml" + +intersphinx_mapping = { + 'bob' : ('https://bob-build-tool.readthedocs.io/en/latest/', None), +} + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = 'alabaster' +html_static_path = ['_static'] diff --git a/doc/contribution.rst b/doc/contribution.rst new file mode 100644 index 00000000..b863ac52 --- /dev/null +++ b/doc/contribution.rst @@ -0,0 +1,199 @@ +Contribution guide +================== + +The Bob Build Tool and the Basement project are open-source, community-based +projects. Contributions are very welcome. The following sections should give +some guidance how to create new recipes or improve existing ones. + +Anatomy of a recipe +------------------- + +The general structure of a recipe looks like the following:: + + inherit: [autotools] + + depends: + - libs::pcre-lib-1-dev + - use: [] + depends: + - libs::pcre-lib-1-tgt + + metaEnvironment: + PKG_VERSION: "3.11" + PKG_LICENSE: "GPL-3.0-or-later" + + checkoutSCM: + scm: url + url: ${GNU_MIRROR}/grep/grep-${PKG_VERSION}.tar.xz + digestSHA1: "955146a0a4887eca33606e391481bbef37055b86" + stripComponents: 1 + + buildScript: | + autotoolsBuild $1 \ + --without-included-regex + + packageScript: | + autotoolsPackageTgt + + provideDeps: [ "*-tgt" ] + + +1. Any classes that are inherited are named at the top of the recipe. Only + include classes that are actually needed. +2. Usually, recipes depend on other recipes because the package needs other + libraries to work. They are named in the + :external:ref:`configuration-recipes-depends` section. Notice that each + dependency is usually listed twice: the build time library dependency + (``-dev``) that has the headers and the static or dynamic libraries. The + same dependencies are again listed as runtime dependency. These packages end + with the ``-tgt`` suffix by convention. +3. The :external:ref:`configuration-recipes-metaenv` variables describe the package. So far, + two variables should be present: + + ``PKG_VERSION`` + The version of the package that is built. + + ``PKG_LICENSE`` + The license of the package as `SPDX License Identifier + `_. In the best case a single identifier + applies. Sometimes, a more complicated license expression (e.g. + ``GPL-2.0-only OR BSD-3-Clause``). See the SPDX specification for details + how licenses are expressed. +4. The :external:ref:`configuration-recipes-scm` part fetches the source code. + Always make sure that the checkout is determinisitc. This can be a hash sum + for tarballs like the example above or a git commit id. If tarballs or other + archives are available, they are very much preferred. Only use git clones or + other "real" SCMs if release tarballs are not available. +5. The build script does the actual job of building the package. In case of + standard build systems, this should only be a couple of lines, passing + necessary configuration options to the standard build system wrappers. +6. In the ``packageScript`` the desired output is fetched from the build tree + of the package. +7. As a last step, all runtime dependencies are passed downstream by the + :external:ref:`configuration-recipes-providedeps` property. + +This pattern is the basis for almost all recipes. Some sections might not be +necessary while others need additional things. See the following sections for +more information about the various package types. + +.. TODO: Multiple packages with different licenses - USe PKG_LICENSE inside of + multiPackage + +Recipe style guide +------------------ + +There are a couple of general coding style rules: + +* Indent by 4 spaces +* Lines should break after 80 characters. The hard line length limit is 120 + characters. +* ... + +Class style guide +----------------- + +Regarding the functions in classes, the function name should start with the class name. +The rest of the name is using camel case. +For example, for class ``foo`` might define functions ``fooBuild`` and ``fooBarBaz``. + +Classes should typically have no side effect. They should just declare functions and +variables in ``checkout/build/packageSetup``. + +Recipe naming +------------- + +When creating new recipes, the respective layer must be chosen first. Almost +always, the ``basement-gnu-linux`` layer is the right one. The only reason to +put something new into the ``basement`` layer is when it is required to support +a (new) build system or standard toolchain. + +New recipes should be placed next to similar other recipes. Recipes are placed +into different categories. The following list should provide some guideline to +choose the right category. It is not uncommon that multiple categories apply. +In this case, the first matching category of the following list should be used. +If in doubt, create a discussion on Github or ask on the mailing list. + +``libs`` + C and C++ libraries to make other programs work. Libraries are packages that + provide header files and static and/or dynamic libraries that are used by + other packages. Even if the package additionally provides some application + based on the library, the ``libs`` category should be used. + + Other languages (e.g. Python) have their own category and libraries of these + languages should be placed there. On the other hand, there are sometimes + large collections of libraries that are related to each other. Such + libraries are further put into sub-categories: + + ``gnome`` + Libraries that are coming from the Gnome project. + + ``xorg`` + Libraries that are related to the X.Org project. + +Some interpreted languages have their own category. This includes the +interpreter itself, libraries and applications written in this language. + +``perl`` + Everything about Perl. + +``python`` + Everything about Python 3. Support for Python 2 has been removed. + +The other categories do not really have a preference between each other. + +``bsp`` + Anything with links to specific hardware or hardware configuration + information. These are for example firmware like the Arm Trusted Firmware or + boot loaders like Grub. + +``core`` + Basic files and daemons that are essential to boot the system. This includes + utilities to administer system resources, manage user accounts, etc. + +``db`` + Database Servers and Clients. + +``devel`` + Development utilities, compilers, development environments, libraries, etc. + Basically anything that is required to build other software. + +``editors`` + Software to edit files. Programming environments. + +``graphics`` + Applications, utilities and files that are graphics related. + + ``fonts`` + Fonts. + + ``gnome`` + Applications of the GNOME desktop environment. + + ``wayland`` + Wayland specific applications and utilities. + + ``xorg`` + X11 specific applications and utilities. + +``kernel`` + Operating System Kernels and related modules. + +``multimedia`` + Codecs and support utilities for audio, images and video. + +``net`` + Daemons and clients to connect the system to the world. + +``text`` + Text processing applications and utilities. This includes dictionaries and + converters. + +``utils`` + Shells, utilities for file/disk manipulation, backup and archive tools, + system monitoring, input systems, etc. Basically any tool that does not fit + in any of the other categories. + +``virtual`` + Virtual packages. Inside the virtual category the sub-categories form the + same hierarchy like it would for non-virtual packages. That is, any of the + main categories can be present. diff --git a/doc/index.rst b/doc/index.rst new file mode 100644 index 00000000..193ea3ff --- /dev/null +++ b/doc/index.rst @@ -0,0 +1,47 @@ +Welcome to the Basement recipes's documentation! +================================================ + +.. image:: /BOB_Logo.png + +This basement project is a collection of foundational recipes and classes that +can be included by other projects. Most importantly, it provides ready to use +classes to handle common build systems and other recurring tasks. Additionally, +a sandbox and common GCC toolchains are ready-to-use. + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + introduction + usage + contribution + + +Copyright +--------- + +This documentation is part of the Basement recipes. + +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. + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`search` diff --git a/doc/introduction.rst b/doc/introduction.rst new file mode 100644 index 00000000..2705715c --- /dev/null +++ b/doc/introduction.rst @@ -0,0 +1,53 @@ +Introduction +============ + +The `Bob Build Tool `_ is a versatile +build automation tool. While it brings many mechanism, very little policies are +included. To build actual software, a number of foundational recipes and +classes are required. The basement layer provides exactly this. + +* Classes for standard build systems (e.g. GNU autotools, CMake, ...) +* Compilers and interpreters for common languages (C/C++, Python, rust) +* A standard sandbox image + +Prerequisites +------------- + +To use the basement layer, the following prerequisites should be fulfilled: + +* A Linux or Windows MSYS2 ``x86_64`` system +* The following basic development tools should be installed + * gcc >= 5.x + * bash + * POSIX awk (GNU awk version >= 3.1.5) + * GNU m4 + * perl >= 5.6.1 + * GNU tar + * gzip + * bzip2 + * rsync + * xz-utils +* The `Bob Build Tool `_ + +Layer architecture +------------------ + +The basement layer is intentionally kept to its bare minimum, providing the +above mentioned support. Anything that goes beyond that, is supposed to be kept +in separate layers. Specifically, the following other layers may be of interest: + +* `basement-gnu-linux `_ - + Provides many recipes to build a GNU/Linux system. Note that the recipes are + not restricted to be used on Linux. It is just that most of the packages are + used for that and the name of the layer does not reflect the full breadth any + more. + +Examples +-------- + +There are some examples available that show how the layers are used: + + * `Embedded systems `_ + * `Linux containers `_ + + diff --git a/doc/make.bat b/doc/make.bat new file mode 100644 index 00000000..32bb2452 --- /dev/null +++ b/doc/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/doc/usage.rst b/doc/usage.rst new file mode 100644 index 00000000..a1bcd23d --- /dev/null +++ b/doc/usage.rst @@ -0,0 +1,69 @@ +Usage notes +=========== + +Basic setup +----------- + +First, you need to add the basement layer to your project. To do so, add a +:external:ref:`configuration-config-layers` entry to your +:external:ref:`config.yaml `:: + + bobMinimumVersion: "0.25" + layers: + - name: basement + scm: git + url: https://github.com/BobBuildTool/basement.git + +This will always use the latest version. You probably want to add a specific ``commit`` +so that always the same recipes are used. Next, the layer must be fetched. For that, +do a:: + + bob layers update + +To use all facilities of the basement project, you just need to inherit the +``basement::rootrecipe`` class in your root recipe:: + + inherit: [ "basement::rootrecipe" ] + +This will make your recipe a root recipe and already setup the sandbox with a +proper host toolchain. See the next chapter what tools and toolchains are readily +available. + +C/C++ toolchains +---------------- + +Standard build systems +---------------------- + +The following build tools are supported by the basement layer. See the +respective section below for the particular usage notes. + +CMake +~~~~~ + +Python 3 +-------- + +Perl +---- + +.. TODO + +Rust +---- + +Available development tools +--------------------------- + +The following tools can be used by naming them in +:external:ref:`configuration-recipes-tools`: + +* bison +* cpio +* flex +* make +* pkg-config +* squashfs-tools +* e2fsprogs +* util-linux +