cpkg

Build tool for C

Latest on Hackage:0.2.0.0

This package is not currently in any snapshots. If you're interested in using it, we recommend adding it to Stackage Nightly. Doing so will make builds more reliable, and allow stackage.org to host generated Haddocks.

BSD-3-Clause licensed by Vanessa McHale

cpkg

Build Status Windows build status Hackage CI Hackage Dependencies of latest version on Hackage

cpkg is a build tool for C with a particular emphasis on cross compilation. It is configured using Dhall.

By considering a package to be a function taking a cpkg-supplied installation directory to a series of steps, we can effectively package C projects with diverse build systems and handle dependencies between them.

This tool provides reasonably good support for cross-compilation of C projects and packages. It is not a full-fledged package manager.

Installation

cabal new-install cpkg

Shell Completions

Add the following to your ~/.bashrc for shell completions:

eval "$(cpkg --bash-completion-script cpkg)"

Packages

To view available packages, use cpkg list

vanessa@thinkpad ~/programming/haskell/done/cpkg 🌸 cpkg list

autoconf
    url: https://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.xz
    version: 2.69
    build dependencies: m4


automake
    url: https://ftp.gnu.org/gnu/automake/automake-1.16.1.tar.xz
    version: 1.16.1
    build dependencies: autoconf


at-spi2-atk
    url: http://ftp.gnome.org/pub/gnome/sources/at-spi2-atk/2.30/at-spi2-atk-2.30.0.tar.xz
    version: 2.30.0
    dependencies: at-spi2-core, atk, libxml2
    build dependencies: meson, ninja


at-spi2-core
    url: http://ftp.gnome.org/pub/gnome/sources/at-spi2-core/2.30/at-spi2-core-2.30.0.tar.xz
    version: 2.30.0
    dependencies: libXtst, glib
    build dependencies: meson, ninja


atk
    url: https://ftp.gnome.org/pub/gnome/sources/atk/2.30/atk-2.30.0.tar.xz
    version: 2.30.0
    build dependencies: gobject-introspection
⋮

Example

To install tar:

cpkg install tar

To install emacs:

cpkg install emacs

Configuration

Here is the configuration for Lua:

let prelude = https://raw.githubusercontent.com/vmchale/cpkg/master/dhall/cpkg-prelude.dhall
in

let lua =
  λ(v : List Natural) →
    let printLuaOS =
      λ(os : types.OS) →
        merge
          { FreeBSD   = λ(_ : {}) → "freebsd"
          , OpenBSD   = λ(_ : {}) → "bsd"
          , NetBSD    = λ(_ : {}) → "bsd"
          , Solaris   = λ(_ : {}) → "solaris"
          , Dragonfly = λ(_ : {}) → "bsd"
          , Linux     = λ(_ : {}) → "linux"
          , Darwin    = λ(_ : {}) → "macosx"
          , Windows   = λ(_ : {}) → "mingw"
          , Redox     = λ(_ : {}) → "generic"
          , Haiku     = λ(_ : {}) → "generic"
          , IOS       = λ(_ : {}) → "generic"
          , AIX       = λ(_ : {}) → "generic"
          , Hurd      = λ(_ : {}) → "generic"
          , Android   = λ(_ : {}) → "generic"
          , NoOs      = λ(_ : {}) → "c89"
          }
          os
    in

    let luaBuild =
      λ(cfg : types.BuildVars) →
        let cc = prelude.mkCCArg cfg
        in

        let ldflags =
          (prelude.mkLDFlags cfg.linkDirs).value
        in

        let cflags =
          (prelude.mkCFlags cfg.includeDirs).value
        in

        let os =
          prelude.osCfg cfg
        in

        [ prelude.call (prelude.defaultCall ⫽ { program = "make"
                                              , arguments = cc # [ printLuaOS os, "MYLDFLAGS=${ldflags}", "MYCFLAGS=${cflags}", "MYLIBS=-lncurses" ]
                                              })
        ]
    in

    let luaInstall =
      λ(cfg : types.BuildVars) →
        [ prelude.call (prelude.defaultCall ⫽ { program = "make"
                                              , arguments = [ "install", "INSTALL_TOP=${cfg.installDir}" ]
                                              }) ]
          # prelude.symlinkBinaries [ "bin/lua", "bin/luac" ]
    in

    prelude.simplePackage { name = "lua", version = v } ⫽
      { pkgUrl = "http://www.lua.org/ftp/lua-${prelude.showVersion v}.tar.gz"
      , configureCommand = prelude.doNothing
      , buildCommand = luaBuild
      , installCommand = luaInstall
      , pkgDeps = [ prelude.unbounded "readline"
                  , prelude.unbounded "ncurses"
                  ]
      }
