Merge pull request #4682 from the-kenny/chicken-eggs

Full support for CHICKEN eggs in Nix
This commit is contained in:
Michael Raskin 2014-10-28 15:49:26 +04:00
commit 83e59960b6
11 changed files with 609 additions and 2 deletions

View File

@ -0,0 +1,9 @@
source $stdenv/setup
header "exporting egg ${eggName} (version $version) into $out"
mkdir -p $out
chicken-install -r "${eggName}:${version}"
cp -r ${eggName}/* $out/
stopNest

View File

@ -0,0 +1,28 @@
# Fetches a chicken egg from henrietta using `chicken-install -r'
# See: http://wiki.call-cc.org/chicken-projects/egg-index-4.html
{ stdenv, chicken }:
{ name, version, md5 ? "", sha256 ? "" }:
stdenv.mkDerivation {
name = "chicken-${name}-export";
builder = ./builder.sh;
buildInputs = [ chicken ];
outputHashAlgo = if sha256 == "" then "md5" else "sha256";
outputHashMode = "recursive";
outputHash = if sha256 == "" then md5 else sha256;
inherit version;
eggName = name;
impureEnvVars = [
# We borrow these environment variables from the caller to allow
# easy proxy configuration. This is impure, but a fixed-output
# derivation like fetchurl is allowed to do so since its result is
# by definition pure.
"http_proxy" "https_proxy" "ftp_proxy" "all_proxy" "no_proxy"
];
}

View File

@ -0,0 +1,130 @@
From 752dff853186dc334c519a86fa92f087795fea02 Mon Sep 17 00:00:00 2001
From: Moritz Heidkamp <moritz.heidkamp@bevuta.com>
Date: Wed, 1 Oct 2014 22:41:30 +0200
Subject: [PATCH] Introduce CHICKEN_REPOSITORY_EXTRA
This environment variable works like CHICKEN_REPOSITORY but supports
multiple paths separated by `:'. Those paths are searched after
CHICKEN_REPOSITORY when loading extensions via `require-library' and
friends. It can be accessed and changed at runtime via the new procedure
`repository-extra-paths' which is analog to `repository-path'.
---
chicken-install.scm | 11 +++++++----
chicken.import.scm | 1 +
eval.scm | 37 +++++++++++++++++++++++++++++++------
3 files changed, 39 insertions(+), 10 deletions(-)
diff --git a/chicken-install.scm b/chicken-install.scm
index 2ef6ef4..b5c6bf8 100644
--- a/chicken-install.scm
+++ b/chicken-install.scm
@@ -109,10 +109,10 @@
(define *show-foreign-depends* #f)
(define *hacks* '())
- (define (repo-path)
+ (define (repo-paths)
(if (and *cross-chicken* (not *host-extension*))
- (make-pathname C_TARGET_LIB_HOME (sprintf "chicken/~a" C_BINARY_VERSION))
- (repository-path)))
+ (list (make-pathname C_TARGET_LIB_HOME (sprintf "chicken/~a" C_BINARY_VERSION)))
+ (cons (repository-path) (repository-extra-paths))))
(define (get-prefix #!optional runtime)
(cond ((and *cross-chicken*
@@ -757,7 +757,10 @@
"installed extension has no information about which egg it belongs to"
(pathname-file sf))
#f))))
- (glob (make-pathname (repo-path) "*" "setup-info")))
+ (append-map
+ (lambda (path)
+ (glob (make-pathname path "*" "setup-info")))
+ (repo-paths)))
equal?))
(define (list-available-extensions trans locn)
diff --git a/chicken.import.scm b/chicken.import.scm
index baa7316..2839b16 100644
--- a/chicken.import.scm
+++ b/chicken.import.scm
@@ -201,6 +201,7 @@
repl
repl-prompt
repository-path
+ repository-extra-paths
require
reset
reset-handler
diff --git a/eval.scm b/eval.scm
index bbcd86c..838588d 100644
--- a/eval.scm
+++ b/eval.scm
@@ -81,6 +81,7 @@
(define-constant source-file-extension ".scm")
(define-constant setup-file-extension "setup-info")
(define-constant repository-environment-variable "CHICKEN_REPOSITORY")
+(define-constant repository-extra-environment-variable "CHICKEN_REPOSITORY_EXTRA")
(define-constant prefix-environment-variable "CHICKEN_PREFIX")
; these are actually in unit extras, but that is used by default
@@ -1180,6 +1181,25 @@
(define repository-path ##sys#repository-path)
+(define ##sys#repository-extra-paths
+ (let* ((repaths (get-environment-variable repository-extra-environment-variable))
+ (repaths (if repaths
+ (let ((len (string-length repaths)))
+ (let loop ((i 0) (offset 0) (res '()))
+ (cond ((> i len)
+ (reverse res))
+ ((or (= i len) (eq? #\: (string-ref repaths i)))
+ (loop (+ i 1) (+ i 1) (cons (substring repaths offset i) res)))
+ (else
+ (loop (+ i 1) offset res)))))
+ '())))
+ (lambda (#!optional val)
+ (if val
+ (set! repaths val)
+ repaths))))
+
+(define repository-extra-paths ##sys#repository-extra-paths)
+
(define ##sys#setup-mode #f)
(define ##sys#find-extension
@@ -1197,6 +1217,7 @@
(let loop ((paths (##sys#append
(if ##sys#setup-mode '(".") '())
(if rp (list rp) '())
+ (##sys#repository-extra-paths)
(if inc? ##sys#include-pathnames '())
(if ##sys#setup-mode '() '("."))) ))
(and (pair? paths)
@@ -1256,12 +1277,16 @@
[string-append string-append]
[read read] )
(lambda (id loc)
- (and-let* ((rp (##sys#repository-path)))
- (let* ((p (##sys#canonicalize-extension-path id loc))
- (rpath (string-append rp "/" p ".")) )
- (cond ((file-exists? (string-append rpath setup-file-extension))
- => (cut with-input-from-file <> read) )
- (else #f) ) ) ) ) ))
+ (let loop ((rpaths (cons (##sys#repository-path) (##sys#repository-extra-paths))))
+ (and (pair? rpaths)
+ (let ((rp (car rpaths)))
+ (if (not rp)
+ (loop (cdr rpaths))
+ (let* ((p (##sys#canonicalize-extension-path id loc))
+ (rpath (string-append rp "/" p ".")) )
+ (cond ((file-exists? (string-append rpath setup-file-extension))
+ => (cut with-input-from-file <> read) )
+ (else (loop (cdr rpaths))) ) )) ))) ) ))
(define (extension-information ext)
(##sys#extension-information ext 'extension-information) )
--
2.1.0

View File

@ -1,4 +1,4 @@
{ stdenv, fetchurl }:
{ stdenv, fetchurl, makeWrapper, bootstrap-chicken ? null }:
let
version = "4.9.0.1";
@ -8,18 +8,57 @@ let
else if isBSD then "bsd"
else if isSunOS then "solaris"
else "linux"; # Should be a sane default
lib = stdenv.lib;
in
stdenv.mkDerivation {
name = "chicken-${version}";
binaryVersion = 7;
src = fetchurl {
url = "http://code.call-cc.org/releases/4.9.0/chicken-${version}.tar.gz";
sha256 = "0598mar1qswfd8hva9nqs88zjn02lzkqd8fzdd21dz1nki1prpq4";
};
setupHook = lib.ifEnable (bootstrap-chicken != null) ./setup-hook.sh;
buildFlags = "PLATFORM=${platform} PREFIX=$(out) VARDIR=$(out)/var/lib";
installFlags = "PLATFORM=${platform} PREFIX=$(out) VARDIR=$(out)/var/lib";
# We need a bootstrap-chicken to regenerate the c-files after
# applying a patch to add support for CHICKEN_REPOSITORY_EXTRA
patches = lib.ifEnable (bootstrap-chicken != null) [
./0001-Introduce-CHICKEN_REPOSITORY_EXTRA.patch
];
buildInputs = [
makeWrapper
] ++ (lib.ifEnable (bootstrap-chicken != null) [
bootstrap-chicken
]);
preBuild = lib.ifEnable (bootstrap-chicken != null) ''
# Backup the build* files - those are generated from hostname,
# git-tag, etc. and we don't need/want that
mkdir -p build-backup
mv buildid buildbranch buildtag.h build-backup
# Regenerate eval.c after the patch
make spotless $buildFlags
mv build-backup/* .
'';
postInstall = ''
for f in $out/bin/*
do
wrapProgram $f \
--prefix PATH : ${stdenv.gcc}/bin
done
'';
# TODO: Assert csi -R files -p '(pathname-file (repository-path))' == binaryVersion
meta = {
homepage = http://www.call-cc.org/;
license = "BSD";

View File

@ -0,0 +1,46 @@
{ stdenv, fetchegg, chicken, makeWrapper }:
{ name, src
, buildInputs ? []
, chickenInstallFlags ? []
, cscOptions ? []
, ...} @ args:
let
libPath = "${chicken}/var/lib/chicken/${toString chicken.binaryVersion}/";
overrides = import ./overrides.nix;
lib = stdenv.lib;
baseName = (builtins.parseDrvName name).name;
override = if builtins.hasAttr baseName overrides
then
builtins.getAttr baseName overrides
else
{};
in
stdenv.mkDerivation ({
name = "chicken-${name}";
propagatedBuildInputs = buildInputs ++ [ chicken ];
propagatedUserEnvPkgs = buildInputs ++ [ chicken ];
buildInputs = [ makeWrapper ];
CSC_OPTIONS = stdenv.lib.concatStringsSep " " cscOptions;
CHICKEN_REPOSITORY = libPath;
CHICKEN_INSTALL_PREFIX = "$out";
installPhase = ''
runHook preInstall
chicken-install -p $out ${stdenv.lib.concatStringsSep " " chickenInstallFlags}
for f in $out/bin/*
do
wrapProgram $f \
--set CHICKEN_REPOSITORY $CHICKEN_REPOSITORY \
--prefix CHICKEN_REPOSITORY_EXTRA : "$out/lib/chicken/${toString chicken.binaryVersion}/:$CHICKEN_REPOSITORY_EXTRA" \
--prefix CHICKEN_INCLUDE_PATH \; \"$CHICKEN_INCLUDE_PATH\;$out/share/\" \
--prefix PATH : "$out/bin:${chicken}/bin:$CHICKEN_REPOSITORY_EXTRA:$CHICKEN_REPOSITORY"
done
runHook postInstall
'';
} // (builtins.removeAttrs args ["name" "buildInputs"]) // override)

View File

@ -0,0 +1,10 @@
{
setup-helper = {
preBuild = ''
substituteInPlace setup-helper.setup \
--replace "(chicken-home)" \"$out/share/\"
cat setup-helper.setup
'';
};
}

View File

@ -0,0 +1,7 @@
addChickenRepositoryPath() {
addToSearchPathWithCustomDelimiter : CHICKEN_REPOSITORY_EXTRA "$1/lib/chicken/7/"
# addToSearchPathWithCustomDelimiter \; CHICKEN_INCLUDE_PATH "$1/share/"
export CHICKEN_INCLUDE_PATH="$1/share;$CHICKEN_INCLUDE_PATH"
}
envHooks=(${envHooks[@]} addChickenRepositoryPath)

View File

@ -0,0 +1,296 @@
{ pkgs, stdenv }:
rec {
inherit (pkgs) eggDerivation fetchegg;
base64 = eggDerivation {
name = "base64-3.3.1";
src = fetchegg {
name = "base64";
version = "3.3.1";
sha256 = "0wmldiwwg1jpcn07wb906nc53si5j7sa83wgyq643xzqcx4v4x1d";
};
buildInputs = [
];
};
blob-utils = eggDerivation {
name = "blob-utils-1.0.3";
src = fetchegg {
name = "blob-utils";
version = "1.0.3";
sha256 = "17vdn02fnxnjx5ixgqimln93lqvzyq4y9w02fw7xnbdcjzqm0xml";
};
buildInputs = [
setup-helper
string-utils
];
};
check-errors = eggDerivation {
name = "check-errors-1.13.0";
src = fetchegg {
name = "check-errors";
version = "1.13.0";
sha256 = "12a0sn82n98jybh72zb39fdddmr5k4785xglxb16750fhy8rmjwi";
};
buildInputs = [
setup-helper
];
};
defstruct = eggDerivation {
name = "defstruct-1.6";
src = fetchegg {
name = "defstruct";
version = "1.6";
sha256 = "0lsgl32nmb5hxqiii4r3292cx5vqh50kp6v062nfiyid9lhrj0li";
};
buildInputs = [
];
};
http-client = eggDerivation {
name = "http-client-0.7.1";
src = fetchegg {
name = "http-client";
version = "0.7.1";
sha256 = "1s03zgmb7kb99ld0f2ylqgicrab9qgza53fkgsqvg7bh5njmzhxr";
};
buildInputs = [
intarweb
uri-common
message-digest
md5
string-utils
sendfile
];
};
intarweb = eggDerivation {
name = "intarweb-1.3";
src = fetchegg {
name = "intarweb";
version = "1.3";
sha256 = "0izlby78c25py29bdcbc0vapb6h7xgchqrzi6i51d0rb3mnwy88h";
};
buildInputs = [
defstruct
uri-common
base64
];
};
lookup-table = eggDerivation {
name = "lookup-table-1.13.5";
src = fetchegg {
name = "lookup-table";
version = "1.13.5";
sha256 = "1nzly6rhynawlvzlyilk8z8cxz57cf9n5iv20glkhh28pz2izmrb";
};
buildInputs = [
setup-helper
check-errors
miscmacros
record-variants
synch
];
};
matchable = eggDerivation {
name = "matchable-3.3";
src = fetchegg {
name = "matchable";
version = "3.3";
sha256 = "07y3lpzgm4djiwi9y2adc796f9kwkmdr28fkfkw65syahdax8990";
};
buildInputs = [
];
};
md5 = eggDerivation {
name = "md5-3.1.0";
src = fetchegg {
name = "md5";
version = "3.1.0";
sha256 = "0bka43nx8x9b0b079qpvml2fl20km19ny0qjmhwzlh6rwmzazj2a";
};
buildInputs = [
message-digest
];
};
message-digest = eggDerivation {
name = "message-digest-3.1.0";
src = fetchegg {
name = "message-digest";
version = "3.1.0";
sha256 = "1w6bax19dwgih78vcimiws0rja7qsd8hmbm6qqg2hf9cw3vab21s";
};
buildInputs = [
setup-helper
miscmacros
check-errors
variable-item
blob-utils
string-utils
];
};
miscmacros = eggDerivation {
name = "miscmacros-2.96";
src = fetchegg {
name = "miscmacros";
version = "2.96";
sha256 = "1ajdgjrni10i2hmhcp4rawnxajjxry3kmq1krdmah4sf0kjrgajc";
};
buildInputs = [
];
};
record-variants = eggDerivation {
name = "record-variants-0.5.1";
src = fetchegg {
name = "record-variants";
version = "0.5.1";
sha256 = "15wgysxkm8m4hx9nhhw9akchzipdnqc7yj3qd3zn0z7sxg4sld1h";
};
buildInputs = [
];
};
sendfile = eggDerivation {
name = "sendfile-1.7.29";
src = fetchegg {
name = "sendfile";
version = "1.7.29";
sha256 = "1dc02cbkx5kixhbqjy26g6gs680vy7krc9qis1p1v4aa0b2lgj7k";
};
buildInputs = [
];
};
setup-helper = eggDerivation {
name = "setup-helper-1.5.4";
src = fetchegg {
name = "setup-helper";
version = "1.5.4";
sha256 = "1k644y0md2isdcvazqfm4nyc8rh3dby6b0j3r4na4w8ryspqp6gj";
};
buildInputs = [
];
};
string-utils = eggDerivation {
name = "string-utils-1.2.4";
src = fetchegg {
name = "string-utils";
version = "1.2.4";
sha256 = "07alvghg0dahilrm4jg44bndl0x69sv1zbna9l20cbdvi35i0jp1";
};
buildInputs = [
setup-helper
miscmacros
lookup-table
check-errors
];
};
synch = eggDerivation {
name = "synch-2.1.2";
src = fetchegg {
name = "synch";
version = "2.1.2";
sha256 = "1m9mnbq0m5jsxmd1a3rqpwpxj0l1b7vn1fknvxycc047pmlcyl00";
};
buildInputs = [
setup-helper
check-errors
];
};
uri-common = eggDerivation {
name = "uri-common-1.4";
src = fetchegg {
name = "uri-common";
version = "1.4";
sha256 = "01ds1gixcn4rz657x3hr4rhw2496hsjff42ninw0k39l8i1cbh7c";
};
buildInputs = [
uri-generic
defstruct
matchable
];
};
uri-generic = eggDerivation {
name = "uri-generic-2.41";
src = fetchegg {
name = "uri-generic";
version = "2.41";
sha256 = "1r5jbzjllbnmhm5n0m3fcx0g6dc2c2jzp1dcndkfmxz0cl99zxac";
};
buildInputs = [
matchable
defstruct
];
};
variable-item = eggDerivation {
name = "variable-item-1.3.1";
src = fetchegg {
name = "variable-item";
version = "1.3.1";
sha256 = "19b3mhb8kr892sz9yyzq79l0vv28dgilw9cf415kj6aq16yp4d5n";
};
buildInputs = [
setup-helper
check-errors
];
};
}

View File

@ -0,0 +1,5 @@
;; Eggs used by egg2nix
http-client
intarweb
matchable
uri-common

View File

@ -0,0 +1,27 @@
{ stdenv, eggDerivation, fetchurl, chickenEggs }:
# Note: This mostly reimplements the default.nix already contained in
# the tarball. Is there a nicer way than duplicating code?
let
version = "0.4";
in
eggDerivation {
src = fetchurl {
url = "https://github.com/the-kenny/egg2nix/archive/${version}.tar.gz";
sha256 = "1xn79fgqxg0i47asjah31zi56v60is1n8d0cy8w4gbj0i41z7pvm";
};
name = "egg2nix-${version}";
buildInputs = with chickenEggs; [
matchable http-client
];
meta = {
description = "Generate nix-expression from CHICKEN scheme eggs";
homepage = https://github.com/the-kenny/egg2nix;
license = stdenv.lib.licenses.bsd3;
platforms = stdenv.lib.platforms.unix;
maintainers = [ stdenv.lib.maintainers.the-kenny ];
};
}

View File

@ -2831,7 +2831,17 @@ let
bigloo = callPackage ../development/compilers/bigloo { };
chicken = callPackage ../development/compilers/chicken { };
fetchegg = callPackage ../build-support/fetchegg { };
eggDerivation = callPackage ../development/compilers/chicken/eggDerivation.nix { };
chicken = callPackage ../development/compilers/chicken {
bootstrap-chicken = chicken.override { bootstrap-chicken = null; };
};
egg2nix = callPackage ../development/tools/egg2nix {
chickenEggs = callPackage ../development/tools/egg2nix/chicken-eggs.nix { };
};
ccl = builderDefsPackage ../development/compilers/ccl {};