From 22ddf66b54396f865ae1c1df6a366640039c20c6 Mon Sep 17 00:00:00 2001 From: Michael Raskin <7c6f434c@mail.ru> Date: Tue, 29 Oct 2013 10:56:33 +0400 Subject: Adding a facility to generate Lisp module definitions from QuickLisp; no sane update facility yet; adding Esrap-PEG as a test --- .../update-walker-service-specific.sh | 5 ++ .../upstream-updater/update-walker.sh | 17 ++++- .../from-quicklisp/asdf-description.sh | 16 +++++ .../barebones-quicklisp-expression.sh | 78 ++++++++++++++++++++++ .../from-quicklisp/quicklisp-beta-env.sh | 16 +++++ .../from-quicklisp/quicklisp-dependencies.sh | 11 +++ .../lisp-modules/from-quicklisp/tmp.nix | 0 pkgs/development/lisp-modules/lisp-packages.nix | 54 +++++++++++++++ 8 files changed, 196 insertions(+), 1 deletion(-) create mode 100755 pkgs/development/lisp-modules/from-quicklisp/asdf-description.sh create mode 100755 pkgs/development/lisp-modules/from-quicklisp/barebones-quicklisp-expression.sh create mode 100755 pkgs/development/lisp-modules/from-quicklisp/quicklisp-beta-env.sh create mode 100755 pkgs/development/lisp-modules/from-quicklisp/quicklisp-dependencies.sh create mode 100644 pkgs/development/lisp-modules/from-quicklisp/tmp.nix (limited to 'pkgs') diff --git a/pkgs/build-support/upstream-updater/update-walker-service-specific.sh b/pkgs/build-support/upstream-updater/update-walker-service-specific.sh index 4f3a7110346e..c98880df1a9a 100644 --- a/pkgs/build-support/upstream-updater/update-walker-service-specific.sh +++ b/pkgs/build-support/upstream-updater/update-walker-service-specific.sh @@ -7,3 +7,8 @@ SF_redirect () { SF_version_dir () { version_link 'http://sourceforge.net/.+/[0-9.]+/$' } + +GH_latest () { + prefetch_command_rel ../fetchgit/nix-prefetch-git + rev "$(curl "$CURRENT_URL/commits" | grep /commit/ | head -n 1 | xargs basename )" +} diff --git a/pkgs/build-support/upstream-updater/update-walker.sh b/pkgs/build-support/upstream-updater/update-walker.sh index c4dc7713f504..f29add11bb31 100755 --- a/pkgs/build-support/upstream-updater/update-walker.sh +++ b/pkgs/build-support/upstream-updater/update-walker.sh @@ -3,6 +3,8 @@ own_dir="$(cd "$(dirname "$0")"; pwd)" CURRENT_URL= +CURRENT_REV= +PREFETCH_COMMAND= NEED_TO_CHOOSE_URL=1 url () { @@ -118,13 +120,25 @@ ensure_choice () { } } +rev () { + CURRENT_REV="$1" +} + +prefetch_command () { + PREFETCH_COMMAND="$1" +} + +prefetch_command_rel () { + PREFETCH_COMMAND="$(dirname "$0")/$1" +} + ensure_hash () { echo "Ensuring hash. CURRENT_HASH: $CURRENT_HASH" >&2 [ -z "$CURRENT_HASH" ] && hash } hash () { - CURRENT_HASH="$(nix-prefetch-url "$CURRENT_URL")" + CURRENT_HASH="$(${PREFETCH_COMMAND:-nix-prefetch-url} "$CURRENT_URL" $CURRENT_REV)" echo "CURRENT_HASH: $CURRENT_HASH" >&2 } @@ -172,6 +186,7 @@ do_write_expression () { echo "${1} name=\"\${baseName}-\${version}\";" echo "${1} hash=\"$CURRENT_HASH\";" echo "${1} url=\"$CURRENT_URL\";" + [ -n "$CURRENT_REV" ] && echo "${1} rev=\"$CURRENT_REV\";" echo "${1} sha256=\"$CURRENT_HASH\";" echo "$2" } diff --git a/pkgs/development/lisp-modules/from-quicklisp/asdf-description.sh b/pkgs/development/lisp-modules/from-quicklisp/asdf-description.sh new file mode 100755 index 000000000000..6c240d15c76e --- /dev/null +++ b/pkgs/development/lisp-modules/from-quicklisp/asdf-description.sh @@ -0,0 +1,16 @@ +#! /bin/sh + +[ -z "$NIX_QUICKLISP_DIR" ] && { + export NIX_QUICKLISP_DIR="$(mktemp -d --tmpdir nix-quicklisp.XXXXXX)" +} + +[ -f "$NIX_QUICKLISP_DIR/setup.lisp" ] || { + "$(dirname "$0")/quicklisp-beta-env.sh" "$NIX_QUICKLISP_DIR" &> /dev/null < /dev/null +} + +name="$1" + +sbcl --noinform --load "$NIX_QUICKLISP_DIR"/setup.lisp --eval "(ql:quickload :$name)" \ + --eval "(format t \"~a~%\" (or (asdf::system-description (asdf::find-system \"$name\")) \"\"))" \ + --eval '(quit)' --script | + tee /dev/stderr | tail -n 1 diff --git a/pkgs/development/lisp-modules/from-quicklisp/barebones-quicklisp-expression.sh b/pkgs/development/lisp-modules/from-quicklisp/barebones-quicklisp-expression.sh new file mode 100755 index 000000000000..61c00eb92ae8 --- /dev/null +++ b/pkgs/development/lisp-modules/from-quicklisp/barebones-quicklisp-expression.sh @@ -0,0 +1,78 @@ +#! /bin/sh + +name="$1" + +nix-instantiate "$(dirname "$0")"/../../../../ -A "lispPackages.$name" > /dev/null && exit +[ "$NIX_LISP_PACKAGES_DEFINED" != "${NIX_LISP_PACKAGES_DEFINED/$name/@@}" ] && exit + +NIX_LISP_PACKAGES_DEFINED="$NIX_LISP_PACKAGES_DEFINED $1 " + +[ -z "$NIX_QUICKLISP_DIR" ] && { + export NIX_QUICKLISP_DIR="$(mktemp -d --tmpdir nix-quicklisp.XXXXXX)" +} + +[ -f "$NIX_QUICKLISP_DIR/setup.lisp" ] || { + "$(dirname "$0")/quicklisp-beta-env.sh" "$NIX_QUICKLISP_DIR" &> /dev/null < /dev/null +} + +description="$("$(dirname "$0")/asdf-description.sh" "$name")" +[ -z "$description" ] && { + description="$(curl -L https://github.com/quicklisp/quicklisp-projects/raw/master/"$name"/description.txt)" + [ "$(echo "$description" | wc -l)" -gt 10 ] && description="" +} + +dependencies="$("$(dirname "$0")/quicklisp-dependencies.sh" "$name" | xargs)" +ql_src="$(curl -L https://github.com/quicklisp/quicklisp-projects/raw/master/"$name"/source.txt)" +ql_src_type="${ql_src%% *}" +url="${ql_src##* }" + +[ "$ql_src_type" = git ] && { + fetcher="pkgs.fetchgit" + [ "${url#git://github.com/}" != "$url" ] && { + url="${url/git:/https:}" + url="${url%.git}" + rev=$("$(dirname "$0")/../../../build-support/upstream-updater/urls-from-page.sh" "$url/commits" | grep /commit/ | head -n 1 | xargs basename) + hash=$("$(dirname "$0")/../../../build-support/fetchgit/nix-prefetch-git" "$url" "$rev") + version="git-$(date +%Y%m%d)"; + } + [ "${url#git://common-lisp.net/}" != "$url" ] && { + http_repo_url="$url" + http_repo_url="${http_repo_url/git:/http:}" + http_repo_url="${http_repo_url/\/projects\// /r/projects/}" + http_repo_head="$http_repo_url/refs/heads/master" + echo "$http_repo_head" >&2 + rev=$(curl -L "$http_repo_head"); + hash=$("$(dirname "$0")/../../../build-support/fetchgit/nix-prefetch-git" "$url" "$rev") + version="git-$(date +%Y%m%d)"; + } +} + +[ "$ql_src_type" = cvs ] && { + fetcher="pkgs.fetchcvs" + date="$(date -d yesterday +%Y-%m-%d)" + version="cvs-$date" + module="${module:-$name}" + hash=$(USE_DATE=1 "$(dirname "$0")/../../../build-support/fetchcvs/nix-prefetch-cvs" "$url" "$module" "$date") + cvsRoot="$url" + unset url +} + +cat << EOF + + $name = buildLispPackage rec { + baseName = "$name"; + version = "${version:-\${Set me //}"; + description = "$description"; + deps = [$dependencies]; + src = ${fetcher:-pkgs.fetchurl} { + ${url:+url = ''$url'';} + sha256 = "${hash:-0000000000000000000000000000000000000000000000000000000000000000}"; + ${rev:+rev = ''$rev'';} + ${date:+date = ''$date'';} + ${module:+module = ''$module'';} + ${cvsRoot:+cvsRoot = ''$cvsRoot'';} + }; + }; +EOF + +for i in $dependencies; do "$0" "$i"; done diff --git a/pkgs/development/lisp-modules/from-quicklisp/quicklisp-beta-env.sh b/pkgs/development/lisp-modules/from-quicklisp/quicklisp-beta-env.sh new file mode 100755 index 000000000000..32fbbe4bb2bc --- /dev/null +++ b/pkgs/development/lisp-modules/from-quicklisp/quicklisp-beta-env.sh @@ -0,0 +1,16 @@ +#! /bin/sh + +WORK_DIR=$(mktemp -d "/tmp/ql-venv-XXXXXX") +mkdir -p "${1:-.}" +TARGET="$(cd "${1:-.}"; pwd)" + +curl http://beta.quicklisp.org/quicklisp.lisp > "$WORK_DIR/ql.lisp" + +sbcl --noinform \ + --load "$WORK_DIR/ql.lisp" \ + --eval "(quicklisp-quickstart:install :path \"$TARGET/\")" \ + --eval "(cl-user::quit)" \ + --script + + +rm -rf "$WORK_DIR" diff --git a/pkgs/development/lisp-modules/from-quicklisp/quicklisp-dependencies.sh b/pkgs/development/lisp-modules/from-quicklisp/quicklisp-dependencies.sh new file mode 100755 index 000000000000..24efbdd3e16e --- /dev/null +++ b/pkgs/development/lisp-modules/from-quicklisp/quicklisp-dependencies.sh @@ -0,0 +1,11 @@ +#! /bin/sh + +[ -z "$NIX_QUICKLISP_DIR" ] && { + export NIX_QUICKLISP_DIR="$(mktemp -d --tmpdir nix-quicklisp.XXXXXX)" +} + +[ -f "$NIX_QUICKLISP_DIR/setup.lisp" ] || { + "$(dirname "$0")/quicklisp-beta-env.sh" "$NIX_QUICKLISP_DIR" &> /dev/null < /dev/null +} + +sbcl --noinform --eval "(with-output-to-string (*standard-output*) (load \"$NIX_QUICKLISP_DIR/setup.lisp\"))" --eval "(with-output-to-string (*standard-output*) (with-output-to-string (*error-output*) (with-output-to-string (*trace-output*) (ql:quickload :$1))))" --eval "(format t \"~{~a~%~}\" (mapcar 'ql::name (mapcar 'car (cdr (ql::dependency-tree \"$1\")))))" --eval '(quit)' --script diff --git a/pkgs/development/lisp-modules/from-quicklisp/tmp.nix b/pkgs/development/lisp-modules/from-quicklisp/tmp.nix new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/pkgs/development/lisp-modules/lisp-packages.nix b/pkgs/development/lisp-modules/lisp-packages.nix index 8eaaf151fa71..015d5fccdc35 100644 --- a/pkgs/development/lisp-modules/lisp-packages.nix +++ b/pkgs/development/lisp-modules/lisp-packages.nix @@ -45,5 +45,59 @@ let lispPackages = rec { }; stumpwm = callPackage ./stumpwm {}; + + alexandria = buildLispPackage rec { + baseName = "alexandria"; + version = "git-20131029"; + description = "Alexandria is a collection of portable public domain utilities."; + deps = []; + src = pkgs.fetchgit { + url = "git://common-lisp.net/projects/alexandria/alexandria.git"; + sha256 = "1d981a243f9d4d3c9fd86cc47698050507ff615b87b9a710449abdb4234e501b"; + rev = ''2b1eb4067fb34bc501e527de75d09166a8ba9ceb''; + }; + }; + + esrap-peg = buildLispPackage rec { + baseName = "esrap-peg"; + version = "git-20131029"; + description = "A wrapper around Esrap to allow generating Esrap grammars from PEG definitions"; + deps = [alexandria cl-unification esrap iterate]; + src = pkgs.fetchgit { + url = "https://github.com/fb08af68/esrap-peg"; + sha256 = "48e616a697aca95e90e55052fdc9a7f96bf29b3208b1b4012fcd3189c2eceeb1"; + rev = ''1f2f21e32e618f71ed664cdc5e7005f8b6b0f7c8''; + + + }; + }; + + cl-unification = buildLispPackage rec { + baseName = "cl-unification"; + version = "cvs-2013-10-28"; + description = ""; + deps = []; + src = pkgs.fetchcvs { + sha256 = "a574b7f9615232366e3e5e7ee400d60dbff23f6d0e1def5a3c77aafdfd786e6a"; + + date = ''2013-10-28''; + module = ''cl-unification''; + cvsRoot = '':pserver:anonymous:anonymous@common-lisp.net:/project/cl-unification/cvsroot''; + }; + }; + + esrap = buildLispPackage rec { + baseName = "esrap"; + version = "git-20131029"; + description = "A Packrat / Parsing Grammar / TDPL parser for Common Lisp."; + deps = [alexandria]; + src = pkgs.fetchgit { + url = "https://github.com/scymtym/esrap"; + sha256 = "c56616ac01be0f69e72902f9fd830a8af2c2fa9018b66747a5da3988ae38817f"; + rev = ''c71933b84e220f21e8a509ec26afe3e3871e2e26''; + + + }; + }; }; in lispPackages -- cgit 1.4.1