diff --git a/pkgs/build-support/fetchegg/builder.sh b/pkgs/build-support/fetchegg/builder.sh new file mode 100644 index 000000000000..204661063090 --- /dev/null +++ b/pkgs/build-support/fetchegg/builder.sh @@ -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 diff --git a/pkgs/build-support/fetchegg/default.nix b/pkgs/build-support/fetchegg/default.nix new file mode 100644 index 000000000000..223d2098c770 --- /dev/null +++ b/pkgs/build-support/fetchegg/default.nix @@ -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" + ]; +} + diff --git a/pkgs/development/compilers/chicken/0001-Introduce-CHICKEN_REPOSITORY_EXTRA.patch b/pkgs/development/compilers/chicken/0001-Introduce-CHICKEN_REPOSITORY_EXTRA.patch new file mode 100644 index 000000000000..0962c9cf46d3 --- /dev/null +++ b/pkgs/development/compilers/chicken/0001-Introduce-CHICKEN_REPOSITORY_EXTRA.patch @@ -0,0 +1,130 @@ +From 752dff853186dc334c519a86fa92f087795fea02 Mon Sep 17 00:00:00 2001 +From: Moritz Heidkamp +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 + diff --git a/pkgs/development/compilers/chicken/default.nix b/pkgs/development/compilers/chicken/default.nix index 8fd99973cbc1..0e210343a72f 100644 --- a/pkgs/development/compilers/chicken/default.nix +++ b/pkgs/development/compilers/chicken/default.nix @@ -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"; diff --git a/pkgs/development/compilers/chicken/eggDerivation.nix b/pkgs/development/compilers/chicken/eggDerivation.nix new file mode 100644 index 000000000000..97ce9d9be79b --- /dev/null +++ b/pkgs/development/compilers/chicken/eggDerivation.nix @@ -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) diff --git a/pkgs/development/compilers/chicken/overrides.nix b/pkgs/development/compilers/chicken/overrides.nix new file mode 100644 index 000000000000..9fdda9b6d9fe --- /dev/null +++ b/pkgs/development/compilers/chicken/overrides.nix @@ -0,0 +1,10 @@ +{ + setup-helper = { + preBuild = '' + substituteInPlace setup-helper.setup \ + --replace "(chicken-home)" \"$out/share/\" + + cat setup-helper.setup + ''; + }; +} diff --git a/pkgs/development/compilers/chicken/setup-hook.sh b/pkgs/development/compilers/chicken/setup-hook.sh new file mode 100644 index 000000000000..8d6b990a7e05 --- /dev/null +++ b/pkgs/development/compilers/chicken/setup-hook.sh @@ -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) diff --git a/pkgs/development/tools/egg2nix/chicken-eggs.nix b/pkgs/development/tools/egg2nix/chicken-eggs.nix new file mode 100644 index 000000000000..4ec9e0daa47a --- /dev/null +++ b/pkgs/development/tools/egg2nix/chicken-eggs.nix @@ -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 + ]; + }; +} + diff --git a/pkgs/development/tools/egg2nix/chicken-eggs.scm b/pkgs/development/tools/egg2nix/chicken-eggs.scm new file mode 100644 index 000000000000..d847ae9e29b9 --- /dev/null +++ b/pkgs/development/tools/egg2nix/chicken-eggs.scm @@ -0,0 +1,5 @@ +;; Eggs used by egg2nix +http-client +intarweb +matchable +uri-common diff --git a/pkgs/development/tools/egg2nix/default.nix b/pkgs/development/tools/egg2nix/default.nix new file mode 100644 index 000000000000..dd1c00116e4d --- /dev/null +++ b/pkgs/development/tools/egg2nix/default.nix @@ -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 ]; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 6e3c34766d79..df750af3301a 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -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 {};