The build part of a NM file contains all necessary information, dependencies and build instructions. May there exist some packages which contains only parts or doesn't need anything of this section.

Note!
Please respect all existing packaging rules!

The buildsystem splits the build process into several stages. The following stages will always passed though:

prepare

  • The source tarballs will be decompressed
  • Existing patches will be applied

build

  • The configure script will be executed ( if there is one present )
  • Hardcoded rpath's from libtool will be removed
  • The code will be compiled

install

  • All compiled binaries, libraries and other stuff will be installed
build
    requires
audit-devel
expat-devel
libselinux-devel
    end

    configure_options += \
--sysconfdir=/etc \
--localstatedir=/var \
--libdir=/lib \
--libexecdir=/lib \
--enable-libaudit \
--enable-selinux=yes \
--with-systemdsystemunitdir=/lib/systemd/system/ \
--with-dbus-user=dbus

    install_cmds
mkdir -pv %{BUILDROOT}/usr/lib
mv -v %{BUILDROOT}/lib/pkgconfig %{BUILDROOT}/usr/lib/

#change the arch-deps.h include directory to /usr/lib instead of /lib
sed -e 's@-I${libdir}@-I${prefix}/lib@' -i %{BUILDROOT}/usr/lib/pkgconfig/dbus-1.pc

