Skip to content
Package Manager used by Venom Linux
Branch: master
Clone or download
Type Name Latest commit message Commit time
Failed to load latest commit information.
extra add EFI support Apr 12, 2019
BUGS initial commit Jul 23, 2017 remove HOOK, add trigger builtin May 1, 2019
TODO updated Aug 12, 2017
pkgadd change install script style and fix some stuff May 15, 2019
pkgbase updated Feb 8, 2019
pkgbuild.8 add man page for pkgbuild Feb 20, 2019
pkgdeplist improve scratch and revdep, add -f (--foreign) to pkgdeplist Apr 7, 2019
revdep fix revdep and add sort to search function Apr 26, 2019
revdep.conf add exclude libraries for revdep Apr 17, 2019
scratchpkg.conf remove HOOK, add trigger builtin May 1, 2019


A package manager for Linux From Scratch.


Scratchpkg is a package manager built in order to manage packages for the Linux From Scratch system/distro. This package manager is fully written in bash. The package building script uses the port system like in Arch's makepkg, CRUX's pkgmk and NuTyX's cards. Packages are built and installed into a temporary location using DESTDIR method and are afterwards compressed in a file directory using tar.

Installing the packaged tar means it is extracted into real system. After that all files extracted is recorded into an index directory. So scratchpkg will track all installed files. Scratchpkg can automatically resolve dependencies order. Scratchpkg reads the build script (spkgbuild) in the ports directory in order to get all necessary variables and functions before building them.


spkgbuild is build script sourced by buildpkg to build the package. The example of spkgbuild as follows:

# description	: This is example package
# backup	: etc/example.conf etc/foobar.conf
# depends	: package1 package2 package3
# noextract	: example.tar.gz foobar.tar.xz

options=(!docs libtool)