in

lua [5,3,5]

Cabal Integration

After running

cpkg install libX11 --target=arm-linux-gnueabihf
cpkg install libXext --target=arm-linux-gnueabihf
cpkg install libXrandr --target=arm-linux-gnueabihf
cpkg install libXinerama --target=arm-linux-gnueabihf
cpkg install libXScrnSaver --target=arm-linux-gnueabihf

You can dump flags to be passed to cabal with

cpkg dump-cabal libX11 libXext libXrandr libXinerama libXScrnSaver --target=arm-linux-gnueabihf

which will produce something like

--extra-lib-dirs=/home/vanessa/.cpkg/arm-linux-gnueabihf/libX11-1.6.7-820c8166b4caadb/lib --extra-lib-dirs=/home/vanessa/.cpkg/arm-linux-gnueabihf/libXext-1.3.3-1bad0a89c6794a53/lib --extra-lib-dirs=/home/vanessa/.cpkg/arm-linux-gnueabihf/libXrandr-1.5.1-f58f951a622e5c2/lib --extra-lib-dirs=/home/vanessa/.cpkg/arm-linux-gnueabihf/libXinerama-1.1.4-516496f7e04d34be/lib --extra-lib-dirs=/home/vanessa/.cpkg/arm-linux-gnueabihf/libXScrnSaver-1.2.3-60f6993b79a87725/lib

This could be used, for example, to cross-compile xmonad, viz.

cabal new-install xmonad --with-ghc arm-linux-gnueabihf-ghc --with-ghc-pkg arm-linux-gnueabihf-ghc-pkg $(cpkg dump-cabal libX11 libXext libXrandr libXinerama libXScrnSaver --target=arm-linux-gnueabihf)

Dhall Prelude

There is a prelude available containing functions which simplify the process of writing package descriptions. As an example, we can install sed

let prelude = https://raw.githubusercontent.com/vmchale/cpkg/master/dhall/cpkg-prelude.dhall
in

let sed =
  λ(v : List Natural) →
    prelude.makeGnuExe { name = "sed", version = v }
in

sed [4,5]

Known Deficiencies

Security

This tool is insecure.

Performance

This tool is not performant.

Dependency Solver

Currently, there is no dependency solver. It should be relatively easy to add a version-based dependency solver to the code.

Garbage Collection

Currently, there is no garbage collector à la $ nix-collect-garbage. This will not be relatively easy to add, because it will require that the global package index be re-implemented (ideally using a proper database).

Contents

Lovingly provided by polyglot:

-------------------------------------------------------------------------------
 Language             Files       Lines         Code     Comments       Blanks
-------------------------------------------------------------------------------
 Bash                     3          43           35            3            5
 Cabal                    1         154          140            0           14
 Cabal Project            1          10            8            0            2
 Dhall                    3        4572         4111            1          460
 Haskell                 31        1728         1415           29          284
 Markdown                 3         487          407            0           80
 YAML                     4         156          141            0           15
-------------------------------------------------------------------------------
 Total                   46        7150         6257           33          860
-------------------------------------------------------------------------------

Changes

cpkg

0.2.0.0

  • Support more MIPS architectures

0.1.3.1

  • Don’t install build-tool dependencies globally

0.1.3.0

  • Add ability to patch libraries

0.1.2.1

  • Add --global flag

0.1.2.0

  • Export Dep

0.1.1.1

  • Stream using libarchive lazily

0.1.1.0

  • Export EnvVar
  • Better diagnostic output
  • Fix bug where cross dependencies’ bin/ directory was added to PATH for subsequent package builds
  • Allow use of libarchive for packages that cannot be handled with the tar library

0.1.0.0

Initial release

comments powered byDisqus