mkdir -pv %{BUILDROOT}/usr/lib/dbus-1.0/include
        mv -v %{BUILDROOT}/lib/dbus-1.0/include/* %{BUILDROOT}/usr/lib/dbus-1.0/include
rm -rvf %{BUILDROOT}/lib/dbus-1.0

rm -vf %{BUILDROOT}/lib/libdbus-1.so
ln -svf ../../lib/libdbus-1.so.3 %{BUILDROOT}/usr/lib/libdbus-1.so
    end
end

requires

Contains a list of development packages or tools that are needed to build the package.

Note!
You have to add your dependencies with a += because some tools already has been added by default and they would be overwritten if you only use a simple =.

On multiple requirements its recommended to create a "requires block" instead of a simple line, to keep the syntax as clear as possible.

requires
    autoconf
    automake
    bison
    ncurses-devel
    readline-devel
end

DIR_APP

Sometimes a maintainer of a source package uses different names for the folder inside the source tarball and the filename of the tarball. The build system wouldn't be able to change into the correct directory so this variable needs to be overwritten to fix this issue.

For example the package libjpeg: The tarball isjpegsrc.v8a.tar.gz and the folder inside which contains the configure script and source files isjpeg-8a so we have to overwrite the DIR_APP with:

DIR_APP = %{DIR_SRC}/jpeg-%{version}

The variable %{DIR_SRC} points to the source folder inside the chroot environment. The variable %{version} contains the defined version of the package. The builder will decompress the tarball, change into the defined folder and run the configure script.

CFLAGS / CXXFLAGS

With this flags you are able to set your own package specified CFLAGS and CXXFLAGS.

Note!
You have to add them with a += to prevent from overwriting the default flags.

PARALLELISMFLAGS

Overwrite and set this flag to zero if the package doesn't allow a parallelism build.

PARALELLISMFLAGS = # No parallel build

CONFIGURE_OPTIONS

With this variable you can add your ownswitches to the configure script of the package.

CONFIGURE_OPTIONS += \
    --mandir=/usr/share/man
Note!
At default the switch, - -prefix=/usr is already set, so you don't need to use it.

prepare

It is the first stage of all. In this stage, the tarball with the package source will be decompressed and patches will be applied.

Decompressing

The buildsystem automatically will decompress all defined source tarballs, so you don't have to add some commands to the NM for that. It also will determine and use the correct decompress command for the specified tarballs.

Patching

If there are any patches inside the /ipfire-3.x/pkgs//patches/ folder, the buildsystem automatically will apply them. Supported Patchfiles are:

-Np0* Format | File has to be named *.patch0 or *.diff0
-Np1* Format | Default format *.patch or *.diff

If you have to apply the patches in a special order add something like the following example to the header section of your file.

# Manual list patches because they need to be applied in special order
patches = \
    Patchfile1.patch \
    Patchfile2.patch0 \
    Patchfile3.diff

prepare_cmds

If your package requires commands after decompressing and patching, you can determine them here.
Example for that are to change something by usingsed, copy or remove files.

Example from the package bash:

prepare_cmds
    # Bash uses the RTLD_LAZY option when loading libraries. We want to use
    # RTLD_NOW (it is defined from <dlfcn.h>:
    sed -e "s/filename, RTLD_LAZY/filename, RTLD_NOW/" \
          -i builtins/enable.def

    sed -i "s|htmldir = @htmldir@|htmldir = /usr/share/doc/%{thisapp}|" \
          Makefile.in
end

CONFIGURE_SCRIPT

Sometimes a package maintainer named his "configure" script like "Configure" or "configure-linux".
To prevent from build errors or overwrite the full build stage, it is possible to tell the build system to use an other "configure script" then the defaultconfigure.

build

In this stage, the configure script will be executed and the package will get compiled and linked.

configure

At default, the buildsystem will switch to to the package folder and run the configure script of the package.

build_targets

This command is used if you have to add some commands directly to the make command.

Example from chrony:

build_targets += getdate all docs

FIX LIBTOOL

If there are any hardcoded RUNPATH's instructions from libtool, they will be automatically removed.

configure_cmds

If your package requires commands after executing the configure script, you can determine them here.

Compiling

The source code will be compiled by using a hardened gcc and binutils. If needed by your package you can add additional instructions withbuild_targets or change thePARALLELISMFLAGS.

build_cmds

Here you can execute your own commands after building if it's necessary for your package.

An example from the package util-linux-ng.

# Build nolodin
build_cmds
    gcc %{CFLAGS} -o nologin %{DIR_SOURCE}/nologin.c
end

test

This stage is not enabled at default, but if your package contains a testsuite it is recommended to check your compiled package.

To do that, you have to define the complete stage like that:

test
    make check
end

install

In this stage, the package get's installed. If you want to add own install flags, you can to do that with install_targets.

  • Services files for Systemd will be automatically installed if they are placed in /ipfire-3.x/pkgs//systemd/
  • tmpfiles for Systemd will be installed if they are placed as /ipfire-3.x/pkgs//*.tmpfiles
  • Pam files will be installed if they are placed in /ipfire-3.x/pkgs//pam.d/ or named *.pam in the main folder.
  • Files for logrotate will be installed if they are placed in /ipfire-3.x/pkgs//logrotate/ or named *.logrotate in the main folder.

install_targets

This command is needed if you have to add some flags to the install command itself like install directories or something like that.

Note!
You have to add them with a += to prevent from overwriting the default flag (install).

Example from dmraid:

make_install_targets += sbindir=%{BUILDROOT}/sbin

install_cmds

In this section you can execute commands after installing your package, like creation of symlinks copy or delete unwanted files and folders.

You don't need to type any commands here to install:

  • Systemd service files
  • Tmpfiles for systemd
  • pam files
  • Files for logrotate

More information atinstall at this article.

Example from bash:

install_cmds
    mkdir -pv %{BUILDROOT}/{bin,etc/profile.d,root}

    # Bash startup files
    cp -vf %{DIR_SOURCE}/dot_bash_logout %{BUILDROOT}/root/.bash_logout
    cp -vf %{DIR_SOURCE}/dot_bash_profile %{BUILDROOT}/root/.bash_profile
    cp -vf %{DIR_SOURCE}/dot_bashrc %{BUILDROOT}/root/.bashrc

    # /etc/profile.d
      cp -vf %{DIR_SOURCE}/profile.d/* %{BUILDROOT}/etc/profile.d

    ln -svf bash %{BUILDROOT}/bin/sh
end