build() {
    cd $name-$version
    ./configure --prefix=/usr
    make DESTDIR=$PKG install
    install -d $SRC/example.conf $PKG/etc/example.conf

You can also use headers (except for description, as it needs for search function of scratch) as array, example:

backup=(etc/example.conf etc/foobar.conf)
depends=(package1 package2 package3)
noextract=(example.tar.gz foobar.tar.xz)

Note: When create new package, its recommended to build using fakeroot first to make sure the build script is not broken and leave untracked file inside system.

spkgbuild format:

  • description: Short description for package.
  • backup: File need backup when upgrading package (without leading with '/').
  • depends: All required dependencies, separate with space.
  • noextract: Specify file no need to extract, separate with space.
  • name: Package name, need same as port directory's name.
  • version: Package's version.
  • release: Package's release version, useful when build script need change with same package version.
  • options: Package's build options, see 'Package options' for available options.
  • source: Package's source urls, separate with space, can use as <new-source-name>::<source-url> to save source file with different name (see spkgbuild example).

Package options

This options is set in /etc/scratchpkg.conf for global options:


For per package, set options in package's spkgbuild:


Add ! in front of options to disable it, example for disable strip and remove empty directory in package (per package) as follows:

options=(!strip !emptydirs)

Available options:

libtool:     Keep libtool file (*.la) in packages.
emptydirs:   Keep empty directories in packages.
strip:       Strip symbols from binaries/libraries.
docs:        Keep docs directories specified by DOC_DIRS.
purge:       Remove files specified in PURGE_FILES.
zipman:      Compress manual (man and info) pages in MAN_DIRS with gzip.
buildflags:  Enable buildflags (CFLAGS and CXXFLAGS).
makeflags:   Enable makeflags (MAKEFLAGS).


pkgbuild is a tool to build package from ports. Is will source spkgbuild to get build information before creating package. Package is created into <name>-<version>-<release>.spkg.txz format. To build package, you need cd into port directory before run pkgbuild command.

  pkgbuild [ <options> <arguments> ]

  -i, --install             install package into system
  -u, --upgrade             upgrade package
  -r, --reinstall           reinstall package
  -d, --no-dep              skip dependency check
  -c, --ignore-conflict     ignore conflict when installing package
  -v, --verbose             verbose install process
  -f, --force-rebuild       rebuild package
  -m, --ignore-mdsum        skip md5sum checking
  -g, --genmdsum            generate md5sum
  -o, --download-only       download only source file
  -e, --extract-only        extract only source file
  -w, --keep-work           keep working directory
  -h, --help                show this help message
      --srcdir=<path>       override directory path for sources
      --pkgdir=<path>       override directory path for compiled package
      --no-preinstall       skip preinstall script before build/install package
      --no-postinstall      skip postinstall script after install package
      --no-preupgrade       skip preupgrade script before upgrade package
      --no-postupgrade      skip postupgrade script after upgrade package
      --no-color            disable color
      --no-backup           skip backup configuration file when upgrading package
      --redownload          re-download source file

  pkgbuild -irw	        this will force rebuild, install package and keep working directory

  * use pkgbuild without any options will only download source and build package by using other default options
  * pkgbuild need run inside port directory


pkgadd is a tool to install and upgrade package created by pkgbuild. Install package is simply extract <name>-<version>-<release>.spkg.txz by using tar into real system then save list extracted file into package INDEX_DIR. Upgrading package is also using same extract as install, it will replace old files then compare list file from old and new package and remove old file which not exist in new package (like Slackware pkgtool does).

  pkgadd package.spkg.txz <options>

  -u, --upgrade              upgrade package
  -r, --reinstall            reinstall package
  -d, --no-dep               skip dependency check
  -c, --ignore-conflict      ignore conflict when installing package
  -v, --verbose              print files installed
  -h, --help                 show this help message
      --no-preinstall        skip preinstall script before build/install package
      --no-postinstall       skip postinstall script after install package
      --no-preupgrade        skip preupgrade script before upgrade package
      --no-postupgrade       skip postupgrade script after upgrade package
      --no-backup            skip backup when upgrading package
      --no-orphan-check      skip orphaned package check after install package
      --no-color             disable colour for output

  pkgadd foobar-1.0-1.spkg.txz -uc --no-backup       upgrade package foobar-1.0-1 without backup its 
                                                     old configuration files and skip conflict check


pkgdel is a tool to remove package from system. It will read file listed in package INDEX_DIR and remove it.

  pkgdel [ <options> <package name> ]

  -d, --no-dep          skip dependency check
  -v, --verbose         print removed files
  -h, --help            show this help message
      --no-preremove    don't run pre-remove script
      --no-postremove   don't run post-remove script
      --no-color        disable colour for output

  pkgdel firefox -dv --no-preremove       remove package firefox, skipping dependency check,
                                          print deleted files and skipp pre-remove script


scratch is front-end for pkgbuild, pkgadd and pkgdel. Its changed directory in ports and call pkgbuild to build package, then pkgadd to install package into system. Its also has some extra functions like search packages, check dependency, dependent, orphan package, duplicate ports, list installed package and etc. Run scratch help to see available functions.

scratch [ mode ] [ <pkgname> <options> ]	

    install   <packages>      install packages and its dependencies
    upgrade   <packages>      upgrade packages and install new dependencies (if any)
    build     <package>       build only packages
    remove    <packages>      remove packages in system
    depends   <package>       show depends of a package
    deplist   <packages>      show list dependencies of a package
    search    <pattern>       search packages in port's repos
    lock      <packages>      lock packages from upgrade
    unlock    <packages>      unlock packages from upgrade
    listport  <repo>          list ports of a repo
    cat       <package>       view a package build scripts
    dependent <package>       show package's dependent
    own       <file>          show package's owner of file
    pkgtree   <package>       show list files of installed package
    path      <package>       show package's buildscripts path
    sync                      update port's repo
    sysup                     full system update
    dup                       print duplicate ports in repo
    readme                    print readme file if exist
    listinst                  list installed package in system
    listorphan                list orphan package
    integrity                 check integrity of package's files
    outdate                   check for outdate packages
    cache                     print leftover cache
    rmcache                   remove leftover cache
    missingdep                check for mising dependency of installed package
    foreignpkg                print package installed without port in repo
    listlocked                print locked packages
    help                      print this help message

options for:		
        -f, --force-rebuild    force rebuild
        -m, --skip-mdsum       skip md5sum check for sources
        -d, --no-dep           skip dependency check
        -e, --extract          extract only
        -w, --keep-work        keep woring directory
        -o, --download         download source files only
        --redownload           re-download source files
        --srcdir=<path>        override default SOURCE_DIR
        --pkgdir=<path>        override default PACKAGE_DIR
        --no-preinstall        skip pre-install script
        -d, --no-dep           skip installing dependencies
        -c, --ignore-conflict  skip file conflict check
        -r, --reinstall        reinstall installed package
        -v, --verbose          print install process
        --no-preinstall        skip pre-install script
        --no-postinstall       skip post-install script
        -d, --no-dep           skip installing dependencies (new dependencies)
        -c, --ignore-conflict  skip file conflict check
        -v, --verbose          print install process
        --no-backup            skip backup configuration file
        --no-preupgrade        skip pre-upgrade script
        --no-postupgrade       skip post-upgrade script
        -d, --no-dep           skip dependency check
        -v, --verbose          print removed files
        --no-preremove         skip pre-remove script
        --no-postremove        skip post-remove script
global options:
        --no-color             disable colour for output
        --debug                debug scratch script
  scratch install firefox gvfs -cv     build and install required dependencies and target package itself,
                                       ignore file conflict check and be verbose.

  scratch remove firefox gvfs -dv      remove package firefox and gvfs from system, ignore dependent check
                                       and be verbose

Extra tools

Extra tools is some scripts come with scratchpkg to help users do things more easier. More extra scripts may added from time to time.

  • s-chroot: Chroot script.
  • s-libdepends: Script to list package depends by shared libraries.
  • s-portcreate: Script to create template port.
  • s-updateconf: Script to update configuration files (*.spkgnew).
  • revdep: A reverse dependency script (like in Gentoo and CRUX, but my version), need to run after upgrade and remove package to check broken package(s). Specify package name if want to check single package only.


hook is specified command need to run after install/remove/upgrade package. hook suffix is *.hook and need to be placed in HOOK_DIR (default is /etc/hook/). The example of hook file for gdk-pixbuf package as follows:

# description	: Probing GDK-Pixbuf loader modules...
# operation	: install upgrade remove
# target	: usr/lib/gdk-pixbuf-2.0/2.10.0/loaders/

exechook() {
	/usr/bin/gdk-pixbuf-query-loaders --update-cache

Hook format:

  • description: Short description, printed when cmd executed.
  • operation: Specify when cmd need to run, available options; install, upgrade & remove.
  • target: Path file/directory checked need to run the cmd (without leading with '/').
  • exechook(): Command need to run should be in this function.

Install script

Install scripts is a bash script contains command need to run before/after install/upgrade/remove packages in system. The suffix of install script is <portname>.install. This install script need to placed in port directory and later will included in tar-ed package. The script contains the following functions which run at different times:

  • pre_build(): The script is run right before package is built.
  • pre_install(): The script is run right before files are extracted. One argument is passed: new package version.
  • post_install(): The script is run right after files are extracted. One argument is passed: new package version.
  • pre_upgrade(): The script is run right before files are extracted. Two arguments are passed in the following order: new package version, old package version.
  • post_upgrade(): The script is run right after files are extracted. Two arguments are passed in the following order: new package version, old package version.
  • pre_remove(): The script is run right before files are removed. One argument is passed: old package version.
  • post_remove(): The script is run right after files are removed. One argument is passed: old package version.

Example of install script for dbus.install:

pre_install() {
    getent group messagebus >/dev/null || groupadd -g 18 messagebus
    getent passwd messagebus >/dev/null || useradd -c "D-Bus Message Daemon User" -d /var/run/dbus -u 18 -g messagebus -s /bin/false messagebus

post_install() {
    dbus-uuidgen --ensure


/etc/scratchpkg.repo is file to define repo directory and url to sync/update port's. This is example default /etc/scratchpkg.repo;

# /etc/scratchpkg.repo : scratchpkg repo file
# format:
#    <repo directory> <repo url for sync>


Note: url is optional. Add if need to sync it.


Installing is performed by just simply execute/running the file


If packaging, append DESTDIR=/tmp/path in front of your command:

DESTDIR=/tmp/path ./

You can’t perform that action at this time.