Files
LibreELEC.tv/packages/readme.md
Sascha Kuehndel (InuSasha) f177baf48d documentation: package.mk
2018-05-25 23:34:34 +02:00

13 KiB

Structure of package.mk files

Introduction

The package.mk file defines variables and functions to build a package.

Variables

All avialible variable, to control the build behavoir of your package. Please use these in the order, listed here.

Base

Variable Default Required Description
PKG_NAME - yes Name of the packaged software application. Should be lowercase
PKG_VERSION - yes Version of the packaged software application
PKG_SHA256 - yes SHA256 hashsum of the application download file
PKG_ARCH any no Architectures for which the package builds. any or a space separated list of aarch64, arm or x86_64
PKG_LICENSE - yes License of the software application. Reference
PKG_SITE - yes Site of the software application
PKG_URL - yes Address at which the source of the software application can be retrieved
PKG_MAINTAINER - no Your name
PKG_DEPENDS_BOOTSTRAP
PKG_DEPENDS_HOST PKG_DEPENDS_INIT PKG_DEPENDS_TARGET
- no A space separated list of name of packages required to build the software application
PKG_SECTION - no virtual if the package only defines dependencies
PKG_SHORTDESC - no
yes for addons
Short description of the application software used in various parts of Kodi
PKG_LONGDESC - yes Long description of the application software used in various parts of Kodi

Universal Build Option

Variable Default Required Description
PKG_SOURCE_DIR - no Name of the folder to which the source of the software application unpacks. Should only be specified if the source of the software application unpacks to a folder whose name does not start with $PKG_NAME
PKG_SOURCE_NAME - no Name of the file of the source of the software application. Should only be specified if the source of the software application is not the basename of PKG_URL
PKG_PATCH_DIRS - no Change the path for pachtes, to apply to source. Normally the path ./patches is used. Is this variable is set, the normal path will extended with the value of this variable as a subdirectory: ./patches/${PKG_PATCH_DIRS}
PKG_NEED_UNPACK - no ??? can anyone explane, i have no idea.
PKG_TOOLCHAIN auto no Control which of the build toolchains is used. For detailed information, see the Reference.
PKG_BUILD_FLAGS - no A Space seperated list of flags, which control often used build modification. Flags can be enabled or disables with a prefixed +/-. For detailed information, see the Reference.
PKG_PYTHON_VERSION python2.7 no Defines the Python version, which should use.
PKG_IS_KERNEL_PKG - no Set it to yes, for packages which include linux kernel modules

Meson Options

Variable Default Required Description
PKG_MESON_SCRIPT $PKG_BUILD/meson.build no Meson build file to use
PKG_MESON_OPTS_TARGET - no Options directly passed to meson

CMAKE Options

Variable Default Required Description
PKG_CMAKE_SCRIPT $PKG_BUILD/CMakeLists.txt no CMake build file to use
PKG_CMAKE_OPTS_HOST
PKG_CMAKE_OPTS_TARGET
- no Options directly passed to cmake

Configure Options

Variable Default Required Description
PKG_CONFIGURE_SCRIPT $PKG_BUILD/configure no configure script to use
PKG_CONFIGURE_OPTS
PKG_CONFIGURE_OPTS_BOOTSTRAP
PKG_CONFIGURE_OPTS_HOST
PKG_CONFIGURE_OPTS_INIT
PKG_CONFIGURE_OPTS_TARGET
- no Options directly passed to configure

Make Options

Variable Default Required Description
PKG_MAKE_OPTS
PKG_MAKE_OPTS_BOOTSTRP
PKG_MAKE_OPTS_HOST
PKG_MAKE_OPTS_INIT
PKG_MAKE_OPTS_TARGET
- no Options directly passed to make in the build step
PKG_MAKEINSTALL_OPTS_HOST
PKG_MAKEINSTALL_OPTS_TARGET
- no Options directly passed to make in the install step

Addons

These options only needed, when the package is build as an addon. "Required" column is focus addon packages, only. When the package is no addon, none of these options is required.

Variable Default Required Description
PKG_REV - yes The revision number of the addon. Increase on every version. Currently starts at 100. Please place this variable under PKG_VERSION
PKG_IS_ADDON no yes Have to set to yes
PKG_ADDON_NAME - yes Proper name of the addon that is shown at the repo
PKG_ADDON_TYPE - yes See LE/config/addon/ for other possibilities
PKG_ADDON_VERSION - no The version of the addon, used in addon.xml
PKG_ADDON_PROVIDES - no Provides in addon-xml
PKG_ADDON_REQUIRES - no Requires used in addon.xml
PKG_ADDON_PROJECTS @PROJECTS@ no for available projects or devices, see projects subdirectory (note: Use RPi for RPi project, and RPi1 for RPi device)
PKG_DISCLAIMER - no Disclaimer in addon-xml
PKG_ADDON_IS_STANDALONE - no Defines if an addon depends on Kodi (on) or is standalone (yes)
PKG_ADDON_BROKEN - no Marks an addon as broken for the user

Detail Infomations for Options

TOOLCHAIN options

Application/packages needs different toolchains for build. For instance cmake or the classic ./configure or same very different.

For the most application/packages, the auto-detection of the toolchain works proper. But not always. To select a specific toolchain, you only need to set the PKG_TOOLCHAIN variable.

Toolchain Description (if needed)
meson Meson Build System
cmake CMake with Ninja
cmake-make CMake with Make
autotools GNU Build System
configure preconfigured GNU Build System
ninja Ninja Build
make Makefile Based
manual only runs self writen build steps, see Functions
Auto-Detection

