Mercurial > vanilla
diff Docs/manual.md @ 714:6b4ba668a43c
vanilla: update documentation
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 02 Aug 2019 21:20:00 +0200 |
parents | |
children | c5cbe07af6a9 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Docs/manual.md Fri Aug 02 21:20:00 2019 +0200 @@ -0,0 +1,294 @@ +Getting started +=============== + +This documentation explains how to write a package file from scratch. + +Synopsis +======== + +Each package lives under a dedicated directory broken down into several +categories. A package consists of the following files: + +- NAME.sh: a pure POSIX shell that process the build and contains some + metadata required for installation. +- NAME.sha1: contains the checksums for individual source files (Optional). +- NAME-post.sh: a script to be executed before/after the installation + (Optional). + +In the listing above, replace NAME with the actual package name. For example the +package *zlib* contains the following files: + +- compression/zlib/zlib.sh +- compression/zlib/zlib.sha1 + +The build script +================ + +The build script (NAME.sh) is a pure POSIX shell that defines various +information about the package and how to build it. To be included within the +official Vanilla Linux repository it must be licensed under the terms of the ISC +license. + +Several templates are already available for most build systems in the Templates +directory. + +Metadata +-------- + +A package requires several information to be installed, the following variables +must be present: + +- PKGNAME: the package name (same as the directory). +- PKGVERSION: the package upstream version. +- PKGREVISION: the initial revision (starts at 1). +- PKGLICENSE: a space separated list of licenses (see licenses.md file). +- PKGSUMMARY: a short summary. + +The following variables are optional + +- PKGDEPENDS: a space separated list of packages required to build (see below). +- PKGDOWNLOAD: a space separated list of files to download from the web, if the + package does not need to download anything don't set it. +- PKGUIDS: a space separated list of uid to create (see below) +- PKGGIDS: a space separated list of gid to create (see below) +- PKGPROTECT: a space separated list of relative path to files to preserve on + installation (e.g. etc/nginx/nginx.conf) +- PKGOPTIONS: a space separated list of CAPITALIZED options. + +Build +----- + +To build the package, you need to define a build function that install the +package into the $DESTDIR variable. + +Usually, the build function does: + +1. Clean the build directory in case the previous build failed. +2. Extract distribution files. +3. Process build and installs into $DESTDIR. +4. Clean up again the build directory. + +Package naming +============== + +The following prefixes must be used for those packages: + +- py-: for python modules. +- py2-: for python modules (only for exceptional cases). +- ruby-: for native ruby modules. +- rubygem-: for rubygems modules. +- p5-: for perl 5 modules. +- hs-: for haskell modules. +- font-: for fonts (of any kind). + +When a package is available with different versions (e.g. Gtk, Qt) we add the +major number as suffix to the PKGNAME to *old* versions. Example, if Qt 5 is the +current major version and Qt 4 is also shipped then, the package *qt* refers to +version 5 while *qt4* to version 4. + +Handling dependencies +===================== + +The variable *PKGDEPENDS* is filled up with package origins, thus you need to +write *lib/zlib* NOT *zlib*. + +Also, the following selectors may be appended to the dependency to alter the +meaning: + +- `:build` the dependency is only required for building, +- `:optional` the dependency is optional and not strictly required. +- `:recommended` same as optional but installed by default. + +Example: + + PKGDEPENDS="dev/cmake:build graphics/qt5:recommended lib/zlib" + +Protected files +=============== + +Configuration files (usually everything under /etc) must be marked as well in +*PKGPROTECT* variables. This prevents `vpk` for overriding user configurations. + +Note: if the package ships a init script file, it must be marked as well. + +Example: + + PKGPROTECT="etc/nginx.conf etc/rc.d/nginx" + +In this case, `vpk` will rename the file to *etc/nginx.conf.vpk* and +*/etc/rc.d/nginx.vpk* in the archive and only be renamed if they are not present +on the disk or not manually modified. + +Uids / Gids +=========== + +If the package requires UNIX users and groups, adapt the *PKGUIDS* and *PKGGIDS* +variables as a space separated list. You can assign a default numeric id using +the syntax `:number`. + +Example: + + PKGUIDS="messagebus" # vpk will assign an id + PKGUIDS="gdm:55" # vpk will use 55 + +Warning: if you need to change file permissions, do it *ONLY* in a post install +script as users may have set different numeric id than the package defaults. + +Once you need a new UID/GID, edit the file UIDS.md in this directory as well. + +Options +======= + +... + +Example with network/wget: + + # cd network/wget + # SSL=openssl NLS=no vpk build + +Add the desired options in *PKGOPTIONS* variable and don't forget to set default +values. + +Example with NLS + + PKGOPTIONS="NLS" + + : ${NLS:=yes} + + if [ "$NLS" = "yes" ]; then + PKGDEPENDS="core/gettext $PKGDEPENDS" + with_nls="--enable-nls" + else + with_nls="--disable-nls" + fi + +Then at configure step: + + ./configure $with_nls + +Proper handling of options is done by explicitly disabling/enabling options. +Most programs will try to enable/disable features depending on what is available +on the system thus, if the package finds a dependency and enable it you need to +adapt *PKGDEPENDS*. Always check what options are available in the package and +use their default as explicit knobs to avoid invisible dependencies. + +See the file options.md for predefined options and proper naming. + +Paths +===== + +The package must ensure appropriate directories for installing files. This +includes: + +- /etc/rc.d for service files +- /lib/pkgconfig: for .pc files +- /lib/cmake: for CMake config files +- /lib: for libraries (no lib64 suffix) +- /share/locale: for NLS files +- /share/man/man{1,2,3,4,5,6,7,8}: for man pages (in uncompressed form) +- /share/doc/PKGNAME (exact directory, no version) + +Keep neutral +============ + +Do not make any modifications to the package. Keep it as close to upstream as +possible. Only minor tweaks are allowed including: + +- adjusting pid/uid/gid in a default configuration file for easier deployment + (but not on the original file example) +- disabling static libraries +- making sure paths are consolidated +- making sure system libraries are used rather than in-source bundles + +Services +======== + +Services files must be installed in /etc/rc.d. You must use the following +conventions regarding messages the service will print. + +The script must at least support start, stop and restart. + +#### start (required) + +Always add arguments with the invocation. + + Starting foo: /bin/foo -d + +#### stop (required) + +If the service is not running, don't write any message. Otherwise write: + + Stopping foo. + +#### restart (required) + +Basically, this command just calls stop and start. + + Stopping foo. + Starting foo: /bin/foo -d + +#### status + +Depending on the status, write the following messages. + + foo is running with pid: 1234 + foo is not running + +#### usage + +If the script is invoked with invalid arguments or none, write the usage like +this through stderr and exit 1. Also keep all subcommands sorted. + + usage: foo restart|start|status|stop + +If your script may support additional operations, messages and usage are up to +the maintainer discretion. + +See also the template file in Templates/rc. + +Libraries +========= + +Do not ship static libraries and libtool files. Make sure your build script +suppress static builds if possible or delete the .a file. + +Note: the C and C++ library are shipped for technical reasons though. + +Post install scripts +==================== + +If you need to perform some custom steps after the installation of the binary +package in the target systems, you may create the NAME-post.sh script. This +script must be written also in pure POSIX shell language. + +As unique argument, `vpk` will provide one of these to the post script: + +- pre-install: before the extraction of the package. +- post-install: after the extraction of the package. +- pre-uninstall: before removing the package. +- post-uninstall: after the removal of the package. + +Note: if the package wants to call a binary from an other package, it is usually +a good idea to check it's presence first. + +Example: + + #!/bin/sh + + if [ -x /bin/gtk-update-icon-cache ]; then + gtk-update-icon-cache -vf /share/icons/hicolor + fi + +Desktop files +============= + +We usually never add .desktop files for any package that doesn't provide one by +itself. This also includes terminal based applications. + +If a .desktop is provided by the package, make sure though that it is valid and +specifies the appropriate category (i.e. it does not appear in multiple menus at +once). + +See [desktop entry specification][] for more information. + +[desktop entry specification]: https://specifications.freedesktop.org/desktop-entry-spec/latest