cpkg: Build tool for C

[ bsd3, c, dhall, library, package-management, packaging, program ] [ Propose Tags ]

A build tool and package manager configured using Dhall.


[Skip to Readme]

Modules

[Index] [Quick Jump]

Flags

Manual Flags

NameDescriptionDefault
development

Enable `-Werror`

Disabled

Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info

Downloads

Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 0.1.0.0, 0.1.1.0, 0.1.1.1, 0.1.2.1, 0.1.3.0, 0.1.3.1, 0.2.0.0, 0.2.0.1, 0.2.1.0, 0.2.2.0, 0.2.3.0, 0.2.3.1, 0.2.3.2, 0.2.3.3, 0.2.3.4, 0.2.3.5, 0.2.3.6, 0.2.3.7, 0.2.3.8, 0.2.3.9, 0.2.4.0, 0.2.4.1, 0.2.4.2, 0.2.4.3, 0.2.4.4, 0.2.4.5, 0.2.4.6, 0.2.5.0, 0.2.5.1, 0.2.5.2, 0.2.5.3, 0.2.5.4, 0.2.5.6, 0.2.5.7, 0.2.5.8
Change log CHANGELOG.md
Dependencies base (>=4.11 && <5), binary, bytestring, bzlib, composition-prelude, containers (>=0.6.0.0), cpkg, dhall (>=1.19.0 && <1.22.0), directory (>=1.3.1.0), filemanip, filepath, hashable, http-client, http-client-tls, lzma, megaparsec, microlens, mtl, network-uri, optparse-applicative, prettyprinter, process, recursion (>=2.0.0.0), tar, temporary, text, zip-archive, zlib [details]
License BSD-3-Clause
Copyright Copyright: (c) 2018-2019 Vanessa McHale
Author Vanessa McHale
Maintainer vanessa.mchale@iohk.io
Revised Revision 3 made by vmchale at 2020-07-09T02:43:55Z
Category Packaging, Package Management, Dhall, C
Source repo head: git clone https://github.com/vmchale/cpkg
Uploaded by vmchale at 2019-02-13T23:12:51Z
Distributions
Executables cpkg
Downloads 15175 total (80 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user [build log]
All reported builds failed as of 2019-02-13 [all 3 reports]

Readme for cpkg-0.1.0.0

[back to package description]

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                     5          49           43            3            3
 Cabal                    1         153          139            0           14
 Cabal Project            1           2            2            0            0
 Dhall                    3        4147         3725            0          422
 Haskell                 31        1687         1377           28          282
 Markdown                 6         469          401            0           68
 YAML                     4         156          141            0           15
-------------------------------------------------------------------------------
 Total                   51        6663         5828           31          804
-------------------------------------------------------------------------------