The auto-detections looks for specific files in the source path.

  1. meson.build (PKG_MESON_SCRIPT) => meson toolchain
  2. CMakeLists.txt (PKG_CMAKE_SCRIPT) => cmake toolchain
  3. configure (PKG_CONFIGURE_SCRIPT) => configure toolchain
  4. Makefile => make toolchain

When none of these was found, the build abort and you have to set the toolchain via PKG_TOOLCHAIN

BUILD_FLAGS options

Build flags implement often used build options. Normally these are activated be default, but single applications/packages has problems to compile/run with these.

Set the variable PKG_BUILD_FLAGS in the package.mk to enable/disable the single flags. It is a space seperated list. The flags can enabled with a + prefix, and disables with an -.

flag default affected stage description
pic disabled target/init Position Independent Code
pic:host disabled host/bootstrap see above
lto depend on LTO_SUPPORT target/init can only disabled, use of "Link Time Optimisation" of the compiler
gold depend on GOLD_SUPPORT target/init can only disabled, use of the GOLD-Linker
parallel enabled all make or ninja builds with multiple threads/processes (or not)
Example
PKG_BUILD_FLAGS="+pic -gold"
PKG_BUILD_FLAGS="-parallel"

Functions

All build steps in the LibreELEC build system, a done by shell function. These functions can overwritten in the package.mk. But this raises problems, when the build system ist updated. To reduce the problem, most function was extended by pre_ and post_ scripts, to use instead.

When it is nesseary to replace configure, make and makeinstall, please use PKG_TOOLCHAIN="manual".

Some of the build steps needs to be run once, like unpack. Other steps needs to be run multiple times, to create the toolchain (stage bootstrap & host) or to create the LE image (stage init & target). These stage specific functions have the stage as suffix, like make_target.

Full list of overwrittable functions.

function stages specific description
unpack
pre_unpack
post_unpack
- Extract the source from the downloaded file
pre_patch
post_patch
- Apply the patches to the source, after extraction. The patch function it self is not allowed to overwritten
pre_build_[stage] yes Runs before of the start of the build
configure_[stage]
pre_configure_[stage]
post_configure_[stage]
yes Configure the package for the compile. This is only relevant for toolchain, that supports it (e.g. meson, cmake, configure, manual)
make_[stage]
pre_make_[stage]
post_make_[stage]
yes Build of the package
makeinstall_[stage]
pre_makeinstall_[stage]
post_makeinstall_[stage]
yes Installation of the files in the correct pathes
host: TOOLCHAIN
target: SYSROOT and IMAGE
bootstrap and init: temporar destination
addon - Copy all files together for addon creation. This is requiered for addons
Example
post_patch() {
  # replace hardcoded stuff
  sed -i $PKG_BUILD/Makefile 's|hardcoded stuff|variabled stuff|'
}

pre_configure_target() {
  CFLAGS="$CFLAGS -DEXTRA_FLAG=yeah"
}

post_makeinstall_target() {
  # remove unused executable, only library needed
  rm $INSTALL/usr/bin/bigexecutable
}

Add a new package to the Image

  1. Think about, why you needs it in the image.
    • new multimedia tool
    • add a new network tool
    • new kernel driver
    • ...
  • Find a place in the packages-tree
    • look into the package-tree, i think most is self explaind. When 1. was done, this is going fast :)
    • do not place it, in an existing package (directory with includes a package.mk)
    • when you found a place, create a directory with the name of your package (must the same like PKG_NAME!!)
  • Create a initial package.mk
    • you found a template under packages/package.mk.template. copy the template into the new directory and call it package.mk
    • edit your new package.mk
  • Find a place in the dependency tree. When 1. was done, this is going fast, again :)
    • when it extend an existing package, add it there to the PKG_DEPENDS_TARGET
    • take a look into the path packages/virtual, there you should find a virtual packages, that match your new package (misc-packages should the last option)
  • now you can build your image
    • when ist was build, under build-[...]/ should apear a directory with your package-name and -version.

Example

################################################################################
#      This file is part of LibreELEC - https://libreelec.tv
#      Copyright (C) 2018-present Team LibreELEC
#
#  LibreELEC 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.
#
#  LibreELEC 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 LibreELEC.  If not, see <http://www.gnu.org/licenses/>.
################################################################################

PKG_NAME="mariadb-connector-c"
PKG_VERSION="3.0.2"
PKG_SHA256="f44f436fc35e081db3a56516de9e3bb11ae96838e75d58910be28ddd2bc56d88"
PKG_ARCH="any"
PKG_LICENSE="LGPL"
PKG_SITE="https://mariadb.org/"
PKG_URL="https://github.com/MariaDB/mariadb-connector-c/archive/v$PKG_VERSION.tar.gz"
PKG_DEPENDS_TARGET="toolchain zlib openssl"
PKG_SECTION="database"
PKG_SHORTDESC="mariadb-connector: library to conntect to mariadb/mysql database server"
PKG_LONGDESC="mariadb-connector: library to conntect to mariadb/mysql database server"

PKG_CMAKE_OPTS_TARGET="-DWITH_EXTERNAL_ZLIB=ON
                       -DAUTH_CLEARTEXT=STATIC
                       -DAUTH_DIALOG=STATIC
                       -DAUTH_OLDPASSWORD=STATIC
                       -DREMOTEIO=OFF
                      "

post_makeinstall_target() {
  # drop all unneeded
  rm -rf $INSTALL/usr
}