From d4e18b05e0ab149265d3d09ae017d7337fc4176f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Wed, 17 Dec 2014 10:44:19 +0100 Subject: [PATCH] Keep only libstore, nix-daemon, and related stuff. --- .gitignore | 121 - AUTHORS | 8 - COPYING | 504 ---- INSTALL | 229 -- Makefile | 27 - Makefile.config.in | 34 - README | 10 - bootstrap.sh | 4 - build.nix | 169 -- config/config.guess | 1537 ---------- config/config.sub | 1786 ------------ config/install-sh | 527 ---- configure.ac | 339 --- corepkgs/buildenv.nix | 28 - corepkgs/buildenv.pl | 168 -- corepkgs/config.nix.in | 17 - corepkgs/derivation.nix | 27 - corepkgs/fetchurl.nix | 37 - corepkgs/imported-drv-to-derivation.nix | 21 - corepkgs/local.mk | 5 - corepkgs/nar.nix | 49 - corepkgs/unpack-channel.nix | 42 - dev-shell | 17 - doc/manual/bugs.xml | 39 - doc/manual/build-farm.xml | 113 - doc/manual/builtins.xml | 932 ------- doc/manual/conf-file.xml | 474 ---- doc/manual/env-common.xml | 347 --- doc/manual/figures/user-environments.png | Bin 85031 -> 0 bytes doc/manual/figures/user-environments.sxd | Bin 8412 -> 0 bytes doc/manual/glossary.xml | 179 -- doc/manual/hacking.xml | 41 - doc/manual/installation.xml | 474 ---- doc/manual/introduction.xml | 337 --- doc/manual/local.mk | 113 - doc/manual/manual.xml | 84 - doc/manual/nix-build.xml | 189 -- doc/manual/nix-channel.xml | 112 - doc/manual/nix-collect-garbage.xml | 66 - doc/manual/nix-copy-closure.xml | 188 -- doc/manual/nix-daemon.xml | 34 - doc/manual/nix-env.xml | 1299 --------- doc/manual/nix-hash.xml | 164 -- doc/manual/nix-install-package.xml | 198 -- doc/manual/nix-instantiate.xml | 253 -- doc/manual/nix-lang-ref.xml | 182 -- doc/manual/nix-prefetch-url.xml | 93 - doc/manual/nix-pull.xml | 50 - doc/manual/nix-push.xml | 398 --- doc/manual/nix-shell.xml | 200 -- doc/manual/nix-store.xml | 1346 --------- doc/manual/opt-common-syn.xml | 47 - doc/manual/opt-common.xml | 389 --- doc/manual/opt-inst-syn.xml | 22 - doc/manual/package-management.xml | 591 ---- doc/manual/quick-start.xml | 145 - doc/manual/quote-literals.xsl | 40 - doc/manual/release-notes.xml | 2483 ----------------- doc/manual/schemas.xml | 4 - doc/manual/style.css | 255 -- doc/manual/troubleshooting.xml | 92 - doc/manual/writing-nix-expressions.xml | 1901 ------------- doc/signing.txt | 24 - local.mk | 11 - misc/emacs/README | 10 - misc/emacs/local.mk | 1 - misc/emacs/nix-mode.el | 113 - misc/systemd/nix-daemon.service | 10 - misc/vim/syntax/nix.vim | 37 - mk/README.md | 6 - mk/clean.mk | 11 - mk/dist.mk | 17 - mk/functions.mk | 7 - mk/install.mk | 62 - mk/jars.mk | 29 - mk/lib.mk | 128 - mk/libraries.mk | 118 - mk/patterns.mk | 8 - mk/programs.mk | 64 - mk/templates.mk | 12 - mk/tests.mk | 26 - mk/tracing.mk | 17 - nix.spec.in | 204 -- {src => nix}/boost/assert.hpp | 0 {src => nix}/boost/format.hpp | 0 {src => nix}/boost/format/exceptions.hpp | 0 {src => nix}/boost/format/feed_args.hpp | 0 {src => nix}/boost/format/format_class.hpp | 0 {src => nix}/boost/format/format_fwd.hpp | 0 .../boost/format/format_implementation.cc | 0 {src => nix}/boost/format/free_funcs.cc | 0 {src => nix}/boost/format/group.hpp | 0 {src => nix}/boost/format/internals.hpp | 0 {src => nix}/boost/format/internals_fwd.hpp | 0 {src => nix}/boost/format/macros_default.hpp | 0 {src => nix}/boost/format/parsing.cc | 0 {src => nix}/boost/throw_exception.hpp | 0 {src => nix}/libstore/build.cc | 0 {src => nix}/libstore/derivations.cc | 0 {src => nix}/libstore/derivations.hh | 0 {src => nix}/libstore/gc.cc | 0 {src => nix}/libstore/globals.cc | 0 {src => nix}/libstore/globals.hh | 0 {src => nix}/libstore/local-store.cc | 0 {src => nix}/libstore/local-store.hh | 0 {src => nix}/libstore/misc.cc | 0 {src => nix}/libstore/misc.hh | 0 {src => nix}/libstore/optimise-store.cc | 0 {src => nix}/libstore/pathlocks.cc | 0 {src => nix}/libstore/pathlocks.hh | 0 {src => nix}/libstore/references.cc | 0 {src => nix}/libstore/references.hh | 0 {src => nix}/libstore/remote-store.cc | 0 {src => nix}/libstore/remote-store.hh | 0 {src => nix}/libstore/schema.sql | 0 {src => nix}/libstore/store-api.cc | 0 {src => nix}/libstore/store-api.hh | 0 {src => nix}/libstore/worker-protocol.hh | 0 {src => nix}/libutil/affinity.cc | 0 {src => nix}/libutil/affinity.hh | 0 {src => nix}/libutil/archive.cc | 0 {src => nix}/libutil/archive.hh | 0 {src => nix}/libutil/hash.cc | 0 {src => nix}/libutil/hash.hh | 0 {src => nix}/libutil/md32_common.h | 0 {src => nix}/libutil/md5.c | 0 {src => nix}/libutil/md5.h | 0 {src => nix}/libutil/serialise.cc | 0 {src => nix}/libutil/serialise.hh | 0 {src => nix}/libutil/sha1.c | 0 {src => nix}/libutil/sha1.h | 0 {src => nix}/libutil/sha256.c | 0 {src => nix}/libutil/sha256.h | 0 {src => nix}/libutil/types.hh | 0 {src => nix}/libutil/util.cc | 0 {src => nix}/libutil/util.hh | 0 {src => nix}/libutil/xml-writer.cc | 0 {src => nix}/libutil/xml-writer.hh | 0 {src => nix}/nix-daemon/nix-daemon.cc | 0 perl/MANIFEST | 7 - perl/lib/Nix/Config.pm.in | 42 - perl/lib/Nix/CopyClosure.pm | 57 - perl/lib/Nix/Crypto.pm | 42 - perl/lib/Nix/GeneratePatches.pm | 340 --- perl/lib/Nix/Manifest.pm | 467 ---- perl/lib/Nix/SSH.pm | 53 - perl/lib/Nix/Store.pm | 92 - perl/lib/Nix/Store.xs | 281 -- perl/lib/Nix/Utils.pm | 38 - perl/local.mk | 40 - release.nix | 291 -- scripts/build-remote.pl.in | 302 -- scripts/copy-from-other-stores.pl.in | 101 - scripts/copying-collector.pl | 111 - scripts/download-from-binary-cache.pl.in | 606 ---- scripts/download-using-manifests.pl.in | 377 --- scripts/find-runtime-roots.pl.in | 79 - scripts/install-nix-from-closure.sh | 117 - scripts/local.mk | 37 - scripts/nix-build.in | 287 -- scripts/nix-channel.in | 209 -- scripts/nix-collect-garbage.in | 65 - scripts/nix-copy-closure.in | 131 - scripts/nix-generate-patches.in | 52 - scripts/nix-http-export.cgi.in | 51 - scripts/nix-install-package.in | 138 - scripts/nix-prefetch-url.in | 130 - scripts/nix-profile.sh.in | 22 - scripts/nix-pull.in | 103 - scripts/nix-push.in | 293 -- scripts/nix-reduce-build.in | 171 -- scripts/remove-patches.pl | 16 - scripts/show-duplication.pl | 73 - src/boost/format/local.mk | 7 - src/bsdiff-4.3/bsdiff.1 | 63 - src/bsdiff-4.3/bsdiff.c | 405 --- src/bsdiff-4.3/bspatch.1 | 59 - src/bsdiff-4.3/bspatch.c | 224 -- src/bsdiff-4.3/compat-include/err.h | 12 - src/bsdiff-4.3/local.mk | 11 - src/download-via-ssh/download-via-ssh.cc | 155 - src/download-via-ssh/local.mk | 11 - src/libexpr/attr-path.cc | 97 - src/libexpr/attr-path.hh | 13 - src/libexpr/common-opts.cc | 59 - src/libexpr/common-opts.hh | 17 - src/libexpr/eval-inline.hh | 59 - src/libexpr/eval.cc | 1438 ---------- src/libexpr/eval.hh | 293 -- src/libexpr/get-drvs.cc | 305 -- src/libexpr/get-drvs.hh | 91 - src/libexpr/lexer.l | 193 -- src/libexpr/local.mk | 28 - src/libexpr/names.cc | 104 - src/libexpr/names.hh | 24 - src/libexpr/nix.sdf | 141 - src/libexpr/nixexpr.cc | 392 --- src/libexpr/nixexpr.hh | 332 --- src/libexpr/parser.y | 651 ----- src/libexpr/primops.cc | 1336 --------- src/libexpr/symbol-table.hh | 95 - src/libexpr/value-to-json.cc | 86 - src/libexpr/value-to-json.hh | 64 - src/libexpr/value-to-xml.cc | 163 -- src/libexpr/value-to-xml.hh | 14 - src/libexpr/value.hh | 162 -- src/libmain/local.mk | 11 - src/libmain/shared.cc | 300 -- src/libmain/shared.hh | 73 - src/libmain/stack.cc | 72 - src/libstore/local.mk | 28 - src/libutil/local.mk | 15 - src/nix-daemon/local.mk | 9 - src/nix-env/local.mk | 7 - src/nix-env/nix-env.cc | 1441 ---------- src/nix-env/profiles.cc | 147 - src/nix-env/profiles.hh | 55 - src/nix-env/user-env.cc | 149 - src/nix-env/user-env.hh | 13 - src/nix-hash/local.mk | 7 - src/nix-hash/nix-hash.cc | 64 - src/nix-instantiate/local.mk | 7 - src/nix-instantiate/nix-instantiate.cc | 185 -- src/nix-log2xml/local.mk | 8 - src/nix-log2xml/log2html.xsl | 83 - src/nix-log2xml/log2xml.cc | 200 -- src/nix-log2xml/logfile.css | 86 - src/nix-log2xml/mark-errors.xsl | 24 - src/nix-log2xml/treebits.js | 50 - src/nix-store/dotgraph.cc | 162 -- src/nix-store/dotgraph.hh | 9 - src/nix-store/local.mk | 9 - src/nix-store/nix-store.cc | 1007 ------- src/nix-store/serve-protocol.hh | 24 - src/nix-store/xmlgraph.cc | 71 - src/nix-store/xmlgraph.hh | 9 - tests/add.sh | 28 - tests/binary-cache.sh | 89 - tests/binary-patching.nix | 18 - tests/binary-patching.sh | 61 - tests/build-hook.hook.sh | 23 - tests/build-hook.nix | 22 - tests/build-hook.sh | 10 - tests/check-refs.nix | 58 - tests/check-refs.sh | 36 - tests/common.sh.in | 89 - tests/config.nix | 20 - tests/dependencies.builder0.sh | 16 - tests/dependencies.builder1.sh | 2 - tests/dependencies.builder2.sh | 2 - tests/dependencies.nix | 23 - tests/dependencies.sh | 52 - tests/dump-db.sh | 20 - tests/export-graph.nix | 29 - tests/export-graph.sh | 30 - tests/export.sh | 31 - tests/fallback.sh | 20 - tests/fetchurl.nix | 6 - tests/fetchurl.sh | 9 - tests/filter-source.nix | 12 - tests/filter-source.sh | 20 - tests/fixed.builder1.sh | 3 - tests/fixed.builder2.sh | 6 - tests/fixed.nix | 50 - tests/fixed.sh | 52 - tests/gc-concurrent.builder.sh | 13 - tests/gc-concurrent.nix | 27 - tests/gc-concurrent.sh | 58 - tests/gc-concurrent2.builder.sh | 7 - tests/gc-runtime.nix | 17 - tests/gc-runtime.sh | 38 - tests/gc.sh | 40 - tests/hash-check.nix | 29 - tests/hash.sh | 62 - tests/import-derivation.nix | 23 - tests/import-derivation.sh | 12 - tests/init.sh | 32 - tests/install-package.sh | 21 - tests/lang.sh | 70 - tests/lang/dir1/a.nix | 1 - tests/lang/dir2/a.nix | 1 - tests/lang/dir2/b.nix | 1 - tests/lang/dir3/a.nix | 1 - tests/lang/dir3/b.nix | 1 - tests/lang/dir3/c.nix | 1 - tests/lang/dir4/a.nix | 1 - tests/lang/dir4/c.nix | 1 - tests/lang/eval-fail-abort.nix | 1 - tests/lang/eval-fail-antiquoted-path.nix | 4 - tests/lang/eval-fail-assert.nix | 5 - tests/lang/eval-fail-bad-antiquote-1.nix | 1 - tests/lang/eval-fail-bad-antiquote-2.nix | 1 - tests/lang/eval-fail-bad-antiquote-3.nix | 1 - tests/lang/eval-fail-blackhole.nix | 5 - tests/lang/eval-fail-missing-arg.nix | 1 - tests/lang/eval-fail-remove.nix | 5 - tests/lang/eval-fail-scope-5.nix | 10 - tests/lang/eval-fail-substring.nix | 1 - tests/lang/eval-fail-to-path.nix | 1 - tests/lang/eval-fail-undeclared-arg.nix | 1 - tests/lang/eval-okay-arithmetic.exp | 1 - tests/lang/eval-okay-arithmetic.nix | 55 - tests/lang/eval-okay-attrnames.exp | 1 - tests/lang/eval-okay-attrnames.nix | 11 - tests/lang/eval-okay-attrs.exp | 1 - tests/lang/eval-okay-attrs.nix | 5 - tests/lang/eval-okay-attrs2.exp | 1 - tests/lang/eval-okay-attrs2.nix | 10 - tests/lang/eval-okay-attrs3.exp | 1 - tests/lang/eval-okay-attrs3.nix | 22 - tests/lang/eval-okay-attrs4.exp | 1 - tests/lang/eval-okay-attrs4.nix | 7 - tests/lang/eval-okay-attrs5.exp | 1 - tests/lang/eval-okay-attrs5.nix | 21 - tests/lang/eval-okay-autoargs.exp | 1 - tests/lang/eval-okay-autoargs.flags | 1 - tests/lang/eval-okay-autoargs.nix | 15 - tests/lang/eval-okay-builtins.exp | 1 - tests/lang/eval-okay-builtins.nix | 12 - tests/lang/eval-okay-closure.exp.xml | 343 --- tests/lang/eval-okay-closure.nix | 13 - tests/lang/eval-okay-concat.exp | 1 - tests/lang/eval-okay-concat.nix | 1 - tests/lang/eval-okay-context.exp | 1 - tests/lang/eval-okay-context.nix | 6 - tests/lang/eval-okay-curpos.exp | 1 - tests/lang/eval-okay-curpos.nix | 5 - tests/lang/eval-okay-delayed-with-inherit.exp | 1 - tests/lang/eval-okay-delayed-with-inherit.nix | 24 - tests/lang/eval-okay-delayed-with.exp | 1 - tests/lang/eval-okay-delayed-with.nix | 29 - tests/lang/eval-okay-dynamic-attrs-2.exp | 1 - tests/lang/eval-okay-dynamic-attrs-2.nix | 1 - tests/lang/eval-okay-dynamic-attrs-bare.exp | 1 - tests/lang/eval-okay-dynamic-attrs-bare.nix | 17 - tests/lang/eval-okay-dynamic-attrs.exp | 1 - tests/lang/eval-okay-dynamic-attrs.nix | 17 - tests/lang/eval-okay-elem.exp | 1 - tests/lang/eval-okay-elem.nix | 6 - tests/lang/eval-okay-empty-args.exp | 1 - tests/lang/eval-okay-empty-args.nix | 1 - tests/lang/eval-okay-eq-derivations.exp | 1 - tests/lang/eval-okay-eq-derivations.nix | 10 - tests/lang/eval-okay-eq.exp.disabled | 1 - tests/lang/eval-okay-eq.nix | 3 - tests/lang/eval-okay-filter.exp | 1 - tests/lang/eval-okay-filter.nix | 5 - tests/lang/eval-okay-flatten.exp | 1 - tests/lang/eval-okay-flatten.nix | 8 - tests/lang/eval-okay-functionargs.exp.xml | 15 - tests/lang/eval-okay-functionargs.nix | 80 - tests/lang/eval-okay-getattrpos.exp | 1 - tests/lang/eval-okay-getattrpos.nix | 6 - tests/lang/eval-okay-getenv.exp | 1 - tests/lang/eval-okay-getenv.nix | 1 - tests/lang/eval-okay-hash.exp | 1 - tests/lang/eval-okay-hash.nix | 7 - tests/lang/eval-okay-if.exp | 1 - tests/lang/eval-okay-if.nix | 1 - tests/lang/eval-okay-ind-string.exp | 1 - tests/lang/eval-okay-ind-string.nix | 120 - tests/lang/eval-okay-let.exp | 1 - tests/lang/eval-okay-let.nix | 5 - tests/lang/eval-okay-list.exp | 1 - tests/lang/eval-okay-list.nix | 7 - tests/lang/eval-okay-listtoattrs.exp | 1 - tests/lang/eval-okay-listtoattrs.nix | 11 - tests/lang/eval-okay-logic.exp | 1 - tests/lang/eval-okay-logic.nix | 1 - tests/lang/eval-okay-map.exp | 1 - tests/lang/eval-okay-map.nix | 3 - tests/lang/eval-okay-new-let.exp | 1 - tests/lang/eval-okay-new-let.nix | 14 - tests/lang/eval-okay-null-dynamic-attrs.exp | 1 - tests/lang/eval-okay-null-dynamic-attrs.nix | 1 - tests/lang/eval-okay-overrides.exp | 1 - tests/lang/eval-okay-overrides.nix | 9 - tests/lang/eval-okay-pathexists.exp | 1 - tests/lang/eval-okay-pathexists.nix | 5 - tests/lang/eval-okay-patterns.exp | 1 - tests/lang/eval-okay-patterns.nix | 16 - tests/lang/eval-okay-readfile.exp | 1 - tests/lang/eval-okay-readfile.nix | 1 - tests/lang/eval-okay-redefine-builtin.exp | 1 - tests/lang/eval-okay-redefine-builtin.nix | 3 - tests/lang/eval-okay-remove.exp | 1 - tests/lang/eval-okay-remove.nix | 5 - tests/lang/eval-okay-scope-1.exp | 1 - tests/lang/eval-okay-scope-1.nix | 6 - tests/lang/eval-okay-scope-2.exp | 1 - tests/lang/eval-okay-scope-2.nix | 6 - tests/lang/eval-okay-scope-3.exp | 1 - tests/lang/eval-okay-scope-3.nix | 6 - tests/lang/eval-okay-scope-4.exp | 1 - tests/lang/eval-okay-scope-4.nix | 10 - tests/lang/eval-okay-scope-6.exp | 1 - tests/lang/eval-okay-scope-6.nix | 7 - tests/lang/eval-okay-scope-7.exp | 1 - tests/lang/eval-okay-scope-7.nix | 6 - tests/lang/eval-okay-search-path.exp | 1 - tests/lang/eval-okay-search-path.flags | 1 - tests/lang/eval-okay-search-path.nix | 3 - tests/lang/eval-okay-string.exp | 1 - tests/lang/eval-okay-string.nix | 10 - .../lang/eval-okay-strings-as-attrs-names.exp | 1 - .../lang/eval-okay-strings-as-attrs-names.nix | 20 - tests/lang/eval-okay-substring.exp | 1 - tests/lang/eval-okay-substring.nix | 21 - tests/lang/eval-okay-tail-call-1.exp-disabled | 1 - tests/lang/eval-okay-tail-call-1.nix | 3 - tests/lang/eval-okay-tojson.exp | 1 - tests/lang/eval-okay-tojson.nix | 11 - tests/lang/eval-okay-toxml.exp | 1 - tests/lang/eval-okay-toxml.nix | 3 - tests/lang/eval-okay-toxml2.exp | 1 - tests/lang/eval-okay-toxml2.nix | 1 - tests/lang/eval-okay-tryeval.exp | 1 - tests/lang/eval-okay-tryeval.nix | 5 - tests/lang/eval-okay-types.exp | 1 - tests/lang/eval-okay-types.nix | 25 - tests/lang/eval-okay-versions.exp | 1 - tests/lang/eval-okay-versions.nix | 40 - tests/lang/eval-okay-with.exp | 1 - tests/lang/eval-okay-with.nix | 19 - tests/lang/eval-okay-xml.exp.xml | 49 - tests/lang/eval-okay-xml.nix | 19 - tests/lang/lib.nix | 61 - tests/lang/parse-fail-dup-attrs-1.nix | 4 - tests/lang/parse-fail-dup-attrs-2.nix | 13 - tests/lang/parse-fail-dup-attrs-3.nix | 13 - tests/lang/parse-fail-dup-attrs-4.nix | 4 - tests/lang/parse-fail-dup-attrs-6.nix | 4 - tests/lang/parse-fail-dup-attrs-7.nix | 9 - tests/lang/parse-fail-dup-formals.nix | 1 - tests/lang/parse-fail-patterns-1.nix | 1 - tests/lang/parse-fail-regression-20060610.nix | 11 - tests/lang/parse-fail-undef-var-2.nix | 7 - tests/lang/parse-fail-undef-var.nix | 1 - tests/lang/parse-okay-1.nix | 1 - tests/lang/parse-okay-crlf.nix | 17 - tests/lang/parse-okay-dup-attrs-5.nix | 4 - tests/lang/parse-okay-regression-20041027.nix | 11 - tests/lang/parse-okay-subversion.nix | 43 - tests/lang/parse-okay-url.nix | 7 - tests/local.mk | 21 - tests/logging.sh | 34 - tests/misc.sh | 16 - tests/multiple-outputs.nix | 68 - tests/multiple-outputs.sh | 63 - tests/negative-caching.nix | 21 - tests/negative-caching.sh | 22 - tests/nix-build.sh | 19 - tests/nix-channel.sh | 43 - tests/nix-copy-closure.nix | 54 - tests/nix-profile.sh | 10 - tests/nix-pull.sh | 33 - tests/nix-push.sh | 12 - tests/optimise-store.sh | 43 - tests/parallel.builder.sh | 29 - tests/parallel.nix | 19 - tests/parallel.sh | 56 - tests/referrers.sh | 36 - tests/remote-builds.nix | 98 - tests/remote-store.sh | 16 - tests/repair.sh | 65 - tests/secure-drv-outputs.nix | 23 - tests/secure-drv-outputs.sh | 37 - tests/simple.builder.sh | 11 - tests/simple.nix | 8 - tests/simple.sh | 25 - tests/substituter.sh | 37 - tests/substituter2.sh | 33 - tests/substitutes.sh | 22 - tests/substitutes2.sh | 21 - tests/timeout.builder.sh | 2 - tests/timeout.nix | 6 - tests/timeout.sh | 21 - tests/user-envs.builder.sh | 5 - tests/user-envs.nix | 29 - tests/user-envs.sh | 168 -- version | 1 - 481 files changed, 41204 deletions(-) delete mode 100644 .gitignore delete mode 100644 AUTHORS delete mode 100644 COPYING delete mode 100644 INSTALL delete mode 100644 Makefile delete mode 100644 Makefile.config.in delete mode 100644 README delete mode 100755 bootstrap.sh delete mode 100644 build.nix delete mode 100755 config/config.guess delete mode 100755 config/config.sub delete mode 100755 config/install-sh delete mode 100644 configure.ac delete mode 100644 corepkgs/buildenv.nix delete mode 100644 corepkgs/buildenv.pl delete mode 100644 corepkgs/config.nix.in delete mode 100644 corepkgs/derivation.nix delete mode 100644 corepkgs/fetchurl.nix delete mode 100644 corepkgs/imported-drv-to-derivation.nix delete mode 100644 corepkgs/local.mk delete mode 100644 corepkgs/nar.nix delete mode 100644 corepkgs/unpack-channel.nix delete mode 100755 dev-shell delete mode 100644 doc/manual/bugs.xml delete mode 100644 doc/manual/build-farm.xml delete mode 100644 doc/manual/builtins.xml delete mode 100644 doc/manual/conf-file.xml delete mode 100644 doc/manual/env-common.xml delete mode 100644 doc/manual/figures/user-environments.png delete mode 100644 doc/manual/figures/user-environments.sxd delete mode 100644 doc/manual/glossary.xml delete mode 100644 doc/manual/hacking.xml delete mode 100644 doc/manual/installation.xml delete mode 100644 doc/manual/introduction.xml delete mode 100644 doc/manual/local.mk delete mode 100644 doc/manual/manual.xml delete mode 100644 doc/manual/nix-build.xml delete mode 100644 doc/manual/nix-channel.xml delete mode 100644 doc/manual/nix-collect-garbage.xml delete mode 100644 doc/manual/nix-copy-closure.xml delete mode 100644 doc/manual/nix-daemon.xml delete mode 100644 doc/manual/nix-env.xml delete mode 100644 doc/manual/nix-hash.xml delete mode 100644 doc/manual/nix-install-package.xml delete mode 100644 doc/manual/nix-instantiate.xml delete mode 100644 doc/manual/nix-lang-ref.xml delete mode 100644 doc/manual/nix-prefetch-url.xml delete mode 100644 doc/manual/nix-pull.xml delete mode 100644 doc/manual/nix-push.xml delete mode 100644 doc/manual/nix-shell.xml delete mode 100644 doc/manual/nix-store.xml delete mode 100644 doc/manual/opt-common-syn.xml delete mode 100644 doc/manual/opt-common.xml delete mode 100644 doc/manual/opt-inst-syn.xml delete mode 100644 doc/manual/package-management.xml delete mode 100644 doc/manual/quick-start.xml delete mode 100644 doc/manual/quote-literals.xsl delete mode 100644 doc/manual/release-notes.xml delete mode 100644 doc/manual/schemas.xml delete mode 100644 doc/manual/style.css delete mode 100644 doc/manual/troubleshooting.xml delete mode 100644 doc/manual/writing-nix-expressions.xml delete mode 100644 doc/signing.txt delete mode 100644 local.mk delete mode 100644 misc/emacs/README delete mode 100644 misc/emacs/local.mk delete mode 100644 misc/emacs/nix-mode.el delete mode 100644 misc/systemd/nix-daemon.service delete mode 100644 misc/vim/syntax/nix.vim delete mode 100644 mk/README.md delete mode 100644 mk/clean.mk delete mode 100644 mk/dist.mk delete mode 100644 mk/functions.mk delete mode 100644 mk/install.mk delete mode 100644 mk/jars.mk delete mode 100644 mk/lib.mk delete mode 100644 mk/libraries.mk delete mode 100644 mk/patterns.mk delete mode 100644 mk/programs.mk delete mode 100644 mk/templates.mk delete mode 100644 mk/tests.mk delete mode 100644 mk/tracing.mk delete mode 100644 nix.spec.in rename {src => nix}/boost/assert.hpp (100%) rename {src => nix}/boost/format.hpp (100%) rename {src => nix}/boost/format/exceptions.hpp (100%) rename {src => nix}/boost/format/feed_args.hpp (100%) rename {src => nix}/boost/format/format_class.hpp (100%) rename {src => nix}/boost/format/format_fwd.hpp (100%) rename {src => nix}/boost/format/format_implementation.cc (100%) rename {src => nix}/boost/format/free_funcs.cc (100%) rename {src => nix}/boost/format/group.hpp (100%) rename {src => nix}/boost/format/internals.hpp (100%) rename {src => nix}/boost/format/internals_fwd.hpp (100%) rename {src => nix}/boost/format/macros_default.hpp (100%) rename {src => nix}/boost/format/parsing.cc (100%) rename {src => nix}/boost/throw_exception.hpp (100%) rename {src => nix}/libstore/build.cc (100%) rename {src => nix}/libstore/derivations.cc (100%) rename {src => nix}/libstore/derivations.hh (100%) rename {src => nix}/libstore/gc.cc (100%) rename {src => nix}/libstore/globals.cc (100%) rename {src => nix}/libstore/globals.hh (100%) rename {src => nix}/libstore/local-store.cc (100%) rename {src => nix}/libstore/local-store.hh (100%) rename {src => nix}/libstore/misc.cc (100%) rename {src => nix}/libstore/misc.hh (100%) rename {src => nix}/libstore/optimise-store.cc (100%) rename {src => nix}/libstore/pathlocks.cc (100%) rename {src => nix}/libstore/pathlocks.hh (100%) rename {src => nix}/libstore/references.cc (100%) rename {src => nix}/libstore/references.hh (100%) rename {src => nix}/libstore/remote-store.cc (100%) rename {src => nix}/libstore/remote-store.hh (100%) rename {src => nix}/libstore/schema.sql (100%) rename {src => nix}/libstore/store-api.cc (100%) rename {src => nix}/libstore/store-api.hh (100%) rename {src => nix}/libstore/worker-protocol.hh (100%) rename {src => nix}/libutil/affinity.cc (100%) rename {src => nix}/libutil/affinity.hh (100%) rename {src => nix}/libutil/archive.cc (100%) rename {src => nix}/libutil/archive.hh (100%) rename {src => nix}/libutil/hash.cc (100%) rename {src => nix}/libutil/hash.hh (100%) rename {src => nix}/libutil/md32_common.h (100%) rename {src => nix}/libutil/md5.c (100%) rename {src => nix}/libutil/md5.h (100%) rename {src => nix}/libutil/serialise.cc (100%) rename {src => nix}/libutil/serialise.hh (100%) rename {src => nix}/libutil/sha1.c (100%) rename {src => nix}/libutil/sha1.h (100%) rename {src => nix}/libutil/sha256.c (100%) rename {src => nix}/libutil/sha256.h (100%) rename {src => nix}/libutil/types.hh (100%) rename {src => nix}/libutil/util.cc (100%) rename {src => nix}/libutil/util.hh (100%) rename {src => nix}/libutil/xml-writer.cc (100%) rename {src => nix}/libutil/xml-writer.hh (100%) rename {src => nix}/nix-daemon/nix-daemon.cc (100%) delete mode 100644 perl/MANIFEST delete mode 100644 perl/lib/Nix/Config.pm.in delete mode 100644 perl/lib/Nix/CopyClosure.pm delete mode 100644 perl/lib/Nix/Crypto.pm delete mode 100644 perl/lib/Nix/GeneratePatches.pm delete mode 100644 perl/lib/Nix/Manifest.pm delete mode 100644 perl/lib/Nix/SSH.pm delete mode 100644 perl/lib/Nix/Store.pm delete mode 100644 perl/lib/Nix/Store.xs delete mode 100644 perl/lib/Nix/Utils.pm delete mode 100644 perl/local.mk delete mode 100644 release.nix delete mode 100755 scripts/build-remote.pl.in delete mode 100755 scripts/copy-from-other-stores.pl.in delete mode 100755 scripts/copying-collector.pl delete mode 100644 scripts/download-from-binary-cache.pl.in delete mode 100755 scripts/download-using-manifests.pl.in delete mode 100755 scripts/find-runtime-roots.pl.in delete mode 100644 scripts/install-nix-from-closure.sh delete mode 100644 scripts/local.mk delete mode 100755 scripts/nix-build.in delete mode 100755 scripts/nix-channel.in delete mode 100755 scripts/nix-collect-garbage.in delete mode 100755 scripts/nix-copy-closure.in delete mode 100755 scripts/nix-generate-patches.in delete mode 100755 scripts/nix-http-export.cgi.in delete mode 100755 scripts/nix-install-package.in delete mode 100755 scripts/nix-prefetch-url.in delete mode 100644 scripts/nix-profile.sh.in delete mode 100755 scripts/nix-pull.in delete mode 100755 scripts/nix-push.in delete mode 100755 scripts/nix-reduce-build.in delete mode 100755 scripts/remove-patches.pl delete mode 100755 scripts/show-duplication.pl delete mode 100644 src/boost/format/local.mk delete mode 100644 src/bsdiff-4.3/bsdiff.1 delete mode 100644 src/bsdiff-4.3/bsdiff.c delete mode 100644 src/bsdiff-4.3/bspatch.1 delete mode 100644 src/bsdiff-4.3/bspatch.c delete mode 100644 src/bsdiff-4.3/compat-include/err.h delete mode 100644 src/bsdiff-4.3/local.mk delete mode 100644 src/download-via-ssh/download-via-ssh.cc delete mode 100644 src/download-via-ssh/local.mk delete mode 100644 src/libexpr/attr-path.cc delete mode 100644 src/libexpr/attr-path.hh delete mode 100644 src/libexpr/common-opts.cc delete mode 100644 src/libexpr/common-opts.hh delete mode 100644 src/libexpr/eval-inline.hh delete mode 100644 src/libexpr/eval.cc delete mode 100644 src/libexpr/eval.hh delete mode 100644 src/libexpr/get-drvs.cc delete mode 100644 src/libexpr/get-drvs.hh delete mode 100644 src/libexpr/lexer.l delete mode 100644 src/libexpr/local.mk delete mode 100644 src/libexpr/names.cc delete mode 100644 src/libexpr/names.hh delete mode 100644 src/libexpr/nix.sdf delete mode 100644 src/libexpr/nixexpr.cc delete mode 100644 src/libexpr/nixexpr.hh delete mode 100644 src/libexpr/parser.y delete mode 100644 src/libexpr/primops.cc delete mode 100644 src/libexpr/symbol-table.hh delete mode 100644 src/libexpr/value-to-json.cc delete mode 100644 src/libexpr/value-to-json.hh delete mode 100644 src/libexpr/value-to-xml.cc delete mode 100644 src/libexpr/value-to-xml.hh delete mode 100644 src/libexpr/value.hh delete mode 100644 src/libmain/local.mk delete mode 100644 src/libmain/shared.cc delete mode 100644 src/libmain/shared.hh delete mode 100644 src/libmain/stack.cc delete mode 100644 src/libstore/local.mk delete mode 100644 src/libutil/local.mk delete mode 100644 src/nix-daemon/local.mk delete mode 100644 src/nix-env/local.mk delete mode 100644 src/nix-env/nix-env.cc delete mode 100644 src/nix-env/profiles.cc delete mode 100644 src/nix-env/profiles.hh delete mode 100644 src/nix-env/user-env.cc delete mode 100644 src/nix-env/user-env.hh delete mode 100644 src/nix-hash/local.mk delete mode 100644 src/nix-hash/nix-hash.cc delete mode 100644 src/nix-instantiate/local.mk delete mode 100644 src/nix-instantiate/nix-instantiate.cc delete mode 100644 src/nix-log2xml/local.mk delete mode 100644 src/nix-log2xml/log2html.xsl delete mode 100644 src/nix-log2xml/log2xml.cc delete mode 100644 src/nix-log2xml/logfile.css delete mode 100644 src/nix-log2xml/mark-errors.xsl delete mode 100644 src/nix-log2xml/treebits.js delete mode 100644 src/nix-store/dotgraph.cc delete mode 100644 src/nix-store/dotgraph.hh delete mode 100644 src/nix-store/local.mk delete mode 100644 src/nix-store/nix-store.cc delete mode 100644 src/nix-store/serve-protocol.hh delete mode 100644 src/nix-store/xmlgraph.cc delete mode 100644 src/nix-store/xmlgraph.hh delete mode 100644 tests/add.sh delete mode 100644 tests/binary-cache.sh delete mode 100644 tests/binary-patching.nix delete mode 100644 tests/binary-patching.sh delete mode 100755 tests/build-hook.hook.sh delete mode 100644 tests/build-hook.nix delete mode 100644 tests/build-hook.sh delete mode 100644 tests/check-refs.nix delete mode 100644 tests/check-refs.sh delete mode 100644 tests/common.sh.in delete mode 100644 tests/config.nix delete mode 100644 tests/dependencies.builder0.sh delete mode 100644 tests/dependencies.builder1.sh delete mode 100644 tests/dependencies.builder2.sh delete mode 100644 tests/dependencies.nix delete mode 100644 tests/dependencies.sh delete mode 100644 tests/dump-db.sh delete mode 100644 tests/export-graph.nix delete mode 100644 tests/export-graph.sh delete mode 100644 tests/export.sh delete mode 100644 tests/fallback.sh delete mode 100644 tests/fetchurl.nix delete mode 100644 tests/fetchurl.sh delete mode 100644 tests/filter-source.nix delete mode 100644 tests/filter-source.sh delete mode 100644 tests/fixed.builder1.sh delete mode 100644 tests/fixed.builder2.sh delete mode 100644 tests/fixed.nix delete mode 100644 tests/fixed.sh delete mode 100644 tests/gc-concurrent.builder.sh delete mode 100644 tests/gc-concurrent.nix delete mode 100644 tests/gc-concurrent.sh delete mode 100644 tests/gc-concurrent2.builder.sh delete mode 100644 tests/gc-runtime.nix delete mode 100644 tests/gc-runtime.sh delete mode 100644 tests/gc.sh delete mode 100644 tests/hash-check.nix delete mode 100644 tests/hash.sh delete mode 100644 tests/import-derivation.nix delete mode 100644 tests/import-derivation.sh delete mode 100644 tests/init.sh delete mode 100644 tests/install-package.sh delete mode 100644 tests/lang.sh delete mode 100644 tests/lang/dir1/a.nix delete mode 100644 tests/lang/dir2/a.nix delete mode 100644 tests/lang/dir2/b.nix delete mode 100644 tests/lang/dir3/a.nix delete mode 100644 tests/lang/dir3/b.nix delete mode 100644 tests/lang/dir3/c.nix delete mode 100644 tests/lang/dir4/a.nix delete mode 100644 tests/lang/dir4/c.nix delete mode 100644 tests/lang/eval-fail-abort.nix delete mode 100644 tests/lang/eval-fail-antiquoted-path.nix delete mode 100644 tests/lang/eval-fail-assert.nix delete mode 100644 tests/lang/eval-fail-bad-antiquote-1.nix delete mode 100644 tests/lang/eval-fail-bad-antiquote-2.nix delete mode 100644 tests/lang/eval-fail-bad-antiquote-3.nix delete mode 100644 tests/lang/eval-fail-blackhole.nix delete mode 100644 tests/lang/eval-fail-missing-arg.nix delete mode 100644 tests/lang/eval-fail-remove.nix delete mode 100644 tests/lang/eval-fail-scope-5.nix delete mode 100644 tests/lang/eval-fail-substring.nix delete mode 100644 tests/lang/eval-fail-to-path.nix delete mode 100644 tests/lang/eval-fail-undeclared-arg.nix delete mode 100644 tests/lang/eval-okay-arithmetic.exp delete mode 100644 tests/lang/eval-okay-arithmetic.nix delete mode 100644 tests/lang/eval-okay-attrnames.exp delete mode 100644 tests/lang/eval-okay-attrnames.nix delete mode 100644 tests/lang/eval-okay-attrs.exp delete mode 100644 tests/lang/eval-okay-attrs.nix delete mode 100644 tests/lang/eval-okay-attrs2.exp delete mode 100644 tests/lang/eval-okay-attrs2.nix delete mode 100644 tests/lang/eval-okay-attrs3.exp delete mode 100644 tests/lang/eval-okay-attrs3.nix delete mode 100644 tests/lang/eval-okay-attrs4.exp delete mode 100644 tests/lang/eval-okay-attrs4.nix delete mode 100644 tests/lang/eval-okay-attrs5.exp delete mode 100644 tests/lang/eval-okay-attrs5.nix delete mode 100644 tests/lang/eval-okay-autoargs.exp delete mode 100644 tests/lang/eval-okay-autoargs.flags delete mode 100644 tests/lang/eval-okay-autoargs.nix delete mode 100644 tests/lang/eval-okay-builtins.exp delete mode 100644 tests/lang/eval-okay-builtins.nix delete mode 100644 tests/lang/eval-okay-closure.exp.xml delete mode 100644 tests/lang/eval-okay-closure.nix delete mode 100644 tests/lang/eval-okay-concat.exp delete mode 100644 tests/lang/eval-okay-concat.nix delete mode 100644 tests/lang/eval-okay-context.exp delete mode 100644 tests/lang/eval-okay-context.nix delete mode 100644 tests/lang/eval-okay-curpos.exp delete mode 100644 tests/lang/eval-okay-curpos.nix delete mode 100644 tests/lang/eval-okay-delayed-with-inherit.exp delete mode 100644 tests/lang/eval-okay-delayed-with-inherit.nix delete mode 100644 tests/lang/eval-okay-delayed-with.exp delete mode 100644 tests/lang/eval-okay-delayed-with.nix delete mode 100644 tests/lang/eval-okay-dynamic-attrs-2.exp delete mode 100644 tests/lang/eval-okay-dynamic-attrs-2.nix delete mode 100644 tests/lang/eval-okay-dynamic-attrs-bare.exp delete mode 100644 tests/lang/eval-okay-dynamic-attrs-bare.nix delete mode 100644 tests/lang/eval-okay-dynamic-attrs.exp delete mode 100644 tests/lang/eval-okay-dynamic-attrs.nix delete mode 100644 tests/lang/eval-okay-elem.exp delete mode 100644 tests/lang/eval-okay-elem.nix delete mode 100644 tests/lang/eval-okay-empty-args.exp delete mode 100644 tests/lang/eval-okay-empty-args.nix delete mode 100644 tests/lang/eval-okay-eq-derivations.exp delete mode 100644 tests/lang/eval-okay-eq-derivations.nix delete mode 100644 tests/lang/eval-okay-eq.exp.disabled delete mode 100644 tests/lang/eval-okay-eq.nix delete mode 100644 tests/lang/eval-okay-filter.exp delete mode 100644 tests/lang/eval-okay-filter.nix delete mode 100644 tests/lang/eval-okay-flatten.exp delete mode 100644 tests/lang/eval-okay-flatten.nix delete mode 100644 tests/lang/eval-okay-functionargs.exp.xml delete mode 100644 tests/lang/eval-okay-functionargs.nix delete mode 100644 tests/lang/eval-okay-getattrpos.exp delete mode 100644 tests/lang/eval-okay-getattrpos.nix delete mode 100644 tests/lang/eval-okay-getenv.exp delete mode 100644 tests/lang/eval-okay-getenv.nix delete mode 100644 tests/lang/eval-okay-hash.exp delete mode 100644 tests/lang/eval-okay-hash.nix delete mode 100644 tests/lang/eval-okay-if.exp delete mode 100644 tests/lang/eval-okay-if.nix delete mode 100644 tests/lang/eval-okay-ind-string.exp delete mode 100644 tests/lang/eval-okay-ind-string.nix delete mode 100644 tests/lang/eval-okay-let.exp delete mode 100644 tests/lang/eval-okay-let.nix delete mode 100644 tests/lang/eval-okay-list.exp delete mode 100644 tests/lang/eval-okay-list.nix delete mode 100644 tests/lang/eval-okay-listtoattrs.exp delete mode 100644 tests/lang/eval-okay-listtoattrs.nix delete mode 100644 tests/lang/eval-okay-logic.exp delete mode 100644 tests/lang/eval-okay-logic.nix delete mode 100644 tests/lang/eval-okay-map.exp delete mode 100644 tests/lang/eval-okay-map.nix delete mode 100644 tests/lang/eval-okay-new-let.exp delete mode 100644 tests/lang/eval-okay-new-let.nix delete mode 100644 tests/lang/eval-okay-null-dynamic-attrs.exp delete mode 100644 tests/lang/eval-okay-null-dynamic-attrs.nix delete mode 100644 tests/lang/eval-okay-overrides.exp delete mode 100644 tests/lang/eval-okay-overrides.nix delete mode 100644 tests/lang/eval-okay-pathexists.exp delete mode 100644 tests/lang/eval-okay-pathexists.nix delete mode 100644 tests/lang/eval-okay-patterns.exp delete mode 100644 tests/lang/eval-okay-patterns.nix delete mode 100644 tests/lang/eval-okay-readfile.exp delete mode 100644 tests/lang/eval-okay-readfile.nix delete mode 100644 tests/lang/eval-okay-redefine-builtin.exp delete mode 100644 tests/lang/eval-okay-redefine-builtin.nix delete mode 100644 tests/lang/eval-okay-remove.exp delete mode 100644 tests/lang/eval-okay-remove.nix delete mode 100644 tests/lang/eval-okay-scope-1.exp delete mode 100644 tests/lang/eval-okay-scope-1.nix delete mode 100644 tests/lang/eval-okay-scope-2.exp delete mode 100644 tests/lang/eval-okay-scope-2.nix delete mode 100644 tests/lang/eval-okay-scope-3.exp delete mode 100644 tests/lang/eval-okay-scope-3.nix delete mode 100644 tests/lang/eval-okay-scope-4.exp delete mode 100644 tests/lang/eval-okay-scope-4.nix delete mode 100644 tests/lang/eval-okay-scope-6.exp delete mode 100644 tests/lang/eval-okay-scope-6.nix delete mode 100644 tests/lang/eval-okay-scope-7.exp delete mode 100644 tests/lang/eval-okay-scope-7.nix delete mode 100644 tests/lang/eval-okay-search-path.exp delete mode 100644 tests/lang/eval-okay-search-path.flags delete mode 100644 tests/lang/eval-okay-search-path.nix delete mode 100644 tests/lang/eval-okay-string.exp delete mode 100644 tests/lang/eval-okay-string.nix delete mode 100644 tests/lang/eval-okay-strings-as-attrs-names.exp delete mode 100644 tests/lang/eval-okay-strings-as-attrs-names.nix delete mode 100644 tests/lang/eval-okay-substring.exp delete mode 100644 tests/lang/eval-okay-substring.nix delete mode 100644 tests/lang/eval-okay-tail-call-1.exp-disabled delete mode 100644 tests/lang/eval-okay-tail-call-1.nix delete mode 100644 tests/lang/eval-okay-tojson.exp delete mode 100644 tests/lang/eval-okay-tojson.nix delete mode 100644 tests/lang/eval-okay-toxml.exp delete mode 100644 tests/lang/eval-okay-toxml.nix delete mode 100644 tests/lang/eval-okay-toxml2.exp delete mode 100644 tests/lang/eval-okay-toxml2.nix delete mode 100644 tests/lang/eval-okay-tryeval.exp delete mode 100644 tests/lang/eval-okay-tryeval.nix delete mode 100644 tests/lang/eval-okay-types.exp delete mode 100644 tests/lang/eval-okay-types.nix delete mode 100644 tests/lang/eval-okay-versions.exp delete mode 100644 tests/lang/eval-okay-versions.nix delete mode 100644 tests/lang/eval-okay-with.exp delete mode 100644 tests/lang/eval-okay-with.nix delete mode 100644 tests/lang/eval-okay-xml.exp.xml delete mode 100644 tests/lang/eval-okay-xml.nix delete mode 100644 tests/lang/lib.nix delete mode 100644 tests/lang/parse-fail-dup-attrs-1.nix delete mode 100644 tests/lang/parse-fail-dup-attrs-2.nix delete mode 100644 tests/lang/parse-fail-dup-attrs-3.nix delete mode 100644 tests/lang/parse-fail-dup-attrs-4.nix delete mode 100644 tests/lang/parse-fail-dup-attrs-6.nix delete mode 100644 tests/lang/parse-fail-dup-attrs-7.nix delete mode 100644 tests/lang/parse-fail-dup-formals.nix delete mode 100644 tests/lang/parse-fail-patterns-1.nix delete mode 100644 tests/lang/parse-fail-regression-20060610.nix delete mode 100644 tests/lang/parse-fail-undef-var-2.nix delete mode 100644 tests/lang/parse-fail-undef-var.nix delete mode 100644 tests/lang/parse-okay-1.nix delete mode 100644 tests/lang/parse-okay-crlf.nix delete mode 100644 tests/lang/parse-okay-dup-attrs-5.nix delete mode 100644 tests/lang/parse-okay-regression-20041027.nix delete mode 100644 tests/lang/parse-okay-subversion.nix delete mode 100644 tests/lang/parse-okay-url.nix delete mode 100644 tests/local.mk delete mode 100644 tests/logging.sh delete mode 100644 tests/misc.sh delete mode 100644 tests/multiple-outputs.nix delete mode 100644 tests/multiple-outputs.sh delete mode 100644 tests/negative-caching.nix delete mode 100644 tests/negative-caching.sh delete mode 100644 tests/nix-build.sh delete mode 100644 tests/nix-channel.sh delete mode 100644 tests/nix-copy-closure.nix delete mode 100644 tests/nix-profile.sh delete mode 100644 tests/nix-pull.sh delete mode 100644 tests/nix-push.sh delete mode 100644 tests/optimise-store.sh delete mode 100644 tests/parallel.builder.sh delete mode 100644 tests/parallel.nix delete mode 100644 tests/parallel.sh delete mode 100644 tests/referrers.sh delete mode 100644 tests/remote-builds.nix delete mode 100644 tests/remote-store.sh delete mode 100644 tests/repair.sh delete mode 100644 tests/secure-drv-outputs.nix delete mode 100644 tests/secure-drv-outputs.sh delete mode 100644 tests/simple.builder.sh delete mode 100644 tests/simple.nix delete mode 100644 tests/simple.sh delete mode 100755 tests/substituter.sh delete mode 100755 tests/substituter2.sh delete mode 100644 tests/substitutes.sh delete mode 100644 tests/substitutes2.sh delete mode 100644 tests/timeout.builder.sh delete mode 100644 tests/timeout.nix delete mode 100644 tests/timeout.sh delete mode 100644 tests/user-envs.builder.sh delete mode 100644 tests/user-envs.nix delete mode 100644 tests/user-envs.sh delete mode 100644 version diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 76fc815eba..0000000000 --- a/.gitignore +++ /dev/null @@ -1,121 +0,0 @@ -Makefile.config - -# / -/aclocal.m4 -/autom4te.cache -/config.* -/configure -/nix.spec -/stamp-h1 -/svn-revision -/NEWS -/libtool - -/corepkgs/config.nix - -# /corepkgs/buildenv/ -/corepkgs/buildenv/builder.pl - -# /corepkgs/channels/ -/corepkgs/channels/unpack.sh - -# /corepkgs/nar/ -/corepkgs/nar/nar.sh -/corepkgs/nar/unnar.sh - -# /doc/manual/ -/doc/manual/manual.html -/doc/manual/manual.xmli -/doc/manual/manual.pdf -/doc/manual/manual.is-valid -/doc/manual/*.1 -/doc/manual/*.5 -/doc/manual/*.8 -/doc/manual/images -/doc/manual/version.txt -/doc/manual/release-notes.html - -# /scripts/ -/scripts/nix-profile.sh -/scripts/nix-pull -/scripts/nix-push -/scripts/nix-switch -/scripts/nix-collect-garbage -/scripts/nix-prefetch-url -/scripts/nix-install-package -/scripts/nix-channel -/scripts/nix-build -/scripts/nix-copy-closure -/scripts/nix-generate-patches -/scripts/NixConfig.pm -/scripts/NixManifest.pm -/scripts/GeneratePatches.pm -/scripts/download-using-manifests.pl -/scripts/copy-from-other-stores.pl -/scripts/download-from-binary-cache.pl -/scripts/find-runtime-roots.pl -/scripts/build-remote.pl -/scripts/nix-reduce-build -/scripts/nix-http-export.cgi - -# /src/bsdiff-4.3/ -/src/bsdiff-4.3/bsdiff -/src/bsdiff-4.3/bspatch - -# /src/libexpr/ -/src/libexpr/lexer-tab.cc -/src/libexpr/lexer-tab.hh -/src/libexpr/parser-tab.cc -/src/libexpr/parser-tab.hh -/src/libexpr/parser-tab.output -/src/libexpr/nix.tbl - -# /src/libstore/ -/src/libstore/schema.sql.hh - -# /src/nix-env/ -/src/nix-env/nix-env - -# /src/nix-hash/ -/src/nix-hash/nix-hash - -# /src/nix-instantiate/ -/src/nix-instantiate/nix-instantiate - -# /src/nix-log2xml/ -/src/nix-log2xml/nix-log2xml - -# /src/nix-store/ -/src/nix-store/nix-store - -# /src/nix-daemon/ -/src/nix-daemon/nix-daemon - -# /src/download-via-ssh/ -/src/download-via-ssh/download-via-ssh - -# /tests/ -/tests/test-tmp -/tests/common.sh -/tests/dummy -/tests/result* - -# /tests/lang/ -/tests/lang/*.out -/tests/lang/*.out.xml -/tests/lang/*.ast - -/perl/lib/Nix/Config.pm -/perl/lib/Nix/Store.cc - -*.a -*.o -*.so -*.dep -*~ - -# GNU Global -GPATH -GRTAGS -GSYMS -GTAGS diff --git a/AUTHORS b/AUTHORS deleted file mode 100644 index 102d28f497..0000000000 --- a/AUTHORS +++ /dev/null @@ -1,8 +0,0 @@ -The following people contributed to Nix, in alphabetical order: - -Martin Bravenboer -Eelco Dolstra -Niels Janssen -Armijn Hemel -Rob Vermaas -Eelco Visser diff --git a/COPYING b/COPYING deleted file mode 100644 index 5ab7695ab8..0000000000 --- a/COPYING +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/INSTALL b/INSTALL deleted file mode 100644 index a4b34144dc..0000000000 --- a/INSTALL +++ /dev/null @@ -1,229 +0,0 @@ -Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software -Foundation, Inc. - - This file is free documentation; the Free Software Foundation gives -unlimited permission to copy, distribute and modify it. - -Basic Installation -================== - - These are generic installation instructions. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. (Caching is -disabled by default to prevent problems with accidental use of stale -cache files.) - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You only need -`configure.ac' if you want to change it or regenerate `configure' using -a newer version of `autoconf'. - -The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. If you're - using `csh' on an old version of System V, you might need to type - `sh ./configure' instead to prevent `csh' from trying to execute - `configure' itself. - - Running `configure' takes awhile. While running, it prints some - messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package. - - 4. Type `make install' to install the programs and any data files and - documentation. - - 5. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - -Compilers and Options -===================== - - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. - - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - - You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you must use a version of `make' that -supports the `VPATH' variable, such as GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. - - If you have to use a `make' that does not support the `VPATH' -variable, you have to compile the package for one architecture at a -time in the source code directory. After you have installed the -package for one architecture, use `make distclean' before reconfiguring -for another architecture. - -Installation Names -================== - - By default, `make install' will install the package's files in -`/usr/local/bin', `/usr/local/man', etc. You can specify an -installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PATH'. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH', the package will use -PATH as the prefix for installing programs and libraries. -Documentation and other data files will still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=PATH' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - -Optional Features -================= - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - -Specifying the System Type -========================== - - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the `--target=TYPE' option to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. - -Sharing Defaults -================ - - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - - Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -will cause the specified gcc to be used as the C compiler (unless it is -overridden in the site shell script). - -`configure' Invocation -====================== - - `configure' recognizes the following options to control how it -operates. - -`--help' -`-h' - Print a summary of the options to `configure', and exit. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. - diff --git a/Makefile b/Makefile deleted file mode 100644 index bcfa89dd23..0000000000 --- a/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -makefiles = \ - local.mk \ - src/boost/format/local.mk \ - src/libutil/local.mk \ - src/libstore/local.mk \ - src/libmain/local.mk \ - src/libexpr/local.mk \ - src/nix-hash/local.mk \ - src/nix-store/local.mk \ - src/nix-instantiate/local.mk \ - src/nix-env/local.mk \ - src/nix-daemon/local.mk \ - src/download-via-ssh/local.mk \ - src/nix-log2xml/local.mk \ - src/bsdiff-4.3/local.mk \ - perl/local.mk \ - scripts/local.mk \ - corepkgs/local.mk \ - misc/emacs/local.mk \ - doc/manual/local.mk \ - tests/local.mk - -GLOBAL_CXXFLAGS += -std=c++0x - -include Makefile.config - -include mk/lib.mk diff --git a/Makefile.config.in b/Makefile.config.in deleted file mode 100644 index 0937483322..0000000000 --- a/Makefile.config.in +++ /dev/null @@ -1,34 +0,0 @@ -BDW_GC_LIBS = @BDW_GC_LIBS@ -CC = @CC@ -CFLAGS = @CFLAGS@ -CXX = @CXX@ -CXXFLAGS = @CXXFLAGS@ -HAVE_OPENSSL = @HAVE_OPENSSL@ -OPENSSL_LIBS = @OPENSSL_LIBS@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -bash = @bash@ -bindir = @bindir@ -bsddiff_compat_include = @bsddiff_compat_include@ -datadir = @datadir@ -datarootdir = @datarootdir@ -dblatex = @dblatex@ -docbookrng = @docbookrng@ -docbookxsl = @docbookxsl@ -docdir = @docdir@ -exec_prefix = @exec_prefix@ -includedir = @includedir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -perl = @perl@ -perlbindings = @perlbindings@ -perllibdir = @perllibdir@ -pkglibdir = $(libdir)/$(PACKAGE_NAME) -prefix = @prefix@ -storedir = @storedir@ -sysconfdir = @sysconfdir@ -w3m = @w3m@ -xmllint = @xmllint@ -xsltproc = @xsltproc@ diff --git a/README b/README deleted file mode 100644 index 35a1f6cc08..0000000000 --- a/README +++ /dev/null @@ -1,10 +0,0 @@ -Nix is a purely functional package manager. For installation and -usage instructions, please read the manual, which can be found in -`docs/manual/manual.html', and additionally at the Nix website at -. - - -Acknowledgments - -This product includes software developed by the OpenSSL Project for -use in the OpenSSL Toolkit (http://www.OpenSSL.org/). diff --git a/bootstrap.sh b/bootstrap.sh deleted file mode 100755 index e3e2593516..0000000000 --- a/bootstrap.sh +++ /dev/null @@ -1,4 +0,0 @@ -#! /bin/sh -e -rm -f aclocal.m4 -mkdir -p config -exec autoreconf -vfi diff --git a/build.nix b/build.nix deleted file mode 100644 index 5f10f3e910..0000000000 --- a/build.nix +++ /dev/null @@ -1,169 +0,0 @@ -with import ; -with pkgs; - -rec { - - bin2c = link { - objects = [ (compileC { main = ./src/bin2c/bin2c.c; }) ]; - programName = "bin2c"; - }; - - bsdiff = link { - objects = [ (compileC { main = ./src/bsdiff-4.3/bsdiff.c; buildInputs = [ pkgs.bzip2 ]; }) ]; - programName = "bsdiff"; - buildInputs = [ pkgs.bzip2 ]; - flags = "-lbz2"; - }; - - bspatch = link { - objects = [ (compileC { main = ./src/bsdiff-4.3/bspatch.c; buildInputs = [ pkgs.bzip2 ]; }) ]; - programName = "bspatch"; - buildInputs = [ pkgs.bzip2 ]; - flags = "-lbz2"; - }; - - libformat = makeLibrary { - objects = - map (fn: compileC { - main = fn; - localIncludePath = [ ./src ]; - }) - [ ./src/boost/format/format_implementation.cc - ./src/boost/format/free_funcs.cc - ./src/boost/format/parsing.cc - ]; - libraryName = "format"; - }; - - libutil = makeLibrary { - objects = - map (fn: compileC { - main = fn; - localIncludePath = [ ./src/libutil ./src ./. ]; - buildInputs = [ pkgs.openssl ]; - }) - [ ./src/libutil/util.cc - ./src/libutil/hash.cc - ./src/libutil/serialise.cc - ./src/libutil/archive.cc - ./src/libutil/xml-writer.cc - ./src/libutil/immutable.cc - ]; - libraryName = "util"; - }; - - libstore = makeLibrary { - objects = - map (fn: compileC { - main = fn; - localIncludePath = [ ./src/libstore ./src/libutil ./src ./. ]; - buildInputs = [ pkgs.sqlite ]; - cFlags = "-DNIX_STORE_DIR=\"/nix/store\" -DNIX_DATA_DIR=\"/home/eelco/Dev/nix/inst/share\" -DNIX_STATE_DIR=\"/nix/var/nix\" -DNIX_LOG_DIR=\"/foo\" -DNIX_CONF_DIR=\"/foo\" -DNIX_LIBEXEC_DIR=\"/foo\" -DNIX_BIN_DIR=\"/home/eelco/Dev/nix/inst/bin\""; - }) - [ ./src/libstore/store-api.cc - ./src/libstore/local-store.cc - ./src/libstore/remote-store.cc - ./src/libstore/derivations.cc - ./src/libstore/build.cc - ./src/libstore/misc.cc - ./src/libstore/globals.cc - ./src/libstore/references.cc - ./src/libstore/pathlocks.cc - ./src/libstore/gc.cc - ./src/libstore/optimise-store.cc - ]; - libraryName = "store"; - }; - - libmain = makeLibrary { - objects = - map (fn: compileC { - main = fn; - localIncludePath = [ ./src/libmain ./src/libstore ./src/libutil ./src ./. ]; - }) - [ ./src/libmain/shared.cc ]; - libraryName = "main"; - }; - - nix_hash = link { - objects = - map (fn: compileC { - main = fn; - localIncludePath = [ ./src/nix-hash ./src/libmain ./src/libstore ./src/libutil ./src ./. ]; - }) - [ ./src/nix-hash/nix-hash.cc - ]; - libraries = [ libformat libutil libstore libmain ]; - buildInputs = [ pkgs.openssl pkgs.sqlite ]; - flags = "-lssl -lsqlite3 -lstdc++"; - programName = "nix-hash"; - }; - - nix_store = link { - objects = - map (fn: compileC { - main = fn; - localIncludePath = [ ./src/nix-store ./src/libmain ./src/libstore ./src/libutil ./src ./. ]; - }) - [ ./src/nix-store/nix-store.cc - ./src/nix-store/dotgraph.cc - ./src/nix-store/xmlgraph.cc - ]; - libraries = [ libformat libutil libstore libmain ]; - buildInputs = [ pkgs.openssl pkgs.sqlite ]; - flags = "-lssl -lsqlite3 -lstdc++"; - programName = "nix-store"; - }; - - libexpr = makeLibrary { - objects = - map (fn: compileC { - main = fn; - localIncludePath = [ ./src/libexpr ./src/libstore ./src/libutil ./src ./. ]; - }) - [ ./src/libexpr/nixexpr.cc - ./src/libexpr/eval.cc - ./src/libexpr/primops.cc - ./src/libexpr/lexer-tab.cc - ./src/libexpr/parser-tab.cc - ./src/libexpr/get-drvs.cc - ./src/libexpr/attr-path.cc - ./src/libexpr/value-to-xml.cc - ./src/libexpr/common-opts.cc - ./src/libexpr/names.cc - ]; - libraryName = "expr"; - }; - - nix_instantiate = link { - objects = - map (fn: compileC { - main = fn; - localIncludePath = [ ./src/nix-instantiate ./src/libexpr ./src/libmain ./src/libstore ./src/libutil ./src ./. ]; - }) - [ ./src/nix-instantiate/nix-instantiate.cc ]; - libraries = [ libformat libutil libstore libmain libexpr ]; - buildInputs = [ pkgs.openssl pkgs.sqlite ]; - flags = "-lssl -lsqlite3 -lstdc++"; - programName = "nix-instantiate"; - }; - - nix_env = link { - objects = - map (fn: compileC { - main = fn; - localIncludePath = [ ./src/nix-env ./src/libexpr ./src/libmain ./src/libstore ./src/libutil ./src ./. ]; - }) - [ ./src/nix-env/nix-env.cc - ./src/nix-env/profiles.cc - ./src/nix-env/user-env.cc - ]; - libraries = [ libformat libutil libstore libmain libexpr ]; - buildInputs = [ pkgs.openssl pkgs.sqlite ]; - flags = "-lssl -lsqlite3 -lstdc++"; - programName = "nix-env"; - }; - - all = [ bsdiff bspatch nix_hash nix_store nix_instantiate nix_env ]; - -} diff --git a/config/config.guess b/config/config.guess deleted file mode 100755 index 137bedf2e2..0000000000 --- a/config/config.guess +++ /dev/null @@ -1,1537 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. - -timestamp='2012-08-14' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see . -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner. Please send patches (context -# diff format) to and include a ChangeLog -# entry. -# -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. -# -# You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system \`$me' is run on. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - -trap 'exit 1' 1 2 15 - -# CC_FOR_BUILD -- compiler used by this script. Note that the use of a -# compiler to aid in system detection is discouraged as it requires -# temporary files to be created and, as you can see below, it is a -# headache to deal with in a portable fashion. - -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. - -# Portable tmp directory creation inspired by the Autoconf team. - -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; - for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -# Note: order is significant - the case branches are not exclusive. - -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in - *:NetBSD:*:*) - # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # - # Note: NetBSD doesn't particularly care about the vendor - # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in - armeb) machine=armeb-unknown ;; - arm*) machine=arm-unknown ;; - sh3el) machine=shl-unknown ;; - sh3eb) machine=sh-unknown ;; - sh5el) machine=sh5le-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in - arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ELF__ - then - # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). - # Return netbsd for either. FIX? - os=netbsd - else - os=netbsdelf - fi - ;; - *) - os=netbsd - ;; - esac - # The OS release - # Debian GNU/NetBSD machines have a different userland, and - # thus, need a distinct triplet. However, they do not need - # kernel version information, so it can be replaced with a - # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in - Debian*) - release='-gnu' - ;; - *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - ;; - esac - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" - exit ;; - *:Bitrig:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} - exit ;; - *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; - *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} - exit ;; - *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} - exit ;; - macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} - exit ;; - *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} - exit ;; - alpha:OSF1:*:*) - case $UNAME_RELEASE in - *4.0) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - ;; - *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` - ;; - esac - # According to Compaq, /usr/sbin/psrinfo has been available on - # OSF/1 and Tru64 systems produced since 1995. I hope that - # covers most systems running today. This code pipes the CPU - # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in - "EV4 (21064)") - UNAME_MACHINE="alpha" ;; - "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; - "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; - "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; - "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; - "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; - "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; - "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; - "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; - "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; - "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; - "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; - "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; - esac - # A Pn.n version is a patched version. - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - exitcode=$? - trap '' 0 - exit $exitcode ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; - *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit ;; - *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos - exit ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; - *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; - *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; - DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; - DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; - s390x:SunOS:*:*) - echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux${UNAME_RELEASE} - exit ;; - i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval $set_cc_for_build - SUN_ARCH="i386" - # If there is a compiler, see if it is configured for 64-bit objects. - # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. - # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - SUN_ARCH="x86_64" - fi - fi - echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in - sun3) - echo m68k-sun-sunos${UNAME_RELEASE} - ;; - sun4) - echo sparc-sun-sunos${UNAME_RELEASE} - ;; - esac - exit ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; - m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} - exit ;; - powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && - { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} - exit ;; - Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; - Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] - then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] - then - echo m88k-dg-dgux${UNAME_RELEASE} - else - echo m88k-dg-dguxbcs${UNAME_RELEASE} - fi - else - echo i586-dg-dgux${UNAME_RELEASE} - fi - exit ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; - *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; - ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` - then - echo "$SYSTEM_NAME" - else - echo rs6000-ibm-aix3.2.5 - fi - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit ;; - *:AIX:*:[4567]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 - esac ;; - esac - fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - - #define _HPUX_SOURCE - #include - #include - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` - test -z "$HP_ARCH" && HP_ARCH=hppa - fi ;; - esac - if [ ${HP_ARCH} = "hppa2.0w" ] - then - eval $set_cc_for_build - - # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating - # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler - # generating 64-bit code. GNU and HP use different nomenclature: - # - # $ CC_FOR_BUILD=cc ./config.guess - # => hppa2.0w-hp-hpux11.23 - # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess - # => hppa64-hp-hpux11.23 - - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | - grep -q __LP64__ - then - HP_ARCH="hppa2.0w" - else - HP_ARCH="hppa64" - fi - fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit ;; - 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; - *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; - i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk - else - echo ${UNAME_MACHINE}-unknown-osf1 - fi - exit ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ - -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:FreeBSD:*:*) - UNAME_PROCESSOR=`/usr/bin/uname -p` - case ${UNAME_PROCESSOR} in - amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - esac - exit ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; - *:MINGW64*:*) - echo ${UNAME_MACHINE}-pc-mingw64 - exit ;; - *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - i*:MSYS*:*) - echo ${UNAME_MACHINE}-pc-msys - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; - i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit ;; - *:Interix*:*) - case ${UNAME_MACHINE} in - x86) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; - authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix${UNAME_RELEASE} - exit ;; - IA64) - echo ia64-unknown-interix${UNAME_RELEASE} - exit ;; - esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - 8664:Windows_NT:*) - echo x86_64-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; - i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit ;; - amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - *:GNU:*:*) - # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit ;; - *:GNU/*:*:*) - # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu - exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit ;; - aarch64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - aarch64_be:Linux:*:*) - UNAME_MACHINE=aarch64_be - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit ;; - arm*:Linux:*:*) - eval $set_cc_for_build - if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_EABI__ - then - echo ${UNAME_MACHINE}-unknown-linux-gnu - else - if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_PCS_VFP - then - echo ${UNAME_MACHINE}-unknown-linux-gnueabi - else - echo ${UNAME_MACHINE}-unknown-linux-gnueabihf - fi - fi - exit ;; - avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - cris:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu - exit ;; - crisv32:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu - exit ;; - frv:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - hexagon:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - i*86:Linux:*:*) - LIBC=gnu - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" - exit ;; - ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - mips:Linux:*:* | mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} - #else - CPU= - #endif - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } - ;; - or32:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - padre:Linux:*:*) - echo sparc-unknown-linux-gnu - exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu - exit ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; - esac - exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu - exit ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu - exit ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux - exit ;; - sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - tile*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu - exit ;; - x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - i*86:DYNIX/ptx:4*:*) - # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. - # earlier versions are messed up and put the nodename in both - # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; - i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit ;; - i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop - exit ;; - i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos - exit ;; - i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable - exit ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit ;; - i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} - else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} - fi - exit ;; - i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. - case `/bin/uname -X | grep "^Machine"` in - *486*) UNAME_MACHINE=i486 ;; - *Pentium) UNAME_MACHINE=i586 ;; - *Pent*|*Celeron) UNAME_MACHINE=i686 ;; - esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` - (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL - else - echo ${UNAME_MACHINE}-pc-sysv32 - fi - exit ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i586. - # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that - # this is a cross-build. - echo i586-pc-msdosdjgpp - exit ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 - fi - exit ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit ;; - mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; - M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; - M68*:*:R3V[5678]*:*) - test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; - NCR*:*:4.2:* | MPRAS*:*:4.2:*) - OS_REL='.3' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit ;; - rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says - echo i586-unisys-sysv4 - exit ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes . - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; - i*86:VOS:*:*) - # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos - exit ;; - *:VOS:*:*) - # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit ;; - news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} - else - echo mips-unknown-sysv${UNAME_RELEASE} - fi - exit ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; - BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - exit ;; - x86_64:Haiku:*:*) - echo x86_64-unknown-haiku - exit ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit ;; - SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} - exit ;; - SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} - exit ;; - SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} - exit ;; - SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux${UNAME_RELEASE} - exit ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - i386) - eval $set_cc_for_build - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - UNAME_PROCESSOR="x86_64" - fi - fi ;; - unknown) UNAME_PROCESSOR=powerpc ;; - esac - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then - UNAME_PROCESSOR=i386 - UNAME_MACHINE=pc - fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit ;; - *:QNX:*:4*) - echo i386-pc-qnx - exit ;; - NEO-?:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk${UNAME_RELEASE} - exit ;; - NSE-*:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; - *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; - BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; - DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - if test "$cputype" = "386"; then - UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" - fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit ;; - *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; - *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; - *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; - *:ITS:*:*) - echo pdp10-unknown-its - exit ;; - SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} - exit ;; - *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; - *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; - esac ;; - *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; - i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' - exit ;; - i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos - exit ;; - i*86:AROS:*:*) - echo ${UNAME_MACHINE}-pc-aros - exit ;; - x86_64:VMkernel:*:*) - echo ${UNAME_MACHINE}-unknown-esx - exit ;; -esac - -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - -cat >&2 < in order to provide the needed -information to handle your system. - -config.guess timestamp = $timestamp - -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} -EOF - -exit 1 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/config/config.sub b/config/config.sub deleted file mode 100755 index bdda9e4a32..0000000000 --- a/config/config.sub +++ /dev/null @@ -1,1786 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. - -timestamp='2012-08-18' - -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see . -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Please send patches to . Submit a context -# diff and a properly formatted GNU ChangeLog entry. -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS - -Canonicalize a configuration name. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.sub ($timestamp) - -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo $1 - exit ;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ - linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | \ - kopensolaris*-gnu* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - android-linux) - os=-linux-android - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac - -### Let's recognize common machines as not being operating systems so -### that things like config.sub decstation-3100 work. We also -### recognize some manufacturers as not being operating systems, so we -### can provide default operating systems below. -case $os in - -sun*os*) - # Prevent following clause from handling this invalid input. - ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray | -microblaze) - os= - basic_machine=$1 - ;; - -bluegene*) - os=-cnk - ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 - ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco6) - os=-sco5v6 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*178) - os=-lynxos178 - ;; - -lynx*5) - os=-lynxos5 - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | aarch64 | aarch64_be \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | be32 | be64 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | epiphany \ - | fido | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | hexagon \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | le32 | le64 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nds32 | nds32le | nds32be \ - | nios | nios2 \ - | ns16k | ns32k \ - | open8 \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle \ - | pyramid \ - | rl78 | rx \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu \ - | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ - | ubicom32 \ - | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ - | we32k \ - | x86 | xc16x | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown - ;; - c54x) - basic_machine=tic54x-unknown - ;; - c55x) - basic_machine=tic55x-unknown - ;; - c6x) - basic_machine=tic6x-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - ms1) - basic_machine=mt-unknown - ;; - - strongarm | thumb | xscale) - basic_machine=arm-unknown - ;; - xgate) - basic_machine=$basic_machine-unknown - os=-none - ;; - xscaleeb) - basic_machine=armeb-unknown - ;; - - xscaleel) - basic_machine=armel-unknown - ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | aarch64-* | aarch64_be-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | be32-* | be64-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | hexagon-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | le32-* | le64-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64octeon-* | mips64octeonel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64r5900-* | mips64r5900el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | open8-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ - | pyramid-* \ - | rl78-* | romp-* | rs6000-* | rx-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ - | tahoe-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tile*-* \ - | tron-* \ - | ubicom32-* \ - | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ - | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-* | z80-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aros) - basic_machine=i386-pc - os=-aros - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=-linux - ;; - blackfin-*) - basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - bluegene*) - basic_machine=powerpc-ibm - os=-cnk - ;; - c54x-*) - basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c55x-*) - basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c6x-*) - basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - cegcc) - basic_machine=arm-unknown - os=-cegcc - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16 | cr16-*) - basic_machine=cr16-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dicos) - basic_machine=i686-pc - os=-dicos - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; - i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m68knommu) - basic_machine=m68k-unknown - os=-linux - ;; - m68knommu-*) - basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - microblaze) - basic_machine=microblaze-xilinx - ;; - mingw64) - basic_machine=x86_64-pc - os=-mingw64 - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; - msys) - basic_machine=i386-pc - os=-msys - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - nacl) - basic_machine=le32-unknown - os=-nacl - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - neo-tandem) - basic_machine=neo-tandem - ;; - nse-tandem) - basic_machine=nse-tandem - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - parisc) - basic_machine=hppa-unknown - os=-linux - ;; - parisc-*) - basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pc98) - basic_machine=i386-pc - ;; - pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc - ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc - ;; - pentium4) - basic_machine=i786-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc | ppcbe) basic_machine=powerpc-unknown - ;; - ppc-* | ppcbe-*) - basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sde) - basic_machine=mipsisa32-sde - os=-elf - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sh5el) - basic_machine=sh5le-unknown - ;; - sh64) - basic_machine=sh64-unknown - ;; - sparclite-wrs | simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - strongarm-* | thumb-*) - basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=-unicos - ;; - t90) - basic_machine=t90-cray - os=-unicos - ;; - tile*) - basic_machine=$basic_machine-unknown - os=-linux-gnu - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - toad1) - basic_machine=pdp10-xkl - os=-tops20 - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - xscale-* | xscalee[bl]-*) - basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - z80-*-coff) - basic_machine=z80-unknown - os=-sim - ;; - none) - basic_machine=none-none - os=-none - ;; - -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond - ;; - op50n) - basic_machine=hppa1.1-oki - ;; - op60c) - basic_machine=hppa1.1-oki - ;; - romp) - basic_machine=romp-ibm - ;; - mmix) - basic_machine=mmix-knuth - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown - ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) - basic_machine=sparc-sun - ;; - cydra) - basic_machine=cydra-cydrome - ;; - orion) - basic_machine=orion-highlevel - ;; - orion105) - basic_machine=clipper-highlevel - ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple - ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple - ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. - ;; - *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x"$os" != x"" ] -then -case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -auroraux) - os=-auroraux - ;; - -solaris1 | -solaris1.*) - os=`echo $os | sed -e 's|solaris1|sunos4|'` - ;; - -solaris) - os=-solaris2 - ;; - -svr4*) - os=-sysv4 - ;; - -unixware*) - os=-sysv4.2uw - ;; - -gnu/linux*) - os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` - ;; - # First accept the basic system types. - # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ - | -sym* | -kopensolaris* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* | -aros* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -bitrig* | -openbsd* | -solidbsd* \ - | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ - | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* | -cegcc* \ - | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ - | -linux-newlib* | -linux-musl* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ - | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ - | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -qnx*) - case $basic_machine in - x86-* | i*86-*) - ;; - *) - os=-nto$os - ;; - esac - ;; - -nto-qnx*) - ;; - -nto*) - os=`echo $os | sed -e 's|nto|nto-qnx|'` - ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) - ;; - -mac*) - os=`echo $os | sed -e 's|mac|macos|'` - ;; - -linux-dietlibc) - os=-linux-dietlibc - ;; - -linux*) - os=`echo $os | sed -e 's|linux|linux-gnu|'` - ;; - -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` - ;; - -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` - ;; - -opened*) - os=-openedition - ;; - -os400*) - os=-os400 - ;; - -wince*) - os=-wince - ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; - -utek*) - os=-bsd - ;; - -dynix*) - os=-bsd - ;; - -acis*) - os=-aos - ;; - -atheos*) - os=-atheos - ;; - -syllable*) - os=-syllable - ;; - -386bsd) - os=-bsd - ;; - -ctix* | -uts*) - os=-sysv - ;; - -nova*) - os=-rtmk-nova - ;; - -ns2 ) - os=-nextstep2 - ;; - -nsk*) - os=-nsk - ;; - # Preserve the version number of sinix5. - -sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - -sinix*) - os=-sysv4 - ;; - -tpf*) - os=-tpf - ;; - -triton*) - os=-sysv3 - ;; - -oss*) - os=-sysv3 - ;; - -svr4) - os=-sysv4 - ;; - -svr3) - os=-sysv3 - ;; - -sysvr4) - os=-sysv4 - ;; - # This must come after -sysvr4. - -sysv*) - ;; - -ose*) - os=-ose - ;; - -es1800*) - os=-ose - ;; - -xenix) - os=-xenix - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint - ;; - -aros*) - os=-aros - ;; - -kaos*) - os=-kaos - ;; - -zvmoe) - os=-zvmoe - ;; - -dicos*) - os=-dicos - ;; - -nacl*) - ;; - -none) - ;; - *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 - exit 1 - ;; -esac -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -case $basic_machine in - score-*) - os=-elf - ;; - spu-*) - os=-elf - ;; - *-acorn) - os=-riscix1.2 - ;; - arm*-rebel) - os=-linux - ;; - arm*-semi) - os=-aout - ;; - c4x-* | tic4x-*) - os=-coff - ;; - hexagon-*) - os=-elf - ;; - tic54x-*) - os=-coff - ;; - tic55x-*) - os=-coff - ;; - tic6x-*) - os=-coff - ;; - # This must come before the *-dec entry. - pdp10-*) - os=-tops20 - ;; - pdp11-*) - os=-none - ;; - *-dec | vax-*) - os=-ultrix4.2 - ;; - m68*-apollo) - os=-domain - ;; - i386-sun) - os=-sunos4.0.2 - ;; - m68000-sun) - os=-sunos3 - ;; - m68*-cisco) - os=-aout - ;; - mep-*) - os=-elf - ;; - mips*-cisco) - os=-elf - ;; - mips*-*) - os=-elf - ;; - or32-*) - os=-coff - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 - ;; - sparc-* | *-sun) - os=-sunos4.1.1 - ;; - *-be) - os=-beos - ;; - *-haiku) - os=-haiku - ;; - *-ibm) - os=-aix - ;; - *-knuth) - os=-mmixware - ;; - *-wec) - os=-proelf - ;; - *-winbond) - os=-proelf - ;; - *-oki) - os=-proelf - ;; - *-hp) - os=-hpux - ;; - *-hitachi) - os=-hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv - ;; - *-cbm) - os=-amigaos - ;; - *-dg) - os=-dgux - ;; - *-dolphin) - os=-sysv3 - ;; - m68k-ccur) - os=-rtu - ;; - m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 - ;; - *-gould) - os=-sysv - ;; - *-highlevel) - os=-bsd - ;; - *-encore) - os=-bsd - ;; - *-sgi) - os=-irix - ;; - *-siemens) - os=-sysv4 - ;; - *-masscomp) - os=-rtu - ;; - f30[01]-fujitsu | f700-fujitsu) - os=-uxpv - ;; - *-rom68k) - os=-coff - ;; - *-*bug) - os=-coff - ;; - *-apple) - os=-macos - ;; - *-atari*) - os=-mint - ;; - *) - os=-none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) - vendor=acorn - ;; - -sunos*) - vendor=sun - ;; - -cnk*|-aix*) - vendor=ibm - ;; - -beos*) - vendor=be - ;; - -hpux*) - vendor=hp - ;; - -mpeix*) - vendor=hp - ;; - -hiux*) - vendor=hitachi - ;; - -unos*) - vendor=crds - ;; - -dgux*) - vendor=dg - ;; - -luna*) - vendor=omron - ;; - -genix*) - vendor=ns - ;; - -mvs* | -opened*) - vendor=ibm - ;; - -os400*) - vendor=ibm - ;; - -ptx*) - vendor=sequent - ;; - -tpf*) - vendor=ibm - ;; - -vxsim* | -vxworks* | -windiss*) - vendor=wrs - ;; - -aux*) - vendor=apple - ;; - -hms*) - vendor=hitachi - ;; - -mpw* | -macos*) - vendor=apple - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - vendor=atari - ;; - -vos*) - vendor=stratus - ;; - esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` - ;; -esac - -echo $basic_machine$os -exit - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/config/install-sh b/config/install-sh deleted file mode 100755 index 377bb8687f..0000000000 --- a/config/install-sh +++ /dev/null @@ -1,527 +0,0 @@ -#!/bin/sh -# install - install a program, script, or datafile - -scriptversion=2011-11-20.07; # UTC - -# This originates from X11R5 (mit/util/scripts/install.sh), which was -# later released in X11R6 (xc/config/util/install.sh) with the -# following copyright and license. -# -# Copyright (C) 1994 X Consortium -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to -# deal in the Software without restriction, including without limitation the -# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -# sell copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- -# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# Except as contained in this notice, the name of the X Consortium shall not -# be used in advertising or otherwise to promote the sale, use or other deal- -# ings in this Software without prior written authorization from the X Consor- -# tium. -# -# -# FSF changes to this file are in the public domain. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# 'make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. - -nl=' -' -IFS=" "" $nl" - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit=${DOITPROG-} -if test -z "$doit"; then - doit_exec=exec -else - doit_exec=$doit -fi - -# Put in absolute file names if you don't have them in your path; -# or use environment vars. - -chgrpprog=${CHGRPPROG-chgrp} -chmodprog=${CHMODPROG-chmod} -chownprog=${CHOWNPROG-chown} -cmpprog=${CMPPROG-cmp} -cpprog=${CPPROG-cp} -mkdirprog=${MKDIRPROG-mkdir} -mvprog=${MVPROG-mv} -rmprog=${RMPROG-rm} -stripprog=${STRIPPROG-strip} - -posix_glob='?' -initialize_posix_glob=' - test "$posix_glob" != "?" || { - if (set -f) 2>/dev/null; then - posix_glob= - else - posix_glob=: - fi - } -' - -posix_mkdir= - -# Desired mode of installed file. -mode=0755 - -chgrpcmd= -chmodcmd=$chmodprog -chowncmd= -mvcmd=$mvprog -rmcmd="$rmprog -f" -stripcmd= - -src= -dst= -dir_arg= -dst_arg= - -copy_on_change=false -no_target_directory= - -usage="\ -Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE - or: $0 [OPTION]... SRCFILES... DIRECTORY - or: $0 [OPTION]... -t DIRECTORY SRCFILES... - or: $0 [OPTION]... -d DIRECTORIES... - -In the 1st form, copy SRCFILE to DSTFILE. -In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. -In the 4th, create DIRECTORIES. - -Options: - --help display this help and exit. - --version display version info and exit. - - -c (ignored) - -C install only if different (preserve the last data modification time) - -d create directories instead of installing files. - -g GROUP $chgrpprog installed files to GROUP. - -m MODE $chmodprog installed files to MODE. - -o USER $chownprog installed files to USER. - -s $stripprog installed files. - -t DIRECTORY install into DIRECTORY. - -T report an error if DSTFILE is a directory. - -Environment variables override the default commands: - CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG - RMPROG STRIPPROG -" - -while test $# -ne 0; do - case $1 in - -c) ;; - - -C) copy_on_change=true;; - - -d) dir_arg=true;; - - -g) chgrpcmd="$chgrpprog $2" - shift;; - - --help) echo "$usage"; exit $?;; - - -m) mode=$2 - case $mode in - *' '* | *' '* | *' -'* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - shift;; - - -o) chowncmd="$chownprog $2" - shift;; - - -s) stripcmd=$stripprog;; - - -t) dst_arg=$2 - # Protect names problematic for 'test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac - shift;; - - -T) no_target_directory=true;; - - --version) echo "$0 $scriptversion"; exit $?;; - - --) shift - break;; - - -*) echo "$0: invalid option: $1" >&2 - exit 1;; - - *) break;; - esac - shift -done - -if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then - # When -d is used, all remaining arguments are directories to create. - # When -t is used, the destination is already specified. - # Otherwise, the last argument is the destination. Remove it from $@. - for arg - do - if test -n "$dst_arg"; then - # $@ is not empty: it contains at least $arg. - set fnord "$@" "$dst_arg" - shift # fnord - fi - shift # arg - dst_arg=$arg - # Protect names problematic for 'test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac - done -fi - -if test $# -eq 0; then - if test -z "$dir_arg"; then - echo "$0: no input file specified." >&2 - exit 1 - fi - # It's OK to call 'install-sh -d' without argument. - # This can happen when creating conditional directories. - exit 0 -fi - -if test -z "$dir_arg"; then - do_exit='(exit $ret); exit $ret' - trap "ret=129; $do_exit" 1 - trap "ret=130; $do_exit" 2 - trap "ret=141; $do_exit" 13 - trap "ret=143; $do_exit" 15 - - # Set umask so as not to create temps with too-generous modes. - # However, 'strip' requires both read and write access to temps. - case $mode in - # Optimize common cases. - *644) cp_umask=133;; - *755) cp_umask=22;; - - *[0-7]) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw='% 200' - fi - cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; - *) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw=,u+rw - fi - cp_umask=$mode$u_plus_rw;; - esac -fi - -for src -do - # Protect names problematic for 'test' and other utilities. - case $src in - -* | [=\(\)!]) src=./$src;; - esac - - if test -n "$dir_arg"; then - dst=$src - dstdir=$dst - test -d "$dstdir" - dstdir_status=$? - else - - # Waiting for this to be detected by the "$cpprog $src $dsttmp" command - # might cause directories to be created, which would be especially bad - # if $src (and thus $dsttmp) contains '*'. - if test ! -f "$src" && test ! -d "$src"; then - echo "$0: $src does not exist." >&2 - exit 1 - fi - - if test -z "$dst_arg"; then - echo "$0: no destination specified." >&2 - exit 1 - fi - dst=$dst_arg - - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. - if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dst_arg: Is a directory" >&2 - exit 1 - fi - dstdir=$dst - dst=$dstdir/`basename "$src"` - dstdir_status=0 - else - # Prefer dirname, but fall back on a substitute if dirname fails. - dstdir=` - (dirname "$dst") 2>/dev/null || - expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$dst" : 'X\(//\)[^/]' \| \ - X"$dst" : 'X\(//\)$' \| \ - X"$dst" : 'X\(/\)' \| . 2>/dev/null || - echo X"$dst" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q' - ` - - test -d "$dstdir" - dstdir_status=$? - fi - fi - - obsolete_mkdir_used=false - - if test $dstdir_status != 0; then - case $posix_mkdir in - '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - - # With -d, create the new directory with the user-specified mode. - # Otherwise, rely on $mkdir_umask. - if test -n "$dir_arg"; then - mkdir_mode=-m$mode - else - mkdir_mode= - fi - - posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 - - if (umask $mkdir_umask && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - ls_ld_tmpdir=`ls -ld "$tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/d" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null - fi - trap '' 0;; - esac;; - esac - - if - $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" - ) - then : - else - - # The umask is ridiculous, or mkdir does not conform to POSIX, - # or it failed possibly due to a race condition. Create the - # directory the slow way, step by step, checking for races as we go. - - case $dstdir in - /*) prefix='/';; - [-=\(\)!]*) prefix='./';; - *) prefix='';; - esac - - eval "$initialize_posix_glob" - - oIFS=$IFS - IFS=/ - $posix_glob set -f - set fnord $dstdir - shift - $posix_glob set +f - IFS=$oIFS - - prefixes= - - for d - do - test X"$d" = X && continue - - prefix=$prefix$d - if test -d "$prefix"; then - prefixes= - else - if $posix_mkdir; then - (umask=$mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break - # Don't fail if two instances are running concurrently. - test -d "$prefix" || exit 1 - else - case $prefix in - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; - *) qprefix=$prefix;; - esac - prefixes="$prefixes '$qprefix'" - fi - fi - prefix=$prefix/ - done - - if test -n "$prefixes"; then - # Don't fail if two instances are running concurrently. - (umask $mkdir_umask && - eval "\$doit_exec \$mkdirprog $prefixes") || - test -d "$dstdir" || exit 1 - obsolete_mkdir_used=true - fi - fi - fi - - if test -n "$dir_arg"; then - { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && - { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || - test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 - else - - # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ - - # Trap to clean up those temp files at exit. - trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 - - # Copy the file name to the temp name. - (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && - - # and set any options; do chmod last to preserve setuid bits. - # - # If any of these fail, we abort the whole thing. If we want to - # ignore errors from any of these, just make sure not to ignore - # errors from the above "$doit $cpprog $src $dsttmp" command. - # - { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && - { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && - { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && - - # If -C, don't bother to copy if it wouldn't change the file. - if $copy_on_change && - old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && - new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && - - eval "$initialize_posix_glob" && - $posix_glob set -f && - set X $old && old=:$2:$4:$5:$6 && - set X $new && new=:$2:$4:$5:$6 && - $posix_glob set +f && - - test "$old" = "$new" && - $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 - then - rm -f "$dsttmp" - else - # Rename the file to the real destination. - $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || - - # The rename failed, perhaps because mv can't rename something else - # to itself, or perhaps because mv is so ancient that it does not - # support -f. - { - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || - { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } - } || - { echo "$0: cannot unlink or rename $dst" >&2 - (exit 1); exit 1 - } - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dst" - } - fi || exit 1 - - trap '' 0 - fi -done - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/configure.ac b/configure.ac deleted file mode 100644 index 043aed5b36..0000000000 --- a/configure.ac +++ /dev/null @@ -1,339 +0,0 @@ -AC_INIT(nix, m4_esyscmd([bash -c "echo -n $(cat ./version)$VERSION_SUFFIX"])) -AC_CONFIG_SRCDIR(README) -AC_CONFIG_AUX_DIR(config) - -AC_PROG_SED - -# Construct a Nix system name (like "i686-linux"). -AC_CANONICAL_HOST -AC_MSG_CHECKING([for the canonical Nix system name]) - -AC_ARG_WITH(system, AC_HELP_STRING([--with-system=SYSTEM], - [Platform identifier (e.g., `i686-linux').]), - [system=$withval], - [case "$host_cpu" in - i*86) - machine_name="i686";; - amd64) - machine_name="x86_64";; - *) - machine_name="$host_cpu";; - esac - - case "$host_os" in - linux-gnu*) - # For backward compatibility, strip the `-gnu' part. - system="$machine_name-linux";; - *) - # Strip the version number from names such as `gnu0.3', - # `darwin10.2.0', etc. - system="$machine_name-`echo $host_os | "$SED" -e's/@<:@0-9.@:>@*$//g'`";; - esac]) - -sys_name=$(uname -s | tr 'A-Z ' 'a-z_') - -case $sys_name in - cygwin*) - sys_name=cygwin - ;; -esac - -AC_MSG_RESULT($system) -AC_SUBST(system) -AC_DEFINE_UNQUOTED(SYSTEM, ["$system"], [platform identifier (`cpu-os')]) - - -# State should be stored in /nix/var, unless the user overrides it explicitly. -test "$localstatedir" = '${prefix}/var' && localstatedir=/nix/var - - -# Solaris-specific stuff. -if test "$sys_name" = sunos; then - # Solaris requires -lsocket -lnsl for network functions - LIBS="-lsocket -lnsl $LIBS" -fi - - -CFLAGS=${CFLAGS:--g -O3 -Wall} -CXXFLAGS=${CXXFLAGS:--g -O3 -Wall} -AC_PROG_CC -AC_PROG_CXX - - -# Use 64-bit file system calls so that we can support files > 2 GiB. -AC_SYS_LARGEFILE - - -# Check for pubsetbuf. -AC_MSG_CHECKING([for pubsetbuf]) -AC_LANG_PUSH(C++) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include -using namespace std; -static char buf[1024];]], - [[cerr.rdbuf()->pubsetbuf(buf, sizeof(buf));]])], - [AC_MSG_RESULT(yes) AC_DEFINE(HAVE_PUBSETBUF, 1, [Whether pubsetbuf is available.])], - AC_MSG_RESULT(no)) -AC_LANG_POP(C++) - - -# Check for chroot support (requires chroot() and bind mounts). -AC_CHECK_FUNCS([chroot]) -AC_CHECK_FUNCS([unshare]) -AC_CHECK_FUNCS([statvfs]) -AC_CHECK_HEADERS([sched.h]) -AC_CHECK_HEADERS([sys/param.h]) -AC_CHECK_HEADERS([sys/mount.h], [], [], -[#ifdef HAVE_SYS_PARAM_H -# include -# endif -]) - - -# Check for vfork. -#AC_FUNC_FORK() - - -# Check for lutimes, optionally used for changing the mtime of -# symlinks. -AC_CHECK_FUNCS([lutimes]) - - -# Check for sched_setaffinity. -AC_CHECK_FUNCS([sched_setaffinity]) - - -# Check whether the store optimiser can optimise symlinks. -AC_MSG_CHECKING([whether it is possible to create a link to a symlink]) -ln -s bla tmp_link -if ln tmp_link tmp_link2 2> /dev/null; then - AC_MSG_RESULT(yes) - AC_DEFINE(CAN_LINK_SYMLINK, 1, [Whether link() works on symlinks.]) -else - AC_MSG_RESULT(no) -fi -rm -f tmp_link tmp_link2 - - -# Check for . -AC_LANG_PUSH(C++) -AC_CHECK_HEADERS([locale]) -AC_LANG_POP(C++) - - -# Check for . -AC_CHECK_HEADER([err.h], [], [bsddiff_compat_include="-Icompat-include"]) -AC_SUBST([bsddiff_compat_include]) - - -# Check whether we have the personality() syscall, which allows us to -# do i686-linux builds on x86_64-linux machines. -AC_CHECK_HEADERS([sys/personality.h]) - - -# Check for (for immutable file support). -AC_CHECK_HEADERS([linux/fs.h]) - - -# Check for tr1/unordered_set. -AC_LANG_PUSH(C++) -AC_CHECK_HEADERS([tr1/unordered_set]) -AC_LANG_POP(C++) - - -AC_DEFUN([NEED_PROG], -[ -AC_PATH_PROG($1, $2) -if test -z "$$1"; then - AC_MSG_ERROR([$2 is required]) -fi -]) - -NEED_PROG(curl, curl) -NEED_PROG(bash, bash) -NEED_PROG(patch, patch) -AC_PATH_PROG(xmllint, xmllint, false) -AC_PATH_PROG(xsltproc, xsltproc, false) -AC_PATH_PROG(w3m, w3m, false) -AC_PATH_PROG(flex, flex, false) -AC_PATH_PROG(bison, bison, false) -NEED_PROG(perl, perl) -NEED_PROG(sed, sed) -NEED_PROG(tar, tar) -NEED_PROG(bzip2, bzip2) -NEED_PROG(gzip, gzip) -NEED_PROG(xz, xz) -AC_PATH_PROG(dot, dot) -AC_PATH_PROG(dblatex, dblatex) -AC_PATH_PROG(pv, pv, pv) - - -# Test that Perl has the open/fork feature (Perl 5.8.0 and beyond). -AC_MSG_CHECKING([whether Perl is recent enough]) -if ! $perl -e 'open(FOO, "-|", "true"); while () { print; }; close FOO or die;'; then - AC_MSG_RESULT(no) - AC_MSG_ERROR([Your Perl version is too old. Nix requires Perl 5.8.0 or newer.]) -fi -AC_MSG_RESULT(yes) - - -# Figure out where to install Perl modules. -AC_MSG_CHECKING([for the Perl installation prefix]) -perlversion=$($perl -e 'use Config; print $Config{version};') -perlarchname=$($perl -e 'use Config; print $Config{archname};') -AC_SUBST(perllibdir, [${libdir}/perl5/site_perl/$perlversion/$perlarchname]) -AC_MSG_RESULT($perllibdir) - - -NEED_PROG(cat, cat) -NEED_PROG(tr, tr) -AC_ARG_WITH(coreutils-bin, AC_HELP_STRING([--with-coreutils-bin=PATH], - [path of cat, mkdir, etc.]), - coreutils=$withval, coreutils=$(dirname $cat)) -AC_SUBST(coreutils) - - -AC_ARG_WITH(docbook-rng, AC_HELP_STRING([--with-docbook-rng=PATH], - [path of the DocBook RelaxNG schema]), - docbookrng=$withval, docbookrng=/docbook-rng-missing) -AC_SUBST(docbookrng) - -AC_ARG_WITH(docbook-xsl, AC_HELP_STRING([--with-docbook-xsl=PATH], - [path of the DocBook XSL stylesheets]), - docbookxsl=$withval, docbookxsl=/docbook-xsl-missing) -AC_SUBST(docbookxsl) - - -AC_ARG_WITH(store-dir, AC_HELP_STRING([--with-store-dir=PATH], - [path of the Nix store (defaults to /nix/store)]), - storedir=$withval, storedir='/nix/store') -AC_SUBST(storedir) - - -# Look for OpenSSL, an optional dependency. -AC_PATH_PROG(openssl, openssl, openssl) # if not found, call openssl in $PATH -AC_SUBST(openssl) -AC_DEFINE_UNQUOTED(OPENSSL_PATH, ["$openssl"], [Path of the OpenSSL binary]) - -PKG_CHECK_MODULES([OPENSSL], [libcrypto], - [AC_DEFINE([HAVE_OPENSSL], [1], [Whether to use OpenSSL.]) - CXXFLAGS="$OPENSSL_CFLAGS $CXXFLAGS" - have_openssl=1], [have_openssl=]) -AC_SUBST(HAVE_OPENSSL, [$have_openssl]) - - -# Look for libbz2, a required dependency. -AC_CHECK_LIB([bz2], [BZ2_bzWriteOpen], [true], - [AC_MSG_ERROR([Nix requires libbz2, which is part of bzip2. See http://www.bzip.org/.])]) -AC_CHECK_HEADERS([bzlib.h], [true], - [AC_MSG_ERROR([Nix requires libbz2, which is part of bzip2. See http://www.bzip.org/.])]) - - -# Look for SQLite, a required dependency. -PKG_CHECK_MODULES([SQLITE3], [sqlite3 >= 3.6.19], [CXXFLAGS="$SQLITE3_CFLAGS $CXXFLAGS"]) - - -# Whether to use the Boehm garbage collector. -AC_ARG_ENABLE(gc, AC_HELP_STRING([--enable-gc], - [enable garbage collection in the Nix expression evaluator (requires Boehm GC) [default=no]]), - gc=$enableval, gc=no) -if test "$gc" = yes; then - PKG_CHECK_MODULES([BDW_GC], [bdw-gc]) - CXXFLAGS="$BDW_GC_CFLAGS $CXXFLAGS" - AC_DEFINE(HAVE_BOEHMGC, 1, [Whether to use the Boehm garbage collector.]) -fi - - -# Check for the required Perl dependencies (DBI, DBD::SQLite and WWW::Curl). -perlFlags="-I$perllibdir" - -AC_ARG_WITH(dbi, AC_HELP_STRING([--with-dbi=PATH], - [prefix of the Perl DBI library]), - perlFlags="$perlFlags -I$withval") - -AC_ARG_WITH(dbd-sqlite, AC_HELP_STRING([--with-dbd-sqlite=PATH], - [prefix of the Perl DBD::SQLite library]), - perlFlags="$perlFlags -I$withval") - -AC_ARG_WITH(www-curl, AC_HELP_STRING([--with-www-curl=PATH], - [prefix of the Perl WWW::Curl library]), - perlFlags="$perlFlags -I$withval") - -AC_MSG_CHECKING([whether DBD::SQLite works]) -if ! $perl $perlFlags -e 'use DBI; use DBD::SQLite;' 2>&5; then - AC_MSG_RESULT(no) - AC_MSG_FAILURE([The Perl modules DBI and/or DBD::SQLite are missing.]) -fi -AC_MSG_RESULT(yes) - -AC_MSG_CHECKING([whether WWW::Curl works]) -if ! $perl $perlFlags -e 'use WWW::Curl;' 2>&5; then - AC_MSG_RESULT(no) - AC_MSG_FAILURE([The Perl module WWW::Curl is missing.]) -fi -AC_MSG_RESULT(yes) - -AC_SUBST(perlFlags) - - -# Whether to build the Perl bindings -AC_MSG_CHECKING([whether to build the Perl bindings]) -AC_ARG_ENABLE(perl-bindings, AC_HELP_STRING([--enable-perl-bindings], - [whether to build the Perl bindings (recommended) [default=yes]]), - perlbindings=$enableval, perlbindings=yes) -if test "$enable_shared" = no; then - # Perl bindings require shared libraries. - perlbindings=no -fi -AC_SUBST(perlbindings) -AC_MSG_RESULT($perlbindings) - - -AC_ARG_ENABLE(init-state, AC_HELP_STRING([--disable-init-state], - [do not initialise DB etc. in `make install']), - init_state=$enableval, init_state=yes) -#AM_CONDITIONAL(INIT_STATE, test "$init_state" = "yes") - - -# Setuid installations. -AC_CHECK_FUNCS([setresuid setreuid lchown]) - - -# Nice to have, but not essential. -AC_CHECK_FUNCS([strsignal posix_fallocate nanosleep sysconf]) - - -# This is needed if bzip2 is a static library, and the Nix libraries -# are dynamic. -if test "$(uname)" = "Darwin"; then - LDFLAGS="-all_load $LDFLAGS" -fi - - -# Figure out the extension of dynamic libraries. -eval dynlib_suffix=$shrext_cmds -AC_SUBST(dynlib_suffix) - - -# Do we have GNU tar? -AC_MSG_CHECKING([if you have a recent GNU tar]) -if $tar --version 2> /dev/null | grep -q GNU && tar cvf /dev/null --warning=no-timestamp ./config.log > /dev/null; then - AC_MSG_RESULT(yes) - tarFlags="--warning=no-timestamp" -else - AC_MSG_RESULT(no) -fi -AC_SUBST(tarFlags) - - -# Expand all variables in config.status. -test "$prefix" = NONE && prefix=$ac_default_prefix -test "$exec_prefix" = NONE && exec_prefix='${prefix}' -for name in $ac_subst_vars; do - declare $name="$(eval echo "${!name}")" - declare $name="$(eval echo "${!name}")" - declare $name="$(eval echo "${!name}")" -done - -AC_CONFIG_HEADER([config.h]) -AC_CONFIG_FILES([]) -AC_OUTPUT diff --git a/corepkgs/buildenv.nix b/corepkgs/buildenv.nix deleted file mode 100644 index c52a0ea93d..0000000000 --- a/corepkgs/buildenv.nix +++ /dev/null @@ -1,28 +0,0 @@ -with import ; - -{ derivations, manifest }: - -derivation { - name = "user-environment"; - system = builtins.currentSystem; - builder = perl; - args = [ "-w" ./buildenv.pl ]; - - manifest = manifest; - - # !!! grmbl, need structured data for passing this in a clean way. - derivations = - map (d: - [ (d.meta.active or "true") - (d.meta.priority or 5) - (builtins.length d.outputs) - ] ++ map (output: builtins.getAttr output d) d.outputs) - derivations; - - # Building user environments remotely just causes huge amounts of - # network traffic, so don't do that. - preferLocalBuild = true; - - # Don't build in a chroot because Nix's dependencies may not be there. - __noChroot = true; -} diff --git a/corepkgs/buildenv.pl b/corepkgs/buildenv.pl deleted file mode 100644 index f98cca7c85..0000000000 --- a/corepkgs/buildenv.pl +++ /dev/null @@ -1,168 +0,0 @@ -use strict; -use Cwd; -use IO::Handle; - -STDOUT->autoflush(1); - -my $out = $ENV{"out"}; -mkdir "$out", 0755 || die "error creating $out"; - - -my $symlinks = 0; - -my %priorities; - - -# For each activated package, create symlinks. - -sub createLinks { - my $srcDir = shift; - my $dstDir = shift; - my $priority = shift; - - my @srcFiles = glob("$srcDir/*"); - - foreach my $srcFile (@srcFiles) { - my $baseName = $srcFile; - $baseName =~ s/^.*\///g; # strip directory - my $dstFile = "$dstDir/$baseName"; - - # The files below are special-cased so that they don't show up - # in user profiles, either because they are useless, or - # because they would cause pointless collisions (e.g., each - # Python package brings its own - # `$out/lib/pythonX.Y/site-packages/easy-install.pth'.) - # Urgh, hacky... - if ($srcFile =~ /\/propagated-build-inputs$/ || - $srcFile =~ /\/nix-support$/ || - $srcFile =~ /\/perllocal.pod$/ || - $srcFile =~ /\/info\/dir$/ || - $srcFile =~ /\/log$/) - { - # Do nothing. - } - - elsif (-d $srcFile) { - - lstat $dstFile; - - if (-d _) { - createLinks($srcFile, $dstFile, $priority); - } - - elsif (-l _) { - my $target = readlink $dstFile or die; - if (!-d $target) { - die "collision between directory `$srcFile' and non-directory `$target'"; - } - unlink $dstFile or die "error unlinking `$dstFile': $!"; - mkdir $dstFile, 0755 || - die "error creating directory `$dstFile': $!"; - createLinks($target, $dstFile, $priorities{$dstFile}); - createLinks($srcFile, $dstFile, $priority); - } - - else { - symlink($srcFile, $dstFile) || - die "error creating link `$dstFile': $!"; - $priorities{$dstFile} = $priority; - $symlinks++; - } - } - - else { - - if (-l $dstFile) { - my $target = readlink $dstFile; - my $prevPriority = $priorities{$dstFile}; - die ( "collision between `$srcFile' and `$target'; " - . "use `nix-env --set-flag " - . "priority NUMBER PKGNAME' to change the priority of " - . "one of the conflicting packages\n" ) - if $prevPriority == $priority; - next if $prevPriority < $priority; - unlink $dstFile or die; - } - - symlink($srcFile, $dstFile) || - die "error creating link `$dstFile': $!"; - $priorities{$dstFile} = $priority; - $symlinks++; - } - } -} - - -my %done; -my %postponed; - -sub addPkg; -sub addPkg { - my $pkgDir = shift; - my $priority = shift; - - return if (defined $done{$pkgDir}); - $done{$pkgDir} = 1; - -# print "symlinking $pkgDir\n"; - createLinks("$pkgDir", "$out", $priority); - - my $propagatedFN = "$pkgDir/nix-support/propagated-user-env-packages"; - if (-e $propagatedFN) { - open PROP, "<$propagatedFN" or die; - my $propagated = ; - close PROP; - my @propagated = split ' ', $propagated; - foreach my $p (@propagated) { - $postponed{$p} = 1 unless defined $done{$p}; - } - } -} - - -# Convert the stuff we get from the environment back into a coherent -# data type. -my @pkgs; -my @derivations = split ' ', $ENV{"derivations"}; -while (scalar @derivations) { - my $active = shift @derivations; - my $priority = shift @derivations; - my $outputs = shift @derivations; - for (my $n = 0; $n < $outputs; $n++) { - my $path = shift @derivations; - push @pkgs, - { path => $path - , active => $active ne "false" - , priority => int($priority) }; - } -} - - -# Symlink to the packages that have been installed explicitly by the -# user. Process in priority order to reduce unnecessary -# symlink/unlink steps. -@pkgs = sort { $a->{priority} <=> $b->{priority} || $a->{path} cmp $b->{path} } @pkgs; -foreach my $pkg (@pkgs) { - #print $pkg, " ", $pkgs{$pkg}->{priority}, "\n"; - addPkg($pkg->{path}, $pkg->{priority}) if $pkg->{active}; -} - - -# Symlink to the packages that have been "propagated" by packages -# installed by the user (i.e., package X declares that it want Y -# installed as well). We do these later because they have a lower -# priority in case of collisions. -my $priorityCounter = 1000; # don't care about collisions -while (scalar(keys %postponed) > 0) { - my @pkgDirs = keys %postponed; - %postponed = (); - foreach my $pkgDir (sort @pkgDirs) { - addPkg($pkgDir, $priorityCounter++); - } -} - - -print STDERR "created $symlinks symlinks in user environment\n"; - - -symlink($ENV{"manifest"}, "$out/manifest.nix") or die "cannot create manifest"; diff --git a/corepkgs/config.nix.in b/corepkgs/config.nix.in deleted file mode 100644 index a5ec83b9ea..0000000000 --- a/corepkgs/config.nix.in +++ /dev/null @@ -1,17 +0,0 @@ -let - fromEnv = var: def: - let val = builtins.getEnv var; in - if val != "" then val else def; -in { - perl = "@perl@"; - shell = "@bash@"; - coreutils = "@coreutils@"; - bzip2 = "@bzip2@"; - gzip = "@gzip@"; - xz = "@xz@"; - tar = "@tar@"; - tarFlags = "@tarFlags@"; - tr = "@tr@"; - curl = "@curl@"; - nixBinDir = fromEnv "NIX_BIN_DIR" "@bindir@"; -} diff --git a/corepkgs/derivation.nix b/corepkgs/derivation.nix deleted file mode 100644 index c0fbe8082c..0000000000 --- a/corepkgs/derivation.nix +++ /dev/null @@ -1,27 +0,0 @@ -/* This is the implementation of the ‘derivation’ builtin function. - It's actually a wrapper around the ‘derivationStrict’ primop. */ - -drvAttrs @ { outputs ? [ "out" ], ... }: - -let - - strict = derivationStrict drvAttrs; - - commonAttrs = drvAttrs // (builtins.listToAttrs outputsList) // - { all = map (x: x.value) outputsList; - inherit drvAttrs; - }; - - outputToAttrListElement = outputName: - { name = outputName; - value = commonAttrs // { - outPath = builtins.getAttr outputName strict; - drvPath = strict.drvPath; - type = "derivation"; - inherit outputName; - }; - }; - - outputsList = map outputToAttrListElement outputs; - -in (builtins.head outputsList).value diff --git a/corepkgs/fetchurl.nix b/corepkgs/fetchurl.nix deleted file mode 100644 index 39b9dd5082..0000000000 --- a/corepkgs/fetchurl.nix +++ /dev/null @@ -1,37 +0,0 @@ -with import ; - -{system ? builtins.currentSystem, url, outputHash ? "", outputHashAlgo ? "", md5 ? "", sha1 ? "", sha256 ? "", executable ? false}: - -assert (outputHash != "" && outputHashAlgo != "") - || md5 != "" || sha1 != "" || sha256 != ""; - -let - - builder = builtins.toFile "fetchurl.sh" - ('' - echo "downloading $url into $out" - ${curl} --fail --location --max-redirs 20 --insecure "$url" > "$out" - '' + (if executable then "${coreutils}/chmod +x $out" else "")); - -in - -derivation { - name = baseNameOf (toString url); - builder = shell; - args = [ "-e" builder ]; - - # New-style output content requirements. - outputHashAlgo = if outputHashAlgo != "" then outputHashAlgo else - if sha256 != "" then "sha256" else if sha1 != "" then "sha1" else "md5"; - outputHash = if outputHash != "" then outputHash else - if sha256 != "" then sha256 else if sha1 != "" then sha1 else md5; - outputHashMode = if executable then "recursive" else "flat"; - - inherit system url; - - # No need to double the amount of network traffic - preferLocalBuild = true; - - # Don't build in a chroot because Nix's dependencies may not be there. - __noChroot = true; -} diff --git a/corepkgs/imported-drv-to-derivation.nix b/corepkgs/imported-drv-to-derivation.nix deleted file mode 100644 index bdb6016986..0000000000 --- a/corepkgs/imported-drv-to-derivation.nix +++ /dev/null @@ -1,21 +0,0 @@ -attrs @ { drvPath, outputs, ... }: - -let - - commonAttrs = (builtins.listToAttrs outputsList) // - { all = map (x: x.value) outputsList; - inherit drvPath; - type = "derivation"; - }; - - outputToAttrListElement = outputName: - { name = outputName; - value = commonAttrs // { - outPath = builtins.getAttr outputName attrs; - inherit outputName; - }; - }; - - outputsList = map outputToAttrListElement outputs; - -in (builtins.head outputsList).value diff --git a/corepkgs/local.mk b/corepkgs/local.mk deleted file mode 100644 index 19c1d06962..0000000000 --- a/corepkgs/local.mk +++ /dev/null @@ -1,5 +0,0 @@ -corepkgs_FILES = nar.nix buildenv.nix buildenv.pl unpack-channel.nix derivation.nix fetchurl.nix imported-drv-to-derivation.nix - -$(foreach file,config.nix $(corepkgs_FILES),$(eval $(call install-data-in,$(d)/$(file),$(datadir)/nix/corepkgs))) - -template-files += $(d)/config.nix diff --git a/corepkgs/nar.nix b/corepkgs/nar.nix deleted file mode 100644 index 04be17fb0c..0000000000 --- a/corepkgs/nar.nix +++ /dev/null @@ -1,49 +0,0 @@ -with import ; - -let - - builder = builtins.toFile "nar.sh" - '' - export PATH=${nixBinDir}:${coreutils} - - if [ $compressionType = xz ]; then - ext=.xz - compressor="| ${xz} -7" - elif [ $compressionType = bzip2 ]; then - ext=.bz2 - compressor="| ${bzip2}" - else - ext= - compressor= - fi - - echo "packing ‘$storePath’..." - mkdir $out - dst=$out/tmp.nar$ext - - set -o pipefail - eval "nix-store --dump \"$storePath\" $compressor > $dst" - - hash=$(nix-hash --flat --type $hashAlgo --base32 $dst) - echo -n $hash > $out/nar-compressed-hash - - mv $dst $out/$hash.nar$ext - ''; - -in - -{ storePath, hashAlgo, compressionType }: - -derivation { - name = "nar"; - system = builtins.currentSystem; - builder = shell; - args = [ "-e" builder ]; - inherit storePath hashAlgo compressionType; - - # Don't build in a chroot because Nix's dependencies may not be there. - __noChroot = true; - - # Remote machines may not have ${nixBinDir} or ${coreutils} in the same prefixes - preferLocalBuild = true; -} diff --git a/corepkgs/unpack-channel.nix b/corepkgs/unpack-channel.nix deleted file mode 100644 index f7c5210354..0000000000 --- a/corepkgs/unpack-channel.nix +++ /dev/null @@ -1,42 +0,0 @@ -with import ; - -let - - builder = builtins.toFile "unpack-channel.sh" - '' - mkdir $out - cd $out - xzpat="\.xz\$" - gzpat="\.gz\$" - if [[ "$src" =~ $xzpat ]]; then - ${xz} -d < $src | ${tar} xf - ${tarFlags} - elif [[ "$src" =~ $gzpat ]]; then - ${gzip} -d < $src | ${tar} xf - ${tarFlags} - else - ${bzip2} -d < $src | ${tar} xf - ${tarFlags} - fi - mv * $out/$channelName - if [ -n "$binaryCacheURL" ]; then - mkdir $out/binary-caches - echo -n "$binaryCacheURL" > $out/binary-caches/$channelName - fi - ''; - -in - -{ name, channelName, src, binaryCacheURL ? "" }: - -derivation { - system = builtins.currentSystem; - builder = shell; - args = [ "-e" builder ]; - inherit name channelName src binaryCacheURL; - - PATH = "${nixBinDir}:${coreutils}"; - - # No point in doing this remotely. - preferLocalBuild = true; - - # Don't build in a chroot because Nix's dependencies may not be there. - __noChroot = true; -} diff --git a/dev-shell b/dev-shell deleted file mode 100755 index a4fdc6814b..0000000000 --- a/dev-shell +++ /dev/null @@ -1,17 +0,0 @@ -#! /bin/sh -if [ -e tests/test-tmp ]; then - chmod -R u+w tests/test-tmp - rm -rf tests/test-tmp -fi - -s=$(type -p nix-shell) -exec $s release.nix -A tarball --command " - export NIX_REMOTE=daemon - export NIX_PATH='$NIX_PATH' - export NIX_BUILD_SHELL=$(type -p bash) - export c=\$configureFlags - exec $s release.nix -A build.x86_64-linux --exclude tarball --command ' - configureFlags+=\" \$c --prefix=$(pwd)/inst --sysconfdir=$(pwd)/inst/etc\" - return - '" \ - "$@" diff --git a/doc/manual/bugs.xml b/doc/manual/bugs.xml deleted file mode 100644 index aa87e4b570..0000000000 --- a/doc/manual/bugs.xml +++ /dev/null @@ -1,39 +0,0 @@ - - -Bugs / To-Do - - - - -The man-pages generated from the DocBook documentation -are ugly. - -Generations properly form a tree. E.g., if after -switching to generation 39, we perform an installation action, a -generation 43 is created which is a descendant of 39, not 42. So a -rollback from 43 ought to go back to 39. This is not currently -implemented; generations form a linear sequence. - -For security, nix-push manifests -should be digitally signed, and nix-pull should -verify the signatures. The actual NAR archives in the cache do not -need to be signed, since the manifest contains cryptographic hashes of -these files (and fetchurl.nix checks -them). - -It would be useful to have an option in -nix-env --delete-generations to remove non-current -generations older than a certain age. - -There should be a flexible way to change the user -environment builder. Currently, you have to replace -prefix/share/nix/corepkgs/buildenv/builder.pl, -which is hard-coded into nix-env. Also, the -default builder should be more powerful. For instance, there should -be some way to specify priorities to resolve -collisions. - - - - diff --git a/doc/manual/build-farm.xml b/doc/manual/build-farm.xml deleted file mode 100644 index 2e0d86b89f..0000000000 --- a/doc/manual/build-farm.xml +++ /dev/null @@ -1,113 +0,0 @@ - - -Setting Up Distributed Builds - -Nix supports distributed builds: a local Nix installation can -forward Nix builds to other machines over the network. This allows -multiple builds to be performed in parallel (thus improving -performance) and allows Nix to perform multi-platform builds in a -semi-transparent way. For instance, if you perform a build for a -powerpc-darwin on an i686-linux -machine, Nix can automatically forward the build to a -powerpc-darwin machine, if available. - -You can enable distributed builds by setting the environment -variable NIX_BUILD_HOOK to point to a program that Nix -will call whenever it wants to build a derivation. The build hook -(typically a shell or Perl script) can decline the build, in which Nix -will perform it in the usual way if possible, or it can accept it, in -which case it is responsible for somehow getting the inputs of the -build to another machine, doing the build there, and getting the -results back. The details of the build hook protocol are described in -the documentation of the NIX_BUILD_HOOK -variable. - -Remote machine configuration: -<filename>remote-systems.conf</filename> - -nix@mcflurry.labs.cs.uu.nl powerpc-darwin /home/nix/.ssh/id_quarterpounder_auto 2 -nix@scratchy.labs.cs.uu.nl i686-linux /home/nix/.ssh/id_scratchy_auto 8 1 kvm -nix@itchy.labs.cs.uu.nl i686-linux /home/nix/.ssh/id_scratchy_auto 8 2 -nix@poochie.labs.cs.uu.nl i686-linux /home/nix/.ssh/id_scratchy_auto 8 2 kvm perf - - - -Nix ships with a build hook that should be suitable for most -purposes. It uses ssh and -nix-copy-closure to copy the build inputs and -outputs and perform the remote build. To use it, you should set -NIX_BUILD_HOOK to -prefix/libexec/nix/build-remote.pl. -You should also define a list of available build machines and point -the environment variable NIX_REMOTE_SYSTEMS to it. An -example configuration is shown in . Each line in the file specifies a machine, with the following -bits of information: - - - - The name of the remote machine, with optionally the - user under which the remote build should be performed. This is - actually passed as an argument to ssh, so it can - be an alias defined in your - ~/.ssh/config. - - A comma-separated list of Nix platform type - identifiers, such as powerpc-darwin. It is - possible for a machine to support multiple platform types, e.g., - i686-linux,x86_64-linux. - - The SSH private key to be used to log in to the - remote machine. Since builds should be non-interactive, this key - should not have a passphrase! - - The maximum number of builds that - build-remote.pl will execute in parallel on the - machine. Typically this should be equal to the number of CPU cores. - For instance, the machine itchy in the example - will execute up to 8 builds in parallel. - - The “speed factor”, indicating the relative speed of - the machine. If there are multiple machines of the right type, Nix - will prefer the fastest, taking load into account. - - A comma-separated list of supported - features. If a derivation has the - requiredSystemFeatures attribute, then - build-remote.pl will only perform the - derivation on a machine that has the specified features. For - instance, the attribute - - -requiredSystemFeatures = [ "kvm" ]; - - - will cause the build to be performed on a machine that has the - kvm feature (i.e., scratchy in - the example above). - - A comma-separated list of mandatory - features. A machine will only be used to build a - derivation if all of the machine’s mandatory features appear in the - derivation’s requiredSystemFeatures attribute. - Thus, in the example, the machine poochie will - only do derivations that have - requiredSystemFeatures set to ["kvm" - "perf"] or ["perf"]. - - - -You should also set up the environment variable -NIX_CURRENT_LOAD to point at a directory (e.g., -/var/run/nix/current-load) that -build-remote.pl uses to remember how many builds -it is currently executing remotely. It doesn't look at the actual -load on the remote machine, so if you have multiple instances of Nix -running, they should use the same NIX_CURRENT_LOAD -file. Maybe in the future build-remote.pl will -look at the actual remote load. - - diff --git a/doc/manual/builtins.xml b/doc/manual/builtins.xml deleted file mode 100644 index 6a472291c3..0000000000 --- a/doc/manual/builtins.xml +++ /dev/null @@ -1,932 +0,0 @@ -
- -Built-in functions - - -This section lists the functions and constants built into the -Nix expression evaluator. (The built-in function -derivation is discussed above.) Some built-ins, -such as derivation, are always in scope of every -Nix expression; you can just access them right away. But to prevent -polluting the namespace too much, most built-ins are not in scope. -Instead, you can access them through the builtins -built-in value, which is a set that contains all built-in functions -and values. For instance, derivation is also -available as builtins.derivation. - - - - - - abort s - - Abort Nix expression evaluation, print error - message s. - - - - - builtins.add - e1 e2 - - Return the sum of the integers - e1 and - e2. - - - - - builtins.attrNames - set - - Return the names of the attributes in the set - set in a sorted list. For instance, - builtins.attrNames { y = 1; x = "foo"; } - evaluates to [ "x" "y" ]. There is no built-in - function attrValues, but you can easily - define it yourself: - - -attrValues = set: map (name: builtins.getAttr name set) (builtins.attrNames set); - - - - - - - baseNameOf s - - Return the base name of the - string s, that is, everything following - the final slash in the string. This is similar to the GNU - basename command. - - - - - builtins - - The set builtins contains all - the built-in functions and values. You can use - builtins to test for the availability of - features in the Nix installation, e.g., - - -if builtins ? getEnv then builtins.getEnv "PATH" else "" - - This allows a Nix expression to fall back gracefully on older Nix - installations that don’t have the desired built-in - function. - - - - - builtins.compareVersions - s1 s2 - - Compare two strings representing versions and - return -1 if version - s1 is older than version - s2, 0 if they are - the same, and 1 if - s1 is newer than - s2. The version comparison algorithm - is the same as the one used by nix-env - -u. - - - - - builtins.concatLists - lists - - Concatenate a list of lists into a single - list. - - - - - builtins.currentSystem - - The built-in value currentSystem - evaluates to the Nix platform identifier for the Nix installation - on which the expression is being evaluated, such as - "i686-linux" or - "powerpc-darwin". - - - - - - - - - - - derivation - attrs - - derivation is described in - . - - - - - dirOf s - - Return the directory part of the string - s, that is, everything before the final - slash in the string. This is similar to the GNU - dirname command. - - - - - builtins.div - e1 e2 - - Return the quotient of the integers - e1 and - e2. - - - - - builtins.elem - x xs - - Return true if a value equal to - x occurs in the list - xs, and false - otherwise. - - - - - builtins.elemAt - xs n - - Return element n from - the list xs. Elements are counted - starting from 0. A fatal error occurs in the index is out of - bounds. - - - - - builtins.filter - f xs - - Return a list consisting of the elements of - xs for which the function - f returns - true. - - - - - builtins.filterSource - e1 e2 - - - - This function allows you to copy sources into the Nix - store while filtering certain files. For instance, suppose that - you want to use the directory source-dir as - an input to a Nix expression, e.g. - - -stdenv.mkDerivation { - ... - src = ./source-dir; -} - - - However, if source-dir is a Subversion - working copy, then all those annoying .svn - subdirectories will also be copied to the store. Worse, the - contents of those directories may change a lot, causing lots of - spurious rebuilds. With filterSource you - can filter out the .svn directories: - - - src = builtins.filterSource - (path: type: type != "directory" || baseNameOf path != ".svn") - ./source-dir; - - - - - Thus, the first argument e1 - must be a predicate function that is called for each regular - file, directory or symlink in the source tree - e2. If the function returns - true, the file is copied to the Nix store, - otherwise it is omitted. The function is called with two - arguments. The first is the full path of the file. The second - is a string that identifies the type of the file, which is - either "regular", - "directory", "symlink" or - "unknown" (for other kinds of files such as - device nodes or fifos — but note that those cannot be copied to - the Nix store, so if the predicate returns - true for them, the copy will fail). - - - - - - - builtins.getAttr - s set - - getAttr returns the attribute - named s from - set. Evaluation aborts if the - attribute doesn’t exist. This is a dynamic version of the - . operator, since s - is an expression rather than an identifier. - - - - - builtins.getEnv - s - - getEnv returns the value of - the environment variable s, or an empty - string if the variable doesn’t exist. This function should be - used with care, as it can introduce all sorts of nasty environment - dependencies in your Nix expression. - - getEnv is used in Nix Packages to - locate the file ~/.nixpkgs/config.nix, which - contains user-local settings for Nix Packages. (That is, it does - a getEnv "HOME" to locate the user’s home - directory.) - - - - - builtins.hasAttr - s set - - hasAttr returns - true if set has an - attribute named s, and - false otherwise. This is a dynamic version of - the ? operator, since - s is an expression rather than an - identifier. - - - - - builtins.hashString - type s - - Return a base-16 representation of the - cryptographic hash of string s. The - hash algorithm specified by type must - be one of "md5", "sha1" or - "sha256". - - - - - builtins.head - list - - Return the first element of a list; abort - evaluation if the argument isn’t a list or is an empty list. You - can test whether a list is empty by comparing it with - []. - - - - - import - path - - Load, parse and return the Nix expression in the - file path. If path - is a directory, the file default.nix - in that directory is loaded. Evaluation aborts if the - file doesn’t exist or contains an incorrect Nix expression. - import implements Nix’s module system: you - can put any Nix expression (such as a set or a function) in a - separate file, and use it from Nix expressions in other - files. - - A Nix expression loaded by import must - not contain any free variables (identifiers - that are not defined in the Nix expression itself and are not - built-in). Therefore, it cannot refer to variables that are in - scope at the call site. For instance, if you have a calling - expression - - -rec { - x = 123; - y = import ./foo.nix; -} - - then the following foo.nix will give an - error: - - -x + 456 - - since x is not in scope in - foo.nix. If you want x - to be available in foo.nix, you should pass - it as a function argument: - - -rec { - x = 123; - y = import ./foo.nix x; -} - - and - - -x: x + 456 - - (The function argument doesn’t have to be called - x in foo.nix; any name - would work.) - - - - - builtins.intersectAttrs - e1 e2 - - Return a set consisting of the attributes in the - set e2 that also exist in the set - e1. - - - - - builtins.isAttrs - e - - Return true if - e evaluates to a set, and - false otherwise. - - - - - builtins.isList - e - - Return true if - e evaluates to a list, and - false otherwise. - - - - - builtins.isFunction - e - - Return true if - e evaluates to a function, and - false otherwise. - - - - - builtins.isString - e - - Return true if - e evaluates to a string, and - false otherwise. - - - - - builtins.isInt - e - - Return true if - e evaluates to an int, and - false otherwise. - - - - - builtins.isBool - e - - Return true if - e evaluates to a bool, and - false otherwise. - - - - - isNull - e - - Return true if - e evaluates to null, - and false otherwise. - - This function is deprecated; - just write e == null instead. - - - - - - - builtins.length - e - - Return the length of the list - e. - - - - - builtins.lessThan - e1 e2 - - Return true if the integer - e1 is less than the integer - e2, and false - otherwise. Evaluation aborts if either - e1 or e2 - does not evaluate to an integer. - - - - - builtins.listToAttrs - e - - Construct a set from a list specifying the names - and values of each attribute. Each element of the list should be - a set consisting of a string-valued attribute - name specifying the name of the attribute, and - an attribute value specifying its value. - Example: - - -builtins.listToAttrs - [ { name = "foo"; value = 123; } - { name = "bar"; value = 456; } - ] - - - evaluates to - - -{ foo = 123; bar = 456; } - - - - - - - map - f list - - Apply the function f to - each element in the list list. For - example, - - -map (x: "foo" + x) [ "bar" "bla" "abc" ] - - evaluates to [ "foobar" "foobla" "fooabc" - ]. - - - - - builtins.mul - e1 e2 - - Return the product of the integers - e1 and - e2. - - - - - builtins.parseDrvName - s - - Split the string s into - a package name and version. The package name is everything up to - but not including the first dash followed by a digit, and the - version is everything following that dash. The result is returned - in a set { name, version }. Thus, - builtins.parseDrvName "nix-0.12pre12876" - returns { name = "nix"; version = "0.12pre12876"; - }. - - - - - builtins.pathExists - path - - Return true if the path - path exists, and - false otherwise. One application of this - function is to conditionally include a Nix expression containing - user configuration: - - -let - fileName = builtins.getEnv "CONFIG_FILE"; - config = - if fileName != "" && builtins.pathExists (builtins.toPath fileName) - then import (builtins.toPath fileName) - else { someSetting = false; }; # default configuration -in config.someSetting - - (Note that CONFIG_FILE must be an absolute path for - this to work.) - - - - - - - - builtins.readFile - path - - Return the contents of the file - path as a string. - - - - - removeAttrs - set list - - Remove the attributes listed in - list from - set. The attributes don’t have to - exist in set. For instance, - - -removeAttrs { x = 1; y = 2; z = 3; } [ "a" "x" "z" ] - - evaluates to { y = 2; }. - - - - - builtins.stringLength - e - - Return the length of the string - e. If e is - not a string, evaluation is aborted. - - - - - builtins.sub - e1 e2 - - Return the difference between the integers - e1 and - e2. - - - - - builtins.substring - start len - s - - Return the substring of - s from character position - start (zero-based) up to but not - including start + len. If - start is greater than the length of the - string, an empty string is returned, and if start + - len lies beyond the end of the string, only the - substring up to the end of the string is returned. - start must be - non-negative. - - - - - builtins.tail - list - - Return the second to last elements of a list; - abort evaluation if the argument isn’t a list or is an empty - list. - - - - - throw - s - - Throw an error message - s. This usually aborts Nix expression - evaluation, but in nix-env -qa and other - commands that try to evaluate a set of derivations to get - information about those derivations, a derivation that throws an - error is silently skipped (which is not the case for - abort). - - - - - builtins.toFile - name s - - Store the string s in a - file in the Nix store and return its path. The file has suffix - name. This file can be used as an - input to derivations. One application is to write builders - “inline”. For instance, the following Nix expression combines - and into one file: - - -{ stdenv, fetchurl, perl }: - -stdenv.mkDerivation { - name = "hello-2.1.1"; - - builder = builtins.toFile "builder.sh" " - source $stdenv/setup - - PATH=$perl/bin:$PATH - - tar xvfz $src - cd hello-* - ./configure --prefix=$out - make - make install - "; - - src = fetchurl { - url = http://nix.cs.uu.nl/dist/tarballs/hello-2.1.1.tar.gz; - md5 = "70c9ccf9fac07f762c24f2df2290784d"; - }; - inherit perl; -} - - - - It is even possible for one file to refer to another, e.g., - - - builder = let - configFile = builtins.toFile "foo.conf" " - # This is some dummy configuration file. - ... - "; - in builtins.toFile "builder.sh" " - source $stdenv/setup - ... - cp ${configFile} $out/etc/foo.conf - "; - - Note that ${configFile} is an antiquotation - (see ), so the result of the - expression configFile (i.e., a path like - /nix/store/m7p7jfny445k...-foo.conf) will be - spliced into the resulting string. - - It is however not allowed to have files - mutually referring to each other, like so: - - -let - foo = builtins.toFile "foo" "...${bar}..."; - bar = builtins.toFile "bar" "...${foo}..."; -in foo - - This is not allowed because it would cause a cyclic dependency in - the computation of the cryptographic hashes for - foo and bar. - - - - - builtins.toJSON e - - Return a string containing a JSON representation - of e. Strings, integers, booleans, - nulls and lists are mapped to their JSON equivalents. Sets - (except derivations) are represented as objects. Derivations are - translated to a JSON string containing the derivation’s output - path. Paths are copied to the store and represented as a JSON - string of the resulting store path. - - - - builtins.toPath s - - Convert the string value - s into a path value. The string - s must represent an absolute path - (i.e., must start with /). The path need not - exist. The resulting path is canonicalised, e.g., - builtins.toPath "//foo/xyzzy/../bar/" returns - /foo/bar. - - - - - toString e - - Convert the expression - e to a string. - e can be a string (in which case - toString is a no-op) or a path (e.g., - toString /foo/bar yields - "/foo/bar". - - - - - builtins.toXML e - - Return a string containing an XML representation - of e. The main application for - toXML is to communicate information with the - builder in a more structured format than plain environment - variables. - - - - shows an example where this is - the case. The builder is supposed to generate the configuration - file for a Jetty - servlet container. A servlet container contains a number - of servlets (*.war files) each exported under - a specific URI prefix. So the servlet configuration is a list of - sets containing the path and - war of the servlet (). This kind of information is - difficult to communicate with the normal method of passing - information through an environment variable, which just - concatenates everything together into a string (which might just - work in this case, but wouldn’t work if fields are optional or - contain lists themselves). Instead the Nix expression is - converted to an XML representation with - toXML, which is unambiguous and can easily be - processed with the appropriate tools. For instance, in the - example an XSLT stylesheet () is applied to it () to - generate the XML configuration file for the Jetty server. The XML - representation produced from by toXML is shown in . - - Note that uses the toFile built-in to write the - builder and the stylesheet “inline” in the Nix expression. The - path of the stylesheet is spliced into the builder at - xsltproc ${stylesheet} - .... - - Passing information to a builder - using <function>toXML</function> - - $out/server-conf.xml]]> - - - - - - - - - - - - - "; - - servlets = builtins.toXML []]> - - - - XML representation produced by - <function>toXML</function> - - - - - - - - - - - - - - - - - - - - - -]]> - - - - - - - - - builtins.trace - e1 e2 - - Evaluate e1 and print its - abstract syntax representation on standard error. Then return - e2. This function is useful for - debugging. - - - - - builtins.typeOf - e - - Return a string representing the type of the value - e, namely "int", - "bool", "string", - "path", "null", - "set", "list" or - "lambda". - - - - - - - -
diff --git a/doc/manual/conf-file.xml b/doc/manual/conf-file.xml deleted file mode 100644 index 327d22c4a1..0000000000 --- a/doc/manual/conf-file.xml +++ /dev/null @@ -1,474 +0,0 @@ - - - - nix.conf - 5 - Nix - - - - - nix.conf - Nix configuration file - - -Description - -A number of persistent settings of Nix are stored in the file -sysconfdir/nix/nix.conf. -This file is a list of name = -value pairs, one per line. -Comments start with a # character. Here is an example -configuration file: - - -gc-keep-outputs = true # Nice for developers -gc-keep-derivations = true # Idem -env-keep-derivations = false - - -You can override settings using the -flag, e.g. --option gc-keep-outputs false. - -The following settings are currently available: - - - - - gc-keep-outputs - - If true, the garbage collector - will keep the outputs of non-garbage derivations. If - false (default), outputs will be deleted unless - they are GC roots themselves (or reachable from other roots). - - In general, outputs must be registered as roots separately. - However, even if the output of a derivation is registered as a - root, the collector will still delete store paths that are used - only at build time (e.g., the C compiler, or source tarballs - downloaded from the network). To prevent it from doing so, set - this option to true. - - - - - gc-keep-derivations - - If true (default), the garbage - collector will keep the derivations from which non-garbage store - paths were built. If false, they will be - deleted unless explicitly registered as a root (or reachable from - other roots). - - Keeping derivation around is useful for querying and - traceability (e.g., it allows you to ask with what dependencies or - options a store path was built), so by default this option is on. - Turn it off to safe a bit of disk space (or a lot if - gc-keep-outputs is also turned on). - - - - - env-keep-derivations - - If false (default), derivations - are not stored in Nix user environments. That is, the derivation - any build-time-only dependencies may be garbage-collected. - - If true, when you add a Nix derivation to - a user environment, the path of the derivation is stored in the - user environment. Thus, the derivation will not be - garbage-collected until the user environment generation is deleted - (nix-env --delete-generations). To prevent - build-time-only dependencies from being collected, you should also - turn on gc-keep-outputs. - - The difference between this option and - gc-keep-derivations is that this one is - “sticky”: it applies to any user environment created while this - option was enabled, while gc-keep-derivations - only applies at the moment the garbage collector is - run. - - - - - build-max-jobs - - This option defines the maximum number of jobs - that Nix will try to build in parallel. The default is - 1. You should generally set it to the number - of CPUs in your system (e.g., 2 on an Athlon 64 - X2). It can be overridden using the () - command line switch. - - - - - build-cores - - Sets the value of the - NIX_BUILD_CORES environment variable in the - invocation of builders. Builders can use this variable at their - discretion to control the maximum amount of parallelism. For - instance, in Nixpkgs, if the derivation attribute - enableParallelBuilding is set to - true, the builder passes the - flag to GNU Make. - It can be overridden using the command line switch and - defaults to 1. The value 0 - means that the builder should use all available CPU cores in the - system. - - - - - build-max-silent-time - - - - This option defines the maximum number of seconds that a - builder can go without producing any data on standard output or - standard error. This is useful (for instance in an automated - build system) to catch builds that are stuck in an infinite - loop, or to catch remote builds that are hanging due to network - problems. It can be overridden using the command - line switch. - - The value 0 means that there is no - timeout. This is also the default. - - - - - - - build-timeout - - - - This option defines the maximum number of seconds that a - builder can run. This is useful (for instance in an automated - build system) to catch builds that are stuck in an infinite loop - but keep writing to their standard output or standard error. It - can be overridden using the command line - switch. - - The value 0 means that there is no - timeout. This is also the default. - - - - - - - build-max-log-size - - - - This option defines the maximum number of bytes that a - builder can write to its stdout/stderr. If the builder exceeds - this limit, it’s killed. A value of 0 (the - default) means that there is no limit. - - - - - - - build-users-group - - This options specifies the Unix group containing - the Nix build user accounts. In multi-user Nix installations, - builds should not be performed by the Nix account since that would - allow users to arbitrarily modify the Nix store and database by - supplying specially crafted builders; and they cannot be performed - by the calling user since that would allow him/her to influence - the build result. - - Therefore, if this option is non-empty and specifies a valid - group, builds will be performed under the user accounts that are a - member of the group specified here (as listed in - /etc/group). Those user accounts should not - be used for any other purpose! - - Nix will never run two builds under the same user account at - the same time. This is to prevent an obvious security hole: a - malicious user writing a Nix expression that modifies the build - result of a legitimate Nix expression being built by another user. - Therefore it is good to have as many Nix build user accounts as - you can spare. (Remember: uids are cheap.) - - The build users should have permission to create files in - the Nix store, but not delete them. Therefore, - /nix/store should be owned by the Nix - account, its group should be the group specified here, and its - mode should be 1775. - - If the build users group is empty, builds will be performed - under the uid of the Nix process (that is, the uid of the caller - if NIX_REMOTE is empty, the uid under which the Nix - daemon runs if NIX_REMOTE is - daemon). Obviously, this should not be used in - multi-user settings with untrusted users. - - - - - - - build-use-chroot - - If set to true, builds will be - performed in a chroot environment, i.e., the - build will be isolated from the normal file system hierarchy and - will only see the Nix store, the temporary build directory, and - the directories configured with the build-chroot-dirs - option (such as /proc and - /dev). This is useful to prevent undeclared - dependencies on files in directories such as - /usr/bin. - - The use of a chroot requires that Nix is run as root (but - you can still use the “build users” feature to - perform builds under different users than root). Currently, - chroot builds only work on Linux because Nix uses “bind mounts” to - make the Nix store and other directories available inside the - chroot. - - - - - - - build-chroot-dirs - - When builds are performed in a chroot environment, - Nix will mount some directories from the normal file system - hierarchy inside the chroot. These are the Nix store, the - temporary build directory (usually - /tmp/nix-build-drvname-number), - the /proc filesystem, and the directories - listed here. The default is /dev /dev/pts, - since these contain files needed by many builds (such as - /dev/null). You can use the syntax - target=source - to mount a path in a different location in the chroot; for - instance, /bin=/nix-bin will mount the - directory /nix-bin as /bin - inside the chroot. - - - - - build-use-substitutes - - If set to true (default), Nix - will use binary substitutes if available. This option can be - disabled to force building from source. - - - - - build-fallback - - If set to true, Nix will fall - back to building from source if a binary substitute fails. This - is equivalent to the flag. The - default is false. - - - - - build-cache-failures - - If set to true, Nix will - “cache” build failures, meaning that it will remember (in its - database) that a derivation previously failed. If you then try to - build the derivation again, Nix will immediately fail rather than - perform the build again. Failures in fixed-output derivations - (such as fetchurl calls) are never cached. - The “failed” status of a derivation can be cleared using - nix-store --clear-failed-paths. By default, - failure caching is disabled. - - - - - build-keep-log - - If set to true (the default), - Nix will write the build log of a derivation (i.e. the standard - output and error of its builder) to the directory - /nix/var/log/nix/drvs. The build log can be - retrieved using the command nix-store -l - path. - - - - - build-compress-log - - If set to true (the default), - build logs written to /nix/var/log/nix/drvs - will be compressed on the fly using bzip2. Otherwise, they will - not be compressed. - - - - - use-binary-caches - - If set to true (the default), - Nix will check the binary caches specified by - and related options to obtain - binary substitutes. - - - - - binary-caches - - A list of URLs of binary caches, separated by - whitespace. The default is - http://cache.nixos.org. - - - - - binary-caches-files - - A list of names of files that will be read to - obtain additional binary cache URLs. The default is - /nix/var/nix/profiles/per-user/username/channels/binary-caches/*. - Note that when you’re using the Nix daemon, - username is always equal to - root, so Nix will only use the binary caches - provided by the channels installed by root. Do not set this - option to read files created by untrusted users! - - - - - trusted-binary-caches - - A list of URLs of binary caches, separated by - whitespace. These are not used by default, but can be enabled by - users of the Nix daemon by specifying --option - binary-caches urls on the - command line. Unprivileged users are only allowed to pass a - subset of the URLs listed in binary-caches and - trusted-binary-caches. - - - - - extra-binary-caches - - Additional binary caches appended to those - specified in and - . When used by unprivileged - users, untrusted binary caches (i.e. those not listed in - ) are silently - ignored. - - - - - binary-caches-parallel-connections - - The maximum number of parallel HTTP connections - used by the binary cache substituter to get NAR info files. This - number should be high to minimise latency. It defaults to - 150. - - - - - force-manifest - - If this option is set to false - (default) and a Nix channel provides both a manifest and a binary - cache, only the binary cache will be used. If set to - true, the manifest will be fetched as well. - This is useful if you want to use binary patches (which are - currently not supported by binary caches). - - - - - system - - This option specifies the canonical Nix system - name of the current installation, such as - i686-linux or - powerpc-darwin. Nix can only build derivations - whose system attribute equals the value - specified here. In general, it never makes sense to modify this - value from its default, since you can use it to ‘lie’ about the - platform you are building on (e.g., perform a Mac OS build on a - Linux machine; the result would obviously be wrong). It only - makes sense if the Nix binaries can run on multiple platforms, - e.g., ‘universal binaries’ that run on powerpc-darwin and - i686-darwin. - - It defaults to the canonical Nix system name detected by - configure at build time. - - - - - fsync-metadata - - If set to true, changes to the - Nix store metadata (in /nix/var/nix/db) are - synchronously flushed to disk. This improves robustness in case - of system crashes, but reduces performance. The default is - true. - - - - - auto-optimise-store - - If set to true, Nix - automatically detects files in the store that have identical - contents, and replaces them with hard links to a single copy. - This saves disk space. If set to false (the - default), you can still run nix-store - --optimise to get rid of duplicate - files. - - - - - connect-timeout - - - - The timeout (in seconds) for establishing connections in - the binary cache substituter. It corresponds to - curl’s - option. - - - - - - - - - - - - - diff --git a/doc/manual/env-common.xml b/doc/manual/env-common.xml deleted file mode 100644 index 9e97e58f57..0000000000 --- a/doc/manual/env-common.xml +++ /dev/null @@ -1,347 +0,0 @@ -
- -Common environment variables - - -Most Nix commands interpret the following environment variables: - - - - -NIX_PATH - - - - A colon-separated list of directories used to look up Nix - expressions enclosed in angle brackets (i.e., - <path>). For - instance, the value - - -/home/eelco/Dev:/etc/nixos - - will cause Nix to look for paths relative to - /home/eelco/Dev and - /etc/nixos, in that order. It is also - possible to match paths against a prefix. For example, the value - - -nixpkgs=/home/eelco/Dev/nixpkgs-branch:/etc/nixos - - will cause Nix to search for - <nixpkgs/path> in - /home/eelco/Dev/nixpkgs-branch/path - and - /etc/nixos/nixpkgs/path. - - - The search path can be extended using the - option, which takes precedence over - NIX_PATH. - - - - -NIX_IGNORE_SYMLINK_STORE - - - - Normally, the Nix store directory (typically - /nix/store) is not allowed to contain any - symlink components. This is to prevent “impure” builds. Builders - sometimes “canonicalise” paths by resolving all symlink components. - Thus, builds on different machines (with - /nix/store resolving to different locations) - could yield different results. This is generally not a problem, - except when builds are deployed to machines where - /nix/store resolves differently. If you are - sure that you’re not going to do that, you can set - NIX_IGNORE_SYMLINK_STORE to 1. - - Note that if you’re symlinking the Nix store so that you can - put it on another file system than the root file system, on Linux - you’re better off using bind mount points, e.g., - - -$ mkdir /nix -$ mount -o bind /mnt/otherdisk/nix /nix - - Consult the mount - 8 manual page for details. - - - - - - -NIX_STORE_DIR - - Overrides the location of the Nix store (default - prefix/store). - - - - -NIX_DATA_DIR - - Overrides the location of the Nix static data - directory (default - prefix/share). - - - - -NIX_LOG_DIR - - Overrides the location of the Nix log directory - (default prefix/log/nix). - - - - -NIX_STATE_DIR - - Overrides the location of the Nix state directory - (default prefix/var/nix). - - - - -NIX_DB_DIR - - Overrides the location of the Nix database (default - $NIX_STATE_DIR/db, i.e., - prefix/var/nix/db). - - - - -NIX_CONF_DIR - - Overrides the location of the Nix configuration - directory (default - prefix/etc/nix). - - - - -NIX_LOG_TYPE - - Equivalent to the - option. - - - - -TMPDIR - - Use the specified directory to store temporary - files. In particular, this includes temporary build directories; - these can take up substantial amounts of disk space. The default is - /tmp. - - - - -NIX_BUILD_HOOK - - - - Specifies the location of the build hook, - which is a program (typically some script) that Nix will call - whenever it wants to build a derivation. This is used to implement - distributed builds (see ). - - - - - - - - - -NIX_REMOTE - - This variable should be set to - daemon if you want to use the Nix daemon to - execute Nix operations. This is necessary in multi-user Nix installations. - Otherwise, it should be left unset. - - - - -NIX_OTHER_STORES - - This variable contains the paths of remote Nix - installations from which packages can be copied, separated by colons. - See for details. Each path should be the - /nix directory of a remote Nix installation - (i.e., not the /nix/store directory). The - paths are subject to globbing, so you can set it so something like - /var/run/nix/remote-stores/*/nix and mount - multiple remote filesystems in - /var/run/nix/remote-stores. - - Note that if you’re building through the Nix daemon, the only setting for - this variable that matters is the one that the - nix-daemon process uses. So if you want to - change it, you have to restart the daemon. - - - - -NIX_SHOW_STATS - - If set to 1, Nix will print some - evaluation statistics, such as the number of values - allocated. - - - - -NIX_COUNT_CALLS - - If set to 1, Nix will print how - often functions were called during Nix expression evaluation. This - is useful for profiling your Nix expressions. - - - - -GC_INITIAL_HEAP_SIZE - - If Nix has been configured to use the Boehm garbage - collector, this variable sets the initial size of the heap in bytes. - It defaults to 384 MiB. Setting it to a low value reduces memory - consumption, but will increase runtime due to the overhead of - garbage collection. - - - - - - - -
diff --git a/doc/manual/figures/user-environments.png b/doc/manual/figures/user-environments.png deleted file mode 100644 index 1f781cf23ce560526091af2c74d59d3406182fb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85031 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�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 diff --git a/doc/manual/figures/user-environments.sxd b/doc/manual/figures/user-environments.sxd deleted file mode 100644 index bc661b6406fb855dd06436bb8f10986c9c44ffac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8412 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 dF5Gwji - -Glossary - - - - - -derivation - - A description of a build action. The result of a - derivation is a store object. Derivations are typically specified - in Nix expressions using the derivation - primitive. These are translated into low-level - store derivations (implicitly by - nix-env and nix-build, or - explicitly by nix-instantiate). - - - - -store - - The location in the file system where store objects - live. Typically /nix/store. - - - - -store path - - The location in the file system of a store object, - i.e., an immediate child of the Nix store - directory. - - - - -store object - - A file that is an immediate child of the Nix store - directory. These can be regular files, but also entire directory - trees. Store objects can be sources (objects copied from outside of - the store), derivation outputs (objects produced by running a build - action), or derivations (files describing a build - action). - - - - -substitute - - A substitute is a command invocation stored in the - Nix database that describes how to build a store object, bypassing - normal the build mechanism (i.e., derivations). Typically, the - substitute builds the store object by downloading a pre-built - version of the store object from some server. - - - - -purity - - The assumption that equal Nix derivations when run - always produce the same output. This cannot be guaranteed in - general (e.g., a builder can rely on external inputs such as the - network or the system time) but the Nix model assumes - it. - - - - -Nix expression - - A high-level description of software packages and - compositions thereof. Deploying software using Nix entails writing - Nix expressions for your packages. Nix expressions are translated - to derivations that are stored in the Nix store. These derivations - can then be built. - - - - -reference - - A store path P is said to have a - reference to a store path Q if the store object - at P contains the path Q - somewhere. This implies than an execution involving - P potentially needs Q to be - present. The references of a store path are - the set of store paths to which it has a reference. - - - - -closure - - The closure of a store path is the set of store - paths that are directly or indirectly “reachable” from that store - path; that is, it’s the closure of the path under the references relation. For instance, - if the store object at path P contains a - reference to path Q, then Q is - in the closure of P. For correct deployment it - is necessary to deploy whole closures, since otherwise at runtime - files could be missing. The command nix-store - -qR prints out closures of store paths. - - - - -output path - - A store path produced by a derivation. - - - - -deriver - - The deriver of an output path is the store - derivation that built it. - - - - -validity - - A store path is considered - valid if it exists in the file system, is - listed in the Nix database as being valid, and if all paths in its - closure are also valid. - - - - -user environment - - An automatically generated store object that - consists of a set of symlinks to “active” applications, i.e., other - store paths. These are generated automatically by nix-env. See . - - - - - - -profile - - A symlink to the current user environment of a user, e.g., - /nix/var/nix/profiles/default. - - - - -NAR - - A Nix - ARchive. This is a serialisation of a path in - the Nix store. It can contain regular files, directories and - symbolic links. NARs are generated and unpacked using - nix-store --dump and nix-store - --restore. - - - - - - - - - diff --git a/doc/manual/hacking.xml b/doc/manual/hacking.xml deleted file mode 100644 index 1228285e12..0000000000 --- a/doc/manual/hacking.xml +++ /dev/null @@ -1,41 +0,0 @@ - - -Hacking - -This section provides some notes on how to hack on Nix. To get -the latest version of Nix from GitHub: - -$ git clone git://github.com/NixOS/nix.git -$ cd nix - - - -To build it and its dependencies: - -$ nix-build release.nix -A build.x86_64-linux - - - -To build all dependencies and start a shell in which all -environment variables are set up so that those dependencies can be -found: - -$ ./dev-shell - -To build Nix itself in this shell: - -[nix-shell]$ ./bootstrap -[nix-shell]$ configurePhase -[nix-shell]$ make - -To test it: - -[nix-shell]$ make install -[nix-shell]$ make installcheck - - - - - diff --git a/doc/manual/installation.xml b/doc/manual/installation.xml deleted file mode 100644 index 4c433a6bf7..0000000000 --- a/doc/manual/installation.xml +++ /dev/null @@ -1,474 +0,0 @@ - - - -Installation - - -

Supported platforms - -Nix is currently supported on the following platforms: - - - - Linux (particularly on x86, x86_64, and - PowerPC). - - Mac OS X. - - FreeBSD (only tested on Intel). - - - - - - - -Nix is pretty portable, so it should work on most other Unix -platforms as well. - -
- - -
Installing a binary distribution - -The easiest way to install Nix is to use a binary package. -Binary packages of the latest stable release are available for Fedora, -Debian, Ubuntu, Mac OS X and various other systems from the Nix homepage. -You can also get builds of the latest development release from our -continuous -build system. - -For Fedora, RPM packages are available. These can be installed -or upgraded using rpm -U. For example, - - -$ rpm -U nix-1.0-1.i386.rpm - - - -For Debian and Ubuntu, you can download a Deb package and -install it like this: - - -$ dpkg -i nix_1.0-1_amd64.deb - - - -For other platforms, including Mac OS X (Darwin), FreeBSD and -other Linux distributions, you can download a binary tarball. It -contains Nix and all its dependencies. You should unpack it somewhere -(e.g. in /tmp), and then run the script named -install inside the binary tarball: - - -alice$ cd /tmp -alice$ tar xfj nix-1.1-x86_64-darwin.tar.bz2 -alice$ cd nix-1.1-x86_64-darwin -alice$ ./install - - -You should run this under your usual user account, -not as root. The script will invoke -sudo to create /nix if it -doesn’t already exist. If you don’t have sudo, you -should manually create /nix first as root: - - -$ mkdir /nix -$ chown alice /nix - - - - -Nix can be uninstalled using rpm -e nix or -dpkg -r nix on RPM- and Dpkg-based systems, -respectively. After this you should manually remove the Nix store and -other auxiliary data, if desired: - - -$ rm -rf /nix - - - -
- - -
Installing Nix from source - -If no binary package is available, you can download and compile -a source distribution. - -
Prerequisites - - - - GNU Make. - - A fairly recent version of GCC/G++. Version 2.95 - and higher should work. Clang will also work. - - Perl 5.8 or higher. - - pkg-config to locate - dependencies. If your distribution does not provide it, you can get - it from . - - The bzip2 compressor program and the - libbz2 library. Thus you must have bzip2 - installed, including development headers and libraries. If your - distribution does not provide these, you can obtain bzip2 from . - - The SQLite embedded database library, version 3.6.19 - or higher. If your distribution does not provide it, please install - it from . - - The Perl DBI and DBD::SQLite libraries, which are - available from CPAN if your - distribution does not provide them. - - The Boehm - garbage collector to reduce the evaluator’s memory - consumption (optional). To enable it, install - pkgconfig and the Boehm garbage collector, and - pass the flag to - configure. - - The xmllint and - xsltproc programs to build this manual and the - man-pages. These are part of the libxml2 and - libxslt packages, respectively. You also need - the DocBook - XSL stylesheets and optionally the DocBook 5.0 RELAX NG - schemas. Note that these are only required if you modify the - manual sources or when you are building from the Git - repository. - - Recent versions of Bison and Flex to build the - parser. (This is because Nix needs GLR support in Bison and - reentrancy support in Flex.) For Bison, you need version 2.6, which - can be obtained from the GNU FTP - server. For Flex, you need version 2.5.35, which is - available on SourceForge. - Slightly older versions may also work, but ancient versions like the - ubiquitous 2.5.4a won't. Note that these are only required if you - modify the parser or when you are building from the Git - repository. - - - -
- - -
Obtaining a source distribution - -The source tarball of the most recent stable release can be -downloaded from the Nix homepage. -You can also grab the most -recent development release. - -Alternatively, the most recent sources of Nix can be obtained -from its Git -repository. For example, the following command will check out -the latest revision into a directory called -nix: - - -$ git clone https://github.com/NixOS/nix - -Likewise, specific releases can be obtained from the tags of the -repository. - -
- - -
Building Nix from source - -After unpacking or checking out the Nix sources, issue the -following commands: - - -$ ./configure options... -$ make -$ make install - -Nix requires GNU Make so you may need to invoke -gmake instead. - -When building from the Git repository, these should be preceded -by the command: - - -$ ./bootstrap.sh - - - -The installation path can be specified by passing the - to -configure. The default installation directory is -/usr/local. You can change this to any location -you like. You must have write permission to the -prefix path. - -Nix keeps its store (the place where -packages are stored) in /nix/store by default. -This can be changed using -. - -It is best not to change the Nix -store from its default, since doing so makes it impossible to use -pre-built binaries from the standard Nixpkgs channels — that is, all -packages will need to be built from source. - -Nix keeps state (such as its database and log files) in -/nix/var by default. This can be changed using -. - -If you want to rebuild the documentation, pass the full path to -the DocBook RELAX NG schemas and to the DocBook XSL stylesheets using -the - -and - -options. - -
- - -
- - - - - -
Security - -Nix has two basic security models. First, it can be used in -“single-user mode”, which is similar to what most other package -management tools do: there is a single user (typically root) who performs all package -management operations. All other users can then use the installed -packages, but they cannot perform package management operations -themselves. - -Alternatively, you can configure Nix in “multi-user mode”. In -this model, all users can perform package management operations — for -instance, every user can install software without requiring root -privileges. Nix ensures that this is secure. For instance, it’s not -possible for one user to overwrite a package used by another user with -a Trojan horse. - - -
Single-user mode - -In single-user mode, all Nix operations that access the database -in prefix/var/nix/db -or modify the Nix store in -prefix/store must be -performed under the user ID that owns those directories. This is -typically root. (If you -install from RPM packages, that’s in fact the default ownership.) -However, on single-user machines, it is often convenient to -chown those directories to your normal user account -so that you don’t have to su to root all the time. - -
- - -
Multi-user mode - -To allow a Nix store to be shared safely among multiple users, -it is important that users are not able to run builders that modify -the Nix store or database in arbitrary ways, or that interfere with -builds started by other users. If they could do so, they could -install a Trojan horse in some package and compromise the accounts of -other users. - -To prevent this, the Nix store and database are owned by some -privileged user (usually root) and builders are -executed under special user accounts (usually named -nixbld1, nixbld2, etc.). When a -unprivileged user runs a Nix command, actions that operate on the Nix -store (such as builds) are forwarded to a Nix -daemon running under the owner of the Nix store/database -that performs the operation. - -Multi-user mode has one important limitation: only -root can run nix-pull to register the availability -of pre-built binaries. However, those registrations are shared by all -users, so they still get the benefit from nix-pulls -done by root. - - -
Setting up the build users - -The build users are the special UIDs under -which builds are performed. They should all be members of the -build users group (usually called -nixbld). This group should have no other members. -The build users should not be members of any other group. - -Here is a typical /etc/group definition of -the build users group with 10 build users: - - -nixbld:!:30000:nixbld1,nixbld2,nixbld3,nixbld4,nixbld5,nixbld6,nixbld7,nixbld8,nixbld9,nixbld10 - - -In this example the nixbld group has UID 30000, but -of course it can be anything that doesn’t collide with an existing -group. - -Here is the corresponding part of -/etc/passwd: - - -nixbld1:x:30001:65534:Nix build user 1:/var/empty:/noshell -nixbld2:x:30002:65534:Nix build user 2:/var/empty:/noshell -nixbld3:x:30003:65534:Nix build user 3:/var/empty:/noshell -... -nixbld10:x:30010:65534:Nix build user 10:/var/empty:/noshell - - -The home directory of the build users should not exist or should be an -empty directory to which they do not have write access. - -The build users should have write access to the Nix store, but -they should not have the right to delete files. Thus the Nix store’s -group should be the build users group, and it should have the sticky -bit turned on (like /tmp): - - -$ chown root.nixbld /nix/store -$ chmod 1775 /nix/store - - - - -Finally, you should tell Nix to use the build users by -specifying the build users group in the build-users-group -option in the Nix configuration -file (usually /etc/nix/nix.conf): - - -build-users-group = nixbld - - - - -
- - -
Running the daemon - -The Nix daemon should be -started as follows (as root): - - -$ nix-daemon - -You’ll want to put that line somewhere in your system’s boot -scripts. - -To let unprivileged users use the daemon, they should set the -NIX_REMOTE environment -variable to daemon. So you should put a -line like - - -export NIX_REMOTE=daemon - -into the users’ login scripts. - -
- - -
Restricting access - -To limit which users can perform Nix operations, you can use the -permissions on the directory -/nix/var/nix/daemon-socket. For instance, if you -want to restrict the use of Nix to the members of a group called -nix-users, do - - -$ chgrp nix-users /nix/var/nix/daemon-socket -$ chmod ug=rwx,o= /nix/var/nix/daemon-socket - - -This way, users who are not in the nix-users group -cannot connect to the Unix domain socket -/nix/var/nix/daemon-socket/socket, so they cannot -perform Nix operations. - -
- - -
- - -
- - -
Using Nix - -To use Nix, some environment variables should be set. In -particular, PATH should contain the directories -prefix/bin and -~/.nix-profile/bin. The first directory contains -the Nix tools themselves, while ~/.nix-profile is -a symbolic link to the current user environment -(an automatically generated package consisting of symlinks to -installed packages). The simplest way to set the required environment -variables is to include the file -prefix/etc/profile.d/nix.sh -in your ~/.profile (or similar), like this: - - -source prefix/etc/profile.d/nix.sh - -
- - - diff --git a/doc/manual/introduction.xml b/doc/manual/introduction.xml deleted file mode 100644 index 21b1df1564..0000000000 --- a/doc/manual/introduction.xml +++ /dev/null @@ -1,337 +0,0 @@ - - -Introduction - - -
About Nix - -Nix is a purely functional package manager. -This means that it treats packages like values in purely functional -programming languages such as Haskell — they are built by functions -that don’t have side-effects, and they never change after they have -been built. Nix stores packages in the Nix -store, usually the directory -/nix/store, where each package has its own unique -subdirectory such as - - -/nix/store/nlc4z5y1hm8w9s8vm6m1f5hy962xjmp5-firefox-12.0 - - -where nlc4z5… is a unique identifier for the -package that captures all its dependencies (it’s a cryptographic hash -of the package’s build dependency graph). This enables many powerful -features. - - -Multiple versions - -You can have multiple versions or variants of a package -installed at the same time. This is especially important when -different applications have dependencies on different versions of the -same package — it prevents the “DLL hell”. Because of the hashing -scheme, different versions of a package end up in different paths in -the Nix store, so they don’t interfere with each other. - -An important consequence is that operations like upgrading or -uninstalling an application cannot break other applications, since -these operations never “destructively” update or delete files that are -used by other packages. - - - - -Complete dependencies - -Nix helps you make sure that package dependency specifications -are complete. In general, when you’re making a package for a package -management system like RPM, you have to specify for each package what -its dependencies are, but there are no guarantees that this -specification is complete. If you forget a dependency, then the -package will build and work correctly on your -machine if you have the dependency installed, but not on the end -user's machine if it's not there. - -Since Nix on the other hand doesn’t install packages in “global” -locations like /usr/bin but in package-specific -directories, the risk of incomplete dependencies is greatly reduced. -This is because tools such as compilers don’t search in per-packages -directories such as -/nix/store/5lbfaxb722zp…-openssl-0.9.8d/include, -so if a package builds correctly on your system, this is because you -specified the dependency explicitly. - -Runtime dependencies are found by scanning binaries for the hash -parts of Nix store paths (such as r8vvq9kq…). This -sounds risky, but it works extremely well. - - - - -Multi-user support - -Nix has multi-user support. This means that non-privileged -users can securely install software. Each user can have a different -profile, a set of packages in the Nix store that -appear in the user’s PATH. If a user installs a -package that another user has already installed previously, the -package won’t be built or downloaded a second time. At the same time, -it is not possible for one user to inject a Trojan horse into a -package that might be used by another user. - - - - - - -Atomic upgrades and rollbacks - -Since package management operations never overwrite packages in -the Nix store but just add new versions in different paths, they are -atomic. So during a package upgrade, there is no -time window in which the package has some files from the old version -and some files from the new version — which would be bad because a -program might well crash if it’s started during that period. - -And since package aren’t overwritten, the old versions are still -there after an upgrade. This means that you can roll -back to the old version: - - -$ nix-env --upgrade some-packages -$ nix-env --rollback - - - - - -Garbage collection - -When you uninstall a package like this… - - -$ nix-env --uninstall firefox - - -the package isn’t deleted from the system right away (after all, you -might want to do a rollback, or it might be in the profiles of other -users). Instead, unused packages can be deleted safely by running the -garbage collector: - - -$ nix-collect-garbage - - -This deletes all packages that aren’t in use by any user profile or by -a currently running program. - - - - -Functional package language - -Packages are built from Nix expressions, -which is a simple functional language. A Nix expression describes -everything that goes into a package build action (a “derivation”): -other packages, sources, the build script, environment variables for -the build script, etc. Nix tries very hard to ensure that Nix -expressions are deterministic: building a Nix -expression twice should yield the same result. - -Because it’s a functional language, it’s easy to support -building variants of a package: turn the Nix expression into a -function and call it any number of times with the appropriate -arguments. Due to the hashing scheme, variants don’t conflict with -each other in the Nix store. - - - - -Transparent source/binary deployment - -Nix expressions generally describe how to build a package from -source, so an installation action like - - -$ nix-env --install firefox - - -could cause quite a bit of build activity, as not -only Firefox but also all its dependencies (all the way up to the C -library and the compiler) would have to built, at least if they are -not already in the Nix store. This is a source deployment -model. For most users, building from source is not very -pleasant as it takes far too long. However, Nix can automatically -skip building from source and download a pre-built binary instead if -it knows about it. Nix channels provide Nix -expressions along with pre-built binaries. - - - - - - -Binary patching - -In addition to downloading binaries automatically if they’re -available, Nix can download binary deltas that patch an existing -package in the Nix store into a new version. This speeds up -upgrades. - - - - -Nix Packages collection - -We provide a large set of Nix expressions containing hundreds of -existing Unix packages, the Nix Packages -collection (Nixpkgs). - - - - -Service deployment - -Nix can be used not only for rolling out packages, but also -complete configurations of services. This is -done by treating all the static bits of a service (such as software -packages, configuration files, control scripts, static web pages, -etc.) as “packages” that can be built by Nix expressions. As a -result, all the features above apply to services as well: for -instance, you can roll back a web server configuration if a -configuration change turns out to be undesirable, you can easily have -multiple instances of a service (e.g., a test and production server), -and because the whole service is built in a purely functional way from -a Nix expression, it is repeatable so you can easily reproduce the -service on another machine. - - - - - - -Portability - -Nix should run on most Unix systems, including Linux, FreeBSD and -Mac OS X. - - - - -NixOS - -NixOS is a Linux distribution based on Nix. It uses Nix not -just for package management but also to manage the system -configuration (e.g., to build configuration files in -/etc). This means, among other things, that it’s -possible to easily roll back the entire configuration of the system to -an earlier state. Also, users can install software without root -privileges. For more information and downloads, see the NixOS homepage. - - - - - - -
- - -
About us - -Nix was originally developed at the Department of Information and -Computing Sciences, Utrecht University by the TraCE -project (2003-2008). The project was funded by the Software -Engineering Research Program Jacquard to improve the -support for variability in software systems. Further funding was -provided by the NIRICT LaQuSo Build Farm project. Development is -currently supported by LogicBlox. - -
- - -
About this manual - -This manual tells you how to install and use Nix and how to -write Nix expressions for software not already in the Nix Packages -collection. It also discusses some advanced topics, such as setting -up distributed multi-platform building. - -
- - -
License - -Nix is free software; you can redistribute it and/or modify it -under the terms of the GNU Lesser General -Public License as published by the Free Software Foundation; -either version 2.1 of the License, or (at your option) any later -version. Nix is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -
- - -
More information - -Some background information on Nix can be found in a number of -papers. The ICSE 2004 paper Imposing -a Memory Management Discipline on Software Deployment -discusses the hashing mechanism used to ensure reliable dependency -identification and non-interference between different versions and -variants of packages. The LISA 2004 paper Nix: -A Safe and Policy-Free System for Software Deployment -gives a more general discussion of Nix from a system-administration -perspective. The CBSE 2005 paper Efficient -Upgrading in a Purely Functional Component Deployment Model - is about transparent patch deployment in Nix. The SCM-12 -paper -Service Configuration Management shows how services (e.g., -web servers) can be deployed and managed through Nix. An overview of -NixOS is given in the JFP article NixOS: -A Purely Functional Linux Distribution. The Nix homepage -has an up-to-date -list of Nix-related papers. - -Nix is the subject of Eelco Dolstra’s PhD thesis The -Purely Functional Software Deployment Model, which -contains most of the papers listed above. - -Nix has a homepage at . - -
- - -
diff --git a/doc/manual/local.mk b/doc/manual/local.mk deleted file mode 100644 index 0e583b281c..0000000000 --- a/doc/manual/local.mk +++ /dev/null @@ -1,113 +0,0 @@ -XSLTPROC = $(xsltproc) --nonet $(xmlflags) \ - --param section.autolabel 1 \ - --param section.label.includes.component.label 1 \ - --param html.stylesheet \'style.css\' \ - --param xref.with.number.and.title 1 \ - --param toc.section.depth 3 \ - --param admon.style \'\' \ - --param callout.graphics.extension \'.gif\' \ - --param contrib.inline.enabled 0 - -MANUAL_SRCS := $(wildcard $(d)/*.xml) - - -# Do XInclude processing / RelaxNG validation -$(d)/manual.xmli: $(d)/manual.xml $(MANUAL_SRCS) $(d)/version.txt - $(trace-gen) $(xmllint) --nonet --xinclude $< -o $@.tmp - @mv $@.tmp $@ - -$(d)/version.txt: - $(trace-gen) echo -n $(PACKAGE_VERSION) > $@ - -# Note: RelaxNG validation requires xmllint >= 2.7.4. -$(d)/manual.is-valid: $(d)/manual.xmli - $(trace-gen) $(XSLTPROC) --novalid --stringparam profile.condition manual \ - $(docbookxsl)/profiling/profile.xsl $< 2> /dev/null | \ - $(xmllint) --nonet --noout --relaxng $(docbookrng)/docbook.rng - - @touch $@ - -clean-files += $(d)/manual.xmli $(d)/version.txt $(d)/manual.is-valid - -dist-files += $(d)/manual.xmli $(d)/version.txt $(d)/manual.is-valid - - -# Generate man pages. -man-pages := $(foreach n, \ - nix-env.1 nix-build.1 nix-shell.1 nix-store.1 nix-instantiate.1 \ - nix-collect-garbage.1 nix-push.1 nix-pull.1 \ - nix-prefetch-url.1 nix-channel.1 \ - nix-install-package.1 nix-hash.1 nix-copy-closure.1 \ - nix.conf.5 nix-daemon.8, \ - $(d)/$(n)) - -$(man-pages): $(d)/manual.xmli $(d)/manual.is-valid - $(trace-gen) $(XSLTPROC) --stringparam profile.condition manpage \ - $(docbookxsl)/profiling/profile.xsl $< 2> /dev/null | \ - (cd doc/manual && $(XSLTPROC) $(docbookxsl)/manpages/docbook.xsl -) - -clean-files += $(d)/*.1 $(d)/*.5 $(d)/*.8 - -dist-files += $(man-pages) - - -# Generate the HTML manual. -$(d)/manual.html: $(d)/manual.xml $(MANUAL_SRCS) $(d)/manual.is-valid - $(trace-gen) $(XSLTPROC) --xinclude --stringparam profile.condition manual \ - $(docbookxsl)/profiling/profile.xsl $< | \ - $(XSLTPROC) --output $@ $(docbookxsl)/html/docbook.xsl - - -$(foreach file, $(d)/manual.html $(d)/style.css, $(eval $(call install-data-in, $(file), $(docdir)/manual))) - -$(foreach file, $(wildcard $(d)/figures/*.png), $(eval $(call install-data-in, $(file), $(docdir)/manual/figures))) - -$(foreach file, $(wildcard $(docbookxsl)/images/callouts/*.gif), $(eval $(call install-data-in, $(file), $(docdir)/manual/images/callouts))) - -$(eval $(call install-symlink, manual.html, $(docdir)/manual/index.html)) - -all: $(d)/manual.html - -clean-files += $(d)/manual.html - -dist-files += $(d)/manual.html - - -# Generate the PDF manual. -$(d)/manual.pdf: $(d)/manual.xml $(MANUAL_SRCS) $(d)/manual.is-valid - $(trace-gen) if test "$(dblatex)" != ""; then \ - cd doc/manual && $(XSLTPROC) --xinclude --stringparam profile.condition manual \ - $(docbookxsl)/profiling/profile.xsl manual.xml | \ - $(dblatex) -o $(notdir $@) $(dblatex_opts) -; \ - else \ - echo "Please install dblatex and rerun configure."; \ - exit 1; \ - fi - -clean-files += $(d)/manual.pdf - - -# Generate the release notes. - -NEWS_OPTS = \ - --stringparam generate.toc "article nop" \ - --stringparam section.autolabel.max.depth 0 \ - --stringparam header.rule 0 - -$(d)/release-notes.html: $(d)/release-notes.xml - $(trace-gen) $(XSLTPROC) --xinclude --output $@ $(NEWS_OPTS) \ - $(docbookxsl)/html/docbook.xsl $< - -NEWS: $(d)/release-notes.xml - $(trace-gen) $(XSLTPROC) --xinclude doc/manual/quote-literals.xsl $< | \ - $(XSLTPROC) --output $@.tmp.html $(NEWS_OPTS) \ - $(docbookxsl)/html/docbook.xsl - && \ - LANG=en_US.UTF-8 $(w3m) -dump $@.tmp.html > $@.tmp && \ - sed -e 's/●/*/g' -e 's/○/-/g' -e 's/━/-/g' < $@.tmp > NEWS && \ - rm $@.tmp $@.tmp.html - -dist-files += NEWS $(d)/release-notes.html - -clean-files += NEWS $(d)/release-notes.html - -all: $(d)/release-notes.html NEWS - -$(foreach file, $(d)/release-notes.html, $(eval $(call install-data-in, $(file), $(docdir)/manual))) diff --git a/doc/manual/manual.xml b/doc/manual/manual.xml deleted file mode 100644 index 4d518e31e6..0000000000 --- a/doc/manual/manual.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - - - Nix User's Guide - - Version - - - - Eelco - Dolstra - - - LogicBlox - - Author - - - - 2004-2013 - Eelco Dolstra - - - July 2013 - - - - - - - - - - - - - - Command Reference - - - -
- Main commands - - - - -
- -
- Utilities - - - - - - - - - - -
- -
- Files - -
- -
- - - - - - - - Nix Release Notes - - - -
diff --git a/doc/manual/nix-build.xml b/doc/manual/nix-build.xml deleted file mode 100644 index 3832f5fc34..0000000000 --- a/doc/manual/nix-build.xml +++ /dev/null @@ -1,189 +0,0 @@ - - - - nix-build - 1 - Nix - - - - - nix-build - build a Nix expression - - - - - nix-build - - name value - name value - - - - - - attrPath - - drvlink - - - - - - - - outlink - - paths - - - -Description - -The nix-build command builds the derivations -described by the Nix expressions in paths. -If the build succeeds, it places a symlink to the result in the -current directory. The symlink is called result. -If there are multiple Nix expressions, or the Nix expressions evaluate -to multiple derivations, multiple sequentially numbered symlinks are -created (result, result-2, -and so on). - -If no paths are specified, then -nix-build will use default.nix -in the current directory, if it exists. - -nix-build is essentially a wrapper around -nix-instantiate -(to translate a high-level Nix expression to a low-level store -derivation) and nix-store ---realise (to build the store derivation). - -The result of the build is automatically registered as -a root of the Nix garbage collector. This root disappears -automatically when the result symlink is deleted -or renamed. So don’t rename the symlink. - - - - -Options - -All options not listed here are passed to nix-store ---realise, except for and - / which are passed to -nix-instantiate. See -also . - - - - drvlink - - Add a symlink named - drvlink to the store derivation - produced by nix-instantiate. The derivation is - a root of the garbage collector until the symlink is deleted or - renamed. If there are multiple derivations, numbers are suffixed - to drvlink to distinguish between - them. - - - - - - Shorthand for - ./derivation. - - - - - - Do not create a symlink to the output path. Note - that as a result the output does not become a root of the garbage - collector, and so might be deleted by nix-store - --gc. - - - - / - outlink - - Change the name of the symlink to the output path - created from result to - outlink. - - - - - -The following common options are supported: - - - - - - - - -Examples - - -$ nix-build '<nixpkgs>' -A firefox -store derivation is /nix/store/qybprl8sz2lc...-firefox-1.5.0.7.drv -/nix/store/d18hyl92g30l...-firefox-1.5.0.7 - -$ ls -l result -lrwxrwxrwx ... result -> /nix/store/d18hyl92g30l...-firefox-1.5.0.7 - -$ ls ./result/bin/ -firefox firefox-config - -If a derivation has multiple outputs, -nix-build will build the default (first) output. -You can also build all outputs: - -$ nix-build '<nixpkgs>' -A openssl.all - -This will create a symlink for each output named -result-outputname. -The suffix is omitted if the output name is out. -So if openssl has outputs out, -bin and man, -nix-build will create symlinks -result, result-bin and -result-man. It’s also possible to build a specific -output: - -$ nix-build '<nixpkgs>' -A openssl.man - -This will create a symlink result-man. - -Build a Nix expression given on the command line: - - -$ nix-build -E 'with import <nixpkgs> { }; runCommand "foo" { } "echo bar > $out"' -$ cat ./result -bar - - - - - - - -Environment variables - - - - - - - - - diff --git a/doc/manual/nix-channel.xml b/doc/manual/nix-channel.xml deleted file mode 100644 index 2c4e1151b0..0000000000 --- a/doc/manual/nix-channel.xml +++ /dev/null @@ -1,112 +0,0 @@ - - - - nix-channel - 1 - Nix - - - - - nix-channel - manage Nix channels - - - - - nix-channel - - url name - url - - names - - - - -Description - -A Nix channel is mechanism that allows you to automatically stay -up-to-date with a set of pre-built Nix expressions. A Nix channel is -just a URL that points to a place containing a set of Nix expressions -and a nix-push manifest. See also . - -This command has the following operations: - - - - url [name] - - Adds a channel named - name with URL - url to the list of subscribed channels. - If name is omitted, it defaults to the - last component of url, with the - suffixes -stable or - -unstable removed. - - - - name - - Removes the channel named - name from the list of subscribed - channels. - - - - - - Prints the names and URLs of all subscribed - channels on standard output. - - - - [names…] - - Downloads the Nix expressions of all subscribed - channels (or only those included in - names if specified), makes them the - default for nix-env operations (by symlinking - them from the directory ~/.nix-defexpr), and - performs a nix-pull on the manifests of all - channels to make pre-built binaries available. - - - - - - - -Note that does not automatically perform -an update. - -The list of subscribed channels is stored in -~/.nix-channels. - -A channel consists of two elements: a bzipped Tar archive -containing the Nix expressions, and a manifest created by -nix-push. These must be stored under -url/nixexprs.tar.bz2 and -url/MANIFEST, -respectively. - - - -Examples - -To subscribe to the Nixpkgs channel and install the GNU Hello package: - - -$ nix-channel --add http://nixos.org/channels/nixpkgs-unstable -$ nix-channel --update -$ nix-env -iA nixpkgs.hello - - - - diff --git a/doc/manual/nix-collect-garbage.xml b/doc/manual/nix-collect-garbage.xml deleted file mode 100644 index a97e3b7c6b..0000000000 --- a/doc/manual/nix-collect-garbage.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - nix-collect-garbage - 1 - Nix - - - - - nix-collect-garbage - delete unreachable store paths - - - - - nix-collect-garbage - - - period - - - - - - - - - - -Description - -The command nix-collect-garbage is mostly an -alias of nix-store ---gc, that is, it deletes all unreachable paths in -the Nix store to clean up your system. However, it provides two -additional options: (), -which deletes all old generations of all profiles in -/nix/var/nix/profiles by invoking -nix-env --delete-generations old on all profiles -(of course, this makes rollbacks to previous configurations -impossible); and - period, -where period is a value such as 30d, which deletes -all non-current generations that are older than the specified number of -days in all profiles in /nix/var/nix/profiles. - - - - -Example - -To delete from the Nix store everything that is not used by the -current generations of each profile, do - - -$ nix-collect-garbage -d - - - - - - diff --git a/doc/manual/nix-copy-closure.xml b/doc/manual/nix-copy-closure.xml deleted file mode 100644 index 30b3aaee3d..0000000000 --- a/doc/manual/nix-copy-closure.xml +++ /dev/null @@ -1,188 +0,0 @@ - - - - nix-copy-closure - 1 - Nix - - - - - nix-copy-closure - copy a closure to or from a remote machine via SSH - - - - - nix-copy-closure - - - - - - - - - - - - - - user@machine - - paths - - - - -Description - -nix-copy-closure gives you an easy and -efficient way to exchange software between machines. Given one or -more Nix store paths paths on the local -machine, nix-copy-closure computes the closure of -those paths (i.e. all their dependencies in the Nix store), and copies -all paths in the closure to the remote machine via the -ssh (Secure Shell) command. With the -, the direction is reversed: -the closure of paths on a remote machine is -copied to the Nix store on the local machine. - -This command is efficient because it only sends the store paths -that are missing on the target machine. - -Since nix-copy-closure calls -ssh, you may be asked to type in the appropriate -password or passphrase. In fact, you may be asked -twice because nix-copy-closure -currently connects twice to the remote machine, first to get the set -of paths missing on the target machine, and second to send the dump of -those paths. If this bothers you, use -ssh-agent. - - -Options - - - - - - Copy the closure of - paths from the local Nix store to the - Nix store on machine. This is the - default. - - - - - - Copy the closure of - paths from the Nix store on - machine to the local Nix - store. - - - - - - Let the sending machine cryptographically sign the - dump of each path with the key in - sysconfdir/nix/signing-key.sec. - If the user on the target machine does not have direct access to - the Nix store (i.e., if the target machine has a multi-user Nix - installation), then the target machine will check the dump against - sysconfdir/nix/signing-key.pub - before unpacking it in its Nix store. This allows secure sharing - of store paths between untrusted users on two machines, provided - that there is a trust relation between the Nix installations on - both machines (namely, they have matching public/secret - keys). - - - - / / - - Compress the dump of each path with respectively - gzip, bzip2 or - xz before sending it. The corresponding - decompression program must be installed on the target - machine. - - - - - - Show the progress of each path's transfer as it's made. - This requires the pv utility to be in PATH. - - - - - - Also copy the outputs of store derivations - included in the closure. - - - - / - - Attempt to download missing paths on the target - machine using Nix’s substitute mechanism. Any paths that cannot - be substituted on the target are still copied normally from the - source. This is useful, for instance, if the connection between - the source and target machine is slow, but the connection between - the target machine and nixos.org (the default - binary cache server) is fast. - - - - - - - - -Environment variables - - - - NIX_SSHOPTS - - Additional options to be passed to - ssh on the command line. - - - - - - - - -Examples - -Copy Firefox with all its dependencies to a remote machine: - - -$ nix-copy-closure --to alice@itchy.labs $(type -tP firefox) - - - -Copy Subversion from a remote machine and then install it into a -user environment: - - -$ nix-copy-closure --from alice@itchy.labs \ - /nix/store/0dj0503hjxy5mbwlafv1rsbdiyx1gkdy-subversion-1.4.4 -$ nix-env -i /nix/store/0dj0503hjxy5mbwlafv1rsbdiyx1gkdy-subversion-1.4.4 - - - - - - - - - - diff --git a/doc/manual/nix-daemon.xml b/doc/manual/nix-daemon.xml deleted file mode 100644 index c68605fd65..0000000000 --- a/doc/manual/nix-daemon.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - nix-daemon - 8 - Nix - - - - - nix-daemon - Nix multi-user support daemon - - - - - nix-daemon - - - - -Description - -The Nix daemon is necessary in multi-user Nix installations. It -performs build actions and other operations on the Nix store on behalf -of unprivileged users. - - - - - diff --git a/doc/manual/nix-env.xml b/doc/manual/nix-env.xml deleted file mode 100644 index 3bfcb15dba..0000000000 --- a/doc/manual/nix-env.xml +++ /dev/null @@ -1,1299 +0,0 @@ - - - - nix-env - 1 - Nix - - - - - nix-env - manipulate or query Nix user environments - - - - - nix-env - - name value - name value - - - - - - path - - - - - - - path - - - - system - - - operation - options - arguments - - - - -Description - -The command nix-env is used to manipulate Nix -user environments. User environments are sets of software packages -available to a user at some point in time. In other words, they are a -synthesised view of the programs available in the Nix store. There -may be many user environments: different users can have different -environments, and individual users can switch between different -environments. - -nix-env takes exactly one -operation flag which indicates the subcommand to -be performed. These are documented below. - - - - - - - -Common options - -This section lists the options that are common to all -operations. These options are allowed for every subcommand, though -they may not always have an effect. See -also . - - - - - - - Specifies the Nix expression (designated below as - the active Nix expression) used by the - , , and - operations to obtain - derivations. The default is - ~/.nix-defexpr. - - - - - - - Specifies the profile to be used by those - operations that operate on a profile (designated below as the - active profile). A profile is a sequence of - user environments called generations, one of - which is the current - generation. - - - - - - For the , - , , - , - and - operations, this flag will cause - nix-env to print what - would be done if this flag had not been - specified, without actually doing it. - - also prints out which paths will - be substituted (i.e., - downloaded) and which paths will be built from source (because no - substitute is available). - - - - system - - By default, operations such as show derivations matching any platform. This - option allows you to use derivations for the specified platform - system. - - - - - - - - - - - - - - - -Files - - - - ~/.nix-defexpr - - A directory that contains the default Nix - expressions used by the , - , and operations to obtain derivations. The - option may be used to override this - default. - - The Nix expressions in this directory are combined into a - single set, with each file as an attribute that has the name of - the file. Thus, if ~/.nix-defexpr contains - two files, foo and bar, - then the default Nix expression will essentially be - - -{ - foo = import ~/.nix-defexpr/foo; - bar = import ~/.nix-defexpr/bar; -} - - - - The command nix-channel places symlinks - to the downloaded Nix expressions from each subscribed channel in - this directory. - - - - - - ~/.nix-profile - - A symbolic link to the user's current profile. By - default, this symlink points to - prefix/var/nix/profiles/default. - The PATH environment variable should include - ~/.nix-profile/bin for the user environment - to be visible to the user. - - - - - - - - - - - -Operation <option>--install</option> - -Synopsis - - - nix-env - - - - - - - - - - - - - - args - - - - - -Description - -The install operation creates a new user environment, based on -the current generation of the active profile, to which a set of store -paths described by args is added. The -arguments args map to store paths in a -number of possible ways: - - - - By default, args is a set - of derivation names denoting derivations in the active Nix - expression. These are realised, and the resulting output paths are - installed. Currently installed derivations with a name equal to the - name of a derivation being added are removed unless the option - is - specified. - - If there are multiple derivations matching a name in - args that have the same name (e.g., - gcc-3.3.6 and gcc-4.1.1), then - the derivation with the highest priority is - used. A derivation can define a priority by declaring the - meta.priority attribute. This attribute should - be a number, with a higher value denoting a lower priority. The - default priority is 0. - - If there are multiple matching derivations with the same - priority, then the derivation with the highest version will be - installed. - - You can force the installation of multiple derivations with - the same name by being specific about the versions. For instance, - nix-env -i gcc-3.3.6 gcc-4.1.1 will install both - version of GCC (and will probably cause a user environment - conflict!). - - If - () is specified, the arguments are - attribute paths that select attributes from the - top-level Nix expression. This is faster than using derivation - names and unambiguous. To find out the attribute paths of available - packages, use nix-env -qaP '*'. - - If - path is given, - args is a set of names denoting installed - store paths in the profile path. This is - an easy way to copy user environment elements from one profile to - another. - - If is given, - args are Nix functions that are called with the - active Nix expression as their single argument. The derivations - returned by those function calls are installed. This allows - derivations to be specified in an unambiguous way, which is necessary - if there are multiple derivations with the same - name. - - If args are store - derivations, then these are realised, and the resulting - output paths are installed. - - If args are store paths - that are not store derivations, then these are realised and - installed. - - - - - - - - -Flags - - - - / - - Use only derivations for which a substitute is - registered, i.e., there is a pre-built binary available that can - be downloaded in lieu of building the derivation. Thus, no - packages will be built from source. - - - - - - - Do not remove derivations with a name matching one - of the derivations being installed. Usually, trying to have two - versions of the same package installed in the same generation of a - profile will lead to an error in building the generation, due to - file name clashes between the two versions. However, this is not - the case for all packages. - - - - - - - Remove all previously installed packages first. - This is equivalent to running nix-env -e '*' - first, except that everything happens in a single - transaction. - - - - - - - - -Examples - -To install a specific version of gcc from the -active Nix expression: - - -$ nix-env --install gcc-3.3.2 -installing `gcc-3.3.2' -uninstalling `gcc-3.1' - -Note the the previously installed version is removed, since - was not specified. - -To install an arbitrary version: - - -$ nix-env --install gcc -installing `gcc-3.3.2' - - - -To install using a specific attribute: - - -$ nix-env -i -A gcc40mips -$ nix-env -i -A xorg.xorgserver - - - -To install all derivations in the Nix expression foo.nix: - - -$ nix-env -f ~/foo.nix -i '*' - - - -To copy the store path with symbolic name gcc -from another profile: - - -$ nix-env -i --from-profile /nix/var/nix/profiles/foo -i gcc - - - -To install a specific store derivation (typically created by -nix-instantiate): - - -$ nix-env -i /nix/store/fibjb1bfbpm5mrsxc4mh2d8n37sxh91i-gcc-3.4.3.drv - - - -To install a specific output path: - - -$ nix-env -i /nix/store/y3cgx0xj1p4iv9x0pnnmdhr8iyg741vk-gcc-3.4.3 - - - -To install from a Nix expression specified on the command-line: - - -$ nix-env -f ./foo.nix -i -E \ - 'f: (f {system = "i686-linux";}).subversionWithJava' - -I.e., this evaluates to (f: (f {system = -"i686-linux";}).subversionWithJava) (import ./foo.nix), thus -selecting the subversionWithJava attribute from the -set returned by calling the function defined in -./foo.nix. - -A dry-run tells you which paths will be downloaded or built from -source: - - -$ nix-env -f pkgs/top-level/all-packages.nix -i f-spot --dry-run -(dry run; not doing anything) -installing `f-spot-0.0.10' -the following derivations will be built: - /nix/store/0g63jv9aagwbgci4nnzs2dkxqz84kdja-libgnomeprintui-2.12.1.tar.bz2.drv - /nix/store/0gfarvxq6sannsdw8a1ir40j1ys2mqb4-ORBit2-2.14.2.tar.bz2.drv - /nix/store/0i9gs5zc04668qiy60ga2rc16abkj7g8-sqlite-2.8.17.drv - ... -the following paths will be substituted: - /nix/store/8zbipvm4gp9jfqh9nnk1n3bary1a37gs-perl-XML-Parser-2.34 - /nix/store/b8a2bg7gnyvvvjjibp4axg9x1hzkw36c-mono-1.1.4 - ... - - - - - - - - - - - -Operation <option>--upgrade</option> - -Synopsis - - - nix-env - - - - - - - - - - - - args - - - - -Description - -The upgrade operation creates a new user environment, based on -the current generation of the active profile, in which all store paths -are replaced for which there are newer versions in the set of paths -described by args. Paths for which there -are no newer versions are left untouched; this is not an error. It is -also not an error if an element of args -matches no installed derivations. - -For a description of how args is -mapped to a set of store paths, see . If -args describes multiple store paths with -the same symbolic name, only the one with the highest version is -installed. - - - -Flags - - - - - - Only upgrade a derivation to newer versions. This - is the default. - - - - - - In addition to upgrading to newer versions, also - “upgrade” to derivations that have the same version. Version are - not a unique identification of a derivation, so there may be many - derivations that have the same version. This flag may be useful - to force “synchronisation” between the installed and available - derivations. - - - - - - Only “upgrade” to derivations - that have the same version. This may not seem very useful, but it - actually is, e.g., when there is a new release of Nixpkgs and you - want to replace installed applications with the same versions - built against newer dependencies (to reduce the number of - dependencies floating around on your system). - - - - - - In addition to upgrading to newer versions, also - “upgrade” to derivations that have the same or a lower version. - I.e., derivations may actually be downgraded depending on what is - available in the active Nix expression. - - - - - -For the other flags, see . - - - -Examples - - -$ nix-env --upgrade gcc -upgrading `gcc-3.3.1' to `gcc-3.4' - -$ nix-env -u gcc-3.3.2 --always (switch to a specific version) -upgrading `gcc-3.4' to `gcc-3.3.2' - -$ nix-env --upgrade pan -(no upgrades available, so nothing happens) - -$ nix-env -u '*' (try to upgrade everything) -upgrading `hello-2.1.2' to `hello-2.1.3' -upgrading `mozilla-1.2' to `mozilla-1.4' - - - -Versions - -The upgrade operation determines whether a derivation -y is an upgrade of a derivation -x by looking at their respective -name attributes. The names (e.g., -gcc-3.3.1 are split into two parts: the package -name (gcc), and the version -(3.3.1). The version part starts after the first -dash not following by a letter. x is considered an -upgrade of y if their package names match, and the -version of y is higher that that of -x. - -The versions are compared by splitting them into contiguous -components of numbers and letters. E.g., 3.3.1pre5 -is split into [3, 3, 1, "pre", 5]. These lists are -then compared lexicographically (from left to right). Corresponding -components a and b are compared -as follows. If they are both numbers, integer comparison is used. If -a is an empty string and b is a -number, a is considered less than -b. The special string component -pre (for pre-release) is -considered to be less than other components. String components are -considered less than number components. Otherwise, they are compared -lexicographically (i.e., using case-sensitive string comparison). - -This is illustrated by the following examples: - - -1.0 < 2.3 -2.1 < 2.3 -2.3 = 2.3 -2.5 > 2.3 -3.1 > 2.3 -2.3.1 > 2.3 -2.3.1 > 2.3a -2.3pre1 < 2.3 -2.3pre3 < 2.3pre12 -2.3a < 2.3c -2.3pre1 < 2.3c -2.3pre1 < 2.3q - - - - - - - - - - - -Operation <option>--uninstall</option> - -Synopsis - - - nix-env - - - - - drvnames - - - -Description - -The uninstall operation creates a new user environment, based on -the current generation of the active profile, from which the store -paths designated by the symbolic names -names are removed. - - - -Examples - - -$ nix-env --uninstall gcc -$ nix-env -e '*' (remove everything) - - - - - - - - - -Operation <option>--set-flag</option> - -Synopsis - - - nix-env - - name - value - drvnames - - - -Description - -The operation allows meta attributes -of installed packages to be modified. There are several attributes -that can be usefully modified, because they affect the behaviour of -nix-env or the user environment build -script: - - - - priority can be changed to - resolve filename clashes. The user environment build script uses - the meta.priority attribute of derivations to - resolve filename collisions between packages. Lower priority values - denote a higher priority. For instance, the GCC wrapper package and - the Binutils package in Nixpkgs both have a file - bin/ld, so previously if you tried to install - both you would get a collision. Now, on the other hand, the GCC - wrapper declares a higher priority than Binutils, so the former’s - bin/ld is symlinked in the user - environment. - - keep can be set to - true to prevent the package from being upgraded - or replaced. This is useful if you want to hang on to an older - version of a package. - - active can be set to - false to “disable” the package. That is, no - symlinks will be generated to the files of the package, but it - remains part of the profile (so it won’t be garbage-collected). It - can be set back to true to re-enable the - package. - - - - - - - -Examples - -To prevent the currently installed Firefox from being upgraded: - - -$ nix-env --set-flag keep true firefox - -After this, nix-env -u will ignore Firefox. - -To disable the currently installed Firefox, then install a new -Firefox while the old remains part of the profile: - - -$ nix-env -q \* -firefox-2.0.0.9 (the current one) - -$ nix-env --preserve-installed -i firefox-2.0.0.11 -installing `firefox-2.0.0.11' -building path(s) `/nix/store/myy0y59q3ig70dgq37jqwg1j0rsapzsl-user-environment' -collision between `/nix/store/...-firefox-2.0.0.11/bin/firefox' - and `/nix/store/...-firefox-2.0.0.9/bin/firefox'. -(i.e., can’t have two active at the same time) - -$ nix-env --set-flag active false firefox -setting flag on `firefox-2.0.0.9' - -$ nix-env --preserve-installed -i firefox-2.0.0.11 -installing `firefox-2.0.0.11' - -$ nix-env -q \* -firefox-2.0.0.11 (the enabled one) -firefox-2.0.0.9 (the disabled one) - - - -To make files from binutils take precedence -over files from gcc: - - -$ nix-env --set-flag priority 5 binutils -$ nix-env --set-flag priority 10 gcc - - - - - - - - - - - -Operation <option>--query</option> - -Synopsis - - - nix-env - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - attribute-path - - - - - names - - - - - -Description - -The query operation displays information about either the store -paths that are installed in the current generation of the active -profile (), or the derivations that are -available for installation in the active Nix expression -(). It only prints information about -derivations whose symbolic name matches one of -names. The wildcard * -shows all derivations. - -The derivations are sorted by their name -attributes. - - - - -Source selection - -The following flags specify the set of things on which the query -operates. - - - - - - The query operates on the store paths that are - installed in the current generation of the active profile. This - is the default. - - - - - - - The query operates on the derivations that are - available in the active Nix expression. - - - - - - - - -Queries - -The following flags specify what information to display about -the selected derivations. Multiple flags may be specified, in which -case the information is shown in the order given here. Note that the -name of the derivation is shown unless is -specified. - - - - - - - - Print the result in an XML representation suitable - for automatic processing by other tools. The root element is - called items, which contains a - item element for each available or installed - derivation. The fields discussed below are all stored in - attributes of the item - elements. - - - - - - Print the result in a JSON representation suitable - for automatic processing by other tools. - - - - / - - Show only derivations for which a substitute is - registered, i.e., there is a pre-built binary available that can - be downloaded in lieu of building the derivation. Thus, this - shows all packages that probably can be installed - quickly. - - - - - - - Print the status of the - derivation. The status consists of three characters. The first - is I or -, indicating - whether the derivation is currently installed in the current - generation of the active profile. This is by definition the case - for , but not for - . The second is P - or -, indicating whether the derivation is - present on the system. This indicates whether installation of an - available derivation will require the derivation to be built. The - third is S or -, indicating - whether a substitute is available for the - derivation. - - - - - - - Print the attribute path of - the derivation, which can be used to unambiguously select it using - the option - available in commands that install derivations like - nix-env --install. - - - - - - Suppress printing of the name - attribute of each derivation. - - - - / - - - Compare installed versions to available versions, - or vice versa (if is given). This is - useful for quickly seeing whether upgrades for installed - packages are available in a Nix expression. A column is added - with the following meaning: - - - - < version - - A newer version of the package is available - or installed. - - - - = version - - At most the same version of the package is - available or installed. - - - - > version - - Only older versions of the package are - available or installed. - - - - - ? - - No version of the package is available or - installed. - - - - - - - - - - - - Print the system attribute of - the derivation. - - - - - - Print the path of the store - derivation. - - - - - - Print the output path of the - derivation. - - - - - - Print a short (one-line) description of the - derivation, if available. The description is taken from the - meta.description attribute of the - derivation. - - - - - - Print all of the meta-attributes of the - derivation. This option is only available with - . - - - - - - - - -Examples - - -$ nix-env -q '*' (show installed derivations) -bison-1.875c -docbook-xml-4.2 -firefox-1.0.4 -MPlayer-1.0pre7 -ORBit2-2.8.3 -... - -$ nix-env -qa '*' (show available derivations) -firefox-1.0.7 -GConf-2.4.0.1 -MPlayer-1.0pre7 -ORBit2-2.8.3 -... - -$ nix-env -qas '*' (show status of available derivations) --P- firefox-1.0.7 (not installed but present) ---S GConf-2.4.0.1 (not present, but there is a substitute for fast installation) ---S MPlayer-1.0pre3 (i.e., this is not the installed MPlayer, even though the version is the same!) -IP- ORBit2-2.8.3 (installed and by definition present) -... - -(show available derivations in the Nix expression foo.nix) -$ nix-env -f ./foo.nix -qa '*' -foo-1.2.3 - -$ nix-env -qc '*' (compare installed versions to what’s available) -... -acrobat-reader-7.0 - ? (package is not available at all) -autoconf-2.59 = 2.59 (same version) -firefox-1.0.4 < 1.0.7 (a more recent version is available) -... - -(show info about a specific package, in XML) -$ nix-env -qa --xml --description firefox - - - -]]> - - - - - - - - - -Operation <option>--switch-profile</option> - -Synopsis - - - nix-env - - - - - path - - - - - -Description - -This operation makes path the current -profile for the user. That is, the symlink -~/.nix-profile is made to point to -path. - - - -Examples - - -$ nix-env -S ~/my-profile - - - - - - - - - -Operation <option>--list-generations</option> - -Synopsis - - - nix-env - - - - - - -Description - -This operation print a list of all the currently existing -generations for the active profile. These may be switched to using -the operation. It also prints -the creation date of the generation, and indicates the current -generation. - - - - -Examples - - -$ nix-env --list-generations - 95 2004-02-06 11:48:24 - 96 2004-02-06 11:49:01 - 97 2004-02-06 16:22:45 - 98 2004-02-06 16:24:33 (current) - - - - - - - - - -Operation <option>--delete-generations</option> - -Synopsis - - - nix-env - - generations - - - - - -Description - -This operation deletes the specified generations of the current -profile. The generations can be a list of generation numbers, the -special value old to delete all non-current -generations, or a value such as 30d to delete all -non-current generations older than the specified number of days. -Periodically deleting old generations is important to make garbage -collection effective. - - - -Examples - - -$ nix-env --delete-generations 3 4 8 - -$ nix-env --delete-generations 30d - -$ nix-env -p other_profile --delete-generations old - - - - - - - - - -Operation <option>--switch-generation</option> - -Synopsis - - - nix-env - - - - - generation - - - - - -Description - -This operation makes generation number -generation the current generation of the -active profile. That is, if the -profile is the path to -the active profile, then the symlink -profile is made to -point to -profile-generation-link, -which is in turn a symlink to the actual user environment in the Nix -store. - -Switching will fail if the specified generation does not exist. - - - - -Examples - - -$ nix-env -G 42 -switching from generation 50 to 42 - - - - - - - - - -Operation <option>--rollback</option> - -Synopsis - - - nix-env - - - - - -Description - -This operation switches to the “previous” generation of the -active profile, that is, the highest numbered generation lower than -the current generation, if it exists. It is just a convenience -wrapper around and -. - - - - -Examples - - -$ nix-env --rollback -switching from generation 92 to 91 - -$ nix-env --rollback -error: no generation older than the current (91) exists - - - - - - -Environment variables - - - - NIX_PROFILE - - Location of the Nix profile. Defaults to the - target of the symlink ~/.nix-profile, if it - exists, or /nix/var/nix/profiles/default - otherwise. - - - - - - - - - - diff --git a/doc/manual/nix-hash.xml b/doc/manual/nix-hash.xml deleted file mode 100644 index af4e361ff8..0000000000 --- a/doc/manual/nix-hash.xml +++ /dev/null @@ -1,164 +0,0 @@ - - - - nix-hash - 1 - Nix - - - - - nix-hash - compute the cryptographic hash of a path - - - - - nix-hash - - - - hashAlgo - path - - - nix-hash - - hash - - - nix-hash - - hash - - - - -Description - -The command nix-hash computes the -cryptographic hash of the contents of each -path and prints it on standard output. By -default, it computes an MD5 hash, but other hash algorithms are -available as well. The hash is printed in hexadecimal. - -The hash is computed over a serialisation -of each path: a dump of the file system tree rooted at the path. This -allows directories and symlinks to be hashed as well as regular files. -The dump is in the NAR format produced by nix-store -. Thus, nix-hash -path yields the same -cryptographic hash as nix-store --dump -path | md5sum. - - - - -Options - - - - - - Print the cryptographic hash of the contents of - each regular file path. That is, do - not compute the hash over the dump of - path. The result is identical to that - produced by the GNU commands md5sum and - sha1sum. - - - - - - Print the hash in a base-32 representation rather - than hexadecimal. This base-32 representation is more compact and - can be used in Nix expressions (such as in calls to - fetchurl). - - - - - - Truncate hashes longer than 160 bits (such as - SHA-256) to 160 bits. - - - - hashAlgo - - Use the specified cryptographic hash algorithm, - which can be one of md5, - sha1, and - sha256. - - - - - - Don’t hash anything, but convert the base-32 hash - representation hash to - hexadecimal. - - - - - - Don’t hash anything, but convert the hexadecimal - hash representation hash to - base-32. - - - - - - - - -Examples - -Computing hashes: - - -$ mkdir test -$ echo "hello" > test/world - -$ nix-hash test/ (MD5 hash; default) -8179d3caeff1869b5ba1744e5a245c04 - -$ nix-store --dump test/ | md5sum (for comparison) -8179d3caeff1869b5ba1744e5a245c04 - - -$ nix-hash --type sha1 test/ -e4fd8ba5f7bbeaea5ace89fe10255536cd60dab6 - -$ nix-hash --type sha1 --base32 test/ -nvd61k9nalji1zl9rrdfmsmvyyjqpzg4 - -$ nix-hash --type sha256 --flat test/ -error: reading file `test/': Is a directory - -$ nix-hash --type sha256 --flat test/world -5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03 - - - -Converting between hexadecimal and base-32: - - -$ nix-hash --type sha1 --to-base32 e4fd8ba5f7bbeaea5ace89fe10255536cd60dab6 -nvd61k9nalji1zl9rrdfmsmvyyjqpzg4 - -$ nix-hash --type sha1 --to-base16 nvd61k9nalji1zl9rrdfmsmvyyjqpzg4 -e4fd8ba5f7bbeaea5ace89fe10255536cd60dab6 - - - - - - - diff --git a/doc/manual/nix-install-package.xml b/doc/manual/nix-install-package.xml deleted file mode 100644 index 5a081cd9a6..0000000000 --- a/doc/manual/nix-install-package.xml +++ /dev/null @@ -1,198 +0,0 @@ - - - - nix-install-package - 1 - Nix - - - - - nix-install-package - install a Nix Package file - - - - - nix-install-package - - - - - - - path - - - - - - url - - - file - - - - - - -Description - -The command nix-install-package interactively -installs a Nix Package file (*.nixpkg), which is -a small file that contains a store path to be installed along with the -URL of a nix-push -manifest. The Nix Package file is either -file, or automatically downloaded from -url if the switch is -used. - -nix-install-package is used in one-click installs to download and -install pre-built binary packages with all necessary dependencies. -nix-install-package is intended to be associated -with the MIME type application/nix-package in a web -browser so that it is invoked automatically when you click on -*.nixpkg files. When invoked, it restarts itself -in a terminal window (since otherwise it would be invisible when run -from a browser), asks the user to confirm whether to install the -package, and if so downloads and installs the package into the user’s -current profile. - -To obtain a window, nix-install-package tries -to restart itself with xterm, -konsole and -gnome-terminal. - - - - -Options - - - - - - Do not open a new terminal window and do not ask - for confirmation. - - - - - - - Install the package into the specified profile - rather than the user’s current profile. - - - - - - - - -Examples - -To install subversion-1.4.0.nixpkg into the -user’s current profile, without any prompting: - - -$ nix-install-package --non-interactive subversion-1.4.0.nixpkg - - - -To install the same package from some URL into a different -profile: - - -$ nix-install-package --non-interactive -p /nix/var/nix/profiles/eelco \ - --url http://nix.cs.uu.nl/dist/nix/nixpkgs-0.10pre6622/pkgs/subversion-1.4.0-i686-linux.nixpkg - - - - - - -Format of <literal>nixpkg</literal> files - -A Nix Package file consists of a single line with the following -format: - - -NIXPKG1 manifestURL name system drvPath outPath - -The elemens are as follows: - - - - NIXPKG1 - - The version of the Nix Package - file. - - - - manifestURL - - The manifest to be pulled by - nix-pull. The manifest must contain - outPath. - - - - name - - The symbolic name and version of the - package. - - - - system - - The platform identifier of the platform for which - this binary package is intended. - - - - drvPath - - The path in the Nix store of the derivation from - which outPath was built. Not currently - used. - - - - outPath - - The path in the Nix store of the package. After - nix-install-package has obtained the manifest - from manifestURL, it performs a - nix-env -i outPath - to install the binary package. - - - - - - - -An example follows: - - -NIXPKG1 http://.../nixpkgs-0.10pre6622/MANIFEST subversion-1.4.0 i686-darwin \ - /nix/store/4kh60jkp...-subversion-1.4.0.drv \ - /nix/store/nkw7wpgb...-subversion-1.4.0 - -(The line breaks (\) are for presentation purposes -and not part of the actual file.) - - - - - - - diff --git a/doc/manual/nix-instantiate.xml b/doc/manual/nix-instantiate.xml deleted file mode 100644 index b388560a11..0000000000 --- a/doc/manual/nix-instantiate.xml +++ /dev/null @@ -1,253 +0,0 @@ - - - - nix-instantiate - 1 - Nix - - - - - nix-instantiate - instantiate store derivations from Nix expressions - - - - - nix-instantiate - - - - - - - - - - name value - - - - - - attrPath - - path - - - - - - files - - nix-instantiate - - files - - - - -Description - -The command nix-instantiate generates store derivations from (high-level) -Nix expressions. It evaluates the Nix expressions in each of -files (which defaults to -./default.nix). Each top-level expression -should evaluate to a derivation, a list of derivations, or a set of -derivations. The paths of the resulting store derivations are printed -on standard output. - -If files is the character --, then a Nix expression will be read from standard -input. - -See also for a list of common options. - - - - -Options - - - - - path - - - See the corresponding - options in nix-store. - - - - - - Just parse the input files, and print their - abstract syntax trees on standard output in ATerm - format. - - - - - - Just parse and evaluate the input files, and print - the resulting values on standard output. No instantiation of - store derivations takes place. - - - - - - Look up the given files in Nix’s search path (as - specified by the NIX_PATH environment variable). - If found, print the corresponding absolute paths on standard - output. For instance, if NIX_PATH is - nixpkgs=/home/alice/nixpkgs, then - nix-instantiate --find-file nixpkgs/default.nix - will print - /home/alice/nixpkgs/default.nix. - - - - - - When used with and - , print the resulting expression as an - XML representation of the abstract syntax tree rather than as an - ATerm. The schema is the same as that used by the toXML - built-in. - - - - - - When used with , - recursively evaluate list elements and attributes. Normally, such - sub-expressions are left unevaluated (since the Nix expression - language is lazy). - - This option can cause non-termination, because lazy - data structures can be infinitely large. - - - - - - - - When used with , perform - evaluation in read/write mode so nix language features that - require it will still work (at the cost of needing to do - instantiation of every evaluated derivation). - - - - - - - - - - - - - - -Examples - -Instantiating store derivations from a Nix expression, and -building them using nix-store: - - -$ nix-instantiate test.nix (instantiate) -/nix/store/cigxbmvy6dzix98dxxh9b6shg7ar5bvs-perl-BerkeleyDB-0.26.drv - -$ nix-store -r $(nix-instantiate test.nix) (build) -... -/nix/store/qhqk4n8ci095g3sdp93x7rgwyh9rdvgk-perl-BerkeleyDB-0.26 (output path) - -$ ls -l /nix/store/qhqk4n8ci095g3sdp93x7rgwyh9rdvgk-perl-BerkeleyDB-0.26 -dr-xr-xr-x 2 eelco users 4096 1970-01-01 01:00 lib -... - - - -You can also give a Nix expression on the command line: - - -$ nix-instantiate -E 'with import <nixpkgs> { }; hello' -/nix/store/j8s4zyv75a724q38cb0r87rlczaiag4y-hello-2.8.drv - - -This is equivalent to: - - -$ nix-instantiate '<nixpkgs>' -A hello - - - - -Parsing and evaluating Nix expressions: - - -$ nix-instantiate --parse -E '1 + 2' -1 + 2 - -$ nix-instantiate --eval -E '1 + 2' -3 - -$ nix-instantiate --eval --xml -E '1 + 2' - - - -]]> - - - -The difference between non-strict and strict evaluation: - - -$ nix-instantiate --eval --xml -E 'rec { x = "foo"; y = x; }' -... - - - - - ]]> -... - -Note that y is left unevaluated (the XML -representation doesn’t attempt to show non-normal forms). - - -$ nix-instantiate --eval --xml --strict -E 'rec { x = "foo"; y = x; }' -... - - - - - ]]> -... - - - - - - -Environment variables - - - - - - - - - diff --git a/doc/manual/nix-lang-ref.xml b/doc/manual/nix-lang-ref.xml deleted file mode 100644 index 86273ac3d0..0000000000 --- a/doc/manual/nix-lang-ref.xml +++ /dev/null @@ -1,182 +0,0 @@ - - Nix Language Reference - - - Grammar - - - Expressions - - - Expr - - - - - - - ExprFunction - - '{' '}' ':' - | - - - - - - ExprAssert - - 'assert' ';' - | - - - - - - ExprIf - - 'if' 'then' - 'else' - | - - - - - - ExprOp - - '!' - | - '==' - | - '!=' - | - '&&' - | - '||' - | - '->' - | - '//' - | - '~' - | - '?' - | - - - - - - ExprApp - - '.' - | - - - - - - ExprSelect - - - | - - - - - - ExprSimple - - | - | - | - | - - | - 'true' | 'false' | 'null' - | - '(' ')' - | - '{' * '}' - | - 'let' '{' * '}' - | - 'rec' '{' * '}' - | - '[' * ']' - - - - - Bind - - '=' ';' - | - 'inherit' ('(' ')')? * ';' - - - - - Formals - - ',' - | - - - - - Formal - - - | - '?' - - - - - - - Terminals - - - Id - [a-zA-Z\_][a-zA-Z0-9\_\']* - - - - Int - [0-9]+ - - - - Str - \"[^\n\"]*\" - - - - Path - [a-zA-Z0-9\.\_\-\+]*(\/[a-zA-Z0-9\.\_\-\+]+)+ - - - - Uri - [a-zA-Z][a-zA-Z0-9\+\-\.]*\:[a-zA-Z0-9\%\/\?\:\@\&\=\+\$\,\-\_\.\!\~\*\']+ - - - - Whitespace - - [ \t\n]+ - | - \#[^\n]* - | - \/\*(.|\n)*\*\/ - - - - - - - - diff --git a/doc/manual/nix-prefetch-url.xml b/doc/manual/nix-prefetch-url.xml deleted file mode 100644 index c416e675b0..0000000000 --- a/doc/manual/nix-prefetch-url.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - nix-prefetch-url - 1 - Nix - - - - - nix-prefetch-url - copy a file from a URL into the store and print its hash - - - - - nix-prefetch-url - hashAlgo - url - hash - - - - -Description - -The command nix-prefetch-url downloads the -file referenced by the URL url, prints its -cryptographic hash, and copies it into the Nix store. The file name -in the store is -hash-baseName, -where baseName is everything following the -final slash in url. - -This command is just a convenience for Nix expression writers. -Often a Nix expression fetches some source distribution from the -network using the fetchurl expression contained in -Nixpkgs. However, fetchurl requires a -cryptographic hash. If you don't know the hash, you would have to -download the file first, and then fetchurl would -download it again when you build your Nix expression. Since -fetchurl uses the same name for the downloaded file -as nix-prefetch-url, the redundant download can be -avoided. - -If hash is specified, then a download -is not performed if the Nix store already contains a file with the -same hash and base name. Otherwise, the file is downloaded, and an -error if signaled if the actual hash of the file does not match the -specified hash. - -This command prints the hash on standard output. Additionally, -if the environment variable PRINT_PATH is set, the path -of the downloaded file in the Nix store is also printed. - - - - -Options - - - - hashAlgo - - Use the specified cryptographic hash algorithm, - which can be one of md5, - sha1, and - sha256. - - - - - - - - -Examples - - -$ nix-prefetch-url ftp://ftp.nluug.nl/pub/gnu/make/make-3.80.tar.bz2 -0bbd1df101bc0294d440471e50feca71 - -$ PRINT_PATH=1 nix-prefetch-url ftp://ftp.nluug.nl/pub/gnu/make/make-3.80.tar.bz2 -0bbd1df101bc0294d440471e50feca71 -/nix/store/wvyz8ifdn7wyz1p3pqyn0ra45ka2l492-make-3.80.tar.bz2 - - - - - diff --git a/doc/manual/nix-pull.xml b/doc/manual/nix-pull.xml deleted file mode 100644 index 8e4a505e1d..0000000000 --- a/doc/manual/nix-pull.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - nix-pull - 1 - Nix - - - - - nix-pull - pull substitutes from a network cache - - - - - nix-pull - url - - - - -Description - -The command nix-pull obtains a list of -pre-built store paths from the URL url, and -for each of these store paths, registers a substitute derivation that -downloads and unpacks it into the Nix store. This is used to speed up -installations: if you attempt to install something that has already -been built and stored into the network cache, Nix can transparently -re-use the pre-built store paths. - -The file at url must be compatible -with the files created by nix-push. - - - - -Examples - - -$ nix-pull http://nix.cs.uu.nl/dist/nix/nixpkgs-0.5pre753/MANIFEST - - - - - diff --git a/doc/manual/nix-push.xml b/doc/manual/nix-push.xml deleted file mode 100644 index e789bbf7d3..0000000000 --- a/doc/manual/nix-push.xml +++ /dev/null @@ -1,398 +0,0 @@ - - - - nix-push - 1 - Nix - - - - - nix-push - generate a binary cache - - - - - nix-push - dest-dir - - - - - - filename - url - paths - - - - -Description - -The command nix-push produces a -binary cache, a directory containing compressed -Nix archives (NARs) plus some metadata of the closure of the specified -store paths. This directory can then be made available through a web -server to other Nix installations, allowing them to skip building from -source and instead download binaries from the cache -automatically. - -nix-push performs the following actions. - - - - Each path in paths is - built (using nix-store - --realise). - - All paths in the closure of - paths are determined (using - nix-store --query --requisites - --include-outputs). Note that since the - flag is used, if - paths includes a store derivation, you - get a combined source/binary distribution (e.g., source tarballs - will be included). - - All store paths determined in the previous step are - packaged into a NAR (using nix-store --dump) and - compressed using xz or bzip2. - The resulting files have the extension .nar.xz - or .nar.bz2. Also for each store path, Nix - generates a file with extension .narinfo - containing metadata such as the references, cryptographic hash and - size of each path. - - Optionally, a single manifest - file is created that contains the same metadata as the - .narinfo files. This is for compatibility with - Nix versions prior to 1.2 (see nix-pull for - details). - - A file named is - placed in the destination directory. The existence of this file - marks the directory as a binary cache. - - - - - - - - -Options - - - - dest-dir - - Set the destination directory to - dir, which is created if it does not - exist. This flag is required. - - - - - - Compress NARs using bzip2 - instead of xz -9. The latter compresses about - 30% better on typical archives, decompresses about twice as fast, - but compresses a lot slower and is not supported by Nix prior to - version 1.2. - - - - - - Do not compress NARs. - - - - - - Overwrite .narinfo files if - they already exist. - - - - - - By default, NARs are generated in the Nix store - and then copied to dest-dir. If this - option is given, hard links are used instead. This only works if - dest-dir is on the same filesystem as - the Nix store. - - - - - - Force the generation of a manifest suitable for - use by nix-pull. The manifest is stored as - dest-dir/MANIFEST. - - - - filename - - Like , but store the - manifest in filename. - - - - url - - Manifests are expected to contain the absolute - URLs of NARs. For generating these URLs, the prefix - url is used. It defaults to - file://dest-dir. - - - - - - - - -Examples - -To add the closure of Thunderbird to a binary cache: - - -$ nix-push --dest /tmp/cache $(nix-build -A thunderbird) - - -Assuming that /tmp/cache is exported by a web -server as http://example.org/cache, you can then use this -cache on another machine to speed up the installation of Thunderbird: - - -$ nix-build -A thunderbird --option binary-caches http://example.org/cache - - -Alternatively, you could add binary-caches = -http://example.org/cache to -nix.conf. - -To also include build-time dependencies (such as source -tarballs): - - -$ nix-push --dest /tmp/cache $(nix-instantiate -A thunderbird) - - - - -To generate a manifest suitable for nix-pull: - - -$ nix-push --dest /tmp/cache $(nix-build -A thunderbird) --manifest - - -On another machine you can then do: - - -$ nix-pull http://example.org/cache - - -to cause the binaries to be used by subsequent Nix operations. - - - - -Binary cache format and operation - -A binary cache with URL url only -denotes a valid binary cache if the file -url/nix-cache-info exists. If -this file does not exist (or cannot be downloaded), the cache is -ignored. If it does exist, it must be a text file containing cache -properties. Here’s an example: - - -StoreDir: /nix/store -WantMassQuery: 1 -Priority: 10 - - -The properties that are currently supported are: - - - - StoreDir - - The path of the Nix store to which this binary - cache applies. Binaries are not relocatable — a binary built for - /nix/store won’t generally work in - /home/alice/store — so to prevent binaries - from being used in a wrong store, a binary cache is only used if - its StoreDir matches the local Nix - configuration. The default is - /nix/store. - - - - WantMassQuery - - Query operations such as nix-env - -qas can cause thousands of cache queries, and thus - thousands of HTTP requests, to determine which packages are - available in binary form. While these requests are small, not - every server may appreciate a potential onslaught of queries. If - WantMassQuery is set to 0 - (default), “mass queries” such as nix-env -qas - will skip this cache. Thus a package may appear not to have a - binary substitute. However, the binary will still be used when - you actually install the package. If - WantMassQuery is set to 1, - mass queries will use this cache. - - - - Priority - - Each binary cache has a priority (defaulting to - 50). Binary caches are checked for binaries in order of ascending - priority; thus a higher number denotes a lower priority. The - binary cache http://cache.nixos.org has priority - 40. - - - - - - - -Every time Nix needs to build some store path -p, it will check each configured binary -cache to see if it has a NAR file for p, -until it finds one. If no cache has a NAR, Nix will fall back to -building the path from source (if applicable). To see if a cache with -URL url has a binary for -p, Nix fetches -url/h, where h -is the hash part of p. Thus, if we have a -cache http://cache.nixos.org and we want to obtain -the store path - -/nix/store/a8922c0h87iilxzzvwn2hmv8x210aqb9-glibc-2.7 - -then Nix will attempt to fetch - -http://cache.nixos.org/a8922c0h87iilxzzvwn2hmv8x210aqb9.narinfo - -(Commands such as nix-env -qas will issue an HTTP -HEAD request, since it only needs to know if the -.narinfo file exists.) The -.narinfo file is a simple text file that looks -like this: - - -StorePath: /nix/store/a8922c0h87iilxzzvwn2hmv8x210aqb9-glibc-2.7 -URL: nar/0zzjpdz46mdn74v09m053yczlz4am038g8r74iy8w43gx8801h70.nar.bz2 -Compression: bzip2 -FileHash: sha256:0zzjpdz46mdn74v09m053yczlz4am038g8r74iy8w43gx8801h70 -FileSize: 24473768 -NarHash: sha256:0s491y1h9hxj5ghiizlxk7ax6jwbha00zwn7lpyd5xg5bhf60vzg -NarSize: 109521136 -References: 2ma2k0ys8knh4an48n28vigcmc2z8773-linux-headers-2.6.23.16 ... -Deriver: 7akyyc87ka32xwmqza9dvyg5pwx3j212-glibc-2.7.drv - - -The fields are as follows: - - - - StorePath - - The full store path, including the name part - (e.g., glibc-2.7). It must match the - requested store path. - - - - URL - - The URL of the NAR, relative to the binary cache - URL. - - - - Compression - - The compression method; either - xz or - bzip2. - - - - FileHash - - The SHA-256 hash of the compressed - NAR. - - - - FileSize - - The size of the compressed NAR. - - - - NarHash - - The SHA-256 hash of the uncompressed NAR. This is - equal to the hash of the store path as returned by - nix-store -q --hash - p. - - - - NarSize - - The size of the uncompressed NAR. - - - - References - - The references of the store path, without the Nix - store prefix. - - - - Deriver - - The deriver of the store path, without the Nix - store prefix. This field is optional. - - - - System - - The Nix platform type of this binary, if known. - This field is optional. - - - - - - - -Thus, in our example, after recursively ensuring that the -references exist (e.g., -/nix/store/2ma2k0ys8knh4an48n28vigcmc2z8773-linux-headers-2.6.23.16), -Nix will fetch -http://cache.nixos.org/nar/0zzjpdz46mdn74v09m053yczlz4am038g8r74iy8w43gx8801h70.nar.bz2 - and decompress and unpack it to -/nix/store/a8922c0h87iilxzzvwn2hmv8x210aqb9-glibc-2.7. - - - - - diff --git a/doc/manual/nix-shell.xml b/doc/manual/nix-shell.xml deleted file mode 100644 index d5f70a9e66..0000000000 --- a/doc/manual/nix-shell.xml +++ /dev/null @@ -1,200 +0,0 @@ - - - - nix-shell - 1 - Nix - - - - - nix-shell - start an interactive shell based on a Nix expression - - - - - nix-shell - name value - name value - - - - - - attrPath - - cmd - regexp - - - - - - - - packages - - path - - - - -Description - -The command nix-shell will build the -dependencies of the specified derivation, but not the derivation -itself. It will then start an interactive shell in which all -environment variables defined by the derivation -path have been set to their corresponding -values, and the script $stdenv/setup has been -sourced. This is useful for reproducing the environment of a -derivation for development. - -If path is not given, -nix-shell defaults to -shell.nix if it exists, and -default.nix otherwise. - -If the derivation defines the variable -shellHook, it will be evaluated after -$stdenv/setup has been sourced. Since this hook is -not executed by regular Nix builds, it allows you to perform -initialisation specific to nix-shell. For example, -the derivation attribute - - -shellHook = - '' - echo "Hello shell" - ''; - - -will cause nix-shell to print Hello shell. - - - - -Options - -All options not listed here are passed to nix-store ---realise, except for and - / which are passed to -nix-instantiate. See -also . - - - - cmd - - In the environment of the derivation, run the - shell command cmd instead of starting - an interactive shell. However, if you end the shell command with - return, you still get an interactive shell. - This can be useful for doing any additional - initialisation. - - - - regexp - - Do not build any dependencies whose store path - matches the regular expression regexp. - This option may be specified multiple times. - - - - - - If this flag is specified, the environment is - almost entirely cleared before the interactive shell is started, - so you get an environment that more closely corresponds to the - “real” Nix build. A few variables, in particular - HOME, USER and - DISPLAY, are retained. Note that - ~/.bashrc and (depending on your Bash - installation) /etc/bashrc are still sourced, - so any variables set there will affect the interactive - shell. - - - - / - - Set up an environment in which the specified - packages are present. The command line arguments are interpreted - as attribute names inside the Nix Packages collection. Thus, - nix-shell -p libjpeg openjdk will start a shell - in which the packages denoted by the attribute names - libjpeg and openjdk are - present. - - - - - -The following common options are supported: - - - - - - - - -Examples - -To build the dependencies of the package Pan, and start an -interactive shell in which to build it: - - -$ nix-shell '<nixpkgs>' -A pan -[nix-shell]$ unpackPhase -[nix-shell]$ cd pan-* -[nix-shell]$ configurePhase -[nix-shell]$ buildPhase -[nix-shell]$ ./pan/gui/pan - - -To clear the environment first, and do some additional automatic -initialisation of the interactive shell: - - -$ nix-shell '<nixpkgs>' -A pan --pure \ - --command 'export NIX_DEBUG=1; export NIX_CORES=8; return' - - -Nix expressions can also be given on the command line. For instance, -the following starts a shell containing the packages -sqlite and libX11: - - -$ nix-shell -E 'with import <nixpkgs> { }; runCommand "dummy" { buildInputs = [ sqlite xorg.libX11 ]; } ""' - - -A shorter way to do the same is: - - -$ nix-shell -p sqlite xorg.libX11 -[nix-shell]$ echo $NIX_LDFLAGS -… -L/nix/store/j1zg5v…-sqlite-3.8.0.2/lib -L/nix/store/0gmcz9…-libX11-1.6.1/lib … - - - - - - - -Environment variables - - - - - - - - - diff --git a/doc/manual/nix-store.xml b/doc/manual/nix-store.xml deleted file mode 100644 index 416438a0bd..0000000000 --- a/doc/manual/nix-store.xml +++ /dev/null @@ -1,1346 +0,0 @@ - - - - nix-store - 1 - Nix - - - - - nix-store - manipulate or query the Nix store - - - - - nix-store - - path - - operation - options - arguments - - - - -Description - -The command nix-store performs primitive -operations on the Nix store. You generally do not need to run this -command manually. - -nix-store takes exactly one -operation flag which indicates the subcommand to -be performed. These are documented below. - - - - - - - -Common options - -This section lists the options that are common to all -operations. These options are allowed for every subcommand, though -they may not always have an effect. See -also for a list of common -options. - - - - path - - Causes the result of a realisation - ( and ) - to be registered as a root of the garbage collector (see ). The root is stored in - path, which must be inside a directory - that is scanned for roots by the garbage collector (i.e., - typically in a subdirectory of - /nix/var/nix/gcroots/) - unless the flag - is used. - - If there are multiple results, then multiple symlinks will - be created by sequentially numbering symlinks beyond the first one - (e.g., foo, foo-2, - foo-3, and so on). - - - - - - - - In conjunction with , this option - allows roots to be stored outside of the GC - roots directory. This is useful for commands such as - nix-build that place a symlink to the build - result in the current directory; such a build result should not be - garbage-collected unless the symlink is removed. - - The flag causes a uniquely named - symlink to path to be stored in - /nix/var/nix/gcroots/auto/. For instance, - - -$ nix-store --add-root /home/eelco/bla/result --indirect -r ... - -$ ls -l /nix/var/nix/gcroots/auto -lrwxrwxrwx 1 ... 2005-03-13 21:10 dn54lcypm8f8... -> /home/eelco/bla/result - -$ ls -l /home/eelco/bla/result -lrwxrwxrwx 1 ... 2005-03-13 21:10 /home/eelco/bla/result -> /nix/store/1r11343n6qd4...-f-spot-0.0.10 - - Thus, when /home/eelco/bla/result is removed, - the GC root in the auto directory becomes a - dangling symlink and will be ignored by the collector. - - Note that it is not possible to move or rename - indirect GC roots, since the symlink in the - auto directory will still point to the old - location. - - - - - - - - - - - - - - - - - -Operation <option>--realise</option> - -Synopsis - - - nix-store - - - - - paths - - - - - -Description - -The operation essentially “builds” -the specified store paths. Realisation is a somewhat overloaded term: - - - - If the store path is a - derivation, realisation ensures that the output - paths of the derivation are valid (i.e., the output path and its - closure exist in the file system). This can be done in several - ways. First, it is possible that the outputs are already valid, in - which case we are done immediately. Otherwise, there may be substitutes that produce the - outputs (e.g., by downloading them). Finally, the outputs can be - produced by performing the build action described by the - derivation. - - If the store path is not a derivation, realisation - ensures that the specified path is valid (i.e., it and its closure - exist in the file system). If the path is already valid, we are - done immediately. Otherwise, the path and any missing paths in its - closure may be produced through substitutes. If there are no - (successful) subsitutes, realisation fails. - - - - - -The output path of each derivation is printed on standard -output. (For non-derivations argument, the argument itself is -printed.) - -The following flags are available: - - - - - - Print on standard error a description of what - packages would be built or downloaded, without actually performing - the operation. - - - - - - If a non-derivation path does not have a - substitute, then silently ignore it. - - - - - - - - -Examples - -This operation is typically used to build store derivations -produced by nix-instantiate: - - -$ nix-store -r $(nix-instantiate ./test.nix) -/nix/store/31axcgrlbfsxzmfff1gyj1bf62hvkby2-aterm-2.3.1 - -This is essentially what nix-build does. - - - - - - - - - - -Operation <option>--gc</option> - -Synopsis - - - nix-store - - - - - - - - bytes - - - - -Description - -Without additional flags, the operation -performs a garbage collection on the Nix store. That is, all paths in -the Nix store not reachable via file system references from a set of -“roots”, are deleted. - -The following suboperations may be specified: - - - - - - This operation prints on standard output the set - of roots used by the garbage collector. What constitutes a root - is described in . - - - - - - This operation prints on standard output the set - of “live” store paths, which are all the store paths reachable - from the roots. Live paths should never be deleted, since that - would break consistency — it would become possible that - applications are installed that reference things that are no - longer present in the store. - - - - - - This operation prints out on standard output the - set of “dead” store paths, which is just the opposite of the set - of live paths: any path in the store that is not live (with - respect to the roots) is dead. - - - - - - This operation performs an actual garbage - collection. All dead paths are removed from the - store. This is the default. - - - - - -By default, all unreachable paths are deleted. The following -options control what gets deleted and in what order: - - - - bytes - - Keep deleting paths until at least - bytes bytes have been deleted, then - stop. The argument bytes can be - followed by the multiplicative suffix K, - M, G or - T, denoting KiB, MiB, GiB or TiB - units. - - - - - - - -The behaviour of the collector is also influenced by the gc-keep-outputs -and gc-keep-derivations -variables in the Nix configuration file. - -With , the collector prints the total -number of freed bytes when it finishes (or when it is interrupted). -With , it prints the number of bytes that -would be freed. - - - - -Examples - -To delete all unreachable paths, just do: - - -$ nix-store --gc -deleting `/nix/store/kq82idx6g0nyzsp2s14gfsc38npai7lf-cairo-1.0.4.tar.gz.drv' -... -8825586 bytes freed (8.42 MiB) - - - -To delete at least 100 MiBs of unreachable paths: - - -$ nix-store --gc --max-freed $((100 * 1024 * 1024)) - - - - - - - - - - - - -Operation <option>--delete</option> - -Synopsis - - - nix-store - - - paths - - - - -Description - -The operation deletes the store paths -paths from the Nix store, but only if it is -safe to do so; that is, when the path is not reachable from a root of -the garbage collector. This means that you can only delete paths that -would also be deleted by nix-store --gc. Thus, ---delete is a more targeted version of ---gc. - -With the option , reachability -from the roots is ignored. However, the path still won’t be deleted -if there are other paths in the store that refer to it (i.e., depend -on it). - - - -Example - - -$ nix-store --delete /nix/store/zq0h41l75vlb4z45kzgjjmsjxvcv1qk7-mesa-6.4 -0 bytes freed (0.00 MiB) -error: cannot delete path `/nix/store/zq0h41l75vlb4z45kzgjjmsjxvcv1qk7-mesa-6.4' since it is still alive - - - - - - - - - -Operation <option>--query</option> - -Synopsis - - - nix-store - - - - - - - - - - - - - - - - name - - - - - - - - - paths - - - - - -Description - -The operation displays various bits of -information about the store paths . The queries are described below. At -most one query can be specified. The default query is -. - -The paths paths may also be symlinks -from outside of the Nix store, to the Nix store. In that case, the -query is applied to the target of the symlink. - - - - - -Common query options - - - - - - - For each argument to the query that is a store - derivation, apply the query to the output path of the derivation - instead. - - - - - - - Realise each argument to the query first (see - nix-store - --realise). - - - - - - - - -Queries - - - - - - Prints out the output paths of the store - derivations paths. These are the paths - that will be produced when the derivation is - built. - - - - - - - Prints out the closure of the store path - paths. - - This query has one option: - - - - - - Also include the output path of store - derivations, and their closures. - - - - - - This query can be used to implement various kinds of - deployment. A source deployment is obtained - by distributing the closure of a store derivation. A - binary deployment is obtained by distributing - the closure of an output path. A cache - deployment (combined source/binary deployment, - including binaries of build-time-only dependencies) is obtained by - distributing the closure of a store derivation and specifying the - option . - - - - - - - - Prints the set of references of the store paths - paths, that is, their immediate - dependencies. (For all dependencies, use - .) - - - - - - Prints the set of referrers of - the store paths paths, that is, the - store paths currently existing in the Nix store that refer to one - of paths. Note that contrary to the - references, the set of referrers is not constant; it can change as - store paths are added or removed. - - - - - - Prints the closure of the set of store paths - paths under the referrers relation; that - is, all store paths that directly or indirectly refer to one of - paths. These are all the path currently - in the Nix store that are dependent on - paths. - - - - - - Prints the deriver of the store paths - paths. If the path has no deriver - (e.g., if it is a source file), or if the deriver is not known - (e.g., in the case of a binary-only deployment), the string - unknown-deriver is printed. - - - - - - Prints the references graph of the store paths - paths in the format of the - dot tool of AT&T's Graphviz package. - This can be used to visualise dependency graphs. To obtain a - build-time dependency graph, apply this to a store derivation. To - obtain a runtime dependency graph, apply it to an output - path. - - - - - - Prints the references graph of the store paths - paths as a nested ASCII tree. - References are ordered by descending closure size; this tends to - flatten the tree, making it more readable. The query only - recurses into a store path when it is first encountered; this - prevents a blowup of the tree representation of the - graph. - - - - name - - Prints the value of the attribute - name (i.e., environment variable) of - the store derivations paths. It is an - error for a derivation to not have the specified - attribute. - - - - - - Prints the SHA-256 hash of the contents of the - store paths paths (that is, the hash of - the output of nix-store --dump on the given - paths). Since the hash is stored in the Nix database, this is a - fast operation. - - - - - - Prints the size in bytes of the contents of the - store paths paths — to be precise, the - size of the output of nix-store --dump on the - given paths. Note that the actual disk space required by the - store paths may be higher, especially on filesystems with large - cluster sizes. - - - - - - Prints the garbage collector roots that point, - directly or indirectly, at the store paths - paths. - - - - - - - - -Examples - -Print the closure (runtime dependencies) of the -svn program in the current user environment: - - -$ nix-store -qR $(which svn) -/nix/store/5mbglq5ldqld8sj57273aljwkfvj22mc-subversion-1.1.4 -/nix/store/9lz9yc6zgmc0vlqmn2ipcpkjlmbi51vv-glibc-2.3.4 -... - - - -Print the build-time dependencies of svn: - - -$ nix-store -qR $(nix-store -qd $(which svn)) -/nix/store/02iizgn86m42q905rddvg4ja975bk2i4-grep-2.5.1.tar.bz2.drv -/nix/store/07a2bzxmzwz5hp58nf03pahrv2ygwgs3-gcc-wrapper.sh -/nix/store/0ma7c9wsbaxahwwl04gbw3fcd806ski4-glibc-2.3.4.drv -... lots of other paths ... - -The difference with the previous example is that we ask the closure of -the derivation (), not the closure of the output -path that contains svn. - -Show the build-time dependencies as a tree: - - -$ nix-store -q --tree $(nix-store -qd $(which svn)) -/nix/store/7i5082kfb6yjbqdbiwdhhza0am2xvh6c-subversion-1.1.4.drv -+---/nix/store/d8afh10z72n8l1cr5w42366abiblgn54-builder.sh -+---/nix/store/fmzxmpjx2lh849ph0l36snfj9zdibw67-bash-3.0.drv -| +---/nix/store/570hmhmx3v57605cqg9yfvvyh0nnb8k8-bash -| +---/nix/store/p3srsbd8dx44v2pg6nbnszab5mcwx03v-builder.sh -... - - - -Show all paths that depend on the same OpenSSL library as -svn: - - -$ nix-store -q --referrers $(nix-store -q --binding openssl $(nix-store -qd $(which svn))) -/nix/store/23ny9l9wixx21632y2wi4p585qhva1q8-sylpheed-1.0.0 -/nix/store/5mbglq5ldqld8sj57273aljwkfvj22mc-subversion-1.1.4 -/nix/store/dpmvp969yhdqs7lm2r1a3gng7pyq6vy4-subversion-1.1.3 -/nix/store/l51240xqsgg8a7yrbqdx1rfzyv6l26fx-lynx-2.8.5 - - - -Show all paths that directly or indirectly depend on the Glibc -(C library) used by svn: - - -$ nix-store -q --referrers-closure $(ldd $(which svn) | grep /libc.so | awk '{print $3}') -/nix/store/034a6h4vpz9kds5r6kzb9lhh81mscw43-libgnomeprintui-2.8.2 -/nix/store/15l3yi0d45prm7a82pcrknxdh6nzmxza-gawk-3.1.4 -... - -Note that ldd is a command that prints out the -dynamic libraries used by an ELF executable. - -Make a picture of the runtime dependency graph of the current -user environment: - - -$ nix-store -q --graph ~/.nix-profile | dot -Tps > graph.ps -$ gv graph.ps - - - -Show every garbage collector root that points to a store path -that depends on svn: - - -$ nix-store -q --roots $(which svn) -/nix/var/nix/profiles/default-81-link -/nix/var/nix/profiles/default-82-link -/nix/var/nix/profiles/per-user/eelco/profile-97-link - - - - - - - - - - - - - - - - - - - -Operation <option>--add</option> - -Synopsis - - - nix-store - - paths - - - - -Description - -The operation adds the specified paths to -the Nix store. It prints the resulting paths in the Nix store on -standard output. - - - -Example - - -$ nix-store --add ./foo.c -/nix/store/m7lrha58ph6rcnv109yzx1nk1cj7k7zf-foo.c - - - - - - - - - -Operation <option>--verify</option> - - - Synopsis - - nix-store - - - - - - -Description - -The operation verifies the internal -consistency of the Nix database, and the consistency between the Nix -database and the Nix store. Any inconsistencies encountered are -automatically repaired. Inconsistencies are generally the result of -the Nix store or database being modified by non-Nix tools, or of bugs -in Nix itself. - -This operation has the following options: - - - - - - Checks that the contents of every valid store path - has not been altered by computing a SHA-256 hash of the contents - and comparing it with the hash stored in the Nix database at build - time. Paths that have been modified are printed out. For large - stores, is obviously quite - slow. - - - - - - If any valid path is missing from the store, or - (if is given) the contents of a - valid path has been modified, then try to repair the path by - redownloading it. See nix-store --repair-path - for details. - - - - - - - - - - - - - - - -Operation <option>--verify-path</option> - - - Synopsis - - nix-store - - paths - - - -Description - -The operation compares the -contents of the given store paths to their cryptographic hashes stored -in Nix’s database. For every changed path, it prints a warning -message. The exit status is 0 if no path has changed, and 1 -otherwise. - - - -Example - -To verify the integrity of the svn command and all its dependencies: - - -$ nix-store --verify-path $(nix-store -qR $(which svn)) - - - - - - - - - - - -Operation <option>--repair-path</option> - - - Synopsis - - nix-store - - paths - - - -Description - -The operation attempts to -“repair” the specified paths by redownloading them using the available -substituters. If no substitutes are available, then repair is not -possible. - -During repair, there is a very small time window during -which the old path (if it exists) is moved out of the way and replaced -with the new path. If repair is interrupted in between, then the -system may be left in a broken state (e.g., if the path contains a -critical system component like the GNU C Library). - - - -Example - - -$ nix-store --verify-path /nix/store/dj7a81wsm1ijwwpkks3725661h3263p5-glibc-2.13 -path `/nix/store/dj7a81wsm1ijwwpkks3725661h3263p5-glibc-2.13' was modified! - expected hash `2db57715ae90b7e31ff1f2ecb8c12ec1cc43da920efcbe3b22763f36a1861588', - got `481c5aa5483ebc97c20457bb8bca24deea56550d3985cda0027f67fe54b808e4' - -$ nix-store --repair-path /nix/store/dj7a81wsm1ijwwpkks3725661h3263p5-glibc-2.13 -fetching path `/nix/store/d7a81wsm1ijwwpkks3725661h3263p5-glibc-2.13'... -… - - - - - - - - - -Operation <option>--dump</option> - - - Synopsis - - nix-store - - path - - - -Description - -The operation produces a NAR (Nix -ARchive) file containing the contents of the file system tree rooted -at path. The archive is written to -standard output. - -A NAR archive is like a TAR or Zip archive, but it contains only -the information that Nix considers important. For instance, -timestamps are elided because all files in the Nix store have their -timestamp set to 0 anyway. Likewise, all permissions are left out -except for the execute bit, because all files in the Nix store have -644 or 755 permission. - -Also, a NAR archive is canonical, meaning -that “equal” paths always produce the same NAR archive. For instance, -directory entries are always sorted so that the actual on-disk order -doesn’t influence the result. This means that the cryptographic hash -of a NAR dump of a path is usable as a fingerprint of the contents of -the path. Indeed, the hashes of store paths stored in Nix’s database -(see nix-store -q ---hash) are SHA-256 hashes of the NAR dump of each -store path. - -NAR archives support filenames of unlimited length and 64-bit -file sizes. They can contain regular files, directories, and symbolic -links, but not other types of files (such as device nodes). - -A Nix archive can be unpacked using nix-store ---restore. - - - - - - - - - -Operation <option>--restore</option> - - - Synopsis - - nix-store - - path - - - -Description - -The operation unpacks a NAR archive -to path, which must not already exist. The -archive is read from standard input. - - - - - - - - - -Operation <option>--export</option> - - - Synopsis - - nix-store - - paths - - - -Description - -The operation writes a serialisation -of the specified store paths to standard output in a format that can -be imported into another Nix store with nix-store --import. This -is like nix-store ---dump, except that the NAR archive produced by that command -doesn’t contain the necessary meta-information to allow it to be -imported into another Nix store (namely, the set of references of the -path). - -This command does not produce a closure of -the specified paths, so if a store path references other store paths -that are missing in the target Nix store, the import will fail. To -copy a whole closure, do something like - - -$ nix-store --export $(nix-store -qR paths) > out - - - -For an example of how and - can be used, see the source of the nix-copy-closure -command. - - - - - - - - - -Operation <option>--import</option> - - - Synopsis - - nix-store - - - - -Description - -The operation reads a serialisation of -a set of store paths produced by nix-store --import from -standard input and adds those store paths to the Nix store. Paths -that already exist in the Nix store are ignored. If a path refers to -another path that doesn’t exist in the Nix store, the import -fails. - - - - - - - - - -Operation <option>--optimise</option> - - - Synopsis - - nix-store - - - - -Description - -The operation reduces Nix store disk -space usage by finding identical files in the store and hard-linking -them to each other. It typically reduces the size of the store by -something like 25-35%. Only regular files and symlinks are -hard-linked in this manner. Files are considered identical when they -have the same NAR archive serialisation: that is, regular files must -have the same contents and permission (executable or non-executable), -and symlinks must have the same contents. - -After completion, or when the command is interrupted, a report -on the achieved savings is printed on standard error. - -Use or to get some -progress indication. - - - -Example - - -$ nix-store --optimise -hashing files in `/nix/store/qhqx7l2f1kmwihc9bnxs7rc159hsxnf3-gcc-4.1.1' -... -541838819 bytes (516.74 MiB) freed by hard-linking 54143 files; -there are 114486 files with equal contents out of 215894 files in total - - - - - - - - - - -Operation <option>--read-log</option> - - - Synopsis - - nix-store - - - - - paths - - - -Description - -The operation prints the build log -of the specified store paths on standard output. The build log is -whatever the builder of a derivation wrote to standard output and -standard error. If a store path is not a derivation, the deriver of -the store path is used. - -Build logs are kept in -/nix/var/log/nix/drvs. However, there is no -guarantee that a build log is available for any particular store -path. For instance, if the path was downloaded as a pre-built binary -through a substitute, then the log is unavailable. - - - -Example - - -$ nix-store -l $(which ktorrent) -building /nix/store/dhc73pvzpnzxhdgpimsd9sw39di66ph1-ktorrent-2.2.1 -unpacking sources -unpacking source archive /nix/store/p8n1jpqs27mgkjw07pb5269717nzf5f8-ktorrent-2.2.1.tar.gz -ktorrent-2.2.1/ -ktorrent-2.2.1/NEWS -... - - - - - - - - - - -Operation <option>--dump-db</option> - - - Synopsis - - nix-store - - - - -Description - -The operation writes a dump of the -Nix database to standard output. It can be loaded into an empty Nix -store using . This is useful for making -backups and when migrating to different database schemas. - - - - - - - - -Operation <option>--load-db</option> - - - Synopsis - - nix-store - - - - -Description - -The operation reads a dump of the Nix -database created by from standard input and -loads it into the Nix database. - - - - - - - - -Operation <option>--print-env</option> - - - Synopsis - - nix-store - - drvpath - - - -Description - -The operation prints out the -environment of a derivation in a format that can be evaluated by a -shell. The command line arguments of the builder are placed in the -variable _args. - - - -Example - - -$ nix-store --print-env $(nix-instantiate '<nixpkgs>' -A firefox) - -export src; src='/nix/store/plpj7qrwcz94z2psh6fchsi7s8yihc7k-firefox-12.0.source.tar.bz2' -export stdenv; stdenv='/nix/store/7c8asx3yfrg5dg1gzhzyq2236zfgibnn-stdenv' -export system; system='x86_64-linux' -export _args; _args='-e /nix/store/9krlzvny65gdc8s7kpb6lkx8cd02c25c-default-builder.sh' - - - - - - - - - -Operation <option>--query-failed-paths</option> - - - Synopsis - - nix-store - - - - -Description - -If build failure caching is enabled through the -build-cache-failures configuration option, the -operation will print out all -store paths that have failed to build. - - - -Example - - -$ nix-store --query-failed-paths -/nix/store/000zi5dcla86l92jn1g997jb06sidm7x-perl-PerlMagick-6.59 -/nix/store/0011iy7sfwbc1qj5a1f6ifjnbcdail8a-haskell-gitit-ghc7.0.4-0.8.1 -/nix/store/001c0yn1hkh86gprvrb46cxnz3pki7q3-gamin-0.1.10 - - - - - - - - - - -Operation <option>--clear-failed-paths</option> - - - Synopsis - - nix-store - - paths - - - -Description - -If build failure caching is enabled through the -build-cache-failures configuration option, the -operation clears the “failed” -state of the given store paths, allowing them to be built again. This -is useful if the failure was actually transient (e.g. because the disk -was full). - -If a path denotes a derivation, its output paths are cleared. -You can provide the argument * to clear all store -paths. - - - -Example - - -$ nix-store --clear-failed-paths /nix/store/000zi5dcla86l92jn1g997jb06sidm7x-perl-PerlMagick-6.59 -$ nix-store --clear-failed-paths * - - - - - - - - - -Environment variables - - - - - - - - - diff --git a/doc/manual/opt-common-syn.xml b/doc/manual/opt-common-syn.xml deleted file mode 100644 index d65f4009ee..0000000000 --- a/doc/manual/opt-common-syn.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - number - - - - number - - - - number - - - - number - - - - - - - - type - - - - path - - - - name - value - - - - diff --git a/doc/manual/opt-common.xml b/doc/manual/opt-common.xml deleted file mode 100644 index f8584f4d62..0000000000 --- a/doc/manual/opt-common.xml +++ /dev/null @@ -1,389 +0,0 @@ -
- -Common options - - -Most Nix commands accept the following command-line options: - - - - - - Prints out a summary of the command syntax and - exits. - - - - - - - Prints out the Nix version number on standard output - and exits. - - - - - - - - - Increases the level of verbosity of diagnostic messages - printed on standard error. For each Nix operation, the information - printed on standard output is well-defined; any diagnostic - information is printed on standard error, never on standard - output. - - This option may be specified repeatedly. Currently, the - following verbosity levels exist: - - - - 0 - “Errors only”: only print messages - explaining why the Nix invocation failed. - - - 1 - “Informational”: print - useful messages about what Nix is doing. - This is the default. - - - 2 - “Talkative”: print more informational - messages. - - - 3 - “Chatty”: print even more - informational messages. - - - 4 - “Debug”: print debug - information. - - - 5 - “Vomit”: print vast amounts of debug - information. - - - - - - - - - - - - - By default, output written by builders to standard - output and standard error is echoed to the Nix command's standard - error. This option suppresses this behaviour. Note that the - builder's standard output and error are always written to a log file - in - prefix/nix/var/log/nix. - - - - - - - - Sets the maximum number of build jobs that Nix will - perform in parallel to the specified number. The default is - specified by the build-max-jobs - configuration setting, which itself defaults to - 1. A higher value is useful on SMP systems or to - exploit I/O latency. - - - - - - - Sets the value of the NIX_BUILD_CORES - environment variable in the invocation of builders. Builders can - use this variable at their discretion to control the maximum amount - of parallelism. For instance, in Nixpkgs, if the derivation - attribute enableParallelBuilding is set to - true, the builder passes the - flag to GNU Make. - It defaults to the value of the build-cores - configuration setting, if set, or 1 otherwise. - The value 0 means that the builder should use all - available CPU cores in the system. - - - - - - - Sets the maximum number of seconds that a builder - can go without producing any data on standard output or standard - error. The default is specified by the build-max-silent-time - configuration setting. 0 means no - time-out. - - - - - - Sets the maximum number of seconds that a builder - can run. The default is specified by the build-timeout - configuration setting. 0 means no - timeout. - - - - - - - Keep going in case of failed builds, to the - greatest extent possible. That is, if building an input of some - derivation fails, Nix will still build the other inputs, but not the - derivation itself. Without this option, Nix stops if any build - fails (except for builds of substitutes), possibly killing builds in - progress (in case of parallel or distributed builds). - - - - - - - - Specifies that in case of a build failure, the - temporary directory (usually in /tmp) in which - the build takes place should not be deleted. The path of the build - directory is printed as an informational message. - - - - - - - - - - Whenever Nix attempts to build a derivation for which - substitutes are known for each output path, but realising the output - paths through the substitutes fails, fall back on building the - derivation. - - The most common scenario in which this is useful is when we - have registered substitutes in order to perform binary distribution - from, say, a network repository. If the repository is down, the - realisation of the derivation will fail. When this option is - specified, Nix will build the derivation instead. Thus, - installation from binaries falls back on installation from source. - This option is not the default since it is generally not desirable - for a transient failure in obtaining the substitutes to lead to a - full build from source (with the related consumption of - resources). - - - - - - - - - When this option is used, no attempt is made to open - the Nix database. Most Nix operations do need database access, so - those operations will fail. - - - - - -type - - - - This option determines how the output written to standard - error is formatted. Nix’s diagnostic messages are typically - nested. For instance, when tracing Nix - expression evaluation (nix-env -vvvvv, messages - from subexpressions are nested inside their parent expressions. Nix - builder output is also often nested. For instance, the Nix Packages - generic builder nests the various build tasks (unpack, configure, - compile, etc.), and the GNU Make in stdenv-linux - has been patched to provide nesting for recursive Make - invocations. - - type can be one of the - following: - - - - pretty - - Pretty-print the output, indicating different - nesting levels using spaces. This is the - default. - - - - escapes - - Indicate nesting using escape codes that can be - interpreted by the nix-log2xml tool in the - Nix source distribution. The resulting XML file can be fed into - the log2html.xsl stylesheet to create an HTML - file that can be browsed interactively, using JavaScript to - expand and collapse parts of the output. - - - - flat - - Remove all nesting. - - - - - - - - - - - - - name value - - This option is accepted by - nix-env, nix-instantiate and - nix-build. When evaluating Nix expressions, the - expression evaluator will automatically try to call functions that - it encounters. It can automatically call functions for which every - argument has a default value - (e.g., { argName ? - defaultValue }: - ...). With - , you can also call functions that have - arguments without a default value (or override a default value). - That is, if the evaluator encounters a function with an argument - named name, it will call it with value - value. - - For instance, the file - pkgs/top-level/all-packages.nix in Nixpkgs is - actually a function: - - -{ # The system (e.g., `i686-linux') for which to build the packages. - system ? builtins.currentSystem - ... -}: ... - - So if you call this Nix expression (e.g., when you do - nix-env -i pkgname), - the function will be called automatically using the value builtins.currentSystem - for the system argument. You can override this - using , e.g., nix-env -i - pkgname --arg system - \"i686-freebsd\". (Note that since the argument is a Nix - string literal, you have to escape the quotes.) - - - - - name value - - This option is like , only the - value is not a Nix expression but a string. So instead of - --arg system \"i686-linux\" (the outer quotes are - to keep the shell happy) you can say --argstr system - i686-linux. - - - - - / -attrPath - - Select an attribute from the top-level Nix - expression being evaluated. (nix-env, - nix-instantiate, nix-build and - nix-shell only.) The attribute - path attrPath is a sequence of - attribute names separated by dots. For instance, given a top-level - Nix expression e, the attribute path - xorg.xorgserver would cause the expression - e.xorg.xorgserver to - be used. See nix-env - --install for some concrete examples. - - In addition to attribute names, you can also specify array - indices. For instance, the attribute path - foo.3.bar selects the bar - attribute of the fourth element of the array in the - foo attribute of the top-level - expression. - - - - - / - - Interpret the command line arguments as a list of - Nix expressions to be parsed and evaluated, rather than as a list - of file names of Nix expressions. - (nix-instantiate, nix-build - and nix-shell only.) - - - - - - Causes Nix to print out a stack trace in case of Nix - expression evaluation errors. - - - - - path - - Add a path to the Nix expression search path. This - option may be given multiple times. See the NIX_PATH - environment variable for information on the semantics of the Nix - search path. Paths added through take - precedence over NIX_PATH. - - - - - name value - - Set the Nix configuration option - name to value. - This overrides settings in the Nix configuration file (see - nix.conf5). - - - - - - - Fix corrupted or missing store paths by - redownloading or rebuilding them. Note that this is slow because it - requires computing a cryptographic hash of the contents of every - path in the closure of the build. Also note the warning under - nix-store --repair-path. - - - - - - - -
diff --git a/doc/manual/opt-inst-syn.xml b/doc/manual/opt-inst-syn.xml deleted file mode 100644 index e8c3f1ec6f..0000000000 --- a/doc/manual/opt-inst-syn.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - path - - diff --git a/doc/manual/package-management.xml b/doc/manual/package-management.xml deleted file mode 100644 index e1d24b1477..0000000000 --- a/doc/manual/package-management.xml +++ /dev/null @@ -1,591 +0,0 @@ - - -Package Management - - -This chapter discusses how to do package management with Nix, -i.e., how to obtain, install, upgrade, and erase packages. This is -the “user’s” perspective of the Nix system — people -who want to create packages should consult -. - - -
Basic package management - -The main command for package management is nix-env. You can use -it to install, upgrade, and erase packages, and to query what -packages are installed or are available for installation. - -In Nix, different users can have different “views” -on the set of installed applications. That is, there might be lots of -applications present on the system (possibly in many different -versions), but users can have a specific selection of those active — -where “active” just means that it appears in a directory -in the user’s PATH. Such a view on the set of -installed applications is called a user -environment, which is just a directory tree consisting of -symlinks to the files of the active applications. - -Components are installed from a set of Nix -expressions that tell Nix how to build those packages, -including, if necessary, their dependencies. There is a collection of -Nix expressions called the Nix Package collection that contains -packages ranging from basic development stuff such as GCC and Glibc, -to end-user applications like Mozilla Firefox. (Nix is however not -tied to the Nix Package collection; you could write your own Nix -expressions based on it, or completely new ones.) You can download -the latest version from . - -Assuming that you have downloaded and unpacked a release of Nix -Packages, you can view the set of available packages in the release: - - -$ nix-env -qaf nixpkgs-version '*' -ant-blackdown-1.4.2 -aterm-2.2 -bash-3.0 -binutils-2.15 -bison-1.875d -blackdown-1.4.2 -bzip2-1.0.2 -... - -where nixpkgs-version is -where you’ve unpacked the release. The flag -specifies a query operation; means that you want -to show the “available” (i.e., installable) packages, as opposed to -the installed packages; and -nixpkgs-version -specifies the source of the packages. The argument -'*' shows all installable packages. (The quotes are -necessary to prevent shell expansion.) You can also select specific -packages by name: - - -$ nix-env -qaf nixpkgs-version gcc -gcc-3.4.6 -gcc-4.0.3 -gcc-4.1.1 - - - -It is also possible to see the status of -available packages, i.e., whether they are installed into the user -environment and/or present in the system: - - -$ nix-env -qasf nixpkgs-version '*' -... --PS bash-3.0 ---S binutils-2.15 -IPS bison-1.875d -... - -The first character (I) indicates whether the -package is installed in your current user environment. The second -(P) indicates whether it is present on your system -(in which case installing it into your user environment would be a -very quick operation). The last one (S) indicates -whether there is a so-called substitute for the -package, which is Nix’s mechanism for doing binary deployment. It -just means that Nix knows that it can fetch a pre-built package from -somewhere (typically a network server) instead of building it -locally. - -So now that we have a set of Nix expressions we can build the -packages contained in them. This is done using nix-env --i. For instance, - - -$ nix-env -f nixpkgs-version -i subversion - -will install the package called subversion (which -is, of course, the Subversion version -management system). - -When you do this for the first time, Nix will start building -Subversion and all its dependencies. This will take quite a while — -typically an hour or two on modern machines. Fortunately, there is a -faster way (so do a Ctrl-C on that install operation!): you just need -to tell Nix that pre-built binaries of all those packages are -available somewhere. This is done using the -nix-pull command, which must be supplied with a URL -containing a manifest describing what binaries -are available. This URL should correspond to the Nix Packages release -that you’re using. For instance, if you obtained a release from , then you should do: - - -$ nix-pull http://nixos.org/releases/nixpkgs/nixpkgs-0.12pre11712-4lrp7j8x/MANIFEST - -If you then issue the installation command, it should start -downloading binaries from nixos.org, instead of building -them from source. This might still take a while since all -dependencies must be downloaded, but on a reasonably fast connection -such as a DSL line it’s on the order of a few minutes. - -Naturally, packages can also be uninstalled: - - -$ nix-env -e subversion - - - -Upgrading to a new version is just as easy. If you have a new -release of Nix Packages, you can do: - - -$ nix-env -f nixpkgs-version -u subversion - -This will only upgrade Subversion if there is a -“newer” version in the new set of Nix expressions, as -defined by some pretty arbitrary rules regarding ordering of version -numbers (which generally do what you’d expect of them). To just -unconditionally replace Subversion with whatever version is in the Nix -expressions, use -i instead of --u; -i will remove -whatever version is already installed. - -You can also upgrade all packages for which there are newer -versions: - - -$ nix-env -f nixpkgs-version -u '*' - - - -Sometimes it’s useful to be able to ask what -nix-env would do, without actually doing it. For -instance, to find out what packages would be upgraded by -nix-env -u '*', you can do - - -$ nix-env ... -u '*' --dry-run -(dry run; not doing anything) -upgrading `libxslt-1.1.0' to `libxslt-1.1.10' -upgrading `graphviz-1.10' to `graphviz-1.12' -upgrading `coreutils-5.0' to `coreutils-5.2.1' - - - -
- - -
Profiles - -Profiles and user environments are Nix’s mechanism for -implementing the ability to allow different users to have different -configurations, and to do atomic upgrades and rollbacks. To -understand how they work, it’s useful to know a bit about how Nix -works. In Nix, packages are stored in unique locations in the -Nix store (typically, -/nix/store). For instance, a particular version -of the Subversion package might be stored in a directory -/nix/store/dpmvp969yhdqs7lm2r1a3gng7pyq6vy4-subversion-1.1.3/, -while another version might be stored in -/nix/store/5mq2jcn36ldlmh93yj1n8s9c95pj7c5s-subversion-1.1.2. -The long strings prefixed to the directory names are cryptographic -hashes160-bit truncations of SHA-256 hashes encoded in -a base-32 notation, to be precise. of -all inputs involved in building the package — -sources, dependencies, compiler flags, and so on. So if two -packages differ in any way, they end up in different locations in -the file system, so they don’t interfere with each other. shows a part of a typical Nix -store. - -
User environments - - - - - -
- -Of course, you wouldn’t want to type - - -$ /nix/store/dpmvp969yhdq...-subversion-1.1.3/bin/svn - -every time you want to run Subversion. Of course we could set up the -PATH environment variable to include the -bin directory of every package we want to use, -but this is not very convenient since changing PATH -doesn’t take effect for already existing processes. The solution Nix -uses is to create directory trees of symlinks to -activated packages. These are called -user environments and they are packages -themselves (though automatically generated by -nix-env), so they too reside in the Nix store. For -instance, in the user -environment /nix/store/0c1p5z4kda11...-user-env -contains a symlink to just Subversion 1.1.2 (arrows in the figure -indicate symlinks). This would be what we would obtain if we had done - - -$ nix-env -i subversion - -on a set of Nix expressions that contained Subversion 1.1.2. - -This doesn’t in itself solve the problem, of course; you -wouldn’t want to type -/nix/store/0c1p5z4kda11...-user-env/bin/svn -either. That’s why there are symlinks outside of the store that point -to the user environments in the store; for instance, the symlinks -default-42-link and -default-43-link in the example. These are called -generations since every time you perform a -nix-env operation, a new user environment is -generated based on the current one. For instance, generation 43 was -created from generation 42 when we did - - -$ nix-env -i subversion mozilla - -on a set of Nix expressions that contained Mozilla and a new version -of Subversion. - -Generations are grouped together into -profiles so that different users don’t interfere -with each other if they don’t want to. For example: - - -$ ls -l /nix/var/nix/profiles/ -... -lrwxrwxrwx 1 eelco ... default-42-link -> /nix/store/0c1p5z4kda11...-user-env -lrwxrwxrwx 1 eelco ... default-43-link -> /nix/store/3aw2pdyx2jfc...-user-env -lrwxrwxrwx 1 eelco ... default -> default-43-link - -This shows a profile called default. The file -default itself is actually a symlink that points -to the current generation. When we do a nix-env -operation, a new user environment and generation link are created -based on the current one, and finally the default -symlink is made to point at the new generation. This last step is -atomic on Unix, which explains how we can do atomic upgrades. (Note -that the building/installing of new packages doesn’t interfere in -any way with old packages, since they are stored in different -locations in the Nix store.) - -If you find that you want to undo a nix-env -operation, you can just do - - -$ nix-env --rollback - -which will just make the current generation link point at the previous -link. E.g., default would be made to point at -default-42-link. You can also switch to a -specific generation: - - -$ nix-env --switch-generation 43 - -which in this example would roll forward to generation 43 again. You -can also see all available generations: - - -$ nix-env --list-generations - -Actually, there is another level of indirection not shown in the -figure above. You generally wouldn’t have -/nix/var/nix/profiles/some-profile/bin -in your PATH. Rather, there is a symlink -~/.nix-profile that points to your current -profile. This means that you should put -~/.nix-profile/bin in your PATH -(and indeed, that’s what the initialisation script -/nix/etc/profile.d/nix.sh does). This makes it -easier to switch to a different profile. You can do that using the -command nix-env --switch-profile: - - -$ nix-env --switch-profile /nix/var/nix/profiles/my-profile - -$ nix-env --switch-profile /nix/var/nix/profiles/default - -These commands switch to the my-profile and -default profile, respectively. If the profile doesn’t exist, it will -be created automatically. You should be careful about storing a -profile in another location than the profiles -directory, since otherwise it might not be used as a root of the -garbage collector (see ). - -All nix-env operations work on the profile -pointed to by ~/.nix-profile, but you can override -this using the option (abbreviation -): - - -$ nix-env -p /nix/var/nix/profiles/other-profile -i subversion - -This will not change the -~/.nix-profile symlink. - -
- - -
Garbage collection - -nix-env operations such as upgrades -() and uninstall () never -actually delete packages from the system. All they do (as shown -above) is to create a new user environment that no longer contains -symlinks to the “deleted” packages. - -Of course, since disk space is not infinite, unused packages -should be removed at some point. You can do this by running the Nix -garbage collector. It will remove from the Nix store any package -not used (directly or indirectly) by any generation of any -profile. - -Note however that as long as old generations reference a -package, it will not be deleted. After all, we wouldn’t be able to -do a rollback otherwise. So in order for garbage collection to be -effective, you should also delete (some) old generations. Of course, -this should only be done if you are certain that you will not need to -roll back. - -To delete all old (non-current) generations of your current -profile: - - -$ nix-env --delete-generations old - -Instead of old you can also specify a list of -generations, e.g., - - -$ nix-env --delete-generations 10 11 14 - - - -After removing appropriate old generations you can run the -garbage collector as follows: - - -$ nix-store --gc - -If you are feeling uncertain, you can also first view what files would -be deleted: - - -$ nix-store --gc --print-dead - -Likewise, the option will show the paths -that won’t be deleted. - -There is also a convenient little utility -nix-collect-garbage, which when invoked with the - () switch deletes all -old generations of all profiles in -/nix/var/nix/profiles. So - - -$ nix-collect-garbage -d - -is a quick and easy way to clean up your system. - - - - -
Garbage collector roots - -The roots of the garbage collector are all store paths to which -there are symlinks in the directory -prefix/nix/var/nix/gcroots. -For instance, the following command makes the path -/nix/store/d718ef...-foo a root of the collector: - - -$ ln -s /nix/store/d718ef...-foo /nix/var/nix/gcroots/bar - -That is, after this command, the garbage collector will not remove -/nix/store/d718ef...-foo or any of its -dependencies. - -Subdirectories of -prefix/nix/var/nix/gcroots -are also searched for symlinks. Symlinks to non-store paths are -followed and searched for roots, but symlinks to non-store paths -inside the paths reached in that way are not -followed to prevent infinite recursion. - -
- -
- - -
Channels - -If you want to stay up to date with a set of packages, it’s not -very convenient to manually download the latest set of Nix expressions -for those packages, use nix-pull to register -pre-built binaries (if available), and upgrade using -nix-env. Fortunately, there’s a better way: -Nix channels. - -A Nix channel is just a URL that points to a place that contains -a set of Nix expressions and a manifest. Using the command nix-channel you -can automatically stay up to date with whatever is available at that -URL. - -You can “subscribe” to a channel using -nix-channel --add, e.g., - - -$ nix-channel --add http://nixos.org/channels/nixpkgs-unstable - -subscribes you to a channel that always contains that latest version -of the Nix Packages collection. (Instead of -nixpkgs-unstable you could also subscribe to -nixpkgs-stable, which should have a higher level of -stability, but right now is just outdated.) Subscribing really just -means that the URL is added to the file -~/.nix-channels. Right now there is no command -to “unsubscribe”; you should just edit that file manually -and delete the offending URL. - -To obtain the latest Nix expressions available in a channel, do - - -$ nix-channel --update - -This downloads the Nix expressions in every channel (downloaded from -url/nixexprs.tar.bz2) -and registers any available pre-built binaries in every channel -(by nix-pulling -url/MANIFEST). It also -makes the union of each channel’s Nix expressions the default for -nix-env operations. Consequently, you can then say - - -$ nix-env -u '*' - -to upgrade all packages in your profile to the latest versions -available in the subscribed channels. - -
- - -
One-click installs - -Often, when you want to install a specific package (e.g., from -the Nix -Packages collection), subscribing to a channel is a bit -cumbersome. And channels don’t help you at all if you want to install -an older version of a package than the one provided by the current -contents of the channel, or a package that has been removed from the -channel. That’s when one-click installs come in -handy: you can just go to the web page that contains the package, -click on it, and it will be installed with all the necessary -dependencies. - -For instance, you can go to and click on any link for the individual packages for your -platform. The first time you do this, your browser will ask what to -do with application/nix-package files. You should -open them with /nix/bin/nix-install-package. -This will open a window that asks you to confirm that you want to -install the package. When you answer Y, the -package and all its dependencies will be installed. This is a binary -deployment mechanism — you get packages pre-compiled for the selected -platform type. - -You can also install application/nix-package -files from the command line directly. See for details. - -
- - -
Sharing packages between machines - -Sometimes you want to copy a package from one machine to -another. Or, you want to install some packages and you know that -another machine already has some or all of those packages or their -dependencies. In that case there are mechanisms to quickly copy -packages between machines. - -The command nix-copy-closure copies a Nix -store path along with all its dependencies to or from another machine -via the SSH protocol. It doesn’t copy store paths that are already -present on the target machine. For example, the following command -copies Firefox with all its dependencies: - - -$ nix-copy-closure --to alice@itchy.example.org $(type -p firefox) - -See for details. - -With nix-store ---export and nix-store --import you can -write the closure of a store path (that is, the path and all its -dependencies) to a file, and then unpack that file into another Nix -store. For example, - - -$ nix-store --export $(nix-store -qR $(type -p firefox)) > firefox.closure - -writes the closure of Firefox to a file. You can then copy this file -to another machine and install the closure: - - -$ nix-store --import < firefox.closure - -Any store paths in the closure that are already present in the target -store are ignored. It is also possible to pipe the export into -another command, e.g. to copy and install a closure directly to/on -another machine: - - -$ nix-store --export $(nix-store -qR $(type -p firefox)) | bzip2 | \ - ssh alice@itchy.example.org "bunzip2 | nix-store --import" - -But note that nix-copy-closure is generally more -efficient in this example because it only copies paths that are not -already present in the target Nix store. - -Finally, if you can mount the Nix store of a remote machine in -your local filesystem, Nix can copy paths from the remote Nix store to -the local Nix store on demand. For instance, -suppose that you mount a remote machine containing a Nix store via -sshfs: - - -$ sshfs alice@itchy.example.org:/ /mnt - -You should then set the NIX_OTHER_STORES environment -variable to tell Nix about this remote Nix store: - - -$ export NIX_OTHER_STORES=/mnt/nix - -Then if you do any Nix operation, e.g. - - -$ nix-env -i firefox - -and Nix has to build a path that it sees is already present in -/mnt/nix, then it will just copy from there -instead of building it from source. - - -
- - -
diff --git a/doc/manual/quick-start.xml b/doc/manual/quick-start.xml deleted file mode 100644 index 779b9b9b85..0000000000 --- a/doc/manual/quick-start.xml +++ /dev/null @@ -1,145 +0,0 @@ - - -Quick Start - - -This chapter is for impatient people who don't like reading -documentation. For more in-depth information you are kindly referred -to the following chapters. - - - -Download a source tarball or RPM or Debian/Ubuntu -package from . Build source -distributions using the regular sequence: - - -$ tar xvfj nix-version.tar.bz2 -$ cd nix-version -$ ./configure -$ make -$ make install (as root) - -This will install the Nix binaries in /usr/local -and keep the Nix store and other state in /nix. -You can change the former by specifying -. The -location of the store can be changed using -. -However, you shouldn't change the store location, if at all possible, -since that will make it impossible to use pre-built binaries from the -Nixpkgs channel and other channels. The location of the state can be -changed using - - -You should add -prefix/etc/profile.d/nix.sh -to your ~/.profile (or some other login -file). - -Subscribe to the Nix Packages channel. - - -$ nix-channel --add http://nixos.org/channels/nixpkgs-unstable - - - -Download the latest Nix expressions available in the channel. - -$ nix-channel --update - -Note that this in itself doesn't download any packages, it just -downloads the Nix expressions that build them and stores them -somewhere (under ~/.nix-defexpr, in case you're -curious). Also, it registers the fact that pre-built binaries are -available remotely. - -See what installable packages are currently available -in the channel: - - -$ nix-env -qa \* -docbook-xml-4.2 -firefox-1.0pre-PR-0.10.1 -hello-2.1.1 -libxslt-1.1.0 -... - - - -Install some packages from the channel: - - -$ nix-env -i hello firefox ... - -This should download pre-built packages; it should not build them -locally (if it does, something went wrong). - -Test that they work: - - -$ which hello -/home/eelco/.nix-profile/bin/hello -$ hello -Hello, world! -$ firefox -(read Slashdot or something) - - - -Uninstall a package: - - -$ nix-env -e hello - - - -To keep up-to-date with the channel, do: - - -$ nix-channel --update -$ nix-env -u '*' - -The latter command will upgrade each installed package for which there -is a “newer” version (as determined by comparing the version -numbers). - -You can also install specific packages directly from -your web browser. For instance, you can go to and click on any link for the individual packages for your -platform. Associate application/nix-package with -the program nix-install-package. A window should -appear asking you whether it’s okay to install the package. Say -Y. The package and all its dependencies will be -installed. - -If you're unhappy with the result of a -nix-env action (e.g., an upgraded package turned -out not to work properly), you can go back: - - -$ nix-env --rollback - - - -You should periodically run the Nix garbage collector -to get rid of unused packages, since uninstalls or upgrades don't -actually delete them: - - -$ nix-collect-garbage -d - - - - - - - - diff --git a/doc/manual/quote-literals.xsl b/doc/manual/quote-literals.xsl deleted file mode 100644 index 5002643dbd..0000000000 --- a/doc/manual/quote-literals.xsl +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - `' - - - - - - - - - -
- - - -
-
- - - - - - - - - - - - - -
diff --git a/doc/manual/release-notes.xml b/doc/manual/release-notes.xml deleted file mode 100644 index 5147f1f2f8..0000000000 --- a/doc/manual/release-notes.xml +++ /dev/null @@ -1,2483 +0,0 @@ -
- -Nix Release Notes - - - - -
Release 1.7 (TBA) - -In addition to the usual bug fixes, this release has the -following new features: - - - - - Antiquotation is now allowed inside of quoted attribute - names (e.g. set."${foo}"). In the case where - the attribute name is just a single antiquotation, the quotes can - be dropped (e.g. the above example can be written - set.${foo}). If an attribute name inside of a - set declaration evaluates to null (e.g. - { ${null} = false; }), then that attribute is - not added to the set. - - - - Experimental support for cryptographically signed binary - caches. See the - commit for details. - - - - An experimental new substituter, - download-via-ssh, that fetches binaries from - remote machines via SSH. Specifying the flags --option - use-ssh-substituter true --option ssh-substituter-hosts - user@hostname will cause Nix - to download binaries from the specified machine, if it has - them. - - - - nix-store -r and - nix-build have a new flag, - , that builds a previously built - derivation again, and prints an error message if the output is not - exactly the same. This helps to verify whether a derivation is - truly deterministic. For example: - - -$ nix-build '<nixpkgs>' -A patchelf - -$ nix-build '<nixpkgs>' -A patchelf --check - -error: derivation `/nix/store/1ipvxs…-patchelf-0.6' may not be deterministic: - hash mismatch in output `/nix/store/4pc1dm…-patchelf-0.6.drv' - - - - - - - - The nix-instantiate flags - and - have been renamed to and - , respectively. - - - - nix-instantiate, - nix-build and nix-shell now - have a flag (or ) that - allows you to specify the expression to be evaluated as a command - line argument. For instance, nix-instantiate --eval -E - '1 + 2' will print 3. - - - - nix-shell improvements: - - - - - It has a new flag, (or - ), that sets up a build environment - containing the specified packages from Nixpkgs. For example, - the command - - -$ nix-shell -p sqlite xorg.libX11 hello - - - will start a shell in which the given packages are - present. - - - - It now uses shell.nix as the - default expression, falling back to - default.nix if the former doesn’t - exist. This makes it convenient to have a - shell.nix in your project to set up a - nice development environment. - - - - It evaluates the derivation attribute - shellHook, if set. Since - stdenv does not normally execute this hook, - it allows you to do nix-shell-specific - setup. - - - - It preserves the user’s timezone setting. - - - - - - - - In chroots, Nix now sets up a /dev - containing only a minimal set of devices (such as - /dev/null). Note that it only does this if - you don’t have /dev - listed in your setting; - otherwise, it will bind-mount the /dev from - outside the chroot. - - Similarly, if you don’t have /dev/pts listed - in , Nix will mount a private - devpts filesystem on the chroot’s - /dev/pts. - - - - - New built-in function: builtins.toJSON, - which returns a JSON representation of a value. - - - - nix-env -q has a new flag - to print a JSON representation of the - installed or available packages. - - - - nix-env now supports meta attributes with - more complex values, such as attribute sets. - - - - The flag now allows attribute names with - dots in them, e.g. - - -$ nix-instantiate --eval '<nixos>' -A 'config.systemd.units."nscd.service".text' - - - - - - - The option to - nix-store --gc now accepts a unit - specifier. For example, nix-store --gc --max-freed - 1G will free up to 1 gigabyte of disk space. - - - - Nix now heuristically detects whether a build failure was - due to a disk-full condition. In that case, the build is not - flagged as “permanently failed”. This is mostly useful for Hydra, - which needs to distinguish between permanent and transient build - failures. - - - - There is a new symbol __curPos that - expands to an attribute set containing its file name and line and - column numbers, e.g. { file = "foo.nix"; line = 10; - column = 5; }. There also is a new builtin function, - unsafeGetAttrPos, that returns the position of - an attribute. This is used by Nixpkgs to provide location - information in error messages, e.g. - - -$ nix-build '<nixpkgs>' -A libreoffice --argstr system x86_64-darwin -error: the package ‘libreoffice-4.0.5.2’ in ‘.../applications/office/libreoffice/default.nix:263’ - is not supported on ‘x86_64-darwin’ - - - - - - - The garbage collector is now more concurrent with other Nix - processes because it releases certain locks earlier. - - - - The binary tarball installer has been improved. You can now - install Nix by running: - - -$ bash <(curl https://nixos.org/nix/install) - - - - - - - The command nix-setuid-helper is - gone. - - - - Nix no longer uses Automake, but instead has a - non-recursive, GNU Make-based build system. - - - - All installed libraries now have the prefix - libnix. In particular, this gets rid of - libutil, which could clash with libraries with - the same name from other packages. - - - - -
- - - - -
Release 1.6.1 (October 28, 2013) - -This is primarily a bug fix release. Changes of interest -are: - - - - - Nix 1.6 accidentally changed the semantics of antiquoted - paths in strings, such as "${/foo}/bar". This - release reverts to the Nix 1.5.3 behaviour. - - - - Previously, Nix optimised expressions such as - "${expr}" to - expr. Thus it neither checked whether - expr could be coerced to a string, nor - applied such coercions. This meant that - "${123}" evaluatued to 123, - and "${./foo}" evaluated to - ./foo (even though - "${./foo} " evaluates to - "/nix/store/hash-foo "). - Nix now checks the type of antiquoted expressions and - applies coercions. - - - - Nix now shows the exact position of undefined variables. In - particular, undefined variable errors in a with - previously didn't show any position - information, so this makes it a lot easier to fix such - errors. - - - - Undefined variables are now treated consistently. - Previously, the tryEval function would catch - undefined variables inside a with but not - outside. Now tryEval never catches undefined - variables. - - - - Bash completion in nix-shell now works - correctly. - - - - Stack traces are less verbose: they no longer show calls to - builtin functions and only show a single line for each derivation - on the call stack. - - - - New built-in function: builtins.typeOf, - which returns the type of its argument as a string. - - - - -
- - - - -
Release 1.6 (September 10, 2013) - -In addition to the usual bug fixes, this release has several new -features: - - - - - The command nix-build --run-env has been - renamed to nix-shell. - - - - nix-shell now sources - $stdenv/setup inside the - interactive shell, rather than in a parent shell. This ensures - that shell functions defined by stdenv can be - used in the interactive shell. - - - - nix-shell has a new flag - to clear the environment, so you get an - environment that more closely corresponds to the “real” Nix build. - - - - - nix-shell now sets the shell prompt - (PS1) to ensure that Nix shells are distinguishable - from your regular shells. - - - - nix-env no longer requires a - * argument to match all packages, so - nix-env -qa is equivalent to nix-env - -qa '*'. - - - - nix-env -i has a new flag - () to remove all - previous packages from the profile. This makes it easier to do - declarative package management similar to NixOS’s - . For instance, if you - have a specification my-packages.nix like this: - - -with import <nixpkgs> {}; -[ thunderbird - geeqie - ... -] - - - then after any change to this file, you can run: - - -$ nix-env -f my-packages.nix -ir - - - to update your profile to match the specification. - - - - The ‘with’ language construct is now more - lazy. It only evaluates its argument if a variable might actually - refer to an attribute in the argument. For instance, this now - works: - - -let - pkgs = with pkgs; { foo = "old"; bar = foo; } // overrides; - overrides = { foo = "new"; }; -in pkgs.bar - - - This evaluates to "new", while previously it - gave an “infinite recursion” error. - - - - Nix now has proper integer arithmetic operators. For - instance, you can write x + y instead of - builtins.add x y, or x < - y instead of builtins.lessThan x y. - The comparison operators also work on strings. - - - - On 64-bit systems, Nix integers are now 64 bits rather than - 32 bits. - - - - When using the Nix daemon, the nix-daemon - worker process now runs on the same CPU as the client, on systems - that support setting CPU affinity. This gives a significant speedup - on some systems. - - - - If a stack overflow occurs in the Nix evaluator, you now get - a proper error message (rather than “Segmentation fault”) on some - systems. - - - - In addition to directories, you can now bind-mount regular - files in chroots through the (now misnamed) option - . - - - - -This release has contributions from Domen Kožar, Eelco Dolstra, -Florian Friesdorf, Gergely Risko, Ivan Kozik, Ludovic Courtès and Shea -Levy. - -
- - - - -
Release 1.5.3 (June 17, 2013) - -This is primarily a bug fix release. The following changes are -noteworthy: - - - - - Yet another security bug involving hard links to files - outside the store was fixed. This bug only affected multi-user - installations that do not have hard link restrictions - enabled. (NixOS is thus not vulnerable.) - - - - The default binary cache URL has changed from - http://nixos.org/binary-cache to - http://cache.nixos.org. The latter is hosted on Amazon - CloudFront (courtesy of LogicBlox) and - should provide better performance for users in both Europe and - North America. - - - - The binary cache substituter now prints a warning message if - fetching information from the cache takes more than five seconds. - Thus network or server problems no longer make Nix appear to just - hang. - - - - Stack traces now show function names, e.g. - -while evaluating `concatMapStrings' at `.../nixpkgs/pkgs/lib/strings.nix:18:25': - - Also, if a function is called with an unexpected argument, Nix - now shows the name of the argument. - - - - - -
- - - - -
Release 1.5.2 (May 13, 2013) - -This is primarily a bug fix release. It has contributions from -Eelco Dolstra, Lluís Batlle i Rossell and Shea Levy. - -
- - - - -
Release 1.5.1 (February 28, 2013) - -The bug fix to the bug fix had a bug itself, of course. But -this time it will work for sure! - -
- - - - -
Release 1.5 (February 27, 2013) - -This is a brown paper bag release to fix a regression introduced -by the hard link security fix in 1.4. - -
- - - - -
Release 1.4 (February 26, 2013) - -This release fixes a security bug in multi-user operation. It -was possible for derivations to cause the mode of files outside of the -Nix store to be changed to 444 (read-only but world-readable) by -creating hard links to those files (details). - -There are also the following improvements: - - - - New built-in function: - builtins.hashString. - - Build logs are now stored in - /nix/var/log/nix/drvs/XX/, - where XX is the first two characters of - the derivation. This is useful on machines that keep a lot of build - logs (such as Hydra servers). - - The function corepkgs/fetchurl - can now make the downloaded file executable. This will allow - getting rid of all bootstrap binaries in the Nixpkgs source - tree. - - Language change: The expression "${./path} - ..." now evaluates to a string instead of a - path. - - - -
- - - - -
Release 1.3 (January 4, 2013) - -This is primarily a bug fix release. When this version is first -run on Linux, it removes any immutable bits from the Nix store and -increases the schema version of the Nix store. (The previous release -removed support for setting the immutable bit; this release clears any -remaining immutable bits to make certain operations more -efficient.) - -This release has contributions from Eelco Dolstra and Stuart -Pernsteiner. - -
- - - - -
Release 1.2 (December 6, 2012) - -This release has the following improvements and changes: - - - - - Nix has a new binary substituter mechanism: the - binary cache. A binary cache contains - pre-built binaries of Nix packages. Whenever Nix wants to build a - missing Nix store path, it will check a set of binary caches to - see if any of them has a pre-built binary of that path. The - configuration setting contains a - list of URLs of binary caches. For instance, doing - -$ nix-env -i thunderbird --option binary-caches http://cache.nixos.org - - will install Thunderbird and its dependencies, using the available - pre-built binaries in http://cache.nixos.org. - The main advantage over the old “manifest”-based method of getting - pre-built binaries is that you don’t have to worry about your - manifest being in sync with the Nix expressions you’re installing - from; i.e., you don’t need to run nix-pull to - update your manifest. It’s also more scalable because you don’t - need to redownload a giant manifest file every time. - - - A Nix channel can provide a binary cache URL that will be - used automatically if you subscribe to that channel. If you use - the Nixpkgs or NixOS channels - (http://nixos.org/channels) you automatically get the - cache http://cache.nixos.org. - - Binary caches are created using nix-push. - For details on the operation and format of binary caches, see the - nix-push manpage. More details are provided in - this - nix-dev posting. - - - - Multiple output support should now be usable. A derivation - can declare that it wants to produce multiple store paths by - saying something like - -outputs = [ "lib" "headers" "doc" ]; - - This will cause Nix to pass the intended store path of each output - to the builder through the environment variables - lib, headers and - doc. Other packages can refer to a specific - output by referring to - pkg.output, - e.g. - -buildInputs = [ pkg.lib pkg.headers ]; - - If you install a package with multiple outputs using - nix-env, each output path will be symlinked - into the user environment. - - - - Dashes are now valid as part of identifiers and attribute - names. - - - - The new operation nix-store --repair-path - allows corrupted or missing store paths to be repaired by - redownloading them. nix-store --verify --check-contents - --repair will scan and repair all paths in the Nix - store. Similarly, nix-env, - nix-build, nix-instantiate - and nix-store --realise have a - flag to detect and fix bad paths by - rebuilding or redownloading them. - - - - Nix no longer sets the immutable bit on files in the Nix - store. Instead, the recommended way to guard the Nix store - against accidental modification on Linux is to make it a read-only - bind mount, like this: - - -$ mount --bind /nix/store /nix/store -$ mount -o remount,ro,bind /nix/store - - - Nix will automatically make /nix/store - writable as needed (using a private mount namespace) to allow - modifications. - - - - Store optimisation (replacing identical files in the store - with hard links) can now be done automatically every time a path - is added to the store. This is enabled by setting the - configuration option auto-optimise-store to - true (disabled by default). - - - - Nix now supports xz compression for NARs - in addition to bzip2. It compresses about 30% - better on typical archives and decompresses about twice as - fast. - - - - Basic Nix expression evaluation profiling: setting the - environment variable NIX_COUNT_CALLS to - 1 will cause Nix to print how many times each - primop or function was executed. - - - - New primops: concatLists, - elem, elemAt and - filter. - - - - The command nix-copy-closure has a new - flag () to - download missing paths on the target machine using the substitute - mechanism. - - - - The command nix-worker has been renamed - to nix-daemon. Support for running the Nix - worker in “slave” mode has been removed. - - - - The flag of every Nix command now - invokes man. - - - - Chroot builds are now supported on systemd machines. - - - - -This release has contributions from Eelco Dolstra, Florian -Friesdorf, Mats Erik Andersson and Shea Levy. - -
- - - - -
Release 1.1 (July 18, 2012) - -This release has the following improvements: - - - - - On Linux, when doing a chroot build, Nix now uses various - namespace features provided by the Linux kernel to improve - build isolation. Namely: - - The private network namespace ensures that - builders cannot talk to the outside world (or vice versa): each - build only sees a private loopback interface. This also means - that two concurrent builds can listen on the same port (e.g. as - part of a test) without conflicting with each - other. - The PID namespace causes each build to start as - PID 1. Processes outside of the chroot are not visible to those - on the inside. On the other hand, processes inside the chroot - are visible from the outside (though with - different PIDs). - The IPC namespace prevents the builder from - communicating with outside processes using SysV IPC mechanisms - (shared memory, message queues, semaphores). It also ensures - that all IPC objects are destroyed when the builder - exits. - The UTS namespace ensures that builders see a - hostname of localhost rather than the actual - hostname. - The private mount namespace was already used by - Nix to ensure that the bind-mounts used to set up the chroot are - cleaned up automatically. - - - - - - Build logs are now compressed using - bzip2. The command nix-store - -l decompresses them on the fly. This can be disabled - by setting the option build-compress-log to - false. - - - - The creation of build logs in - /nix/var/log/nix/drvs can be disabled by - setting the new option build-keep-log to - false. This is useful, for instance, for Hydra - build machines. - - - - Nix now reserves some space in - /nix/var/nix/db/reserved to ensure that the - garbage collector can run successfully if the disk is full. This - is necessary because SQLite transactions fail if the disk is - full. - - - - Added a basic fetchurl function. This - is not intended to replace the fetchurl in - Nixpkgs, but is useful for bootstrapping; e.g., it will allow us - to get rid of the bootstrap binaries in the Nixpkgs source tree - and download them instead. You can use it by doing - import <nix/fetchurl.nix> { url = - url; sha256 = - "hash"; }. (Shea Levy) - - - - Improved RPM spec file. (Michel Alexandre Salim) - - - - Support for on-demand socket-based activation in the Nix - daemon with systemd. - - - - Added a manpage for - nix.conf5. - - - - When using the Nix daemon, the flag in - nix-env -qa is now much faster. - - - - -
- - - - -
Release 1.0 (May 11, 2012) - -There have been numerous improvements and bug fixes since the -previous release. Here are the most significant: - - - - - Nix can now optionally use the Boehm garbage collector. - This significantly reduces the Nix evaluator’s memory footprint, - especially when evaluating large NixOS system configurations. It - can be enabled using the configure - option. - - - - Nix now uses SQLite for its database. This is faster and - more flexible than the old ad hoc format. - SQLite is also used to cache the manifests in - /nix/var/nix/manifests, resulting in a - significant speedup. - - - - Nix now has an search path for expressions. The search path - is set using the environment variable NIX_PATH and - the command line option. In Nix expressions, - paths between angle brackets are used to specify files that must - be looked up in the search path. For instance, the expression - <nixpkgs/default.nix> looks for a file - nixpkgs/default.nix relative to every element - in the search path. - - - - The new command nix-build --run-env - builds all dependencies of a derivation, then starts a shell in an - environment containing all variables from the derivation. This is - useful for reproducing the environment of a derivation for - development. - - - - The new command nix-store --verify-path - verifies that the contents of a store path have not - changed. - - - - The new command nix-store --print-env - prints out the environment of a derivation in a format that can be - evaluated by a shell. - - - - Attribute names can now be arbitrary strings. For instance, - you can write { "foo-1.2" = …; "bla bla" = …; }."bla - bla". - - - - Attribute selection can now provide a default value using - the or operator. For instance, the expression - x.y.z or e evaluates to the attribute - x.y.z if it exists, and e - otherwise. - - - - The right-hand side of the ? operator can - now be an attribute path, e.g., attrs ? - a.b.c. - - - - On Linux, Nix will now make files in the Nix store immutable - on filesystems that support it. This prevents accidental - modification of files in the store by the root user. - - - - Nix has preliminary support for derivations with multiple - outputs. This is useful because it allows parts of a package to - be deployed and garbage-collected separately. For instance, - development parts of a package such as header files or static - libraries would typically not be part of the closure of an - application, resulting in reduced disk usage and installation - time. - - - - The Nix store garbage collector is faster and holds the - global lock for a shorter amount of time. - - - - The option (corresponding to the - configuration setting build-timeout) allows you - to set an absolute timeout on builds — if a build runs for more than - the given number of seconds, it is terminated. This is useful for - recovering automatically from builds that are stuck in an infinite - loop but keep producing output, and for which - --max-silent-time is ineffective. - - - - Nix development has moved to GitHub (). - - - - -
- - - - -
Release 0.16 (August 17, 2010) - -This release has the following improvements: - - - - - The Nix expression evaluator is now much faster in most - cases: typically, 3 - to 8 times compared to the old implementation. It also - uses less memory. It no longer depends on the ATerm - library. - - - - - Support for configurable parallelism inside builders. Build - scripts have always had the ability to perform multiple build - actions in parallel (for instance, by running make -j - 2), but this was not desirable because the number of - actions to be performed in parallel was not configurable. Nix - now has an option as well as a configuration - setting build-cores = - N that causes the - environment variable NIX_BUILD_CORES to be set to - N when the builder is invoked. The - builder can use this at its discretion to perform a parallel - build, e.g., by calling make -j - N. In Nixpkgs, this can be - enabled on a per-package basis by setting the derivation - attribute enableParallelBuilding to - true. - - - - - nix-store -q now supports XML output - through the flag. - - - - Several bug fixes. - - - - -
- - - - -
Release 0.15 (March 17, 2010) - -This is a bug-fix release. Among other things, it fixes -building on Mac OS X (Snow Leopard), and improves the contents of -/etc/passwd and /etc/group -in chroot builds. - -
- - - - -
Release 0.14 (February 4, 2010) - -This release has the following improvements: - - - - - The garbage collector now starts deleting garbage much - faster than before. It no longer determines liveness of all paths - in the store, but does so on demand. - - - - Added a new operation, nix-store --query - --roots, that shows the garbage collector roots that - directly or indirectly point to the given store paths. - - - - Removed support for converting Berkeley DB-based Nix - databases to the new schema. - - - - Removed the and - garbage collector options. They were - not very useful in practice. - - - - On Windows, Nix now requires Cygwin 1.7.x. - - - - A few bug fixes. - - - - -
- - - - -
Release 0.13 (November 5, -2009) - -This is primarily a bug fix release. It has some new -features: - - - - - Syntactic sugar for writing nested attribute sets. Instead of - - -{ - foo = { - bar = 123; - xyzzy = true; - }; - a = { b = { c = "d"; }; }; -} - - - you can write - - -{ - foo.bar = 123; - foo.xyzzy = true; - a.b.c = "d"; -} - - - This is useful, for instance, in NixOS configuration files. - - - - - Support for Nix channels generated by Hydra, the Nix-based - continuous build system. (Hydra generates NAR archives on the - fly, so the size and hash of these archives isn’t known in - advance.) - - - - Support i686-linux builds directly on - x86_64-linux Nix installations. This is - implemented using the personality() syscall, - which causes uname to return - i686 in child processes. - - - - Various improvements to the chroot - support. Building in a chroot works quite well - now. - - - - Nix no longer blocks if it tries to build a path and another - process is already building the same path. Instead it tries to - build another buildable path first. This improves - parallelism. - - - - Support for large (> 4 GiB) files in NAR archives. - - - - Various (performance) improvements to the remote build - mechanism. - - - - New primops: builtins.addErrorContext (to - add a string to stack traces — useful for debugging), - builtins.isBool, - builtins.isString, - builtins.isInt, - builtins.intersectAttrs. - - - - OpenSolaris support (Sander van der Burg). - - - - Stack traces are no longer displayed unless the - option is used. - - - - The scoping rules for inherit - (e) ... in recursive - attribute sets have changed. The expression - e can now refer to the attributes - defined in the containing set. - - - - -
- - - - -
Release 0.12 (November 20, -2008) - - - - - Nix no longer uses Berkeley DB to store Nix store metadata. - The principal advantages of the new storage scheme are: it works - properly over decent implementations of NFS (allowing Nix stores - to be shared between multiple machines); no recovery is needed - when a Nix process crashes; no write access is needed for - read-only operations; no more running out of Berkeley DB locks on - certain operations. - - You still need to compile Nix with Berkeley DB support if - you want Nix to automatically convert your old Nix store to the - new schema. If you don’t need this, you can build Nix with the - configure option - . - - After the automatic conversion to the new schema, you can - delete the old Berkeley DB files: - - -$ cd /nix/var/nix/db -$ rm __db* log.* derivers references referrers reserved validpaths DB_CONFIG - - The new metadata is stored in the directories - /nix/var/nix/db/info and - /nix/var/nix/db/referrer. Though the - metadata is stored in human-readable plain-text files, they are - not intended to be human-editable, as Nix is rather strict about - the format. - - The new storage schema may or may not require less disk - space than the Berkeley DB environment, mostly depending on the - cluster size of your file system. With 1 KiB clusters (which - seems to be the ext3 default nowadays) it - usually takes up much less space. - - - There is a new substituter that copies paths - directly from other (remote) Nix stores mounted somewhere in the - filesystem. For instance, you can speed up an installation by - mounting some remote Nix store that already has the packages in - question via NFS or sshfs. The environment - variable NIX_OTHER_STORES specifies the locations of - the remote Nix directories, - e.g. /mnt/remote-fs/nix. - - New nix-store operations - and to dump - and reload the Nix database. - - The garbage collector has a number of new options to - allow only some of the garbage to be deleted. The option - tells the - collector to stop after at least N bytes - have been deleted. The option tells it to stop after the - link count on /nix/store has dropped below - N. This is useful for very large Nix - stores on filesystems with a 32000 subdirectories limit (like - ext3). The option - causes store paths to be deleted in order of ascending last access - time. This allows non-recently used stuff to be deleted. The - option - specifies an upper limit to the last accessed time of paths that may - be deleted. For instance, - - - $ nix-store --gc -v --max-atime $(date +%s -d "2 months ago") - - deletes everything that hasn’t been accessed in two months. - - nix-env now uses optimistic - profile locking when performing an operation like installing or - upgrading, instead of setting an exclusive lock on the profile. - This allows multiple nix-env -i / -u / -e - operations on the same profile in parallel. If a - nix-env operation sees at the end that the profile - was changed in the meantime by another process, it will just - restart. This is generally cheap because the build results are - still in the Nix store. - - The option is now - supported by nix-store -r and - nix-build. - - The information previously shown by - (i.e., which derivations will be built - and which paths will be substituted) is now always shown by - nix-env, nix-store -r and - nix-build. The total download size of - substitutable paths is now also shown. For instance, a build will - show something like - - -the following derivations will be built: - /nix/store/129sbxnk5n466zg6r1qmq1xjv9zymyy7-activate-configuration.sh.drv - /nix/store/7mzy971rdm8l566ch8hgxaf89x7lr7ik-upstart-jobs.drv - ... -the following paths will be downloaded/copied (30.02 MiB): - /nix/store/4m8pvgy2dcjgppf5b4cj5l6wyshjhalj-samba-3.2.4 - /nix/store/7h1kwcj29ip8vk26rhmx6bfjraxp0g4l-libunwind-0.98.6 - ... - - - - Language features: - - - - @-patterns as in Haskell. For instance, in a - function definition - - f = args @ {x, y, z}: ...; - - args refers to the argument as a whole, which - is further pattern-matched against the attribute set pattern - {x, y, z}. - - ...” (ellipsis) patterns. - An attribute set pattern can now say ... at - the end of the attribute name list to specify that the function - takes at least the listed attributes, while - ignoring additional attributes. For instance, - - {stdenv, fetchurl, fuse, ...}: ... - - defines a function that accepts any attribute set that includes - at least the three listed attributes. - - New primops: - builtins.parseDrvName (split a package name - string like "nix-0.12pre12876" into its name - and version components, e.g. "nix" and - "0.12pre12876"), - builtins.compareVersions (compare two version - strings using the same algorithm that nix-env - uses), builtins.length (efficiently compute - the length of a list), builtins.mul (integer - multiplication), builtins.div (integer - division). - - - - - - - - nix-prefetch-url now supports - mirror:// URLs, provided that the environment - variable NIXPKGS_ALL points at a Nixpkgs - tree. - - Removed the commands - nix-pack-closure and - nix-unpack-closure. You can do almost the same - thing but much more efficiently by doing nix-store --export - $(nix-store -qR paths) > closure and - nix-store --import < - closure. - - Lots of bug fixes, including a big performance bug in - the handling of with-expressions. - - - -
- - - - -
Release 0.11 (December 31, -2007) - -Nix 0.11 has many improvements over the previous stable release. -The most important improvement is secure multi-user support. It also -features many usability enhancements and language extensions, many of -them prompted by NixOS, the purely functional Linux distribution based -on Nix. Here is an (incomplete) list: - - - - - - Secure multi-user support. A single Nix store can - now be shared between multiple (possible untrusted) users. This is - an important feature for NixOS, where it allows non-root users to - install software. The old setuid method for sharing a store between - multiple users has been removed. Details for setting up a - multi-user store can be found in the manual. - - - The new command nix-copy-closure - gives you an easy and efficient way to exchange software between - machines. It copies the missing parts of the closure of a set of - store path to or from a remote machine via - ssh. - - - A new kind of string literal: strings between double - single-quotes ('') have indentation - “intelligently” removed. This allows large strings (such as shell - scripts or configuration file fragments in NixOS) to cleanly follow - the indentation of the surrounding expression. It also requires - much less escaping, since '' is less common in - most languages than ". - - - nix-env - modifies the current generation of a profile so that it contains - exactly the specified derivation, and nothing else. For example, - nix-env -p /nix/var/nix/profiles/browser --set - firefox lets the profile named - browser contain just Firefox. - - - nix-env now maintains - meta-information about installed packages in profiles. The - meta-information is the contents of the meta - attribute of derivations, such as description or - homepage. The command nix-env -q --xml - --meta shows all meta-information. - - - nix-env now uses the - meta.priority attribute of derivations to resolve - filename collisions between packages. Lower priority values denote - a higher priority. For instance, the GCC wrapper package and the - Binutils package in Nixpkgs both have a file - bin/ld, so previously if you tried to install - both you would get a collision. Now, on the other hand, the GCC - wrapper declares a higher priority than Binutils, so the former’s - bin/ld is symlinked in the user - environment. - - - nix-env -i / -u: instead of - breaking package ties by version, break them by priority and version - number. That is, if there are multiple packages with the same name, - then pick the package with the highest priority, and only use the - version if there are multiple packages with the same - priority. - - This makes it possible to mark specific versions/variant in - Nixpkgs more or less desirable than others. A typical example would - be a beta version of some package (e.g., - gcc-4.2.0rc1) which should not be installed even - though it is the highest version, except when it is explicitly - selected (e.g., nix-env -i - gcc-4.2.0rc1). - - - nix-env --set-flag allows meta - attributes of installed packages to be modified. There are several - attributes that can be usefully modified, because they affect the - behaviour of nix-env or the user environment - build script: - - - - meta.priority can be changed - to resolve filename clashes (see above). - - meta.keep can be set to - true to prevent the package from being - upgraded or replaced. Useful if you want to hang on to an older - version of a package. - - meta.active can be set to - false to “disable” the package. That is, no - symlinks will be generated to the files of the package, but it - remains part of the profile (so it won’t be garbage-collected). - Set it back to true to re-enable the - package. - - - - - - - nix-env -q now has a flag - () that causes - nix-env to show only those derivations whose - output is already in the Nix store or that can be substituted (i.e., - downloaded from somewhere). In other words, it shows the packages - that can be installed “quickly”, i.e., don’t need to be built from - source. The flag is also available in - nix-env -i and nix-env -u to - filter out derivations for which no pre-built binary is - available. - - - The new option (in - nix-env, nix-instantiate and - nix-build) is like , except - that the value is a string. For example, --argstr system - i686-linux is equivalent to --arg system - \"i686-linux\" (note that - prevents annoying quoting around shell arguments). - - - nix-store has a new operation - () - paths that shows the build log of the given - paths. - - - - - - Nix now uses Berkeley DB 4.5. The database is - upgraded automatically, but you should be careful not to use old - versions of Nix that still use Berkeley DB 4.4. - - - - - - The option - (corresponding to the configuration setting - build-max-silent-time) allows you to set a - timeout on builds — if a build produces no output on - stdout or stderr for the given - number of seconds, it is terminated. This is useful for recovering - automatically from builds that are stuck in an infinite - loop. - - - nix-channel: each subscribed - channel is its own attribute in the top-level expression generated - for the channel. This allows disambiguation (e.g. nix-env - -i -A nixpkgs_unstable.firefox). - - - The substitutes table has been removed from the - database. This makes operations such as nix-pull - and nix-channel --update much, much - faster. - - - nix-pull now supports - bzip2-compressed manifests. This speeds up - channels. - - - nix-prefetch-url now has a - limited form of caching. This is used by - nix-channel to prevent unnecessary downloads when - the channel hasn’t changed. - - - nix-prefetch-url now by default - computes the SHA-256 hash of the file instead of the MD5 hash. In - calls to fetchurl you should pass the - sha256 attribute instead of - md5. You can pass either a hexadecimal or a - base-32 encoding of the hash. - - - Nix can now perform builds in an automatically - generated “chroot”. This prevents a builder from accessing stuff - outside of the Nix store, and thus helps ensure purity. This is an - experimental feature. - - - The new command nix-store - --optimise reduces Nix store disk space usage by finding - identical files in the store and hard-linking them to each other. - It typically reduces the size of the store by something like - 25-35%. - - - ~/.nix-defexpr can now be a - directory, in which case the Nix expressions in that directory are - combined into an attribute set, with the file names used as the - names of the attributes. The command nix-env - --import (which set the - ~/.nix-defexpr symlink) is - removed. - - - Derivations can specify the new special attribute - allowedReferences to enforce that the references - in the output of a derivation are a subset of a declared set of - paths. For example, if allowedReferences is an - empty list, then the output must not have any references. This is - used in NixOS to check that generated files such as initial ramdisks - for booting Linux don’t have any dependencies. - - - The new attribute - exportReferencesGraph allows builders access to - the references graph of their inputs. This is used in NixOS for - tasks such as generating ISO-9660 images that contain a Nix store - populated with the closure of certain paths. - - - Fixed-output derivations (like - fetchurl) can define the attribute - impureEnvVars to allow external environment - variables to be passed to builders. This is used in Nixpkgs to - support proxy configuration, among other things. - - - Several new built-in functions: - builtins.attrNames, - builtins.filterSource, - builtins.isAttrs, - builtins.isFunction, - builtins.listToAttrs, - builtins.stringLength, - builtins.sub, - builtins.substring, - throw, - builtins.trace, - builtins.readFile. - - - - -
- - - - - -
Release 0.10.1 (October 11, 2006) - -This release fixes two somewhat obscure bugs that occur when -evaluating Nix expressions that are stored inside the Nix store -(NIX-67). These do not affect most users. - -
- - - - - -
Release 0.10 (October 6, 2006) - -This version of Nix uses Berkeley DB 4.4 instead of 4.3. -The database is upgraded automatically, but you should be careful not -to use old versions of Nix that still use Berkeley DB 4.3. In -particular, if you use a Nix installed through Nix, you should run - - -$ nix-store --clear-substitutes - -first. - -Also, the database schema has changed slighted to fix a -performance issue (see below). When you run any Nix 0.10 command for -the first time, the database will be upgraded automatically. This is -irreversible. - - - - - - - - nix-env usability improvements: - - - - An option - (or ) has been added to nix-env - --query to allow you to compare installed versions of - packages to available versions, or vice versa. An easy way to - see if you are up to date with what’s in your subscribed - channels is nix-env -qc \*. - - nix-env --query now takes as - arguments a list of package names about which to show - information, just like , etc.: for - example, nix-env -q gcc. Note that to show - all derivations, you need to specify - \*. - - nix-env -i - pkgname will now install - the highest available version of - pkgname, rather than installing all - available versions (which would probably give collisions) - (NIX-31). - - nix-env (-i|-u) --dry-run now - shows exactly which missing paths will be built or - substituted. - - nix-env -qa --description - shows human-readable descriptions of packages, provided that - they have a meta.description attribute (which - most packages in Nixpkgs don’t have yet). - - - - - - - New language features: - - - - Reference scanning (which happens after each - build) is much faster and takes a constant amount of - memory. - - String interpolation. Expressions like - - -"--with-freetype2-library=" + freetype + "/lib" - - can now be written as - - -"--with-freetype2-library=${freetype}/lib" - - You can write arbitrary expressions within - ${...}, not just - identifiers. - - Multi-line string literals. - - String concatenations can now involve - derivations, as in the example "--with-freetype2-library=" - + freetype + "/lib". This was not previously possible - because we need to register that a derivation that uses such a - string is dependent on freetype. The - evaluator now properly propagates this information. - Consequently, the subpath operator (~) has - been deprecated. - - Default values of function arguments can now - refer to other function arguments; that is, all arguments are in - scope in the default values - (NIX-45). - - - - Lots of new built-in primitives, such as - functions for list manipulation and integer arithmetic. See the - manual for a complete list. All primops are now available in - the set builtins, allowing one to test for - the availability of primop in a backwards-compatible - way. - - Real let-expressions: let x = ...; - ... z = ...; in .... - - - - - - - New commands nix-pack-closure and - nix-unpack-closure than can be used to easily - transfer a store path with all its dependencies to another machine. - Very convenient whenever you have some package on your machine and - you want to copy it somewhere else. - - - XML support: - - - - nix-env -q --xml prints the - installed or available packages in an XML representation for - easy processing by other tools. - - nix-instantiate --eval-only - --xml prints an XML representation of the resulting - term. (The new flag forces ‘deep’ - evaluation of the result, i.e., list elements and attributes are - evaluated recursively.) - - In Nix expressions, the primop - builtins.toXML converts a term to an XML - representation. This is primarily useful for passing structured - information to builders. - - - - - - - You can now unambiguously specify which derivation to - build or install in nix-env, - nix-instantiate and nix-build - using the / flags, which - takes an attribute name as argument. (Unlike symbolic package names - such as subversion-1.4.0, attribute names in an - attribute set are unique.) For instance, a quick way to perform a - test build of a package in Nixpkgs is nix-build - pkgs/top-level/all-packages.nix -A - foo. nix-env -q - --attr shows the attribute names corresponding to each - derivation. - - - If the top-level Nix expression used by - nix-env, nix-instantiate or - nix-build evaluates to a function whose arguments - all have default values, the function will be called automatically. - Also, the new command-line switch can be used to specify - function arguments on the command line. - - - nix-install-package --url - URL allows a package to be - installed directly from the given URL. - - - Nix now works behind an HTTP proxy server; just set - the standard environment variables http_proxy, - https_proxy, ftp_proxy or - all_proxy appropriately. Functions such as - fetchurl in Nixpkgs also respect these - variables. - - - nix-build -o - symlink allows the symlink to - the build result to be named something other than - result. - - - - - - Platform support: - - - - Support for 64-bit platforms, provided a suitably - patched ATerm library is used. Also, files larger than 2 - GiB are now supported. - - Added support for Cygwin (Windows, - i686-cygwin), Mac OS X on Intel - (i686-darwin) and Linux on PowerPC - (powerpc-linux). - - Users of SMP and multicore machines will - appreciate that the number of builds to be performed in parallel - can now be specified in the configuration file in the - build-max-jobs setting. - - - - - - - Garbage collector improvements: - - - - Open files (such as running programs) are now - used as roots of the garbage collector. This prevents programs - that have been uninstalled from being garbage collected while - they are still running. The script that detects these - additional runtime roots - (find-runtime-roots.pl) is inherently - system-specific, but it should work on Linux and on all - platforms that have the lsof - utility. - - nix-store --gc - (a.k.a. nix-collect-garbage) prints out the - number of bytes freed on standard output. nix-store - --gc --print-dead shows how many bytes would be freed - by an actual garbage collection. - - nix-collect-garbage -d - removes all old generations of all profiles - before calling the actual garbage collector (nix-store - --gc). This is an easy way to get rid of all old - packages in the Nix store. - - nix-store now has an - operation to delete specific paths - from the Nix store. It won’t delete reachable (non-garbage) - paths unless is - specified. - - - - - - - Berkeley DB 4.4’s process registry feature is used - to recover from crashed Nix processes. - - - - A performance issue has been fixed with the - referer table, which stores the inverse of the - references table (i.e., it tells you what store - paths refer to a given path). Maintaining this table could take a - quadratic amount of time, as well as a quadratic amount of Berkeley - DB log file space (in particular when running the garbage collector) - (NIX-23). - - Nix now catches the TERM and - HUP signals in addition to the - INT signal. So you can now do a killall - nix-store without triggering a database - recovery. - - bsdiff updated to version - 4.3. - - Substantial performance improvements in expression - evaluation and nix-env -qa, all thanks to Valgrind. Memory use has - been reduced by a factor 8 or so. Big speedup by memoisation of - path hashing. - - Lots of bug fixes, notably: - - - - Make sure that the garbage collector can run - successfully when the disk is full - (NIX-18). - - nix-env now locks the profile - to prevent races between concurrent nix-env - operations on the same profile - (NIX-7). - - Removed misleading messages from - nix-env -i (e.g., installing - `foo' followed by uninstalling - `foo') (NIX-17). - - - - - - Nix source distributions are a lot smaller now since - we no longer include a full copy of the Berkeley DB source - distribution (but only the bits we need). - - Header files are now installed so that external - programs can use the Nix libraries. - - - -
- - - - - -
Release 0.9.2 (September 21, 2005) - -This bug fix release fixes two problems on Mac OS X: - - - - If Nix was linked against statically linked versions - of the ATerm or Berkeley DB library, there would be dynamic link - errors at runtime. - - nix-pull and - nix-push intermittently failed due to race - conditions involving pipes and child processes with error messages - such as open2: open(GLOB(0x180b2e4), >&=9) failed: Bad - file descriptor at /nix/bin/nix-pull line 77 (issue - NIX-14). - - - - - -
- - - - - -
Release 0.9.1 (September 20, 2005) - -This bug fix release addresses a problem with the ATerm library -when the flag in -configure was not used. - -
- - - - - -
Release 0.9 (September 16, 2005) - -NOTE: this version of Nix uses Berkeley DB 4.3 instead of 4.2. -The database is upgraded automatically, but you should be careful not -to use old versions of Nix that still use Berkeley DB 4.2. In -particular, if you use a Nix installed through Nix, you should run - - -$ nix-store --clear-substitutes - -first. - - - - - Unpacking of patch sequences is much faster now - since we no longer do redundant unpacking and repacking of - intermediate paths. - - Nix now uses Berkeley DB 4.3. - - The derivation primitive is - lazier. Attributes of dependent derivations can mutually refer to - each other (as long as there are no data dependencies on the - outPath and drvPath attributes - computed by derivation). - - For example, the expression derivation - attrs now evaluates to (essentially) - - -attrs // { - type = "derivation"; - outPath = derivation! attrs; - drvPath = derivation! attrs; -} - - where derivation! is a primop that does the - actual derivation instantiation (i.e., it does what - derivation used to do). The advantage is that - it allows commands such as nix-env -qa and - nix-env -i to be much faster since they no longer - need to instantiate all derivations, just the - name attribute. - - Also, it allows derivations to cyclically reference each - other, for example, - - -webServer = derivation { - ... - hostName = "svn.cs.uu.nl"; - services = [svnService]; -}; - -svnService = derivation { - ... - hostName = webServer.hostName; -}; - - Previously, this would yield a black hole (infinite recursion). - - - - nix-build now defaults to using - ./default.nix if no Nix expression is - specified. - - nix-instantiate, when applied to - a Nix expression that evaluates to a function, will call the - function automatically if all its arguments have - defaults. - - Nix now uses libtool to build dynamic libraries. - This reduces the size of executables. - - A new list concatenation operator - ++. For example, [1 2 3] ++ [4 5 - 6] evaluates to [1 2 3 4 5 - 6]. - - Some currently undocumented primops to support - low-level build management using Nix (i.e., using Nix as a Make - replacement). See the commit messages for r3578 - and r3580. - - Various bug fixes and performance - improvements. - - - -
- - - - - -
Release 0.8.1 (April 13, 2005) - -This is a bug fix release. - - - - Patch downloading was broken. - - The garbage collector would not delete paths that - had references from invalid (but substitutable) - paths. - - - -
- - - - - -
Release 0.8 (April 11, 2005) - -NOTE: the hashing scheme in Nix 0.8 changed (as detailed below). -As a result, nix-pull manifests and channels built -for Nix 0.7 and below will now work anymore. However, the Nix -expression language has not changed, so you can still build from -source. Also, existing user environments continue to work. Nix 0.8 -will automatically upgrade the database schema of previous -installations when it is first run. - -If you get the error message - - -you have an old-style manifest `/nix/var/nix/manifests/[...]'; please -delete it - -you should delete previously downloaded manifests: - - -$ rm /nix/var/nix/manifests/* - -If nix-channel gives the error message - - -manifest `http://catamaran.labs.cs.uu.nl/dist/nix/channels/[channel]/MANIFEST' -is too old (i.e., for Nix <= 0.7) - -then you should unsubscribe from the offending channel -(nix-channel --remove -URL; leave out -/MANIFEST), and subscribe to the same URL, with -channels replaced by channels-v3 -(e.g., ). - -Nix 0.8 has the following improvements: - - - - The cryptographic hashes used in store paths are now - 160 bits long, but encoded in base-32 so that they are still only 32 - characters long (e.g., - /nix/store/csw87wag8bqlqk7ipllbwypb14xainap-atk-1.9.0). - (This is actually a 160 bit truncation of a SHA-256 - hash.) - - Big cleanups and simplifications of the basic store - semantics. The notion of “closure store expressions” is gone (and - so is the notion of “successors”); the file system references of a - store path are now just stored in the database. - - For instance, given any store path, you can query its closure: - - -$ nix-store -qR $(which firefox) -... lots of paths ... - - Also, Nix now remembers for each store path the derivation that - built it (the “deriver”): - - -$ nix-store -qR $(which firefox) -/nix/store/4b0jx7vq80l9aqcnkszxhymsf1ffa5jd-firefox-1.0.1.drv - - So to see the build-time dependencies, you can do - - -$ nix-store -qR $(nix-store -qd $(which firefox)) - - or, in a nicer format: - - -$ nix-store -q --tree $(nix-store -qd $(which firefox)) - - - - File system references are also stored in reverse. For - instance, you can query all paths that directly or indirectly use a - certain Glibc: - - -$ nix-store -q --referrers-closure \ - /nix/store/8lz9yc6zgmc0vlqmn2ipcpkjlmbi51vv-glibc-2.3.4 - - - - - - The concept of fixed-output derivations has been - formalised. Previously, functions such as - fetchurl in Nixpkgs used a hack (namely, - explicitly specifying a store path hash) to prevent changes to, say, - the URL of the file from propagating upwards through the dependency - graph, causing rebuilds of everything. This can now be done cleanly - by specifying the outputHash and - outputHashAlgo attributes. Nix itself checks - that the content of the output has the specified hash. (This is - important for maintaining certain invariants necessary for future - work on secure shared stores.) - - One-click installation :-) It is now possible to - install any top-level component in Nixpkgs directly, through the web - — see, e.g., . - All you have to do is associate - /nix/bin/nix-install-package with the MIME type - application/nix-package (or the extension - .nixpkg), and clicking on a package link will - cause it to be installed, with all appropriate dependencies. If you - just want to install some specific application, this is easier than - subscribing to a channel. - - nix-store -r - PATHS now builds all the - derivations PATHS in parallel. Previously it did them sequentially - (though exploiting possible parallelism between subderivations). - This is nice for build farms. - - nix-channel has new operations - and - . - - New ways of installing components into user - environments: - - - - Copy from another user environment: - - -$ nix-env -i --from-profile .../other-profile firefox - - - - Install a store derivation directly (bypassing the - Nix expression language entirely): - - -$ nix-env -i /nix/store/z58v41v21xd3...-aterm-2.3.1.drv - - (This is used to implement nix-install-package, - which is therefore immune to evolution in the Nix expression - language.) - - Install an already built store path directly: - - -$ nix-env -i /nix/store/hsyj5pbn0d9i...-aterm-2.3.1 - - - - Install the result of a Nix expression specified - as a command-line argument: - - -$ nix-env -f .../i686-linux.nix -i -E 'x: x.firefoxWrapper' - - The difference with the normal installation mode is that - does not use the name - attributes of derivations. Therefore, this can be used to - disambiguate multiple derivations with the same - name. - - - - A hash of the contents of a store path is now stored - in the database after a successful build. This allows you to check - whether store paths have been tampered with: nix-store - --verify --check-contents. - - - - Implemented a concurrent garbage collector. It is now - always safe to run the garbage collector, even if other Nix - operations are happening simultaneously. - - However, there can still be GC races if you use - nix-instantiate and nix-store - --realise directly to build things. To prevent races, - use the flag of those commands. - - - - The garbage collector now finally deletes paths in - the right order (i.e., topologically sorted under the “references” - relation), thus making it safe to interrupt the collector without - risking a store that violates the closure - invariant. - - Likewise, the substitute mechanism now downloads - files in the right order, thus preserving the closure invariant at - all times. - - The result of nix-build is now - registered as a root of the garbage collector. If the - ./result link is deleted, the GC root - disappears automatically. - - - - The behaviour of the garbage collector can be changed - globally by setting options in - /nix/etc/nix/nix.conf. - - - - gc-keep-derivations specifies - whether deriver links should be followed when searching for live - paths. - - gc-keep-outputs specifies - whether outputs of derivations should be followed when searching - for live paths. - - env-keep-derivations - specifies whether user environments should store the paths of - derivations when they are added (thus keeping the derivations - alive). - - - - - - New nix-env query flags - and - . - - fetchurl allows SHA-1 and SHA-256 - in addition to MD5. Just specify the attribute - sha1 or sha256 instead of - md5. - - Manual updates. - - - - - -
- - - - - -
Release 0.7 (January 12, 2005) - - - - Binary patching. When upgrading components using - pre-built binaries (through nix-pull / nix-channel), Nix can - automatically download and apply binary patches to already installed - components instead of full downloads. Patching is “smart”: if there - is a sequence of patches to an installed - component, Nix will use it. Patches are currently generated - automatically between Nixpkgs (pre-)releases. - - Simplifications to the substitute - mechanism. - - Nix-pull now stores downloaded manifests in - /nix/var/nix/manifests. - - Metadata on files in the Nix store is canonicalised - after builds: the last-modified timestamp is set to 0 (00:00:00 - 1/1/1970), the mode is set to 0444 or 0555 (readable and possibly - executable by all; setuid/setgid bits are dropped), and the group is - set to the default. This ensures that the result of a build and an - installation through a substitute is the same; and that timestamp - dependencies are revealed. - - - -
- - - - - -
Release 0.6 (November 14, 2004) - - - - - Rewrite of the normalisation engine. - - - - Multiple builds can now be performed in parallel - (option ). - - Distributed builds. Nix can now call a shell - script to forward builds to Nix installations on remote - machines, which may or may not be of the same platform - type. - - Option allows - recovery from broken substitutes. - - Option causes - building of other (unaffected) derivations to continue if one - failed. - - - - - - - - Improvements to the garbage collector (i.e., it - should actually work now). - - Setuid Nix installations allow a Nix store to be - shared among multiple users. - - Substitute registration is much faster - now. - - A utility nix-build to build a - Nix expression and create a symlink to the result int the current - directory; useful for testing Nix derivations. - - Manual updates. - - - - nix-env changes: - - - - Derivations for other platforms are filtered out - (which can be overridden using - ). - - by default now - uninstall previous derivations with the same - name. - - allows upgrading to a - specific version. - - New operation - to remove profile - generations (necessary for effective garbage - collection). - - Nicer output (sorted, - columnised). - - - - - - - - More sensible verbosity levels all around (builder - output is now shown always, unless is - given). - - - - Nix expression language changes: - - - - New language construct: with - E1; - E2 brings all attributes - defined in the attribute set E1 in - scope in E2. - - Added a map - function. - - Various new operators (e.g., string - concatenation). - - - - - - - - Expression evaluation is much - faster. - - An Emacs mode for editing Nix expressions (with - syntax highlighting and indentation) has been - added. - - Many bug fixes. - - - -
- - - - - -
Release 0.5 and earlier - -Please refer to the Subversion commit log messages. - -
- - - -
diff --git a/doc/manual/schemas.xml b/doc/manual/schemas.xml deleted file mode 100644 index 691a517b9c..0000000000 --- a/doc/manual/schemas.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/doc/manual/style.css b/doc/manual/style.css deleted file mode 100644 index ac76a64bbb..0000000000 --- a/doc/manual/style.css +++ /dev/null @@ -1,255 +0,0 @@ -/* Copied from http://bakefile.sourceforge.net/, which appears - licensed under the GNU GPL. */ - - -/*************************************************************************** - Basic headers and text: - ***************************************************************************/ - -body -{ - font-family: "Nimbus Sans L", sans-serif; - background: white; - margin: 2em 1em 2em 1em; -} - -h1, h2, h3, h4 -{ - color: #005aa0; -} - -h1 /* title */ -{ - font-size: 200%; -} - -h2 /* chapters, appendices, subtitle */ -{ - font-size: 180%; -} - -/* Extra space between chapters, appendices. */ -div.chapter > div.titlepage h2, div.appendix > div.titlepage h2 -{ - margin-top: 1.5em; -} - -div.section > div.titlepage h2 /* sections */ -{ - font-size: 150%; - margin-top: 1.5em; -} - -h3 /* subsections */ -{ - font-size: 125%; -} - -div.simplesect h2 -{ - font-size: 110%; -} - -div.appendix h3 -{ - font-size: 150%; - margin-top: 1.5em; -} - -div.refnamediv h2, div.refsynopsisdiv h2, div.refsection h2 /* refentry parts */ -{ - margin-top: 1.4em; - font-size: 125%; -} - -div.refsection h3 -{ - font-size: 110%; -} - - -/*************************************************************************** - Examples: - ***************************************************************************/ - -div.example -{ - border: 1px solid #b0b0b0; - padding: 6px 6px; - margin-left: 1.5em; - margin-right: 1.5em; - background: #f4f4f8; - border-radius: 0.4em; - box-shadow: 0.4em 0.4em 0.5em #e0e0e0; -} - -div.example p.title -{ - margin-top: 0em; -} - -div.example pre -{ - box-shadow: none; -} - - -/*************************************************************************** - Screen dumps: - ***************************************************************************/ - -pre.screen, pre.programlisting -{ - border: 1px solid #b0b0b0; - padding: 3px 3px; - margin-left: 1.5em; - margin-right: 1.5em; - color: #600000; - background: #f4f4f8; - font-family: monospace; - border-radius: 0.4em; - box-shadow: 0.4em 0.4em 0.5em #e0e0e0; -} - -div.example pre.programlisting -{ - border: 0px; - padding: 0 0; - margin: 0 0 0 0; -} - - -/*************************************************************************** - Notes, warnings etc: - ***************************************************************************/ - -.note, .warning -{ - border: 1px solid #b0b0b0; - padding: 3px 3px; - margin-left: 1.5em; - margin-right: 1.5em; - margin-bottom: 1em; - padding: 0.3em 0.3em 0.3em 0.3em; - background: #fffff5; - border-radius: 0.4em; - box-shadow: 0.4em 0.4em 0.5em #e0e0e0; -} - -div.note, div.warning -{ - font-style: italic; -} - -div.note h3, div.warning h3 -{ - color: red; - font-size: 100%; - padding-right: 0.5em; - display: inline; -} - -div.note p, div.warning p -{ - margin-bottom: 0em; -} - -div.note h3 + p, div.warning h3 + p -{ - display: inline; -} - -div.note h3 -{ - color: blue; - font-size: 100%; -} - -div.navfooter * -{ - font-size: 90%; -} - - -/*************************************************************************** - Links colors and highlighting: - ***************************************************************************/ - -a { text-decoration: none; } -a:hover { text-decoration: underline; } -a:link { color: #0048b3; } -a:visited { color: #002a6a; } - - -/*************************************************************************** - Table of contents: - ***************************************************************************/ - -div.toc -{ - font-size: 90%; -} - -div.toc dl -{ - margin-top: 0em; - margin-bottom: 0em; -} - - -/*************************************************************************** - Special elements: - ***************************************************************************/ - -tt, code -{ - color: #400000; -} - -.term -{ - font-weight: bold; - -} - -div.variablelist dd p, div.glosslist dd p -{ - margin-top: 0em; -} - -div.variablelist dd, div.glosslist dd -{ - margin-left: 1.5em; -} - -div.glosslist dt -{ - font-style: italic; -} - -.varname -{ - color: #400000; -} - -span.command strong -{ - font-weight: normal; - color: #400000; -} - -div.calloutlist table -{ - box-shadow: none; -} - -table -{ - border-collapse: collapse; - box-shadow: 0.4em 0.4em 0.5em #e0e0e0; -} - -div.affiliation -{ - font-style: italic; -} \ No newline at end of file diff --git a/doc/manual/troubleshooting.xml b/doc/manual/troubleshooting.xml deleted file mode 100644 index ec8c4c924f..0000000000 --- a/doc/manual/troubleshooting.xml +++ /dev/null @@ -1,92 +0,0 @@ - - -Troubleshooting - - -This section provides solutions for some common problems. See -the Nix -bug tracker for a list of currently known issues. - - -
Collisions in <command>nix-env</command> - -Symptom: when installing or upgrading, you get an error message such as - - -$ nix-env -i docbook-xml -... -adding /nix/store/s5hyxgm62gk2...-docbook-xml-4.2 -collision between `/nix/store/s5hyxgm62gk2...-docbook-xml-4.2/xml/dtd/docbook/calstblx.dtd' - and `/nix/store/06h377hr4b33...-docbook-xml-4.3/xml/dtd/docbook/calstblx.dtd' - at /nix/store/...-builder.pl line 62. - - - -The cause is that two installed packages in the user environment -have overlapping filenames (e.g., -xml/dtd/docbook/calstblx.dtd. This usually -happens when you accidentally try to install two versions of the same -package. For instance, in the example above, the Nix Packages -collection contains two versions of docbook-xml, so -nix-env -i will try to install both. The default -user environment builder has no way to way to resolve such conflicts, -so it just gives up. - -Solution: remove one of the offending packages from the user -environment (if already installed) using nix-env --e, or specify exactly which version should be installed -(e.g., nix-env -i docbook-xml-4.2). - -Alternatively, you can modify the user environment builder -script (in -prefix/share/nix/corepkgs/buildenv/builder.pl) -to implement some conflict resolution policy. E.g., the script could -be modified to rename conflicting file names, or to pick one over the -other. - -
- - -
<quote>Too many links</quote> error in the Nix -store - - -Symptom: when building something, you get an error message such as - - -... -mkdir: cannot create directory `/nix/store/name': Too many links - - - -This is usually because you have more than 32,000 subdirectories -in /nix/store, as can be seen using ls --l: - - -$ ls -l /nix/store -drwxrwxrwt 32000 nix nix 4620288 Sep 8 15:08 store - -The ext2 file system is limited to an inode link -count of 32,000 (each subdirectory increasing the count by one). -Furthermore, the st_nlink field of the -stat system call is a 16-bit value. - -This only happens on very large Nix installations (such as build -machines). - -Quick solution: run the garbage collector. You may want to use -the option. - -Real solution: put the Nix store on a file system that supports -more than 32,000 subdirectories per directory, such as ReiserFS. -(This doesn’t solve the st_nlink limit, but -ReiserFS lies to the kernel by reporting a link count of 1 if it -exceeds the limit.) - -
- - - -
diff --git a/doc/manual/writing-nix-expressions.xml b/doc/manual/writing-nix-expressions.xml deleted file mode 100644 index 5585e89fe5..0000000000 --- a/doc/manual/writing-nix-expressions.xml +++ /dev/null @@ -1,1901 +0,0 @@ - - -Writing Nix Expressions - - -This chapter shows you how to write Nix expressions, which are -the things that tell Nix how to build packages. It starts with a -simple example (a Nix expression for GNU Hello), and then moves -on to a more in-depth look at the Nix expression language. - -This chapter is mostly about the Nix expression language. -For more extensive information on adding packages to the Nix Packages -collection (such as functions in the standard environment and coding -conventions), please consult its -manual. - - -
A simple Nix expression - -This section shows how to add and test the GNU Hello -package to the Nix Packages collection. Hello is a program -that prints out the text Hello, world!. - -To add a package to the Nix Packages collection, you generally -need to do three things: - - - - Write a Nix expression for the package. This is a - file that describes all the inputs involved in building the package, - such as dependencies, sources, and so on. - - Write a builder. This is a - shell scriptIn fact, it can be written in any - language, but typically it's a bash shell - script. that actually builds the package from - the inputs. - - Add the package to the file - pkgs/top-level/all-packages.nix. The Nix - expression written in the first step is a - function; it requires other packages in order - to build it. In this step you put it all together, i.e., you call - the function with the right arguments to build the actual - package. - - - - - - -
The Nix expression - -Nix expression for GNU Hello -(<filename>default.nix</filename>) - -{ stdenv, fetchurl, perl }: - -stdenv.mkDerivation { - name = "hello-2.1.1"; - builder = ./builder.sh; - src = fetchurl { - url = ftp://ftp.nluug.nl/pub/gnu/hello/hello-2.1.1.tar.gz; - md5 = "70c9ccf9fac07f762c24f2df2290784d"; - }; - inherit perl; -} - - - shows a Nix expression for GNU -Hello. It's actually already in the Nix Packages collection in -pkgs/applications/misc/hello/ex-1/default.nix. -It is customary to place each package in a separate directory and call -the single Nix expression in that directory -default.nix. The file has the following elements -(referenced from the figure by number): - - - - - - This states that the expression is a - function that expects to be called with three - arguments: stdenv, fetchurl, - and perl. They are needed to build Hello, but - we don't know how to build them here; that's why they are function - arguments. stdenv is a package that is used - by almost all Nix Packages packages; it provides a - standard environment consisting of the things you - would expect in a basic Unix environment: a C/C++ compiler (GCC, - to be precise), the Bash shell, fundamental Unix tools such as - cp, grep, - tar, etc. fetchurl is a - function that downloads files. perl is the - Perl interpreter. - - Nix functions generally have the form { x, y, ..., - z }: e where x, y, - etc. are the names of the expected arguments, and where - e is the body of the function. So - here, the entire remainder of the file is the body of the - function; when given the required arguments, the body should - describe how to build an instance of the Hello package. - - - - - - So we have to build a package. Building something from - other stuff is called a derivation in Nix (as - opposed to sources, which are built by humans instead of - computers). We perform a derivation by calling - stdenv.mkDerivation. - mkDerivation is a function provided by - stdenv that builds a package from a set of - attributes. A set is just a list of - key/value pairs where each key is a string and each value is an - arbitrary Nix expression. They take the general form { - name1 = - expr1; ... - nameN = - exprN; }. - - - - - - The attribute name specifies the symbolic - name and version of the package. Nix doesn't really care about - these things, but they are used by for instance nix-env - -q to show a human-readable name for - packages. This attribute is required by - mkDerivation. - - - - - - The attribute builder specifies the - builder. This attribute can sometimes be omitted, in which case - mkDerivation will fill in a default builder - (which does a configure; make; make install, in - essence). Hello is sufficiently simple that the default builder - would suffice, but in this case, we will show an actual builder - for educational purposes. The value - ./builder.sh refers to the shell script shown - in , discussed below. - - - - - - The builder has to know what the sources of the package - are. Here, the attribute src is bound to the - result of a call to the fetchurl function. - Given a URL and an MD5 hash of the expected contents of the file - at that URL, this function builds a derivation that downloads the - file and checks its hash. So the sources are a dependency that - like all other dependencies is built before Hello itself is - built. - - Instead of src any other name could have - been used, and in fact there can be any number of sources (bound - to different attributes). However, src is - customary, and it's also expected by the default builder (which we - don't use in this example). - - - - - - Since the derivation requires Perl, we have to pass the - value of the perl function argument to the - builder. All attributes in the set are actually passed as - environment variables to the builder, so declaring an attribute - - -perl = perl; - - will do the trick: it binds an attribute perl - to the function argument which also happens to be called - perl. However, it looks a bit silly, so there - is a shorter syntax. The inherit keyword - causes the specified attributes to be bound to whatever variables - with the same name happen to be in scope. - - - - - - - -
- - -
The builder - -Build script for GNU Hello -(<filename>builder.sh</filename>) - -source $stdenv/setup - -PATH=$perl/bin:$PATH - -tar xvfz $src -cd hello-* -./configure --prefix=$out -make -make install - - - shows the builder referenced -from Hello's Nix expression (stored in -pkgs/applications/misc/hello/ex-1/builder.sh). -The builder can actually be made a lot shorter by using the -generic builder functions provided by -stdenv, but here we write out the build steps to -elucidate what a builder does. It performs the following -steps: - - - - - - When Nix runs a builder, it initially completely clears the - environment (except for the attributes declared in the - derivation). For instance, the PATH variable is - emptyActually, it's initialised to - /path-not-set to prevent Bash from setting it - to a default value.. This is done to prevent - undeclared inputs from being used in the build process. If for - example the PATH contained - /usr/bin, then you might accidentally use - /usr/bin/gcc. - - So the first step is to set up the environment. This is - done by calling the setup script of the - standard environment. The environment variable - stdenv points to the location of the standard - environment being used. (It wasn't specified explicitly as an - attribute in , but - mkDerivation adds it automatically.) - - - - - - Since Hello needs Perl, we have to make sure that Perl is in - the PATH. The perl environment - variable points to the location of the Perl package (since it - was passed in as an attribute to the derivation), so - $perl/bin is the - directory containing the Perl interpreter. - - - - - - Now we have to unpack the sources. The - src attribute was bound to the result of - fetching the Hello source tarball from the network, so the - src environment variable points to the location in - the Nix store to which the tarball was downloaded. After - unpacking, we cd to the resulting source - directory. - - The whole build is performed in a temporary directory - created in /tmp, by the way. This directory is - removed after the builder finishes, so there is no need to clean - up the sources afterwards. Also, the temporary directory is - always newly created, so you don't have to worry about files from - previous builds interfering with the current build. - - - - - - GNU Hello is a typical Autoconf-based package, so we first - have to run its configure script. In Nix - every package is stored in a separate location in the Nix store, - for instance - /nix/store/9a54ba97fb71b65fda531012d0443ce2-hello-2.1.1. - Nix computes this path by cryptographically hashing all attributes - of the derivation. The path is passed to the builder through the - out environment variable. So here we give - configure the parameter - --prefix=$out to cause Hello to be installed in - the expected location. - - - - - - Finally we build Hello (make) and install - it into the location specified by out - (make install). - - - - - -If you are wondering about the absence of error checking on the -result of various commands called in the builder: this is because the -shell script is evaluated with Bash's option, -which causes the script to be aborted if any command fails without an -error check. - -
- - -
Composition - -Composing GNU Hello -(<filename>all-packages.nix</filename>) - -... - -rec { - - hello = import ../applications/misc/hello/ex-1 { - inherit fetchurl stdenv perl; - }; - - perl = import ../development/interpreters/perl { - inherit fetchurl stdenv; - }; - - fetchurl = import ../build-support/fetchurl { - inherit stdenv; ... - }; - - stdenv = ...; - -} - - - -The Nix expression in is a -function; it is missing some arguments that have to be filled in -somewhere. In the Nix Packages collection this is done in the file -pkgs/top-level/all-packages.nix, where all -Nix expressions for packages are imported and called with the -appropriate arguments. shows -some fragments of -all-packages.nix. - - - - - - This file defines a set of attributes, all of which are - concrete derivations (i.e., not functions). In fact, we define a - mutually recursive set of attributes. That - is, the attributes can refer to each other. This is precisely - what we want since we want to plug the - various packages into each other. - - - - - - Here we import the Nix expression for - GNU Hello. The import operation just loads and returns the - specified Nix expression. In fact, we could just have put the - contents of in - all-packages.nix at this point. That - would be completely equivalent, but it would make the file rather - bulky. - - Note that we refer to - ../applications/misc/hello/ex-1, not - ../applications/misc/hello/ex-1/default.nix. - When you try to import a directory, Nix automatically appends - /default.nix to the file name. - - - - - - This is where the actual composition takes place. Here we - call the function imported from - ../applications/misc/hello/ex-1 with a set - containing the things that the function expects, namely - fetchurl, stdenv, and - perl. We use inherit again to use the - attributes defined in the surrounding scope (we could also have - written fetchurl = fetchurl;, etc.). - - The result of this function call is an actual derivation - that can be built by Nix (since when we fill in the arguments of - the function, what we get is its body, which is the call to - stdenv.mkDerivation in ). - - Nixpkgs has a convenience function - callPackage that imports and calls a - function, filling in any missing arguments by passing the - corresponding attribute from the Nixpkgs set, like this: - - -hello = callPackage ../applications/misc/hello/ex-1 { }; - - - If necessary, you can set or override arguments: - - -hello = callPackage ../applications/misc/hello/ex-1 { stdenv = myStdenv; }; - - - - - - - - - Likewise, we have to instantiate Perl, - fetchurl, and the standard environment. - - - - - -
- - -
Testing - -You can now try to build Hello. Of course, you could do -nix-env -f pkgs/top-level/all-packages.nix -i hello, -but you may not want to install a possibly broken package just yet. -The best way to test the package is by using the command nix-build, which builds a Nix -expression and creates a symlink named result in -the current directory: - - -$ nix-build pkgs/top-level/all-packages.nix -A hello -building path `/nix/store/632d2b22514d...-hello-2.1.1' -hello-2.1.1/ -hello-2.1.1/intl/ -hello-2.1.1/intl/ChangeLog -... - -$ ls -l result -lrwxrwxrwx ... 2006-09-29 10:43 result -> /nix/store/632d2b22514d...-hello-2.1.1 - -$ ./result/bin/hello -Hello, world! - -The option selects -the hello attribute from -all-packages.nix. This is faster than using the -symbolic package name specified by the name -attribute (which also happens to be hello) and is -unambiguous (there can be multiple packages with the symbolic name -hello, but there can be only one attribute in a set -named hello). - -nix-build registers the -./result symlink as a garbage collection root, so -unless and until you delete the ./result symlink, -the output of the build will be safely kept on your system. You can -use nix-build’s switch to give the symlink another -name. - -Nix has a transactional semantics. Once a build finishes -successfully, Nix makes a note of this in its database: it registers -that the path denoted by out is now -valid. If you try to build the derivation again, Nix -will see that the path is already valid and finish immediately. If a -build fails, either because it returns a non-zero exit code, because -Nix or the builder are killed, or because the machine crashes, then -the output paths will not be registered as valid. If you try to build -the derivation again, Nix will remove the output paths if they exist -(e.g., because the builder died half-way through make -install) and try again. Note that there is no -negative caching: Nix doesn't remember that a build -failed, and so a failed build can always be repeated. This is because -Nix cannot distinguish between permanent failures (e.g., a compiler -error due to a syntax error in the source) and transient failures -(e.g., a disk full condition). - -Nix also performs locking. If you run multiple Nix builds -simultaneously, and they try to build the same derivation, the first -Nix instance that gets there will perform the build, while the others -block (or perform other derivations if available) until the build -finishes: - - -$ nix-build pkgs/top-level/all-packages.nix -A hello -waiting for lock on `/nix/store/0h5b7hp8d4hqfrw8igvx97x1xawrjnac-hello-2.1.1x' - -So it is always safe to run multiple instances of Nix in parallel -(which isn’t the case with, say, make). - -If you have a system with multiple CPUs, you may want to have -Nix build different derivations in parallel (insofar as possible). -Just pass the option , where -N is the maximum number of jobs to be run -in parallel, or set. Typically this should be the number of -CPUs. - -
- - -
The generic builder - -Recall from that the builder -looked something like this: - - -PATH=$perl/bin:$PATH -tar xvfz $src -cd hello-* -./configure --prefix=$out -make -make install - -The builders for almost all Unix packages look like this — set up some -environment variables, unpack the sources, configure, build, and -install. For this reason the standard environment provides some Bash -functions that automate the build process. A builder using the -generic build facilities in shown in . - -Build script using the generic -build functions - -buildInputs="$perl" - -source $stdenv/setup - -genericBuild - - - - - - - The buildInputs variable tells - setup to use the indicated packages as - inputs. This means that if a package provides a - bin subdirectory, it's added to - PATH; if it has a include - subdirectory, it's added to GCC's header search path; and so - on.How does it work? setup - tries to source the file - pkg/nix-support/setup-hook - of all dependencies. These “setup hooks” can then set up whatever - environment variables they want; for instance, the setup hook for - Perl sets the PERL5LIB environment variable to - contain the lib/site_perl directories of all - inputs. - - - - - - - The function genericBuild is defined in - the file $stdenv/setup. - - - - - - The final step calls the shell function - genericBuild, which performs the steps that - were done explicitly in . The - generic builder is smart enough to figure out whether to unpack - the sources using gzip, - bzip2, etc. It can be customised in many ways; - see . - - - - - -Discerning readers will note that the -buildInputs could just as well have been set in the Nix -expression, like this: - - - buildInputs = [ perl ]; - -The perl attribute can then be removed, and the -builder becomes even shorter: - - -source $stdenv/setup -genericBuild - -In fact, mkDerivation provides a default builder -that looks exactly like that, so it is actually possible to omit the -builder for Hello entirely. - -
- - -
- - - -
The Nix expression language - -The Nix expression language is a pure, lazy, functional -language. Purity means that operations in the language don't have -side-effects (for instance, there is no variable assignment). -Laziness means that arguments to functions are evaluated only when -they are needed. Functional means that functions are -normal values that can be passed around and manipulated -in interesting ways. The language is not a full-featured, general -purpose language. Its main job is to describe packages, -compositions of packages, and the variability within -packages. - -This section presents the various features of the -language. - - -
Values - - -Simple values - -Nix has the following basic data types: - - - - - - Strings can be written in three - ways. - - The most common way is to enclose the string between double - quotes, e.g., "foo bar". Strings can span - multiple lines. The special characters " and - \ and the character sequence - ${ must be escaped by prefixing them with a - backslash (\). Newlines, carriage returns and - tabs can be written as \n, - \r and \t, - respectively. - - You can include the result of an expression into a string by - enclosing it in - ${...}, a feature - known as antiquotation. The enclosed - expression must evaluate to something that can be coerced into a - string (meaning that it must be a string, a path, or a - derivation). For instance, rather than writing - - -"--with-freetype2-library=" + freetype + "/lib" - - (where freetype is a derivation), you can - instead write the more natural - - -"--with-freetype2-library=${freetype}/lib" - - The latter is automatically translated to the former. A more - complicated example (from the Nix expression for Qt): - - -configureFlags = " - -system-zlib -system-libpng -system-libjpeg - ${if openglSupport then "-dlopen-opengl - -L${mesa}/lib -I${mesa}/include - -L${libXmu}/lib -I${libXmu}/include" else ""} - ${if threadSupport then "-thread" else "-no-thread"} -"; - - Note that Nix expressions and strings can be arbitrarily nested; - in this case the outer string contains various antiquotations that - themselves contain strings (e.g., "-thread"), - some of which in turn contain expressions (e.g., - ${mesa}). - - The second way to write string literals is as an - indented string, which is enclosed between - pairs of double single-quotes, like so: - - -'' - This is the first line. - This is the second line. - This is the third line. -'' - - This kind of string literal intelligently strips indentation from - the start of each line. To be precise, it strips from each line a - number of spaces equal to the minimal indentation of the string as - a whole (disregarding the indentation of empty lines). For - instance, the first and second line are indented two space, while - the third line is indented four spaces. Thus, two spaces are - stripped from each line, so the resulting string is - - -"This is the first line.\nThis is the second line.\n This is the third line.\n" - - - - Note that the whitespace and newline following the opening - '' is ignored if there is no non-whitespace - text on the initial line. - - Antiquotation - (${expr}) is - supported in indented strings. - - Since ${ and '' have - special meaning in indented strings, you need a way to quote them. - ${ can be escaped by prefixing it with - '' (that is, two single quotes), i.e., - ''${. '' can be escaped by - prefixing it with ', i.e., - '''. Finally, linefeed, carriage-return and - tab characters can be written as ''\n, - ''\r, ''\t. - - Indented strings are primarily useful in that they allow - multi-line string literals to follow the indentation of the - enclosing Nix expression, and that less escaping is typically - necessary for strings representing languages such as shell scripts - and configuration files because '' is much less - common than ". Example: - - -stdenv.mkDerivation { - ... - postInstall = - '' - mkdir $out/bin $out/etc - cp foo $out/bin - echo "Hello World" > $out/etc/foo.conf - ${if enableBar then "cp bar $out/bin" else ""} - ''; - ... -} - - - - - Finally, as a convenience, URIs as - defined in appendix B of RFC 2396 - can be written as is, without quotes. For - instance, the string - "http://example.org/foo.tar.bz2" - can also be written as - http://example.org/foo.tar.bz2. - - - - Integers, e.g., - 123. - - Paths, e.g., - /bin/sh or ./builder.sh. - A path must contain at least one slash to be recognised as such; for - instance, builder.sh is not a - pathIt's parsed as an expression that selects the - attribute sh from the variable - builder.. If the file name is - relative, i.e., if it does not begin with a slash, it is made - absolute at parse time relative to the directory of the Nix - expression that contained it. For instance, if a Nix expression in - /foo/bar/bla.nix refers to - ../xyzzy/fnord.nix, the absolute path is - /foo/xyzzy/fnord.nix. - - Booleans with values - true and - false. - - The null value, denoted as - null. - - - - - - - - -Lists - -Lists are formed by enclosing a whitespace-separated list of -values between square brackets. For example, - - -[ 123 ./foo.nix "abc" (f { x = y; }) ] - -defines a list of four elements, the last being the result of a call -to the function f. Note that function calls have -to be enclosed in parentheses. If they had been omitted, e.g., - - -[ 123 ./foo.nix "abc" f { x = y; } ] - -the result would be a list of five elements, the fourth one being a -function and the fifth being a set. - - - - -Sets - -Sets are really the core of the language, since ultimately the -Nix language is all about creating derivations, which are really just -sets of attributes to be passed to build scripts. - -Sets are just a list of name/value pairs (called -attributes) enclosed in curly brackets, where -each value is an arbitrary expression terminated by a semicolon. For -example: - - -{ x = 123; - text = "Hello"; - y = f { bla = 456; }; -} - -This defines a set with attributes named x, -text, y. The order of the -attributes is irrelevant. An attribute name may only occur -once. - -Attributes can be selected from a set using the -. operator. For instance, - - -{ a = "Foo"; b = "Bar"; }.a - -evaluates to "Foo". It is possible to provide a -default value in an attribute selection using the -or keyword. For example, - - -{ a = "Foo"; b = "Bar"; }.c or "Xyzzy" - -will evaluate to "Xyzzy" because there is no -c attribute in the set. - -You can use arbitrary double-quoted strings as attribute -names: - - -{ "foo ${bar}" = 123; "nix-1.0" = 456; }."foo ${bar}" - - -This will evaluate to 123 (Assuming -bar is antiquotable). In the case where an -attribute name is just a single antiquotation, the quotes can be -dropped: - - -{ foo = 123; }.${bar} or 456 - -This will evaluate to 123 if -bar evaluates to "foo" when -coerced to a string and 456 otherwise (again -assuming bar is antiquotable). - -In the special case where an attribute name inside of a set declaration -evaluates to null (which is normally an error, as -null is not antiquotable), that attribute is simply not -added to the set: - - -{ ${if foo then "bar" else null} = true; } - -This will evaluate to {} if foo -evaluates to false. - - - - - -
- - -
Language constructs - - -Recursive sets - -Recursive sets are just normal sets, but the attributes can -refer to each other. For example, - - -rec { - x = y; - y = 123; -}.x - - -evaluates to 123. Note that without -rec the binding x = y; would -refer to the variable y in the surrounding scope, -if one exists, and would be invalid if no such variable exists. That -is, in a normal (non-recursive) set, attributes are not added to the -lexical scope; in a recursive set, they are. - -Recursive sets of course introduce the danger of infinite -recursion. For example, - - -rec { - x = y; - y = x; -}.x - -does not terminateActually, Nix detects infinite -recursion in this case and aborts (infinite recursion -encountered).. - - - - -Let-expressions - -A let-expression allows you define local variables for an -expression. For instance, - - -let - x = "foo"; - y = "bar"; -in x + y - -evaluates to "foobar". - - - - - - -Inheriting attributes - -When defining a set it is often convenient to copy variables -from the surrounding lexical scope (e.g., when you want to propagate -attributes). This can be shortened using the -inherit keyword. For instance, - - -let x = 123; in -{ inherit x; - y = 456; -} - -evaluates to { x = 123; y = 456; }. (Note that -this works because x is added to the lexical scope -by the let construct.) It is also possible to -inherit attributes from another set. For instance, in this fragment -from all-packages.nix, - - - graphviz = (import ../tools/graphics/graphviz) { - inherit fetchurl stdenv libpng libjpeg expat x11 yacc; - inherit (xlibs) libXaw; - }; - - xlibs = { - libX11 = ...; - libXaw = ...; - ... - } - - libpng = ...; - libjpg = ...; - ... - -the set used in the function call to the function defined in -../tools/graphics/graphviz inherits a number of -variables from the surrounding scope (fetchurl -... yacc), but also inherits -libXaw (the X Athena Widgets) from the -xlibs (X11 client-side libraries) set. - - - - -Functions - -Functions have the following form: - - -pattern: body - -The pattern specifies what the argument of the function must look -like, and binds variables in the body to (parts of) the -argument. There are three kinds of patterns: - - - - - If a pattern is a single identifier, then the - function matches any argument. Example: - - -let negate = x: !x; - concat = x: y: x + y; -in if negate true then concat "foo" "bar" else "" - - Note that concat is a function that takes one - argument and returns a function that takes another argument. This - allows partial parameterisation (i.e., only filling some of the - arguments of a function); e.g., - - -map (concat "foo") [ "bar" "bla" "abc" ] - - evaluates to [ "foobar" "foobla" - "fooabc" ]. - - - A set pattern of the form - { name1, name2, …, nameN } matches a set - containing the listed attributes, and binds the values of those - attributes to variables in the function body. For example, the - function - - -{ x, y, z }: z + y + x - - can only be called with a set containing exactly the attributes - x, y and - z. No other attributes are allowed. If you want - to allow additional arguments, you can use an ellipsis - (...): - - -{ x, y, z, ... }: z + y + x - - This works on any set that contains at least the three named - attributes. - - It is possible to provide default values - for attributes, in which case they are allowed to be missing. A - default value is specified by writing - name ? - e, where - e is an arbitrary expression. For example, - - -{ x, y ? "foo", z ? "bar" }: z + y + x - - specifies a function that only requires an attribute named - x, but optionally accepts y - and z. - - - An @-pattern requires that the - argument matches with the patterns on the left- and right-hand side - of the @-sign. For example: - - -args@{ x, y, z, ... }: z + y + x + args.a - - Here args is bound to the entire argument, which - is further matches against the pattern { x, y, z, - ... }. - - - - -Note that functions do not have names. If you want to give them -a name, you can bind them to an attribute, e.g., - - -let concat = { x, y }: x + y; -in concat { x = "foo"; y = "bar"; } - - - - - - -Conditionals - -Conditionals look like this: - - -if e1 then e2 else e3 - -where e1 is an expression that should -evaluate to a Boolean value (true or -false). - - - - -Assertions - -Assertions are generally used to check that certain requirements -on or between features and dependencies hold. They look like this: - - -assert e1; e2 - -where e1 is an expression that should -evaluate to a Boolean value. If it evaluates to -true, e2 is returned; -otherwise expression evaluation is aborted and a backtrace is printed. - -Nix expression for Subversion - -{ localServer ? false -, httpServer ? false -, sslSupport ? false -, pythonBindings ? false -, javaSwigBindings ? false -, javahlBindings ? false -, stdenv, fetchurl -, openssl ? null, httpd ? null, db4 ? null, expat, swig ? null, j2sdk ? null -}: - -assert localServer -> db4 != null; -assert httpServer -> httpd != null && httpd.expat == expat; -assert sslSupport -> openssl != null && (httpServer -> httpd.openssl == openssl); -assert pythonBindings -> swig != null && swig.pythonSupport; -assert javaSwigBindings -> swig != null && swig.javaSupport; -assert javahlBindings -> j2sdk != null; - -stdenv.mkDerivation { - name = "subversion-1.1.1"; - ... - openssl = if sslSupport then openssl else null; - ... -} - - - show how assertions are -used in the Nix expression for Subversion. - - - - - This assertion states that if Subversion is to have support - for local repositories, then Berkeley DB is needed. So if the - Subversion function is called with the - localServer argument set to - true but the db4 argument - set to null, then the evaluation fails. - - - - This is a more subtle condition: if Subversion is built with - Apache (httpServer) support, then the Expat - library (an XML library) used by Subversion should be same as the - one used by Apache. This is because in this configuration - Subversion code ends up being linked with Apache code, and if the - Expat libraries do not match, a build- or runtime link error or - incompatibility might occur. - - - - This assertion says that in order for Subversion to have SSL - support (so that it can access https URLs), an - OpenSSL library must be passed. Additionally, it says that - if Apache support is enabled, then Apache's - OpenSSL should match Subversion's. (Note that if Apache support - is not enabled, we don't care about Apache's OpenSSL.) - - - - The conditional here is not really related to assertions, - but is worth pointing out: it ensures that if SSL support is - disabled, then the Subversion derivation is not dependent on - OpenSSL, even if a non-null value was passed. - This prevents an unnecessary rebuild of Subversion if OpenSSL - changes. - - - - - - - - -With-expressions - -A with-expression, - - -with e1; e2 - -introduces the set e1 into the lexical -scope of the expression e2. For instance, - - -let as = { x = "foo"; y = "bar"; }; -in with as; x + y - -evaluates to "foobar" since the -with adds the x and -y attributes of as to the -lexical scope in the expression x + y. The most -common use of with is in conjunction with the -import function. E.g., - - -with (import ./definitions.nix); ... - -makes all attributes defined in the file -definitions.nix available as if they were defined -locally in a rec-expression. - - - - -Comments - -Comments can be single-line, started with a # -character, or inline/multi-line, enclosed within /* -... */. - - - - -
- - -
Operators - - lists the operators in the -Nix expression language, in order of precedence (from strongest to -weakest binding). - - - Operators - - - - Syntax - Associativity - Description - - - - - e . - attrpath - [ or def ] - - none - Select attribute denoted by the attribute path - attrpath from set - e. (An attribute path is a - dot-separated list of attribute names.) If the attribute - doesn’t exist, return def if - provided, otherwise abort evaluation. - - - e1 e2 - left - Call function e1 with - argument e2. - - - e ? - attrpath - none - Test whether set e contains - the attribute denoted by attrpath; - return true or - false. - - - e1 ++ e2 - right - List concatenation. - - - e1 + e2 - left - String or path concatenation. - - - ! e - left - Boolean negation. - - - e1 // - e2 - right - Return a set consisting of the attributes in - e1 and - e2 (with the latter taking - precedence over the former in case of equally named - attributes). - - - e1 == - e2 - none - Equality. - - - e1 != - e2 - none - Inequality. - - - e1 && - e2 - left - Logical AND. - - - e1 || - e2 - left - Logical OR. - - - e1 -> - e2 - none - Logical implication (equivalent to - !e1 || - e2). - - - -
- -
- - -
Derivations - -The most important built-in function is -derivation, which is used to describe a single -derivation (a build action). It takes as input a set, the attributes -of which specify the inputs of the build. - - - - There must be an attribute named - system whose value must be a string specifying a - Nix platform identifier, such as "i686-linux" or - "powerpc-darwin"To figure out - your platform identifier, look at the line Checking for the - canonical Nix system name in the output of Nix's - configure script. The build - can only be performed on a machine and operating system matching the - platform identifier. (Nix can automatically forward builds for - other platforms by forwarding them to other machines; see .) - - There must be an attribute named - name whose value must be a string. This is used - as a symbolic name for the package by nix-env, - and it is appended to the output paths of the - derivation. - - There must be an attribute named - builder that identifies the program that is - executed to perform the build. It can be either a derivation or a - source (a local file reference, e.g., - ./builder.sh). - - Every attribute is passed as an environment variable - to the builder. Attribute values are translated to environment - variables as follows: - - - - Strings and integers are just passed - verbatim. - - A path (e.g., - ../foo/sources.tar) causes the referenced - file to be copied to the store; its location in the store is put - in the environment variable. The idea is that all sources - should reside in the Nix store, since all inputs to a derivation - should reside in the Nix store. - - A derivation causes that - derivation to be built prior to the present derivation; its - default output path is put in the environment - variable. - - Lists of the previous types are also allowed. - They are simply concatenated, separated by - spaces. - - true is passed as the string - 1, false and - null are passed as an empty string. - - - - - - The optional attribute args - specifies command-line arguments to be passed to the builder. It - should be a list. - - The optional attribute outputs - specifies a list of symbolic outputs of the derivation. By default, - a derivation produces a single output path, denoted as - out. However, derivations can produce multiple - output paths. This is useful because it allows outputs to be - downloaded or garbage-collected separately. For instance, imagine a - library package that provides a dynamic library, header files, and - documentation. A program that links against the library doesn’t - need the header files and documentation at runtime, and it doesn’t - need the documentation at build time. Thus, the library package - could specify: - -outputs = [ "lib" "headers" "doc" ]; - - This will cause Nix to pass environment variables - lib, headers and - doc to the builder containing the intended store - paths of each output. The builder would typically do something like - -./configure --libdir=$lib/lib --includedir=$headers/include --docdir=$doc/share/doc - - for an Autoconf-style package. You can refer to each output of a - derivation by selecting it as an attribute, e.g. - -buildInputs = [ pkg.lib pkg.headers ]; - - The first element of output determines the - default output. Thus, you could also write - -buildInputs = [ pkg pkg.headers ]; - - since pkg is equivalent to - pkg.lib. - - - -The function mkDerivation in the standard -environment is a wrapper around derivation that -adds a default value for system and always uses -Bash as the builder, to which the supplied builder is passed as a -command-line argument. See . - -The builder is executed as follows: - - - - A temporary directory is created under the directory - specified by TMPDIR (default - /tmp) where the build will take place. The - current directory is changed to this directory. - - The environment is cleared and set to the derivation - attributes, as specified above. - - In addition, the following variables are set: - - - - NIX_BUILD_TOP contains the path of - the temporary directory for this build. - - Also, TMPDIR, - TEMPDIR, TMP, TEMP - are set to point to the temporary directory. This is to prevent - the builder from accidentally writing temporary files anywhere - else. Doing so might cause interference by other - processes. - - PATH is set to - /path-not-set to prevent shells from - initialising it to their built-in default value. - - HOME is set to - /homeless-shelter to prevent programs from - using /etc/passwd or the like to find the - user's home directory, which could cause impurity. Usually, when - HOME is set, it is used as the location of the home - directory, even if it points to a non-existent - path. - - NIX_STORE is set to the path of the - top-level Nix store directory (typically, - /nix/store). - - For each output declared in - outputs, the corresponding environment variable - is set to point to the intended path in the Nix store for that - output. Each output path is a concatenation of the cryptographic - hash of all build inputs, the name attribute - and the output name. (The output name is omitted if it’s - out.) - - - - - - If an output path already exists, it is removed. - Also, locks are acquired to prevent multiple Nix instances from - performing the same build at the same time. - - A log of the combined standard output and error is - written to /nix/var/log/nix. - - The builder is executed with the arguments specified - by the attribute args. If it exits with exit - code 0, it is considered to have succeeded. - - The temporary directory is removed (unless the - option was specified). - - If the build was successful, Nix scans each output - path for references to input paths by looking for the hash parts of - the input paths. Since these are potential runtime dependencies, - Nix registers them as dependencies of the output - paths. - - After the build, Nix sets the last-modified - timestamp on all files in the build result to 1 (00:00:01 1/1/1970 - UTC), sets the group to the default group, and sets the mode of the - file to 0444 or 0555 (i.e., read-only, with execute permission - enabled if the file was originally executable). Note that possible - setuid and setgid bits are - cleared. Setuid and setgid programs are not currently supported by - Nix. This is because the Nix archives used in deployment have no - concept of ownership information, and because it makes the build - result dependent on the user performing the build. - - - - - - -
Advanced attributes - -Derivations can declare some infrequently used optional -attributes. - - - - allowedReferences - - The optional attribute - allowedReferences specifies a list of legal - references (dependencies) of the output of the builder. For - example, - - -allowedReferences = []; - - - enforces that the output of a derivation cannot have any runtime - dependencies on its inputs. This is used in NixOS to check that - generated files such as initial ramdisks for booting Linux don’t - have accidental dependencies on other paths in the Nix - store. - - - - - exportReferencesGraph - - This attribute allows builders access to the - references graph of their inputs. The attribute is a list of - inputs in the Nix store whose references graph the builder needs - to know. The value of this attribute should be a list of pairs - [ name1 - path1 name2 - path2 ... - ]. The references graph of each - pathN will be stored in a text file - nameN in the temporary build directory. - The text files have the format used by nix-store - --register-validity (with the deriver fields left - empty). For example, when the following derivation is built: - - -derivation { - ... - exportReferencesGraph = [ "libfoo-graph" libfoo ]; -}; - - - the references graph of libfoo is placed in the - file libfoo-graph in the temporary build - directory. - - exportReferencesGraph is useful for - builders that want to do something with the closure of a store - path. Examples include the builders in NixOS that generate the - initial ramdisk for booting Linux (a cpio - archive containing the closure of the boot script) and the - ISO-9660 image for the installation CD (which is populated with a - Nix store containing the closure of a bootable NixOS - configuration). - - - - - - outputHash - outputHashAlgo - outputHashMode - - These attributes declare that the derivation is a - so-called fixed-output derivation, which - means that a cryptographic hash of the output is already known in - advance. When the build of a fixed-output derivation finishes, - Nix computes the cryptographic hash of the output and compares it - to the hash declared with these attributes. If there is a - mismatch, the build fails. - - The rationale for fixed-output derivations is derivations - such as those produced by the fetchurl - function. This function downloads a file from a given URL. To - ensure that the downloaded file has not been modified, the caller - must also specify a cryptographic hash of the file. For example, - - -fetchurl { - url = http://ftp.gnu.org/pub/gnu/hello/hello-2.1.1.tar.gz; - md5 = "70c9ccf9fac07f762c24f2df2290784d"; -} - - - It sometimes happens that the URL of the file changes, e.g., - because servers are reorganised or no longer available. We then - must update the call to fetchurl, e.g., - - -fetchurl { - url = ftp://ftp.nluug.nl/pub/gnu/hello/hello-2.1.1.tar.gz; - md5 = "70c9ccf9fac07f762c24f2df2290784d"; -} - - - If a fetchurl derivation was treated like a - normal derivation, the output paths of the derivation and - all derivations depending on it would change. - For instance, if we were to change the URL of the Glibc source - distribution in Nixpkgs (a package on which almost all other - packages depend) massive rebuilds would be needed. This is - unfortunate for a change which we know cannot have a real effect - as it propagates upwards through the dependency graph. - - For fixed-output derivations, on the other hand, the name of - the output path only depends on the outputHash* - and name attributes, while all other attributes - are ignored for the purpose of computing the output path. (The - name attribute is included because it is part - of the path.) - - As an example, here is the (simplified) Nix expression for - fetchurl: - - -{ stdenv, curl }: # The curl program is used for downloading. - -{ url, md5 }: - -stdenv.mkDerivation { - name = baseNameOf (toString url); - builder = ./builder.sh; - buildInputs = [ curl ]; - - # This is a fixed-output derivation; the output must be a regular - # file with MD5 hash md5. - outputHashMode = "flat"; - outputHashAlgo = "md5"; - outputHash = md5; - - inherit url; -} - - - - - The outputHashAlgo attribute specifies - the hash algorithm used to compute the hash. It can currently be - "md5", "sha1" or - "sha256". - - The outputHashMode attribute determines - how the hash is computed. It must be one of the following two - values: - - - - "flat" - - The output must be a non-executable regular - file. If it isn’t, the build fails. The hash is simply - computed over the contents of that file (so it’s equal to what - Unix commands like md5sum or - sha1sum produce). - - This is the default. - - - - "recursive" - - The hash is computed over the NAR archive dump - of the output (i.e., the result of nix-store - --dump). In this case, the output can be - anything, including a directory tree. - - - - - - - - The outputHash attribute, finally, must - be a string containing the hash in either hexadecimal or base-32 - notation. (See the nix-hash command - for information about converting to and from base-32 - notation.) - - - - - impureEnvVars - - This attribute allows you to specify a list of - environment variables that should be passed from the environment - of the calling user to the builder. Usually, the environment is - cleared completely when the builder is executed, but with this - attribute you can allow specific environment variables to be - passed unmodified. For example, fetchurl in - Nixpkgs has the line - - -impureEnvVars = [ "http_proxy" "https_proxy" ... ]; - - - to make it use the proxy server configuration specified by the - user in the environment variables http_proxy and - friends. - - This attribute is only allowed in fixed-output derivations, where - impurities such as these are okay since (the hash of) the output - is known in advance. It is ignored for all other - derivations. - - - - - preferLocalBuild - - If this attribute is set to - true, it has two effects. First, the - derivation will always be built, not substituted, even if a - substitute is available. Second, if distributed building is - enabled, then, if possible, the derivaton will be built - locally instead of forwarded to a remote machine. This is - appropriate for trivial builders where the cost of doing a - download or remote build would exceed the cost of building - locally. - - - - - -
- - -
- - - - - - -
- - - -
The standard environment - - -The standard environment is used by passing it as an input -called stdenv to the derivation, and then doing - - -source $stdenv/setup - -at the top of the builder. - -Apart from adding the aforementioned commands to the -PATH, setup also does the -following: - - - - All input packages specified in the - buildInputs environment variable have their - /bin subdirectory added to PATH, - their /include subdirectory added to the C/C++ - header file search path, and their /lib - subdirectory added to the linker search path. This can be extended. - For instance, when the pkgconfig package is - used, the subdirectory /lib/pkgconfig of each - input is added to the PKG_CONFIG_PATH environment - variable. - - The environment variable - NIX_CFLAGS_STRIP is set so that the compiler strips - debug information from object files. This can be disabled by - setting NIX_STRIP_DEBUG to - 0. - - - - - -The setup script also exports a function -called genericBuild that knows how to build -typical Autoconf-style packages. It can be customised to perform -builds for any type of package. It is advisable to use -genericBuild since it provides facilities that -are almost always useful such as unpacking of sources, patching of -sources, nested logging, etc. - -The definitive, up-to-date documentation of the generic builder -is the source itself, which resides in -pkgs/stdenv/generic/setup.sh. - - -
Customising the generic builder - -The operation of the generic builder can be modified in many -places by setting certain variables. These hook -variables are typically set to the name of some shell -function defined by you. For instance, to perform some additional -steps after make install you would set the -postInstall variable: - - -postInstall=myPostInstall - -myPostInstall() { - mkdir $out/share/extra - cp extrafiles/* $out/share/extra -} - - - - -
- - -
Debugging failed builds - -At the beginning of each phase, the set of all shell variables -is written to the file env-vars at the top-level -build directory. This is useful for debugging: it allows you to -recreate the environment in which a build was performed. For -instance, if a build fails, then assuming you used the - flag, you can go to the output directory and -switch to the environment of the builder: - - -$ nix-build -K ./foo.nix -... fails, keeping build directory `/tmp/nix-1234-0' - -$ cd /tmp/nix-1234-0 - -$ source env-vars - -(edit some files...) - -$ make - -(execution continues with the same GCC, make, etc.) - - - -
- - -
- - -
diff --git a/doc/signing.txt b/doc/signing.txt deleted file mode 100644 index 1d042e95e2..0000000000 --- a/doc/signing.txt +++ /dev/null @@ -1,24 +0,0 @@ -Generate a private key: - -$ (umask 277 && openssl genrsa -out /nix/etc/nix/signing-key.sec 2048) - -The private key should be kept secret (only readable to the Nix daemon -user). - - -Generate the corresponding public key: - -$ openssl rsa -in /nix/etc/nix/signing-key.sec -pubout > /nix/etc/nix/signing-key.pub - -The public key should be copied to all machines to which you want to -export store paths. - - -Signing: - -$ nix-hash --type sha256 --flat svn.nar | openssl rsautl -sign -inkey mykey.sec > svn.nar.sign - - -Verifying a signature: - -$ test "$(nix-hash --type sha256 --flat svn.nar)" = "$(openssl rsautl -verify -inkey mykey.pub -pubin -in svn.nar.sign)" diff --git a/local.mk b/local.mk deleted file mode 100644 index f27a97cd4f..0000000000 --- a/local.mk +++ /dev/null @@ -1,11 +0,0 @@ -ifeq ($(MAKECMDGOALS), dist) - dist-files += $(shell git ls-files) $(shell git ls-files) -endif - -dist-files += configure config.h.in nix.spec - -GLOBAL_CXXFLAGS += -I . -I src -I src/libutil -I src/libstore -I src/libmain -I src/libexpr - -$(foreach i, config.h $(call rwildcard, src/lib*, *.hh), $(eval $(call install-file-in, $(i), $(includedir)/nix, 0644))) - -$(foreach i, config.h $(call rwildcard, src/boost, *.hpp), $(eval $(call install-file-in, $(i), $(includedir)/nix/$(patsubst src/%/,%,$(dir $(i))), 0644))) diff --git a/misc/emacs/README b/misc/emacs/README deleted file mode 100644 index 8c87f67d57..0000000000 --- a/misc/emacs/README +++ /dev/null @@ -1,10 +0,0 @@ -The Nix Emacs mode supports syntax highlighting, somewhat sensible -indenting, and refilling of comments. - -To enable Nix mode in Emacs, add something like this to your ~/.emacs -file: - - (load "/nix/share/emacs/site-lisp/nix-mode.el") - -This automatically causes Nix mode to be activated for all files with -extension `.nix'. diff --git a/misc/emacs/local.mk b/misc/emacs/local.mk deleted file mode 100644 index 8e06b881bc..0000000000 --- a/misc/emacs/local.mk +++ /dev/null @@ -1 +0,0 @@ -$(eval $(call install-data-in,$(d)/nix-mode.el,$(datadir)/emacs/site-lisp)) diff --git a/misc/emacs/nix-mode.el b/misc/emacs/nix-mode.el deleted file mode 100644 index 986edcf6e3..0000000000 --- a/misc/emacs/nix-mode.el +++ /dev/null @@ -1,113 +0,0 @@ -(defun nix-mode () - "Major mode for editing Nix expressions. - -The following commands may be useful: - - '\\[newline-and-indent]' - Insert a newline and move the cursor to align with the previous - non-empty line. - - '\\[fill-paragraph]' - Refill a paragraph so that all lines are at most `fill-column' - lines long. This should do the right thing for comments beginning - with `#'. However, this command doesn't work properly yet if the - comment is adjacent to code (i.e., no intervening empty lines). - In that case, select the text to be refilled and use - `\\[fill-region]' instead. - -The hook `nix-mode-hook' is run when Nix mode is started. - -\\{nix-mode-map} -" - - (interactive) - - (kill-all-local-variables) - - (setq major-mode 'nix-mode) - (setq mode-name "Nix") - - (use-local-map nix-mode-map) - - (set-syntax-table nix-mode-syntax-table) - - ;; Font lock support. - (setq font-lock-defaults '(nix-keywords nil nil nil nil)) - - ;; Automatic indentation [C-j]. - (make-local-variable 'indent-line-function) - (setq indent-line-function 'nix-indent-line) - - ;; Indenting of comments. - (make-local-variable 'comment-start) - (setq comment-start "# ") - (make-local-variable 'comment-end) - (setq comment-end "") - (make-local-variable 'comment-start-skip) - (setq comment-start-skip "\\(^\\|\\s-\\);?#+ *") - - ;; Filling of comments. - (make-local-variable 'adaptive-fill-mode) - (setq adaptive-fill-mode t) - (make-local-variable 'paragraph-start) - (setq paragraph-start "[ \t]*\\(#+[ \t]*\\)?$") - (make-local-variable 'paragraph-separate) - (setq paragraph-separate paragraph-start) - - (run-hooks 'nix-mode-hook) - ) - - -(defvar nix-mode-map nil - "Keymap for Nix mode.") - -(setq nix-mode-map (make-sparse-keymap)) -;(define-key nix-mode-map [tab] 'tab-to-tab-stop) - - -(defvar nix-keywords - '("\\" "\\" "\\" "\\" "\\" - "\\" "\\" "\\" "\\" "\\" - ("\\" . font-lock-builtin-face) - ("\\" . font-lock-builtin-face) - ("\\" . font-lock-builtin-face) - ("\\" . font-lock-builtin-face) - ("\\" . font-lock-builtin-face) - ("\\" . font-lock-builtin-face) - ("\\" . font-lock-builtin-face) - ("\\" . font-lock-builtin-face) - ("[a-zA-Z][a-zA-Z0-9\\+-\\.]*:[a-zA-Z0-9%/\\?:@&=\\+\\$,_\\.!~\\*'-]+" - . font-lock-constant-face) - ("\\<\\([a-zA-Z_][a-zA-Z0-9_'\-\.]*\\)[ \t]*=" - (1 font-lock-variable-name-face nil nil)) - ("<[a-zA-Z0-9._\\+-]+\\(/[a-zA-Z0-9._\\+-]+\\)*>" - . font-lock-constant-face) - ("[a-zA-Z0-9._\\+-]*\\(/[a-zA-Z0-9._\\+-]+\\)+" - . font-lock-constant-face) - )) - - -(defvar nix-mode-syntax-table nil - "Syntax table for Nix mode.") - -(if nix-mode-syntax-table - nil - (progn - (setq nix-mode-syntax-table (make-syntax-table)) - (modify-syntax-entry ?/ ". 14" nix-mode-syntax-table) - (modify-syntax-entry ?* ". 23" nix-mode-syntax-table) - (modify-syntax-entry ?# "< b" nix-mode-syntax-table) - (modify-syntax-entry ?\n "> b" nix-mode-syntax-table) - )) - - -(defun nix-indent-line () - "Indent current line in a Nix expression." - (interactive) - (indent-relative-maybe)) - - -(setq auto-mode-alist (cons '("\\.nix\\'" . nix-mode) auto-mode-alist)) -(setq auto-mode-alist (cons '("\\.nix.in\\'" . nix-mode) auto-mode-alist)) - -(provide 'nix-mode) diff --git a/misc/systemd/nix-daemon.service b/misc/systemd/nix-daemon.service deleted file mode 100644 index ee28209f09..0000000000 --- a/misc/systemd/nix-daemon.service +++ /dev/null @@ -1,10 +0,0 @@ -[Unit] -Description=Helper daemon for managing secure, multi-user Nix stores -After=syslog.target - -[Service] -Type=simple -ExecStart=/usr/bin/nix-daemon - -[Install] -WantedBy=multi-user.target diff --git a/misc/vim/syntax/nix.vim b/misc/vim/syntax/nix.vim deleted file mode 100644 index ddddea5f05..0000000000 --- a/misc/vim/syntax/nix.vim +++ /dev/null @@ -1,37 +0,0 @@ -" Vim syntax file -" Language: nix -" Maintainer: Marc Weber -" Modify and commit if you feel that way -" Last Change: 2007 Dec - -" Quit when a (custom) syntax file was already loaded -if exists("b:current_syntax") - finish -endif - -syn keyword nixKeyword let throw inherit import true false null with -syn keyword nixConditional if else then -syn keyword nixBrace ( ) { } = -syn keyword nixBuiltin __currentSystem __currentTime __isFunction __getEnv __trace __toPath __pathExists - \ __readFile __toXML __toFile __filterSource __attrNames __getAttr __hasAttr __isAttrs __listToAttrs __isList - \ __head __tail __add __sub __lessThan __substring __stringLength - -syn match nixAttr "\w\+\ze\s*=" -syn match nixFuncArg "\zs\w\+\ze\s*:" -syn region nixStringParam start=+\${+ end=+}+ -syn region nixMultiLineComment start=+/\*+ skip=+\\"+ end=+\*/+ -syn match nixEndOfLineComment "#.*$" -syn region nixStringIndented start=+''+ skip=+'''\|''${\|"+ end=+''+ contains=nixStringParam -syn region nixString start=+"+ skip=+\\"+ end=+"+ contains=nixStringParam - -hi def link nixKeyword Keyword -hi def link nixConditional Conditional -hi def link nixBrace Special -hi def link nixString String -hi def link nixStringIndented String -hi def link nixBuiltin Special -hi def link nixStringParam Macro -hi def link nixMultiLineComment Comment -hi def link nixEndOfLineComment Comment -hi def link nixAttr Identifier -hi def link nixFuncArg Identifier diff --git a/mk/README.md b/mk/README.md deleted file mode 100644 index e4cd742b4c..0000000000 --- a/mk/README.md +++ /dev/null @@ -1,6 +0,0 @@ -This is a set of helper Makefiles for doing non-recursive builds with -GNU Make. The canonical source can be found at -https://github.com/edolstra/make-rules. You should copy the files -into the `mk` subdirectory of your project. - -TODO: write more documentation. diff --git a/mk/clean.mk b/mk/clean.mk deleted file mode 100644 index ce9afb3b0d..0000000000 --- a/mk/clean.mk +++ /dev/null @@ -1,11 +0,0 @@ -clean-files := - -clean: - $(suppress) rm -fv -- $(clean-files) - -dryclean: - @for i in $(clean-files); do if [ -e $$i ]; then echo $$i; fi; done | sort - -print-top-help += \ - echo " clean: Delete generated files"; \ - echo " dryclean: Show what files would be deleted by 'make clean'"; diff --git a/mk/dist.mk b/mk/dist.mk deleted file mode 100644 index 794b277713..0000000000 --- a/mk/dist.mk +++ /dev/null @@ -1,17 +0,0 @@ -ifdef PACKAGE_NAME - -dist-name = $(PACKAGE_NAME)-$(PACKAGE_VERSION) - -dist: $(dist-name).tar.bz2 $(dist-name).tar.xz - -$(dist-name).tar.bz2: $(dist-files) - $(trace-gen) tar cfj $@ $(sort $(dist-files)) --transform 's,^,$(dist-name)/,' - -$(dist-name).tar.xz: $(dist-files) - $(trace-gen) tar cfJ $@ $(sort $(dist-files)) --transform 's,^,$(dist-name)/,' - -clean-files += $(dist-name).tar.bz2 $(dist-name).tar.xz - -print-top-help += echo " dist: Generate a source distribution"; - -endif diff --git a/mk/functions.mk b/mk/functions.mk deleted file mode 100644 index 51f6457016..0000000000 --- a/mk/functions.mk +++ /dev/null @@ -1,7 +0,0 @@ -# Utility function for recursively finding files, e.g. -# ‘$(call rwildcard, path/to/dir, *.c *.h)’. -rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d)) - -# Given a file name, produce the corresponding dependency file -# (e.g. ‘foo/bar.o’ becomes ‘foo/.bar.o.dep’). -filename-to-dep = $(dir $1).$(notdir $1).dep diff --git a/mk/install.mk b/mk/install.mk deleted file mode 100644 index e4bc734e11..0000000000 --- a/mk/install.mk +++ /dev/null @@ -1,62 +0,0 @@ -# Add a rule for creating $(1) as a directory. This template may be -# called multiple times for the same directory. -define create-dir - _i := $(DESTDIR)$$(strip $(1)) - ifndef $$(_i)_SEEN - $$(_i)_SEEN = 1 - $$(_i): - $$(trace-mkdir) install -d "$$@" - endif -endef - - -# Add a rule for installing file $(1) as file $(2) with mode $(3). -# The directory containing $(2) will be created automatically. -define install-file-as - - _i := $(DESTDIR)$$(strip $(2)) - - install: $$(_i) - - $$(_i): $(1) | $$(dir $$(_i)) - $$(trace-install) install -m $(3) $(1) "$$@" - - $$(eval $$(call create-dir, $$(dir $(2)))) - -endef - - -# Add a rule for installing file $(1) in directory $(2) with mode -# $(3). The directory will be created automatically. -define install-file-in - $$(eval $$(call install-file-as,$(1),$(2)/$$(notdir $(1)),$(3))) -endef - - -define install-program-in - $$(eval $$(call install-file-in,$(1),$(2),0755)) -endef - - -define install-data-in - $$(eval $$(call install-file-in,$(1),$(2),0644)) -endef - - -# Install a symlink from $(2) to $(1). Note that $(1) need not exist. -define install-symlink - - _i := $(DESTDIR)$$(strip $(2)) - - install: $$(_i) - - $$(_i): | $$(dir $$(_i)) - $$(trace-install) ln -sfn $(1) "$$@" - - $$(eval $$(call create-dir, $$(dir $(2)))) - -endef - - -print-top-help += \ - echo " install: Install into \$$(prefix) (currently set to '$(prefix)')"; diff --git a/mk/jars.mk b/mk/jars.mk deleted file mode 100644 index 99470f3743..0000000000 --- a/mk/jars.mk +++ /dev/null @@ -1,29 +0,0 @@ -define build-jar - $(1)_NAME ?= $(1) - - _d := $$(strip $$($(1)_DIR)) - - $(1)_PATH := $$(_d)/$$($(1)_NAME).jar - - $(1)_TMPDIR := $$(_d)/.$$($(1)_NAME).jar.tmp - - $$($(1)_PATH): $$($(1)_SOURCES) - @rm -rf $$($(1)_TMPDIR) - @mkdir -p $$($(1)_TMPDIR) - $$(trace-javac) javac $(GLOBAL_JAVACFLAGS) $$($(1)_JAVACFLAGS) -d $$($(1)_TMPDIR) $$($(1)_SOURCES) - $$(trace-jar) jar cf $$($(1)_PATH) -C $$($(1)_TMPDIR) . - @rm -rf $$($(1)_TMPDIR) - - $(1)_INSTALL_DIR ?= $$(libdir)/java - - $(1)_INSTALL_PATH := $$($(1)_INSTALL_DIR)/$$($(1)_NAME).jar - - $$(eval $$(call install-file-as, $$($(1)_PATH), $$($(1)_INSTALL_PATH), 0644)) - - install: $$($(1)_INSTALL_PATH) - - jars-list += $$($(1)_PATH) - - clean-files += $$($(1)_PATH) - -endef diff --git a/mk/lib.mk b/mk/lib.mk deleted file mode 100644 index 6bcd83a06e..0000000000 --- a/mk/lib.mk +++ /dev/null @@ -1,128 +0,0 @@ -default: all - - -# Get rid of default suffixes. FIXME: is this a good idea? -.SUFFIXES: - - -# Initialise some variables. -bin-scripts := -noinst-scripts := -man-pages := -install-tests := -dist-files := -OS = $(shell uname -s) - - -# Default installation paths. -prefix ?= /usr/local -libdir ?= $(prefix)/lib -bindir ?= $(prefix)/bin -libexecdir ?= $(prefix)/libexec -datadir ?= $(prefix)/share -localstatedir ?= $(prefix)/var -sysconfdir ?= $(prefix)/etc -mandir ?= $(prefix)/share/man - - -# Pass -fPIC if we're building dynamic libraries. -BUILD_SHARED_LIBS ?= 1 - -ifeq ($(BUILD_SHARED_LIBS), 1) - GLOBAL_CFLAGS += -fPIC - GLOBAL_CXXFLAGS += -fPIC - ifneq ($(OS), Darwin) - GLOBAL_LDFLAGS += -Wl,--no-copy-dt-needed-entries - endif -endif - - -# Pass -g if we want debug info. -BUILD_DEBUG ?= 1 - -ifeq ($(BUILD_DEBUG), 1) - GLOBAL_CFLAGS += -g - GLOBAL_CXXFLAGS += -g - GLOBAL_JAVACFLAGS += -g -endif - - -include mk/functions.mk -include mk/tracing.mk -include mk/clean.mk -include mk/install.mk -include mk/libraries.mk -include mk/programs.mk -include mk/jars.mk -include mk/patterns.mk -include mk/templates.mk -include mk/tests.mk - - -# Include all sub-Makefiles. -define include-sub-makefile - d := $$(patsubst %/,%,$$(dir $(1))) - include $(1) -endef - -$(foreach mf, $(makefiles), $(eval $(call include-sub-makefile, $(mf)))) - - -# Instantiate stuff. -$(foreach lib, $(libraries), $(eval $(call build-library,$(lib)))) -$(foreach prog, $(programs), $(eval $(call build-program,$(prog)))) -$(foreach jar, $(jars), $(eval $(call build-jar,$(jar)))) -$(foreach script, $(bin-scripts), $(eval $(call install-program-in,$(script),$(bindir)))) -$(foreach script, $(bin-scripts), $(eval programs-list += $(script))) -$(foreach script, $(noinst-scripts), $(eval programs-list += $(script))) -$(foreach template, $(template-files), $(eval $(call instantiate-template,$(template)))) -$(foreach test, $(install-tests), $(eval $(call run-install-test,$(test)))) -$(foreach file, $(man-pages), $(eval $(call install-data-in, $(file), $(mandir)/man$(patsubst .%,%,$(suffix $(file)))))) - - -include mk/dist.mk - - -.PHONY: default all man help - -all: $(programs-list) $(libs-list) $(jars-list) $(man-pages) - -man: $(man-pages) - - -help: - @echo "The following targets are available:" - @echo "" - @echo " default: Build default targets" -ifdef man-pages - @echo " man: Generate manual pages" -endif - @$(print-top-help) -ifdef programs-list - @echo "" - @echo "The following programs can be built:" - @echo "" - @for i in $(programs-list); do echo " $$i"; done -endif -ifdef libs-list - @echo "" - @echo "The following libraries can be built:" - @echo "" - @for i in $(libs-list); do echo " $$i"; done -endif -ifdef jars-list - @echo "" - @echo "The following JARs can be built:" - @echo "" - @for i in $(jars-list); do echo " $$i"; done -endif - @echo "" - @echo "The following variables control the build:" - @echo "" - @echo " BUILD_SHARED_LIBS ($(BUILD_SHARED_LIBS)): Whether to build shared libraries" - @echo " BUILD_DEBUG ($(BUILD_DEBUG)): Whether to include debug symbols" - @echo " CC ($(CC)): C compiler to be used" - @echo " CFLAGS: Flags for the C compiler" - @echo " CXX ($(CXX)): C++ compiler to be used" - @echo " CXXFLAGS: Flags for the C++ compiler" - @$(print-var-help) diff --git a/mk/libraries.mk b/mk/libraries.mk deleted file mode 100644 index c41694794b..0000000000 --- a/mk/libraries.mk +++ /dev/null @@ -1,118 +0,0 @@ -libs-list := - -ifeq ($(OS), Darwin) - SO_EXT = dylib -else - SO_EXT = so -endif - -# Build a library with symbolic name $(1). The library is defined by -# various variables prefixed by ‘$(1)_’: -# -# - $(1)_NAME: the name of the library (e.g. ‘libfoo’); defaults to -# $(1). -# -# - $(1)_DIR: the directory where the (non-installed) library will be -# placed. -# -# - $(1)_SOURCES: the source files of the library. -# -# - $(1)_CXXFLAGS: additional C++ compiler flags. -# -# - $(1)_LIBS: the symbolic names of other libraries on which this -# library depends. -# -# - $(1)_ALLOW_UNDEFINED: if set, the library is allowed to have -# undefined symbols. Has no effect for static libraries. -# -# - $(1)_LDFLAGS: additional linker flags. -# -# - $(1)_LDFLAGS_PROPAGATED: additional linker flags, also propagated -# to the linking of programs/libraries that use this library. -# -# - $(1)_FORCE_INSTALL: if defined, the library will be installed even -# if it's not needed (i.e. dynamically linked) by a program. -# -# - $(1)_INSTALL_DIR: the directory where the library will be -# installed. Defaults to $(libdir). -# -# - BUILD_SHARED_LIBS: if equal to ‘1’, a dynamic library will be -# built, otherwise a static library. -define build-library - $(1)_NAME ?= $(1) - _d := $$(strip $$($(1)_DIR)) - _srcs := $$(sort $$(foreach src, $$($(1)_SOURCES), $$(src))) - $(1)_OBJS := $$(addsuffix .o, $$(basename $$(_srcs))) - _libs := $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_PATH)) - - $(1)_INSTALL_DIR ?= $$(libdir) - - $(1)_LDFLAGS_USE := - $(1)_LDFLAGS_USE_INSTALLED := - - $$(eval $$(call create-dir, $$(_d))) - - ifeq ($(BUILD_SHARED_LIBS), 1) - - ifdef $(1)_ALLOW_UNDEFINED - ifeq ($(OS), Darwin) - $(1)_LDFLAGS += -undefined suppress -flat_namespace - endif - else - ifneq ($(OS), Darwin) - $(1)_LDFLAGS += -Wl,-z,defs - endif - endif - - $(1)_PATH := $$(_d)/$$($(1)_NAME).$(SO_EXT) - - $$($(1)_PATH): $$($(1)_OBJS) $$(_libs) | $$(_d) - $$(trace-ld) $(CXX) -o $$@ -shared $(GLOBAL_LDFLAGS) $$($(1)_OBJS) $$($(1)_LDFLAGS) $$($(1)_LDFLAGS_PROPAGATED) $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_LDFLAGS_USE)) - - $(1)_LDFLAGS_USE += -L$$(_d) -Wl,-rpath,$$(abspath $$(_d)) -l$$(patsubst lib%,%,$$(strip $$($(1)_NAME))) - - $(1)_INSTALL_PATH := $(DESTDIR)$$($(1)_INSTALL_DIR)/$$($(1)_NAME).$(SO_EXT) - - _libs_final := $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_INSTALL_PATH)) - - $$(eval $$(call create-dir, $$($(1)_INSTALL_DIR))) - - $$($(1)_INSTALL_PATH): $$($(1)_OBJS) $$(_libs_final) | $(DESTDIR)$$($(1)_INSTALL_DIR) - $$(trace-ld) $(CXX) -o $$@ -shared $(GLOBAL_LDFLAGS) $$($(1)_OBJS) $$($(1)_LDFLAGS) $$($(1)_LDFLAGS_PROPAGATED) $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_LDFLAGS_USE_INSTALLED)) - - $(1)_LDFLAGS_USE_INSTALLED += -L$$(DESTDIR)$$($(1)_INSTALL_DIR) -Wl,-rpath,$$($(1)_INSTALL_DIR) -l$$(patsubst lib%,%,$$(strip $$($(1)_NAME))) - - ifdef $(1)_FORCE_INSTALL - install: $$($(1)_INSTALL_PATH) - endif - - else - - $(1)_PATH := $$(_d)/$$($(1)_NAME).a - - $$($(1)_PATH): $$($(1)_OBJS) | $$(_d) - $(trace-ar) ar crs $$@ $$? - - $(1)_LDFLAGS_USE += $$($(1)_PATH) $$($(1)_LDFLAGS) - - $(1)_INSTALL_PATH := $$(libdir)/$$($(1)_NAME).a - - endif - - $(1)_LDFLAGS_USE += $$($(1)_LDFLAGS_PROPAGATED) - $(1)_LDFLAGS_USE_INSTALLED += $$($(1)_LDFLAGS_PROPAGATED) - - # Propagate CXXFLAGS to the individual object files. - $$(foreach obj, $$($(1)_OBJS), $$(eval $$(obj)_CXXFLAGS=$$($(1)_CXXFLAGS))) - - # Make each object file depend on the common dependencies. - $$(foreach obj, $$($(1)_OBJS), $$(eval $$(obj): $$($(1)_COMMON_DEPS))) - - # Include .dep files, if they exist. - $(1)_DEPS := $$(foreach fn, $$($(1)_OBJS), $$(call filename-to-dep, $$(fn))) - -include $$($(1)_DEPS) - - libs-list += $$($(1)_PATH) - clean-files += $$(_d)/*.a $$(_d)/*.$(SO_EXT) $$(_d)/*.o $$(_d)/.*.dep $$($(1)_DEPS) $$($(1)_OBJS) - dist-files += $$(_srcs) -endef diff --git a/mk/patterns.mk b/mk/patterns.mk deleted file mode 100644 index f5674d4043..0000000000 --- a/mk/patterns.mk +++ /dev/null @@ -1,8 +0,0 @@ -%.o: %.cc - $(trace-cxx) $(CXX) -o $@ -c $< $(GLOBAL_CXXFLAGS) $(CXXFLAGS) $($@_CXXFLAGS) -MMD -MF $(call filename-to-dep, $@) -MP - -%.o: %.cpp - $(trace-cxx) $(CXX) -o $@ -c $< $(GLOBAL_CXXFLAGS) $(CXXFLAGS) $($@_CXXFLAGS) -MMD -MF $(call filename-to-dep, $@) -MP - -%.o: %.c - $(trace-cc) $(CC) -o $@ -c $< $(GLOBAL_CFLAGS) $(CFLAGS) $($@_CFLAGS) -MMD -MF $(call filename-to-dep, $@) -MP diff --git a/mk/programs.mk b/mk/programs.mk deleted file mode 100644 index ab04ff93e9..0000000000 --- a/mk/programs.mk +++ /dev/null @@ -1,64 +0,0 @@ -programs-list := - -# Build a program with symbolic name $(1). The program is defined by -# various variables prefixed by ‘$(1)_’: -# -# - $(1)_DIR: the directory where the (non-installed) program will be -# placed. -# -# - $(1)_SOURCES: the source files of the program. -# -# - $(1)_LIBS: the symbolic names of libraries on which this program -# depends. -# -# - $(1)_LDFLAGS: additional linker flags. -# -# - $(1)_INSTALL_DIR: the directory where the program will be -# installed; defaults to $(bindir). -define build-program - _d := $$($(1)_DIR) - _srcs := $$(sort $$(foreach src, $$($(1)_SOURCES), $$(src))) - $(1)_OBJS := $$(addsuffix .o, $$(basename $$(_srcs))) - _libs := $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_PATH)) - $(1)_PATH := $$(_d)/$(1) - - $$(eval $$(call create-dir, $$(_d))) - - $$($(1)_PATH): $$($(1)_OBJS) $$(_libs) | $$(_d) - $$(trace-ld) $(CXX) -o $$@ $(GLOBAL_LDFLAGS) $$($(1)_OBJS) $$($(1)_LDFLAGS) $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_LDFLAGS_USE)) - - $(1)_INSTALL_DIR ?= $$(bindir) - $(1)_INSTALL_PATH := $$($(1)_INSTALL_DIR)/$(1) - - $$(eval $$(call create-dir, $$($(1)_INSTALL_DIR))) - - install: $(DESTDIR)$$($(1)_INSTALL_PATH) - - ifeq ($(BUILD_SHARED_LIBS), 1) - - _libs_final := $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_INSTALL_PATH)) - - $(DESTDIR)$$($(1)_INSTALL_PATH): $$($(1)_OBJS) $$(_libs_final) | $(DESTDIR)$$($(1)_INSTALL_DIR) - $$(trace-ld) $(CXX) -o $$@ $(GLOBAL_LDFLAGS) $$($(1)_OBJS) $$($(1)_LDFLAGS) $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_LDFLAGS_USE_INSTALLED)) - - else - - $(DESTDIR)$$($(1)_INSTALL_PATH): $$($(1)_PATH) | $(DESTDIR)$$($(1)_INSTALL_DIR) - install -t $$($(1)_INSTALL_DIR) $$< - - endif - - # Propagate CXXFLAGS to the individual object files. - $$(foreach obj, $$($(1)_OBJS), $$(eval $$(obj)_CXXFLAGS=$$($(1)_CXXFLAGS))) - - # Make each object file depend on the common dependencies. - $$(foreach obj, $$($(1)_OBJS), $$(eval $$(obj): $$($(1)_COMMON_DEPS))) - - # Include .dep files, if they exist. - $(1)_DEPS := $$(foreach fn, $$($(1)_OBJS), $$(call filename-to-dep, $$(fn))) - -include $$($(1)_DEPS) - - programs-list += $$($(1)_PATH) - clean-files += $$($(1)_PATH) $$(_d)/*.o $$(_d)/.*.dep $$($(1)_DEPS) $$($(1)_OBJS) - dist-files += $$(_srcs) -endef diff --git a/mk/templates.mk b/mk/templates.mk deleted file mode 100644 index 8e8b28643f..0000000000 --- a/mk/templates.mk +++ /dev/null @@ -1,12 +0,0 @@ -template-files := - -# Create the file $(1) from $(1).in by running config.status (which -# substitutes all ‘@var@’ variables set by the configure script). -define instantiate-template - - clean-files += $(1) - -endef - -%: %.in - $(trace-gen) ./config.status --quiet --file $@ diff --git a/mk/tests.mk b/mk/tests.mk deleted file mode 100644 index 004a480286..0000000000 --- a/mk/tests.mk +++ /dev/null @@ -1,26 +0,0 @@ -# Run program $1 as part of ‘make installcheck’. -define run-install-test - - installcheck: $1 - - _installcheck-list += $1 - -endef - -installcheck: - @total=0; failed=0; for i in $(_installcheck-list); do \ - total=$$((total + 1)); \ - echo "running test $$i"; \ - if (cd $$(dirname $$i) && $(tests-environment) $$(basename $$i)); then \ - echo "PASS: $$i"; \ - else \ - echo "FAIL: $$i"; \ - failed=$$((failed + 1)); \ - fi; \ - done; \ - if [ "$$failed" != 0 ]; then \ - echo "$$failed out of $$total tests failed "; \ - exit 1; \ - fi - -.PHONY: check installcheck diff --git a/mk/tracing.mk b/mk/tracing.mk deleted file mode 100644 index 13912d3c78..0000000000 --- a/mk/tracing.mk +++ /dev/null @@ -1,17 +0,0 @@ -V ?= 0 - -ifeq ($(V), 0) - - trace-gen = @echo " GEN " $@; - trace-cc = @echo " CC " $@; - trace-cxx = @echo " CXX " $@; - trace-ld = @echo " LD " $@; - trace-ar = @echo " AR " $@; - trace-install = @echo " INST " $@; - trace-javac = @echo " JAVAC " $@; - trace-jar = @echo " JAR " $@; - trace-mkdir = @echo " MKDIR " $@; - - suppress = @ - -endif diff --git a/nix.spec.in b/nix.spec.in deleted file mode 100644 index f067c3896f..0000000000 --- a/nix.spec.in +++ /dev/null @@ -1,204 +0,0 @@ -%global nixbld_user "nix-builder-" -%global nixbld_group "nix-builders" - -Summary: The Nix software deployment system -Name: nix -Version: @PACKAGE_VERSION@ -Release: 2%{?dist} -License: LGPLv2+ -%if 0%{?rhel} -Group: Applications/System -%endif -URL: http://nixos.org/ -Source0: %{name}-%{version}.tar.bz2 -%if 0%{?el5} -BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) -%endif -BuildRequires: perl(DBD::SQLite) -BuildRequires: perl(DBI) -BuildRequires: perl(WWW::Curl) -BuildRequires: perl(ExtUtils::ParseXS) -Requires: /usr/bin/perl -Requires: curl -Requires: perl-DBD-SQLite -Requires: bzip2 -Requires: gzip -Requires: xz -BuildRequires: bzip2-devel -BuildRequires: sqlite-devel - -# Hack to make that shitty RPM scanning hack shut up. -Provides: perl(Nix::SSH) - -%description -Nix is a purely functional package manager. It allows multiple -versions of a package to be installed side-by-side, ensures that -dependency specifications are complete, supports atomic upgrades and -rollbacks, allows non-root users to install software, and has many -other features. It is the basis of the NixOS Linux distribution, but -it can be used equally well under other Unix systems. - -%package devel -Summary: Development files for %{name} -%if 0%{?rhel} -Group: Development/Libraries -%endif -Requires: %{name}%{?_isa} = %{version}-%{release} - -%description devel -The %{name}-devel package contains libraries and header files for -developing applications that use %{name}. - - -%package doc -Summary: Documentation files for %{name} -%if 0%{?rhel} -Group: Documentation -%endif -BuildArch: noarch -Requires: %{name} = %{version}-%{release} - -%description doc -The %{name}-doc package contains documentation files for %{name}. - - -%package -n emacs-%{name} -Summary: Nix mode for Emacs -%if 0%{?rhel} -Group: Applications/Editors -%endif -BuildArch: noarch -BuildRequires: emacs -Requires: emacs(bin) >= %{_emacs_version} - -%description -n emacs-%{name} -This package provides a major mode for editing Nix expressions. - -%package -n emacs-%{name}-el -Summary: Elisp source files for emacs-%{name} -%if 0%{?rhel} -Group: Applications/Editors -%endif -BuildArch: noarch -Requires: emacs-%{name} = %{version}-%{release} - -%description -n emacs-%{name}-el -This package contains the elisp source file for the Nix major mode for -GNU Emacs. You do not need to install this package to run Nix. Install -the emacs-%{name} package to edit Nix expressions with GNU Emacs. - - -%prep -%setup -q -# Install Perl modules to vendor_perl -# configure.ac need to be changed to make this global; however, this will -# also affect NixOS. Use discretion. -%{__sed} -i 's|perl5/site_perl/$perlversion/$perlarchname|perl5/vendor_perl|' \ - configure - - -%build -extraFlags= -# - override docdir so large documentation files are owned by the -# -doc subpackage -# - set localstatedir by hand to the preferred nix value -%configure --localstatedir=/nix/var \ - --docdir=%{_defaultdocdir}/%{name}-doc-%{version} \ - $extraFlags -make %{?_smp_flags} -%{_emacs_bytecompile} misc/emacs/nix-mode.el - - -%install -%if 0%{?el5} -rm -rf $RPM_BUILD_ROOT -%endif -make DESTDIR=$RPM_BUILD_ROOT install - -find $RPM_BUILD_ROOT -name '*.la' -exec rm -f {} ';' - -# Specify build users group -mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/nix -echo "build-users-group = %{nixbld_group}" > $RPM_BUILD_ROOT%{_sysconfdir}/nix/nix.conf - -# make per-user directories -for d in profiles gcroots; -do - mkdir -p $RPM_BUILD_ROOT/nix/var/nix/$d/per-user - chmod 1777 $RPM_BUILD_ROOT/nix/var/nix/$d/per-user -done - -# fix permission of nix profile -# (until this is fixed in the relevant Makefile) -chmod -x $RPM_BUILD_ROOT%{_sysconfdir}/profile.d/nix.sh - -# systemd not available on RHEL yet -%if ! 0%{?rhel} -# install systemd service descriptor -mkdir -p $RPM_BUILD_ROOT%{_prefix}/lib/systemd/system -cp -p misc/systemd/nix-daemon.service \ - $RPM_BUILD_ROOT%{_prefix}/lib/systemd/system/ -%endif - -# Copy the byte-compiled mode file by hand -cp -p misc/emacs/nix-mode.elc $RPM_BUILD_ROOT%{_emacs_sitelispdir}/ - -# we ship this file in the base package -rm -f $RPM_BUILD_ROOT%{_defaultdocdir}/%{name}-doc-%{version}/README - - -%clean -rm -rf $RPM_BUILD_ROOT - - -%pre -getent group %{nixbld_group} >/dev/null || groupadd -r %{nixbld_group} -for i in $(seq 10); -do - getent passwd %{nixbld_user}$i >/dev/null || \ - useradd -r -g %{nixbld_group} -G %{nixbld_group} -d /var/empty \ - -s %{_sbindir}/nologin \ - -c "Nix build user $i" %{nixbld_user}$i -done - -%post -chgrp %{nixbld_group} /nix/store -chmod 1775 /nix/store -%if ! 0%{?rhel} -# Enable and start Nix worker -systemctl enable nix-daemon.service -systemctl start nix-daemon.service -%endif - -%files -%{_bindir}/nix-* -%{_libdir}/*.so -%{perl_vendorarch}/* -%exclude %dir %{perl_vendorarch}/auto/ -%{_prefix}/libexec/* -%if ! 0%{?rhel} -%{_prefix}/lib/systemd/system/nix-daemon.service -%endif -%{_datadir}/emacs/site-lisp/nix-mode.el -%{_datadir}/nix -%{_mandir}/man1/*.1* -%{_mandir}/man5/*.5* -%{_mandir}/man8/*.8* -%config(noreplace) %{_sysconfdir}/profile.d/nix.sh -/nix -%dir %{_sysconfdir}/nix -%config(noreplace) %{_sysconfdir}/nix/nix.conf - -%files devel -%{_includedir}/nix - -%files doc -%docdir %{_defaultdocdir}/%{name}-doc-%{version} -%{_defaultdocdir}/%{name}-doc-%{version} - -%files -n emacs-%{name} -%{_emacs_sitelispdir}/*.elc -#{_emacs_sitestartdir}/*.el - -%files -n emacs-%{name}-el -%{_emacs_sitelispdir}/*.el diff --git a/src/boost/assert.hpp b/nix/boost/assert.hpp similarity index 100% rename from src/boost/assert.hpp rename to nix/boost/assert.hpp diff --git a/src/boost/format.hpp b/nix/boost/format.hpp similarity index 100% rename from src/boost/format.hpp rename to nix/boost/format.hpp diff --git a/src/boost/format/exceptions.hpp b/nix/boost/format/exceptions.hpp similarity index 100% rename from src/boost/format/exceptions.hpp rename to nix/boost/format/exceptions.hpp diff --git a/src/boost/format/feed_args.hpp b/nix/boost/format/feed_args.hpp similarity index 100% rename from src/boost/format/feed_args.hpp rename to nix/boost/format/feed_args.hpp diff --git a/src/boost/format/format_class.hpp b/nix/boost/format/format_class.hpp similarity index 100% rename from src/boost/format/format_class.hpp rename to nix/boost/format/format_class.hpp diff --git a/src/boost/format/format_fwd.hpp b/nix/boost/format/format_fwd.hpp similarity index 100% rename from src/boost/format/format_fwd.hpp rename to nix/boost/format/format_fwd.hpp diff --git a/src/boost/format/format_implementation.cc b/nix/boost/format/format_implementation.cc similarity index 100% rename from src/boost/format/format_implementation.cc rename to nix/boost/format/format_implementation.cc diff --git a/src/boost/format/free_funcs.cc b/nix/boost/format/free_funcs.cc similarity index 100% rename from src/boost/format/free_funcs.cc rename to nix/boost/format/free_funcs.cc diff --git a/src/boost/format/group.hpp b/nix/boost/format/group.hpp similarity index 100% rename from src/boost/format/group.hpp rename to nix/boost/format/group.hpp diff --git a/src/boost/format/internals.hpp b/nix/boost/format/internals.hpp similarity index 100% rename from src/boost/format/internals.hpp rename to nix/boost/format/internals.hpp diff --git a/src/boost/format/internals_fwd.hpp b/nix/boost/format/internals_fwd.hpp similarity index 100% rename from src/boost/format/internals_fwd.hpp rename to nix/boost/format/internals_fwd.hpp diff --git a/src/boost/format/macros_default.hpp b/nix/boost/format/macros_default.hpp similarity index 100% rename from src/boost/format/macros_default.hpp rename to nix/boost/format/macros_default.hpp diff --git a/src/boost/format/parsing.cc b/nix/boost/format/parsing.cc similarity index 100% rename from src/boost/format/parsing.cc rename to nix/boost/format/parsing.cc diff --git a/src/boost/throw_exception.hpp b/nix/boost/throw_exception.hpp similarity index 100% rename from src/boost/throw_exception.hpp rename to nix/boost/throw_exception.hpp diff --git a/src/libstore/build.cc b/nix/libstore/build.cc similarity index 100% rename from src/libstore/build.cc rename to nix/libstore/build.cc diff --git a/src/libstore/derivations.cc b/nix/libstore/derivations.cc similarity index 100% rename from src/libstore/derivations.cc rename to nix/libstore/derivations.cc diff --git a/src/libstore/derivations.hh b/nix/libstore/derivations.hh similarity index 100% rename from src/libstore/derivations.hh rename to nix/libstore/derivations.hh diff --git a/src/libstore/gc.cc b/nix/libstore/gc.cc similarity index 100% rename from src/libstore/gc.cc rename to nix/libstore/gc.cc diff --git a/src/libstore/globals.cc b/nix/libstore/globals.cc similarity index 100% rename from src/libstore/globals.cc rename to nix/libstore/globals.cc diff --git a/src/libstore/globals.hh b/nix/libstore/globals.hh similarity index 100% rename from src/libstore/globals.hh rename to nix/libstore/globals.hh diff --git a/src/libstore/local-store.cc b/nix/libstore/local-store.cc similarity index 100% rename from src/libstore/local-store.cc rename to nix/libstore/local-store.cc diff --git a/src/libstore/local-store.hh b/nix/libstore/local-store.hh similarity index 100% rename from src/libstore/local-store.hh rename to nix/libstore/local-store.hh diff --git a/src/libstore/misc.cc b/nix/libstore/misc.cc similarity index 100% rename from src/libstore/misc.cc rename to nix/libstore/misc.cc diff --git a/src/libstore/misc.hh b/nix/libstore/misc.hh similarity index 100% rename from src/libstore/misc.hh rename to nix/libstore/misc.hh diff --git a/src/libstore/optimise-store.cc b/nix/libstore/optimise-store.cc similarity index 100% rename from src/libstore/optimise-store.cc rename to nix/libstore/optimise-store.cc diff --git a/src/libstore/pathlocks.cc b/nix/libstore/pathlocks.cc similarity index 100% rename from src/libstore/pathlocks.cc rename to nix/libstore/pathlocks.cc diff --git a/src/libstore/pathlocks.hh b/nix/libstore/pathlocks.hh similarity index 100% rename from src/libstore/pathlocks.hh rename to nix/libstore/pathlocks.hh diff --git a/src/libstore/references.cc b/nix/libstore/references.cc similarity index 100% rename from src/libstore/references.cc rename to nix/libstore/references.cc diff --git a/src/libstore/references.hh b/nix/libstore/references.hh similarity index 100% rename from src/libstore/references.hh rename to nix/libstore/references.hh diff --git a/src/libstore/remote-store.cc b/nix/libstore/remote-store.cc similarity index 100% rename from src/libstore/remote-store.cc rename to nix/libstore/remote-store.cc diff --git a/src/libstore/remote-store.hh b/nix/libstore/remote-store.hh similarity index 100% rename from src/libstore/remote-store.hh rename to nix/libstore/remote-store.hh diff --git a/src/libstore/schema.sql b/nix/libstore/schema.sql similarity index 100% rename from src/libstore/schema.sql rename to nix/libstore/schema.sql diff --git a/src/libstore/store-api.cc b/nix/libstore/store-api.cc similarity index 100% rename from src/libstore/store-api.cc rename to nix/libstore/store-api.cc diff --git a/src/libstore/store-api.hh b/nix/libstore/store-api.hh similarity index 100% rename from src/libstore/store-api.hh rename to nix/libstore/store-api.hh diff --git a/src/libstore/worker-protocol.hh b/nix/libstore/worker-protocol.hh similarity index 100% rename from src/libstore/worker-protocol.hh rename to nix/libstore/worker-protocol.hh diff --git a/src/libutil/affinity.cc b/nix/libutil/affinity.cc similarity index 100% rename from src/libutil/affinity.cc rename to nix/libutil/affinity.cc diff --git a/src/libutil/affinity.hh b/nix/libutil/affinity.hh similarity index 100% rename from src/libutil/affinity.hh rename to nix/libutil/affinity.hh diff --git a/src/libutil/archive.cc b/nix/libutil/archive.cc similarity index 100% rename from src/libutil/archive.cc rename to nix/libutil/archive.cc diff --git a/src/libutil/archive.hh b/nix/libutil/archive.hh similarity index 100% rename from src/libutil/archive.hh rename to nix/libutil/archive.hh diff --git a/src/libutil/hash.cc b/nix/libutil/hash.cc similarity index 100% rename from src/libutil/hash.cc rename to nix/libutil/hash.cc diff --git a/src/libutil/hash.hh b/nix/libutil/hash.hh similarity index 100% rename from src/libutil/hash.hh rename to nix/libutil/hash.hh diff --git a/src/libutil/md32_common.h b/nix/libutil/md32_common.h similarity index 100% rename from src/libutil/md32_common.h rename to nix/libutil/md32_common.h diff --git a/src/libutil/md5.c b/nix/libutil/md5.c similarity index 100% rename from src/libutil/md5.c rename to nix/libutil/md5.c diff --git a/src/libutil/md5.h b/nix/libutil/md5.h similarity index 100% rename from src/libutil/md5.h rename to nix/libutil/md5.h diff --git a/src/libutil/serialise.cc b/nix/libutil/serialise.cc similarity index 100% rename from src/libutil/serialise.cc rename to nix/libutil/serialise.cc diff --git a/src/libutil/serialise.hh b/nix/libutil/serialise.hh similarity index 100% rename from src/libutil/serialise.hh rename to nix/libutil/serialise.hh diff --git a/src/libutil/sha1.c b/nix/libutil/sha1.c similarity index 100% rename from src/libutil/sha1.c rename to nix/libutil/sha1.c diff --git a/src/libutil/sha1.h b/nix/libutil/sha1.h similarity index 100% rename from src/libutil/sha1.h rename to nix/libutil/sha1.h diff --git a/src/libutil/sha256.c b/nix/libutil/sha256.c similarity index 100% rename from src/libutil/sha256.c rename to nix/libutil/sha256.c diff --git a/src/libutil/sha256.h b/nix/libutil/sha256.h similarity index 100% rename from src/libutil/sha256.h rename to nix/libutil/sha256.h diff --git a/src/libutil/types.hh b/nix/libutil/types.hh similarity index 100% rename from src/libutil/types.hh rename to nix/libutil/types.hh diff --git a/src/libutil/util.cc b/nix/libutil/util.cc similarity index 100% rename from src/libutil/util.cc rename to nix/libutil/util.cc diff --git a/src/libutil/util.hh b/nix/libutil/util.hh similarity index 100% rename from src/libutil/util.hh rename to nix/libutil/util.hh diff --git a/src/libutil/xml-writer.cc b/nix/libutil/xml-writer.cc similarity index 100% rename from src/libutil/xml-writer.cc rename to nix/libutil/xml-writer.cc diff --git a/src/libutil/xml-writer.hh b/nix/libutil/xml-writer.hh similarity index 100% rename from src/libutil/xml-writer.hh rename to nix/libutil/xml-writer.hh diff --git a/src/nix-daemon/nix-daemon.cc b/nix/nix-daemon/nix-daemon.cc similarity index 100% rename from src/nix-daemon/nix-daemon.cc rename to nix/nix-daemon/nix-daemon.cc diff --git a/perl/MANIFEST b/perl/MANIFEST deleted file mode 100644 index 08897647c9..0000000000 --- a/perl/MANIFEST +++ /dev/null @@ -1,7 +0,0 @@ -Changes -Makefile.PL -MANIFEST -Nix.xs -README -t/Nix.t -lib/Nix.pm diff --git a/perl/lib/Nix/Config.pm.in b/perl/lib/Nix/Config.pm.in deleted file mode 100644 index e07d4c08f1..0000000000 --- a/perl/lib/Nix/Config.pm.in +++ /dev/null @@ -1,42 +0,0 @@ -package Nix::Config; - -$version = "@PACKAGE_VERSION@"; - -$binDir = $ENV{"NIX_BIN_DIR"} || "@bindir@"; -$libexecDir = $ENV{"NIX_LIBEXEC_DIR"} || "@libexecdir@"; -$stateDir = $ENV{"NIX_STATE_DIR"} || "@localstatedir@/nix"; -$manifestDir = $ENV{"NIX_MANIFESTS_DIR"} || "@localstatedir@/nix/manifests"; -$logDir = $ENV{"NIX_LOG_DIR"} || "@localstatedir@/log/nix"; -$confDir = $ENV{"NIX_CONF_DIR"} || "@sysconfdir@/nix"; -$storeDir = $ENV{"NIX_STORE_DIR"} || "@storedir@"; - -$bzip2 = "@bzip2@"; -$xz = "@xz@"; -$curl = "@curl@"; -$openssl = "@openssl@"; - -$useBindings = "@perlbindings@" eq "yes"; - -%config = (); - -sub readConfig { - if (defined $ENV{'_NIX_OPTIONS'}) { - foreach my $s (split '\n', $ENV{'_NIX_OPTIONS'}) { - my ($n, $v) = split '=', $s, 2; - $config{$n} = $v; - } - return; - } - - my $config = "$confDir/nix.conf"; - return unless -f $config; - - open CONFIG, "<$config" or die "cannot open `$config'"; - while () { - /^\s*([\w\-\.]+)\s*=\s*(.*)$/ or next; - $config{$1} = $2; - } - close CONFIG; -} - -return 1; diff --git a/perl/lib/Nix/CopyClosure.pm b/perl/lib/Nix/CopyClosure.pm deleted file mode 100644 index 41ceabd858..0000000000 --- a/perl/lib/Nix/CopyClosure.pm +++ /dev/null @@ -1,57 +0,0 @@ -package Nix::CopyClosure; - -use strict; -use Nix::Config; -use Nix::Store; -use List::Util qw(sum); - - -sub copyTo { - my ($sshHost, $sshOpts, $storePaths, $compressor, $decompressor, - $includeOutputs, $dryRun, $sign, $progressViewer, $useSubstitutes) = @_; - - # Get the closure of this path. - my @closure = reverse(topoSortPaths(computeFSClosure(0, $includeOutputs, - map { followLinksToStorePath $_ } @{$storePaths}))); - - # Optionally use substitutes on the remote host. - if (!$dryRun && $useSubstitutes) { - system "ssh $sshHost @{$sshOpts} nix-store -r --ignore-unknown @closure"; - # Ignore exit status because this is just an optimisation. - } - - # Ask the remote host which paths are invalid. Because of limits - # to the command line length, do this in chunks. Eventually, - # we'll want to use ‘--from-stdin’, but we can't rely on the - # target having this option yet. - my @missing = (); - my $missingSize = 0; - while (scalar(@closure) > 0) { - my @ps = splice(@closure, 0, 1500); - open(READ, "set -f; ssh $sshHost @{$sshOpts} nix-store --check-validity --print-invalid @ps|"); - while () { - chomp; - push @missing, $_; - my ($deriver, $narHash, $time, $narSize, $refs) = queryPathInfo($_, 1); - $missingSize += $narSize; - } - close READ or die; - } - - $compressor = "$compressor |" if $compressor ne ""; - $decompressor = "$decompressor |" if $decompressor ne ""; - $progressViewer = "$progressViewer -s $missingSize |" if $progressViewer ne ""; - - # Export the store paths and import them on the remote machine. - if (scalar @missing > 0) { - print STDERR "copying ", scalar @missing, " missing paths to ‘$sshHost’...\n"; - unless ($dryRun) { - open SSH, "| $progressViewer $compressor ssh $sshHost @{$sshOpts} '$decompressor nix-store --import' > /dev/null" or die; - exportPaths(fileno(SSH), $sign, @missing); - close SSH or die "copying store paths to remote machine `$sshHost' failed: $?"; - } - } -} - - -1; diff --git a/perl/lib/Nix/Crypto.pm b/perl/lib/Nix/Crypto.pm deleted file mode 100644 index 0286e88d3d..0000000000 --- a/perl/lib/Nix/Crypto.pm +++ /dev/null @@ -1,42 +0,0 @@ -package Nix::Crypto; - -use strict; -use MIME::Base64; -use Nix::Store; -use Nix::Config; -use IPC::Open2; - -our @ISA = qw(Exporter); -our @EXPORT = qw(signString isValidSignature); - -sub signString { - my ($privateKeyFile, $s) = @_; - my $hash = hashString("sha256", 0, $s); - my ($from, $to); - my $pid = open2($from, $to, $Nix::Config::openssl, "rsautl", "-sign", "-inkey", $privateKeyFile); - print $to $hash; - close $to; - local $/ = undef; - my $sig = <$from>; - close $from; - waitpid($pid, 0); - die "$0: OpenSSL returned exit code $? while signing hash\n" if $? != 0; - my $sig64 = encode_base64($sig, ""); - return $sig64; -} - -sub isValidSignature { - my ($publicKeyFile, $sig64, $s) = @_; - my ($from, $to); - my $pid = open2($from, $to, $Nix::Config::openssl, "rsautl", "-verify", "-inkey", $publicKeyFile, "-pubin"); - print $to decode_base64($sig64); - close $to; - my $decoded = <$from>; - close $from; - waitpid($pid, 0); - return 0 if $? != 0; - my $hash = hashString("sha256", 0, $s); - return $decoded eq $hash; -} - -1; diff --git a/perl/lib/Nix/GeneratePatches.pm b/perl/lib/Nix/GeneratePatches.pm deleted file mode 100644 index 612c8a3a15..0000000000 --- a/perl/lib/Nix/GeneratePatches.pm +++ /dev/null @@ -1,340 +0,0 @@ -package Nix::GeneratePatches; - -use strict; -use File::Temp qw(tempdir); -use File::stat; -use Nix::Config; -use Nix::Manifest; - -our @ISA = qw(Exporter); -our @EXPORT = qw(generatePatches propagatePatches copyPatches); - - -# Some patch generations options. - -# Max size of NAR archives to generate patches for. -my $maxNarSize = $ENV{"NIX_MAX_NAR_SIZE"}; -$maxNarSize = 160 * 1024 * 1024 if !defined $maxNarSize; - -# If patch is bigger than this fraction of full archive, reject. -my $maxPatchFraction = $ENV{"NIX_PATCH_FRACTION"}; -$maxPatchFraction = 0.60 if !defined $maxPatchFraction; - -my $timeLimit = $ENV{"NIX_BSDIFF_TIME_LIMIT"}; -$timeLimit = 180 if !defined $timeLimit; - -my $hashAlgo = "sha256"; - - -sub findOutputPaths { - my $narFiles = shift; - - my %outPaths; - - foreach my $p (keys %{$narFiles}) { - - # Ignore derivations. - next if ($p =~ /\.drv$/); - - # Ignore builders (too much ambiguity -- they're all called - # `builder.sh'). - next if ($p =~ /\.sh$/); - next if ($p =~ /\.patch$/); - - # Don't bother including tar files etc. - next if ($p =~ /\.tar$/ || $p =~ /\.tar\.(gz|bz2|Z|lzma|xz)$/ || $p =~ /\.zip$/ || $p =~ /\.bin$/ || $p =~ /\.tgz$/ || $p =~ /\.rpm$/ || $p =~ /cvs-export$/ || $p =~ /fetchhg$/); - - $outPaths{$p} = 1; - } - - return %outPaths; -} - - -sub getNameVersion { - my $p = shift; - $p =~ /\/[0-9a-z]+((?:-[a-zA-Z][^\/-]*)+)([^\/]*)$/; - my $name = $1; - my $version = $2; - return undef unless defined $name && defined $version; - $name =~ s/^-//; - $version =~ s/^-//; - return ($name, $version); -} - - -# A quick hack to get a measure of the `distance' between two -# versions: it's just the position of the first character that differs -# (or 999 if they are the same). -sub versionDiff { - my $s = shift; - my $t = shift; - my $i; - return 999 if $s eq $t; - for ($i = 0; $i < length $s; $i++) { - return $i if $i >= length $t or - substr($s, $i, 1) ne substr($t, $i, 1); - } - return $i; -} - - -sub getNarBz2 { - my $narPath = shift; - my $narFiles = shift; - my $storePath = shift; - - my $narFileList = $$narFiles{$storePath}; - die "missing path $storePath" unless defined $narFileList; - - my $narFile = @{$narFileList}[0]; - die unless defined $narFile; - - $narFile->{url} =~ /\/([^\/]+)$/; - die unless defined $1; - return "$narPath/$1"; -} - - -sub containsPatch { - my $patches = shift; - my $storePath = shift; - my $basePath = shift; - my $patchList = $$patches{$storePath}; - return 0 if !defined $patchList; - my $found = 0; - foreach my $patch (@{$patchList}) { - # !!! baseHash might differ - return 1 if $patch->{basePath} eq $basePath; - } - return 0; -} - - -sub generatePatches { - my ($srcNarFiles, $dstNarFiles, $srcPatches, $dstPatches, $narPath, $patchesPath, $patchesURL, $tmpDir) = @_; - - my %srcOutPaths = findOutputPaths $srcNarFiles; - my %dstOutPaths = findOutputPaths $dstNarFiles; - - # For each output path in the destination, see if we need to / can - # create a patch. - - print STDERR "creating patches...\n"; - - foreach my $p (keys %dstOutPaths) { - - # If exactly the same path already exists in the source, skip it. - next if defined $srcOutPaths{$p}; - - print " $p\n"; - - # If not, then we should find the paths in the source that are - # `most' likely to be present on a system that wants to - # install this path. - - (my $name, my $version) = getNameVersion $p; - next unless defined $name && defined $version; - - my @closest = (); - my $closestVersion; - my $minDist = -1; # actually, larger means closer - - # Find all source paths with the same name. - - foreach my $q (keys %srcOutPaths) { - (my $name2, my $version2) = getNameVersion $q; - next unless defined $name2 && defined $version2; - - if ($name eq $name2) { - - my $srcSystem = @{$$dstNarFiles{$p}}[0]->{system}; - my $dstSystem = @{$$srcNarFiles{$q}}[0]->{system}; - if (defined $srcSystem && defined $dstSystem && $srcSystem ne $dstSystem) { - print " SKIPPING $q due to different systems ($srcSystem vs. $dstSystem)\n"; - next; - } - - # If the sizes differ too much, then skip. This - # disambiguates between, e.g., a real component and a - # wrapper component (cf. Firefox in Nixpkgs). - my $srcSize = @{$$srcNarFiles{$q}}[0]->{size}; - my $dstSize = @{$$dstNarFiles{$p}}[0]->{size}; - my $ratio = $srcSize / $dstSize; - $ratio = 1 / $ratio if $ratio < 1; - # print " SIZE $srcSize $dstSize $ratio $q\n"; - - if ($ratio >= 3) { - print " SKIPPING $q due to size ratio $ratio ($srcSize vs. $dstSize)\n"; - next; - } - - # If there are multiple matching names, include the - # ones with the closest version numbers. - my $dist = versionDiff $version, $version2; - if ($dist > $minDist) { - $minDist = $dist; - @closest = ($q); - $closestVersion = $version2; - } elsif ($dist == $minDist) { - push @closest, $q; - } - } - } - - if (scalar(@closest) == 0) { - print " NO BASE: $p\n"; - next; - } - - foreach my $closest (@closest) { - - # Generate a patch between $closest and $p. - print STDERR " $p <- $closest\n"; - - # If the patch already exists, skip it. - if (containsPatch($srcPatches, $p, $closest) || - containsPatch($dstPatches, $p, $closest)) - { - print " skipping, already exists\n"; - next; - } - - my $srcNarBz2 = getNarBz2 $narPath, $srcNarFiles, $closest; - my $dstNarBz2 = getNarBz2 $narPath, $dstNarFiles, $p; - - if (! -f $srcNarBz2) { - warn "patch source archive $srcNarBz2 is missing\n"; - next; - } - - system("$Nix::Config::bzip2 -d < $srcNarBz2 > $tmpDir/A") == 0 - or die "cannot unpack $srcNarBz2"; - - if (stat("$tmpDir/A")->size >= $maxNarSize) { - print " skipping, source is too large\n"; - next; - } - - system("$Nix::Config::bzip2 -d < $dstNarBz2 > $tmpDir/B") == 0 - or die "cannot unpack $dstNarBz2"; - - if (stat("$tmpDir/B")->size >= $maxNarSize) { - print " skipping, destination is too large\n"; - next; - } - - my $time1 = time(); - my $res = system("ulimit -t $timeLimit; $Nix::Config::libexecDir/nix/bsdiff $tmpDir/A $tmpDir/B $tmpDir/DIFF"); - my $time2 = time(); - if ($res) { - warn "binary diff computation aborted after ", $time2 - $time1, " seconds\n"; - next; - } - - my $baseHash = `$Nix::Config::binDir/nix-hash --flat --type $hashAlgo --base32 $tmpDir/A` or die; - chomp $baseHash; - - my $narHash = `$Nix::Config::binDir/nix-hash --flat --type $hashAlgo --base32 $tmpDir/B` or die; - chomp $narHash; - - my $narDiffHash = `$Nix::Config::binDir/nix-hash --flat --type $hashAlgo --base32 $tmpDir/DIFF` or die; - chomp $narDiffHash; - - my $narDiffSize = stat("$tmpDir/DIFF")->size; - my $dstNarBz2Size = stat($dstNarBz2)->size; - - print " size $narDiffSize; full size $dstNarBz2Size; ", $time2 - $time1, " seconds\n"; - - if ($narDiffSize >= $dstNarBz2Size) { - print " rejecting; patch bigger than full archive\n"; - next; - } - - if ($narDiffSize / $dstNarBz2Size >= $maxPatchFraction) { - print " rejecting; patch too large relative to full archive\n"; - next; - } - - my $finalName = "$narDiffHash.nar-bsdiff"; - - if (-e "$patchesPath/$finalName") { - print " not copying, already exists\n"; - } - - else { - system("cp '$tmpDir/DIFF' '$patchesPath/$finalName.tmp'") == 0 - or die "cannot copy diff"; - rename("$patchesPath/$finalName.tmp", "$patchesPath/$finalName") - or die "cannot rename $patchesPath/$finalName.tmp"; - } - - # Add the patch to the manifest. - addPatch $dstPatches, $p, - { url => "$patchesURL/$finalName", hash => "$hashAlgo:$narDiffHash" - , size => $narDiffSize, basePath => $closest, baseHash => "$hashAlgo:$baseHash" - , narHash => "$hashAlgo:$narHash", patchType => "nar-bsdiff" - }; - } - } -} - - -# Propagate useful patches from $srcPatches to $dstPatches. A patch -# is useful if it produces either paths in the $dstNarFiles or paths -# that can be used as the base for other useful patches. -sub propagatePatches { - my ($srcPatches, $dstNarFiles, $dstPatches) = @_; - - print STDERR "propagating patches...\n"; - - my $changed; - do { - # !!! we repeat this to reach the transitive closure; inefficient - $changed = 0; - - print STDERR "loop\n"; - - my %dstBasePaths; - foreach my $q (keys %{$dstPatches}) { - foreach my $patch (@{$$dstPatches{$q}}) { - $dstBasePaths{$patch->{basePath}} = 1; - } - } - - foreach my $p (keys %{$srcPatches}) { - my $patchList = $$srcPatches{$p}; - - my $include = 0; - - # Is path $p included in the destination? If so, include - # patches that produce it. - $include = 1 if defined $$dstNarFiles{$p}; - - # Is path $p a path that serves as a base for paths in the - # destination? If so, include patches that produce it. - # !!! check baseHash - $include = 1 if defined $dstBasePaths{$p}; - - if ($include) { - foreach my $patch (@{$patchList}) { - $changed = 1 if addPatch $dstPatches, $p, $patch; - } - } - - } - - } while $changed; -} - - -# Add all new patches in $srcPatches to $dstPatches. -sub copyPatches { - my ($srcPatches, $dstPatches) = @_; - foreach my $p (keys %{$srcPatches}) { - addPatch $dstPatches, $p, $_ foreach @{$$srcPatches{$p}}; - } -} - - -return 1; diff --git a/perl/lib/Nix/Manifest.pm b/perl/lib/Nix/Manifest.pm deleted file mode 100644 index 015c928356..0000000000 --- a/perl/lib/Nix/Manifest.pm +++ /dev/null @@ -1,467 +0,0 @@ -package Nix::Manifest; - -use strict; -use DBI; -use DBD::SQLite; -use Cwd; -use File::stat; -use File::Path; -use Fcntl ':flock'; -use Nix::Config; -use Nix::Crypto; - -our @ISA = qw(Exporter); -our @EXPORT = qw(readManifest writeManifest updateManifestDB addPatch deleteOldManifests parseNARInfo); - - -sub addNAR { - my ($narFiles, $storePath, $info) = @_; - - $$narFiles{$storePath} = [] - unless defined $$narFiles{$storePath}; - - my $narFileList = $$narFiles{$storePath}; - - my $found = 0; - foreach my $narFile (@{$narFileList}) { - $found = 1 if $narFile->{url} eq $info->{url}; - } - - push @{$narFileList}, $info if !$found; -} - - -sub addPatch { - my ($patches, $storePath, $patch) = @_; - - $$patches{$storePath} = [] - unless defined $$patches{$storePath}; - - my $patchList = $$patches{$storePath}; - - my $found = 0; - foreach my $patch2 (@{$patchList}) { - $found = 1 if - $patch2->{url} eq $patch->{url} && - $patch2->{basePath} eq $patch->{basePath}; - } - - push @{$patchList}, $patch if !$found; - - return !$found; -} - - -sub readManifest_ { - my ($manifest, $addNAR, $addPatch) = @_; - - # Decompress the manifest if necessary. - if ($manifest =~ /\.bz2$/) { - open MANIFEST, "$Nix::Config::bzip2 -d < $manifest |" - or die "cannot decompress `$manifest': $!"; - } else { - open MANIFEST, "<$manifest" - or die "cannot open `$manifest': $!"; - } - - my $inside = 0; - my $type; - - my $manifestVersion = 2; - - my ($storePath, $url, $hash, $size, $basePath, $baseHash, $patchType); - my ($narHash, $narSize, $references, $deriver, $copyFrom, $system, $compressionType); - - while () { - chomp; - s/\#.*$//g; - next if (/^$/); - - if (!$inside) { - - if (/^\s*(\w*)\s*\{$/) { - $type = $1; - $type = "narfile" if $type eq ""; - $inside = 1; - undef $storePath; - undef $url; - undef $hash; - undef $size; - undef $narHash; - undef $narSize; - undef $basePath; - undef $baseHash; - undef $patchType; - undef $system; - $references = ""; - $deriver = ""; - $compressionType = "bzip2"; - } - - } else { - - if (/^\}$/) { - $inside = 0; - - if ($type eq "narfile") { - &$addNAR($storePath, - { url => $url, hash => $hash, size => $size - , narHash => $narHash, narSize => $narSize - , references => $references - , deriver => $deriver - , system => $system - , compressionType => $compressionType - }); - } - - elsif ($type eq "patch") { - &$addPatch($storePath, - { url => $url, hash => $hash, size => $size - , basePath => $basePath, baseHash => $baseHash - , narHash => $narHash, narSize => $narSize - , patchType => $patchType - }); - } - - } - - elsif (/^\s*StorePath:\s*(\/\S+)\s*$/) { $storePath = $1; } - elsif (/^\s*CopyFrom:\s*(\/\S+)\s*$/) { $copyFrom = $1; } - elsif (/^\s*Hash:\s*(\S+)\s*$/) { $hash = $1; } - elsif (/^\s*URL:\s*(\S+)\s*$/) { $url = $1; } - elsif (/^\s*Compression:\s*(\S+)\s*$/) { $compressionType = $1; } - elsif (/^\s*Size:\s*(\d+)\s*$/) { $size = $1; } - elsif (/^\s*BasePath:\s*(\/\S+)\s*$/) { $basePath = $1; } - elsif (/^\s*BaseHash:\s*(\S+)\s*$/) { $baseHash = $1; } - elsif (/^\s*Type:\s*(\S+)\s*$/) { $patchType = $1; } - elsif (/^\s*NarHash:\s*(\S+)\s*$/) { $narHash = $1; } - elsif (/^\s*NarSize:\s*(\d+)\s*$/) { $narSize = $1; } - elsif (/^\s*References:\s*(.*)\s*$/) { $references = $1; } - elsif (/^\s*Deriver:\s*(\S+)\s*$/) { $deriver = $1; } - elsif (/^\s*ManifestVersion:\s*(\d+)\s*$/) { $manifestVersion = $1; } - elsif (/^\s*System:\s*(\S+)\s*$/) { $system = $1; } - - # Compatibility; - elsif (/^\s*NarURL:\s*(\S+)\s*$/) { $url = $1; } - elsif (/^\s*MD5:\s*(\S+)\s*$/) { $hash = "md5:$1"; } - - } - } - - close MANIFEST; - - return $manifestVersion; -} - - -sub readManifest { - my ($manifest, $narFiles, $patches) = @_; - readManifest_($manifest, - sub { addNAR($narFiles, @_); }, - sub { addPatch($patches, @_); } ); -} - - -sub writeManifest { - my ($manifest, $narFiles, $patches, $noCompress) = @_; - - open MANIFEST, ">$manifest.tmp"; # !!! check exclusive - - print MANIFEST "version {\n"; - print MANIFEST " ManifestVersion: 3\n"; - print MANIFEST "}\n"; - - foreach my $storePath (sort (keys %{$narFiles})) { - my $narFileList = $$narFiles{$storePath}; - foreach my $narFile (@{$narFileList}) { - print MANIFEST "{\n"; - print MANIFEST " StorePath: $storePath\n"; - print MANIFEST " NarURL: $narFile->{url}\n"; - print MANIFEST " Compression: $narFile->{compressionType}\n"; - print MANIFEST " Hash: $narFile->{hash}\n" if defined $narFile->{hash}; - print MANIFEST " Size: $narFile->{size}\n" if defined $narFile->{size}; - print MANIFEST " NarHash: $narFile->{narHash}\n"; - print MANIFEST " NarSize: $narFile->{narSize}\n" if $narFile->{narSize}; - print MANIFEST " References: $narFile->{references}\n" - if defined $narFile->{references} && $narFile->{references} ne ""; - print MANIFEST " Deriver: $narFile->{deriver}\n" - if defined $narFile->{deriver} && $narFile->{deriver} ne ""; - print MANIFEST " System: $narFile->{system}\n" if defined $narFile->{system}; - print MANIFEST "}\n"; - } - } - - foreach my $storePath (sort (keys %{$patches})) { - my $patchList = $$patches{$storePath}; - foreach my $patch (@{$patchList}) { - print MANIFEST "patch {\n"; - print MANIFEST " StorePath: $storePath\n"; - print MANIFEST " NarURL: $patch->{url}\n"; - print MANIFEST " Hash: $patch->{hash}\n"; - print MANIFEST " Size: $patch->{size}\n"; - print MANIFEST " NarHash: $patch->{narHash}\n"; - print MANIFEST " NarSize: $patch->{narSize}\n" if $patch->{narSize}; - print MANIFEST " BasePath: $patch->{basePath}\n"; - print MANIFEST " BaseHash: $patch->{baseHash}\n"; - print MANIFEST " Type: $patch->{patchType}\n"; - print MANIFEST "}\n"; - } - } - - - close MANIFEST; - - rename("$manifest.tmp", $manifest) - or die "cannot rename $manifest.tmp: $!"; - - - # Create a bzipped manifest. - unless (defined $noCompress) { - system("$Nix::Config::bzip2 < $manifest > $manifest.bz2.tmp") == 0 - or die "cannot compress manifest"; - - rename("$manifest.bz2.tmp", "$manifest.bz2") - or die "cannot rename $manifest.bz2.tmp: $!"; - } -} - - -sub updateManifestDB { - my $manifestDir = $Nix::Config::manifestDir; - - my @manifests = glob "$manifestDir/*.nixmanifest"; - return undef if scalar @manifests == 0; - - mkpath($manifestDir); - - unlink "$manifestDir/cache.sqlite"; # remove obsolete cache - my $dbPath = "$manifestDir/cache-v2.sqlite"; - - # Open/create the database. - our $dbh = DBI->connect("dbi:SQLite:dbname=$dbPath", "", "") - or die "cannot open database `$dbPath'"; - $dbh->{RaiseError} = 1; - $dbh->{PrintError} = 0; - - $dbh->do("pragma foreign_keys = on"); - $dbh->do("pragma synchronous = off"); # we can always reproduce the cache - $dbh->do("pragma journal_mode = truncate"); - - # Initialise the database schema, if necessary. - $dbh->do(<do(<do("create index if not exists NARs_storePath on NARs(storePath)"); - - $dbh->do(<do("create index if not exists Patches_storePath on Patches(storePath)"); - - # Acquire an exclusive lock to ensure that only one process - # updates the DB at the same time. This isn't really necessary, - # but it prevents work duplication and lock contention in SQLite. - my $lockFile = "$manifestDir/cache.lock"; - open MAINLOCK, ">>$lockFile" or die "unable to acquire lock ‘$lockFile’: $!\n"; - flock(MAINLOCK, LOCK_EX) or die; - - our $insertNAR = $dbh->prepare( - "insert into NARs(manifest, storePath, url, compressionType, hash, size, narHash, " . - "narSize, refs, deriver, system) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") or die; - - our $insertPatch = $dbh->prepare( - "insert into Patches(manifest, storePath, basePath, baseHash, url, hash, " . - "size, narHash, narSize, patchType) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); - - $dbh->begin_work; - - # Read each manifest in $manifestDir and add it to the database, - # unless we've already done so on a previous run. - my %seen; - - for my $manifestLink (@manifests) { - my $manifest = Cwd::abs_path($manifestLink); - next unless -f $manifest; - my $timestamp = lstat($manifest)->mtime; - $seen{$manifest} = 1; - - next if scalar @{$dbh->selectcol_arrayref( - "select 1 from Manifests where path = ? and timestamp = ?", - {}, $manifest, $timestamp)} == 1; - - print STDERR "caching $manifest...\n"; - - $dbh->do("delete from Manifests where path = ?", {}, $manifest); - - $dbh->do("insert into Manifests(path, timestamp) values (?, ?)", - {}, $manifest, $timestamp); - - our $id = $dbh->last_insert_id("", "", "", ""); - - sub addNARToDB { - my ($storePath, $narFile) = @_; - $insertNAR->execute( - $id, $storePath, $narFile->{url}, $narFile->{compressionType}, $narFile->{hash}, - $narFile->{size}, $narFile->{narHash}, $narFile->{narSize}, $narFile->{references}, - $narFile->{deriver}, $narFile->{system}); - }; - - sub addPatchToDB { - my ($storePath, $patch) = @_; - $insertPatch->execute( - $id, $storePath, $patch->{basePath}, $patch->{baseHash}, $patch->{url}, - $patch->{hash}, $patch->{size}, $patch->{narHash}, $patch->{narSize}, - $patch->{patchType}); - }; - - my $version = readManifest_($manifest, \&addNARToDB, \&addPatchToDB); - - if ($version < 3) { - die "you have an old-style or corrupt manifest `$manifestLink'; please delete it\n"; - } - if ($version >= 10) { - die "manifest `$manifestLink' is too new; please delete it or upgrade Nix\n"; - } - } - - # Removed cached information for removed manifests from the DB. - foreach my $manifest (@{$dbh->selectcol_arrayref("select path from Manifests")}) { - next if defined $seen{$manifest}; - $dbh->do("delete from Manifests where path = ?", {}, $manifest); - } - - $dbh->commit; - - close MAINLOCK; - - return $dbh; -} - - - -# Delete all old manifests downloaded from a given URL. -sub deleteOldManifests { - my ($url, $curUrlFile) = @_; - for my $urlFile (glob "$Nix::Config::manifestDir/*.url") { - next if defined $curUrlFile && $urlFile eq $curUrlFile; - open URL, "<$urlFile" or die; - my $url2 = ; - chomp $url2; - close URL; - next unless $url eq $url2; - my $base = $urlFile; $base =~ s/.url$//; - unlink "${base}.url"; - unlink "${base}.nixmanifest"; - } -} - - -# Parse a NAR info file. -sub parseNARInfo { - my ($storePath, $content, $requireValidSig, $location) = @_; - - my ($storePath2, $url, $fileHash, $fileSize, $narHash, $narSize, $deriver, $system, $sig); - my $signedData = ""; - my $compression = "bzip2"; - my @refs; - - foreach my $line (split "\n", $content) { - return undef unless $line =~ /^(.*): (.*)$/; - if ($1 eq "StorePath") { $storePath2 = $2; } - elsif ($1 eq "URL") { $url = $2; } - elsif ($1 eq "Compression") { $compression = $2; } - elsif ($1 eq "FileHash") { $fileHash = $2; } - elsif ($1 eq "FileSize") { $fileSize = int($2); } - elsif ($1 eq "NarHash") { $narHash = $2; } - elsif ($1 eq "NarSize") { $narSize = int($2); } - elsif ($1 eq "References") { @refs = split / /, $2; } - elsif ($1 eq "Deriver") { $deriver = $2; } - elsif ($1 eq "System") { $system = $2; } - elsif ($1 eq "Signature") { $sig = $2; last; } - $signedData .= "$line\n"; - } - - return undef if $storePath ne $storePath2 || !defined $url || !defined $narHash; - - my $res = - { url => $url - , compression => $compression - , fileHash => $fileHash - , fileSize => $fileSize - , narHash => $narHash - , narSize => $narSize - , refs => [ @refs ] - , deriver => $deriver - , system => $system - }; - - if ($requireValidSig) { - if (!defined $sig) { - warn "NAR info file `$location' lacks a signature; ignoring\n"; - return undef; - } - my ($sigVersion, $keyName, $sig64) = split ";", $sig; - $sigVersion //= 0; - if ($sigVersion != 1) { - warn "NAR info file `$location' has unsupported version $sigVersion; ignoring\n"; - return undef; - } - return undef unless defined $keyName && defined $sig64; - my $publicKeyFile = $Nix::Config::config{"binary-cache-public-key-$keyName"}; - if (!defined $publicKeyFile) { - warn "NAR info file `$location' is signed by unknown key `$keyName'; ignoring\n"; - return undef; - } - if (! -f $publicKeyFile) { - die "binary cache public key file `$publicKeyFile' does not exist\n"; - return undef; - } - if (!isValidSignature($publicKeyFile, $sig64, $signedData)) { - warn "NAR info file `$location' has an invalid signature; ignoring\n"; - return undef; - } - $res->{signedBy} = $keyName; - } - - return $res; -} - - -return 1; diff --git a/perl/lib/Nix/SSH.pm b/perl/lib/Nix/SSH.pm deleted file mode 100644 index 584c445009..0000000000 --- a/perl/lib/Nix/SSH.pm +++ /dev/null @@ -1,53 +0,0 @@ -use strict; -use File::Temp qw(tempdir); - -our @sshOpts = split ' ', ($ENV{"NIX_SSHOPTS"} or ""); - -push @sshOpts, "-x"; - -my $sshStarted = 0; -my $sshHost; - -# Open a master SSH connection to `host', unless there already is a -# running master connection (as determined by `-O check'). -sub openSSHConnection { - my ($host) = @_; - die if $sshStarted; - $sshHost = $host; - return 1 if system("ssh $sshHost @sshOpts -O check 2> /dev/null") == 0; - - my $tmpDir = tempdir("nix-ssh.XXXXXX", CLEANUP => 1, TMPDIR => 1) - or die "cannot create a temporary directory"; - - push @sshOpts, "-S", "$tmpDir/control"; - - # Start the master. We can't use the `-f' flag (fork into - # background after establishing the connection) because then the - # child continues to run if we are killed. So instead make SSH - # print "started" when it has established the connection, and wait - # until we see that. - open SSHPIPE, "ssh $sshHost @sshOpts -M -N -o LocalCommand='echo started' -o PermitLocalCommand=yes |" or die; - - while () { - chomp; - if ($_ eq "started") { - $sshStarted = 1; - return 1; - } - } - - return 0; -} - -# Tell the master SSH client to exit. -sub closeSSHConnection { - if ($sshStarted) { - system("ssh $sshHost @sshOpts -O exit 2> /dev/null") == 0 - or warn "unable to stop SSH master: $?"; - $sshStarted = 0; - } -} - -END { my $saved = $?; closeSSHConnection; $? = $saved; } - -return 1; diff --git a/perl/lib/Nix/Store.pm b/perl/lib/Nix/Store.pm deleted file mode 100644 index 191116ee56..0000000000 --- a/perl/lib/Nix/Store.pm +++ /dev/null @@ -1,92 +0,0 @@ -package Nix::Store; - -use strict; -use warnings; -use Nix::Config; - -require Exporter; - -our @ISA = qw(Exporter); - -our %EXPORT_TAGS = ( 'all' => [ qw( ) ] ); - -our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); - -our @EXPORT = qw( - isValidPath queryReferences queryPathInfo queryDeriver queryPathHash - queryPathFromHashPart - topoSortPaths computeFSClosure followLinksToStorePath exportPaths - hashPath hashFile hashString - addToStore makeFixedOutputPath - derivationFromPath -); - -our $VERSION = '0.15'; - -sub backtick { - open(RES, "-|", @_) or die; - local $/; - my $res = || ""; - close RES or die; - return $res; -} - -if ($Nix::Config::useBindings) { - require XSLoader; - XSLoader::load('Nix::Store', $VERSION); -} else { - - # Provide slow fallbacks of some functions on platforms that don't - # support the Perl bindings. - - use File::Temp; - use Fcntl qw/F_SETFD/; - - *hashFile = sub { - my ($algo, $base32, $path) = @_; - my $res = backtick("$Nix::Config::binDir/nix-hash", "--flat", $path, "--type", $algo, $base32 ? "--base32" : ()); - chomp $res; - return $res; - }; - - *hashPath = sub { - my ($algo, $base32, $path) = @_; - my $res = backtick("$Nix::Config::binDir/nix-hash", $path, "--type", $algo, $base32 ? "--base32" : ()); - chomp $res; - return $res; - }; - - *hashString = sub { - my ($algo, $base32, $s) = @_; - my $fh = File::Temp->new(); - print $fh $s; - my $res = backtick("$Nix::Config::binDir/nix-hash", $fh->filename, "--type", $algo, $base32 ? "--base32" : ()); - chomp $res; - return $res; - }; - - *addToStore = sub { - my ($srcPath, $recursive, $algo) = @_; - die "not implemented" if $recursive || $algo ne "sha256"; - my $res = backtick("$Nix::Config::binDir/nix-store", "--add", $srcPath); - chomp $res; - return $res; - }; - - *isValidPath = sub { - my ($path) = @_; - my $res = backtick("$Nix::Config::binDir/nix-store", "--check-validity", "--print-invalid", $path); - chomp $res; - return $res ne $path; - }; - - *queryPathHash = sub { - my ($path) = @_; - my $res = backtick("$Nix::Config::binDir/nix-store", "--query", "--hash", $path); - chomp $res; - return $res; - }; -} - -1; -__END__ diff --git a/perl/lib/Nix/Store.xs b/perl/lib/Nix/Store.xs deleted file mode 100644 index 07ccebe62f..0000000000 --- a/perl/lib/Nix/Store.xs +++ /dev/null @@ -1,281 +0,0 @@ -#include "EXTERN.h" -#include "perl.h" -#include "XSUB.h" - -/* Prevent a clash between some Perl and libstdc++ macros. */ -#undef do_open -#undef do_close - -#include -#include -#include -#include - - -using namespace nix; - - -void doInit() -{ - if (!store) { - try { - settings.processEnvironment(); - settings.loadConfFile(); - settings.update(); - settings.lockCPU = false; - store = openStore(); - } catch (Error & e) { - croak(e.what()); - } - } -} - - -MODULE = Nix::Store PACKAGE = Nix::Store -PROTOTYPES: ENABLE - - -#undef dNOOP // Hack to work around "error: declaration of 'Perl___notused' has a different language linkage" error message on clang. -#define dNOOP - - -void init() - CODE: - doInit(); - - -int isValidPath(char * path) - CODE: - try { - doInit(); - RETVAL = store->isValidPath(path); - } catch (Error & e) { - croak(e.what()); - } - OUTPUT: - RETVAL - - -SV * queryReferences(char * path) - PPCODE: - try { - doInit(); - PathSet paths; - store->queryReferences(path, paths); - for (PathSet::iterator i = paths.begin(); i != paths.end(); ++i) - XPUSHs(sv_2mortal(newSVpv(i->c_str(), 0))); - } catch (Error & e) { - croak(e.what()); - } - - -SV * queryPathHash(char * path) - PPCODE: - try { - doInit(); - Hash hash = store->queryPathHash(path); - string s = "sha256:" + printHash32(hash); - XPUSHs(sv_2mortal(newSVpv(s.c_str(), 0))); - } catch (Error & e) { - croak(e.what()); - } - - -SV * queryDeriver(char * path) - PPCODE: - try { - doInit(); - Path deriver = store->queryDeriver(path); - if (deriver == "") XSRETURN_UNDEF; - XPUSHs(sv_2mortal(newSVpv(deriver.c_str(), 0))); - } catch (Error & e) { - croak(e.what()); - } - - -SV * queryPathInfo(char * path, int base32) - PPCODE: - try { - doInit(); - ValidPathInfo info = store->queryPathInfo(path); - if (info.deriver == "") - XPUSHs(&PL_sv_undef); - else - XPUSHs(sv_2mortal(newSVpv(info.deriver.c_str(), 0))); - string s = "sha256:" + (base32 ? printHash32(info.hash) : printHash(info.hash)); - XPUSHs(sv_2mortal(newSVpv(s.c_str(), 0))); - mXPUSHi(info.registrationTime); - mXPUSHi(info.narSize); - AV * arr = newAV(); - for (PathSet::iterator i = info.references.begin(); i != info.references.end(); ++i) - av_push(arr, newSVpv(i->c_str(), 0)); - XPUSHs(sv_2mortal(newRV((SV *) arr))); - } catch (Error & e) { - croak(e.what()); - } - - -SV * queryPathFromHashPart(char * hashPart) - PPCODE: - try { - doInit(); - Path path = store->queryPathFromHashPart(hashPart); - XPUSHs(sv_2mortal(newSVpv(path.c_str(), 0))); - } catch (Error & e) { - croak(e.what()); - } - - -SV * computeFSClosure(int flipDirection, int includeOutputs, ...) - PPCODE: - try { - doInit(); - PathSet paths; - for (int n = 2; n < items; ++n) - computeFSClosure(*store, SvPV_nolen(ST(n)), paths, flipDirection, includeOutputs); - for (PathSet::iterator i = paths.begin(); i != paths.end(); ++i) - XPUSHs(sv_2mortal(newSVpv(i->c_str(), 0))); - } catch (Error & e) { - croak(e.what()); - } - - -SV * topoSortPaths(...) - PPCODE: - try { - doInit(); - PathSet paths; - for (int n = 0; n < items; ++n) paths.insert(SvPV_nolen(ST(n))); - Paths sorted = topoSortPaths(*store, paths); - for (Paths::iterator i = sorted.begin(); i != sorted.end(); ++i) - XPUSHs(sv_2mortal(newSVpv(i->c_str(), 0))); - } catch (Error & e) { - croak(e.what()); - } - - -SV * followLinksToStorePath(char * path) - CODE: - try { - doInit(); - RETVAL = newSVpv(followLinksToStorePath(path).c_str(), 0); - } catch (Error & e) { - croak(e.what()); - } - OUTPUT: - RETVAL - - -void exportPaths(int fd, int sign, ...) - PPCODE: - try { - doInit(); - Paths paths; - for (int n = 2; n < items; ++n) paths.push_back(SvPV_nolen(ST(n))); - FdSink sink(fd); - exportPaths(*store, paths, sign, sink); - } catch (Error & e) { - croak(e.what()); - } - - -SV * hashPath(char * algo, int base32, char * path) - PPCODE: - try { - Hash h = hashPath(parseHashType(algo), path).first; - string s = base32 ? printHash32(h) : printHash(h); - XPUSHs(sv_2mortal(newSVpv(s.c_str(), 0))); - } catch (Error & e) { - croak(e.what()); - } - - -SV * hashFile(char * algo, int base32, char * path) - PPCODE: - try { - Hash h = hashFile(parseHashType(algo), path); - string s = base32 ? printHash32(h) : printHash(h); - XPUSHs(sv_2mortal(newSVpv(s.c_str(), 0))); - } catch (Error & e) { - croak(e.what()); - } - - -SV * hashString(char * algo, int base32, char * s) - PPCODE: - try { - Hash h = hashString(parseHashType(algo), s); - string s = base32 ? printHash32(h) : printHash(h); - XPUSHs(sv_2mortal(newSVpv(s.c_str(), 0))); - } catch (Error & e) { - croak(e.what()); - } - - -SV * addToStore(char * srcPath, int recursive, char * algo) - PPCODE: - try { - doInit(); - Path path = store->addToStore(srcPath, recursive, parseHashType(algo)); - XPUSHs(sv_2mortal(newSVpv(path.c_str(), 0))); - } catch (Error & e) { - croak(e.what()); - } - - -SV * makeFixedOutputPath(int recursive, char * algo, char * hash, char * name) - PPCODE: - try { - doInit(); - HashType ht = parseHashType(algo); - Path path = makeFixedOutputPath(recursive, ht, - parseHash16or32(ht, hash), name); - XPUSHs(sv_2mortal(newSVpv(path.c_str(), 0))); - } catch (Error & e) { - croak(e.what()); - } - - -SV * derivationFromPath(char * drvPath) - PREINIT: - HV *hash; - CODE: - try { - doInit(); - Derivation drv = derivationFromPath(*store, drvPath); - hash = newHV(); - - HV * outputs = newHV(); - for (DerivationOutputs::iterator i = drv.outputs.begin(); i != drv.outputs.end(); ++i) - hv_store(outputs, i->first.c_str(), i->first.size(), newSVpv(i->second.path.c_str(), 0), 0); - hv_stores(hash, "outputs", newRV((SV *) outputs)); - - AV * inputDrvs = newAV(); - for (DerivationInputs::iterator i = drv.inputDrvs.begin(); i != drv.inputDrvs.end(); ++i) - av_push(inputDrvs, newSVpv(i->first.c_str(), 0)); // !!! ignores i->second - hv_stores(hash, "inputDrvs", newRV((SV *) inputDrvs)); - - AV * inputSrcs = newAV(); - for (PathSet::iterator i = drv.inputSrcs.begin(); i != drv.inputSrcs.end(); ++i) - av_push(inputSrcs, newSVpv(i->c_str(), 0)); - hv_stores(hash, "inputSrcs", newRV((SV *) inputSrcs)); - - hv_stores(hash, "platform", newSVpv(drv.platform.c_str(), 0)); - hv_stores(hash, "builder", newSVpv(drv.builder.c_str(), 0)); - - AV * args = newAV(); - for (Strings::iterator i = drv.args.begin(); i != drv.args.end(); ++i) - av_push(args, newSVpv(i->c_str(), 0)); - hv_stores(hash, "args", newRV((SV *) args)); - - HV * env = newHV(); - for (StringPairs::iterator i = drv.env.begin(); i != drv.env.end(); ++i) - hv_store(env, i->first.c_str(), i->first.size(), newSVpv(i->second.c_str(), 0), 0); - hv_stores(hash, "env", newRV((SV *) env)); - - RETVAL = newRV_noinc((SV *)hash); - } catch (Error & e) { - croak(e.what()); - } - OUTPUT: - RETVAL diff --git a/perl/lib/Nix/Utils.pm b/perl/lib/Nix/Utils.pm deleted file mode 100644 index 78d3db5427..0000000000 --- a/perl/lib/Nix/Utils.pm +++ /dev/null @@ -1,38 +0,0 @@ -package Nix::Utils; - -our @ISA = qw(Exporter); -our @EXPORT = qw(checkURL uniq writeFile readFile); - -$urlRE = "(?: [a-zA-Z][a-zA-Z0-9\+\-\.]*\:[a-zA-Z0-9\%\/\?\:\@\&\=\+\$\,\-\_\.\!\~\*]+ )"; - -sub checkURL { - my ($url) = @_; - die "invalid URL ‘$url’\n" unless $url =~ /^ $urlRE $ /x; -} - -sub uniq { - my %seen; - my @res; - foreach my $name (@_) { - next if $seen{$name}; - $seen{$name} = 1; - push @res, $name; - } - return @res; -} - -sub writeFile { - my ($fn, $s) = @_; - open TMP, ">$fn" or die "cannot create file `$fn': $!"; - print TMP "$s" or die; - close TMP or die; -} - -sub readFile { - local $/ = undef; - my ($fn) = @_; - open TMP, "<$fn" or die "cannot open file `$fn': $!"; - my $s = ; - close TMP or die; - return $s; -} diff --git a/perl/local.mk b/perl/local.mk deleted file mode 100644 index 74c054e713..0000000000 --- a/perl/local.mk +++ /dev/null @@ -1,40 +0,0 @@ -nix_perl_sources := \ - $(d)/lib/Nix/Store.pm \ - $(d)/lib/Nix/Manifest.pm \ - $(d)/lib/Nix/GeneratePatches.pm \ - $(d)/lib/Nix/SSH.pm \ - $(d)/lib/Nix/CopyClosure.pm \ - $(d)/lib/Nix/Config.pm.in \ - $(d)/lib/Nix/Utils.pm \ - $(d)/lib/Nix/Crypto.pm - -nix_perl_modules := $(nix_perl_sources:.in=) - -$(foreach x, $(nix_perl_modules), $(eval $(call install-data-in, $(x), $(perllibdir)/Nix))) - -ifeq ($(perlbindings), yes) - - $(d)/lib/Nix/Store.cc: $(d)/lib/Nix/Store.xs - $(trace-gen) xsubpp $^ -output $@ - - libraries += Store - - Store_DIR := $(d)/lib/Nix - - Store_SOURCES := $(Store_DIR)/Store.cc - - Store_LIBS = libstore - - Store_CXXFLAGS = \ - -I$(shell $(perl) -e 'use Config; print $$Config{archlibexp};')/CORE \ - -D_FILE_OFFSET_BITS=64 - - Store_ALLOW_UNDEFINED = 1 - - Store_FORCE_INSTALL = 1 - - Store_INSTALL_DIR = $(perllibdir)/auto/Nix/Store - -endif - -clean-files += $(d)/lib/Nix/Config.pm $(d)/lib/Nix/Store.cc diff --git a/release.nix b/release.nix deleted file mode 100644 index 285b8fb4f4..0000000000 --- a/release.nix +++ /dev/null @@ -1,291 +0,0 @@ -{ nix ? { outPath = ./.; revCount = 1234; shortRev = "abcdef"; } -, officialRelease ? false -}: - -let - - pkgs = import {}; - - systems = [ "x86_64-linux" "i686-linux" "x86_64-darwin" /* "x86_64-freebsd" "i686-freebsd" */ ]; - - - jobs = rec { - - - tarball = - with pkgs; - - releaseTools.sourceTarball { - name = "nix-tarball"; - version = builtins.readFile ./version; - versionSuffix = if officialRelease then "" else "pre${toString nix.revCount}_${nix.shortRev}"; - src = nix; - inherit officialRelease; - - buildInputs = - [ curl bison flex perl libxml2 libxslt w3m bzip2 - tetex dblatex nukeReferences pkgconfig sqlite git - ]; - - configureFlags = '' - --with-docbook-rng=${docbook5}/xml/rng/docbook - --with-docbook-xsl=${docbook5_xsl}/xml/xsl/docbook - --with-dbi=${perlPackages.DBI}/${perl.libPrefix} - --with-dbd-sqlite=${perlPackages.DBDSQLite}/${perl.libPrefix} - --with-www-curl=${perlPackages.WWWCurl}/${perl.libPrefix} - ''; - - postUnpack = '' - # Clean up when building from a working tree. - (cd $sourceRoot && (git ls-files -o | xargs -r rm -v)) - ''; - - preConfigure = '' - # TeX needs a writable font cache. - export VARTEXFONTS=$TMPDIR/texfonts - ''; - - distPhase = - '' - runHook preDist - make dist - mkdir -p $out/tarballs - cp *.tar.* $out/tarballs - ''; - - preDist = '' - make install docdir=$out/share/doc/nix makefiles=doc/manual/local.mk - - make doc/manual/manual.pdf - cp doc/manual/manual.pdf $out/manual.pdf - - # The PDF containes filenames of included graphics (see - # http://www.tug.org/pipermail/pdftex/2007-August/007290.html). - # This causes a retained dependency on dblatex, which Hydra - # doesn't like (the output of the tarball job is distributed - # to Windows and Macs, so there should be no Linux binaries - # in the closure). - nuke-refs $out/manual.pdf - - echo "doc manual $out/share/doc/nix/manual" >> $out/nix-support/hydra-build-products - echo "doc-pdf manual $out/manual.pdf" >> $out/nix-support/hydra-build-products - echo "doc release-notes $out/share/doc/nix/manual release-notes.html" >> $out/nix-support/hydra-build-products - ''; - }; - - - build = pkgs.lib.genAttrs systems (system: - - with import { inherit system; }; - - releaseTools.nixBuild { - name = "nix"; - src = tarball; - - buildInputs = [ curl perl bzip2 openssl pkgconfig sqlite boehmgc ]; - - configureFlags = '' - --disable-init-state - --with-dbi=${perlPackages.DBI}/${perl.libPrefix} - --with-dbd-sqlite=${perlPackages.DBDSQLite}/${perl.libPrefix} - --with-www-curl=${perlPackages.WWWCurl}/${perl.libPrefix} - --enable-gc - --sysconfdir=/etc - ''; - - enableParallelBuilding = true; - - makeFlags = "profiledir=$(out)/etc/profile.d"; - - preBuild = "unset NIX_INDENT_MAKE"; - - installFlags = "sysconfdir=$(out)/etc"; - - doInstallCheck = true; - installCheckFlags = "sysconfdir=$(out)/etc"; - }); - - - binaryTarball = pkgs.lib.genAttrs systems (system: - - with import { inherit system; }; - - let - toplevel = builtins.getAttr system jobs.build; - version = toplevel.src.version; - in - - runCommand "nix-binary-tarball-${version}" - { exportReferencesGraph = [ "closure" toplevel ]; - buildInputs = [ perl ]; - meta.description = "Distribution-independent Nix bootstrap binaries for ${system}"; - } - '' - storePaths=$(perl ${pathsFromGraph} ./closure) - printRegistration=1 perl ${pathsFromGraph} ./closure > $TMPDIR/reginfo - substitute ${./scripts/install-nix-from-closure.sh} $TMPDIR/install \ - --subst-var-by nix ${toplevel} - chmod +x $TMPDIR/install - dir=nix-${version}-${system} - fn=$out/$dir.tar.bz2 - mkdir -p $out/nix-support - echo "file binary-dist $fn" >> $out/nix-support/hydra-build-products - tar cvfj $fn \ - --owner=0 --group=0 --mode=u+rw,uga+r \ - --absolute-names \ - --hard-dereference \ - --transform "s,$TMPDIR/install,$dir/install," \ - --transform "s,$TMPDIR/reginfo,$dir/.reginfo," \ - --transform "s,$NIX_STORE,$dir/store,S" \ - $TMPDIR/install $TMPDIR/reginfo $storePaths - ''); - - - coverage = - with import { system = "x86_64-linux"; }; - - releaseTools.coverageAnalysis { - name = "nix-build"; - src = tarball; - - buildInputs = - [ curl perl bzip2 openssl pkgconfig sqlite - # These are for "make check" only: - graphviz libxml2 libxslt - ]; - - configureFlags = '' - --disable-init-state - --with-dbi=${perlPackages.DBI}/${perl.libPrefix} - --with-dbd-sqlite=${perlPackages.DBDSQLite}/${perl.libPrefix} - --with-www-curl=${perlPackages.WWWCurl}/${perl.libPrefix} - ''; - - dontInstall = false; - - doInstallCheck = true; - - lcovFilter = [ "*/boost/*" "*-tab.*" ]; - - # We call `dot', and even though we just use it to - # syntax-check generated dot files, it still requires some - # fonts. So provide those. - FONTCONFIG_FILE = texFunctions.fontsConf; - }; - - - rpm_fedora16i386 = makeRPM_i686 (diskImageFuns: diskImageFuns.fedora16i386) 50; - rpm_fedora16x86_64 = makeRPM_x86_64 (diskImageFunsFun: diskImageFunsFun.fedora16x86_64) 50; - rpm_fedora18i386 = makeRPM_i686 (diskImageFuns: diskImageFuns.fedora18i386) 60; - rpm_fedora18x86_64 = makeRPM_x86_64 (diskImageFunsFun: diskImageFunsFun.fedora18x86_64) 60; - rpm_fedora19i386 = makeRPM_i686 (diskImageFuns: diskImageFuns.fedora19i386) 70; - rpm_fedora19x86_64 = makeRPM_x86_64 (diskImageFunsFun: diskImageFunsFun.fedora19x86_64) 70; - rpm_fedora20i386 = makeRPM_i686 (diskImageFuns: diskImageFuns.fedora20i386) 70; - rpm_fedora20x86_64 = makeRPM_x86_64 (diskImageFunsFun: diskImageFunsFun.fedora20x86_64) 70; - - - #deb_debian60i386 = makeDeb_i686 (diskImageFuns: diskImageFuns.debian60i386) 50; - #deb_debian60x86_64 = makeDeb_x86_64 (diskImageFunsFun: diskImageFunsFun.debian60x86_64) 50; - deb_debian7i386 = makeDeb_i686 (diskImageFuns: diskImageFuns.debian7i386) 60; - deb_debian7x86_64 = makeDeb_x86_64 (diskImageFunsFun: diskImageFunsFun.debian7x86_64) 60; - - deb_ubuntu1010i386 = makeDeb_i686 (diskImageFuns: diskImageFuns.ubuntu1010i386) 50; - deb_ubuntu1010x86_64 = makeDeb_x86_64 (diskImageFuns: diskImageFuns.ubuntu1010x86_64) 50; - deb_ubuntu1110i386 = makeDeb_i686 (diskImageFuns: diskImageFuns.ubuntu1110i386) 60; - deb_ubuntu1110x86_64 = makeDeb_x86_64 (diskImageFuns: diskImageFuns.ubuntu1110x86_64) 60; - deb_ubuntu1204i386 = makeDeb_i686 (diskImageFuns: diskImageFuns.ubuntu1204i386) 60; - deb_ubuntu1204x86_64 = makeDeb_x86_64 (diskImageFuns: diskImageFuns.ubuntu1204x86_64) 60; - deb_ubuntu1210i386 = makeDeb_i686 (diskImageFuns: diskImageFuns.ubuntu1210i386) 70; - deb_ubuntu1210x86_64 = makeDeb_x86_64 (diskImageFuns: diskImageFuns.ubuntu1210x86_64) 70; - deb_ubuntu1304i386 = makeDeb_i686 (diskImageFuns: diskImageFuns.ubuntu1304i386) 80; - deb_ubuntu1304x86_64 = makeDeb_x86_64 (diskImageFuns: diskImageFuns.ubuntu1304x86_64) 80; - deb_ubuntu1310i386 = makeDeb_i686 (diskImageFuns: diskImageFuns.ubuntu1310i386) 90; - deb_ubuntu1310x86_64 = makeDeb_x86_64 (diskImageFuns: diskImageFuns.ubuntu1310x86_64) 90; - - - # System tests. - tests.remote_builds = (import ./tests/remote-builds.nix rec { - nix = build.x86_64-linux; system = "x86_64-linux"; - }).test; - - tests.nix_copy_closure = (import ./tests/nix-copy-closure.nix rec { - nix = build.x86_64-linux; system = "x86_64-linux"; - }).test; - - - # Aggregate job containing the release-critical jobs. - release = pkgs.releaseTools.aggregate { - name = "nix-${tarball.version}"; - meta.description = "Release-critical builds"; - constituents = - [ tarball - #build.i686-freebsd - build.i686-linux - build.x86_64-darwin - #build.x86_64-freebsd - build.x86_64-linux - #binaryTarball.i686-freebsd - binaryTarball.i686-linux - binaryTarball.x86_64-darwin - #binaryTarball.x86_64-freebsd - binaryTarball.x86_64-linux - deb_debian7i386 - deb_debian7x86_64 - deb_ubuntu1304i386 - deb_ubuntu1304x86_64 - deb_ubuntu1310i386 - deb_ubuntu1310x86_64 - rpm_fedora19i386 - rpm_fedora19x86_64 - rpm_fedora20i386 - rpm_fedora20x86_64 - tests.remote_builds - tests.nix_copy_closure - ]; - }; - - }; - - - makeRPM_i686 = makeRPM "i686-linux"; - makeRPM_x86_64 = makeRPM "x86_64-linux"; - - makeRPM = - system: diskImageFun: prio: - - with import { inherit system; }; - - releaseTools.rpmBuild rec { - name = "nix-rpm"; - src = jobs.tarball; - diskImage = (diskImageFun vmTools.diskImageFuns) - { extraPackages = [ "perl-DBD-SQLite" "perl-devel" "sqlite" "sqlite-devel" "bzip2-devel" "emacs" "perl-WWW-Curl" ]; }; - memSize = 1024; - meta.schedulingPriority = prio; - postRPMInstall = "cd /tmp/rpmout/BUILD/nix-* && make installcheck"; - }; - - - makeDeb_i686 = makeDeb "i686-linux"; - makeDeb_x86_64 = makeDeb "x86_64-linux"; - - makeDeb = - system: diskImageFun: prio: - - with import { inherit system; }; - - releaseTools.debBuild { - name = "nix-deb"; - src = jobs.tarball; - diskImage = (diskImageFun vmTools.diskImageFuns) - { extraPackages = [ "libdbd-sqlite3-perl" "libsqlite3-dev" "libbz2-dev" "libwww-curl-perl" ]; }; - memSize = 1024; - meta.schedulingPriority = prio; - configureFlags = "--sysconfdir=/etc"; - debRequires = [ "curl" "libdbd-sqlite3-perl" "libsqlite3-0" "libbz2-1.0" "bzip2" "xz-utils" "libwww-curl-perl" ]; - debMaintainer = "Eelco Dolstra "; - doInstallCheck = true; - }; - - -in jobs diff --git a/scripts/build-remote.pl.in b/scripts/build-remote.pl.in deleted file mode 100755 index 6dfa16d5cb..0000000000 --- a/scripts/build-remote.pl.in +++ /dev/null @@ -1,302 +0,0 @@ -#! @perl@ -w @perlFlags@ - -use Fcntl qw(:DEFAULT :flock); -use English '-no_match_vars'; -use IO::Handle; -use Nix::Config; -use Nix::SSH qw/sshOpts openSSHConnection/; -use Nix::CopyClosure; -use Nix::Store; -no warnings('once'); - - -# General operation: -# -# Try to find a free machine of type $neededSystem. We do this as -# follows: -# - We acquire an exclusive lock on $currentLoad/main-lock. -# - For each machine $machine of type $neededSystem and for each $slot -# less than the maximum load for that machine, we try to get an -# exclusive lock on $currentLoad/$machine-$slot (without blocking). -# If we get such a lock, we send "accept" to the caller. Otherwise, -# we send "postpone" and exit. -# - We release the exclusive lock on $currentLoad/main-lock. -# - We perform the build on $neededSystem. -# - We release the exclusive lock on $currentLoad/$machine-$slot. -# -# The nice thing about this scheme is that if we die prematurely, the -# locks are released automatically. - - -# Make sure that we don't get any SSH passphrase or host key popups - -# if there is any problem it should fail, not do something -# interactive. -$ENV{"DISPLAY"} = ""; -$ENV{"SSH_ASKPASS"} = ""; - - -sub sendReply { - my $reply = shift; - print STDERR "# $reply\n"; -} - -sub all { $_ || return 0 for @_; 1 } - - -# Initialisation. -my $loadIncreased = 0; - -my ($localSystem, $maxSilentTime, $printBuildTrace, $buildTimeout) = @ARGV; - -my $currentLoad = $ENV{"NIX_CURRENT_LOAD"}; -my $conf = $ENV{"NIX_REMOTE_SYSTEMS"}; - - -sub openSlotLock { - my ($machine, $slot) = @_; - my $slotLockFn = "$currentLoad/" . (join '+', @{$machine->{systemTypes}}) . "-" . $machine->{hostName} . "-$slot"; - my $slotLock = new IO::Handle; - sysopen $slotLock, "$slotLockFn", O_RDWR|O_CREAT, 0600 or die; - return $slotLock; -} - - -# Read the list of machines. -my @machines; -if (defined $conf && -e $conf) { - open CONF, "<$conf" or die; - while () { - chomp; - s/\#.*$//g; - next if /^\s*$/; - my @tokens = split /\s/, $_; - my @supportedFeatures = split(/,/, $tokens[5] || ""); - my @mandatoryFeatures = split(/,/, $tokens[6] || ""); - push @machines, - { hostName => $tokens[0] - , systemTypes => [ split(/,/, $tokens[1]) ] - , sshKeys => $tokens[2] - , maxJobs => int($tokens[3]) - , speedFactor => 1.0 * (defined $tokens[4] ? int($tokens[4]) : 1) - , supportedFeatures => [ @supportedFeatures, @mandatoryFeatures ] - , mandatoryFeatures => [ @mandatoryFeatures ] - , enabled => 1 - }; - } - close CONF; -} - - - -# Wait for the calling process to ask us whether we can build some derivation. -my ($drvPath, $hostName, $slotLock); - -REQ: while (1) { - $_ = || exit 0; - (my $amWilling, my $neededSystem, $drvPath, my $requiredFeatures) = split; - my @requiredFeatures = split /,/, $requiredFeatures; - - my $canBuildLocally = $amWilling && ($localSystem eq $neededSystem); - - if (!defined $currentLoad) { - sendReply "decline"; - next; - } - - # Acquire the exclusive lock on $currentLoad/main-lock. - mkdir $currentLoad, 0777 or die unless -d $currentLoad; - my $mainLock = "$currentLoad/main-lock"; - sysopen MAINLOCK, "$mainLock", O_RDWR|O_CREAT, 0600 or die; - flock(MAINLOCK, LOCK_EX) or die; - - - while (1) { - # Find all machine that can execute this build, i.e., that - # support builds for the given platform and features, and are - # not at their job limit. - my $rightType = 0; - my @available = (); - LOOP: foreach my $cur (@machines) { - if ($cur->{enabled} - && (grep { $neededSystem eq $_ } @{$cur->{systemTypes}}) - && all(map { my $f = $_; 0 != grep { $f eq $_ } @{$cur->{supportedFeatures}} } (@requiredFeatures, @mandatoryFeatures)) - && all(map { my $f = $_; 0 != grep { $f eq $_ } @requiredFeatures } @{$cur->{mandatoryFeatures}}) - ) - { - $rightType = 1; - - # We have a machine of the right type. Determine the load on - # the machine. - my $slot = 0; - my $load = 0; - my $free; - while ($slot < $cur->{maxJobs}) { - my $slotLock = openSlotLock($cur, $slot); - if (flock($slotLock, LOCK_EX | LOCK_NB)) { - $free = $slot unless defined $free; - flock($slotLock, LOCK_UN) or die; - } else { - $load++; - } - close $slotLock; - $slot++; - } - - push @available, { machine => $cur, load => $load, free => $free } - if $load < $cur->{maxJobs}; - } - } - - if (defined $ENV{NIX_DEBUG_HOOK}) { - print STDERR "load on " . $_->{machine}->{hostName} . " = " . $_->{load} . "\n" - foreach @available; - } - - - # Didn't find any available machine? Then decline or postpone. - if (scalar @available == 0) { - # Postpone if we have a machine of the right type, except - # if the local system can and wants to do the build. - if ($rightType && !$canBuildLocally) { - sendReply "postpone"; - } else { - sendReply "decline"; - } - close MAINLOCK; - next REQ; - } - - - # Prioritise the available machines as follows: - # - First by load divided by speed factor, rounded to the nearest - # integer. This causes fast machines to be preferred over slow - # machines with similar loads. - # - Then by speed factor. - # - Finally by load. - sub lf { my $x = shift; return int($x->{load} / $x->{machine}->{speedFactor} + 0.4999); } - @available = sort - { lf($a) <=> lf($b) - || $b->{machine}->{speedFactor} <=> $a->{machine}->{speedFactor} - || $a->{load} <=> $b->{load} - } @available; - - - # Select the best available machine and lock a free slot. - my $selected = $available[0]; - my $machine = $selected->{machine}; - - $slotLock = openSlotLock($machine, $selected->{free}); - flock($slotLock, LOCK_EX | LOCK_NB) or die; - utime undef, undef, $slotLock; - - close MAINLOCK; - - - # Connect to the selected machine. - @sshOpts = ("-i", $machine->{sshKeys}, "-x"); - $hostName = $machine->{hostName}; - if (openSSHConnection($hostName)) { - last REQ if system("ssh $hostName @sshOpts nix-builds-inhibited < /dev/null > /dev/null 2>&1") != 0; - warn "machine `$hostName' is refusing builds, trying other available machines...\n"; - closeSSHConnection; - } else { - warn "unable to open SSH connection to `$hostName', trying other available machines...\n"; - } - $machine->{enabled} = 0; - } -} - - -# Tell Nix we've accepted the build. -sendReply "accept"; -my @inputs = split /\s/, readline(STDIN); -my @outputs = split /\s/, readline(STDIN); - - -print STDERR "@ build-remote $drvPath $hostName\n" if $printBuildTrace; - - -my $maybeSign = ""; -$maybeSign = "--sign" if -e "$Nix::Config::confDir/signing-key.sec"; - - -# Register the derivation as a temporary GC root. Note that $PPID is -# the PID of the remote SSH process, which, due to the use of a -# persistant SSH connection, should be the same across all remote -# command invocations for this session. -my $rootsDir = "@localstatedir@/nix/gcroots/tmp"; -system("ssh $hostName @sshOpts 'mkdir -m 1777 -p $rootsDir; ln -sfn $drvPath $rootsDir/\$PPID.drv'"); - -sub removeRoots { - system("ssh $hostName @sshOpts 'rm -f $rootsDir/\$PPID.drv $rootsDir/\$PPID.out'"); -} - - -# Copy the derivation and its dependencies to the build machine. This -# is guarded by an exclusive lock per machine to prevent multiple -# build-remote instances from copying to a machine simultaneously. -# That's undesirable because we may end up with N instances uploading -# the same missing path simultaneously, causing the effective network -# bandwidth and target disk speed to be divided by N. -my $uploadLock = "$currentLoad/$hostName.upload-lock"; -sysopen UPLOADLOCK, "$uploadLock", O_RDWR|O_CREAT, 0600 or die; -eval { - local $SIG{ALRM} = sub { die "alarm\n" }; - # Don't wait forever, so that a process that gets stuck while - # holding the lock doesn't block everybody else indefinitely. - # It's safe to continue after a timeout, just (potentially) - # inefficient. - alarm 15 * 60; - flock(UPLOADLOCK, LOCK_EX); - alarm 0; -}; -if ($@) { - die unless $@ eq "alarm\n"; - print STDERR "somebody is hogging $uploadLock, continuing...\n"; - unlink $uploadLock; -} -Nix::CopyClosure::copyTo($hostName, [ @sshOpts ], [ $drvPath, @inputs ], "", "", 0, 0, $maybeSign ne "", ""); -close UPLOADLOCK; - - -# Perform the build. -my $buildFlags = - "--max-silent-time $maxSilentTime --option build-timeout $buildTimeout" - . " --fallback --add-root $rootsDir/\$PPID.out --quiet" - . " --option build-keep-log false --option build-use-substitutes false"; - -# We let the remote side kill its process group when the connection is -# closed unexpectedly. This is necessary to ensure that no processes -# are left running on the remote system if the local Nix process is -# killed. (SSH itself doesn't kill child processes if the connection -# is interrupted unless the `-tt' flag is used to force a pseudo-tty, -# in which case every child receives SIGHUP; however, `-tt' doesn't -# work on some platforms when connection sharing is used.) -print STDERR "building `$drvPath' on `$hostName'\n"; -pipe STDIN, DUMMY; # make sure we have a readable STDIN -if (system("exec ssh $hostName @sshOpts '(read; kill -INT -\$\$) <&0 & exec nix-store -r $drvPath $buildFlags > /dev/null' 2>&4") != 0) { - # Note that if we get exit code 100 from `nix-store -r', it - # denotes a permanent build failure (as opposed to an SSH problem - # or a temporary Nix problem). We propagate this to the caller to - # allow it to distinguish between transient and permanent - # failures. - my $res = $? >> 8; - print STDERR "build of `$drvPath' on `$hostName' failed with exit code $res\n"; - removeRoots; - exit $res; -} - -#print "build of `$drvPath' on `$hostName' succeeded\n"; - - -# Copy the output from the build machine. -my @outputs2 = grep { !isValidPath($_) } @outputs; -if (scalar @outputs2 > 0) { - system("exec ssh $hostName @sshOpts 'nix-store --export @outputs2'" . - "| NIX_HELD_LOCKS='@outputs2' @bindir@/nix-store --import > /dev/null") == 0 - or die("cannot copy paths " . join(", ", @outputs) . " from `$hostName': $?"); -} - - -# Get rid of the temporary GC roots. -removeRoots; diff --git a/scripts/copy-from-other-stores.pl.in b/scripts/copy-from-other-stores.pl.in deleted file mode 100755 index bfd38c9ba3..0000000000 --- a/scripts/copy-from-other-stores.pl.in +++ /dev/null @@ -1,101 +0,0 @@ -#! @perl@ -w @perlFlags@ - -use strict; -use File::Basename; -use IO::Handle; - -my $binDir = $ENV{"NIX_BIN_DIR"} || "@bindir@"; - - -STDOUT->autoflush(1); - -my @remoteStoresAll = split ':', ($ENV{"NIX_OTHER_STORES"} or ""); - -my @remoteStores; -foreach my $dir (@remoteStoresAll) { - push @remoteStores, glob($dir); -} - -exit if scalar @remoteStores == 0; -print "\n"; - - -$ENV{"NIX_REMOTE"} = ""; - - -sub findStorePath { - my $storePath = shift; - foreach my $store (@remoteStores) { - my $sourcePath = "$store/store/" . basename $storePath; - next unless -e $sourcePath || -l $sourcePath; - $ENV{"NIX_DB_DIR"} = "$store/var/nix/db"; - return ($store, $sourcePath) if - system("$binDir/nix-store --check-validity $storePath") == 0; - } - return undef; -} - - -if ($ARGV[0] eq "--query") { - - while () { - chomp; - my ($cmd, @args) = split " ", $_; - - if ($cmd eq "have") { - foreach my $storePath (@args) { - print "$storePath\n" if defined findStorePath($storePath); - } - print "\n"; - } - - elsif ($cmd eq "info") { - foreach my $storePath (@args) { - my ($store, $sourcePath) = findStorePath($storePath); - next unless defined $store; - - $ENV{"NIX_DB_DIR"} = "$store/var/nix/db"; - - my $deriver = `$binDir/nix-store --query --deriver $storePath`; - die "cannot query deriver of `$storePath'" if $? != 0; - chomp $deriver; - $deriver = "" if $deriver eq "unknown-deriver"; - - my @references = split "\n", - `$binDir/nix-store --query --references $storePath`; - die "cannot query references of `$storePath'" if $? != 0; - - my $narSize = `$binDir/nix-store --query --size $storePath`; - die "cannot query size of `$storePath'" if $? != 0; - chomp $narSize; - - print "$storePath\n"; - print "$deriver\n"; - print scalar @references, "\n"; - print "$_\n" foreach @references; - print "0\n"; - print "$narSize\n"; - } - - print "\n"; - } - - else { die "unknown command `$cmd'"; } - } -} - - -elsif ($ARGV[0] eq "--substitute") { - die unless scalar @ARGV == 3; - my $storePath = $ARGV[1]; - my $destPath = $ARGV[2]; - my ($store, $sourcePath) = findStorePath $storePath; - die unless $store; - print STDERR "\n*** Copying `$storePath' from `$sourcePath'\n\n"; - system("$binDir/nix-store --dump $sourcePath | $binDir/nix-store --restore $destPath") == 0 - or die "cannot copy `$sourcePath' to `$storePath'"; - print "\n"; # no hash to verify -} - - -else { die; } diff --git a/scripts/copying-collector.pl b/scripts/copying-collector.pl deleted file mode 100755 index 2e8be2d41f..0000000000 --- a/scripts/copying-collector.pl +++ /dev/null @@ -1,111 +0,0 @@ -#! /usr/bin/perl -w - -use strict; - -my @paths = `nix-store -qR /home/eelco/.nix-profile/bin/firefox`; - -my %copyMap; -my %rewriteMap; - - -my $counter = 0; - -foreach my $path (@paths) { - chomp $path; - - $path =~ /^(.*)\/([^-]+)-(.*)$/ or die "invalid store path `$path'"; - my $hash = $2; - -# my $newHash = "deadbeef" . (sprintf "%024d", $counter++); - my $newHash = "deadbeef" . substr($hash, 0, 24); - my $newPath = "/home/eelco/chroot/$1/$newHash-$3"; - - die unless length $newHash == length $hash; - - $copyMap{$path} = $newPath; - $rewriteMap{$hash} = $newHash; -} - - -my %rewriteMap2; - - -sub rewrite; -sub rewrite { - my $src = shift; - my $dst = shift; - - if (-l $dst) { - - my $target = readlink $dst or die; - - foreach my $srcHash (keys %rewriteMap2) { - my $dstHash = $rewriteMap{$srcHash}; - print " $srcHash -> $dstHash\n"; - $target =~ s/$srcHash/$dstHash/g; - } - - unlink $dst or die; - - symlink $target, $dst; - - } - - elsif (-f $dst) { - - print "$dst\n"; - - foreach my $srcHash (keys %rewriteMap2) { - my $dstHash = $rewriteMap{$srcHash}; - print " $srcHash -> $dstHash\n"; - - my @stats = lstat $dst or die; - - system "sed s/$srcHash/$dstHash/g < '$dst' > '$dst.tmp'"; - die if $? != 0; - rename "$dst.tmp", $dst or die; - - chmod $stats[2], $dst or die; - } - - } - - elsif (-d $dst) { - - chmod 0755, $dst; - - opendir(DIR, "$dst") or die "cannot open `$dst': $!"; - my @files = readdir DIR; - closedir DIR; - - foreach my $file (@files) { - next if $file eq "." || $file eq ".."; - rewrite "$src/$file", "$dst/$file"; - } - } -} - - -foreach my $src (keys %copyMap) { - my $dst = $copyMap{$src}; - print "$src -> $dst\n"; - - if (!-e $dst) { - system "cp -prd $src $dst"; - die if $? != 0; - - my @refs = `nix-store -q --references $src`; - - %rewriteMap2 = (); - foreach my $ref (@refs) { - chomp $ref; - - $ref =~ /^(.*)\/([^-]+)-(.*)$/ or die "invalid store path `$ref'"; - my $hash = $2; - - $rewriteMap2{$hash} = $rewriteMap{$hash}; - } - - rewrite $src, $dst; - } -} diff --git a/scripts/download-from-binary-cache.pl.in b/scripts/download-from-binary-cache.pl.in deleted file mode 100644 index 8b49a25176..0000000000 --- a/scripts/download-from-binary-cache.pl.in +++ /dev/null @@ -1,606 +0,0 @@ -#! @perl@ -w @perlFlags@ - -use DBI; -use DBD::SQLite; -use File::Basename; -use IO::Select; -use Nix::Config; -use Nix::Store; -use Nix::Utils; -use Nix::Manifest; -use WWW::Curl::Easy; -use WWW::Curl::Multi; -use strict; - - -Nix::Config::readConfig; - -my @caches; -my $gotCaches = 0; - -my $maxParallelRequests = int($Nix::Config::config{"binary-caches-parallel-connections"} // 150); -$maxParallelRequests = 1 if $maxParallelRequests < 1; - -my $ttlNegative = 24 * 3600; # when to purge negative lookups from the database -my $ttlNegativeUse = 3600; # how long negative lookups are valid for non-"have" lookups -my $didExpiration = 0; - -my $showAfter = 5; # show that we're waiting for a request after this many seconds - -my $debug = ($Nix::Config::config{"debug-subst"} // "") eq 1 || ($Nix::Config::config{"untrusted-debug-subst"} // "") eq 1; - -my $cacheFileURLs = ($ENV{"_NIX_CACHE_FILE_URLS"} // "") eq 1; # for testing - -my ($dbh, $queryCache, $insertNAR, $queryNAR, $insertNARExistence, $queryNARExistence, $expireNARExistence); - -my $curlm = WWW::Curl::Multi->new; -my $activeRequests = 0; -my $curlIdCount = 1; -my %requests; -my %scheduled; -my $caBundle = $ENV{"CURL_CA_BUNDLE"} // $ENV{"OPENSSL_X509_CERT_FILE"}; - -my $userName = getpwuid($<) || $ENV{"USER"} or die "cannot figure out user name"; - -my $requireSignedBinaryCaches = ($Nix::Config::config{"signed-binary-caches"} // "0") ne "0"; - -my $curlConnectTimeout = int( - $Nix::Config::config{"untrusted-connect-timeout"} // - $Nix::Config::config{"connect-timeout"} // - $ENV{"NIX_CONNECT_TIMEOUT"} // 0); - - -sub addRequest { - my ($storePath, $url, $head) = @_; - - my $curl = WWW::Curl::Easy->new; - my $curlId = $curlIdCount++; - $requests{$curlId} = { storePath => $storePath, url => $url, handle => $curl, content => "", type => $head ? "HEAD" : "GET" - , shown => 0, started => time() }; - - $curl->setopt(CURLOPT_PRIVATE, $curlId); - $curl->setopt(CURLOPT_URL, $url); - open (my $fh, ">", \$requests{$curlId}->{content}); - $curl->setopt(CURLOPT_WRITEDATA, $fh); - $curl->setopt(CURLOPT_FOLLOWLOCATION, 1); - $curl->setopt(CURLOPT_CAINFO, $caBundle) if defined $caBundle; - $curl->setopt(CURLOPT_USERAGENT, "Nix/$Nix::Config::version"); - $curl->setopt(CURLOPT_NOBODY, 1) if $head; - $curl->setopt(CURLOPT_FAILONERROR, 1); - $curl->setopt(CURLOPT_CONNECTTIMEOUT, $curlConnectTimeout); - - if ($activeRequests >= $maxParallelRequests) { - $scheduled{$curlId} = 1; - } else { - $curlm->add_handle($curl); - $activeRequests++; - } - - return $requests{$curlId}; -} - - -sub processRequests { - while ($activeRequests) { - my ($rfds, $wfds, $efds) = $curlm->fdset(); - #print STDERR "R = @{$rfds}, W = @{$wfds}, E = @{$efds}\n"; - - # Sleep until we can read or write some data. - if (scalar @{$rfds} + scalar @{$wfds} + scalar @{$efds} > 0) { - IO::Select->select(IO::Select->new(@{$rfds}), IO::Select->new(@{$wfds}), IO::Select->new(@{$efds}), 1.0); - } - - if ($curlm->perform() != $activeRequests) { - while (my ($id, $result) = $curlm->info_read) { - if ($id) { - my $request = $requests{$id} or die; - my $handle = $request->{handle}; - $request->{result} = $result; - $request->{httpStatus} = $handle->getinfo(CURLINFO_RESPONSE_CODE); - - print STDERR "$request->{type} on $request->{url} [$request->{result}, $request->{httpStatus}]\n" if $debug; - - $activeRequests--; - delete $request->{handle}; - - if (scalar(keys %scheduled) > 0) { - my $id2 = (keys %scheduled)[0]; - $curlm->add_handle($requests{$id2}->{handle}); - $activeRequests++; - delete $scheduled{$id2}; - } - } - } - } - - my $time = time(); - while (my ($key, $request) = each %requests) { - next unless defined $request->{handle}; - next if $request->{shown}; - if ($time > $request->{started} + $showAfter) { - print STDERR "still waiting for ‘$request->{url}’ after $showAfter seconds...\n"; - $request->{shown} = 1; - } - } - } -} - - -sub initCache { - my $dbPath = "$Nix::Config::stateDir/binary-cache-v3.sqlite"; - - unlink "$Nix::Config::stateDir/binary-cache-v1.sqlite"; - unlink "$Nix::Config::stateDir/binary-cache-v2.sqlite"; - - # Open/create the database. - $dbh = DBI->connect("dbi:SQLite:dbname=$dbPath", "", "") - or die "cannot open database `$dbPath'"; - $dbh->{RaiseError} = 1; - $dbh->{PrintError} = 0; - - $dbh->sqlite_busy_timeout(60 * 60 * 1000); - - $dbh->do("pragma synchronous = off"); # we can always reproduce the cache - $dbh->do("pragma journal_mode = truncate"); - - # Initialise the database schema, if necessary. - $dbh->do(<do(<do(<do("create index if not exists NARExistenceByExistTimestamp on NARExistence (exist, timestamp)"); - - $queryCache = $dbh->prepare("select id, storeDir, wantMassQuery, priority from BinaryCaches where url = ?") or die; - - $insertNAR = $dbh->prepare( - "insert or replace into NARs(cache, storePath, url, compression, fileHash, fileSize, narHash, " . - "narSize, refs, deriver, signedBy, timestamp) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") or die; - - $queryNAR = $dbh->prepare("select * from NARs where cache = ? and storePath = ?") or die; - - $insertNARExistence = $dbh->prepare( - "insert or replace into NARExistence(cache, storePath, exist, timestamp) values (?, ?, ?, ?)") or die; - - $queryNARExistence = $dbh->prepare("select exist, timestamp from NARExistence where cache = ? and storePath = ?") or die; - - $expireNARExistence = $dbh->prepare("delete from NARExistence where exist = ? and timestamp < ?") or die; -} - - -sub getAvailableCaches { - return if $gotCaches; - $gotCaches = 1; - - sub strToList { - my ($s) = @_; - return map { s/\/+$//; $_ } split(/ /, $s); - } - - my @urls = strToList($Nix::Config::config{"binary-caches"} // - ($Nix::Config::storeDir eq "/nix/store" ? "http://cache.nixos.org" : "")); - - my $urlsFiles = $Nix::Config::config{"binary-cache-files"} - // "$Nix::Config::stateDir/profiles/per-user/$userName/channels/binary-caches/*"; - foreach my $urlFile (glob $urlsFiles) { - next unless -f $urlFile; - open FILE, "<$urlFile" or die "cannot open ‘$urlFile’\n"; - my $url = ; chomp $url; - close FILE; - push @urls, strToList($url); - } - - push @urls, strToList($Nix::Config::config{"extra-binary-caches"} // ""); - - # Allow Nix daemon users to override the binary caches to a subset - # of those listed in the config file. Note that ‘untrusted-*’ - # denotes options passed by the client. - my @trustedUrls = uniq(@urls, strToList($Nix::Config::config{"trusted-binary-caches"} // "")); - - if (defined $Nix::Config::config{"untrusted-binary-caches"}) { - my @untrustedUrls = strToList $Nix::Config::config{"untrusted-binary-caches"}; - @urls = (); - foreach my $url (@untrustedUrls) { - die "binary cache ‘$url’ is not trusted (please add it to ‘trusted-binary-caches’ [@trustedUrls] in $Nix::Config::confDir/nix.conf)\n" - unless scalar(grep { $url eq $_ } @trustedUrls) > 0; - push @urls, $url; - } - } - - my @untrustedUrls = strToList $Nix::Config::config{"untrusted-extra-binary-caches"} // ""; - foreach my $url (@untrustedUrls) { - next unless scalar(grep { $url eq $_ } @trustedUrls) > 0; - push @urls, $url; - } - - foreach my $url (uniq @urls) { - - # FIXME: not atomic. - $queryCache->execute($url); - my $res = $queryCache->fetchrow_hashref(); - if (defined $res) { - next if $res->{storeDir} ne $Nix::Config::storeDir; - push @caches, { id => $res->{id}, url => $url, wantMassQuery => $res->{wantMassQuery}, priority => $res->{priority} }; - next; - } - - # Get the cache info file. - my $request = addRequest(undef, $url . "/nix-cache-info"); - processRequests; - - if ($request->{result} != 0) { - print STDERR "could not download ‘$request->{url}’ (" . - ($request->{result} != 0 ? "Curl error $request->{result}" : "HTTP status $request->{httpStatus}") . ")\n"; - next; - } - - my $storeDir = "/nix/store"; - my $wantMassQuery = 0; - my $priority = 50; - foreach my $line (split "\n", $request->{content}) { - unless ($line =~ /^(.*): (.*)$/) { - print STDERR "bad cache info file ‘$request->{url}’\n"; - return undef; - } - if ($1 eq "StoreDir") { $storeDir = $2; } - elsif ($1 eq "WantMassQuery") { $wantMassQuery = int($2); } - elsif ($1 eq "Priority") { $priority = int($2); } - } - - $dbh->do("insert or replace into BinaryCaches(url, timestamp, storeDir, wantMassQuery, priority) values (?, ?, ?, ?, ?)", - {}, $url, time(), $storeDir, $wantMassQuery, $priority); - $queryCache->execute($url); - $res = $queryCache->fetchrow_hashref() or die; - next if $storeDir ne $Nix::Config::storeDir; - push @caches, { id => $res->{id}, url => $url, wantMassQuery => $wantMassQuery, priority => $priority }; - } - - @caches = sort { $a->{priority} <=> $b->{priority} } @caches; - - expireNegative(); -} - - -sub shouldCache { - my ($url) = @_; - return $cacheFileURLs || $url !~ /^file:/; -} - - -sub processNARInfo { - my ($storePath, $cache, $request) = @_; - - if ($request->{result} != 0) { - if ($request->{result} != 37 && $request->{httpStatus} != 404 && $request->{httpStatus} != 403) { - print STDERR "could not download ‘$request->{url}’ (" . - ($request->{result} != 0 ? "Curl error $request->{result}" : "HTTP status $request->{httpStatus}") . ")\n"; - } else { - $insertNARExistence->execute($cache->{id}, basename($storePath), 0, time()) - if shouldCache $request->{url}; - } - return undef; - } - - my $narInfo = parseNARInfo($storePath, $request->{content}, $requireSignedBinaryCaches, $request->{url}); - return undef unless defined $narInfo; - - die if $requireSignedBinaryCaches && !defined $narInfo->{signedBy}; - - # Cache the result. - $insertNAR->execute( - $cache->{id}, basename($storePath), $narInfo->{url}, $narInfo->{compression}, - $narInfo->{fileHash}, $narInfo->{fileSize}, $narInfo->{narHash}, $narInfo->{narSize}, - join(" ", @{$narInfo->{refs}}), $narInfo->{deriver}, $narInfo->{signedBy}, time()) - if shouldCache $request->{url}; - - return $narInfo; -} - - -sub getCachedInfoFrom { - my ($storePath, $cache) = @_; - - $queryNAR->execute($cache->{id}, basename($storePath)); - my $res = $queryNAR->fetchrow_hashref(); - return undef unless defined $res; - - # We may previously have cached this info when signature checking - # was disabled. In that case, ignore the cached info. - return undef if $requireSignedBinaryCaches && !defined $res->{signedBy}; - - return - { url => $res->{url} - , compression => $res->{compression} - , fileHash => $res->{fileHash} - , fileSize => $res->{fileSize} - , narHash => $res->{narHash} - , narSize => $res->{narSize} - , refs => [ split " ", $res->{refs} ] - , deriver => $res->{deriver} - , signedBy => $res->{signedBy} - } if defined $res; -} - - -sub negativeHit { - my ($storePath, $cache) = @_; - $queryNARExistence->execute($cache->{id}, basename($storePath)); - my $res = $queryNARExistence->fetchrow_hashref(); - return defined $res && $res->{exist} == 0 && time() - $res->{timestamp} < $ttlNegativeUse; -} - - -sub positiveHit { - my ($storePath, $cache) = @_; - return 1 if defined getCachedInfoFrom($storePath, $cache); - $queryNARExistence->execute($cache->{id}, basename($storePath)); - my $res = $queryNARExistence->fetchrow_hashref(); - return defined $res && $res->{exist} == 1; -} - - -sub expireNegative { - return if $didExpiration; - $didExpiration = 1; - my $time = time(); - # Round up to the next multiple of the TTL to ensure that we do - # expiration only once per time interval. E.g. if $ttlNegative == - # 3600, we expire entries at most once per hour. This is - # presumably faster than expiring a few entries per request (and - # thus doing a transaction). - my $limit = (int($time / $ttlNegative) - 1) * $ttlNegative; - $expireNARExistence->execute($limit, 0); - print STDERR "expired ", $expireNARExistence->rows, " negative entries\n" if $debug; -} - - -sub printInfo { - my ($storePath, $info) = @_; - print "$storePath\n"; - print $info->{deriver} ? "$Nix::Config::storeDir/$info->{deriver}" : "", "\n"; - print scalar @{$info->{refs}}, "\n"; - print "$Nix::Config::storeDir/$_\n" foreach @{$info->{refs}}; - print $info->{fileSize} || 0, "\n"; - print $info->{narSize} || 0, "\n"; -} - - -sub infoUrl { - my ($binaryCacheUrl, $storePath) = @_; - my $pathHash = substr(basename($storePath), 0, 32); - my $infoUrl = "$binaryCacheUrl/$pathHash.narinfo"; -} - - -sub printInfoParallel { - my @paths = @_; - - # First print all paths for which we have cached info. - my @left; - foreach my $storePath (@paths) { - my $found = 0; - foreach my $cache (@caches) { - my $info = getCachedInfoFrom($storePath, $cache); - if (defined $info) { - printInfo($storePath, $info); - $found = 1; - last; - } - } - push @left, $storePath if !$found; - } - - return if scalar @left == 0; - - foreach my $cache (@caches) { - - my @left2; - %requests = (); - foreach my $storePath (@left) { - if (negativeHit($storePath, $cache)) { - push @left2, $storePath; - next; - } - addRequest($storePath, infoUrl($cache->{url}, $storePath)); - } - - processRequests; - - foreach my $request (values %requests) { - my $info = processNARInfo($request->{storePath}, $cache, $request); - if (defined $info) { - printInfo($request->{storePath}, $info); - } else { - push @left2, $request->{storePath}; - } - } - - @left = @left2; - } -} - - -sub printSubstitutablePaths { - my @paths = @_; - - # First look for paths that have cached info. - my @left; - foreach my $storePath (@paths) { - my $found = 0; - foreach my $cache (@caches) { - next unless $cache->{wantMassQuery}; - if (positiveHit($storePath, $cache)) { - print "$storePath\n"; - $found = 1; - last; - } - } - push @left, $storePath if !$found; - } - - return if scalar @left == 0; - - # For remaining paths, do HEAD requests. - foreach my $cache (@caches) { - next unless $cache->{wantMassQuery}; - my @left2; - %requests = (); - foreach my $storePath (@left) { - if (negativeHit($storePath, $cache)) { - push @left2, $storePath; - next; - } - addRequest($storePath, infoUrl($cache->{url}, $storePath), 1); - } - - processRequests; - - foreach my $request (values %requests) { - if ($request->{result} != 0) { - if ($request->{result} != 37 && $request->{httpStatus} != 404 && $request->{httpStatus} != 403) { - print STDERR "could not check ‘$request->{url}’ (" . - ($request->{result} != 0 ? "Curl error $request->{result}" : "HTTP status $request->{httpStatus}") . ")\n"; - } else { - $insertNARExistence->execute($cache->{id}, basename($request->{storePath}), 0, time()) - if shouldCache $request->{url}; - } - push @left2, $request->{storePath}; - } else { - $insertNARExistence->execute($cache->{id}, basename($request->{storePath}), 1, time()) - if shouldCache $request->{url}; - print "$request->{storePath}\n"; - } - } - - @left = @left2; - } -} - - -sub downloadBinary { - my ($storePath, $destPath) = @_; - - foreach my $cache (@caches) { - my $info = getCachedInfoFrom($storePath, $cache); - - unless (defined $info) { - next if negativeHit($storePath, $cache); - my $request = addRequest($storePath, infoUrl($cache->{url}, $storePath)); - processRequests; - $info = processNARInfo($storePath, $cache, $request); - } - - next unless defined $info; - - my $decompressor; - if ($info->{compression} eq "bzip2") { $decompressor = "| $Nix::Config::bzip2 -d"; } - elsif ($info->{compression} eq "xz") { $decompressor = "| $Nix::Config::xz -d"; } - elsif ($info->{compression} eq "none") { $decompressor = ""; } - else { - print STDERR "unknown compression method ‘$info->{compression}’\n"; - next; - } - my $url = "$cache->{url}/$info->{url}"; # FIXME: handle non-relative URLs - die if $requireSignedBinaryCaches && !defined $info->{signedBy}; - print STDERR "\n*** Downloading ‘$url’ ", ($requireSignedBinaryCaches ? "(signed by ‘$info->{signedBy}’) " : ""), "to ‘$storePath’...\n"; - checkURL $url; - if (system("$Nix::Config::curl --fail --location --insecure --connect-timeout $curlConnectTimeout '$url' $decompressor | $Nix::Config::binDir/nix-store --restore $destPath") != 0) { - warn "download of `$url' failed" . ($! ? ": $!" : "") . "\n"; - next; - } - - # Tell Nix about the expected hash so it can verify it. - die unless defined $info->{narHash} && $info->{narHash} ne ""; - print "$info->{narHash}\n"; - - print STDERR "\n"; - return; - } - - print STDERR "could not download ‘$storePath’ from any binary cache\n"; - exit 1; -} - - -# Bail out right away if binary caches are disabled. -exit 0 if - ($Nix::Config::config{"use-binary-caches"} // "true") eq "false" || - ($Nix::Config::config{"untrusted-use-binary-caches"} // "true") eq "false"; -print "\n"; -flush STDOUT; - -initCache(); - - -if ($ARGV[0] eq "--query") { - - while () { - getAvailableCaches; - chomp; - my ($cmd, @args) = split " ", $_; - - if ($cmd eq "have") { - print STDERR "checking binary caches for existence of @args\n" if $debug; - printSubstitutablePaths(@args); - print "\n"; - } - - elsif ($cmd eq "info") { - print STDERR "checking binary caches for info on @args\n" if $debug; - printInfoParallel(@args); - print "\n"; - } - - else { die "unknown command `$cmd'"; } - - flush STDOUT; - } - -} - -elsif ($ARGV[0] eq "--substitute") { - my $storePath = $ARGV[1] or die; - my $destPath = $ARGV[2] or die; - getAvailableCaches; - downloadBinary($storePath, $destPath); -} - -else { - die; -} diff --git a/scripts/download-using-manifests.pl.in b/scripts/download-using-manifests.pl.in deleted file mode 100755 index b670163038..0000000000 --- a/scripts/download-using-manifests.pl.in +++ /dev/null @@ -1,377 +0,0 @@ -#! @perl@ -w @perlFlags@ - -use strict; -use Nix::Config; -use Nix::Manifest; -use Nix::Store; -use Nix::Utils; -use POSIX qw(strftime); -use File::Temp qw(tempdir); - -STDOUT->autoflush(1); - -my $logFile = "$Nix::Config::logDir/downloads"; - -# For queries, skip expensive calls to nix-hash etc. We're just -# estimating the expected download size. -my $fast = 1; - -# ‘--insecure’ is fine because Nix verifies the hash of the result. -my $curl = "$Nix::Config::curl --fail --location --insecure"; - - -# Open the manifest cache and update it if necessary. -my $dbh = updateManifestDB(); -exit 0 unless defined $dbh; # exit if there are no manifests -print "\n"; - - -# $hashCache->{$algo}->{$path} yields the $algo-hash of $path. -my $hashCache; - - -sub parseHash { - my $hash = shift; - if ($hash =~ /^(.+):(.+)$/) { - return ($1, $2); - } else { - return ("md5", $hash); - } -} - - -# Compute the most efficient sequence of downloads to produce the -# given path. -sub computeSmallestDownload { - my $targetPath = shift; - - # Build a graph of all store paths that might contribute to the - # construction of $targetPath, and the special node "start". The - # edges are either patch operations, or downloads of full NAR - # files. The latter edges only occur between "start" and a store - # path. - my %graph; - - $graph{"start"} = {d => 0, pred => undef, edges => []}; - - my @queue = (); - my $queueFront = 0; - my %done; - - sub addNode { - my $graph = shift; - my $u = shift; - $$graph{$u} = {d => 999999999999, pred => undef, edges => []} - unless defined $$graph{$u}; - } - - sub addEdge { - my $graph = shift; - my $u = shift; - my $v = shift; - my $w = shift; - my $type = shift; - my $info = shift; - addNode $graph, $u; - push @{$$graph{$u}->{edges}}, - {weight => $w, start => $u, end => $v, type => $type, info => $info}; - my $n = scalar @{$$graph{$u}->{edges}}; - } - - push @queue, $targetPath; - - while ($queueFront < scalar @queue) { - my $u = $queue[$queueFront++]; - next if defined $done{$u}; - $done{$u} = 1; - - addNode \%graph, $u; - - # If the path already exists, it has distance 0 from the - # "start" node. - if (isValidPath($u)) { - addEdge \%graph, "start", $u, 0, "present", undef; - } - - else { - - # Add patch edges. - my $patchList = $dbh->selectall_arrayref( - "select * from Patches where storePath = ?", - { Slice => {} }, $u); - - foreach my $patch (@{$patchList}) { - if (isValidPath($patch->{basePath})) { - my ($baseHashAlgo, $baseHash) = parseHash $patch->{baseHash}; - - my $hash = $hashCache->{$baseHashAlgo}->{$patch->{basePath}}; - if (!defined $hash) { - $hash = $fast && $baseHashAlgo eq "sha256" - ? queryPathHash($patch->{basePath}) - : hashPath($baseHashAlgo, $baseHashAlgo ne "md5", $patch->{basePath}); - $hash =~ s/.*://; - $hashCache->{$baseHashAlgo}->{$patch->{basePath}} = $hash; - } - - next if $hash ne $baseHash; - } - push @queue, $patch->{basePath}; - addEdge \%graph, $patch->{basePath}, $u, $patch->{size}, "patch", $patch; - } - - # Add NAR file edges to the start node. - my $narFileList = $dbh->selectall_arrayref( - "select * from NARs where storePath = ?", - { Slice => {} }, $u); - - foreach my $narFile (@{$narFileList}) { - # !!! how to handle files whose size is not known in advance? - # For now, assume some arbitrary size (1 GB). - # This has the side-effect of preferring non-Hydra downloads. - addEdge \%graph, "start", $u, ($narFile->{size} || 1000000000), "narfile", $narFile; - } - } - } - - - # Run Dijkstra's shortest path algorithm to determine the shortest - # sequence of download and/or patch actions that will produce - # $targetPath. - - my @todo = keys %graph; - - while (scalar @todo > 0) { - - # Remove the closest element from the todo list. - # !!! inefficient, use a priority queue - @todo = sort { -($graph{$a}->{d} <=> $graph{$b}->{d}) } @todo; - my $u = pop @todo; - - my $u_ = $graph{$u}; - - foreach my $edge (@{$u_->{edges}}) { - my $v_ = $graph{$edge->{end}}; - if ($v_->{d} > $u_->{d} + $edge->{weight}) { - $v_->{d} = $u_->{d} + $edge->{weight}; - # Store the edge; to edge->start is actually the - # predecessor. - $v_->{pred} = $edge; - } - } - } - - - # Retrieve the shortest path from "start" to $targetPath. - my @path = (); - my $cur = $targetPath; - return () unless defined $graph{$targetPath}->{pred}; - while ($cur ne "start") { - push @path, $graph{$cur}->{pred}; - $cur = $graph{$cur}->{pred}->{start}; - } - - return @path; -} - - -# Parse the arguments. - -if ($ARGV[0] eq "--query") { - - while () { - chomp; - my ($cmd, @args) = split " ", $_; - - if ($cmd eq "have") { - foreach my $storePath (@args) { - print "$storePath\n" if scalar @{$dbh->selectcol_arrayref("select 1 from NARs where storePath = ?", {}, $storePath)} > 0; - } - print "\n"; - } - - elsif ($cmd eq "info") { - foreach my $storePath (@args) { - - my $infos = $dbh->selectall_arrayref( - "select * from NARs where storePath = ?", - { Slice => {} }, $storePath); - - next unless scalar @{$infos} > 0; - my $info = @{$infos}[0]; - - print "$storePath\n"; - print "$info->{deriver}\n"; - my @references = split " ", $info->{refs}; - print scalar @references, "\n"; - print "$_\n" foreach @references; - - my @path = computeSmallestDownload $storePath; - - my $downloadSize = 0; - while (scalar @path > 0) { - my $edge = pop @path; - my $u = $edge->{start}; - my $v = $edge->{end}; - if ($edge->{type} eq "patch") { - $downloadSize += $edge->{info}->{size} || 0; - } - elsif ($edge->{type} eq "narfile") { - $downloadSize += $edge->{info}->{size} || 0; - } - } - - print "$downloadSize\n"; - - my $narSize = $info->{narSize} || 0; - print "$narSize\n"; - } - - print "\n"; - } - - else { die "unknown command `$cmd'"; } - } - - exit 0; -} - -elsif ($ARGV[0] ne "--substitute") { - die; -} - - -die unless scalar @ARGV == 3; -my $targetPath = $ARGV[1]; -my $destPath = $ARGV[2]; -$fast = 0; - - -# Create a temporary directory. -my $tmpDir = tempdir("nix-download.XXXXXX", CLEANUP => 1, TMPDIR => 1) - or die "cannot create a temporary directory"; - -my $tmpNar = "$tmpDir/nar"; -my $tmpNar2 = "$tmpDir/nar2"; - - -open LOGFILE, ">>$logFile" or die "cannot open log file $logFile"; - -my $date = strftime ("%F %H:%M:%S UTC", gmtime (time)); -print LOGFILE "$$ get $targetPath $date\n"; - -print STDERR "\n*** Trying to download/patch `$targetPath'\n"; - - -# Compute the shortest path. -my @path = computeSmallestDownload $targetPath; -die "don't know how to produce $targetPath\n" if scalar @path == 0; - - -# We don't need the manifest anymore, so close it as an optimisation: -# if we still have SQLite locks blocking other processes (we -# shouldn't), this gets rid of them. -$dbh->disconnect; - - -# Traverse the shortest path, perform the actions described by the -# edges. -my $curStep = 1; -my $maxStep = scalar @path; - -my $finalNarHash; - -while (scalar @path > 0) { - my $edge = pop @path; - my $u = $edge->{start}; - my $v = $edge->{end}; - - print STDERR "\n*** Step $curStep/$maxStep: "; - - if ($edge->{type} eq "present") { - print STDERR "using already present path `$v'\n"; - print LOGFILE "$$ present $v\n"; - - if ($curStep < $maxStep) { - # Since this is not the last step, the path will be used - # as a base to one or more patches. So turn the base path - # into a NAR archive, to which we can apply the patch. - print STDERR " packing base path...\n"; - system("$Nix::Config::binDir/nix-store --dump $v > $tmpNar") == 0 - or die "cannot dump `$v'"; - } - } - - elsif ($edge->{type} eq "patch") { - my $patch = $edge->{info}; - print STDERR "applying patch `$patch->{url}' to `$u' to create `$v'\n"; - - print LOGFILE "$$ patch $patch->{url} $patch->{size} $patch->{baseHash} $u $v\n"; - - # Download the patch. - print STDERR " downloading patch...\n"; - my $patchPath = "$tmpDir/patch"; - checkURL $patch->{url}; - system("$curl '$patch->{url}' -o $patchPath") == 0 - or die "cannot download patch `$patch->{url}'\n"; - - # Apply the patch to the NAR archive produced in step 1 (for - # the already present path) or a later step (for patch sequences). - print STDERR " applying patch...\n"; - system("$Nix::Config::libexecDir/nix/bspatch $tmpNar $tmpNar2 $patchPath") == 0 - or die "cannot apply patch `$patchPath' to $tmpNar\n"; - - if ($curStep < $maxStep) { - # The archive will be used as the base of the next patch. - rename "$tmpNar2", "$tmpNar" or die "cannot rename NAR archive: $!"; - } else { - # This was the last patch. Unpack the final NAR archive - # into the target path. - print STDERR " unpacking patched archive...\n"; - system("$Nix::Config::binDir/nix-store --restore $destPath < $tmpNar2") == 0 - or die "cannot unpack $tmpNar2 to `$v'\n"; - } - - $finalNarHash = $patch->{narHash}; - } - - elsif ($edge->{type} eq "narfile") { - my $narFile = $edge->{info}; - print STDERR "downloading `$narFile->{url}' to `$v'\n"; - - my $size = $narFile->{size} || -1; - print LOGFILE "$$ narfile $narFile->{url} $size $v\n"; - - checkURL $narFile->{url}; - - my $decompressor = - $narFile->{compressionType} eq "bzip2" ? "| $Nix::Config::bzip2 -d" : - $narFile->{compressionType} eq "xz" ? "| $Nix::Config::xz -d" : - $narFile->{compressionType} eq "none" ? "" : - die "unknown compression type `$narFile->{compressionType}'"; - - if ($curStep < $maxStep) { - # The archive will be used a base to a patch. - system("$curl '$narFile->{url}' $decompressor > $tmpNar") == 0 - or die "cannot download and unpack `$narFile->{url}' to `$v'\n"; - } else { - # Unpack the archive to the target path. - system("$curl '$narFile->{url}' $decompressor | $Nix::Config::binDir/nix-store --restore '$destPath'") == 0 - or die "cannot download and unpack `$narFile->{url}' to `$v'\n"; - } - - $finalNarHash = $narFile->{narHash}; - } - - $curStep++; -} - - -# Tell Nix about the expected hash so it can verify it. -die "cannot check integrity of the downloaded path since its hash is not known\n" - unless defined $finalNarHash; -print "$finalNarHash\n"; - - -print STDERR "\n"; -print LOGFILE "$$ success\n"; -close LOGFILE; diff --git a/scripts/find-runtime-roots.pl.in b/scripts/find-runtime-roots.pl.in deleted file mode 100755 index e1a2dde556..0000000000 --- a/scripts/find-runtime-roots.pl.in +++ /dev/null @@ -1,79 +0,0 @@ -#! @perl@ -w @perlFlags@ - -use strict; -use Nix::Utils; -use Nix::Config; - - -sub readProc { - return unless -d "/proc"; - - opendir DIR, "/proc" or return; - - foreach my $name (readdir DIR) { - next unless $name =~ /^\d+$/; - - my $process = "/proc/$name"; - - #print STDERR "=== $process\n"; - - my $target; - print "$target\n" if $target = readlink "$process/exe"; - print "$target\n" if $target = readlink "$process/cwd"; - - if (opendir FDS, "$process/fd") { - foreach my $name (readdir FDS) { - $target = readlink "$process/fd/$name"; - print "$target\n" if $target && substr($target, 0, 1) eq "/"; - } - closedir FDS; - } - - if (open MAP, "<$process/maps") { - while () { - next unless /^ \s* \S+ \s+ \S+ \s+ \S+ \s+ \S+ \s+ \S+ \s+ (\/\S+) \s* $/x; - print "$1\n"; - } - close MAP; - } - - # Get all store paths that appear in the environment of this process. - eval { - my $env = Nix::Utils::readFile "$process/environ"; - my @matches = $env =~ /\Q$Nix::Config::storeDir\E\/[0-9a-z]+[0-9a-zA-Z\+\-\._\?=]*/g; - print "$_\n" foreach @matches; - } - } - - closedir DIR; -} - - -sub lsof { - return unless open LSOF, "lsof -n -w -F n 2> /dev/null |"; - - while () { - next unless /^n (\/ .*)$/x; - print $1, "\n"; - } - - close LSOF; -} - - -readProc; -lsof; - - -sub printFile { - my ($fn) = @_; - if (-e $fn) { - print Nix::Utils::readFile($fn), "\n"; - } -} - - -# This is rather NixOS-specific, so it probably shouldn't be here. -printFile "/proc/sys/kernel/modprobe"; -printFile "/proc/sys/kernel/fbsplash"; -printFile "/proc/sys/kernel/poweroff_cmd"; diff --git a/scripts/install-nix-from-closure.sh b/scripts/install-nix-from-closure.sh deleted file mode 100644 index 33ceeb37e2..0000000000 --- a/scripts/install-nix-from-closure.sh +++ /dev/null @@ -1,117 +0,0 @@ -#! /usr/bin/env bash - -set -e - -dest="/nix" -self="$(dirname "$0")" -nix="@nix@" - -if ! [ -e $self/.reginfo ]; then - echo "$0: incomplete installer (.reginfo is missing)" >&2 - exit 1 -fi - -if [ -z "$USER" ]; then - echo "$0: \$USER is not set" >&2 - exit 1 -fi - -if [ "$(id -u)" -eq 0 ]; then - echo "warning: installing Nix as root is not recommended" >&2 - exit 1 -fi - -echo "performing a single-user installation of Nix..." >&2 - -if ! [ -e $dest ]; then - cmd="mkdir -m 0755 $dest && chown $USER $dest" - echo "directory $dest does not exist; creating it by running \`$cmd' using sudo" >&2 - if ! sudo sh -c "$cmd"; then - echo "$0: please manually run \`$cmd' as root to create $dest" >&2 - exit 1 - fi -fi - -if ! [ -w $dest ]; then - echo "$0: directory $dest exists, but is not writable by you; please run \`chown -R $USER $dest' as root" >&2 - exit 1 -fi - -mkdir -p $dest/store - -echo -n "copying Nix to $dest/store..." >&2 - -for i in $(cd $self/store && echo *); do - echo -n "." >&2 - i_tmp="$dest/store/$i.$$" - if [ -e "$i_tmp" ]; then - rm -rf "$i_tmp" - fi - if ! [ -e "$dest/store/$i" ]; then - cp -Rp "$self/store/$i" "$i_tmp" - mv "$i_tmp" "$dest/store/$i" - fi -done -echo "" >&2 - -echo "initialising Nix database..." >&2 -if ! $nix/bin/nix-store --init; then - echo "$0: failed to initialize the Nix database" >&2 - exit 1 -fi - -if ! $nix/bin/nix-store --load-db < $self/.reginfo; then - echo "$0: unable to register valid paths" >&2 - exit 1 -fi - -. $nix/etc/profile.d/nix.sh - -if ! $nix/bin/nix-env -i $nix; then - echo "$0: unable to install Nix into your default profile" >&2 - exit 1 -fi - -# Subscribe the user to the Nixpkgs channel and fetch it. -if ! $nix/bin/nix-channel --list | grep -q "^nixpkgs "; then - $nix/bin/nix-channel --add http://nixos.org/channels/nixpkgs-unstable -fi -$nix/bin/nix-channel --update nixpkgs - -# Make the shell source nix.sh during login. -p=$NIX_LINK/etc/profile.d/nix.sh - -added= -for i in .bash_profile .bash_login .profile; do - fn="$HOME/$i" - if [ -e "$fn" ]; then - if ! grep -q "$p" "$fn"; then - echo "modifying $fn..." >&2 - echo "if [ -e $p ]; then . $p; fi # added by Nix installer" >> $fn - fi - added=1 - break - fi -done - -if [ -z "$added" ]; then - cat >&2 <&2 < 1, TMPDIR => 1) - or die "cannot create a temporary directory"; - -my $outLink = "./result"; -my $drvLink = "$tmpDir/derivation"; - -# Ensure that the $tmpDir is deleted. -$SIG{'INT'} = sub { exit 1 }; - - -for (my $n = 0; $n < scalar @ARGV; $n++) { - my $arg = $ARGV[$n]; - - if ($arg eq "--help") { - exec "man $myName" or die; - } - - elsif ($arg eq "--version") { - print "$myName (Nix) $Nix::Config::version\n"; - exit 0; - } - - elsif ($arg eq "--add-drv-link") { - $drvLink = "./derivation"; - } - - elsif ($arg eq "--no-out-link" || $arg eq "--no-link") { - $outLink = "$tmpDir/result"; - } - - elsif ($arg eq "--drv-link") { - $n++; - die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV; - $drvLink = $ARGV[$n]; - } - - elsif ($arg eq "--out-link" || $arg eq "-o") { - $n++; - die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV; - $outLink = $ARGV[$n]; - } - - elsif ($arg eq "--attr" || $arg eq "-A" || $arg eq "-I") { - $n++; - die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV; - push @instArgs, ($arg, $ARGV[$n]); - } - - elsif ($arg eq "--arg" || $arg eq "--argstr") { - die "$0: `$arg' requires two arguments\n" unless $n + 2 < scalar @ARGV; - push @instArgs, ($arg, $ARGV[$n + 1], $ARGV[$n + 2]); - $n += 2; - } - - elsif ($arg eq "--log-type") { - $n++; - die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV; - push @instArgs, ($arg, $ARGV[$n]); - push @buildArgs, ($arg, $ARGV[$n]); - } - - elsif ($arg eq "--option") { - die "$0: `$arg' requires two arguments\n" unless $n + 2 < scalar @ARGV; - push @instArgs, ($arg, $ARGV[$n + 1], $ARGV[$n + 2]); - push @buildArgs, ($arg, $ARGV[$n + 1], $ARGV[$n + 2]); - $n += 2; - } - - elsif ($arg eq "--max-jobs" || $arg eq "-j" || $arg eq "--max-silent-time" || $arg eq "--log-type" || $arg eq "--cores" || $arg eq "--timeout") { - $n++; - die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV; - push @buildArgs, ($arg, $ARGV[$n]); - } - - elsif ($arg eq "--dry-run") { - push @buildArgs, "--dry-run"; - $dryRun = 1; - } - - elsif ($arg eq "--show-trace") { - push @instArgs, $arg; - } - - elsif ($arg eq "-") { - @exprs = ("-"); - } - - elsif ($arg eq "--verbose" || substr($arg, 0, 2) eq "-v") { - push @buildArgs, $arg; - push @instArgs, $arg; - $verbose = 1; - } - - elsif ($arg eq "--quiet" || $arg eq "--repair") { - push @buildArgs, $arg; - push @instArgs, $arg; - } - - elsif ($arg eq "--check") { - push @buildArgs, $arg; - } - - elsif ($arg eq "--run-env") { # obsolete - $runEnv = 1; - } - - elsif ($arg eq "--command") { - $n++; - die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV; - $envCommand = "$ARGV[$n]\nexit $!"; - } - - elsif ($arg eq "--exclude") { - $n++; - die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV; - push @envExclude, $ARGV[$n]; - } - - elsif ($arg eq "--pure") { $pure = 1; } - elsif ($arg eq "--impure") { $pure = 0; } - - elsif ($arg eq "--expr" || $arg eq "-E") { - $fromArgs = 1; - push @instArgs, "--expr"; - } - - elsif ($arg eq "--packages" || $arg eq "-p") { - $packages = 1; - } - - elsif (substr($arg, 0, 1) eq "-") { - push @buildArgs, $arg; - } - - else { - push @exprs, $arg; - } -} - -if ($packages) { - push @instArgs, "--expr"; - @exprs = ( - 'with import { }; runCommand "shell" { buildInputs = [ ' - . (join " ", map { "($_)" } @exprs) . ']; } ""'); -} elsif (!$fromArgs) { - @exprs = ("shell.nix") if scalar @exprs == 0 && $runEnv && -e "shell.nix"; - @exprs = ("default.nix") if scalar @exprs == 0; -} - -$ENV{'IN_NIX_SHELL'} = 1 if $runEnv; - - -foreach my $expr (@exprs) { - - # Instantiate. - my @drvPaths; - if ($expr !~ /^\/.*\.drv$/) { - # !!! would prefer the perl 5.8.0 pipe open feature here. - my $pid = open(DRVPATHS, "-|") || exec "$Nix::Config::binDir/nix-instantiate", "--add-root", $drvLink, "--indirect", @instArgs, $expr; - while () {chomp; push @drvPaths, $_;} - if (!close DRVPATHS) { - die "nix-instantiate killed by signal " . ($? & 127) . "\n" if ($? & 127); - exit 1; - } - } else { - push @drvPaths, $expr; - } - - if ($runEnv) { - die "$0: a single derivation is required\n" if scalar @drvPaths != 1; - my $drvPath = $drvPaths[0]; - $drvPath = (split '!',$drvPath)[0]; - $drvPath = readlink $drvPath or die "cannot read symlink `$drvPath'" if -l $drvPath; - my $drv = derivationFromPath($drvPath); - - # Build or fetch all dependencies of the derivation. - my @inputDrvs = grep { my $x = $_; (grep { $x =~ $_ } @envExclude) == 0 } @{$drv->{inputDrvs}}; - system("$Nix::Config::binDir/nix-store", "-r", "--no-output", "--no-gc-warning", @buildArgs, @inputDrvs, @{$drv->{inputSrcs}}) == 0 - or die "$0: failed to build all dependencies\n"; - - # Set the environment. - if ($pure) { - foreach my $name (keys %ENV) { - next if grep { $_ eq $name } ("HOME", "USER", "LOGNAME", "DISPLAY", "PATH", "TERM", "IN_NIX_SHELL", "TZ"); - delete $ENV{$name}; - } - # NixOS hack: prevent /etc/bashrc from sourcing /etc/profile. - $ENV{'__ETC_PROFILE_SOURCED'} = 1; - } - $ENV{'NIX_BUILD_TOP'} = $ENV{'TMPDIR'} = $ENV{'TEMPDIR'} = $ENV{'TMP'} = $ENV{'TEMP'} = $ENV{'TMPDIR'} // "/tmp"; - $ENV{'NIX_STORE'} = $Nix::Config::storeDir; - $ENV{$_} = $drv->{env}->{$_} foreach keys %{$drv->{env}}; - - # Run a shell using the derivation's environment. For - # convenience, source $stdenv/setup to setup additional - # environment variables and shell functions. Also don't lose - # the current $PATH directories. - my $rcfile = "$tmpDir/rc"; - writeFile( - $rcfile, - "rm -rf '$tmpDir'; " . - 'unset BASH_ENV; ' . - '[ -n "$PS1" ] && [ -e ~/.bashrc ] && source ~/.bashrc; ' . - ($pure ? '' : 'p=$PATH; ' ) . - 'dontAddDisableDepTrack=1; ' . - '[ -e $stdenv/setup ] && source $stdenv/setup; ' . - 'if [ "$(type -t runHook)" = function ]; then runHook shellHook; fi; ' . - ($pure ? '' : 'PATH=$PATH:$p; unset p; ') . - 'set +e; ' . - '[ -n "$PS1" ] && PS1="\n\[\033[1;32m\][nix-shell:\w]$\[\033[0m\] "; ' . - 'unset NIX_ENFORCE_PURITY; ' . - 'unset NIX_INDENT_MAKE; ' . - 'shopt -u nullglob; ' . - 'unset TZ; ' . (defined $ENV{'TZ'} ? "export TZ='${ENV{'TZ'}}'; " : '') . - $envCommand); - $ENV{BASH_ENV} = $rcfile; - exec($ENV{NIX_BUILD_SHELL} // "bash", "--rcfile", $rcfile); - die; - } - - # Ugly hackery to make "nix-build -A foo.all" produce symlinks - # ./result, ./result-dev, and so on, rather than ./result, - # ./result-2-dev, and so on. This combines multiple derivation - # paths into one "/nix/store/drv-path!out1,out2,..." argument. - my $prevDrvPath = ""; - my @drvPaths2; - foreach my $drvPath (@drvPaths) { - my $p = $drvPath; my $output = "out"; - if ($drvPath =~ /(.*)!(.*)/) { - $p = $1; $output = $2; - } else { - $p = $drvPath; - } - my $target = readlink $p or die "cannot read symlink `$p'"; - print STDERR "derivation is $target\n" if $verbose; - if ($target eq $prevDrvPath) { - push @drvPaths2, (pop @drvPaths2) . "," . $output; - } else { - push @drvPaths2, $target . "!" . $output; - $prevDrvPath = $target; - } - } - - # Build. - my @outPaths; - my $pid = open(OUTPATHS, "-|") || exec "$Nix::Config::binDir/nix-store", "--add-root", $outLink, "--indirect", "-r", - @buildArgs, @drvPaths2; - while () {chomp; push @outPaths, $_;} - if (!close OUTPATHS) { - die "nix-store killed by signal " . ($? & 127) . "\n" if ($? & 127); - exit 1; - } - - next if $dryRun; - - foreach my $outPath (@outPaths) { - my $target = readlink $outPath or die "cannot read symlink `$outPath'"; - print "$target\n"; - } -} diff --git a/scripts/nix-channel.in b/scripts/nix-channel.in deleted file mode 100755 index 62292a87fd..0000000000 --- a/scripts/nix-channel.in +++ /dev/null @@ -1,209 +0,0 @@ -#! @perl@ -w @perlFlags@ - -use strict; -use File::Basename; -use File::Path qw(mkpath); -use Nix::Config; -use Nix::Manifest; - -Nix::Config::readConfig; - -my $manifestDir = $Nix::Config::manifestDir; - - -# Turn on caching in nix-prefetch-url. -my $channelCache = "$Nix::Config::stateDir/channel-cache"; -mkdir $channelCache, 0755 unless -e $channelCache; -$ENV{'NIX_DOWNLOAD_CACHE'} = $channelCache if -W $channelCache; - -# Figure out the name of the `.nix-channels' file to use. -my $home = $ENV{"HOME"} or die '$HOME not set\n'; -my $channelsList = "$home/.nix-channels"; -my $nixDefExpr = "$home/.nix-defexpr"; - -# Figure out the name of the channels profile. -my $userName = getpwuid($<) || $ENV{"USER"} or die "cannot figure out user name"; -my $profile = "$Nix::Config::stateDir/profiles/per-user/$userName/channels"; -mkpath(dirname $profile, 0, 0755); - -my %channels; - - -# Reads the list of channels. -sub readChannels { - return if (!-f $channelsList); - open CHANNELS, "<$channelsList" or die "cannot open `$channelsList': $!"; - while () { - chomp; - next if /^\s*\#/; - my ($url, $name) = split ' ', $_; - $url =~ s/\/*$//; # remove trailing slashes - $name = basename $url unless defined $name; - $channels{$name} = $url; - } - close CHANNELS; -} - - -# Writes the list of channels. -sub writeChannels { - open CHANNELS, ">$channelsList" or die "cannot open `$channelsList': $!"; - foreach my $name (keys %channels) { - print CHANNELS "$channels{$name} $name\n"; - } - close CHANNELS; -} - - -# Adds a channel. -sub addChannel { - my ($url, $name) = @_; - readChannels; - $channels{$name} = $url; - writeChannels; -} - - -# Remove a channel. -sub removeChannel { - my ($name) = @_; - readChannels; - my $url = $channels{$name}; - deleteOldManifests($url . "/MANIFEST", undef) if defined $url; - delete $channels{$name}; - writeChannels; - - system("$Nix::Config::binDir/nix-env --profile '$profile' -e '$name'") == 0 - or die "cannot remove channel `$name'\n"; -} - - -# Fetch Nix expressions and pull manifests from the subscribed -# channels. -sub update { - my @channelNames = @_; - - readChannels; - - # Download each channel. - my $exprs = ""; - foreach my $name (keys %channels) { - next if scalar @channelNames > 0 && ! grep { $_ eq $name } @{channelNames}; - - my $url = $channels{$name}; - my $origUrl = "$url/MANIFEST"; - - # Check if $url is a redirect. If so, follow it now to ensure - # consistency if the redirection is changed between - # downloading the manifest and the tarball. - my $headers = `$Nix::Config::curl --silent --head '$url'`; - die "$0: unable to check `$url'\n" if $? != 0; - $headers =~ s/\r//g; - $url = $1 if $headers =~ /^Location:\s*(.*)\s*$/m; - - # Check if the channel advertises a binary cache. - my $binaryCacheURL = `$Nix::Config::curl --silent '$url'/binary-cache-url`; - my $extraAttrs = ""; - my $getManifest = ($Nix::Config::config{"force-manifest"} // "false") eq "true"; - if ($? == 0 && $binaryCacheURL ne "") { - $extraAttrs .= "binaryCacheURL = \"$binaryCacheURL\"; "; - deleteOldManifests($origUrl, undef); - } else { - $getManifest = 1; - } - - if ($getManifest) { - # No binary cache, so pull the channel manifest. - mkdir $manifestDir, 0755 unless -e $manifestDir; - die "$0: you do not have write permission to `$manifestDir'!\n" unless -W $manifestDir; - $ENV{'NIX_ORIG_URL'} = $origUrl; - system("$Nix::Config::binDir/nix-pull", "--skip-wrong-store", "$url/MANIFEST") == 0 - or die "cannot pull manifest from `$url'\n"; - } - - # Download the channel tarball. - my $fullURL = "$url/nixexprs.tar.xz"; - system("$Nix::Config::curl --fail --silent --head '$fullURL' > /dev/null") == 0 or - $fullURL = "$url/nixexprs.tar.bz2"; - print STDERR "downloading Nix expressions from `$fullURL'...\n"; - my ($hash, $path) = `PRINT_PATH=1 QUIET=1 $Nix::Config::binDir/nix-prefetch-url '$fullURL'`; - die "cannot fetch `$fullURL'\n" if $? != 0; - chomp $path; - - # If the URL contains a version number, append it to the name - # attribute (so that "nix-env -q" on the channels profile - # shows something useful). - my $cname = $name; - $cname .= $1 if basename($url) =~ /(-\d.*)$/; - - $exprs .= "'f: f { name = \"$cname\"; channelName = \"$name\"; src = builtins.storePath \"$path\"; $extraAttrs }' "; - } - - # Unpack the channel tarballs into the Nix store and install them - # into the channels profile. - print STDERR "unpacking channels...\n"; - system("$Nix::Config::binDir/nix-env --profile '$profile' " . - "-f '' -i -E $exprs --quiet") == 0 - or die "cannot unpack the channels"; - - # Make the channels appear in nix-env. - unlink $nixDefExpr if -l $nixDefExpr; # old-skool ~/.nix-defexpr - mkdir $nixDefExpr or die "cannot create directory `$nixDefExpr'" if !-e $nixDefExpr; - my $channelLink = "$nixDefExpr/channels"; - unlink $channelLink; # !!! not atomic - symlink($profile, $channelLink) or die "cannot symlink `$channelLink' to `$profile'"; -} - - -die "$0: argument expected\n" if scalar @ARGV == 0; - - -while (scalar @ARGV) { - my $arg = shift @ARGV; - - if ($arg eq "--add") { - die "$0: `--add' requires one or two arguments\n" if scalar @ARGV < 1 || scalar @ARGV > 2; - my $url = shift @ARGV; - my $name = shift @ARGV; - unless (defined $name) { - $name = basename $url; - $name =~ s/-unstable//; - $name =~ s/-stable//; - } - addChannel($url, $name); - last; - } - - if ($arg eq "--remove") { - die "$0: `--remove' requires one argument\n" if scalar @ARGV != 1; - removeChannel(shift @ARGV); - last; - } - - if ($arg eq "--list") { - die "$0: `--list' requires one argument\n" if scalar @ARGV != 0; - readChannels; - foreach my $name (keys %channels) { - print "$name $channels{$name}\n"; - } - last; - } - - elsif ($arg eq "--update") { - update(@ARGV); - last; - } - - elsif ($arg eq "--help") { - exec "man nix-channel" or die; - } - - elsif ($arg eq "--version") { - print "nix-channel (Nix) $Nix::Config::version\n"; - exit 0; - } - - else { - die "unknown argument `$arg'; try `--help'\n"; - } -} diff --git a/scripts/nix-collect-garbage.in b/scripts/nix-collect-garbage.in deleted file mode 100755 index 55e0ba7a6f..0000000000 --- a/scripts/nix-collect-garbage.in +++ /dev/null @@ -1,65 +0,0 @@ -#! @perl@ -w @perlFlags@ - -use strict; -use Nix::Config; - -my $profilesDir = "@localstatedir@/nix/profiles"; - - -# Process the command line arguments. -my @args = (); -my $arg; - -my $removeOld = 0; -my $gen; -my $dryRun = 0; - -while ($arg = shift) { - if ($arg eq "--delete-old" || $arg eq "-d") { - $removeOld = 1; - $gen = "old"; - } elsif ($arg eq "--delete-older-than") { - $removeOld = 1; - $gen = shift; - } elsif ($arg eq "--dry-run") { - $dryRun = 1; - } elsif ($arg eq "--help") { - exec "man nix-collect-garbage" or die; - } else { - push @args, $arg; - } -} - - -# If `-d' was specified, remove all old generations of all profiles. -# Of course, this makes rollbacks to before this point in time -# impossible. - -sub removeOldGenerations; -sub removeOldGenerations { - my $dir = shift; - - my $dh; - opendir $dh, $dir or die; - - foreach my $name (sort (readdir $dh)) { - next if $name eq "." || $name eq ".."; - $name = $dir . "/" . $name; - if (-l $name && (readlink($name) =~ /link/)) { - print STDERR "removing old generations of profile $name\n"; - - system("$Nix::Config::binDir/nix-env", "-p", $name, "--delete-generations", $gen, $dryRun ? "--dry-run" : ()); - } - elsif (! -l $name && -d $name) { - removeOldGenerations $name; - } - } - - closedir $dh or die; -} - -removeOldGenerations $profilesDir if $removeOld; - - -# Run the actual garbage collector. -exec "$Nix::Config::binDir/nix-store", "--gc", @args unless $dryRun; diff --git a/scripts/nix-copy-closure.in b/scripts/nix-copy-closure.in deleted file mode 100755 index 23d5619519..0000000000 --- a/scripts/nix-copy-closure.in +++ /dev/null @@ -1,131 +0,0 @@ -#! @perl@ -w @perlFlags@ - -use Nix::SSH; -use Nix::Config; -use Nix::Store; -use Nix::CopyClosure; -use List::Util qw(sum); - - -if (scalar @ARGV < 1) { - print STDERR <) { - chomp; - die "bad: $_" unless /^\//; - push @missing, $_ unless isValidPath($_); - } - - close READ or die "nix-store on remote machine `$sshHost' failed: $?"; - - my $missingSize = 0; - if ($progressViewer ne "") { - $missingSize = sum (split ' ', `set -f; ssh @sshOpts $sshHost nix-store -q --size @missing`) or die; - } - - # Export the store paths on the remote machine and import them locally. - if (scalar @missing > 0) { - print STDERR "copying ", scalar @missing, " missing paths from ‘$sshHost’...\n"; - unless ($dryRun) { - if ($useSubstitutes) { - system "$Nix::Config::binDir/nix-store -r --ignore-unknown @missing"; - } - $compressor = "| $compressor" if $compressor ne ""; - $decompressor = "$decompressor |" if $decompressor ne ""; - $progressViewer = "$progressViewer -s $missingSize |" if $progressViewer ne ""; - my $extraOpts = $sign ? "--sign" : ""; - system("set -f; ssh $sshHost @sshOpts 'nix-store --export $extraOpts @missing $compressor' | $decompressor $progressViewer $Nix::Config::binDir/nix-store --import > /dev/null") == 0 - or die "copying store paths from remote machine `$sshHost' failed: $?"; - } - } - -} diff --git a/scripts/nix-generate-patches.in b/scripts/nix-generate-patches.in deleted file mode 100755 index 969af916d8..0000000000 --- a/scripts/nix-generate-patches.in +++ /dev/null @@ -1,52 +0,0 @@ -#! @perl@ -w @perlFlags@ - -use strict; -use File::Temp qw(tempdir); -use Nix::Manifest; -use Nix::GeneratePatches; - -if (scalar @ARGV != 5) { - print STDERR < 1, TMPDIR => 1) - or die "cannot create a temporary directory"; - -generatePatches \%srcNarFiles, \%dstNarFiles, \%srcPatches, \%dstPatches, - $narPath, $patchesPath, $patchesURL, $tmpDir; - -propagatePatches \%srcPatches, \%dstNarFiles, \%dstPatches; - -# Optionally add all new patches to the manifest in $NIX_ALL_PATCHES. -my $allPatchesFile = $ENV{"NIX_ALL_PATCHES"}; -if (defined $allPatchesFile) { - my (%dummy, %allPatches); - readManifest("$patchesPath/all-patches", \%dummy, \%allPatches) - if -f $allPatchesFile; - copyPatches \%dstPatches, \%allPatches; - writeManifest($allPatchesFile, {}, \%allPatches, 0); -} - -writeManifest $dstManifest, \%dstNarFiles, \%dstPatches; diff --git a/scripts/nix-http-export.cgi.in b/scripts/nix-http-export.cgi.in deleted file mode 100755 index 19a505af1c..0000000000 --- a/scripts/nix-http-export.cgi.in +++ /dev/null @@ -1,51 +0,0 @@ -#! /bin/sh - -export HOME=/tmp -export NIX_REMOTE=daemon - -TMP_DIR="${TMP_DIR:-/tmp/nix-export}" - -@coreutils@/mkdir -p "$TMP_DIR" || true -@coreutils@/chmod a+r "$TMP_DIR" - -needed_path="?$QUERY_STRING" -needed_path="${needed_path#*[?&]needed_path=}" -needed_path="${needed_path%%&*}" -#needed_path="$(echo $needed_path | ./unhttp)" -needed_path="${needed_path//%2B/+}" -needed_path="${needed_path//%3D/=}" - -echo needed_path: "$needed_path" >&2 - -NIX_STORE="${NIX_STORE_DIR:-/nix/store}" - -echo NIX_STORE: "${NIX_STORE}" >&2 - -full_path="${NIX_STORE}"/"$needed_path" - -if [ "$needed_path" != "${needed_path%.drv}" ]; then - echo "Status: 403 You should create the derivation file yourself" - echo "Content-Type: text/plain" - echo - echo "Refusing to disclose derivation contents" - exit -fi - -if @bindir@/nix-store --check-validity "$full_path"; then - if ! [ -e nix-export/"$needed_path".nar.gz ]; then - @bindir@/nix-store --export "$full_path" | @gzip@ > "$TMP_DIR"/"$needed_path".nar.gz - @coreutils@/ln -fs "$TMP_DIR"/"$needed_path".nar.gz nix-export/"$needed_path".nar.gz - fi; - echo "Status: 301 Moved" - echo "Location: nix-export/"$needed_path".nar.gz" - echo -else - echo "Status: 404 No such path found" - echo "Content-Type: text/plain" - echo - echo "Path not found:" - echo "$needed_path" - echo "checked:" - echo "$full_path" -fi - diff --git a/scripts/nix-install-package.in b/scripts/nix-install-package.in deleted file mode 100755 index e45337bcc9..0000000000 --- a/scripts/nix-install-package.in +++ /dev/null @@ -1,138 +0,0 @@ -#! @perl@ -w @perlFlags@ - -use strict; -use File::Temp qw(tempdir); -use Nix::Config; -use Nix::Utils; - - -# Parse the command line arguments. -my @args = @ARGV; - -my $source; -my $fromURL = 0; -my @extraNixEnvArgs = (); -my $interactive = 1; - -while (scalar @args) { - my $arg = shift @args; - if ($arg eq "--help") { - exec "man nix-install-package" or die; - } - elsif ($arg eq "--url") { - $fromURL = 1; - } - elsif ($arg eq "--profile" || $arg eq "-p") { - my $profile = shift @args; - die "$0: `--profile' requires an argument\n" if !defined $profile; - push @extraNixEnvArgs, "-p", $profile; - } - elsif ($arg eq "--non-interactive") { - $interactive = 0; - } - else { - $source = $arg; - } -} - -die "$0: please specify a .nixpkg file or URL\n" unless defined $source; - - -# Re-execute in a terminal, if necessary, so that if we're executed -# from a web browser, the user gets to see us. -if ($interactive && !defined $ENV{"NIX_HAVE_TERMINAL"}) { - $ENV{"NIX_HAVE_TERMINAL"} = "1"; - $ENV{"LD_LIBRARY_PATH"} = ""; - foreach my $term ("xterm", "konsole", "gnome-terminal", "xterm") { - exec($term, "-e", "$Nix::Config::binDir/nix-install-package", @ARGV); - } - die "cannot execute `xterm'"; -} - - -my $tmpDir = tempdir("nix-install-package.XXXXXX", CLEANUP => 1, TMPDIR => 1) - or die "cannot create a temporary directory"; - - -sub barf { - my $msg = shift; - print "\nInstallation failed: $msg\n"; - if $interactive; - exit 1; -} - - -# Download the package description, if necessary. -my $pkgFile = $source; -if ($fromURL) { - $pkgFile = "$tmpDir/tmp.nixpkg"; - system("@curl@", "--silent", $source, "-o", $pkgFile) == 0 - or barf "curl failed: $?"; -} - - -# Read and parse the package file. -open PKGFILE, "<$pkgFile" or barf "cannot open `$pkgFile': $!"; -my $contents = ; -close PKGFILE; - -my $nameRE = "(?: [A-Za-z0-9\+\-\.\_\?\=]+ )"; # see checkStoreName() -my $systemRE = "(?: [A-Za-z0-9\+\-\_]+ )"; -my $pathRE = "(?: \/ [\/A-Za-z0-9\+\-\.\_\?\=]* )"; - -# Note: $pathRE doesn't check that whether we're looking at a valid -# store path. We'll let nix-env do that. - -$contents =~ - / ^ \s* (\S+) \s+ ($Nix::Utils::urlRE) \s+ ($nameRE) \s+ ($systemRE) \s+ ($pathRE) \s+ ($pathRE) ( \s+ ($Nix::Utils::urlRE) )? /x - or barf "invalid package contents"; -my $version = $1; -my $manifestURL = $2; -my $drvName = $3; -my $system = $4; -my $drvPath = $5; -my $outPath = $6; -my $binaryCacheURL = $8; - -barf "invalid package version `$version'" unless $version eq "NIXPKG1"; - - -if ($interactive) { - # Ask confirmation. - print "Do you want to install `$drvName' (Y/N)? "; - my $reply = ; - chomp $reply; - exit if $reply ne "y" && $reply ne "Y"; -} - - -if (defined $binaryCacheURL) { - - push @extraNixEnvArgs, "--option", "binary-caches", $binaryCacheURL; - -} else { - - # Store the manifest in the temporary directory so that we don't - # pollute /nix/var/nix/manifests. This also requires that we - # don't use the Nix daemon (because otherwise - # download-using-manifests won't see our NIX_MANIFESTS_DIRS - # environment variable). - $ENV{NIX_MANIFESTS_DIR} = $tmpDir; - $ENV{NIX_REMOTE} = ""; - - print "\nPulling manifests...\n"; - system("$Nix::Config::binDir/nix-pull", $manifestURL) == 0 - or barf "nix-pull failed: $?"; - -} - - -print "\nInstalling package...\n"; -system("$Nix::Config::binDir/nix-env", "--install", $outPath, "--force-name", $drvName, @extraNixEnvArgs) == 0 - or barf "nix-env failed: $?"; - - -if ($interactive) { - print "\nInstallation succeeded! Press Enter to continue.\n"; - ; -} diff --git a/scripts/nix-prefetch-url.in b/scripts/nix-prefetch-url.in deleted file mode 100755 index bcd9197bcf..0000000000 --- a/scripts/nix-prefetch-url.in +++ /dev/null @@ -1,130 +0,0 @@ -#! @perl@ -w @perlFlags@ - -use strict; -use File::Basename; -use File::Temp qw(tempdir); -use File::stat; -use Nix::Store; -use Nix::Config; -use Nix::Utils; - -my $hashType = $ENV{'NIX_HASH_ALGO'} || "sha256"; # obsolete -my $cacheDir = $ENV{'NIX_DOWNLOAD_CACHE'}; - -my @args; -my $arg; -while ($arg = shift) { - if ($arg eq "--help") { - exec "man nix-prefetch-url" or die; - } elsif ($arg eq "--type") { - $hashType = shift; - die "$0: `$arg' requires an argument\n" unless defined $hashType; - } elsif (substr($arg, 0, 1) eq "-") { - die "$0: unknown flag `$arg'\n"; - } else { - push @args, $arg; - } -} - -my $url = $args[0]; -my $expHash = $args[1]; - - -if (!defined $url || $url eq "") { - print STDERR < 1, TMPDIR => 1) - or die "cannot create a temporary directory"; - -# Hack to support the mirror:// scheme from Nixpkgs. -if ($url =~ /^mirror:\/\//) { - system("$Nix::Config::binDir/nix-build '' -A resolveMirrorURLs --argstr url '$url' -o $tmpDir/urls > /dev/null") == 0 - or die "$0: nix-build failed; maybe \$NIX_PATH is not set properly\n"; - my @expanded = split ' ', readFile("$tmpDir/urls"); - die "$0: cannot resolve ‘$url’" unless scalar @expanded > 0; - print STDERR "$url expands to $expanded[0]\n"; - $url = $expanded[0]; -} - -# Handle escaped characters in the URI. `+', `=' and `?' are the only -# characters that are valid in Nix store path names but have a special -# meaning in URIs. -my $name = basename $url; -die "cannot figure out file name for ‘$url’\n" if $name eq ""; -$name =~ s/%2b/+/g; -$name =~ s/%3d/=/g; -$name =~ s/%3f/?/g; - -my $finalPath; -my $hash; - -# If the hash was given, a file with that hash may already be in the -# store. -if (defined $expHash) { - $finalPath = makeFixedOutputPath(0, $hashType, $expHash, $name); - if (isValidPath($finalPath)) { $hash = $expHash; } else { $finalPath = undef; } -} - -# If we don't know the hash or a file with that hash doesn't exist, -# download the file and add it to the store. -if (!defined $finalPath) { - - my $tmpFile = "$tmpDir/$name"; - - # Optionally do timestamp-based caching of the download. - # Actually, the only thing that we cache in $NIX_DOWNLOAD_CACHE is - # the hash and the timestamp of the file at $url. The caching of - # the file *contents* is done in Nix store, where it can be - # garbage-collected independently. - my ($cachedTimestampFN, $cachedHashFN, @cacheFlags); - if (defined $cacheDir) { - my $urlHash = hashString("sha256", 1, $url); - writeFile "$cacheDir/$urlHash.url", $url; - $cachedHashFN = "$cacheDir/$urlHash.$hashType"; - $cachedTimestampFN = "$cacheDir/$urlHash.stamp"; - @cacheFlags = ("--time-cond", $cachedTimestampFN) if -f $cachedHashFN && -f $cachedTimestampFN; - } - - # Perform the download. - my @curlFlags = ("curl", $url, "-o", $tmpFile, "--fail", "--location", "--max-redirs", "20", "--disable-epsv", "--cookie-jar", "$tmpDir/cookies", "--remote-time", (split " ", ($ENV{NIX_CURL_FLAGS} || ""))); - (system $Nix::Config::curl @curlFlags, @cacheFlags) == 0 or die "$0: download of ‘$url’ failed\n"; - - if (defined $cacheDir && ! -e $tmpFile) { - # Curl didn't create $tmpFile, so apparently there's no newer - # file on the server. - $hash = readFile $cachedHashFN or die; - $finalPath = makeFixedOutputPath(0, $hashType, $hash, $name); - unless (isValidPath $finalPath) { - print STDERR "cached contents of ‘$url’ disappeared, redownloading...\n"; - $finalPath = undef; - (system $Nix::Config::curl @curlFlags) == 0 or die "$0: download of ‘$url’ failed\n"; - } - } - - if (!defined $finalPath) { - - # Compute the hash. - $hash = hashFile($hashType, $hashType ne "md5", $tmpFile); - - if (defined $cacheDir) { - writeFile $cachedHashFN, $hash; - my $st = stat($tmpFile) or die; - open STAMP, ">$cachedTimestampFN" or die; close STAMP; - utime($st->atime, $st->mtime, $cachedTimestampFN) or die; - } - - # Add the downloaded file to the Nix store. - $finalPath = addToStore($tmpFile, 0, $hashType); - } - - die "$0: hash mismatch for ‘$url’\n" if defined $expHash && $expHash ne $hash; -} - -print STDERR "path is ‘$finalPath’\n" unless $ENV{'QUIET'}; -print "$hash\n"; -print "$finalPath\n" if $ENV{'PRINT_PATH'}; diff --git a/scripts/nix-profile.sh.in b/scripts/nix-profile.sh.in deleted file mode 100644 index 5d682fc51a..0000000000 --- a/scripts/nix-profile.sh.in +++ /dev/null @@ -1,22 +0,0 @@ -if test -n "$HOME"; then - NIX_LINK="$HOME/.nix-profile" - - # Set the default profile. - if ! [ -L "$NIX_LINK" ]; then - echo "creating $NIX_LINK" >&2 - _NIX_DEF_LINK=@localstatedir@/nix/profiles/default - @coreutils@/ln -s "$_NIX_DEF_LINK" "$NIX_LINK" - fi - - export PATH=$NIX_LINK/bin:$NIX_LINK/sbin:$PATH - - # Subscribe the root user to the Nixpkgs channel by default. - if [ ! -e $HOME/.nix-channels ]; then - echo "http://nixos.org/channels/nixpkgs-unstable nixpkgs" > $HOME/.nix-channels - fi - - # Append ~/.nix-defexpr/channels/nixpkgs to $NIX_PATH so that - # paths work when the user has fetched the Nixpkgs - # channel. - export NIX_PATH=${NIX_PATH:+$NIX_PATH:}nixpkgs=$HOME/.nix-defexpr/channels/nixpkgs -fi diff --git a/scripts/nix-pull.in b/scripts/nix-pull.in deleted file mode 100755 index 58dd2cf27e..0000000000 --- a/scripts/nix-pull.in +++ /dev/null @@ -1,103 +0,0 @@ -#! @perl@ -w @perlFlags@ - -use strict; -use File::Temp qw(tempdir); -use Nix::Config; -use Nix::Manifest; - -my $tmpDir = tempdir("nix-pull.XXXXXX", CLEANUP => 1, TMPDIR => 1) - or die "cannot create a temporary directory"; - -my $manifestDir = $Nix::Config::manifestDir; - - -# Prevent access problems in shared-stored installations. -umask 0022; - - -# Create the manifests directory if it doesn't exist. -if (! -e $manifestDir) { - mkdir $manifestDir, 0755 or die "cannot create directory `$manifestDir'"; -} - - -# Make sure that the manifests directory is scanned for GC roots. -my $gcRootsDir = "$Nix::Config::stateDir/gcroots"; -my $manifestDirLink = "$gcRootsDir/manifests"; -if (! -l $manifestDirLink) { - symlink($manifestDir, $manifestDirLink) or die "cannot create symlink `$manifestDirLink'"; -} - - -# Process the URLs specified on the command line. - -sub downloadFile { - my $url = shift; - $ENV{"PRINT_PATH"} = 1; - $ENV{"QUIET"} = 1; - my ($dummy, $path) = `$Nix::Config::binDir/nix-prefetch-url '$url'`; - die "cannot fetch `$url'" if $? != 0; - die "nix-prefetch-url did not return a path" unless defined $path; - chomp $path; - return $path; -} - -sub processURL { - my $url = shift; - - $url =~ s/\/$//; - - my $manifest; - - my $origUrl = $ENV{'NIX_ORIG_URL'} || $url; - - # First see if a bzipped manifest is available. - if (system("$Nix::Config::curl --fail --silent --location --head '$url'.bz2 > /dev/null") == 0) { - print "fetching list of Nix archives at `$url.bz2'...\n"; - $manifest = downloadFile "$url.bz2"; - } - - # Otherwise, just get the uncompressed manifest. - else { - print "fetching list of Nix archives at `$url'...\n"; - $manifest = downloadFile $url; - } - - my $baseName = "unnamed"; - if ($url =~ /\/([^\/]+)\/[^\/]+$/) { # get the forelast component - $baseName = $1; - } - - my $hash = `$Nix::Config::binDir/nix-hash --flat '$manifest'` - or die "cannot hash `$manifest'"; - chomp $hash; - - my $urlFile = "$manifestDir/$baseName-$hash.url"; - open URL, ">$urlFile" or die "cannot create `$urlFile'"; - print URL $origUrl; - close URL; - - my $finalPath = "$manifestDir/$baseName-$hash.nixmanifest"; - - unlink $finalPath if -e $finalPath; - - symlink("$manifest", "$finalPath") - or die "cannot link `$finalPath to `$manifest'"; - - deleteOldManifests($origUrl, $urlFile); -} - -while (@ARGV) { - my $url = shift @ARGV; - if ($url eq "--help") { - exec "man nix-pull" or die; - } elsif ($url eq "--skip-wrong-store") { - # No-op, no longer supported. - } else { - processURL $url; - } -} - - -# Update the cache. -updateManifestDB(); diff --git a/scripts/nix-push.in b/scripts/nix-push.in deleted file mode 100755 index bdd128a6f5..0000000000 --- a/scripts/nix-push.in +++ /dev/null @@ -1,293 +0,0 @@ -#! @perl@ -w @perlFlags@ - -use strict; -use File::Basename; -use File::Temp qw(tempdir); -use File::Path qw(mkpath); -use File::stat; -use File::Copy; -use Nix::Config; -use Nix::Store; -use Nix::Manifest; -use Nix::Utils; -use Nix::Crypto; - -my $tmpDir = tempdir("nix-push.XXXXXX", CLEANUP => 1, TMPDIR => 1) - or die "cannot create a temporary directory"; - -my $nixExpr = "$tmpDir/create-nars.nix"; - - -# Parse the command line. -my $compressionType = "xz"; -my $force = 0; -my $destDir; -my $writeManifest = 0; -my $manifestPath; -my $archivesURL; -my $link = 0; -my $privateKeyFile; -my $keyName; -my @roots; - -for (my $n = 0; $n < scalar @ARGV; $n++) { - my $arg = $ARGV[$n]; - - if ($arg eq "--help") { - exec "man nix-push" or die; - } elsif ($arg eq "--bzip2") { - $compressionType = "bzip2"; - } elsif ($arg eq "--none") { - $compressionType = "none"; - } elsif ($arg eq "--force") { - $force = 1; - } elsif ($arg eq "--dest") { - $n++; - die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV; - $destDir = $ARGV[$n]; - mkpath($destDir, 0, 0755); - } elsif ($arg eq "--manifest") { - $writeManifest = 1; - } elsif ($arg eq "--manifest-path") { - $n++; - die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV; - $manifestPath = $ARGV[$n]; - $writeManifest = 1; - mkpath(dirname($manifestPath), 0, 0755); - } elsif ($arg eq "--url-prefix") { - $n++; - die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV; - $archivesURL = $ARGV[$n]; - } elsif ($arg eq "--link") { - $link = 1; - } elsif ($arg eq "--key") { - $n++; - die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV; - $privateKeyFile = $ARGV[$n]; - } elsif ($arg eq "--key-name") { - $n++; - die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV; - $keyName = $ARGV[$n]; - } elsif (substr($arg, 0, 1) eq "-") { - die "$0: unknown flag `$arg'\n"; - } else { - push @roots, $arg; - } -} - -die "$0: please specify a destination directory\n" if !defined $destDir; - -$archivesURL = "file://$destDir" unless defined $archivesURL; - - -# From the given store paths, determine the set of requisite store -# paths, i.e, the paths required to realise them. -my %storePaths; - -foreach my $path (@roots) { - # Get all paths referenced by the normalisation of the given - # Nix expression. - my $pid = open(READ, - "$Nix::Config::binDir/nix-store --query --requisites --force-realise " . - "--include-outputs '$path'|") or die; - - while () { - chomp; - die "bad: $_" unless /^\//; - $storePaths{$_} = ""; - } - - close READ or die "nix-store failed: $?"; -} - -my @storePaths = keys %storePaths; - - -# Don't create archives for files that are already in the binary cache. -my @storePaths2; -my %narFiles; -foreach my $storePath (@storePaths) { - my $pathHash = substr(basename($storePath), 0, 32); - my $narInfoFile = "$destDir/$pathHash.narinfo"; - if (-e $narInfoFile) { - my $narInfo = parseNARInfo($storePath, readFile($narInfoFile), 0, $narInfoFile) or die "cannot read `$narInfoFile'\n"; - my $narFile = "$destDir/$narInfo->{url}"; - if (-e $narFile) { - print STDERR "skipping existing $storePath\n"; - # Add the NAR info to $narFiles if we're writing a - # manifest. - $narFiles{$storePath} = [ - { url => ("$archivesURL/" . basename $narInfo->{url}) - , hash => $narInfo->{fileHash} - , size => $narInfo->{fileSize} - , compressionType => $narInfo->{compression} - , narHash => $narInfo->{narHash} - , narSize => $narInfo->{narSize} - , references => join(" ", map { "$Nix::Config::storeDir/$_" } @{$narInfo->{refs}}) - , deriver => $narInfo->{deriver} ? "$Nix::Config::storeDir/$narInfo->{deriver}" : undef - } - ] if $writeManifest; - next; - } - } - push @storePaths2, $storePath; -} - - -# Create a list of Nix derivations that turn each path into a Nix -# archive. -open NIX, ">$nixExpr"; -print NIX "["; - -foreach my $storePath (@storePaths2) { - die unless ($storePath =~ /\/[0-9a-z]{32}[^\"\\\$]*$/); - - # Construct a Nix expression that creates a Nix archive. - my $nixexpr = - "(import " . - "{ storePath = builtins.storePath \"$storePath\"; hashAlgo = \"sha256\"; compressionType = \"$compressionType\"; }) "; - - print NIX $nixexpr; -} - -print NIX "]"; -close NIX; - - -# Build the Nix expression. -print STDERR "building compressed archives...\n"; -my @narPaths; -my $pid = open(READ, "$Nix::Config::binDir/nix-build $nixExpr -o $tmpDir/result |") - or die "cannot run nix-build"; -while () { - chomp; - die unless /^\//; - push @narPaths, $_; -} -close READ or die "nix-build failed: $?"; - - -# Write the cache info file. -my $cacheInfoFile = "$destDir/nix-cache-info"; -if (! -e $cacheInfoFile) { - open FILE, ">$cacheInfoFile" or die "cannot create $cacheInfoFile: $!"; - print FILE "StoreDir: $Nix::Config::storeDir\n"; - print FILE "WantMassQuery: 0\n"; # by default, don't hit this cache for "nix-env -qas" - close FILE; -} - - -# Copy the archives and the corresponding NAR info files. -print STDERR "copying archives...\n"; - -my $totalNarSize = 0; -my $totalCompressedSize = 0; - -for (my $n = 0; $n < scalar @storePaths2; $n++) { - my $storePath = $storePaths2[$n]; - my $narDir = $narPaths[$n]; - my $baseName = basename $storePath; - - # Get info about the store path. - my ($deriver, $narHash, $time, $narSize, $refs) = queryPathInfo($storePath, 1); - - # In some exceptional cases (such as VM tests that use the Nix - # store of the host), the database doesn't contain the hash. So - # compute it. - if ($narHash =~ /^sha256:0*$/) { - my $nar = "$tmpDir/nar"; - system("$Nix::Config::binDir/nix-store --dump $storePath > $nar") == 0 - or die "cannot dump $storePath\n"; - $narHash = `$Nix::Config::binDir/nix-hash --type sha256 --base32 --flat $nar`; - die "cannot hash `$nar'" if $? != 0; - chomp $narHash; - $narHash = "sha256:$narHash"; - $narSize = stat("$nar")->size; - unlink $nar or die; - } - - $totalNarSize += $narSize; - - # Get info about the compressed NAR. - open HASH, "$narDir/nar-compressed-hash" or die "cannot open nar-compressed-hash"; - my $compressedHash = ; - chomp $compressedHash; - $compressedHash =~ /^[0-9a-z]+$/ or die "invalid hash"; - close HASH; - - my $narName = "$compressedHash.nar" . ($compressionType eq "xz" ? ".xz" : $compressionType eq "bzip2" ? ".bz2" : ""); - - my $narFile = "$narDir/$narName"; - (-f $narFile) or die "NAR file for $storePath not found"; - - my $compressedSize = stat($narFile)->size; - $totalCompressedSize += $compressedSize; - - printf STDERR "%s [%.2f MiB, %.1f%%]\n", $storePath, - $compressedSize / (1024 * 1024), $compressedSize / $narSize * 100; - - # Copy the compressed NAR. - my $dst = "$destDir/$narName"; - if (! -f $dst) { - my $tmp = "$destDir/.tmp.$$.$narName"; - if ($link) { - link($narFile, $tmp) or die "cannot link $tmp to $narFile: $!\n"; - } else { - copy($narFile, $tmp) or die "cannot copy $narFile to $tmp: $!\n"; - } - rename($tmp, $dst) or die "cannot rename $tmp to $dst: $!\n"; - } - - # Write the info file. - my $info; - $info .= "StorePath: $storePath\n"; - $info .= "URL: $narName\n"; - $info .= "Compression: $compressionType\n"; - $info .= "FileHash: sha256:$compressedHash\n"; - $info .= "FileSize: $compressedSize\n"; - $info .= "NarHash: $narHash\n"; - $info .= "NarSize: $narSize\n"; - $info .= "References: " . join(" ", map { basename $_ } @{$refs}) . "\n"; - if (defined $deriver) { - $info .= "Deriver: " . basename $deriver . "\n"; - if (isValidPath($deriver)) { - my $drv = derivationFromPath($deriver); - $info .= "System: $drv->{platform}\n"; - } - } - - if (defined $privateKeyFile && defined $keyName) { - my $sig = signString($privateKeyFile, $info); - $info .= "Signature: 1;$keyName;$sig\n"; - } - - my $pathHash = substr(basename($storePath), 0, 32); - - $dst = "$destDir/$pathHash.narinfo"; - if ($force || ! -f $dst) { - my $tmp = "$destDir/.tmp.$$.$pathHash.narinfo"; - open INFO, ">$tmp" or die; - print INFO "$info" or die; - close INFO or die; - rename($tmp, $dst) or die "cannot rename $tmp to $dst: $!\n"; - } - - $narFiles{$storePath} = [ - { url => "$archivesURL/$narName" - , hash => "sha256:$compressedHash" - , size => $compressedSize - , compressionType => $compressionType - , narHash => "$narHash" - , narSize => $narSize - , references => join(" ", @{$refs}) - , deriver => $deriver - } - ] if $writeManifest; -} - -printf STDERR "total compressed size %.2f MiB, %.1f%%\n", - $totalCompressedSize / (1024 * 1024), $totalCompressedSize / ($totalNarSize || 1) * 100; - - -# Optionally write a manifest. -writeManifest($manifestPath // "$destDir/MANIFEST", \%narFiles, \()) if $writeManifest; diff --git a/scripts/nix-reduce-build.in b/scripts/nix-reduce-build.in deleted file mode 100755 index 50beb9d10b..0000000000 --- a/scripts/nix-reduce-build.in +++ /dev/null @@ -1,171 +0,0 @@ -#! @bash@ - -WORKING_DIRECTORY=$(mktemp -d "${TMPDIR:-/tmp}"/nix-reduce-build-XXXXXX); -cd "$WORKING_DIRECTORY"; - -if test -z "$1" || test "a--help" = "a$1" ; then - echo 'nix-reduce-build (paths or Nix expressions) -- (package sources)' >&2 - echo As in: >&2 - echo nix-reduce-build /etc/nixos/nixos -- ssh://user@somewhere.nowhere.example.org >&2 - echo nix-reduce-build /etc/nixos/nixos -- \\ - echo " " \''http://somewhere.nowhere.example.org/nix/nix-http-export.cgi?needed_path='\' >&2 - echo " store path name will be added into the end of the URL" >&2 - echo nix-reduce-build /etc/nixos/nixos -- file://home/user/nar/ >&2 - echo " that should be a directory where gzipped 'nix-store --export' ">&2 - echo " files are located (they should have .nar.gz extension)" >&2 - echo " Or all together: " >&2 - echo -e nix-reduce-build /expr.nix /e2.nix -- \\\\\\\n\ - " ssh://a@b.example.com http://n.example.com/get-nar?q= file://nar/" >&2 - echo " Also supports best-effort local builds of failing expression set:" >&2 - echo "nix-reduce-build /e.nix -- nix-daemon:// nix-self://" >&2 - echo " nix-daemon:// builds using daemon" - echo " nix-self:// builds directly using nix-store from current installation" >&2 - echo " nix-daemon-fixed:// and nix-self-fixed:// do the same, but only for" >&2; - echo "derivations with specified output hash (sha256, sha1 or md5)." >&2 - echo " nix-daemon-substitute:// and nix-self-substitute:// try to substitute" >&2; - echo "maximum amount of paths" >&2; - echo " nix-daemon-build:// and nix-self-build:// try to build (not substitute)" >&2; - echo "maximum amount of paths" >&2; - echo " If no package sources are specified, required paths are listed." >&2; - exit; -fi; - -while ! test "$1" = "--" || test "$1" = "" ; do - echo "$1" >> initial; >&2 - shift; -done -shift; -echo Will work on $(cat initial | wc -l) targets. >&2 - -while read ; do - case "$REPLY" in - ${NIX_STORE_DIR:-/nix/store}/*) - echo "$REPLY" >> paths; >&2 - ;; - *) - ( - IFS=: ; - nix-instantiate $REPLY >> paths; - ); - ;; - esac; -done < initial; -echo Proceeding $(cat paths | wc -l) paths. >&2 - -while read; do - case "$REPLY" in - *.drv) - echo "$REPLY" >> derivers; >&2 - ;; - *) - nix-store --query --deriver "$REPLY" >>derivers; - ;; - esac; -done < paths; -echo Found $(cat derivers | wc -l) derivers. >&2 - -cat derivers | xargs nix-store --query -R > derivers-closure; -echo Proceeding at most $(cat derivers-closure | wc -l) derivers. >&2 - -cat derivers-closure | egrep '[.]drv$' | xargs nix-store --query --outputs > wanted-paths; -cat derivers-closure | egrep -v '[.]drv$' >> wanted-paths; -echo Prepared $(cat wanted-paths | wc -l) paths to get. >&2 - -cat wanted-paths | xargs nix-store --check-validity --print-invalid > needed-paths; -echo We need $(cat needed-paths | wc -l) paths. >&2 - -egrep '[.]drv$' derivers-closure > critical-derivers; - -if test -z "$1" ; then - cat needed-paths; -fi; - -refresh_critical_derivers() { - echo "Finding needed derivers..." >&2; - cat critical-derivers | while read; do - if ! (nix-store --query --outputs "$REPLY" | xargs nix-store --check-validity &> /dev/null;); then - echo "$REPLY"; - fi; - done > new-critical-derivers; - mv new-critical-derivers critical-derivers; - echo The needed paths are realized by $(cat critical-derivers | wc -l) derivers. >&2 -} - -build_here() { - cat critical-derivers | while read; do - echo "Realising $REPLY using nix-daemon" >&2 - @bindir@/nix-store -r "${REPLY}" - done; -} - -try_to_substitute(){ - cat needed-paths | while read ; do - echo "Building $REPLY using nix-daemon" >&2 - @bindir@/nix-store -r "${NIX_STORE_DIR:-/nix/store}/${REPLY##*/}" - done; -} - -for i in "$@"; do - sshHost="${i#ssh://}"; - httpHost="${i#http://}"; - httpsHost="${i#https://}"; - filePath="${i#file:/}"; - if [ "$i" != "$sshHost" ]; then - cat needed-paths | while read; do - echo "Getting $REPLY and its closure over ssh" >&2 - nix-copy-closure --from "$sshHost" --gzip "$REPLY" &2 - curl ${BAD_CERTIFICATE:+-k} -L "$i${REPLY##*/}" | gunzip | nix-store --import; - done; - elif [ "$i" != "$filePath" ] ; then - cat needed-paths | while read; do - echo "Installing $REPLY from file" >&2 - gunzip < "$filePath/${REPLY##*/}".nar.gz | nix-store --import; - done; - elif [ "$i" = "nix-daemon://" ] ; then - NIX_REMOTE=daemon try_to_substitute; - refresh_critical_derivers; - NIX_REMOTE=daemon build_here; - elif [ "$i" = "nix-self://" ] ; then - NIX_REMOTE= try_to_substitute; - refresh_critical_derivers; - NIX_REMOTE= build_here; - elif [ "$i" = "nix-daemon-fixed://" ] ; then - refresh_critical_derivers; - - cat critical-derivers | while read; do - if egrep '"(md5|sha1|sha256)"' "$REPLY" &>/dev/null; then - echo "Realising $REPLY using nix-daemon" >&2 - NIX_REMOTE=daemon @bindir@/nix-store -r "${REPLY}" - fi; - done; - elif [ "$i" = "nix-self-fixed://" ] ; then - refresh_critical_derivers; - - cat critical-derivers | while read; do - if egrep '"(md5|sha1|sha256)"' "$REPLY" &>/dev/null; then - echo "Realising $REPLY using direct Nix build" >&2 - NIX_REMOTE= @bindir@/nix-store -r "${REPLY}" - fi; - done; - elif [ "$i" = "nix-daemon-substitute://" ] ; then - NIX_REMOTE=daemon try_to_substitute; - elif [ "$i" = "nix-self-substitute://" ] ; then - NIX_REMOTE= try_to_substitute; - elif [ "$i" = "nix-daemon-build://" ] ; then - refresh_critical_derivers; - NIX_REMOTE=daemon build_here; - elif [ "$i" = "nix-self-build://" ] ; then - refresh_critical_derivers; - NIX_REMOTE= build_here; - fi; - mv needed-paths wanted-paths; - cat wanted-paths | xargs nix-store --check-validity --print-invalid > needed-paths; - echo We still need $(cat needed-paths | wc -l) paths. >&2 -done; - -cd / -rm -r "$WORKING_DIRECTORY" diff --git a/scripts/remove-patches.pl b/scripts/remove-patches.pl deleted file mode 100755 index 401771a27d..0000000000 --- a/scripts/remove-patches.pl +++ /dev/null @@ -1,16 +0,0 @@ -#! /usr/bin/perl -w -I/home/eelco/nix/scripts - -use strict; -use readmanifest; - -for my $p (@ARGV) { - - my %narFiles; - my %patches; - - readManifest $p, \%narFiles, \%patches; - - %patches = (); - - writeManifest $p, \%narFiles, \%patches; -} diff --git a/scripts/show-duplication.pl b/scripts/show-duplication.pl deleted file mode 100755 index 0604c6696c..0000000000 --- a/scripts/show-duplication.pl +++ /dev/null @@ -1,73 +0,0 @@ -#! /usr/bin/perl -w - -if (scalar @ARGV != 1) { - print "syntax: show-duplication.pl PATH\n"; - exit 1; -} - -my $root = $ARGV[0]; - - -my $nameRE = "(?:(?:[A-Za-z0-9\+\_]|(?:-[^0-9]))+)"; -my $versionRE = "(?:[A-Za-z0-9\.\-]+)"; - - -my %pkgInstances; - - -my $pid = open(PATHS, "-|") || exec "nix-store", "-qR", $root; -while () { - chomp; - /^.*\/[0-9a-z]*-(.*)$/; - my $nameVersion = $1; - $nameVersion =~ /^($nameRE)(-($versionRE))?$/; - $name = $1; - $version = $3; - $version = "(unnumbered)" unless defined $version; -# print "$nameVersion $name $version\n"; - push @{$pkgInstances{$name}}, {version => $version, path => $_}; -} -close PATHS or exit 1; - - -sub pathSize { - my $path = shift; - my @st = lstat $path or die; - - my $size = $st[7]; - - if (-d $path) { - opendir DIR, $path or die; - foreach my $name (readdir DIR) { - next if $name eq "." || $name eq ".."; - $size += pathSize("$path/$name"); - } - } - - return $size; -} - - -my $totalPaths = 0; -my $totalSize = 0, $totalWaste = 0; - -foreach my $name (sort {scalar @{$pkgInstances{$b}} <=> scalar @{$pkgInstances{$a}}} (keys %pkgInstances)) { - print "$name ", scalar @{$pkgInstances{$name}}, "\n"; - my $allSize = 0; - foreach my $x (sort {$a->{version} cmp $b->{version}} @{$pkgInstances{$name}}) { - $totalPaths++; - my $size = pathSize $x->{path}; - $allSize += $size; - print " $x->{version} $size\n"; - } - my $avgSize = int($allSize / scalar @{$pkgInstances{$name}}); - my $waste = $allSize - $avgSize; - $totalSize += $allSize; - $totalWaste += $waste; - print " average $avgSize, waste $waste\n"; -} - - -my $avgDupl = $totalPaths / scalar (keys %pkgInstances); -my $wasteFactor = ($totalWaste / $totalSize) * 100; -print "average package duplication $avgDupl, total size $totalSize, total waste $totalWaste, $wasteFactor% wasted\n"; diff --git a/src/boost/format/local.mk b/src/boost/format/local.mk deleted file mode 100644 index 3776eff382..0000000000 --- a/src/boost/format/local.mk +++ /dev/null @@ -1,7 +0,0 @@ -libraries += libformat - -libformat_NAME = libnixformat - -libformat_DIR := $(d) - -libformat_SOURCES := $(wildcard $(d)/*.cc) diff --git a/src/bsdiff-4.3/bsdiff.1 b/src/bsdiff-4.3/bsdiff.1 deleted file mode 100644 index ead6c4deb5..0000000000 --- a/src/bsdiff-4.3/bsdiff.1 +++ /dev/null @@ -1,63 +0,0 @@ -.\"- -.\" Copyright 2003-2005 Colin Percival -.\" All rights reserved -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted providing that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -.\" IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -.\" POSSIBILITY OF SUCH DAMAGE. -.\" -.\" $FreeBSD: src/usr.bin/bsdiff/bsdiff/bsdiff.1,v 1.1 2005/08/06 01:59:05 cperciva Exp $ -.\" -.Dd May 18, 2003 -.Dt BSDIFF 1 -.Os FreeBSD -.Sh NAME -.Nm bsdiff -.Nd generate a patch between two binary files -.Sh SYNOPSIS -.Nm -.Ao Ar oldfile Ac Ao Ar newfile Ac Ao Ar patchfile Ac -.Sh DESCRIPTION -.Nm -compares -.Ao Ar oldfile Ac -to -.Ao Ar newfile Ac -and writes to -.Ao Ar patchfile Ac -a binary patch suitable for use by bspatch(1). -When -.Ao Ar oldfile Ac -and -.Ao Ar newfile Ac -are two versions of an executable program, the -patches produced are on average a factor of five smaller -than those produced by any other binary patch tool known -to the author. -.Pp -.Nm -uses memory equal to 17 times the size of -.Ao Ar oldfile Ac , -and requires -an absolute minimum working set size of 8 times the size of oldfile. -.Sh SEE ALSO -.Xr bspatch 1 -.Sh AUTHORS -.An Colin Percival Aq cperciva@freebsd.org diff --git a/src/bsdiff-4.3/bsdiff.c b/src/bsdiff-4.3/bsdiff.c deleted file mode 100644 index 374ed038fa..0000000000 --- a/src/bsdiff-4.3/bsdiff.c +++ /dev/null @@ -1,405 +0,0 @@ -/*- - * Copyright 2003-2005 Colin Percival - * All rights reserved - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted providing that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#if 0 -__FBSDID("$FreeBSD: src/usr.bin/bsdiff/bsdiff/bsdiff.c,v 1.1 2005/08/06 01:59:05 cperciva Exp $"); -#endif - -#include - -#include -#include -#include -#include -#include -#include -#include - -#define MIN(x,y) (((x)<(y)) ? (x) : (y)) - -static void split(off_t *I,off_t *V,off_t start,off_t len,off_t h) -{ - off_t i,j,k,x,tmp,jj,kk; - - if(len<16) { - for(k=start;kstart) split(I,V,start,jj-start,h); - - for(i=0;ikk) split(I,V,kk,start+len-kk,h); -} - -static void qsufsort(off_t *I,off_t *V,u_char *old,off_t oldsize) -{ - off_t buckets[256]; - off_t i,h,len; - - for(i=0;i<256;i++) buckets[i]=0; - for(i=0;i0;i--) buckets[i]=buckets[i-1]; - buckets[0]=0; - - for(i=0;iy) { - *pos=I[st]; - return x; - } else { - *pos=I[en]; - return y; - } - }; - - x=st+(en-st)/2; - if(memcmp(old+I[x],new,MIN(oldsize-I[x],newsize))<0) { - return search(I,old,oldsize,new,newsize,x,en,pos); - } else { - return search(I,old,oldsize,new,newsize,st,x,pos); - }; -} - -static void offtout(off_t x,u_char *buf) -{ - off_t y; - - if(x<0) y=-x; else y=x; - - buf[0]=y%256;y-=buf[0]; - y=y/256;buf[1]=y%256;y-=buf[1]; - y=y/256;buf[2]=y%256;y-=buf[2]; - y=y/256;buf[3]=y%256;y-=buf[3]; - y=y/256;buf[4]=y%256;y-=buf[4]; - y=y/256;buf[5]=y%256;y-=buf[5]; - y=y/256;buf[6]=y%256;y-=buf[6]; - y=y/256;buf[7]=y%256; - - if(x<0) buf[7]|=0x80; -} - -int main(int argc,char *argv[]) -{ - int fd; - u_char *old,*new; - off_t oldsize,newsize; - off_t *I,*V; - off_t scan,pos,len; - off_t lastscan,lastpos,lastoffset; - off_t oldscore,scsc; - off_t s,Sf,lenf,Sb,lenb; - off_t overlap,Ss,lens; - off_t i; - off_t dblen,eblen; - u_char *db,*eb; - u_char buf[8]; - u_char header[32]; - FILE * pf; - BZFILE * pfbz2; - int bz2err; - - if(argc!=4) errx(1,"usage: %s oldfile newfile patchfile\n",argv[0]); - - /* Allocate oldsize+1 bytes instead of oldsize bytes to ensure - that we never try to malloc(0) and get a NULL pointer */ - if(((fd=open(argv[1],O_RDONLY,0))<0) || - ((oldsize=lseek(fd,0,SEEK_END))==-1) || - ((old=malloc(oldsize+1))==NULL) || - (lseek(fd,0,SEEK_SET)!=0) || - (read(fd,old,oldsize)!=oldsize) || - (close(fd)==-1)) err(1,"%s",argv[1]); - - if(((I=malloc((oldsize+1)*sizeof(off_t)))==NULL) || - ((V=malloc((oldsize+1)*sizeof(off_t)))==NULL)) err(1,NULL); - - qsufsort(I,V,old,oldsize); - - free(V); - - /* Allocate newsize+1 bytes instead of newsize bytes to ensure - that we never try to malloc(0) and get a NULL pointer */ - if(((fd=open(argv[2],O_RDONLY,0))<0) || - ((newsize=lseek(fd,0,SEEK_END))==-1) || - ((new=malloc(newsize+1))==NULL) || - (lseek(fd,0,SEEK_SET)!=0) || - (read(fd,new,newsize)!=newsize) || - (close(fd)==-1)) err(1,"%s",argv[2]); - - if(((db=malloc(newsize+1))==NULL) || - ((eb=malloc(newsize+1))==NULL)) err(1,NULL); - dblen=0; - eblen=0; - - /* Create the patch file */ - if ((pf = fopen(argv[3], "w")) == NULL) - err(1, "%s", argv[3]); - - /* Header is - 0 8 "BSDIFF40" - 8 8 length of bzip2ed ctrl block - 16 8 length of bzip2ed diff block - 24 8 length of new file */ - /* File is - 0 32 Header - 32 ?? Bzip2ed ctrl block - ?? ?? Bzip2ed diff block - ?? ?? Bzip2ed extra block */ - memcpy(header,"BSDIFF40",8); - offtout(0, header + 8); - offtout(0, header + 16); - offtout(newsize, header + 24); - if (fwrite(header, 32, 1, pf) != 1) - err(1, "fwrite(%s)", argv[3]); - - /* Compute the differences, writing ctrl as we go */ - if ((pfbz2 = BZ2_bzWriteOpen(&bz2err, pf, 9, 0, 0)) == NULL) - errx(1, "BZ2_bzWriteOpen, bz2err = %d", bz2err); - scan=0;len=0; - lastscan=0;lastpos=0;lastoffset=0; - while(scan 64 * 1024) break; - - for(;scscoldscore+8)) break; - - if((scan+lastoffsetSf*2-lenf) { Sf=s; lenf=i; }; - }; - - lenb=0; - if(scan=lastscan+i)&&(pos>=i);i++) { - if(old[pos-i]==new[scan-i]) s++; - if(s*2-i>Sb*2-lenb) { Sb=s; lenb=i; }; - }; - }; - - if(lastscan+lenf>scan-lenb) { - overlap=(lastscan+lenf)-(scan-lenb); - s=0;Ss=0;lens=0; - for(i=0;iSs) { Ss=s; lens=i+1; }; - }; - - lenf+=lens-overlap; - lenb-=lens; - }; - - for(i=0;i -#include -#include -#include -#include -#include -#include -#include -#include - -static off_t offtin(u_char *buf) -{ - off_t y; - - y=buf[7]&0x7F; - y=y*256;y+=buf[6]; - y=y*256;y+=buf[5]; - y=y*256;y+=buf[4]; - y=y*256;y+=buf[3]; - y=y*256;y+=buf[2]; - y=y*256;y+=buf[1]; - y=y*256;y+=buf[0]; - - if(buf[7]&0x80) y=-y; - - return y; -} - - -void writeFull(const char * name, int fd, - const unsigned char * buf, size_t count) -{ - while (count) { - ssize_t res = write(fd, (char *) buf, count); - if (res == -1) { - if (errno == EINTR) continue; - err(1,"writing to %s",name); - } - count -= res; - buf += res; - } -} - - -int main(int argc,char * argv[]) -{ - FILE * f, * cpf, * dpf, * epf; - BZFILE * cpfbz2, * dpfbz2, * epfbz2; - int cbz2err, dbz2err, ebz2err; - int fd; - ssize_t oldsize,newsize; - ssize_t bzctrllen,bzdatalen; - u_char header[32],buf[8]; - u_char *old, *new; - off_t oldpos,newpos; - off_t ctrl[3]; - off_t lenread; - off_t i; - - if(argc!=4) errx(1,"usage: %s oldfile newfile patchfile\n",argv[0]); - - /* Open patch file */ - if ((f = fopen(argv[3], "r")) == NULL) - err(1, "fopen(%s)", argv[3]); - - /* - File format: - 0 8 "BSDIFF40" - 8 8 X - 16 8 Y - 24 8 sizeof(newfile) - 32 X bzip2(control block) - 32+X Y bzip2(diff block) - 32+X+Y ??? bzip2(extra block) - with control block a set of triples (x,y,z) meaning "add x bytes - from oldfile to x bytes from the diff block; copy y bytes from the - extra block; seek forwards in oldfile by z bytes". - */ - - /* Read header */ - if (fread(header, 1, 32, f) < 32) { - if (feof(f)) - errx(1, "Corrupt patch\n"); - err(1, "fread(%s)", argv[3]); - } - - /* Check for appropriate magic */ - if (memcmp(header, "BSDIFF40", 8) != 0) - errx(1, "Corrupt patch\n"); - - /* Read lengths from header */ - bzctrllen=offtin(header+8); - bzdatalen=offtin(header+16); - newsize=offtin(header+24); - if((bzctrllen<0) || (bzdatalen<0) || (newsize<0)) - errx(1,"Corrupt patch\n"); - - /* Close patch file and re-open it via libbzip2 at the right places */ - if (fclose(f)) - err(1, "fclose(%s)", argv[3]); - if ((cpf = fopen(argv[3], "r")) == NULL) - err(1, "fopen(%s)", argv[3]); - if (fseeko(cpf, 32, SEEK_SET)) - err(1, "fseeko(%s, %lld)", argv[3], - (long long)32); - if ((cpfbz2 = BZ2_bzReadOpen(&cbz2err, cpf, 0, 0, NULL, 0)) == NULL) - errx(1, "BZ2_bzReadOpen, bz2err = %d", cbz2err); - if ((dpf = fopen(argv[3], "r")) == NULL) - err(1, "fopen(%s)", argv[3]); - if (fseeko(dpf, 32 + bzctrllen, SEEK_SET)) - err(1, "fseeko(%s, %lld)", argv[3], - (long long)(32 + bzctrllen)); - if ((dpfbz2 = BZ2_bzReadOpen(&dbz2err, dpf, 0, 0, NULL, 0)) == NULL) - errx(1, "BZ2_bzReadOpen, bz2err = %d", dbz2err); - if ((epf = fopen(argv[3], "r")) == NULL) - err(1, "fopen(%s)", argv[3]); - if (fseeko(epf, 32 + bzctrllen + bzdatalen, SEEK_SET)) - err(1, "fseeko(%s, %lld)", argv[3], - (long long)(32 + bzctrllen + bzdatalen)); - if ((epfbz2 = BZ2_bzReadOpen(&ebz2err, epf, 0, 0, NULL, 0)) == NULL) - errx(1, "BZ2_bzReadOpen, bz2err = %d", ebz2err); - - if(((fd=open(argv[1],O_RDONLY,0))<0) || - ((oldsize=lseek(fd,0,SEEK_END))==-1) || - ((old=malloc(oldsize+1))==NULL) || - (lseek(fd,0,SEEK_SET)!=0) || - (read(fd,old,oldsize)!=oldsize) || - (close(fd)==-1)) err(1,"%s",argv[1]); - if((new=malloc(newsize+1))==NULL) err(1,NULL); - - oldpos=0;newpos=0; - while(newposnewsize) - errx(1,"Corrupt patch\n"); - - /* Read diff string */ - lenread = BZ2_bzRead(&dbz2err, dpfbz2, new + newpos, ctrl[0]); - if ((lenread < ctrl[0]) || - ((dbz2err != BZ_OK) && (dbz2err != BZ_STREAM_END))) - errx(1, "Corrupt patch\n"); - - /* Add old data to diff string */ - for(i=0;i=0) && (oldpos+inewsize) - errx(1,"Corrupt patch\n"); - - /* Read extra string */ - lenread = BZ2_bzRead(&ebz2err, epfbz2, new + newpos, ctrl[1]); - if ((lenread < ctrl[1]) || - ((ebz2err != BZ_OK) && (ebz2err != BZ_STREAM_END))) - errx(1, "Corrupt patch\n"); - - /* Adjust pointers */ - newpos+=ctrl[1]; - oldpos+=ctrl[2]; - }; - - /* Clean up the bzip2 reads */ - BZ2_bzReadClose(&cbz2err, cpfbz2); - BZ2_bzReadClose(&dbz2err, dpfbz2); - BZ2_bzReadClose(&ebz2err, epfbz2); - if (fclose(cpf) || fclose(dpf) || fclose(epf)) - err(1, "fclose(%s)", argv[3]); - - /* Write the new file */ - if((fd=open(argv[2],O_CREAT|O_TRUNC|O_WRONLY,0666))<0) - err(1,"%s",argv[2]); - writeFull(argv[2], fd, new, newsize); - if(close(fd)==-1) - err(1,"%s",argv[2]); - - free(new); - free(old); - - return 0; -} diff --git a/src/bsdiff-4.3/compat-include/err.h b/src/bsdiff-4.3/compat-include/err.h deleted file mode 100644 index a851ded6f9..0000000000 --- a/src/bsdiff-4.3/compat-include/err.h +++ /dev/null @@ -1,12 +0,0 @@ -/* Simulate BSD's functionality. */ - -#ifndef COMPAT_ERR_H_INCLUDED -#define COMPAT_ERR_H_INCLUDED 1 - -#include -#include - -#define err(rc,...) do { fprintf(stderr,__VA_ARGS__); exit(rc); } while(0) -#define errx(rc,...) do { fprintf(stderr,__VA_ARGS__); exit(rc); } while(0) - -#endif diff --git a/src/bsdiff-4.3/local.mk b/src/bsdiff-4.3/local.mk deleted file mode 100644 index c957ceab0c..0000000000 --- a/src/bsdiff-4.3/local.mk +++ /dev/null @@ -1,11 +0,0 @@ -programs += bsdiff bspatch - -bsdiff_DIR := $(d) -bsdiff_SOURCES := $(d)/bsdiff.c -bsdiff_LDFLAGS = -lbz2 $(bsddiff_compat_include) -bsdiff_INSTALL_DIR = $(libexecdir)/nix - -bspatch_DIR := $(d) -bspatch_SOURCES := $(d)/bspatch.c -bspatch_LDFLAGS = -lbz2 $(bsddiff_compat_include) -bspatch_INSTALL_DIR = $(libexecdir)/nix diff --git a/src/download-via-ssh/download-via-ssh.cc b/src/download-via-ssh/download-via-ssh.cc deleted file mode 100644 index 6361e71e99..0000000000 --- a/src/download-via-ssh/download-via-ssh.cc +++ /dev/null @@ -1,155 +0,0 @@ -#include "shared.hh" -#include "util.hh" -#include "serialise.hh" -#include "archive.hh" -#include "affinity.hh" -#include "globals.hh" -#include "serve-protocol.hh" -#include "worker-protocol.hh" -#include "store-api.hh" - -#include -#include - -using namespace nix; - -// !!! TODO: -// * Respect more than the first host -// * use a database -// * show progress - - -static std::pair connect(const string & conn) -{ - Pipe to, from; - to.create(); - from.create(); - pid_t child = fork(); - switch (child) { - case -1: - throw SysError("unable to fork"); - case 0: - try { - restoreAffinity(); - if (dup2(to.readSide, STDIN_FILENO) == -1) - throw SysError("dupping stdin"); - if (dup2(from.writeSide, STDOUT_FILENO) == -1) - throw SysError("dupping stdout"); - execlp("ssh" - , "ssh" - , "-x" - , "-T" - , conn.c_str() - , "nix-store --serve" - , NULL); - throw SysError("executing ssh"); - } catch (std::exception & e) { - std::cerr << "error: " << e.what() << std::endl; - } - _exit(1); - } - // If child exits unexpectedly, we'll EPIPE or EOF early. - // If we exit unexpectedly, child will EPIPE or EOF early. - // So no need to keep track of it. - - return std::pair(to.writeSide.borrow(), from.readSide.borrow()); -} - - -static void substitute(std::pair & pipes, Path storePath, Path destPath) -{ - writeInt(cmdSubstitute, pipes.first); - writeString(storePath, pipes.first); - pipes.first.flush(); - restorePath(destPath, pipes.second); - std::cout << std::endl; -} - - -static void query(std::pair & pipes) -{ - writeInt(cmdQuery, pipes.first); - for (string line; getline(std::cin, line);) { - Strings tokenized = tokenizeString(line); - string cmd = tokenized.front(); - tokenized.pop_front(); - if (cmd == "have") { - writeInt(qCmdHave, pipes.first); - writeStrings(tokenized, pipes.first); - pipes.first.flush(); - PathSet paths = readStrings(pipes.second); - foreach (PathSet::iterator, i, paths) - std::cout << *i << std::endl; - } else if (cmd == "info") { - writeInt(qCmdInfo, pipes.first); - writeStrings(tokenized, pipes.first); - pipes.first.flush(); - while (1) { - Path path = readString(pipes.second); - if (path.empty()) break; - assertStorePath(path); - std::cout << path << std::endl; - string deriver = readString(pipes.second); - if (!deriver.empty()) assertStorePath(deriver); - std::cout << deriver << std::endl; - PathSet references = readStorePaths(pipes.second); - std::cout << references.size() << std::endl; - foreach (PathSet::iterator, i, references) - std::cout << *i << std::endl; - std::cout << readLongLong(pipes.second) << std::endl; - std::cout << readLongLong(pipes.second) << std::endl; - } - } else - throw Error(format("unknown substituter query `%1%'") % cmd); - std::cout << std::endl; - } -} - - -void run(Strings args) -{ - if (args.empty()) - throw UsageError("download-via-ssh requires an argument"); - - if (settings.sshSubstituterHosts.empty()) - return; - - std::cout << std::endl; - - string host = settings.sshSubstituterHosts.front(); - std::pair pipes = connect(host); - - /* Exchange the greeting */ - writeInt(SERVE_MAGIC_1, pipes.first); - pipes.first.flush(); - unsigned int magic = readInt(pipes.second); - if (magic != SERVE_MAGIC_2) - throw Error("protocol mismatch"); - readInt(pipes.second); // Server version, unused for now - writeInt(SERVE_PROTOCOL_VERSION, pipes.first); - pipes.first.flush(); - - Strings::iterator i = args.begin(); - if (*i == "--query") - query(pipes); - else if (*i == "--substitute") - if (args.size() != 3) - throw UsageError("download-via-ssh: --substitute takes exactly two arguments"); - else { - Path storePath = *++i; - Path destPath = *++i; - printMsg(lvlError, format("downloading `%1%' via SSH from `%2%'...") % storePath % host); - substitute(pipes, storePath, destPath); - } - else - throw UsageError(format("download-via-ssh: unknown command `%1%'") % *i); -} - - -void printHelp() -{ - std::cerr << "Usage: download-via-ssh --query|--substitute store-path dest-path" << std::endl; -} - - -string programId = "download-via-ssh"; diff --git a/src/download-via-ssh/local.mk b/src/download-via-ssh/local.mk deleted file mode 100644 index 80f4c385ac..0000000000 --- a/src/download-via-ssh/local.mk +++ /dev/null @@ -1,11 +0,0 @@ -programs += download-via-ssh - -download-via-ssh_DIR := $(d) - -download-via-ssh_SOURCES := $(d)/download-via-ssh.cc - -download-via-ssh_INSTALL_DIR := $(libexecdir)/nix/substituters - -download-via-ssh_CXXFLAGS = -Isrc/nix-store - -download-via-ssh_LIBS = libmain libstore libutil libformat diff --git a/src/libexpr/attr-path.cc b/src/libexpr/attr-path.cc deleted file mode 100644 index 4f28a549f0..0000000000 --- a/src/libexpr/attr-path.cc +++ /dev/null @@ -1,97 +0,0 @@ -#include "attr-path.hh" -#include "eval-inline.hh" -#include "util.hh" - - -namespace nix { - - -static Strings parseAttrPath(const string & s) -{ - Strings res; - string cur; - string::const_iterator i = s.begin(); - while (i != s.end()) { - if (*i == '.') { - res.push_back(cur); - cur.clear(); - } else if (*i == '"') { - ++i; - while (1) { - if (i == s.end()) - throw Error(format("missing closing quote in selection path `%1%'") % s); - if (*i == '"') break; - cur.push_back(*i++); - } - } else - cur.push_back(*i); - ++i; - } - if (!cur.empty()) res.push_back(cur); - return res; -} - - -Value * findAlongAttrPath(EvalState & state, const string & attrPath, - Bindings & autoArgs, Value & vIn) -{ - Strings tokens = parseAttrPath(attrPath); - - Error attrError = - Error(format("attribute selection path `%1%' does not match expression") % attrPath); - - Value * v = &vIn; - - foreach (Strings::iterator, i, tokens) { - - /* Is *i an index (integer) or a normal attribute name? */ - enum { apAttr, apIndex } apType = apAttr; - string attr = *i; - unsigned int attrIndex; - if (string2Int(attr, attrIndex)) apType = apIndex; - - /* Evaluate the expression. */ - Value * vNew = state.allocValue(); - state.autoCallFunction(autoArgs, *v, *vNew); - v = vNew; - state.forceValue(*v); - - /* It should evaluate to either a set or an expression, - according to what is specified in the attrPath. */ - - if (apType == apAttr) { - - if (v->type != tAttrs) - throw TypeError( - format("the expression selected by the selection path `%1%' should be a set but is %2%") - % attrPath % showType(*v)); - - if (attr.empty()) - throw Error(format("empty attribute name in selection path `%1%'") % attrPath); - - Bindings::iterator a = v->attrs->find(state.symbols.create(attr)); - if (a == v->attrs->end()) - throw Error(format("attribute `%1%' in selection path `%2%' not found") % attr % attrPath); - v = &*a->value; - } - - else if (apType == apIndex) { - - if (v->type != tList) - throw TypeError( - format("the expression selected by the selection path `%1%' should be a list but is %2%") - % attrPath % showType(*v)); - - if (attrIndex >= v->list.length) - throw Error(format("list index %1% in selection path `%2%' is out of range") % attrIndex % attrPath); - - v = v->list.elems[attrIndex]; - } - - } - - return v; -} - - -} diff --git a/src/libexpr/attr-path.hh b/src/libexpr/attr-path.hh deleted file mode 100644 index 46a3419509..0000000000 --- a/src/libexpr/attr-path.hh +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include "eval.hh" - -#include -#include - -namespace nix { - -Value * findAlongAttrPath(EvalState & state, const string & attrPath, - Bindings & autoArgs, Value & vIn); - -} diff --git a/src/libexpr/common-opts.cc b/src/libexpr/common-opts.cc deleted file mode 100644 index 9b3421f6c4..0000000000 --- a/src/libexpr/common-opts.cc +++ /dev/null @@ -1,59 +0,0 @@ -#include "common-opts.hh" -#include "../libmain/shared.hh" -#include "util.hh" - - -namespace nix { - - -bool parseOptionArg(const string & arg, Strings::iterator & i, - const Strings::iterator & argsEnd, EvalState & state, - Bindings & autoArgs) -{ - if (arg != "--arg" && arg != "--argstr") return false; - - UsageError error(format("`%1%' requires two arguments") % arg); - - if (i == argsEnd) throw error; - string name = *i++; - if (i == argsEnd) throw error; - string value = *i++; - - /* !!! check for duplicates! */ - Value * v = state.allocValue(); - autoArgs.push_back(Attr(state.symbols.create(name), v)); - - if (arg == "--arg") - state.mkThunk_(*v, state.parseExprFromString(value, absPath("."))); - else - mkString(*v, value); - - autoArgs.sort(); // !!! inefficient - - return true; -} - - -bool parseSearchPathArg(const string & arg, Strings::iterator & i, - const Strings::iterator & argsEnd, EvalState & state) -{ - if (arg != "-I") return false; - if (i == argsEnd) throw UsageError(format("`%1%' requires an argument") % arg);; - state.addToSearchPath(*i++, true); - return true; -} - - -Path lookupFileArg(EvalState & state, string s) -{ - if (s.size() > 2 && s.at(0) == '<' && s.at(s.size() - 1) == '>') { - Path p = s.substr(1, s.size() - 2); - Path p2 = state.findFile(p); - if (p2 == "") throw Error(format("file `%1%' was not found in the Nix search path (add it using $NIX_PATH or -I)") % p); - return p2; - } else - return absPath(s); -} - - -} diff --git a/src/libexpr/common-opts.hh b/src/libexpr/common-opts.hh deleted file mode 100644 index e2e3fe7717..0000000000 --- a/src/libexpr/common-opts.hh +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include "eval.hh" - -namespace nix { - -/* Some common option parsing between nix-env and nix-instantiate. */ -bool parseOptionArg(const string & arg, Strings::iterator & i, - const Strings::iterator & argsEnd, EvalState & state, - Bindings & autoArgs); - -bool parseSearchPathArg(const string & arg, Strings::iterator & i, - const Strings::iterator & argsEnd, EvalState & state); - -Path lookupFileArg(EvalState & state, string s); - -} diff --git a/src/libexpr/eval-inline.hh b/src/libexpr/eval-inline.hh deleted file mode 100644 index 5801a20c3b..0000000000 --- a/src/libexpr/eval-inline.hh +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#include "eval.hh" - -#define LocalNoInline(f) static f __attribute__((noinline)); f -#define LocalNoInlineNoReturn(f) static f __attribute__((noinline, noreturn)); f - -namespace nix { - -LocalNoInlineNoReturn(void throwEvalError(const char * s)) -{ - throw EvalError(s); -} - -LocalNoInlineNoReturn(void throwTypeError(const char * s, const Value & v)) -{ - throw TypeError(format(s) % showType(v)); -} - - -void EvalState::forceValue(Value & v) -{ - if (v.type == tThunk) { - Env * env = v.thunk.env; - Expr * expr = v.thunk.expr; - try { - v.type = tBlackhole; - //checkInterrupt(); - expr->eval(*this, *env, v); - } catch (Error & e) { - v.type = tThunk; - v.thunk.env = env; - v.thunk.expr = expr; - throw; - } - } - else if (v.type == tApp) - callFunction(*v.app.left, *v.app.right, v); - else if (v.type == tBlackhole) - throwEvalError("infinite recursion encountered"); -} - - -inline void EvalState::forceAttrs(Value & v) -{ - forceValue(v); - if (v.type != tAttrs) - throwTypeError("value is %1% while a set was expected", v); -} - - -inline void EvalState::forceList(Value & v) -{ - forceValue(v); - if (v.type != tList) - throwTypeError("value is %1% while a list was expected", v); -} - -} diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc deleted file mode 100644 index bbf494387e..0000000000 --- a/src/libexpr/eval.cc +++ /dev/null @@ -1,1438 +0,0 @@ -#include "eval.hh" -#include "hash.hh" -#include "util.hh" -#include "store-api.hh" -#include "derivations.hh" -#include "globals.hh" -#include "eval-inline.hh" - -#include -#include -#include -#include -#include - -#if HAVE_BOEHMGC - -#include -#include - -#define NEW new (UseGC) - -#else - -#define GC_STRDUP strdup -#define GC_MALLOC malloc - -#define NEW new - -#endif - - -namespace nix { - - -Bindings::iterator Bindings::find(const Symbol & name) -{ - Attr key(name, 0); - iterator i = lower_bound(begin(), end(), key); - if (i != end() && i->name == name) return i; - return end(); -} - - -void Bindings::sort() -{ - std::sort(begin(), end()); -} - - -std::ostream & operator << (std::ostream & str, const Value & v) -{ - switch (v.type) { - case tInt: - str << v.integer; - break; - case tBool: - str << (v.boolean ? "true" : "false"); - break; - case tString: - str << "\""; - for (const char * i = v.string.s; *i; i++) - if (*i == '\"' || *i == '\\') str << "\\" << *i; - else if (*i == '\n') str << "\\n"; - else if (*i == '\r') str << "\\r"; - else if (*i == '\t') str << "\\t"; - else str << *i; - str << "\""; - break; - case tPath: - str << v.path; // !!! escaping? - break; - case tNull: - str << "null"; - break; - case tAttrs: { - str << "{ "; - typedef std::map Sorted; - Sorted sorted; - foreach (Bindings::iterator, i, *v.attrs) - sorted[i->name] = i->value; - foreach (Sorted::iterator, i, sorted) - str << i->first << " = " << *i->second << "; "; - str << "}"; - break; - } - case tList: - str << "[ "; - for (unsigned int n = 0; n < v.list.length; ++n) - str << *v.list.elems[n] << " "; - str << "]"; - break; - case tThunk: - case tApp: - str << ""; - break; - case tLambda: - str << ""; - break; - case tPrimOp: - str << ""; - break; - case tPrimOpApp: - str << ""; - break; - default: - throw Error("invalid value"); - } - return str; -} - - -string showType(const Value & v) -{ - switch (v.type) { - case tInt: return "an integer"; - case tBool: return "a boolean"; - case tString: return "a string"; - case tPath: return "a path"; - case tNull: return "null"; - case tAttrs: return "a set"; - case tList: return "a list"; - case tThunk: return "a thunk"; - case tApp: return "a function application"; - case tLambda: return "a function"; - case tBlackhole: return "a black hole"; - case tPrimOp: return "a built-in function"; - case tPrimOpApp: return "a partially applied built-in function"; - } - abort(); -} - - -/* Called when the Boehm GC runs out of memory. */ -static void * oomHandler(size_t requested) -{ - /* Convert this to a proper C++ exception. */ - throw std::bad_alloc(); -} - - -static Symbol getName(const AttrName & name, EvalState & state, Env & env) { - if (name.symbol.set()) { - return name.symbol; - } else { - Value nameValue; - name.expr->eval(state, env, nameValue); - state.forceStringNoCtx(nameValue); - return state.symbols.create(nameValue.string.s); - } -} - - -EvalState::EvalState() - : sWith(symbols.create("")) - , sOutPath(symbols.create("outPath")) - , sDrvPath(symbols.create("drvPath")) - , sType(symbols.create("type")) - , sMeta(symbols.create("meta")) - , sName(symbols.create("name")) - , sValue(symbols.create("value")) - , sSystem(symbols.create("system")) - , sOverrides(symbols.create("__overrides")) - , sOutputs(symbols.create("outputs")) - , sOutputName(symbols.create("outputName")) - , sIgnoreNulls(symbols.create("__ignoreNulls")) - , sFile(symbols.create("file")) - , sLine(symbols.create("line")) - , sColumn(symbols.create("column")) - , repair(false) - , baseEnv(allocEnv(128)) - , staticBaseEnv(false, 0) - , baseEnvDispl(0) -{ - nrEnvs = nrValuesInEnvs = nrValues = nrListElems = 0; - nrAttrsets = nrOpUpdates = nrOpUpdateValuesCopied = 0; - nrListConcats = nrPrimOpCalls = nrFunctionCalls = 0; - countCalls = getEnv("NIX_COUNT_CALLS", "0") != "0"; - -#if HAVE_BOEHMGC - static bool gcInitialised = false; - if (!gcInitialised) { - - /* Initialise the Boehm garbage collector. This isn't - necessary on most platforms, but for portability we do it - anyway. */ - GC_INIT(); - - GC_oom_fn = oomHandler; - - /* Set the initial heap size to something fairly big (25% of - physical RAM, up to a maximum of 384 MiB) so that in most - cases we don't need to garbage collect at all. (Collection - has a fairly significant overhead.) The heap size can be - overridden through libgc's GC_INITIAL_HEAP_SIZE environment - variable. We should probably also provide a nix.conf - setting for this. Note that GC_expand_hp() causes a lot of - virtual, but not physical (resident) memory to be - allocated. This might be a problem on systems that don't - overcommit. */ - if (!getenv("GC_INITIAL_HEAP_SIZE")) { - size_t maxSize = 384 * 1024 * 1024; - size_t size = 32 * 1024 * 1024; -#if HAVE_SYSCONF && defined(_SC_PAGESIZE) && defined(_SC_PHYS_PAGES) - long pageSize = sysconf(_SC_PAGESIZE); - long pages = sysconf(_SC_PHYS_PAGES); - if (pageSize != -1) - size = (pageSize * pages) / 4; // 25% of RAM - if (size > maxSize) size = maxSize; -#endif - debug(format("setting initial heap size to %1% bytes") % size); - GC_expand_hp(size); - } - - gcInitialised = true; - } -#endif - - /* Initialise the Nix expression search path. */ - searchPathInsertionPoint = searchPath.end(); - Strings paths = tokenizeString(getEnv("NIX_PATH", ""), ":"); - foreach (Strings::iterator, i, paths) addToSearchPath(*i); - addToSearchPath("nix=" + settings.nixDataDir + "/nix/corepkgs"); - searchPathInsertionPoint = searchPath.begin(); - - createBaseEnv(); -} - - -EvalState::~EvalState() -{ -} - - -void EvalState::addConstant(const string & name, Value & v) -{ - Value * v2 = allocValue(); - *v2 = v; - staticBaseEnv.vars[symbols.create(name)] = baseEnvDispl; - baseEnv.values[baseEnvDispl++] = v2; - string name2 = string(name, 0, 2) == "__" ? string(name, 2) : name; - baseEnv.values[0]->attrs->push_back(Attr(symbols.create(name2), v2)); -} - - -void EvalState::addPrimOp(const string & name, - unsigned int arity, PrimOpFun primOp) -{ - Value * v = allocValue(); - string name2 = string(name, 0, 2) == "__" ? string(name, 2) : name; - Symbol sym = symbols.create(name2); - v->type = tPrimOp; - v->primOp = NEW PrimOp(primOp, arity, sym); - staticBaseEnv.vars[symbols.create(name)] = baseEnvDispl; - baseEnv.values[baseEnvDispl++] = v; - baseEnv.values[0]->attrs->push_back(Attr(sym, v)); -} - - -void EvalState::getBuiltin(const string & name, Value & v) -{ - v = *baseEnv.values[0]->attrs->find(symbols.create(name))->value; -} - - -/* Every "format" object (even temporary) takes up a few hundred bytes - of stack space, which is a real killer in the recursive - evaluator. So here are some helper functions for throwing - exceptions. */ - -LocalNoInlineNoReturn(void throwEvalError(const char * s, const string & s2)) -{ - throw EvalError(format(s) % s2); -} - -LocalNoInlineNoReturn(void throwEvalError(const char * s, const string & s2, const string & s3)) -{ - throw EvalError(format(s) % s2 % s3); -} - -LocalNoInlineNoReturn(void throwEvalError(const char * s, const Symbol & sym, const Pos & p1, const Pos & p2)) -{ - throw EvalError(format(s) % sym % p1 % p2); -} - -LocalNoInlineNoReturn(void throwTypeError(const char * s)) -{ - throw TypeError(s); -} - -LocalNoInlineNoReturn(void throwTypeError(const char * s, const string & s1)) -{ - throw TypeError(format(s) % s1); -} - -LocalNoInlineNoReturn(void throwTypeError(const char * s, const string & s1, const string & s2)) -{ - throw TypeError(format(s) % s1 % s2); -} - -LocalNoInlineNoReturn(void throwTypeError(const char * s, const ExprLambda & fun, const Symbol & s2)) -{ - throw TypeError(format(s) % fun.showNamePos() % s2); -} - -LocalNoInlineNoReturn(void throwAssertionError(const char * s, const Pos & pos)) -{ - throw AssertionError(format(s) % pos); -} - -LocalNoInlineNoReturn(void throwUndefinedVarError(const char * s, const string & s1, const Pos & pos)) -{ - throw UndefinedVarError(format(s) % s1 % pos); -} - -LocalNoInline(void addErrorPrefix(Error & e, const char * s, const string & s2)) -{ - e.addPrefix(format(s) % s2); -} - -LocalNoInline(void addErrorPrefix(Error & e, const char * s, const ExprLambda & fun)) -{ - e.addPrefix(format(s) % fun.showNamePos()); -} - -LocalNoInline(void addErrorPrefix(Error & e, const char * s, const string & s2, const Pos & pos)) -{ - e.addPrefix(format(s) % s2 % pos); -} - - -void mkString(Value & v, const char * s) -{ - mkStringNoCopy(v, GC_STRDUP(s)); -} - - -void mkString(Value & v, const string & s, const PathSet & context) -{ - mkString(v, s.c_str()); - if (!context.empty()) { - unsigned int n = 0; - v.string.context = (const char * *) - GC_MALLOC((context.size() + 1) * sizeof(char *)); - foreach (PathSet::const_iterator, i, context) - v.string.context[n++] = GC_STRDUP(i->c_str()); - v.string.context[n] = 0; - } -} - - -void mkPath(Value & v, const char * s) -{ - mkPathNoCopy(v, GC_STRDUP(s)); -} - - -inline Value * EvalState::lookupVar(Env * env, const ExprVar & var, bool noEval) -{ - for (unsigned int l = var.level; l; --l, env = env->up) ; - - if (!var.fromWith) return env->values[var.displ]; - - while (1) { - if (!env->haveWithAttrs) { - if (noEval) return 0; - Value * v = allocValue(); - evalAttrs(*env->up, (Expr *) env->values[0], *v); - env->values[0] = v; - env->haveWithAttrs = true; - } - Bindings::iterator j = env->values[0]->attrs->find(var.name); - if (j != env->values[0]->attrs->end()) { - if (countCalls && j->pos) attrSelects[*j->pos]++; - return j->value; - } - if (!env->prevWith) - throwUndefinedVarError("undefined variable `%1%' at %2%", var.name, var.pos); - for (unsigned int l = env->prevWith; l; --l, env = env->up) ; - } -} - - -Value * EvalState::allocValue() -{ - nrValues++; - return (Value *) GC_MALLOC(sizeof(Value)); -} - - -Env & EvalState::allocEnv(unsigned int size) -{ - nrEnvs++; - nrValuesInEnvs += size; - Env * env = (Env *) GC_MALLOC(sizeof(Env) + size * sizeof(Value *)); - - /* Clear the values because maybeThunk() and lookupVar fromWith expects this. */ - for (unsigned i = 0; i < size; ++i) - env->values[i] = 0; - - return *env; -} - - -Value * EvalState::allocAttr(Value & vAttrs, const Symbol & name) -{ - Value * v = allocValue(); - vAttrs.attrs->push_back(Attr(name, v)); - return v; -} - - -void EvalState::mkList(Value & v, unsigned int length) -{ - v.type = tList; - v.list.length = length; - v.list.elems = length ? (Value * *) GC_MALLOC(length * sizeof(Value *)) : 0; - nrListElems += length; -} - - -void EvalState::mkAttrs(Value & v, unsigned int expected) -{ - clearValue(v); - v.type = tAttrs; - v.attrs = NEW Bindings; - v.attrs->reserve(expected); - nrAttrsets++; -} - - -unsigned long nrThunks = 0; - -static inline void mkThunk(Value & v, Env & env, Expr * expr) -{ - v.type = tThunk; - v.thunk.env = &env; - v.thunk.expr = expr; - nrThunks++; -} - - -void EvalState::mkThunk_(Value & v, Expr * expr) -{ - mkThunk(v, baseEnv, expr); -} - - -void EvalState::mkPos(Value & v, Pos * pos) -{ - if (pos) { - mkAttrs(v, 3); - mkString(*allocAttr(v, sFile), pos->file); - mkInt(*allocAttr(v, sLine), pos->line); - mkInt(*allocAttr(v, sColumn), pos->column); - v.attrs->sort(); - } else - mkNull(v); -} - - -/* Create a thunk for the delayed computation of the given expression - in the given environment. But if the expression is a variable, - then look it up right away. This significantly reduces the number - of thunks allocated. */ -Value * Expr::maybeThunk(EvalState & state, Env & env) -{ - Value * v = state.allocValue(); - mkThunk(*v, env, this); - return v; -} - - -unsigned long nrAvoided = 0; - -Value * ExprVar::maybeThunk(EvalState & state, Env & env) -{ - Value * v = state.lookupVar(&env, *this, true); - /* The value might not be initialised in the environment yet. - In that case, ignore it. */ - if (v) { nrAvoided++; return v; } - return Expr::maybeThunk(state, env); -} - - -Value * ExprString::maybeThunk(EvalState & state, Env & env) -{ - nrAvoided++; - return &v; -} - -Value * ExprInt::maybeThunk(EvalState & state, Env & env) -{ - nrAvoided++; - return &v; -} - -Value * ExprPath::maybeThunk(EvalState & state, Env & env) -{ - nrAvoided++; - return &v; -} - - -void EvalState::evalFile(const Path & path, Value & v) -{ - FileEvalCache::iterator i; - if ((i = fileEvalCache.find(path)) != fileEvalCache.end()) { - v = i->second; - return; - } - - Path path2 = resolveExprPath(path); - if ((i = fileEvalCache.find(path2)) != fileEvalCache.end()) { - v = i->second; - return; - } - - startNest(nest, lvlTalkative, format("evaluating file `%1%'") % path2); - Expr * e = parseExprFromFile(path2); - try { - eval(e, v); - } catch (Error & e) { - addErrorPrefix(e, "while evaluating the file `%1%':\n", path2); - throw; - } - - fileEvalCache[path2] = v; - if (path != path2) fileEvalCache[path] = v; -} - - -void EvalState::resetFileCache() -{ - fileEvalCache.clear(); -} - - -void EvalState::eval(Expr * e, Value & v) -{ - e->eval(*this, baseEnv, v); -} - - -inline bool EvalState::evalBool(Env & env, Expr * e) -{ - Value v; - e->eval(*this, env, v); - if (v.type != tBool) - throwTypeError("value is %1% while a Boolean was expected", v); - return v.boolean; -} - - -inline void EvalState::evalAttrs(Env & env, Expr * e, Value & v) -{ - e->eval(*this, env, v); - if (v.type != tAttrs) - throwTypeError("value is %1% while a set was expected", v); -} - - -void Expr::eval(EvalState & state, Env & env, Value & v) -{ - abort(); -} - - -void ExprInt::eval(EvalState & state, Env & env, Value & v) -{ - v = this->v; -} - - -void ExprString::eval(EvalState & state, Env & env, Value & v) -{ - v = this->v; -} - - -void ExprPath::eval(EvalState & state, Env & env, Value & v) -{ - v = this->v; -} - - -void ExprAttrs::eval(EvalState & state, Env & env, Value & v) -{ - state.mkAttrs(v, attrs.size()); - Env *dynamicEnv = &env; - - if (recursive) { - /* Create a new environment that contains the attributes in - this `rec'. */ - Env & env2(state.allocEnv(attrs.size())); - env2.up = &env; - dynamicEnv = &env2; - - AttrDefs::iterator overrides = attrs.find(state.sOverrides); - bool hasOverrides = overrides != attrs.end(); - - /* The recursive attributes are evaluated in the new - environment, while the inherited attributes are evaluated - in the original environment. */ - unsigned int displ = 0; - foreach (AttrDefs::iterator, i, attrs) { - Value * vAttr; - if (hasOverrides && !i->second.inherited) { - vAttr = state.allocValue(); - mkThunk(*vAttr, env2, i->second.e); - } else - vAttr = i->second.e->maybeThunk(state, i->second.inherited ? env : env2); - env2.values[displ++] = vAttr; - v.attrs->push_back(Attr(i->first, vAttr, &i->second.pos)); - } - - /* If the rec contains an attribute called `__overrides', then - evaluate it, and add the attributes in that set to the rec. - This allows overriding of recursive attributes, which is - otherwise not possible. (You can use the // operator to - replace an attribute, but other attributes in the rec will - still reference the original value, because that value has - been substituted into the bodies of the other attributes. - Hence we need __overrides.) */ - if (hasOverrides) { - Value * vOverrides = (*v.attrs)[overrides->second.displ].value; - state.forceAttrs(*vOverrides); - foreach (Bindings::iterator, i, *vOverrides->attrs) { - AttrDefs::iterator j = attrs.find(i->name); - if (j != attrs.end()) { - (*v.attrs)[j->second.displ] = *i; - env2.values[j->second.displ] = i->value; - } else - v.attrs->push_back(*i); - } - v.attrs->sort(); - } - } - - else - foreach (AttrDefs::iterator, i, attrs) - v.attrs->push_back(Attr(i->first, i->second.e->maybeThunk(state, env), &i->second.pos)); - - /* dynamic attrs apply *after* rec and __overrides */ - foreach (DynamicAttrDefs::iterator, i, dynamicAttrs) { - Value nameVal; - if (i->nameExpr->es->size() == 1) { - i->nameExpr->es->front()->eval(state, *dynamicEnv, nameVal); - state.forceValue(nameVal); - if (nameVal.type == tNull) - continue; - } - i->nameExpr->eval(state, *dynamicEnv, nameVal); - state.forceStringNoCtx(nameVal); - Symbol nameSym = state.symbols.create(nameVal.string.s); - Bindings::iterator j = v.attrs->find(nameSym); - if (j != v.attrs->end()) - throwEvalError("dynamic attribute `%1%' at %2% already defined at %3%", nameSym, i->pos, *j->pos); - - i->valueExpr->setName(nameSym); - /* Keep sorted order so find can catch duplicates */ - v.attrs->insert(lower_bound(v.attrs->begin(), v.attrs->end(), Attr(nameSym, 0)), - Attr(nameSym, i->valueExpr->maybeThunk(state, *dynamicEnv), &i->pos)); - } -} - - -void ExprLet::eval(EvalState & state, Env & env, Value & v) -{ - /* Create a new environment that contains the attributes in this - `let'. */ - Env & env2(state.allocEnv(attrs->attrs.size())); - env2.up = &env; - - /* The recursive attributes are evaluated in the new environment, - while the inherited attributes are evaluated in the original - environment. */ - unsigned int displ = 0; - foreach (ExprAttrs::AttrDefs::iterator, i, attrs->attrs) - env2.values[displ++] = i->second.e->maybeThunk(state, i->second.inherited ? env : env2); - - body->eval(state, env2, v); -} - - -void ExprList::eval(EvalState & state, Env & env, Value & v) -{ - state.mkList(v, elems.size()); - for (unsigned int n = 0; n < v.list.length; ++n) - v.list.elems[n] = elems[n]->maybeThunk(state, env); -} - - -void ExprVar::eval(EvalState & state, Env & env, Value & v) -{ - Value * v2 = state.lookupVar(&env, *this, false); - state.forceValue(*v2); - v = *v2; -} - - -unsigned long nrLookups = 0; - -void ExprSelect::eval(EvalState & state, Env & env, Value & v) -{ - Value vTmp; - Pos * pos = 0; - Value * vAttrs = &vTmp; - - e->eval(state, env, vTmp); - - try { - - foreach (AttrPath::const_iterator, i, attrPath) { - nrLookups++; - Bindings::iterator j; - Symbol name = getName(*i, state, env); - if (def) { - state.forceValue(*vAttrs); - if (vAttrs->type != tAttrs || - (j = vAttrs->attrs->find(name)) == vAttrs->attrs->end()) - { - def->eval(state, env, v); - return; - } - } else { - state.forceAttrs(*vAttrs); - if ((j = vAttrs->attrs->find(name)) == vAttrs->attrs->end()) - throwEvalError("attribute `%1%' missing", showAttrPath(attrPath)); - } - vAttrs = j->value; - pos = j->pos; - if (state.countCalls && pos) state.attrSelects[*pos]++; - } - - state.forceValue(*vAttrs); - - } catch (Error & e) { - if (pos && pos->file != state.sDerivationNix) - addErrorPrefix(e, "while evaluating the attribute `%1%' at %2%:\n", - showAttrPath(attrPath), *pos); - throw; - } - - v = *vAttrs; -} - - -void ExprOpHasAttr::eval(EvalState & state, Env & env, Value & v) -{ - Value vTmp; - Value * vAttrs = &vTmp; - - e->eval(state, env, vTmp); - - foreach (AttrPath::const_iterator, i, attrPath) { - state.forceValue(*vAttrs); - Bindings::iterator j; - Symbol name = getName(*i, state, env); - if (vAttrs->type != tAttrs || - (j = vAttrs->attrs->find(name)) == vAttrs->attrs->end()) - { - mkBool(v, false); - return; - } else { - vAttrs = j->value; - } - } - - mkBool(v, true); -} - - -void ExprLambda::eval(EvalState & state, Env & env, Value & v) -{ - v.type = tLambda; - v.lambda.env = &env; - v.lambda.fun = this; -} - - -void ExprApp::eval(EvalState & state, Env & env, Value & v) -{ - /* FIXME: vFun prevents GCC from doing tail call optimisation. */ - Value vFun; - e1->eval(state, env, vFun); - state.callFunction(vFun, *(e2->maybeThunk(state, env)), v); -} - - -void EvalState::callPrimOp(Value & fun, Value & arg, Value & v) -{ - /* Figure out the number of arguments still needed. */ - unsigned int argsDone = 0; - Value * primOp = &fun; - while (primOp->type == tPrimOpApp) { - argsDone++; - primOp = primOp->primOpApp.left; - } - assert(primOp->type == tPrimOp); - unsigned int arity = primOp->primOp->arity; - unsigned int argsLeft = arity - argsDone; - - if (argsLeft == 1) { - /* We have all the arguments, so call the primop. */ - - /* Put all the arguments in an array. */ - Value * vArgs[arity]; - unsigned int n = arity - 1; - vArgs[n--] = &arg; - for (Value * arg = &fun; arg->type == tPrimOpApp; arg = arg->primOpApp.left) - vArgs[n--] = arg->primOpApp.right; - - /* And call the primop. */ - nrPrimOpCalls++; - if (countCalls) primOpCalls[primOp->primOp->name]++; - primOp->primOp->fun(*this, vArgs, v); - } else { - Value * fun2 = allocValue(); - *fun2 = fun; - v.type = tPrimOpApp; - v.primOpApp.left = fun2; - v.primOpApp.right = &arg; - } -} - - -void EvalState::callFunction(Value & fun, Value & arg, Value & v) -{ - if (fun.type == tPrimOp || fun.type == tPrimOpApp) { - callPrimOp(fun, arg, v); - return; - } - - if (fun.type != tLambda) - throwTypeError("attempt to call something which is not a function but %1%", fun); - - ExprLambda & lambda(*fun.lambda.fun); - - unsigned int size = - (lambda.arg.empty() ? 0 : 1) + - (lambda.matchAttrs ? lambda.formals->formals.size() : 0); - Env & env2(allocEnv(size)); - env2.up = fun.lambda.env; - - unsigned int displ = 0; - - if (!lambda.matchAttrs) - env2.values[displ++] = &arg; - - else { - forceAttrs(arg); - - if (!lambda.arg.empty()) - env2.values[displ++] = &arg; - - /* For each formal argument, get the actual argument. If - there is no matching actual argument but the formal - argument has a default, use the default. */ - unsigned int attrsUsed = 0; - foreach (Formals::Formals_::iterator, i, lambda.formals->formals) { - Bindings::iterator j = arg.attrs->find(i->name); - if (j == arg.attrs->end()) { - if (!i->def) throwTypeError("%1% called without required argument `%2%'", - lambda, i->name); - env2.values[displ++] = i->def->maybeThunk(*this, env2); - } else { - attrsUsed++; - env2.values[displ++] = j->value; - } - } - - /* Check that each actual argument is listed as a formal - argument (unless the attribute match specifies a `...'). */ - if (!lambda.formals->ellipsis && attrsUsed != arg.attrs->size()) { - /* Nope, so show the first unexpected argument to the - user. */ - foreach (Bindings::iterator, i, *arg.attrs) - if (lambda.formals->argNames.find(i->name) == lambda.formals->argNames.end()) - throwTypeError("%1% called with unexpected argument `%2%'", lambda, i->name); - abort(); // can't happen - } - } - - nrFunctionCalls++; - if (countCalls) incrFunctionCall(&lambda); - - /* Evaluate the body. This is conditional on showTrace, because - catching exceptions makes this function not tail-recursive. */ - if (settings.showTrace) - try { - lambda.body->eval(*this, env2, v); - } catch (Error & e) { - addErrorPrefix(e, "while evaluating %1%:\n", lambda); - throw; - } - else - fun.lambda.fun->body->eval(*this, env2, v); -} - - -// Lifted out of callFunction() because it creates a temporary that -// prevents tail-call optimisation. -void EvalState::incrFunctionCall(ExprLambda * fun) -{ - functionCalls[fun]++; -} - - -void EvalState::autoCallFunction(Bindings & args, Value & fun, Value & res) -{ - forceValue(fun); - - if (fun.type != tLambda || !fun.lambda.fun->matchAttrs) { - res = fun; - return; - } - - Value * actualArgs = allocValue(); - mkAttrs(*actualArgs, fun.lambda.fun->formals->formals.size()); - - foreach (Formals::Formals_::iterator, i, fun.lambda.fun->formals->formals) { - Bindings::iterator j = args.find(i->name); - if (j != args.end()) - actualArgs->attrs->push_back(*j); - else if (!i->def) - throwTypeError("cannot auto-call a function that has an argument without a default value (`%1%')", i->name); - } - - actualArgs->attrs->sort(); - - callFunction(fun, *actualArgs, res); -} - - -void ExprWith::eval(EvalState & state, Env & env, Value & v) -{ - Env & env2(state.allocEnv(1)); - env2.up = &env; - env2.prevWith = prevWith; - env2.haveWithAttrs = false; - env2.values[0] = (Value *) attrs; - - body->eval(state, env2, v); -} - - -void ExprIf::eval(EvalState & state, Env & env, Value & v) -{ - (state.evalBool(env, cond) ? then : else_)->eval(state, env, v); -} - - -void ExprAssert::eval(EvalState & state, Env & env, Value & v) -{ - if (!state.evalBool(env, cond)) - throwAssertionError("assertion failed at %1%", pos); - body->eval(state, env, v); -} - - -void ExprOpNot::eval(EvalState & state, Env & env, Value & v) -{ - mkBool(v, !state.evalBool(env, e)); -} - - -void ExprBuiltin::eval(EvalState & state, Env & env, Value & v) -{ - // Not a hot path at all, but would be nice to access state.baseEnv directly - Env *baseEnv = &env; - while (baseEnv->up) baseEnv = baseEnv->up; - Bindings::iterator binding = baseEnv->values[0]->attrs->find(name); - assert(binding != baseEnv->values[0]->attrs->end()); - v = *binding->value; -} - - -void ExprOpEq::eval(EvalState & state, Env & env, Value & v) -{ - Value v1; e1->eval(state, env, v1); - Value v2; e2->eval(state, env, v2); - mkBool(v, state.eqValues(v1, v2)); -} - - -void ExprOpNEq::eval(EvalState & state, Env & env, Value & v) -{ - Value v1; e1->eval(state, env, v1); - Value v2; e2->eval(state, env, v2); - mkBool(v, !state.eqValues(v1, v2)); -} - - -void ExprOpAnd::eval(EvalState & state, Env & env, Value & v) -{ - mkBool(v, state.evalBool(env, e1) && state.evalBool(env, e2)); -} - - -void ExprOpOr::eval(EvalState & state, Env & env, Value & v) -{ - mkBool(v, state.evalBool(env, e1) || state.evalBool(env, e2)); -} - - -void ExprOpImpl::eval(EvalState & state, Env & env, Value & v) -{ - mkBool(v, !state.evalBool(env, e1) || state.evalBool(env, e2)); -} - - -void ExprOpUpdate::eval(EvalState & state, Env & env, Value & v) -{ - Value v1, v2; - state.evalAttrs(env, e1, v1); - state.evalAttrs(env, e2, v2); - - state.nrOpUpdates++; - - if (v1.attrs->size() == 0) { v = v2; return; } - if (v2.attrs->size() == 0) { v = v1; return; } - - state.mkAttrs(v, v1.attrs->size() + v2.attrs->size()); - - /* Merge the sets, preferring values from the second set. Make - sure to keep the resulting vector in sorted order. */ - Bindings::iterator i = v1.attrs->begin(); - Bindings::iterator j = v2.attrs->begin(); - - while (i != v1.attrs->end() && j != v2.attrs->end()) { - if (i->name == j->name) { - v.attrs->push_back(*j); - ++i; ++j; - } - else if (i->name < j->name) - v.attrs->push_back(*i++); - else - v.attrs->push_back(*j++); - } - - while (i != v1.attrs->end()) v.attrs->push_back(*i++); - while (j != v2.attrs->end()) v.attrs->push_back(*j++); - - state.nrOpUpdateValuesCopied += v.attrs->size(); -} - - -void ExprOpConcatLists::eval(EvalState & state, Env & env, Value & v) -{ - Value v1; e1->eval(state, env, v1); - Value v2; e2->eval(state, env, v2); - Value * lists[2] = { &v1, &v2 }; - state.concatLists(v, 2, lists); -} - - -void EvalState::concatLists(Value & v, unsigned int nrLists, Value * * lists) -{ - nrListConcats++; - - Value * nonEmpty = 0; - unsigned int len = 0; - for (unsigned int n = 0; n < nrLists; ++n) { - forceList(*lists[n]); - unsigned int l = lists[n]->list.length; - len += l; - if (l) nonEmpty = lists[n]; - } - - if (nonEmpty && len == nonEmpty->list.length) { - v = *nonEmpty; - return; - } - - mkList(v, len); - for (unsigned int n = 0, pos = 0; n < nrLists; ++n) { - unsigned int l = lists[n]->list.length; - memcpy(v.list.elems + pos, lists[n]->list.elems, l * sizeof(Value *)); - pos += l; - } -} - - -void ExprConcatStrings::eval(EvalState & state, Env & env, Value & v) -{ - PathSet context; - std::ostringstream s; - NixInt n = 0; - - bool first = !forceString; - ValueType firstType = tString; - - foreach (vector::iterator, i, *es) { - Value vTmp; - (*i)->eval(state, env, vTmp); - - /* If the first element is a path, then the result will also - be a path, we don't copy anything (yet - that's done later, - since paths are copied when they are used in a derivation), - and none of the strings are allowed to have contexts. */ - if (first) { - firstType = vTmp.type; - first = false; - } - - if (firstType == tInt) { - if (vTmp.type != tInt) - throwEvalError("cannot add %1% to an integer", showType(vTmp)); - n += vTmp.integer; - } else - s << state.coerceToString(vTmp, context, false, firstType == tString); - } - - if (firstType == tInt) - mkInt(v, n); - else if (firstType == tPath) { - if (!context.empty()) - throwEvalError("a string that refers to a store path cannot be appended to a path, in `%1%'", s.str()); - mkPath(v, s.str().c_str()); - } else - mkString(v, s.str(), context); -} - - -void ExprPos::eval(EvalState & state, Env & env, Value & v) -{ - state.mkPos(v, &pos); -} - - -void EvalState::strictForceValue(Value & v) -{ - forceValue(v); - - if (v.type == tAttrs) { - foreach (Bindings::iterator, i, *v.attrs) - strictForceValue(*i->value); - } - - else if (v.type == tList) { - for (unsigned int n = 0; n < v.list.length; ++n) - strictForceValue(*v.list.elems[n]); - } -} - - -NixInt EvalState::forceInt(Value & v) -{ - forceValue(v); - if (v.type != tInt) - throwTypeError("value is %1% while an integer was expected", v); - return v.integer; -} - - -bool EvalState::forceBool(Value & v) -{ - forceValue(v); - if (v.type != tBool) - throwTypeError("value is %1% while a Boolean was expected", v); - return v.boolean; -} - - -void EvalState::forceFunction(Value & v) -{ - forceValue(v); - if (v.type != tLambda && v.type != tPrimOp && v.type != tPrimOpApp) - throwTypeError("value is %1% while a function was expected", v); -} - - -string EvalState::forceString(Value & v) -{ - forceValue(v); - if (v.type != tString) - throwTypeError("value is %1% while a string was expected", v); - return string(v.string.s); -} - - -void copyContext(const Value & v, PathSet & context) -{ - if (v.string.context) - for (const char * * p = v.string.context; *p; ++p) - context.insert(*p); -} - - -string EvalState::forceString(Value & v, PathSet & context) -{ - string s = forceString(v); - copyContext(v, context); - return s; -} - - -string EvalState::forceStringNoCtx(Value & v) -{ - string s = forceString(v); - if (v.string.context) - throwEvalError("the string `%1%' is not allowed to refer to a store path (such as `%2%')", - v.string.s, v.string.context[0]); - return s; -} - - -bool EvalState::isDerivation(Value & v) -{ - if (v.type != tAttrs) return false; - Bindings::iterator i = v.attrs->find(sType); - if (i == v.attrs->end()) return false; - forceValue(*i->value); - if (i->value->type != tString) return false; - return strcmp(i->value->string.s, "derivation") == 0; -} - - -string EvalState::coerceToString(Value & v, PathSet & context, - bool coerceMore, bool copyToStore) -{ - forceValue(v); - - string s; - - if (v.type == tString) { - copyContext(v, context); - return v.string.s; - } - - if (v.type == tPath) { - Path path(canonPath(v.path)); - return copyToStore ? copyPathToStore(context, path) : path; - } - - if (v.type == tAttrs) { - Bindings::iterator i = v.attrs->find(sOutPath); - if (i == v.attrs->end()) throwTypeError("cannot coerce a set to a string"); - return coerceToString(*i->value, context, coerceMore, copyToStore); - } - - if (coerceMore) { - - /* Note that `false' is represented as an empty string for - shell scripting convenience, just like `null'. */ - if (v.type == tBool && v.boolean) return "1"; - if (v.type == tBool && !v.boolean) return ""; - if (v.type == tInt) return int2String(v.integer); - if (v.type == tNull) return ""; - - if (v.type == tList) { - string result; - for (unsigned int n = 0; n < v.list.length; ++n) { - result += coerceToString(*v.list.elems[n], - context, coerceMore, copyToStore); - if (n < v.list.length - 1 - /* !!! not quite correct */ - && (v.list.elems[n]->type != tList || v.list.elems[n]->list.length != 0)) - result += " "; - } - return result; - } - } - - throwTypeError("cannot coerce %1% to a string", v); -} - - -string EvalState::copyPathToStore(PathSet & context, const Path & path) -{ - if (nix::isDerivation(path)) - throwEvalError("file names are not allowed to end in `%1%'", drvExtension); - - Path dstPath; - if (srcToStore[path] != "") - dstPath = srcToStore[path]; - else { - dstPath = settings.readOnlyMode - ? computeStorePathForPath(path).first - : store->addToStore(path, true, htSHA256, defaultPathFilter, repair); - srcToStore[path] = dstPath; - printMsg(lvlChatty, format("copied source `%1%' -> `%2%'") - % path % dstPath); - } - - context.insert(dstPath); - return dstPath; -} - - -Path EvalState::coerceToPath(Value & v, PathSet & context) -{ - string path = coerceToString(v, context, false, false); - if (path == "" || path[0] != '/') - throwEvalError("string `%1%' doesn't represent an absolute path", path); - return path; -} - - -bool EvalState::eqValues(Value & v1, Value & v2) -{ - forceValue(v1); - forceValue(v2); - - /* !!! Hack to support some old broken code that relies on pointer - equality tests between sets. (Specifically, builderDefs calls - uniqList on a list of sets.) Will remove this eventually. */ - if (&v1 == &v2) return true; - - if (v1.type != v2.type) return false; - - switch (v1.type) { - - case tInt: - return v1.integer == v2.integer; - - case tBool: - return v1.boolean == v2.boolean; - - case tString: { - /* Compare both the string and its context. */ - if (strcmp(v1.string.s, v2.string.s) != 0) return false; - const char * * p = v1.string.context, * * q = v2.string.context; - if (!p && !q) return true; - if (!p || !q) return false; - for ( ; *p && *q; ++p, ++q) - if (strcmp(*p, *q) != 0) return false; - if (*p || *q) return false; - return true; - } - - case tPath: - return strcmp(v1.path, v2.path) == 0; - - case tNull: - return true; - - case tList: - if (v1.list.length != v2.list.length) return false; - for (unsigned int n = 0; n < v1.list.length; ++n) - if (!eqValues(*v1.list.elems[n], *v2.list.elems[n])) return false; - return true; - - case tAttrs: { - /* If both sets denote a derivation (type = "derivation"), - then compare their outPaths. */ - if (isDerivation(v1) && isDerivation(v2)) { - Bindings::iterator i = v1.attrs->find(sOutPath); - Bindings::iterator j = v2.attrs->find(sOutPath); - if (i != v1.attrs->end() && j != v2.attrs->end()) - return eqValues(*i->value, *j->value); - } - - if (v1.attrs->size() != v2.attrs->size()) return false; - - /* Otherwise, compare the attributes one by one. */ - Bindings::iterator i, j; - for (i = v1.attrs->begin(), j = v2.attrs->begin(); i != v1.attrs->end(); ++i, ++j) - if (i->name != j->name || !eqValues(*i->value, *j->value)) - return false; - - return true; - } - - /* Functions are incomparable. */ - case tLambda: - case tPrimOp: - case tPrimOpApp: - return false; - - default: - throwEvalError("cannot compare %1% with %2%", showType(v1), showType(v2)); - } -} - - -void EvalState::printStats() -{ - bool showStats = getEnv("NIX_SHOW_STATS", "0") != "0"; - Verbosity v = showStats ? lvlInfo : lvlDebug; - printMsg(v, "evaluation statistics:"); - - struct rusage buf; - getrusage(RUSAGE_SELF, &buf); - float cpuTime = buf.ru_utime.tv_sec + ((float) buf.ru_utime.tv_usec / 1000000); - - printMsg(v, format(" time elapsed: %1%") % cpuTime); - printMsg(v, format(" size of a value: %1%") % sizeof(Value)); - printMsg(v, format(" environments allocated: %1% (%2% bytes)") - % nrEnvs % (nrEnvs * sizeof(Env) + nrValuesInEnvs * sizeof(Value *))); - printMsg(v, format(" list elements: %1% (%2% bytes)") - % nrListElems % (nrListElems * sizeof(Value *))); - printMsg(v, format(" list concatenations: %1%") % nrListConcats); - printMsg(v, format(" values allocated: %1% (%2% bytes)") - % nrValues % (nrValues * sizeof(Value))); - printMsg(v, format(" sets allocated: %1%") % nrAttrsets); - printMsg(v, format(" right-biased unions: %1%") % nrOpUpdates); - printMsg(v, format(" values copied in right-biased unions: %1%") % nrOpUpdateValuesCopied); - printMsg(v, format(" symbols in symbol table: %1%") % symbols.size()); - printMsg(v, format(" size of symbol table: %1%") % symbols.totalSize()); - printMsg(v, format(" number of thunks: %1%") % nrThunks); - printMsg(v, format(" number of thunks avoided: %1%") % nrAvoided); - printMsg(v, format(" number of attr lookups: %1%") % nrLookups); - printMsg(v, format(" number of primop calls: %1%") % nrPrimOpCalls); - printMsg(v, format(" number of function calls: %1%") % nrFunctionCalls); - - if (countCalls) { - v = lvlInfo; - - printMsg(v, format("calls to %1% primops:") % primOpCalls.size()); - typedef std::multimap PrimOpCalls_; - PrimOpCalls_ primOpCalls_; - foreach (PrimOpCalls::iterator, i, primOpCalls) - primOpCalls_.insert(std::pair(i->second, i->first)); - foreach_reverse (PrimOpCalls_::reverse_iterator, i, primOpCalls_) - printMsg(v, format("%1$10d %2%") % i->first % i->second); - - printMsg(v, format("calls to %1% functions:") % functionCalls.size()); - typedef std::multimap FunctionCalls_; - FunctionCalls_ functionCalls_; - foreach (FunctionCalls::iterator, i, functionCalls) - functionCalls_.insert(std::pair(i->second, i->first)); - foreach_reverse (FunctionCalls_::reverse_iterator, i, functionCalls_) - printMsg(v, format("%1$10d %2%") % i->first % i->second->showNamePos()); - - printMsg(v, format("evaluations of %1% attributes:") % attrSelects.size()); - typedef std::multimap AttrSelects_; - AttrSelects_ attrSelects_; - foreach (AttrSelects::iterator, i, attrSelects) - attrSelects_.insert(std::pair(i->second, i->first)); - foreach_reverse (AttrSelects_::reverse_iterator, i, attrSelects_) - printMsg(v, format("%1$10d %2%") % i->first % i->second); - - } -} - - -} diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh deleted file mode 100644 index 58d1318c2a..0000000000 --- a/src/libexpr/eval.hh +++ /dev/null @@ -1,293 +0,0 @@ -#pragma once - -#include "value.hh" -#include "nixexpr.hh" -#include "symbol-table.hh" -#include "hash.hh" - -#include - -#if HAVE_BOEHMGC -#include -#endif - - -namespace nix { - - -class EvalState; -struct Attr; - - -/* Sets are represented as a vector of attributes, sorted by symbol - (i.e. pointer to the attribute name in the symbol table). */ -#if HAVE_BOEHMGC -typedef std::vector > BindingsBase; -#else -typedef std::vector BindingsBase; -#endif - - -class Bindings : public BindingsBase -{ -public: - iterator find(const Symbol & name); - void sort(); -}; - - -typedef void (* PrimOpFun) (EvalState & state, Value * * args, Value & v); - - -struct PrimOp -{ - PrimOpFun fun; - unsigned int arity; - Symbol name; - PrimOp(PrimOpFun fun, unsigned int arity, Symbol name) - : fun(fun), arity(arity), name(name) { } -}; - - -struct Env -{ - Env * up; - unsigned short prevWith; // nr of levels up to next `with' environment - bool haveWithAttrs; - Value * values[0]; -}; - - -struct Attr -{ - Symbol name; - Value * value; - Pos * pos; - Attr(Symbol name, Value * value, Pos * pos = &noPos) - : name(name), value(value), pos(pos) { }; - Attr() : pos(&noPos) { }; - bool operator < (const Attr & a) const - { - return name < a.name; - } -}; - - -void mkString(Value & v, const string & s, const PathSet & context = PathSet()); - -void copyContext(const Value & v, PathSet & context); - - -/* Cache for calls to addToStore(); maps source paths to the store - paths. */ -typedef std::map SrcToStore; - - -std::ostream & operator << (std::ostream & str, const Value & v); - - -class EvalState -{ -public: - SymbolTable symbols; - - const Symbol sWith, sOutPath, sDrvPath, sType, sMeta, sName, sValue, - sSystem, sOverrides, sOutputs, sOutputName, sIgnoreNulls, - sFile, sLine, sColumn; - Symbol sDerivationNix; - - /* If set, force copying files to the Nix store even if they - already exist there. */ - bool repair; - -private: - SrcToStore srcToStore; - - /* A cache from path names to values. */ -#if HAVE_BOEHMGC - typedef std::map, gc_allocator > > FileEvalCache; -#else - typedef std::map FileEvalCache; -#endif - FileEvalCache fileEvalCache; - - typedef list > SearchPath; - SearchPath searchPath; - SearchPath::iterator searchPathInsertionPoint; - -public: - - EvalState(); - ~EvalState(); - - void addToSearchPath(const string & s, bool warn = false); - - /* Parse a Nix expression from the specified file. */ - Expr * parseExprFromFile(const Path & path); - - /* Parse a Nix expression from the specified string. */ - Expr * parseExprFromString(const string & s, const Path & basePath, StaticEnv & staticEnv); - Expr * parseExprFromString(const string & s, const Path & basePath); - - /* Evaluate an expression read from the given file to normal - form. */ - void evalFile(const Path & path, Value & v); - - void resetFileCache(); - - /* Look up a file in the search path. */ - Path findFile(const string & path); - - /* Evaluate an expression to normal form, storing the result in - value `v'. */ - void eval(Expr * e, Value & v); - - /* Evaluation the expression, then verify that it has the expected - type. */ - inline bool evalBool(Env & env, Expr * e); - inline void evalAttrs(Env & env, Expr * e, Value & v); - - /* If `v' is a thunk, enter it and overwrite `v' with the result - of the evaluation of the thunk. If `v' is a delayed function - application, call the function and overwrite `v' with the - result. Otherwise, this is a no-op. */ - inline void forceValue(Value & v); - - /* Force a value, then recursively force list elements and - attributes. */ - void strictForceValue(Value & v); - - /* Force `v', and then verify that it has the expected type. */ - NixInt forceInt(Value & v); - bool forceBool(Value & v); - inline void forceAttrs(Value & v); - inline void forceList(Value & v); - void forceFunction(Value & v); // either lambda or primop - string forceString(Value & v); - string forceString(Value & v, PathSet & context); - string forceStringNoCtx(Value & v); - - /* Return true iff the value `v' denotes a derivation (i.e. a - set with attribute `type = "derivation"'). */ - bool isDerivation(Value & v); - - /* String coercion. Converts strings, paths and derivations to a - string. If `coerceMore' is set, also converts nulls, integers, - booleans and lists to a string. If `copyToStore' is set, - referenced paths are copied to the Nix store as a side effect. */ - string coerceToString(Value & v, PathSet & context, - bool coerceMore = false, bool copyToStore = true); - - string copyPathToStore(PathSet & context, const Path & path); - - /* Path coercion. Converts strings, paths and derivations to a - path. The result is guaranteed to be a canonicalised, absolute - path. Nothing is copied to the store. */ - Path coerceToPath(Value & v, PathSet & context); - -public: - - /* The base environment, containing the builtin functions and - values. */ - Env & baseEnv; - - /* The same, but used during parsing to resolve variables. */ - StaticEnv staticBaseEnv; // !!! should be private - -private: - - unsigned int baseEnvDispl; - - void createBaseEnv(); - - void addConstant(const string & name, Value & v); - - void addPrimOp(const string & name, - unsigned int arity, PrimOpFun primOp); - -public: - - void getBuiltin(const string & name, Value & v); - -private: - - inline Value * lookupVar(Env * env, const ExprVar & var, bool noEval); - - friend struct ExprVar; - friend struct ExprAttrs; - friend struct ExprLet; - - Expr * parse(const char * text, const Path & path, - const Path & basePath, StaticEnv & staticEnv); - -public: - - /* Do a deep equality test between two values. That is, list - elements and attributes are compared recursively. */ - bool eqValues(Value & v1, Value & v2); - - void callFunction(Value & fun, Value & arg, Value & v); - void callPrimOp(Value & fun, Value & arg, Value & v); - - /* Automatically call a function for which each argument has a - default value or has a binding in the `args' map. */ - void autoCallFunction(Bindings & args, Value & fun, Value & res); - - /* Allocation primitives. */ - Value * allocValue(); - Env & allocEnv(unsigned int size); - - Value * allocAttr(Value & vAttrs, const Symbol & name); - - void mkList(Value & v, unsigned int length); - void mkAttrs(Value & v, unsigned int expected); - void mkThunk_(Value & v, Expr * expr); - void mkPos(Value & v, Pos * pos); - - void concatLists(Value & v, unsigned int nrLists, Value * * lists); - - /* Print statistics. */ - void printStats(); - -private: - - unsigned long nrEnvs; - unsigned long nrValuesInEnvs; - unsigned long nrValues; - unsigned long nrListElems; - unsigned long nrAttrsets; - unsigned long nrOpUpdates; - unsigned long nrOpUpdateValuesCopied; - unsigned long nrListConcats; - unsigned long nrPrimOpCalls; - unsigned long nrFunctionCalls; - - bool countCalls; - - typedef std::map PrimOpCalls; - PrimOpCalls primOpCalls; - - typedef std::map FunctionCalls; - FunctionCalls functionCalls; - - void incrFunctionCall(ExprLambda * fun); - - typedef std::map AttrSelects; - AttrSelects attrSelects; - - friend struct ExprOpUpdate; - friend struct ExprOpConcatLists; - friend struct ExprSelect; - friend void prim_getAttr(EvalState & state, Value * * args, Value & v); -}; - - -/* Return a string representing the type of the value `v'. */ -string showType(const Value & v); - - -/* If `path' refers to a directory, then append "/default.nix". */ -Path resolveExprPath(Path path); - - -} diff --git a/src/libexpr/get-drvs.cc b/src/libexpr/get-drvs.cc deleted file mode 100644 index 0ed644e9bc..0000000000 --- a/src/libexpr/get-drvs.cc +++ /dev/null @@ -1,305 +0,0 @@ -#include "get-drvs.hh" -#include "util.hh" -#include "eval-inline.hh" - -#include - - -namespace nix { - - -string DrvInfo::queryDrvPath() -{ - if (drvPath == "" && attrs) { - Bindings::iterator i = attrs->find(state->sDrvPath); - PathSet context; - drvPath = i != attrs->end() ? state->coerceToPath(*i->value, context) : ""; - } - return drvPath; -} - - -string DrvInfo::queryOutPath() -{ - if (outPath == "" && attrs) { - Bindings::iterator i = attrs->find(state->sOutPath); - PathSet context; - outPath = i != attrs->end() ? state->coerceToPath(*i->value, context) : ""; - } - return outPath; -} - - -DrvInfo::Outputs DrvInfo::queryOutputs() -{ - if (outputs.empty()) { - /* Get the ‘outputs’ list. */ - Bindings::iterator i; - if (attrs && (i = attrs->find(state->sOutputs)) != attrs->end()) { - state->forceList(*i->value); - - /* For each output... */ - for (unsigned int j = 0; j < i->value->list.length; ++j) { - /* Evaluate the corresponding set. */ - string name = state->forceStringNoCtx(*i->value->list.elems[j]); - Bindings::iterator out = attrs->find(state->symbols.create(name)); - if (out == attrs->end()) continue; // FIXME: throw error? - state->forceAttrs(*out->value); - - /* And evaluate its ‘outPath’ attribute. */ - Bindings::iterator outPath = out->value->attrs->find(state->sOutPath); - if (outPath == out->value->attrs->end()) continue; // FIXME: throw error? - PathSet context; - outputs[name] = state->coerceToPath(*outPath->value, context); - } - } else - outputs["out"] = queryOutPath(); - } - return outputs; -} - - -string DrvInfo::queryOutputName() -{ - if (outputName == "" && attrs) { - Bindings::iterator i = attrs->find(state->sOutputName); - outputName = i != attrs->end() ? state->forceStringNoCtx(*i->value) : ""; - } - return outputName; -} - - -Bindings * DrvInfo::getMeta() -{ - if (meta) return meta; - if (!attrs) return 0; - Bindings::iterator a = attrs->find(state->sMeta); - if (a == attrs->end()) return 0; - state->forceAttrs(*a->value); - meta = a->value->attrs; - return meta; -} - - -StringSet DrvInfo::queryMetaNames() -{ - StringSet res; - if (!getMeta()) return res; - foreach (Bindings::iterator, i, *meta) - res.insert(i->name); - return res; -} - - -bool DrvInfo::checkMeta(Value & v) -{ - state->forceValue(v); - if (v.type == tList) { - for (unsigned int n = 0; n < v.list.length; ++n) - if (!checkMeta(*v.list.elems[n])) return false; - return true; - } - else if (v.type == tAttrs) { - Bindings::iterator i = v.attrs->find(state->sOutPath); - if (i != v.attrs->end()) return false; - foreach (Bindings::iterator, i, *v.attrs) - if (!checkMeta(*i->value)) return false; - return true; - } - else return v.type == tInt || v.type == tBool || v.type == tString; -} - - -Value * DrvInfo::queryMeta(const string & name) -{ - if (!getMeta()) return 0; - Bindings::iterator a = meta->find(state->symbols.create(name)); - if (a == meta->end() || !checkMeta(*a->value)) return 0; - return a->value; -} - - -string DrvInfo::queryMetaString(const string & name) -{ - Value * v = queryMeta(name); - if (!v || v->type != tString) return ""; - return v->string.s; -} - - -int DrvInfo::queryMetaInt(const string & name, int def) -{ - Value * v = queryMeta(name); - if (!v) return def; - if (v->type == tInt) return v->integer; - if (v->type == tString) { - /* Backwards compatibility with before we had support for - integer meta fields. */ - int n; - if (string2Int(v->string.s, n)) return n; - } - return def; -} - - -bool DrvInfo::queryMetaBool(const string & name, bool def) -{ - Value * v = queryMeta(name); - if (!v) return def; - if (v->type == tBool) return v->boolean; - if (v->type == tString) { - /* Backwards compatibility with before we had support for - Boolean meta fields. */ - if (strcmp(v->string.s, "true") == 0) return true; - if (strcmp(v->string.s, "false") == 0) return false; - } - return def; -} - - -void DrvInfo::setMeta(const string & name, Value * v) -{ - getMeta(); - Bindings * old = meta; - meta = new Bindings(); - Symbol sym = state->symbols.create(name); - if (old) - foreach (Bindings::iterator, i, *old) - if (i->name != sym) - meta->push_back(*i); - if (v) meta->push_back(Attr(sym, v)); - meta->sort(); -} - - -/* Cache for already considered attrsets. */ -typedef set Done; - - -/* Evaluate value `v'. If it evaluates to a set of type `derivation', - then put information about it in `drvs' (unless it's already in - `doneExprs'). The result boolean indicates whether it makes sense - for the caller to recursively search for derivations in `v'. */ -static bool getDerivation(EvalState & state, Value & v, - const string & attrPath, DrvInfos & drvs, Done & done, - bool ignoreAssertionFailures) -{ - try { - state.forceValue(v); - if (!state.isDerivation(v)) return true; - - /* Remove spurious duplicates (e.g., a set like `rec { x = - derivation {...}; y = x;}'. */ - if (done.find(v.attrs) != done.end()) return false; - done.insert(v.attrs); - - Bindings::iterator i = v.attrs->find(state.sName); - /* !!! We really would like to have a decent back trace here. */ - if (i == v.attrs->end()) throw TypeError("derivation name missing"); - - Bindings::iterator i2 = v.attrs->find(state.sSystem); - - DrvInfo drv( - state, - state.forceStringNoCtx(*i->value), - attrPath, - i2 == v.attrs->end() ? "unknown" : state.forceStringNoCtx(*i2->value), - v.attrs); - - drvs.push_back(drv); - return false; - - } catch (AssertionError & e) { - if (ignoreAssertionFailures) return false; - throw; - } -} - - -bool getDerivation(EvalState & state, Value & v, DrvInfo & drv, - bool ignoreAssertionFailures) -{ - Done done; - DrvInfos drvs; - getDerivation(state, v, "", drvs, done, ignoreAssertionFailures); - if (drvs.size() != 1) return false; - drv = drvs.front(); - return true; -} - - -static string addToPath(const string & s1, const string & s2) -{ - return s1.empty() ? s2 : s1 + "." + s2; -} - - -static void getDerivations(EvalState & state, Value & vIn, - const string & pathPrefix, Bindings & autoArgs, - DrvInfos & drvs, Done & done, - bool ignoreAssertionFailures) -{ - Value v; - state.autoCallFunction(autoArgs, vIn, v); - - /* Process the expression. */ - if (!getDerivation(state, v, pathPrefix, drvs, done, ignoreAssertionFailures)) ; - - else if (v.type == tAttrs) { - - /* !!! undocumented hackery to support combining channels in - nix-env.cc. */ - bool combineChannels = v.attrs->find(state.symbols.create("_combineChannels")) != v.attrs->end(); - - /* Consider the attributes in sorted order to get more - deterministic behaviour in nix-env operations (e.g. when - there are names clashes between derivations, the derivation - bound to the attribute with the "lower" name should take - precedence). */ - typedef std::map SortedSymbols; - SortedSymbols attrs; - foreach (Bindings::iterator, i, *v.attrs) - attrs.insert(std::pair(i->name, i->name)); - - foreach (SortedSymbols::iterator, i, attrs) { - startNest(nest, lvlDebug, format("evaluating attribute `%1%'") % i->first); - string pathPrefix2 = addToPath(pathPrefix, i->first); - Value & v2(*v.attrs->find(i->second)->value); - if (combineChannels) - getDerivations(state, v2, pathPrefix2, autoArgs, drvs, done, ignoreAssertionFailures); - else if (getDerivation(state, v2, pathPrefix2, drvs, done, ignoreAssertionFailures)) { - /* If the value of this attribute is itself a set, - should we recurse into it? => Only if it has a - `recurseForDerivations = true' attribute. */ - if (v2.type == tAttrs) { - Bindings::iterator j = v2.attrs->find(state.symbols.create("recurseForDerivations")); - if (j != v2.attrs->end() && state.forceBool(*j->value)) - getDerivations(state, v2, pathPrefix2, autoArgs, drvs, done, ignoreAssertionFailures); - } - } - } - } - - else if (v.type == tList) { - for (unsigned int n = 0; n < v.list.length; ++n) { - startNest(nest, lvlDebug, - format("evaluating list element")); - string pathPrefix2 = addToPath(pathPrefix, (format("%1%") % n).str()); - if (getDerivation(state, *v.list.elems[n], pathPrefix2, drvs, done, ignoreAssertionFailures)) - getDerivations(state, *v.list.elems[n], pathPrefix2, autoArgs, drvs, done, ignoreAssertionFailures); - } - } - - else throw TypeError("expression does not evaluate to a derivation (or a set or list of those)"); -} - - -void getDerivations(EvalState & state, Value & v, const string & pathPrefix, - Bindings & autoArgs, DrvInfos & drvs, bool ignoreAssertionFailures) -{ - Done done; - getDerivations(state, v, pathPrefix, autoArgs, drvs, done, ignoreAssertionFailures); -} - - -} diff --git a/src/libexpr/get-drvs.hh b/src/libexpr/get-drvs.hh deleted file mode 100644 index 98f762494a..0000000000 --- a/src/libexpr/get-drvs.hh +++ /dev/null @@ -1,91 +0,0 @@ -#pragma once - -#include "eval.hh" - -#include -#include - - -namespace nix { - - -struct DrvInfo -{ -public: - typedef std::map Outputs; - -private: - EvalState * state; - - string drvPath; - string outPath; - string outputName; - Outputs outputs; - - bool failed; // set if we get an AssertionError - - Bindings * attrs, * meta; - - Bindings * getMeta(); - - bool checkMeta(Value & v); - -public: - string name; - string attrPath; /* path towards the derivation */ - string system; - - DrvInfo(EvalState & state) : state(&state), failed(false), attrs(0), meta(0) { }; - DrvInfo(EvalState & state, const string & name, const string & attrPath, const string & system, Bindings * attrs) - : state(&state), failed(false), attrs(attrs), meta(0), name(name), attrPath(attrPath), system(system) { }; - - string queryDrvPath(); - string queryOutPath(); - string queryOutputName(); - Outputs queryOutputs(); - - StringSet queryMetaNames(); - Value * queryMeta(const string & name); - string queryMetaString(const string & name); - int queryMetaInt(const string & name, int def); - bool queryMetaBool(const string & name, bool def); - void setMeta(const string & name, Value * v); - - /* - MetaInfo queryMetaInfo(EvalState & state) const; - MetaValue queryMetaInfo(EvalState & state, const string & name) const; - */ - - void setDrvPath(const string & s) - { - drvPath = s; - } - - void setOutPath(const string & s) - { - outPath = s; - } - - void setFailed() { failed = true; }; - bool hasFailed() { return failed; }; -}; - - -#if HAVE_BOEHMGC -typedef list > DrvInfos; -#else -typedef list DrvInfos; -#endif - - -/* If value `v' denotes a derivation, store information about the - derivation in `drv' and return true. Otherwise, return false. */ -bool getDerivation(EvalState & state, Value & v, DrvInfo & drv, - bool ignoreAssertionFailures); - -void getDerivations(EvalState & state, Value & v, const string & pathPrefix, - Bindings & autoArgs, DrvInfos & drvs, - bool ignoreAssertionFailures); - - -} diff --git a/src/libexpr/lexer.l b/src/libexpr/lexer.l deleted file mode 100644 index 911850cc5b..0000000000 --- a/src/libexpr/lexer.l +++ /dev/null @@ -1,193 +0,0 @@ -%option reentrant bison-bridge bison-locations -%option noyywrap -%option never-interactive - - -%x STRING -%x IND_STRING - - -%{ -#include "nixexpr.hh" -#include "parser-tab.hh" - -using namespace nix; - -namespace nix { - - -static void initLoc(YYLTYPE * loc) -{ - loc->first_line = loc->last_line = 1; - loc->first_column = loc->last_column = 1; -} - - -static void adjustLoc(YYLTYPE * loc, const char * s, size_t len) -{ - loc->first_line = loc->last_line; - loc->first_column = loc->last_column; - - while (len--) { - switch (*s++) { - case '\r': - if (*s == '\n') /* cr/lf */ - s++; - /* fall through */ - case '\n': - ++loc->last_line; - loc->last_column = 1; - break; - default: - ++loc->last_column; - } - } -} - - -static Expr * unescapeStr(SymbolTable & symbols, const char * s) -{ - string t; - char c; - while ((c = *s++)) { - if (c == '\\') { - assert(*s); - c = *s++; - if (c == 'n') t += '\n'; - else if (c == 'r') t += '\r'; - else if (c == 't') t += '\t'; - else t += c; - } - else if (c == '\r') { - /* Normalise CR and CR/LF into LF. */ - t += '\n'; - if (*s == '\n') s++; /* cr/lf */ - } - else t += c; - } - return new ExprString(symbols.create(t)); -} - - -} - -#define YY_USER_INIT initLoc(yylloc) -#define YY_USER_ACTION adjustLoc(yylloc, yytext, yyleng); - -%} - - -ID [a-zA-Z\_][a-zA-Z0-9\_\'\-]* -INT [0-9]+ -PATH [a-zA-Z0-9\.\_\-\+]*(\/[a-zA-Z0-9\.\_\-\+]+)+ -SPATH \<[a-zA-Z0-9\.\_\-\+]+(\/[a-zA-Z0-9\.\_\-\+]+)*\> -URI [a-zA-Z][a-zA-Z0-9\+\-\.]*\:[a-zA-Z0-9\%\/\?\:\@\&\=\+\$\,\-\_\.\!\~\*\']+ - - -%% - - -if { return IF; } -then { return THEN; } -else { return ELSE; } -assert { return ASSERT; } -with { return WITH; } -let { return LET; } -in { return IN; } -rec { return REC; } -inherit { return INHERIT; } -or { return OR_KW; } -\.\.\. { return ELLIPSIS; } - -\=\= { return EQ; } -\!\= { return NEQ; } -\<\= { return LEQ; } -\>\= { return GEQ; } -\&\& { return AND; } -\|\| { return OR; } -\-\> { return IMPL; } -\/\/ { return UPDATE; } -\+\+ { return CONCAT; } - -{ID} { yylval->id = strdup(yytext); return ID; } -{INT} { errno = 0; - yylval->n = strtol(yytext, 0, 10); - if (errno != 0) - throw ParseError(format("invalid integer `%1%'") % yytext); - return INT; - } - -\$\{ { return DOLLAR_CURLY; } - -\" { BEGIN(STRING); return '"'; } -([^\$\"\\]|\$[^\{\"]|\\.)+ { - /* !!! Not quite right: we want a follow restriction on - "$", it shouldn't be followed by a "{". Right now - "$\"" will be consumed as part of a string, rather - than a "$" followed by the string terminator. - Disallow "$\"" for now. */ - yylval->e = unescapeStr(data->symbols, yytext); - return STR; - } -\$\{ { BEGIN(INITIAL); return DOLLAR_CURLY; } -\" { BEGIN(INITIAL); return '"'; } -. return yytext[0]; /* just in case: shouldn't be reached */ - -\'\'(\ *\n)? { BEGIN(IND_STRING); return IND_STRING_OPEN; } -([^\$\']|\$[^\{\']|\'[^\'\$])+ { - yylval->e = new ExprIndStr(yytext); - return IND_STR; - } -\'\'\$ { - yylval->e = new ExprIndStr("$"); - return IND_STR; - } -\'\'\' { - yylval->e = new ExprIndStr("''"); - return IND_STR; - } -\'\'\\. { - yylval->e = unescapeStr(data->symbols, yytext + 2); - return IND_STR; - } -\$\{ { BEGIN(INITIAL); return DOLLAR_CURLY; } -\'\' { BEGIN(INITIAL); return IND_STRING_CLOSE; } -\' { - yylval->e = new ExprIndStr("'"); - return IND_STR; - } -. return yytext[0]; /* just in case: shouldn't be reached */ - -{PATH} { yylval->path = strdup(yytext); return PATH; } -{SPATH} { yylval->path = strdup(yytext); return SPATH; } -{URI} { yylval->uri = strdup(yytext); return URI; } - -[ \t\r\n]+ /* eat up whitespace */ -\#[^\r\n]* /* single-line comments */ -\/\*([^*]|\*[^\/])*\*\/ /* long comments */ - -. return yytext[0]; - - -%% - - -namespace nix { - -/* Horrible, disgusting hack: allow the parser to set the scanner - start condition back to STRING. Necessary in interpolations like - "foo${expr}bar"; after the close brace we have to go back to the - STRING state. */ -void backToString(yyscan_t scanner) -{ - struct yyguts_t * yyg = (struct yyguts_t *) scanner; - BEGIN(STRING); -} - -void backToIndString(yyscan_t scanner) -{ - struct yyguts_t * yyg = (struct yyguts_t *) scanner; - BEGIN(IND_STRING); -} - -} diff --git a/src/libexpr/local.mk b/src/libexpr/local.mk deleted file mode 100644 index b3b4086916..0000000000 --- a/src/libexpr/local.mk +++ /dev/null @@ -1,28 +0,0 @@ -libraries += libexpr - -libexpr_NAME = libnixexpr - -libexpr_DIR := $(d) - -libexpr_SOURCES := $(wildcard $(d)/*.cc) $(d)/lexer-tab.cc $(d)/parser-tab.cc - -libexpr_LIBS = libutil libstore libformat - -# The dependency on libgc must be propagated (i.e. meaning that -# programs/libraries that use libexpr must explicitly pass -lgc), -# because inline functions in libexpr's header files call libgc. -libexpr_LDFLAGS_PROPAGATED = $(BDW_GC_LIBS) - -$(d)/parser-tab.cc $(d)/parser-tab.hh: $(d)/parser.y - $(trace-gen) bison -v -o $(libexpr_DIR)/parser-tab.cc $< -d - -$(d)/lexer-tab.cc $(d)/lexer-tab.hh: $(d)/lexer.l - $(trace-gen) flex --outfile $(libexpr_DIR)/lexer-tab.cc --header-file=$(libexpr_DIR)/lexer-tab.hh $< - -$(d)/lexer-tab.o: $(d)/lexer-tab.hh $(d)/parser-tab.hh - -$(d)/parser-tab.o: $(d)/lexer-tab.hh $(d)/parser-tab.hh - -clean-files += $(d)/parser-tab.cc $(d)/parser-tab.hh $(d)/lexer-tab.cc $(d)/lexer-tab.hh - -dist-files += $(d)/parser-tab.cc $(d)/parser-tab.hh $(d)/lexer-tab.cc $(d)/lexer-tab.hh diff --git a/src/libexpr/names.cc b/src/libexpr/names.cc deleted file mode 100644 index 781c2b6468..0000000000 --- a/src/libexpr/names.cc +++ /dev/null @@ -1,104 +0,0 @@ -#include "names.hh" -#include "util.hh" - - -namespace nix { - - -DrvName::DrvName() -{ - name = ""; -} - - -/* Parse a derivation name. The `name' part of a derivation name is - everything up to but not including the first dash *not* followed by - a letter. The `version' part is the rest (excluding the separating - dash). E.g., `apache-httpd-2.0.48' is parsed to (`apache-httpd', - '2.0.48'). */ -DrvName::DrvName(const string & s) : hits(0) -{ - name = fullName = s; - for (unsigned int i = 0; i < s.size(); ++i) { - /* !!! isalpha/isdigit are affected by the locale. */ - if (s[i] == '-' && i + 1 < s.size() && !isalpha(s[i + 1])) { - name = string(s, 0, i); - version = string(s, i + 1); - break; - } - } -} - - -bool DrvName::matches(DrvName & n) -{ - if (name != "*" && name != n.name) return false; - if (version != "" && version != n.version) return false; - return true; -} - - -static string nextComponent(string::const_iterator & p, - const string::const_iterator end) -{ - /* Skip any dots and dashes (component separators). */ - while (p != end && (*p == '.' || *p == '-')) ++p; - - if (p == end) return ""; - - /* If the first character is a digit, consume the longest sequence - of digits. Otherwise, consume the longest sequence of - non-digit, non-separator characters. */ - string s; - if (isdigit(*p)) - while (p != end && isdigit(*p)) s += *p++; - else - while (p != end && (!isdigit(*p) && *p != '.' && *p != '-')) - s += *p++; - - return s; -} - - -static bool componentsLT(const string & c1, const string & c2) -{ - int n1, n2; - bool c1Num = string2Int(c1, n1), c2Num = string2Int(c2, n2); - - if (c1Num && c2Num) return n1 < n2; - else if (c1 == "" && c2Num) return true; - else if (c1 == "pre" && c2 != "pre") return true; - else if (c2 == "pre") return false; - /* Assume that `2.3a' < `2.3.1'. */ - else if (c2Num) return true; - else if (c1Num) return false; - else return c1 < c2; -} - - -int compareVersions(const string & v1, const string & v2) -{ - string::const_iterator p1 = v1.begin(); - string::const_iterator p2 = v2.begin(); - - while (p1 != v1.end() || p2 != v2.end()) { - string c1 = nextComponent(p1, v1.end()); - string c2 = nextComponent(p2, v2.end()); - if (componentsLT(c1, c2)) return -1; - else if (componentsLT(c2, c1)) return 1; - } - - return 0; -} - - -DrvNames drvNamesFromArgs(const Strings & opArgs) -{ - DrvNames result; - foreach (Strings::const_iterator, i, opArgs) - result.push_back(DrvName(*i)); - return result; -} - - -} diff --git a/src/libexpr/names.hh b/src/libexpr/names.hh deleted file mode 100644 index ebe113e82a..0000000000 --- a/src/libexpr/names.hh +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include "types.hh" - -namespace nix { - -struct DrvName -{ - string fullName; - string name; - string version; - unsigned int hits; - - DrvName(); - DrvName(const string & s); - bool matches(DrvName & n); -}; - -typedef list DrvNames; - -int compareVersions(const string & v1, const string & v2); -DrvNames drvNamesFromArgs(const Strings & opArgs); - -} diff --git a/src/libexpr/nix.sdf b/src/libexpr/nix.sdf deleted file mode 100644 index 42fb21c3ba..0000000000 --- a/src/libexpr/nix.sdf +++ /dev/null @@ -1,141 +0,0 @@ -%% Note: this SDF grammar is no longer used in the Nix expression -%% parser and may not be up to date. - -definition - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Top level syntax. - -module Main -imports Nix-Exprs Nix-Layout - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Expressions. - -module Nix-Exprs -imports Nix-Lexicals -exports - sorts Expr Formal Bind ExprList - context-free start-symbols Expr - context-free syntax - - Id -> Expr {cons("Var")} - Int -> Expr {cons("Int")} - Str -> Expr {cons("Str")} - Uri -> Expr {cons("Uri")} - Path -> Expr {cons("Path")} - - "(" Expr ")" -> Expr {bracket} - - Expr Expr -> Expr {cons("Call"), left} - - Id ":" Expr -> Expr {cons("Function1")} - "{" {Formal ","}* "}" ":" Expr -> Expr {cons("Function")} - Id -> Formal {cons("NoDefFormal")} - Id "?" Expr -> Formal {cons("DefFormal")} - - "assert" Expr ";" Expr -> Expr {cons("Assert")} - - "with" Expr ";" Expr -> Expr {cons("With")} - - "rec" "{" Bind* "}" -> Expr {cons("Rec")} - "let" Bind* "in" Expr -> Expr {cons("Let")} - "let" "{" Bind* "}" -> Expr {cons("LetRec")} - "{" Bind* "}" -> Expr {cons("Attrs")} - - Id "=" Expr ";" -> Bind {cons("Bind")} - "inherit" ("(" Expr ")")? Id* ";" -> Bind {cons("Inherit")} - - "[" ExprList "]" -> Expr {cons("List")} - -> ExprList {cons("ExprNil")} - Expr ExprList -> ExprList {cons("ExprCons")} - - Expr "." Id -> Expr {cons("Select")} - - "if" Expr "then" Expr "else" Expr -> Expr {cons("If")} - - Expr "==" Expr -> Expr {cons("OpEq"), non-assoc} - Expr "!=" Expr -> Expr {cons("OpNEq"), non-assoc} - - "!" Expr -> Expr {cons("OpNot")} - Expr "&&" Expr -> Expr {cons("OpAnd"), right} - Expr "||" Expr -> Expr {cons("OpOr"), right} - Expr "->" Expr -> Expr {cons("OpImpl"), right} - - Expr "//" Expr -> Expr {cons("OpUpdate"), right} - Expr "~" Expr -> Expr {cons("SubPath"), non-assoc} - Expr "?" Id -> Expr {cons("OpHasAttr")} - Expr "+" Expr -> Expr {cons("OpPlus"), left} - Expr "++" Expr -> Expr {cons("OpConcat"), right} - - context-free priorities - - Expr "." Id -> Expr - > Expr ExprList -> ExprList - > Expr Expr -> Expr - > Expr "~" Expr -> Expr - > Expr "?" Id -> Expr - > Expr "++" Expr -> Expr - > Expr "+" Expr -> Expr - > "!" Expr -> Expr - > Expr "//" Expr -> Expr - > { Expr "==" Expr -> Expr - Expr "!=" Expr -> Expr - } - > Expr "&&" Expr -> Expr - > Expr "||" Expr -> Expr - > Expr "->" Expr -> Expr - > "if" Expr "then" Expr "else" Expr -> Expr - > "assert" Expr ";" Expr -> Expr - > "with" Expr ";" Expr -> Expr - > Id ":" Expr -> Expr - > "{" {Formal ","}* "}" ":" Expr -> Expr - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Lexical syntax. - -module Nix-Lexicals -exports - sorts Id Int Str Path Uri - lexical syntax - [a-zA-Z\_][a-zA-Z0-9\_\']* -> Id - "rec" | "let" | "if" | "then" | "else" | "assert" | "with" | "inherit" -> Id {reject} - - [0-9]+ -> Int - - "\"" (~[\"\\] | ("\\" ~[]) )* "\"" -> Str - "''" (~[\"\\] | ("\\" ~[]) )* "''" -> Str - - [a-zA-Z0-9\.\_\-\+]* ("/"[a-zA-Z0-9\.\_\-\+]+)+ -> Path - - [a-zA-Z] [a-zA-Z0-9\+\-\.]* ":" [a-zA-Z0-9\%\/\?\:\@\&\=\+\$\,\-\_\.\!\~\*\']+ -> Uri - - lexical restrictions - Id -/- [a-zA-Z0-9\_\'] - Int -/- [0-9] - Path -/- [a-zA-Z0-9\.\_\-\+\/] - Uri -/- [a-zA-Z0-9\%\/\?\:\@\&\=\+\$\,\-\_\.\!\~\*\'] - "rec" "let" "if" "then" "else" "assert" "with" "inherit" -/- [A-Za-z0-9\_\'] - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Layout. - -module Nix-Layout -exports - sorts HashComment Asterisk Comment - lexical syntax - [\ \t\n] -> LAYOUT - HashComment -> LAYOUT - Comment -> LAYOUT - "#" ~[\n]* -> HashComment - "/*" ( ~[\*] | Asterisk )* "*/" -> Comment - [\*] ~[\/] -> Asterisk - lexical restrictions - HashComment -/- ~[\n] - context-free restrictions - LAYOUT? -/- [\ \t\n\#] - LAYOUT? -/- [\/].[\*] diff --git a/src/libexpr/nixexpr.cc b/src/libexpr/nixexpr.cc deleted file mode 100644 index bca2b7913b..0000000000 --- a/src/libexpr/nixexpr.cc +++ /dev/null @@ -1,392 +0,0 @@ -#include "nixexpr.hh" -#include "derivations.hh" -#include "util.hh" - -#include - - -namespace nix { - - -/* Displaying abstract syntax trees. */ - -std::ostream & operator << (std::ostream & str, Expr & e) -{ - e.show(str); - return str; -} - -void Expr::show(std::ostream & str) -{ - abort(); -} - -void ExprInt::show(std::ostream & str) -{ - str << n; -} - -void ExprString::show(std::ostream & str) -{ - str << "\"" << s << "\""; // !!! escaping -} - -void ExprPath::show(std::ostream & str) -{ - str << s; -} - -void ExprVar::show(std::ostream & str) -{ - str << name; -} - -void ExprSelect::show(std::ostream & str) -{ - str << "(" << *e << ")." << showAttrPath(attrPath); - if (def) str << " or " << *def; -} - -void ExprOpHasAttr::show(std::ostream & str) -{ - str << "(" << *e << ") ? " << showAttrPath(attrPath); -} - -void ExprAttrs::show(std::ostream & str) -{ - if (recursive) str << "rec "; - str << "{ "; - foreach (AttrDefs::iterator, i, attrs) - if (i->second.inherited) - str << "inherit " << i->first << " " << "; "; - else - str << i->first << " = " << *i->second.e << "; "; - foreach (DynamicAttrDefs::iterator, i, dynamicAttrs) - str << "\"${" << *i->nameExpr << "}\" = " << *i->valueExpr << "; "; - str << "}"; -} - -void ExprList::show(std::ostream & str) -{ - str << "[ "; - foreach (vector::iterator, i, elems) - str << "(" << **i << ") "; - str << "]"; -} - -void ExprLambda::show(std::ostream & str) -{ - str << "("; - if (matchAttrs) { - str << "{ "; - bool first = true; - foreach (Formals::Formals_::iterator, i, formals->formals) { - if (first) first = false; else str << ", "; - str << i->name; - if (i->def) str << " ? " << *i->def; - } - str << " }"; - if (!arg.empty()) str << " @ "; - } - if (!arg.empty()) str << arg; - str << ": " << *body << ")"; -} - -void ExprLet::show(std::ostream & str) -{ - str << "let "; - foreach (ExprAttrs::AttrDefs::iterator, i, attrs->attrs) - if (i->second.inherited) - str << "inherit " << i->first << "; "; - else - str << i->first << " = " << *i->second.e << "; "; - str << "in " << *body; -} - -void ExprWith::show(std::ostream & str) -{ - str << "with " << *attrs << "; " << *body; -} - -void ExprIf::show(std::ostream & str) -{ - str << "if " << *cond << " then " << *then << " else " << *else_; -} - -void ExprAssert::show(std::ostream & str) -{ - str << "assert " << *cond << "; " << *body; -} - -void ExprOpNot::show(std::ostream & str) -{ - str << "! " << *e; -} - -void ExprBuiltin::show(std::ostream & str) -{ - str << "builtins." << name; -} - -void ExprConcatStrings::show(std::ostream & str) -{ - bool first = true; - foreach (vector::iterator, i, *es) { - if (first) first = false; else str << " + "; - str << **i; - } -} - -void ExprPos::show(std::ostream & str) -{ - str << "__curPos"; -} - - -std::ostream & operator << (std::ostream & str, const Pos & pos) -{ - if (!pos.line) - str << "undefined position"; - else - str << (format("`%1%:%2%:%3%'") % pos.file % pos.line % pos.column).str(); - return str; -} - - -string showAttrPath(const AttrPath & attrPath) -{ - std::ostringstream out; - bool first = true; - foreach (AttrPath::const_iterator, i, attrPath) { - if (!first) - out << '.'; - else - first = false; - if (i->symbol.set()) - out << i->symbol; - else - out << "\"${" << *i->expr << "}\""; - } - return out.str(); -} - - -Pos noPos; - - -/* Computing levels/displacements for variables. */ - -void Expr::bindVars(const StaticEnv & env) -{ - abort(); -} - -void ExprInt::bindVars(const StaticEnv & env) -{ -} - -void ExprString::bindVars(const StaticEnv & env) -{ -} - -void ExprPath::bindVars(const StaticEnv & env) -{ -} - -void ExprVar::bindVars(const StaticEnv & env) -{ - /* Check whether the variable appears in the environment. If so, - set its level and displacement. */ - const StaticEnv * curEnv; - unsigned int level; - int withLevel = -1; - for (curEnv = &env, level = 0; curEnv; curEnv = curEnv->up, level++) { - if (curEnv->isWith) { - if (withLevel == -1) withLevel = level; - } else { - StaticEnv::Vars::const_iterator i = curEnv->vars.find(name); - if (i != curEnv->vars.end()) { - fromWith = false; - this->level = level; - displ = i->second; - return; - } - } - } - - /* Otherwise, the variable must be obtained from the nearest - enclosing `with'. If there is no `with', then we can issue an - "undefined variable" error now. */ - if (withLevel == -1) throw UndefinedVarError(format("undefined variable `%1%' at %2%") % name % pos); - - fromWith = true; - this->level = withLevel; -} - -void ExprSelect::bindVars(const StaticEnv & env) -{ - e->bindVars(env); - if (def) def->bindVars(env); - foreach (AttrPath::iterator, i, attrPath) - if (!i->symbol.set()) - i->expr->bindVars(env); -} - -void ExprOpHasAttr::bindVars(const StaticEnv & env) -{ - e->bindVars(env); - foreach (AttrPath::iterator, i, attrPath) - if (!i->symbol.set()) - i->expr->bindVars(env); -} - -void ExprAttrs::bindVars(const StaticEnv & env) -{ - const StaticEnv * dynamicEnv = &env; - StaticEnv newEnv(false, &env); - - if (recursive) { - dynamicEnv = &newEnv; - - unsigned int displ = 0; - foreach (AttrDefs::iterator, i, attrs) - newEnv.vars[i->first] = i->second.displ = displ++; - - foreach (AttrDefs::iterator, i, attrs) - i->second.e->bindVars(i->second.inherited ? env : newEnv); - } - - else - foreach (AttrDefs::iterator, i, attrs) - i->second.e->bindVars(env); - - foreach (DynamicAttrDefs::iterator, i, dynamicAttrs) { - i->nameExpr->bindVars(*dynamicEnv); - i->valueExpr->bindVars(*dynamicEnv); - } -} - -void ExprList::bindVars(const StaticEnv & env) -{ - foreach (vector::iterator, i, elems) - (*i)->bindVars(env); -} - -void ExprLambda::bindVars(const StaticEnv & env) -{ - StaticEnv newEnv(false, &env); - - unsigned int displ = 0; - - if (!arg.empty()) newEnv.vars[arg] = displ++; - - if (matchAttrs) { - foreach (Formals::Formals_::iterator, i, formals->formals) - newEnv.vars[i->name] = displ++; - - foreach (Formals::Formals_::iterator, i, formals->formals) - if (i->def) i->def->bindVars(newEnv); - } - - body->bindVars(newEnv); -} - -void ExprLet::bindVars(const StaticEnv & env) -{ - StaticEnv newEnv(false, &env); - - unsigned int displ = 0; - foreach (ExprAttrs::AttrDefs::iterator, i, attrs->attrs) - newEnv.vars[i->first] = i->second.displ = displ++; - - foreach (ExprAttrs::AttrDefs::iterator, i, attrs->attrs) - i->second.e->bindVars(i->second.inherited ? env : newEnv); - - body->bindVars(newEnv); -} - -void ExprWith::bindVars(const StaticEnv & env) -{ - /* Does this `with' have an enclosing `with'? If so, record its - level so that `lookupVar' can look up variables in the previous - `with' if this one doesn't contain the desired attribute. */ - const StaticEnv * curEnv; - unsigned int level; - prevWith = 0; - for (curEnv = &env, level = 1; curEnv; curEnv = curEnv->up, level++) - if (curEnv->isWith) { - prevWith = level; - break; - } - - attrs->bindVars(env); - StaticEnv newEnv(true, &env); - body->bindVars(newEnv); -} - -void ExprIf::bindVars(const StaticEnv & env) -{ - cond->bindVars(env); - then->bindVars(env); - else_->bindVars(env); -} - -void ExprAssert::bindVars(const StaticEnv & env) -{ - cond->bindVars(env); - body->bindVars(env); -} - -void ExprOpNot::bindVars(const StaticEnv & env) -{ - e->bindVars(env); -} - -void ExprBuiltin::bindVars(const StaticEnv & env) -{ -} - -void ExprConcatStrings::bindVars(const StaticEnv & env) -{ - foreach (vector::iterator, i, *es) - (*i)->bindVars(env); -} - -void ExprPos::bindVars(const StaticEnv & env) -{ -} - - -/* Storing function names. */ - -void Expr::setName(Symbol & name) -{ -} - - -void ExprLambda::setName(Symbol & name) -{ - this->name = name; - body->setName(name); -} - - -string ExprLambda::showNamePos() const -{ - return (format("%1% at %2%") % (name.set() ? "`" + (string) name + "'" : "an anonymous function") % pos).str(); -} - - - -/* Symbol table. */ - -size_t SymbolTable::totalSize() const -{ - size_t n = 0; - foreach (Symbols::const_iterator, i, symbols) - n += i->size(); - return n; -} - - -} diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh deleted file mode 100644 index a5c5d0533c..0000000000 --- a/src/libexpr/nixexpr.hh +++ /dev/null @@ -1,332 +0,0 @@ -#pragma once - -#include "value.hh" -#include "symbol-table.hh" - -#include - - -namespace nix { - - -MakeError(EvalError, Error) -MakeError(ParseError, Error) -MakeError(AssertionError, EvalError) -MakeError(ThrownError, AssertionError) -MakeError(Abort, EvalError) -MakeError(TypeError, EvalError) -MakeError(ImportError, EvalError) // error building an imported derivation -MakeError(UndefinedVarError, Error) - - -/* Position objects. */ - -struct Pos -{ - Symbol file; - unsigned int line, column; - Pos() : line(0), column(0) { }; - Pos(const Symbol & file, unsigned int line, unsigned int column) - : file(file), line(line), column(column) { }; - bool operator < (const Pos & p2) const - { - if (!line) return p2.line; - if (!p2.line) return false; - int d = ((string) file).compare((string) p2.file); - if (d < 0) return true; - if (d > 0) return false; - if (line < p2.line) return true; - if (line > p2.line) return false; - return column < p2.column; - } -}; - -extern Pos noPos; - -std::ostream & operator << (std::ostream & str, const Pos & pos); - - -struct Env; -struct Value; -class EvalState; -struct StaticEnv; -struct ExprConcatStrings; - - -/* An attribute path is a sequence of attribute names. */ -struct AttrName -{ - Symbol symbol; - ExprConcatStrings * expr; - AttrName(const Symbol & s) : symbol(s) {}; - AttrName(ExprConcatStrings * e) : expr(e) {}; -}; - -typedef std::vector AttrPath; - -string showAttrPath(const AttrPath & attrPath); - - -/* Abstract syntax of Nix expressions. */ - -struct Expr -{ - virtual ~Expr() { }; - virtual void show(std::ostream & str); - virtual void bindVars(const StaticEnv & env); - virtual void eval(EvalState & state, Env & env, Value & v); - virtual Value * maybeThunk(EvalState & state, Env & env); - virtual void setName(Symbol & name); -}; - -std::ostream & operator << (std::ostream & str, Expr & e); - -#define COMMON_METHODS \ - void show(std::ostream & str); \ - void eval(EvalState & state, Env & env, Value & v); \ - void bindVars(const StaticEnv & env); - -struct ExprInt : Expr -{ - NixInt n; - Value v; - ExprInt(NixInt n) : n(n) { mkInt(v, n); }; - COMMON_METHODS - Value * maybeThunk(EvalState & state, Env & env); -}; - -struct ExprString : Expr -{ - Symbol s; - Value v; - ExprString(const Symbol & s) : s(s) { mkString(v, s); }; - COMMON_METHODS - Value * maybeThunk(EvalState & state, Env & env); -}; - -/* Temporary class used during parsing of indented strings. */ -struct ExprIndStr : Expr -{ - string s; - ExprIndStr(const string & s) : s(s) { }; -}; - -struct ExprPath : Expr -{ - string s; - Value v; - ExprPath(const string & s) : s(s) { mkPathNoCopy(v, this->s.c_str()); }; - COMMON_METHODS - Value * maybeThunk(EvalState & state, Env & env); -}; - -struct ExprVar : Expr -{ - Pos pos; - Symbol name; - - /* Whether the variable comes from an environment (e.g. a rec, let - or function argument) or from a "with". */ - bool fromWith; - - /* In the former case, the value is obtained by going `level' - levels up from the current environment and getting the - `displ'th value in that environment. In the latter case, the - value is obtained by getting the attribute named `name' from - the set stored in the environment that is `level' levels up - from the current one.*/ - unsigned int level; - unsigned int displ; - - ExprVar(const Pos & pos, const Symbol & name) : pos(pos), name(name) { }; - COMMON_METHODS - Value * maybeThunk(EvalState & state, Env & env); -}; - -struct ExprSelect : Expr -{ - Expr * e, * def; - AttrPath attrPath; - ExprSelect(Expr * e, const AttrPath & attrPath, Expr * def) : e(e), def(def), attrPath(attrPath) { }; - ExprSelect(Expr * e, const Symbol & name) : e(e), def(0) { attrPath.push_back(AttrName(name)); }; - COMMON_METHODS -}; - -struct ExprOpHasAttr : Expr -{ - Expr * e; - AttrPath attrPath; - ExprOpHasAttr(Expr * e, const AttrPath & attrPath) : e(e), attrPath(attrPath) { }; - COMMON_METHODS -}; - -struct ExprAttrs : Expr -{ - bool recursive; - struct AttrDef { - bool inherited; - Expr * e; - Pos pos; - unsigned int displ; // displacement - AttrDef(Expr * e, const Pos & pos, bool inherited=false) : inherited(inherited), e(e), pos(pos) { }; - AttrDef() { }; - }; - typedef std::map AttrDefs; - AttrDefs attrs; - struct DynamicAttrDef { - ExprConcatStrings * nameExpr; - Expr * valueExpr; - Pos pos; - DynamicAttrDef(ExprConcatStrings * nameExpr, Expr * valueExpr, const Pos & pos) : nameExpr(nameExpr), valueExpr(valueExpr), pos(pos) { }; - }; - typedef std::vector DynamicAttrDefs; - DynamicAttrDefs dynamicAttrs; - ExprAttrs() : recursive(false) { }; - COMMON_METHODS -}; - -struct ExprList : Expr -{ - std::vector elems; - ExprList() { }; - COMMON_METHODS -}; - -struct Formal -{ - Symbol name; - Expr * def; - Formal(const Symbol & name, Expr * def) : name(name), def(def) { }; -}; - -struct Formals -{ - typedef std::list Formals_; - Formals_ formals; - std::set argNames; // used during parsing - bool ellipsis; -}; - -struct ExprLambda : Expr -{ - Pos pos; - Symbol name; - Symbol arg; - bool matchAttrs; - Formals * formals; - Expr * body; - ExprLambda(const Pos & pos, const Symbol & arg, bool matchAttrs, Formals * formals, Expr * body) - : pos(pos), arg(arg), matchAttrs(matchAttrs), formals(formals), body(body) - { - if (!arg.empty() && formals && formals->argNames.find(arg) != formals->argNames.end()) - throw ParseError(format("duplicate formal function argument `%1%' at %2%") - % arg % pos); - }; - void setName(Symbol & name); - string showNamePos() const; - COMMON_METHODS -}; - -struct ExprLet : Expr -{ - ExprAttrs * attrs; - Expr * body; - ExprLet(ExprAttrs * attrs, Expr * body) : attrs(attrs), body(body) { }; - COMMON_METHODS -}; - -struct ExprWith : Expr -{ - Pos pos; - Expr * attrs, * body; - unsigned int prevWith; - ExprWith(const Pos & pos, Expr * attrs, Expr * body) : pos(pos), attrs(attrs), body(body) { }; - COMMON_METHODS -}; - -struct ExprIf : Expr -{ - Expr * cond, * then, * else_; - ExprIf(Expr * cond, Expr * then, Expr * else_) : cond(cond), then(then), else_(else_) { }; - COMMON_METHODS -}; - -struct ExprAssert : Expr -{ - Pos pos; - Expr * cond, * body; - ExprAssert(const Pos & pos, Expr * cond, Expr * body) : pos(pos), cond(cond), body(body) { }; - COMMON_METHODS -}; - -struct ExprOpNot : Expr -{ - Expr * e; - ExprOpNot(Expr * e) : e(e) { }; - COMMON_METHODS -}; - -struct ExprBuiltin : Expr -{ - Symbol name; - ExprBuiltin(const Symbol & name) : name(name) { }; - COMMON_METHODS -}; - -#define MakeBinOp(name, s) \ - struct Expr##name : Expr \ - { \ - Expr * e1, * e2; \ - Expr##name(Expr * e1, Expr * e2) : e1(e1), e2(e2) { }; \ - void show(std::ostream & str) \ - { \ - str << *e1 << " " s " " << *e2; \ - } \ - void bindVars(const StaticEnv & env) \ - { \ - e1->bindVars(env); e2->bindVars(env); \ - } \ - void eval(EvalState & state, Env & env, Value & v); \ - }; - -MakeBinOp(App, "") -MakeBinOp(OpEq, "==") -MakeBinOp(OpNEq, "!=") -MakeBinOp(OpAnd, "&&") -MakeBinOp(OpOr, "||") -MakeBinOp(OpImpl, "->") -MakeBinOp(OpUpdate, "//") -MakeBinOp(OpConcatLists, "++") - -struct ExprConcatStrings : Expr -{ - bool forceString; - vector * es; - ExprConcatStrings(bool forceString, vector * es) - : forceString(forceString), es(es) { }; - COMMON_METHODS -}; - -struct ExprPos : Expr -{ - Pos pos; - ExprPos(const Pos & pos) : pos(pos) { }; - COMMON_METHODS -}; - - -/* Static environments are used to map variable names onto (level, - displacement) pairs used to obtain the value of the variable at - runtime. */ -struct StaticEnv -{ - bool isWith; - const StaticEnv * up; - typedef std::map Vars; - Vars vars; - StaticEnv(bool isWith, const StaticEnv * up) : isWith(isWith), up(up) { }; -}; - - - -} diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y deleted file mode 100644 index ab0b862246..0000000000 --- a/src/libexpr/parser.y +++ /dev/null @@ -1,651 +0,0 @@ -%glr-parser -%pure-parser -%locations -%error-verbose -%defines -/* %no-lines */ -%parse-param { void * scanner } -%parse-param { nix::ParseData * data } -%lex-param { void * scanner } -%lex-param { nix::ParseData * data } -%expect 1 -%expect-rr 1 - -%code requires { - -#ifndef BISON_HEADER -#define BISON_HEADER - -#include "util.hh" - -#include "nixexpr.hh" -#include "eval.hh" - -namespace nix { - - struct ParseData - { - EvalState & state; - SymbolTable & symbols; - Expr * result; - Path basePath; - Symbol path; - string error; - Symbol sLetBody; - ParseData(EvalState & state) - : state(state) - , symbols(state.symbols) - , sLetBody(symbols.create("")) - { }; - }; - -} - -#define YY_DECL int yylex \ - (YYSTYPE * yylval_param, YYLTYPE * yylloc_param, yyscan_t yyscanner, nix::ParseData * data) - -#endif - -} - -%{ - -#include "parser-tab.hh" -#include "lexer-tab.hh" - -#include -#include -#include - -YY_DECL; - -using namespace nix; - - -namespace nix { - - -static void dupAttr(const AttrPath & attrPath, const Pos & pos, const Pos & prevPos) -{ - throw ParseError(format("attribute `%1%' at %2% already defined at %3%") - % showAttrPath(attrPath) % pos % prevPos); -} - - -static void dupAttr(Symbol attr, const Pos & pos, const Pos & prevPos) -{ - throw ParseError(format("attribute `%1%' at %2% already defined at %3%") - % attr % pos % prevPos); -} - - -static void addAttr(ExprAttrs * attrs, AttrPath & attrPath, - Expr * e, const Pos & pos) -{ - AttrPath::iterator i; - // All attrpaths have at least one attr - assert(!attrPath.empty()); - for (i = attrPath.begin(); i + 1 < attrPath.end(); i++) { - if (i->symbol.set()) { - ExprAttrs::AttrDefs::iterator j = attrs->attrs.find(i->symbol); - if (j != attrs->attrs.end()) { - if (!j->second.inherited) { - ExprAttrs * attrs2 = dynamic_cast(j->second.e); - if (!attrs2) dupAttr(attrPath, pos, j->second.pos); - attrs = attrs2; - } else - dupAttr(attrPath, pos, j->second.pos); - } else { - ExprAttrs * nested = new ExprAttrs; - attrs->attrs[i->symbol] = ExprAttrs::AttrDef(nested, pos); - attrs = nested; - } - } else { - ExprAttrs *nested = new ExprAttrs; - attrs->dynamicAttrs.push_back(ExprAttrs::DynamicAttrDef(i->expr, nested, pos)); - attrs = nested; - } - } - if (i->symbol.set()) { - ExprAttrs::AttrDefs::iterator j = attrs->attrs.find(i->symbol); - if (j != attrs->attrs.end()) { - dupAttr(attrPath, pos, j->second.pos); - } else { - attrs->attrs[i->symbol] = ExprAttrs::AttrDef(e, pos); - e->setName(i->symbol); - } - } else { - attrs->dynamicAttrs.push_back(ExprAttrs::DynamicAttrDef(i->expr, e, pos)); - } -} - - -static void addFormal(const Pos & pos, Formals * formals, const Formal & formal) -{ - if (formals->argNames.find(formal.name) != formals->argNames.end()) - throw ParseError(format("duplicate formal function argument `%1%' at %2%") - % formal.name % pos); - formals->formals.push_front(formal); - formals->argNames.insert(formal.name); -} - - -static Expr * stripIndentation(SymbolTable & symbols, vector & es) -{ - if (es.empty()) return new ExprString(symbols.create("")); - - /* Figure out the minimum indentation. Note that by design - whitespace-only final lines are not taken into account. (So - the " " in "\n ''" is ignored, but the " " in "\n foo''" is.) */ - bool atStartOfLine = true; /* = seen only whitespace in the current line */ - unsigned int minIndent = 1000000; - unsigned int curIndent = 0; - foreach (vector::iterator, i, es) { - ExprIndStr * e = dynamic_cast(*i); - if (!e) { - /* Anti-quotations end the current start-of-line whitespace. */ - if (atStartOfLine) { - atStartOfLine = false; - if (curIndent < minIndent) minIndent = curIndent; - } - continue; - } - for (unsigned int j = 0; j < e->s.size(); ++j) { - if (atStartOfLine) { - if (e->s[j] == ' ') - curIndent++; - else if (e->s[j] == '\n') { - /* Empty line, doesn't influence minimum - indentation. */ - curIndent = 0; - } else { - atStartOfLine = false; - if (curIndent < minIndent) minIndent = curIndent; - } - } else if (e->s[j] == '\n') { - atStartOfLine = true; - curIndent = 0; - } - } - } - - /* Strip spaces from each line. */ - vector * es2 = new vector; - atStartOfLine = true; - unsigned int curDropped = 0; - unsigned int n = es.size(); - for (vector::iterator i = es.begin(); i != es.end(); ++i, --n) { - ExprIndStr * e = dynamic_cast(*i); - if (!e) { - atStartOfLine = false; - curDropped = 0; - es2->push_back(*i); - continue; - } - - string s2; - for (unsigned int j = 0; j < e->s.size(); ++j) { - if (atStartOfLine) { - if (e->s[j] == ' ') { - if (curDropped++ >= minIndent) - s2 += e->s[j]; - } - else if (e->s[j] == '\n') { - curDropped = 0; - s2 += e->s[j]; - } else { - atStartOfLine = false; - curDropped = 0; - s2 += e->s[j]; - } - } else { - s2 += e->s[j]; - if (e->s[j] == '\n') atStartOfLine = true; - } - } - - /* Remove the last line if it is empty and consists only of - spaces. */ - if (n == 1) { - string::size_type p = s2.find_last_of('\n'); - if (p != string::npos && s2.find_first_not_of(' ', p + 1) == string::npos) - s2 = string(s2, 0, p + 1); - } - - es2->push_back(new ExprString(symbols.create(s2))); - } - - /* If this is a single string, then don't do a concatenation. */ - return es2->size() == 1 && dynamic_cast((*es2)[0]) ? (*es2)[0] : new ExprConcatStrings(true, es2); -} - - -void backToString(yyscan_t scanner); -void backToIndString(yyscan_t scanner); - - -static Pos makeCurPos(const YYLTYPE & loc, ParseData * data) -{ - return Pos(data->path, loc.first_line, loc.first_column); -} - -#define CUR_POS makeCurPos(*yylocp, data) - - -} - - -void yyerror(YYLTYPE * loc, yyscan_t scanner, ParseData * data, const char * error) -{ - data->error = (format("%1%, at %2%") - % error % makeCurPos(*loc, data)).str(); -} - - -%} - -%union { - // !!! We're probably leaking stuff here. - nix::Expr * e; - nix::ExprList * list; - nix::ExprAttrs * attrs; - nix::Formals * formals; - nix::Formal * formal; - nix::NixInt n; - const char * id; // !!! -> Symbol - char * path; - char * uri; - std::vector * attrNames; - std::vector * string_parts; -} - -%type start expr expr_function expr_if expr_op -%type expr_app expr_select expr_simple -%type expr_list -%type binds -%type formals -%type formal -%type attrs attrpath -%type string_parts_interpolated ind_string_parts -%type string_parts string_attr -%type attr -%token ID ATTRPATH -%token STR IND_STR -%token INT -%token PATH SPATH -%token URI -%token IF THEN ELSE ASSERT WITH LET IN REC INHERIT EQ NEQ AND OR IMPL OR_KW -%token DOLLAR_CURLY /* == ${ */ -%token IND_STRING_OPEN IND_STRING_CLOSE -%token ELLIPSIS - -%nonassoc IMPL -%left OR -%left AND -%nonassoc EQ NEQ -%left '<' '>' LEQ GEQ -%right UPDATE -%left NOT -%left '+' '-' -%left '*' '/' -%right CONCAT -%nonassoc '?' -%nonassoc '~' -%nonassoc NEGATE - -%% - -start: expr { data->result = $1; }; - -expr: expr_function; - -expr_function - : ID ':' expr_function - { $$ = new ExprLambda(CUR_POS, data->symbols.create($1), false, 0, $3); } - | '{' formals '}' ':' expr_function - { $$ = new ExprLambda(CUR_POS, data->symbols.create(""), true, $2, $5); } - | '{' formals '}' '@' ID ':' expr_function - { $$ = new ExprLambda(CUR_POS, data->symbols.create($5), true, $2, $7); } - | ID '@' '{' formals '}' ':' expr_function - { $$ = new ExprLambda(CUR_POS, data->symbols.create($1), true, $4, $7); } - | ASSERT expr ';' expr_function - { $$ = new ExprAssert(CUR_POS, $2, $4); } - | WITH expr ';' expr_function - { $$ = new ExprWith(CUR_POS, $2, $4); } - | LET binds IN expr_function - { if (!$2->dynamicAttrs.empty()) - throw ParseError(format("dynamic attributes not allowed in let at %1%") - % CUR_POS); - $$ = new ExprLet($2, $4); - } - | expr_if - ; - -expr_if - : IF expr THEN expr ELSE expr { $$ = new ExprIf($2, $4, $6); } - | expr_op - ; - -expr_op - : '!' expr_op %prec NOT { $$ = new ExprOpNot($2); } -| '-' expr_op %prec NEGATE { $$ = new ExprApp(new ExprApp(new ExprBuiltin(data->symbols.create("sub")), new ExprInt(0)), $2); } - | expr_op EQ expr_op { $$ = new ExprOpEq($1, $3); } - | expr_op NEQ expr_op { $$ = new ExprOpNEq($1, $3); } - | expr_op '<' expr_op { $$ = new ExprApp(new ExprApp(new ExprBuiltin(data->symbols.create("lessThan")), $1), $3); } - | expr_op LEQ expr_op { $$ = new ExprOpNot(new ExprApp(new ExprApp(new ExprBuiltin(data->symbols.create("lessThan")), $3), $1)); } - | expr_op '>' expr_op { $$ = new ExprApp(new ExprApp(new ExprBuiltin(data->symbols.create("lessThan")), $3), $1); } - | expr_op GEQ expr_op { $$ = new ExprOpNot(new ExprApp(new ExprApp(new ExprBuiltin(data->symbols.create("lessThan")), $1), $3)); } - | expr_op AND expr_op { $$ = new ExprOpAnd($1, $3); } - | expr_op OR expr_op { $$ = new ExprOpOr($1, $3); } - | expr_op IMPL expr_op { $$ = new ExprOpImpl($1, $3); } - | expr_op UPDATE expr_op { $$ = new ExprOpUpdate($1, $3); } - | expr_op '?' attrpath { $$ = new ExprOpHasAttr($1, *$3); } - | expr_op '+' expr_op - { vector * l = new vector; - l->push_back($1); - l->push_back($3); - $$ = new ExprConcatStrings(false, l); - } - | expr_op '-' expr_op { $$ = new ExprApp(new ExprApp(new ExprBuiltin(data->symbols.create("sub")), $1), $3); } - | expr_op '*' expr_op { $$ = new ExprApp(new ExprApp(new ExprBuiltin(data->symbols.create("mul")), $1), $3); } - | expr_op '/' expr_op { $$ = new ExprApp(new ExprApp(new ExprBuiltin(data->symbols.create("div")), $1), $3); } - | expr_op CONCAT expr_op { $$ = new ExprOpConcatLists($1, $3); } - | expr_app - ; - -expr_app - : expr_app expr_select - { $$ = new ExprApp($1, $2); } - | expr_select { $$ = $1; } - ; - -expr_select - : expr_simple '.' attrpath - { $$ = new ExprSelect($1, *$3, 0); } - | expr_simple '.' attrpath OR_KW expr_select - { $$ = new ExprSelect($1, *$3, $5); } - | /* Backwards compatibility: because Nixpkgs has a rarely used - function named ‘or’, allow stuff like ‘map or [...]’. */ - expr_simple OR_KW - { $$ = new ExprApp($1, new ExprVar(CUR_POS, data->symbols.create("or"))); } - | expr_simple { $$ = $1; } - ; - -expr_simple - : ID { - if (strcmp($1, "__curPos") == 0) - $$ = new ExprPos(CUR_POS); - else - $$ = new ExprVar(CUR_POS, data->symbols.create($1)); - } - | INT { $$ = new ExprInt($1); } - | '"' string_parts '"' { $$ = $2; } - | IND_STRING_OPEN ind_string_parts IND_STRING_CLOSE { - $$ = stripIndentation(data->symbols, *$2); - } - | PATH { $$ = new ExprPath(absPath($1, data->basePath)); } - | SPATH { - string path($1 + 1, strlen($1) - 2); - Path path2 = data->state.findFile(path); - /* The file wasn't found in the search path. However, we can't - throw an error here, because the expression might never be - evaluated. So return an expression that lazily calls - ‘throw’. */ - $$ = path2 == "" - ? (Expr * ) new ExprApp( - new ExprBuiltin(data->symbols.create("throw")), - new ExprString(data->symbols.create( - (format("file `%1%' was not found in the Nix search path (add it using $NIX_PATH or -I)") % path).str()))) - : (Expr * ) new ExprPath(path2); - } - | URI { $$ = new ExprString(data->symbols.create($1)); } - | '(' expr ')' { $$ = $2; } - /* Let expressions `let {..., body = ...}' are just desugared - into `(rec {..., body = ...}).body'. */ - | LET '{' binds '}' - { $3->recursive = true; $$ = new ExprSelect($3, data->symbols.create("body")); } - | REC '{' binds '}' - { $3->recursive = true; $$ = $3; } - | '{' binds '}' - { $$ = $2; } - | '[' expr_list ']' { $$ = $2; } - ; - -string_parts - : STR - | string_parts_interpolated { $$ = new ExprConcatStrings(true, $1); } - | { $$ = new ExprString(data->symbols.create("")); } - ; - -string_parts_interpolated - : string_parts_interpolated STR { $$ = $1; $1->push_back($2); } - | string_parts_interpolated DOLLAR_CURLY expr '}' { backToString(scanner); $$ = $1; $1->push_back($3); } - | STR DOLLAR_CURLY expr '}' - { - backToString(scanner); - $$ = new vector; - $$->push_back($1); - $$->push_back($3); - } - | DOLLAR_CURLY expr '}' - { - backToString(scanner); - $$ = new vector; - $$->push_back($2); - } - ; - -ind_string_parts - : ind_string_parts IND_STR { $$ = $1; $1->push_back($2); } - | ind_string_parts DOLLAR_CURLY expr '}' { backToIndString(scanner); $$ = $1; $1->push_back($3); } - | { $$ = new vector; } - ; - -binds - : binds attrpath '=' expr ';' { $$ = $1; addAttr($$, *$2, $4, makeCurPos(@2, data)); } - | binds INHERIT attrs ';' - { $$ = $1; - foreach (AttrPath::iterator, i, *$3) { - if ($$->attrs.find(i->symbol) != $$->attrs.end()) - dupAttr(i->symbol, makeCurPos(@3, data), $$->attrs[i->symbol].pos); - Pos pos = makeCurPos(@3, data); - $$->attrs[i->symbol] = ExprAttrs::AttrDef(new ExprVar(CUR_POS, i->symbol), pos, true); - } - } - | binds INHERIT '(' expr ')' attrs ';' - { $$ = $1; - /* !!! Should ensure sharing of the expression in $4. */ - foreach (AttrPath::iterator, i, *$6) { - if ($$->attrs.find(i->symbol) != $$->attrs.end()) - dupAttr(i->symbol, makeCurPos(@6, data), $$->attrs[i->symbol].pos); - $$->attrs[i->symbol] = ExprAttrs::AttrDef(new ExprSelect($4, i->symbol), makeCurPos(@6, data)); - } - } - | { $$ = new ExprAttrs; } - ; - -attrs - : attrs attr { $$ = $1; $1->push_back(AttrName(data->symbols.create($2))); } - | attrs string_attr - { $$ = $1; - ExprString *str = dynamic_cast($2); - if (str) { - $$->push_back(AttrName(str->s)); - delete str; - } else - throw ParseError(format("dynamic attributes not allowed in inherit at %1%") - % makeCurPos(@2, data)); - } - | { $$ = new AttrPath; } - ; - -attrpath - : attrpath '.' attr { $$ = $1; $1->push_back(AttrName(data->symbols.create($3))); } - | attrpath '.' string_attr - { $$ = $1; - ExprString *str = dynamic_cast($3); - if (str) { - $$->push_back(AttrName(str->s)); - delete str; - } else - $$->push_back(AttrName(static_cast($3))); - } - | attr { $$ = new vector; $$->push_back(AttrName(data->symbols.create($1))); } - | string_attr - { $$ = new vector; - ExprString *str = dynamic_cast($1); - if (str) { - $$->push_back(AttrName(str->s)); - delete str; - } else - $$->push_back(AttrName(static_cast($1))); - } - ; - -attr - : ID { $$ = $1; } - | OR_KW { $$ = "or"; } - ; - -string_attr - : '"' string_parts '"' { $$ = $2; } - | DOLLAR_CURLY expr '}' { $$ = new ExprConcatStrings(true, new vector(1, $2)); } - ; - -expr_list - : expr_list expr_select { $$ = $1; $1->elems.push_back($2); /* !!! dangerous */ } - | { $$ = new ExprList; } - ; - -formals - : formal ',' formals - { $$ = $3; addFormal(CUR_POS, $$, *$1); } - | formal - { $$ = new Formals; addFormal(CUR_POS, $$, *$1); $$->ellipsis = false; } - | - { $$ = new Formals; $$->ellipsis = false; } - | ELLIPSIS - { $$ = new Formals; $$->ellipsis = true; } - ; - -formal - : ID { $$ = new Formal(data->symbols.create($1), 0); } - | ID '?' expr { $$ = new Formal(data->symbols.create($1), $3); } - ; - -%% - - -#include -#include -#include -#include - -#include - - -namespace nix { - - -Expr * EvalState::parse(const char * text, - const Path & path, const Path & basePath, StaticEnv & staticEnv) -{ - yyscan_t scanner; - ParseData data(*this); - data.basePath = basePath; - data.path = data.symbols.create(path); - - yylex_init(&scanner); - yy_scan_string(text, scanner); - int res = yyparse(scanner, &data); - yylex_destroy(scanner); - - if (res) throw ParseError(data.error); - - data.result->bindVars(staticEnv); - - return data.result; -} - - -Path resolveExprPath(Path path) -{ - assert(path[0] == '/'); - - /* If `path' is a symlink, follow it. This is so that relative - path references work. */ - struct stat st; - while (true) { - if (lstat(path.c_str(), &st)) - throw SysError(format("getting status of `%1%'") % path); - if (!S_ISLNK(st.st_mode)) break; - path = absPath(readLink(path), dirOf(path)); - } - - /* If `path' refers to a directory, append `/default.nix'. */ - if (S_ISDIR(st.st_mode)) - path = canonPath(path + "/default.nix"); - - return path; -} - - -Expr * EvalState::parseExprFromFile(const Path & path) -{ - return parse(readFile(path).c_str(), path, dirOf(path), staticBaseEnv); -} - - -Expr * EvalState::parseExprFromString(const string & s, const Path & basePath, StaticEnv & staticEnv) -{ - return parse(s.c_str(), "(string)", basePath, staticEnv); -} - - -Expr * EvalState::parseExprFromString(const string & s, const Path & basePath) -{ - return parseExprFromString(s, basePath, staticBaseEnv); -} - - - void EvalState::addToSearchPath(const string & s, bool warn) -{ - size_t pos = s.find('='); - string prefix; - Path path; - if (pos == string::npos) { - path = s; - } else { - prefix = string(s, 0, pos); - path = string(s, pos + 1); - } - - path = absPath(path); - if (pathExists(path)) { - debug(format("adding path `%1%' to the search path") % path); - searchPath.insert(searchPathInsertionPoint, std::pair(prefix, path)); - } else if (warn) - printMsg(lvlError, format("warning: Nix search path entry `%1%' does not exist, ignoring") % path); -} - - -Path EvalState::findFile(const string & path) -{ - foreach (SearchPath::iterator, i, searchPath) { - Path res; - if (i->first.empty()) - res = i->second + "/" + path; - else { - if (path.compare(0, i->first.size(), i->first) != 0 || - (path.size() > i->first.size() && path[i->first.size()] != '/')) - continue; - res = i->second + - (path.size() == i->first.size() ? "" : "/" + string(path, i->first.size())); - } - if (pathExists(res)) return canonPath(res); - } - return ""; -} - - -} diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc deleted file mode 100644 index ca316f08af..0000000000 --- a/src/libexpr/primops.cc +++ /dev/null @@ -1,1336 +0,0 @@ -#include "eval.hh" -#include "misc.hh" -#include "globals.hh" -#include "store-api.hh" -#include "util.hh" -#include "archive.hh" -#include "value-to-xml.hh" -#include "value-to-json.hh" -#include "names.hh" -#include "eval-inline.hh" - -#include -#include -#include - -#include -#include - - -namespace nix { - - -/************************************************************* - * Miscellaneous - *************************************************************/ - - -/* Decode a context string ‘!!’ into a pair . */ -std::pair decodeContext(const string & s) -{ - if (s.at(0) == '!') { - size_t index = s.find("!", 1); - return std::pair(string(s, index + 1), string(s, 1, index - 1)); - } else - return std::pair(s, ""); -} - - -/* Load and evaluate an expression from path specified by the - argument. */ -static void prim_import(EvalState & state, Value * * args, Value & v) -{ - PathSet context; - Path path = state.coerceToPath(*args[0], context); - - foreach (PathSet::iterator, i, context) { - Path ctx = decodeContext(*i).first; - assert(isStorePath(ctx)); - if (!store->isValidPath(ctx)) - throw EvalError(format("cannot import `%1%', since path `%2%' is not valid") - % path % ctx); - if (isDerivation(ctx)) - try { - /* For performance, prefetch all substitute info. */ - PathSet willBuild, willSubstitute, unknown; - unsigned long long downloadSize, narSize; - queryMissing(*store, singleton(ctx), - willBuild, willSubstitute, unknown, downloadSize, narSize); - - /* !!! If using a substitute, we only need to fetch - the selected output of this derivation. */ - store->buildPaths(singleton(ctx)); - } catch (Error & e) { - throw ImportError(e.msg()); - } - } - - if (isStorePath(path) && store->isValidPath(path) && isDerivation(path)) { - Derivation drv = parseDerivation(readFile(path)); - Value & w = *state.allocValue(); - state.mkAttrs(w, 1 + drv.outputs.size()); - mkString(*state.allocAttr(w, state.sDrvPath), path, singleton("=" + path)); - state.mkList(*state.allocAttr(w, state.symbols.create("outputs")), drv.outputs.size()); - unsigned int outputs_index = 0; - - Value * outputsVal = w.attrs->find(state.symbols.create("outputs"))->value; - foreach (DerivationOutputs::iterator, i, drv.outputs) { - mkString(*state.allocAttr(w, state.symbols.create(i->first)), - i->second.path, singleton("!" + i->first + "!" + path)); - mkString(*(outputsVal->list.elems[outputs_index++] = state.allocValue()), - i->first); - } - w.attrs->sort(); - Value fun; - state.evalFile(state.findFile("nix/imported-drv-to-derivation.nix"), fun); - state.forceFunction(fun); - mkApp(v, fun, w); - state.forceAttrs(v); - } else { - state.evalFile(path, v); - } -} - - -/* Return a string representing the type of the expression. */ -static void prim_typeOf(EvalState & state, Value * * args, Value & v) -{ - state.forceValue(*args[0]); - string t; - switch (args[0]->type) { - case tInt: t = "int"; break; - case tBool: t = "bool"; break; - case tString: t = "string"; break; - case tPath: t = "path"; break; - case tNull: t = "null"; break; - case tAttrs: t = "set"; break; - case tList: t = "list"; break; - case tLambda: - case tPrimOp: - case tPrimOpApp: - t = "lambda"; - break; - default: abort(); - } - mkString(v, state.symbols.create(t)); -} - - -/* Determine whether the argument is the null value. */ -static void prim_isNull(EvalState & state, Value * * args, Value & v) -{ - state.forceValue(*args[0]); - mkBool(v, args[0]->type == tNull); -} - - -/* Determine whether the argument is a function. */ -static void prim_isFunction(EvalState & state, Value * * args, Value & v) -{ - state.forceValue(*args[0]); - mkBool(v, args[0]->type == tLambda); -} - - -/* Determine whether the argument is an integer. */ -static void prim_isInt(EvalState & state, Value * * args, Value & v) -{ - state.forceValue(*args[0]); - mkBool(v, args[0]->type == tInt); -} - - -/* Determine whether the argument is a string. */ -static void prim_isString(EvalState & state, Value * * args, Value & v) -{ - state.forceValue(*args[0]); - mkBool(v, args[0]->type == tString); -} - - -/* Determine whether the argument is a Boolean. */ -static void prim_isBool(EvalState & state, Value * * args, Value & v) -{ - state.forceValue(*args[0]); - mkBool(v, args[0]->type == tBool); -} - - -struct CompareValues -{ - bool operator () (const Value * v1, const Value * v2) const - { - if (v1->type != v2->type) - throw EvalError("cannot compare values of different types"); - switch (v1->type) { - case tInt: - return v1->integer < v2->integer; - case tString: - return strcmp(v1->string.s, v2->string.s) < 0; - case tPath: - return strcmp(v1->path, v2->path) < 0; - default: - throw EvalError(format("cannot compare %1% with %2%") % showType(*v1) % showType(*v2)); - } - } -}; - - -#if HAVE_BOEHMGC -typedef list > ValueList; -#else -typedef list ValueList; -#endif - - -static void prim_genericClosure(EvalState & state, Value * * args, Value & v) -{ - startNest(nest, lvlDebug, "finding dependencies"); - - state.forceAttrs(*args[0]); - - /* Get the start set. */ - Bindings::iterator startSet = - args[0]->attrs->find(state.symbols.create("startSet")); - if (startSet == args[0]->attrs->end()) - throw EvalError("attribute `startSet' required"); - state.forceList(*startSet->value); - - ValueList workSet; - for (unsigned int n = 0; n < startSet->value->list.length; ++n) - workSet.push_back(startSet->value->list.elems[n]); - - /* Get the operator. */ - Bindings::iterator op = - args[0]->attrs->find(state.symbols.create("operator")); - if (op == args[0]->attrs->end()) - throw EvalError("attribute `operator' required"); - state.forceValue(*op->value); - - /* Construct the closure by applying the operator to element of - `workSet', adding the result to `workSet', continuing until - no new elements are found. */ - ValueList res; - // `doneKeys' doesn't need to be a GC root, because its values are - // reachable from res. - set doneKeys; - while (!workSet.empty()) { - Value * e = *(workSet.begin()); - workSet.pop_front(); - - state.forceAttrs(*e); - - Bindings::iterator key = - e->attrs->find(state.symbols.create("key")); - if (key == e->attrs->end()) - throw EvalError("attribute `key' required"); - state.forceValue(*key->value); - - if (doneKeys.find(key->value) != doneKeys.end()) continue; - doneKeys.insert(key->value); - res.push_back(e); - - /* Call the `operator' function with `e' as argument. */ - Value call; - mkApp(call, *op->value, *e); - state.forceList(call); - - /* Add the values returned by the operator to the work set. */ - for (unsigned int n = 0; n < call.list.length; ++n) { - state.forceValue(*call.list.elems[n]); - workSet.push_back(call.list.elems[n]); - } - } - - /* Create the result list. */ - state.mkList(v, res.size()); - unsigned int n = 0; - foreach (ValueList::iterator, i, res) - v.list.elems[n++] = *i; -} - - -static void prim_abort(EvalState & state, Value * * args, Value & v) -{ - PathSet context; - throw Abort(format("evaluation aborted with the following error message: `%1%'") % - state.coerceToString(*args[0], context)); -} - - -static void prim_throw(EvalState & state, Value * * args, Value & v) -{ - PathSet context; - throw ThrownError(format("%1%") % state.coerceToString(*args[0], context)); -} - - -static void prim_addErrorContext(EvalState & state, Value * * args, Value & v) -{ - try { - state.forceValue(*args[1]); - v = *args[1]; - } catch (Error & e) { - PathSet context; - e.addPrefix(format("%1%\n") % state.coerceToString(*args[0], context)); - throw; - } -} - - -/* Try evaluating the argument. Success => {success=true; value=something;}, - * else => {success=false; value=false;} */ -static void prim_tryEval(EvalState & state, Value * * args, Value & v) -{ - state.mkAttrs(v, 2); - try { - state.forceValue(*args[0]); - v.attrs->push_back(Attr(state.sValue, args[0])); - mkBool(*state.allocAttr(v, state.symbols.create("success")), true); - } catch (AssertionError & e) { - mkBool(*state.allocAttr(v, state.sValue), false); - mkBool(*state.allocAttr(v, state.symbols.create("success")), false); - } - v.attrs->sort(); -} - - -/* Return an environment variable. Use with care. */ -static void prim_getEnv(EvalState & state, Value * * args, Value & v) -{ - string name = state.forceStringNoCtx(*args[0]); - mkString(v, getEnv(name)); -} - - -/* Evaluate the first expression and print it on standard error. Then - return the second expression. Useful for debugging. */ -static void prim_trace(EvalState & state, Value * * args, Value & v) -{ - state.forceValue(*args[0]); - if (args[0]->type == tString) - printMsg(lvlError, format("trace: %1%") % args[0]->string.s); - else - printMsg(lvlError, format("trace: %1%") % *args[0]); - state.forceValue(*args[1]); - v = *args[1]; -} - - -/************************************************************* - * Derivations - *************************************************************/ - - -/* Construct (as a unobservable side effect) a Nix derivation - expression that performs the derivation described by the argument - set. Returns the original set extended with the following - attributes: `outPath' containing the primary output path of the - derivation; `drvPath' containing the path of the Nix expression; - and `type' set to `derivation' to indicate that this is a - derivation. */ -static void prim_derivationStrict(EvalState & state, Value * * args, Value & v) -{ - startNest(nest, lvlVomit, "evaluating derivation"); - - state.forceAttrs(*args[0]); - - /* Figure out the name first (for stack backtraces). */ - Bindings::iterator attr = args[0]->attrs->find(state.sName); - if (attr == args[0]->attrs->end()) - throw EvalError("required attribute `name' missing"); - string drvName; - Pos & posDrvName(*attr->pos); - try { - drvName = state.forceStringNoCtx(*attr->value); - } catch (Error & e) { - e.addPrefix(format("while evaluating the derivation attribute `name' at %1%:\n") % posDrvName); - throw; - } - - /* Check whether null attributes should be ignored. */ - bool ignoreNulls = false; - attr = args[0]->attrs->find(state.sIgnoreNulls); - if (attr != args[0]->attrs->end()) - ignoreNulls = state.forceBool(*attr->value); - - /* Build the derivation expression by processing the attributes. */ - Derivation drv; - - PathSet context; - - string outputHash, outputHashAlgo; - bool outputHashRecursive = false; - - StringSet outputs; - outputs.insert("out"); - - foreach (Bindings::iterator, i, *args[0]->attrs) { - if (i->name == state.sIgnoreNulls) continue; - string key = i->name; - startNest(nest, lvlVomit, format("processing attribute `%1%'") % key); - - try { - - if (ignoreNulls) { - state.forceValue(*i->value); - if (i->value->type == tNull) continue; - } - - /* The `args' attribute is special: it supplies the - command-line arguments to the builder. */ - if (key == "args") { - state.forceList(*i->value); - for (unsigned int n = 0; n < i->value->list.length; ++n) { - string s = state.coerceToString(*i->value->list.elems[n], context, true); - drv.args.push_back(s); - } - } - - /* All other attributes are passed to the builder through - the environment. */ - else { - string s = state.coerceToString(*i->value, context, true); - drv.env[key] = s; - if (key == "builder") drv.builder = s; - else if (i->name == state.sSystem) drv.platform = s; - else if (i->name == state.sName) { - drvName = s; - printMsg(lvlVomit, format("derivation name is `%1%'") % drvName); - } - else if (key == "outputHash") outputHash = s; - else if (key == "outputHashAlgo") outputHashAlgo = s; - else if (key == "outputHashMode") { - if (s == "recursive") outputHashRecursive = true; - else if (s == "flat") outputHashRecursive = false; - else throw EvalError(format("invalid value `%1%' for `outputHashMode' attribute") % s); - } - else if (key == "outputs") { - Strings tmp = tokenizeString(s); - outputs.clear(); - foreach (Strings::iterator, j, tmp) { - if (outputs.find(*j) != outputs.end()) - throw EvalError(format("duplicate derivation output `%1%'") % *j); - /* !!! Check whether *j is a valid attribute - name. */ - /* Derivations cannot be named ‘drv’, because - then we'd have an attribute ‘drvPath’ in - the resulting set. */ - if (*j == "drv") - throw EvalError(format("invalid derivation output name `drv'") % *j); - outputs.insert(*j); - } - if (outputs.empty()) - throw EvalError("derivation cannot have an empty set of outputs"); - } - } - - } catch (Error & e) { - e.addPrefix(format("while evaluating the attribute `%1%' of the derivation `%2%' at %3%:\n") - % key % drvName % posDrvName); - throw; - } - } - - /* Everything in the context of the strings in the derivation - attributes should be added as dependencies of the resulting - derivation. */ - foreach (PathSet::iterator, i, context) { - Path path = *i; - - /* Paths marked with `=' denote that the path of a derivation - is explicitly passed to the builder. Since that allows the - builder to gain access to every path in the dependency - graph of the derivation (including all outputs), all paths - in the graph must be added to this derivation's list of - inputs to ensure that they are available when the builder - runs. */ - if (path.at(0) == '=') { - /* !!! This doesn't work if readOnlyMode is set. */ - PathSet refs; computeFSClosure(*store, string(path, 1), refs); - foreach (PathSet::iterator, j, refs) { - drv.inputSrcs.insert(*j); - if (isDerivation(*j)) - drv.inputDrvs[*j] = store->queryDerivationOutputNames(*j); - } - } - - /* See prim_unsafeDiscardOutputDependency. */ - else if (path.at(0) == '~') - drv.inputSrcs.insert(string(path, 1)); - - /* Handle derivation outputs of the form ‘!!’. */ - else if (path.at(0) == '!') { - std::pair ctx = decodeContext(path); - drv.inputDrvs[ctx.first].insert(ctx.second); - } - - /* Handle derivation contexts returned by - ‘builtins.storePath’. */ - else if (isDerivation(path)) - drv.inputDrvs[path] = store->queryDerivationOutputNames(path); - - /* Otherwise it's a source file. */ - else - drv.inputSrcs.insert(path); - } - - /* Do we have all required attributes? */ - if (drv.builder == "") - throw EvalError("required attribute `builder' missing"); - if (drv.platform == "") - throw EvalError("required attribute `system' missing"); - - /* Check whether the derivation name is valid. */ - checkStoreName(drvName); - if (isDerivation(drvName)) - throw EvalError(format("derivation names are not allowed to end in `%1%'") - % drvExtension); - - if (outputHash != "") { - /* Handle fixed-output derivations. */ - if (outputs.size() != 1 || *(outputs.begin()) != "out") - throw Error("multiple outputs are not supported in fixed-output derivations"); - - HashType ht = parseHashType(outputHashAlgo); - if (ht == htUnknown) - throw EvalError(format("unknown hash algorithm `%1%'") % outputHashAlgo); - Hash h = parseHash16or32(ht, outputHash); - outputHash = printHash(h); - if (outputHashRecursive) outputHashAlgo = "r:" + outputHashAlgo; - - Path outPath = makeFixedOutputPath(outputHashRecursive, ht, h, drvName); - drv.env["out"] = outPath; - drv.outputs["out"] = DerivationOutput(outPath, outputHashAlgo, outputHash); - } - - else { - /* Construct the "masked" store derivation, which is the final - one except that in the list of outputs, the output paths - are empty, and the corresponding environment variables have - an empty value. This ensures that changes in the set of - output names do get reflected in the hash. */ - foreach (StringSet::iterator, i, outputs) { - drv.env[*i] = ""; - drv.outputs[*i] = DerivationOutput("", "", ""); - } - - /* Use the masked derivation expression to compute the output - path. */ - Hash h = hashDerivationModulo(*store, drv); - - foreach (DerivationOutputs::iterator, i, drv.outputs) - if (i->second.path == "") { - Path outPath = makeOutputPath(i->first, h, drvName); - drv.env[i->first] = outPath; - i->second.path = outPath; - } - } - - /* Write the resulting term into the Nix store directory. */ - Path drvPath = writeDerivation(*store, drv, drvName, state.repair); - - printMsg(lvlChatty, format("instantiated `%1%' -> `%2%'") - % drvName % drvPath); - - /* Optimisation, but required in read-only mode! because in that - case we don't actually write store derivations, so we can't - read them later. */ - drvHashes[drvPath] = hashDerivationModulo(*store, drv); - - state.mkAttrs(v, 1 + drv.outputs.size()); - mkString(*state.allocAttr(v, state.sDrvPath), drvPath, singleton("=" + drvPath)); - foreach (DerivationOutputs::iterator, i, drv.outputs) { - mkString(*state.allocAttr(v, state.symbols.create(i->first)), - i->second.path, singleton("!" + i->first + "!" + drvPath)); - } - v.attrs->sort(); -} - - -/************************************************************* - * Paths - *************************************************************/ - - -/* Convert the argument to a path. !!! obsolete? */ -static void prim_toPath(EvalState & state, Value * * args, Value & v) -{ - PathSet context; - Path path = state.coerceToPath(*args[0], context); - mkString(v, canonPath(path), context); -} - - -/* Allow a valid store path to be used in an expression. This is - useful in some generated expressions such as in nix-push, which - generates a call to a function with an already existing store path - as argument. You don't want to use `toPath' here because it copies - the path to the Nix store, which yields a copy like - /nix/store/newhash-oldhash-oldname. In the past, `toPath' had - special case behaviour for store paths, but that created weird - corner cases. */ -static void prim_storePath(EvalState & state, Value * * args, Value & v) -{ - PathSet context; - Path path = state.coerceToPath(*args[0], context); - /* Resolve symlinks in ‘path’, unless ‘path’ itself is a symlink - directly in the store. The latter condition is necessary so - e.g. nix-push does the right thing. */ - if (!isStorePath(path)) path = canonPath(path, true); - if (!isInStore(path)) - throw EvalError(format("path `%1%' is not in the Nix store") % path); - Path path2 = toStorePath(path); - if (!settings.readOnlyMode) - store->ensurePath(path2); - context.insert(path2); - mkString(v, path, context); -} - - -static void prim_pathExists(EvalState & state, Value * * args, Value & v) -{ - PathSet context; - Path path = state.coerceToPath(*args[0], context); - if (!context.empty()) - throw EvalError(format("string `%1%' cannot refer to other paths") % path); - mkBool(v, pathExists(path)); -} - - -/* Return the base name of the given string, i.e., everything - following the last slash. */ -static void prim_baseNameOf(EvalState & state, Value * * args, Value & v) -{ - PathSet context; - mkString(v, baseNameOf(state.coerceToString(*args[0], context)), context); -} - - -/* Return the directory of the given path, i.e., everything before the - last slash. Return either a path or a string depending on the type - of the argument. */ -static void prim_dirOf(EvalState & state, Value * * args, Value & v) -{ - PathSet context; - Path dir = dirOf(state.coerceToPath(*args[0], context)); - if (args[0]->type == tPath) mkPath(v, dir.c_str()); else mkString(v, dir, context); -} - - -/* Return the contents of a file as a string. */ -static void prim_readFile(EvalState & state, Value * * args, Value & v) -{ - PathSet context; - Path path = state.coerceToPath(*args[0], context); - if (!context.empty()) - throw EvalError(format("string `%1%' cannot refer to other paths") % path); - mkString(v, readFile(path).c_str()); -} - - -/************************************************************* - * Creating files - *************************************************************/ - - -/* Convert the argument (which can be any Nix expression) to an XML - representation returned in a string. Not all Nix expressions can - be sensibly or completely represented (e.g., functions). */ -static void prim_toXML(EvalState & state, Value * * args, Value & v) -{ - std::ostringstream out; - PathSet context; - printValueAsXML(state, true, false, *args[0], out, context); - mkString(v, out.str(), context); -} - - -/* Convert the argument (which can be any Nix expression) to a JSON - string. Not all Nix expressions can be sensibly or completely - represented (e.g., functions). */ -static void prim_toJSON(EvalState & state, Value * * args, Value & v) -{ - std::ostringstream out; - PathSet context; - printValueAsJSON(state, true, *args[0], out, context); - mkString(v, out.str(), context); -} - - -/* Store a string in the Nix store as a source file that can be used - as an input by derivations. */ -static void prim_toFile(EvalState & state, Value * * args, Value & v) -{ - PathSet context; - string name = state.forceStringNoCtx(*args[0]); - string contents = state.forceString(*args[1], context); - - PathSet refs; - - foreach (PathSet::iterator, i, context) { - Path path = *i; - if (path.at(0) == '=') path = string(path, 1); - if (isDerivation(path)) - throw EvalError(format("in `toFile': the file `%1%' cannot refer to derivation outputs") % name); - refs.insert(path); - } - - Path storePath = settings.readOnlyMode - ? computeStorePathForText(name, contents, refs) - : store->addTextToStore(name, contents, refs, state.repair); - - /* Note: we don't need to add `context' to the context of the - result, since `storePath' itself has references to the paths - used in args[1]. */ - - mkString(v, storePath, singleton(storePath)); -} - - -struct FilterFromExpr : PathFilter -{ - EvalState & state; - Value & filter; - - FilterFromExpr(EvalState & state, Value & filter) - : state(state), filter(filter) - { - } - - bool operator () (const Path & path) - { - struct stat st; - if (lstat(path.c_str(), &st)) - throw SysError(format("getting attributes of path `%1%'") % path); - - /* Call the filter function. The first argument is the path, - the second is a string indicating the type of the file. */ - Value arg1; - mkString(arg1, path); - - Value fun2; - state.callFunction(filter, arg1, fun2); - - Value arg2; - mkString(arg2, - S_ISREG(st.st_mode) ? "regular" : - S_ISDIR(st.st_mode) ? "directory" : - S_ISLNK(st.st_mode) ? "symlink" : - "unknown" /* not supported, will fail! */); - - Value res; - state.callFunction(fun2, arg2, res); - - return state.forceBool(res); - } -}; - - -static void prim_filterSource(EvalState & state, Value * * args, Value & v) -{ - PathSet context; - Path path = state.coerceToPath(*args[1], context); - if (!context.empty()) - throw EvalError(format("string `%1%' cannot refer to other paths") % path); - - state.forceValue(*args[0]); - if (args[0]->type != tLambda) - throw TypeError(format("first argument in call to `filterSource' is not a function but %1%") % showType(*args[0])); - - FilterFromExpr filter(state, *args[0]); - - Path dstPath = settings.readOnlyMode - ? computeStorePathForPath(path, true, htSHA256, filter).first - : store->addToStore(path, true, htSHA256, filter, state.repair); - - mkString(v, dstPath, singleton(dstPath)); -} - - -/************************************************************* - * Sets - *************************************************************/ - - -/* Return the names of the attributes in a set as a sorted list of - strings. */ -static void prim_attrNames(EvalState & state, Value * * args, Value & v) -{ - state.forceAttrs(*args[0]); - - state.mkList(v, args[0]->attrs->size()); - - StringSet names; - foreach (Bindings::iterator, i, *args[0]->attrs) - names.insert(i->name); - - unsigned int n = 0; - foreach (StringSet::iterator, i, names) - mkString(*(v.list.elems[n++] = state.allocValue()), *i); -} - - -/* Dynamic version of the `.' operator. */ -void prim_getAttr(EvalState & state, Value * * args, Value & v) -{ - string attr = state.forceStringNoCtx(*args[0]); - state.forceAttrs(*args[1]); - // !!! Should we create a symbol here or just do a lookup? - Bindings::iterator i = args[1]->attrs->find(state.symbols.create(attr)); - if (i == args[1]->attrs->end()) - throw EvalError(format("attribute `%1%' missing") % attr); - // !!! add to stack trace? - if (state.countCalls && i->pos) state.attrSelects[*i->pos]++; - state.forceValue(*i->value); - v = *i->value; -} - - -/* Return position information of the specified attribute. */ -void prim_unsafeGetAttrPos(EvalState & state, Value * * args, Value & v) -{ - string attr = state.forceStringNoCtx(*args[0]); - state.forceAttrs(*args[1]); - Bindings::iterator i = args[1]->attrs->find(state.symbols.create(attr)); - if (i == args[1]->attrs->end()) - mkNull(v); - else - state.mkPos(v, i->pos); -} - - -/* Dynamic version of the `?' operator. */ -static void prim_hasAttr(EvalState & state, Value * * args, Value & v) -{ - string attr = state.forceStringNoCtx(*args[0]); - state.forceAttrs(*args[1]); - mkBool(v, args[1]->attrs->find(state.symbols.create(attr)) != args[1]->attrs->end()); -} - - -/* Determine whether the argument is a set. */ -static void prim_isAttrs(EvalState & state, Value * * args, Value & v) -{ - state.forceValue(*args[0]); - mkBool(v, args[0]->type == tAttrs); -} - - -static void prim_removeAttrs(EvalState & state, Value * * args, Value & v) -{ - state.forceAttrs(*args[0]); - state.forceList(*args[1]); - - /* Get the attribute names to be removed. */ - std::set names; - for (unsigned int i = 0; i < args[1]->list.length; ++i) { - state.forceStringNoCtx(*args[1]->list.elems[i]); - names.insert(state.symbols.create(args[1]->list.elems[i]->string.s)); - } - - /* Copy all attributes not in that set. Note that we don't need - to sort v.attrs because it's a subset of an already sorted - vector. */ - state.mkAttrs(v, args[0]->attrs->size()); - foreach (Bindings::iterator, i, *args[0]->attrs) { - if (names.find(i->name) == names.end()) - v.attrs->push_back(*i); - } -} - - -/* Builds a set from a list specifying (name, value) pairs. To be - precise, a list [{name = "name1"; value = value1;} ... {name = - "nameN"; value = valueN;}] is transformed to {name1 = value1; - ... nameN = valueN;}. In case of duplicate occurences of the same - name, the first takes precedence. */ -static void prim_listToAttrs(EvalState & state, Value * * args, Value & v) -{ - state.forceList(*args[0]); - - state.mkAttrs(v, args[0]->list.length); - - std::set seen; - - for (unsigned int i = 0; i < args[0]->list.length; ++i) { - Value & v2(*args[0]->list.elems[i]); - state.forceAttrs(v2); - - Bindings::iterator j = v2.attrs->find(state.sName); - if (j == v2.attrs->end()) - throw TypeError("`name' attribute missing in a call to `listToAttrs'"); - string name = state.forceStringNoCtx(*j->value); - - Symbol sym = state.symbols.create(name); - if (seen.find(sym) == seen.end()) { - Bindings::iterator j2 = v2.attrs->find(state.symbols.create(state.sValue)); - if (j2 == v2.attrs->end()) - throw TypeError("`value' attribute missing in a call to `listToAttrs'"); - - v.attrs->push_back(Attr(sym, j2->value, j2->pos)); - seen.insert(sym); - } - } - - v.attrs->sort(); -} - - -/* Return the right-biased intersection of two sets as1 and as2, - i.e. a set that contains every attribute from as2 that is also a - member of as1. */ -static void prim_intersectAttrs(EvalState & state, Value * * args, Value & v) -{ - state.forceAttrs(*args[0]); - state.forceAttrs(*args[1]); - - state.mkAttrs(v, std::min(args[0]->attrs->size(), args[1]->attrs->size())); - - foreach (Bindings::iterator, i, *args[0]->attrs) { - Bindings::iterator j = args[1]->attrs->find(i->name); - if (j != args[1]->attrs->end()) - v.attrs->push_back(*j); - } -} - - -/* Return a set containing the names of the formal arguments expected - by the function `f'. The value of each attribute is a Boolean - denoting whether has a default value. For instance, - - functionArgs ({ x, y ? 123}: ...) - => { x = false; y = true; } - - "Formal argument" here refers to the attributes pattern-matched by - the function. Plain lambdas are not included, e.g. - - functionArgs (x: ...) - => { } -*/ -static void prim_functionArgs(EvalState & state, Value * * args, Value & v) -{ - state.forceValue(*args[0]); - if (args[0]->type != tLambda) - throw TypeError("`functionArgs' requires a function"); - - if (!args[0]->lambda.fun->matchAttrs) { - state.mkAttrs(v, 0); - return; - } - - state.mkAttrs(v, args[0]->lambda.fun->formals->formals.size()); - foreach (Formals::Formals_::iterator, i, args[0]->lambda.fun->formals->formals) - // !!! should optimise booleans (allocate only once) - mkBool(*state.allocAttr(v, i->name), i->def); - v.attrs->sort(); -} - - -/************************************************************* - * Lists - *************************************************************/ - - -/* Determine whether the argument is a list. */ -static void prim_isList(EvalState & state, Value * * args, Value & v) -{ - state.forceValue(*args[0]); - mkBool(v, args[0]->type == tList); -} - - -static void elemAt(EvalState & state, Value & list, int n, Value & v) -{ - state.forceList(list); - if (n < 0 || n >= list.list.length) - throw Error(format("list index %1% is out of bounds") % n); - state.forceValue(*list.list.elems[n]); - v = *list.list.elems[n]; -} - - -/* Return the n-1'th element of a list. */ -static void prim_elemAt(EvalState & state, Value * * args, Value & v) -{ - elemAt(state, *args[0], state.forceInt(*args[1]), v); -} - - -/* Return the first element of a list. */ -static void prim_head(EvalState & state, Value * * args, Value & v) -{ - elemAt(state, *args[0], 0, v); -} - - -/* Return a list consisting of everything but the the first element of - a list. Warning: this function takes O(n) time, so you probably - don't want to use it! */ -static void prim_tail(EvalState & state, Value * * args, Value & v) -{ - state.forceList(*args[0]); - if (args[0]->list.length == 0) - throw Error("`tail' called on an empty list"); - state.mkList(v, args[0]->list.length - 1); - for (unsigned int n = 0; n < v.list.length; ++n) - v.list.elems[n] = args[0]->list.elems[n + 1]; -} - - -/* Apply a function to every element of a list. */ -static void prim_map(EvalState & state, Value * * args, Value & v) -{ - state.forceFunction(*args[0]); - state.forceList(*args[1]); - - state.mkList(v, args[1]->list.length); - - for (unsigned int n = 0; n < v.list.length; ++n) - mkApp(*(v.list.elems[n] = state.allocValue()), - *args[0], *args[1]->list.elems[n]); -} - - -/* Filter a list using a predicate; that is, return a list containing - every element from the list for which the predicate function - returns true. */ -static void prim_filter(EvalState & state, Value * * args, Value & v) -{ - state.forceFunction(*args[0]); - state.forceList(*args[1]); - - // FIXME: putting this on the stack is risky. - Value * vs[args[1]->list.length]; - unsigned int k = 0; - - bool same = true; - for (unsigned int n = 0; n < args[1]->list.length; ++n) { - Value res; - state.callFunction(*args[0], *args[1]->list.elems[n], res); - if (state.forceBool(res)) - vs[k++] = args[1]->list.elems[n]; - else - same = false; - } - - if (same) - v = *args[1]; - else { - state.mkList(v, k); - for (unsigned int n = 0; n < k; ++n) v.list.elems[n] = vs[n]; - } -} - - -/* Return true if a list contains a given element. */ -static void prim_elem(EvalState & state, Value * * args, Value & v) -{ - bool res = false; - state.forceList(*args[1]); - for (unsigned int n = 0; n < args[1]->list.length; ++n) - if (state.eqValues(*args[0], *args[1]->list.elems[n])) { - res = true; - break; - } - mkBool(v, res); -} - - -/* Concatenate a list of lists. */ -static void prim_concatLists(EvalState & state, Value * * args, Value & v) -{ - state.forceList(*args[0]); - state.concatLists(v, args[0]->list.length, args[0]->list.elems); -} - - -/* Return the length of a list. This is an O(1) time operation. */ -static void prim_length(EvalState & state, Value * * args, Value & v) -{ - state.forceList(*args[0]); - mkInt(v, args[0]->list.length); -} - - -/************************************************************* - * Integer arithmetic - *************************************************************/ - - -static void prim_add(EvalState & state, Value * * args, Value & v) -{ - mkInt(v, state.forceInt(*args[0]) + state.forceInt(*args[1])); -} - - -static void prim_sub(EvalState & state, Value * * args, Value & v) -{ - mkInt(v, state.forceInt(*args[0]) - state.forceInt(*args[1])); -} - - -static void prim_mul(EvalState & state, Value * * args, Value & v) -{ - mkInt(v, state.forceInt(*args[0]) * state.forceInt(*args[1])); -} - - -static void prim_div(EvalState & state, Value * * args, Value & v) -{ - NixInt i2 = state.forceInt(*args[1]); - if (i2 == 0) throw EvalError("division by zero"); - mkInt(v, state.forceInt(*args[0]) / i2); -} - - -static void prim_lessThan(EvalState & state, Value * * args, Value & v) -{ - state.forceValue(*args[0]); - state.forceValue(*args[1]); - CompareValues comp; - mkBool(v, comp(args[0], args[1])); -} - - -/************************************************************* - * String manipulation - *************************************************************/ - - -/* Convert the argument to a string. Paths are *not* copied to the - store, so `toString /foo/bar' yields `"/foo/bar"', not - `"/nix/store/whatever..."'. */ -static void prim_toString(EvalState & state, Value * * args, Value & v) -{ - PathSet context; - string s = state.coerceToString(*args[0], context, true, false); - mkString(v, s, context); -} - - -/* `substring start len str' returns the substring of `str' starting - at character position `min(start, stringLength str)' inclusive and - ending at `min(start + len, stringLength str)'. `start' must be - non-negative. */ -static void prim_substring(EvalState & state, Value * * args, Value & v) -{ - int start = state.forceInt(*args[0]); - int len = state.forceInt(*args[1]); - PathSet context; - string s = state.coerceToString(*args[2], context); - - if (start < 0) throw EvalError("negative start position in `substring'"); - - mkString(v, start >= s.size() ? "" : string(s, start, len), context); -} - - -static void prim_stringLength(EvalState & state, Value * * args, Value & v) -{ - PathSet context; - string s = state.coerceToString(*args[0], context); - mkInt(v, s.size()); -} - - -static void prim_unsafeDiscardStringContext(EvalState & state, Value * * args, Value & v) -{ - PathSet context; - string s = state.coerceToString(*args[0], context); - mkString(v, s, PathSet()); -} - - -/* Sometimes we want to pass a derivation path (i.e. pkg.drvPath) to a - builder without causing the derivation to be built (for instance, - in the derivation that builds NARs in nix-push, when doing - source-only deployment). This primop marks the string context so - that builtins.derivation adds the path to drv.inputSrcs rather than - drv.inputDrvs. */ -static void prim_unsafeDiscardOutputDependency(EvalState & state, Value * * args, Value & v) -{ - PathSet context; - string s = state.coerceToString(*args[0], context); - - PathSet context2; - foreach (PathSet::iterator, i, context) { - Path p = *i; - if (p.at(0) == '=') p = "~" + string(p, 1); - context2.insert(p); - } - - mkString(v, s, context2); -} - - -/* Return the cryptographic hash of a string in base-16. */ -static void prim_hashString(EvalState & state, Value * * args, Value & v) -{ - string type = state.forceStringNoCtx(*args[0]); - HashType ht = parseHashType(type); - if (ht == htUnknown) - throw Error(format("unknown hash type `%1%'") % type); - - PathSet context; // discarded - string s = state.forceString(*args[1], context); - - mkString(v, printHash(hashString(ht, s)), context); -}; - - -/************************************************************* - * Versions - *************************************************************/ - - -static void prim_parseDrvName(EvalState & state, Value * * args, Value & v) -{ - string name = state.forceStringNoCtx(*args[0]); - DrvName parsed(name); - state.mkAttrs(v, 2); - mkString(*state.allocAttr(v, state.sName), parsed.name); - mkString(*state.allocAttr(v, state.symbols.create("version")), parsed.version); - v.attrs->sort(); -} - - -static void prim_compareVersions(EvalState & state, Value * * args, Value & v) -{ - string version1 = state.forceStringNoCtx(*args[0]); - string version2 = state.forceStringNoCtx(*args[1]); - mkInt(v, compareVersions(version1, version2)); -} - - -/************************************************************* - * Primop registration - *************************************************************/ - - -void EvalState::createBaseEnv() -{ - baseEnv.up = 0; - - /* Add global constants such as `true' to the base environment. */ - Value v; - - /* `builtins' must be first! */ - mkAttrs(v, 128); - addConstant("builtins", v); - - mkBool(v, true); - addConstant("true", v); - - mkBool(v, false); - addConstant("false", v); - - mkNull(v); - addConstant("null", v); - - mkInt(v, time(0)); - addConstant("__currentTime", v); - - mkString(v, settings.thisSystem.c_str()); - addConstant("__currentSystem", v); - - mkString(v, nixVersion.c_str()); - addConstant("__nixVersion", v); - - /* Language version. This should be increased every time a new - language feature gets added. It's not necessary to increase it - when primops get added, because you can just use `builtins ? - primOp' to check. */ - mkInt(v, 2); - addConstant("__langVersion", v); - - // Miscellaneous - addPrimOp("import", 1, prim_import); - addPrimOp("__typeOf", 1, prim_typeOf); - addPrimOp("isNull", 1, prim_isNull); - addPrimOp("__isFunction", 1, prim_isFunction); - addPrimOp("__isString", 1, prim_isString); - addPrimOp("__isInt", 1, prim_isInt); - addPrimOp("__isBool", 1, prim_isBool); - addPrimOp("__genericClosure", 1, prim_genericClosure); - addPrimOp("abort", 1, prim_abort); - addPrimOp("throw", 1, prim_throw); - addPrimOp("__addErrorContext", 2, prim_addErrorContext); - addPrimOp("__tryEval", 1, prim_tryEval); - addPrimOp("__getEnv", 1, prim_getEnv); - addPrimOp("__trace", 2, prim_trace); - - // Paths - addPrimOp("__toPath", 1, prim_toPath); - addPrimOp("__storePath", 1, prim_storePath); - addPrimOp("__pathExists", 1, prim_pathExists); - addPrimOp("baseNameOf", 1, prim_baseNameOf); - addPrimOp("dirOf", 1, prim_dirOf); - addPrimOp("__readFile", 1, prim_readFile); - - // Creating files - addPrimOp("__toXML", 1, prim_toXML); - addPrimOp("__toJSON", 1, prim_toJSON); - addPrimOp("__toFile", 2, prim_toFile); - addPrimOp("__filterSource", 2, prim_filterSource); - - // Sets - addPrimOp("__attrNames", 1, prim_attrNames); - addPrimOp("__getAttr", 2, prim_getAttr); - addPrimOp("__unsafeGetAttrPos", 2, prim_unsafeGetAttrPos); - addPrimOp("__hasAttr", 2, prim_hasAttr); - addPrimOp("__isAttrs", 1, prim_isAttrs); - addPrimOp("removeAttrs", 2, prim_removeAttrs); - addPrimOp("__listToAttrs", 1, prim_listToAttrs); - addPrimOp("__intersectAttrs", 2, prim_intersectAttrs); - addPrimOp("__functionArgs", 1, prim_functionArgs); - - // Lists - addPrimOp("__isList", 1, prim_isList); - addPrimOp("__elemAt", 2, prim_elemAt); - addPrimOp("__head", 1, prim_head); - addPrimOp("__tail", 1, prim_tail); - addPrimOp("map", 2, prim_map); - addPrimOp("__filter", 2, prim_filter); - addPrimOp("__elem", 2, prim_elem); - addPrimOp("__concatLists", 1, prim_concatLists); - addPrimOp("__length", 1, prim_length); - - // Integer arithmetic - addPrimOp("__add", 2, prim_add); - addPrimOp("__sub", 2, prim_sub); - addPrimOp("__mul", 2, prim_mul); - addPrimOp("__div", 2, prim_div); - addPrimOp("__lessThan", 2, prim_lessThan); - - // String manipulation - addPrimOp("toString", 1, prim_toString); - addPrimOp("__substring", 3, prim_substring); - addPrimOp("__stringLength", 1, prim_stringLength); - addPrimOp("__unsafeDiscardStringContext", 1, prim_unsafeDiscardStringContext); - addPrimOp("__unsafeDiscardOutputDependency", 1, prim_unsafeDiscardOutputDependency); - addPrimOp("__hashString", 2, prim_hashString); - - // Versions - addPrimOp("__parseDrvName", 1, prim_parseDrvName); - addPrimOp("__compareVersions", 2, prim_compareVersions); - - // Derivations - addPrimOp("derivationStrict", 1, prim_derivationStrict); - - /* Add a wrapper around the derivation primop that computes the - `drvPath' and `outPath' attributes lazily. */ - string path = findFile("nix/derivation.nix"); - assert(!path.empty()); - sDerivationNix = symbols.create(path); - evalFile(path, v); - addConstant("derivation", v); - - /* Now that we've added all primops, sort the `builtins' set, - because attribute lookups expect it to be sorted. */ - baseEnv.values[0]->attrs->sort(); -} - - -} diff --git a/src/libexpr/symbol-table.hh b/src/libexpr/symbol-table.hh deleted file mode 100644 index 08e31d4965..0000000000 --- a/src/libexpr/symbol-table.hh +++ /dev/null @@ -1,95 +0,0 @@ -#pragma once - -#include "config.h" - -#include - -#if HAVE_TR1_UNORDERED_SET -#include -#endif - -#include "types.hh" - -namespace nix { - -/* Symbol table used by the parser and evaluator to represent and look - up identifiers and attributes efficiently. SymbolTable::create() - converts a string into a symbol. Symbols have the property that - they can be compared efficiently (using a pointer equality test), - because the symbol table stores only one copy of each string. */ - -class Symbol -{ -private: - const string * s; // pointer into SymbolTable - Symbol(const string * s) : s(s) { }; - friend class SymbolTable; - -public: - Symbol() : s(0) { }; - - bool operator == (const Symbol & s2) const - { - return s == s2.s; - } - - bool operator != (const Symbol & s2) const - { - return s != s2.s; - } - - bool operator < (const Symbol & s2) const - { - return s < s2.s; - } - - operator const string & () const - { - return *s; - } - - bool set() const - { - return s; - } - - bool empty() const - { - return s->empty(); - } - - friend std::ostream & operator << (std::ostream & str, const Symbol & sym); -}; - -inline std::ostream & operator << (std::ostream & str, const Symbol & sym) -{ - str << *sym.s; - return str; -} - -class SymbolTable -{ -private: -#if HAVE_TR1_UNORDERED_SET - typedef std::tr1::unordered_set Symbols; -#else - typedef std::set Symbols; -#endif - Symbols symbols; - -public: - Symbol create(const string & s) - { - std::pair res = symbols.insert(s); - return Symbol(&*res.first); - } - - unsigned int size() const - { - return symbols.size(); - } - - size_t totalSize() const; -}; - -} diff --git a/src/libexpr/value-to-json.cc b/src/libexpr/value-to-json.cc deleted file mode 100644 index a2004df5c8..0000000000 --- a/src/libexpr/value-to-json.cc +++ /dev/null @@ -1,86 +0,0 @@ -#include "value-to-json.hh" -#include "eval-inline.hh" -#include "util.hh" - -#include - - -namespace nix { - - -void escapeJSON(std::ostream & str, const string & s) -{ - str << "\""; - foreach (string::const_iterator, i, s) - if (*i == '\"' || *i == '\\') str << "\\" << *i; - else if (*i == '\n') str << "\\n"; - else if (*i == '\r') str << "\\r"; - else if (*i == '\t') str << "\\t"; - else str << *i; - str << "\""; -} - - -void printValueAsJSON(EvalState & state, bool strict, - Value & v, std::ostream & str, PathSet & context) -{ - checkInterrupt(); - - if (strict) state.forceValue(v); - - switch (v.type) { - - case tInt: - str << v.integer; - break; - - case tBool: - str << (v.boolean ? "true" : "false"); - break; - - case tString: - copyContext(v, context); - escapeJSON(str, v.string.s); - break; - - case tPath: - escapeJSON(str, state.copyPathToStore(context, v.path)); - break; - - case tNull: - str << "null"; - break; - - case tAttrs: { - Bindings::iterator i = v.attrs->find(state.sOutPath); - if (i == v.attrs->end()) { - JSONObject json(str); - StringSet names; - foreach (Bindings::iterator, i, *v.attrs) - names.insert(i->name); - foreach (StringSet::iterator, i, names) { - Attr & a(*v.attrs->find(state.symbols.create(*i))); - json.attr(*i); - printValueAsJSON(state, strict, *a.value, str, context); - } - } else - printValueAsJSON(state, strict, *i->value, str, context); - break; - } - - case tList: { - JSONList json(str); - for (unsigned int n = 0; n < v.list.length; ++n) { - json.elem(); - printValueAsJSON(state, strict, *v.list.elems[n], str, context); - } - break; - } - - default: - throw TypeError(format("cannot convert %1% to JSON") % showType(v)); - } -} - - -} diff --git a/src/libexpr/value-to-json.hh b/src/libexpr/value-to-json.hh deleted file mode 100644 index e3a97efe42..0000000000 --- a/src/libexpr/value-to-json.hh +++ /dev/null @@ -1,64 +0,0 @@ -#pragma once - -#include "nixexpr.hh" -#include "eval.hh" - -#include -#include - -namespace nix { - -void printValueAsJSON(EvalState & state, bool strict, - Value & v, std::ostream & out, PathSet & context); - -void escapeJSON(std::ostream & str, const string & s); - -struct JSONObject -{ - std::ostream & str; - bool first; - JSONObject(std::ostream & str) : str(str), first(true) - { - str << "{"; - } - ~JSONObject() - { - str << "}"; - } - void attr(const string & s) - { - if (!first) str << ","; else first = false; - escapeJSON(str, s); - str << ":"; - } - void attr(const string & s, const string & t) - { - attr(s); - escapeJSON(str, t); - } -}; - -struct JSONList -{ - std::ostream & str; - bool first; - JSONList(std::ostream & str) : str(str), first(true) - { - str << "["; - } - ~JSONList() - { - str << "]"; - } - void elem() - { - if (!first) str << ","; else first = false; - } - void elem(const string & s) - { - elem(); - escapeJSON(str, s); - } -}; - -} diff --git a/src/libexpr/value-to-xml.cc b/src/libexpr/value-to-xml.cc deleted file mode 100644 index 3934a83eec..0000000000 --- a/src/libexpr/value-to-xml.cc +++ /dev/null @@ -1,163 +0,0 @@ -#include "value-to-xml.hh" -#include "xml-writer.hh" -#include "eval-inline.hh" -#include "util.hh" - -#include - - -namespace nix { - - -static XMLAttrs singletonAttrs(const string & name, const string & value) -{ - XMLAttrs attrs; - attrs[name] = value; - return attrs; -} - - -static void printValueAsXML(EvalState & state, bool strict, bool location, - Value & v, XMLWriter & doc, PathSet & context, PathSet & drvsSeen); - - -static void posToXML(XMLAttrs & xmlAttrs, const Pos & pos) -{ - xmlAttrs["path"] = pos.file; - xmlAttrs["line"] = (format("%1%") % pos.line).str(); - xmlAttrs["column"] = (format("%1%") % pos.column).str(); -} - - -static void showAttrs(EvalState & state, bool strict, bool location, - Bindings & attrs, XMLWriter & doc, PathSet & context, PathSet & drvsSeen) -{ - StringSet names; - - foreach (Bindings::iterator, i, attrs) - names.insert(i->name); - - foreach (StringSet::iterator, i, names) { - Attr & a(*attrs.find(state.symbols.create(*i))); - - XMLAttrs xmlAttrs; - xmlAttrs["name"] = *i; - if (location && a.pos != &noPos) posToXML(xmlAttrs, *a.pos); - - XMLOpenElement _(doc, "attr", xmlAttrs); - printValueAsXML(state, strict, location, - *a.value, doc, context, drvsSeen); - } -} - - -static void printValueAsXML(EvalState & state, bool strict, bool location, - Value & v, XMLWriter & doc, PathSet & context, PathSet & drvsSeen) -{ - checkInterrupt(); - - if (strict) state.forceValue(v); - - switch (v.type) { - - case tInt: - doc.writeEmptyElement("int", singletonAttrs("value", (format("%1%") % v.integer).str())); - break; - - case tBool: - doc.writeEmptyElement("bool", singletonAttrs("value", v.boolean ? "true" : "false")); - break; - - case tString: - /* !!! show the context? */ - copyContext(v, context); - doc.writeEmptyElement("string", singletonAttrs("value", v.string.s)); - break; - - case tPath: - doc.writeEmptyElement("path", singletonAttrs("value", v.path)); - break; - - case tNull: - doc.writeEmptyElement("null"); - break; - - case tAttrs: - if (state.isDerivation(v)) { - XMLAttrs xmlAttrs; - - Bindings::iterator a = v.attrs->find(state.symbols.create("derivation")); - - Path drvPath; - a = v.attrs->find(state.sDrvPath); - if (a != v.attrs->end()) { - if (strict) state.forceValue(*a->value); - if (a->value->type == tString) - xmlAttrs["drvPath"] = drvPath = a->value->string.s; - } - - a = v.attrs->find(state.sOutPath); - if (a != v.attrs->end()) { - if (strict) state.forceValue(*a->value); - if (a->value->type == tString) - xmlAttrs["outPath"] = a->value->string.s; - } - - XMLOpenElement _(doc, "derivation", xmlAttrs); - - if (drvPath != "" && drvsSeen.find(drvPath) == drvsSeen.end()) { - drvsSeen.insert(drvPath); - showAttrs(state, strict, location, *v.attrs, doc, context, drvsSeen); - } else - doc.writeEmptyElement("repeated"); - } - - else { - XMLOpenElement _(doc, "attrs"); - showAttrs(state, strict, location, *v.attrs, doc, context, drvsSeen); - } - - break; - - case tList: { - XMLOpenElement _(doc, "list"); - for (unsigned int n = 0; n < v.list.length; ++n) - printValueAsXML(state, strict, location, *v.list.elems[n], doc, context, drvsSeen); - break; - } - - case tLambda: { - XMLAttrs xmlAttrs; - if (location) posToXML(xmlAttrs, v.lambda.fun->pos); - XMLOpenElement _(doc, "function", xmlAttrs); - - if (v.lambda.fun->matchAttrs) { - XMLAttrs attrs; - if (!v.lambda.fun->arg.empty()) attrs["name"] = v.lambda.fun->arg; - if (v.lambda.fun->formals->ellipsis) attrs["ellipsis"] = "1"; - XMLOpenElement _(doc, "attrspat", attrs); - foreach (Formals::Formals_::iterator, i, v.lambda.fun->formals->formals) - doc.writeEmptyElement("attr", singletonAttrs("name", i->name)); - } else - doc.writeEmptyElement("varpat", singletonAttrs("name", v.lambda.fun->arg)); - - break; - } - - default: - doc.writeEmptyElement("unevaluated"); - } -} - - -void printValueAsXML(EvalState & state, bool strict, bool location, - Value & v, std::ostream & out, PathSet & context) -{ - XMLWriter doc(true, out); - XMLOpenElement root(doc, "expr"); - PathSet drvsSeen; - printValueAsXML(state, strict, location, v, doc, context, drvsSeen); -} - - -} diff --git a/src/libexpr/value-to-xml.hh b/src/libexpr/value-to-xml.hh deleted file mode 100644 index 97657327ed..0000000000 --- a/src/libexpr/value-to-xml.hh +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "nixexpr.hh" -#include "eval.hh" - -#include -#include - -namespace nix { - -void printValueAsXML(EvalState & state, bool strict, bool location, - Value & v, std::ostream & out, PathSet & context); - -} diff --git a/src/libexpr/value.hh b/src/libexpr/value.hh deleted file mode 100644 index 2feb2f9492..0000000000 --- a/src/libexpr/value.hh +++ /dev/null @@ -1,162 +0,0 @@ -#pragma once - -#include "symbol-table.hh" - -namespace nix { - - -typedef enum { - tInt = 1, - tBool, - tString, - tPath, - tNull, - tAttrs, - tList, - tThunk, - tApp, - tLambda, - tBlackhole, - tPrimOp, - tPrimOpApp, -} ValueType; - - -class Bindings; -struct Env; -struct Expr; -struct ExprLambda; -struct PrimOp; -struct PrimOp; -class Symbol; - - -typedef long NixInt; - - -struct Value -{ - ValueType type; - union - { - NixInt integer; - bool boolean; - - /* Strings in the evaluator carry a so-called `context' which - is a list of strings representing store paths. This is to - allow users to write things like - - "--with-freetype2-library=" + freetype + "/lib" - - where `freetype' is a derivation (or a source to be copied - to the store). If we just concatenated the strings without - keeping track of the referenced store paths, then if the - string is used as a derivation attribute, the derivation - will not have the correct dependencies in its inputDrvs and - inputSrcs. - - The semantics of the context is as follows: when a string - with context C is used as a derivation attribute, then the - derivations in C will be added to the inputDrvs of the - derivation, and the other store paths in C will be added to - the inputSrcs of the derivations. - - For canonicity, the store paths should be in sorted order. */ - struct { - const char * s; - const char * * context; // must be in sorted order - } string; - - const char * path; - Bindings * attrs; - struct { - unsigned int length; - Value * * elems; - } list; - struct { - Env * env; - Expr * expr; - } thunk; - struct { - Value * left, * right; - } app; - struct { - Env * env; - ExprLambda * fun; - } lambda; - PrimOp * primOp; - struct { - Value * left, * right; - } primOpApp; - }; -}; - - -/* After overwriting an app node, be sure to clear pointers in the - Value to ensure that the target isn't kept alive unnecessarily. */ -static inline void clearValue(Value & v) -{ - v.app.right = 0; -} - - -static inline void mkInt(Value & v, NixInt n) -{ - clearValue(v); - v.type = tInt; - v.integer = n; -} - - -static inline void mkBool(Value & v, bool b) -{ - clearValue(v); - v.type = tBool; - v.boolean = b; -} - - -static inline void mkNull(Value & v) -{ - v.type = tNull; - v.app.left = v.app.right = 00; // scrub -} - - -static inline void mkApp(Value & v, Value & left, Value & right) -{ - v.type = tApp; - v.app.left = &left; - v.app.right = &right; -} - - -static inline void mkStringNoCopy(Value & v, const char * s) -{ - v.type = tString; - v.string.s = s; - v.string.context = 0; -} - - -static inline void mkString(Value & v, const Symbol & s) -{ - mkStringNoCopy(v, ((const string &) s).c_str()); -} - - -void mkString(Value & v, const char * s); - - -static inline void mkPathNoCopy(Value & v, const char * s) -{ - clearValue(v); - v.type = tPath; - v.path = s; -} - - -void mkPath(Value & v, const char * s); - - -} diff --git a/src/libmain/local.mk b/src/libmain/local.mk deleted file mode 100644 index 71a07d1979..0000000000 --- a/src/libmain/local.mk +++ /dev/null @@ -1,11 +0,0 @@ -libraries += libmain - -libmain_NAME = libnixmain - -libmain_DIR := $(d) - -libmain_SOURCES := $(wildcard $(d)/*.cc) - -libmain_LIBS = libstore libutil libformat - -libmain_ALLOW_UNDEFINED = 1 diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc deleted file mode 100644 index a390654452..0000000000 --- a/src/libmain/shared.cc +++ /dev/null @@ -1,300 +0,0 @@ -#include "config.h" - -#include "shared.hh" -#include "globals.hh" -#include "store-api.hh" -#include "util.hh" -#include "misc.hh" - -#include -#include -#include - -#include -#include -#include -#include - - -namespace nix { - - -volatile sig_atomic_t blockInt = 0; - - -static void sigintHandler(int signo) -{ - if (!blockInt) { - _isInterrupted = 1; - blockInt = 1; - } -} - - -static bool gcWarning = true; - -void printGCWarning() -{ - if (!gcWarning) return; - static bool haveWarned = false; - warnOnce(haveWarned, - "you did not specify `--add-root'; " - "the result might be removed by the garbage collector"); -} - - -void printMissing(StoreAPI & store, const PathSet & paths) -{ - unsigned long long downloadSize, narSize; - PathSet willBuild, willSubstitute, unknown; - queryMissing(store, paths, willBuild, willSubstitute, unknown, downloadSize, narSize); - printMissing(willBuild, willSubstitute, unknown, downloadSize, narSize); -} - - -void printMissing(const PathSet & willBuild, - const PathSet & willSubstitute, const PathSet & unknown, - unsigned long long downloadSize, unsigned long long narSize) -{ - if (!willBuild.empty()) { - printMsg(lvlInfo, format("these derivations will be built:")); - foreach (PathSet::iterator, i, willBuild) - printMsg(lvlInfo, format(" %1%") % *i); - } - - if (!willSubstitute.empty()) { - printMsg(lvlInfo, format("these paths will be fetched (%.2f MiB download, %.2f MiB unpacked):") - % (downloadSize / (1024.0 * 1024.0)) - % (narSize / (1024.0 * 1024.0))); - foreach (PathSet::iterator, i, willSubstitute) - printMsg(lvlInfo, format(" %1%") % *i); - } - - if (!unknown.empty()) { - printMsg(lvlInfo, format("don't know how to build these paths%1%:") - % (settings.readOnlyMode ? " (may be caused by read-only store access)" : "")); - foreach (PathSet::iterator, i, unknown) - printMsg(lvlInfo, format(" %1%") % *i); - } -} - - -static void setLogType(string lt) -{ - if (lt == "pretty") logType = ltPretty; - else if (lt == "escapes") logType = ltEscapes; - else if (lt == "flat") logType = ltFlat; - else throw UsageError("unknown log type"); -} - - -string getArg(const string & opt, - Strings::iterator & i, const Strings::iterator & end) -{ - ++i; - if (i == end) throw UsageError(format("`%1%' requires an argument") % opt); - return *i; -} - - -void detectStackOverflow(); - - -/* Initialize and reorder arguments, then call the actual argument - processor. */ -static void initAndRun(int argc, char * * argv) -{ - settings.processEnvironment(); - settings.loadConfFile(); - - /* Catch SIGINT. */ - struct sigaction act; - act.sa_handler = sigintHandler; - sigemptyset(&act.sa_mask); - act.sa_flags = 0; - if (sigaction(SIGINT, &act, 0)) - throw SysError("installing handler for SIGINT"); - if (sigaction(SIGTERM, &act, 0)) - throw SysError("installing handler for SIGTERM"); - if (sigaction(SIGHUP, &act, 0)) - throw SysError("installing handler for SIGHUP"); - - /* Ignore SIGPIPE. */ - act.sa_handler = SIG_IGN; - act.sa_flags = 0; - if (sigaction(SIGPIPE, &act, 0)) - throw SysError("ignoring SIGPIPE"); - - /* Reset SIGCHLD to its default. */ - act.sa_handler = SIG_DFL; - act.sa_flags = 0; - if (sigaction(SIGCHLD, &act, 0)) - throw SysError("resetting SIGCHLD"); - - /* Register a SIGSEGV handler to detect stack overflows. */ - detectStackOverflow(); - - /* There is no privacy in the Nix system ;-) At least not for - now. In particular, store objects should be readable by - everybody. */ - umask(0022); - - /* Initialise the PRNG. */ - struct timeval tv; - gettimeofday(&tv, 0); - srandom(tv.tv_usec); - - /* Process the NIX_LOG_TYPE environment variable. */ - string lt = getEnv("NIX_LOG_TYPE"); - if (lt != "") setLogType(lt); - - /* Put the arguments in a vector. */ - Strings args, remaining; - while (argc--) args.push_back(*argv++); - args.erase(args.begin()); - - /* Expand compound dash options (i.e., `-qlf' -> `-q -l -f'), and - ignore options for the ATerm library. */ - for (Strings::iterator i = args.begin(); i != args.end(); ++i) { - string arg = *i; - if (arg.length() > 2 && arg[0] == '-' && arg[1] != '-' && !isdigit(arg[1])) { - for (unsigned int j = 1; j < arg.length(); j++) - if (isalpha(arg[j])) - remaining.push_back((string) "-" + arg[j]); - else { - remaining.push_back(string(arg, j)); - break; - } - } else remaining.push_back(arg); - } - args = remaining; - remaining.clear(); - - /* Process default options. */ - for (Strings::iterator i = args.begin(); i != args.end(); ++i) { - string arg = *i; - if (arg == "--verbose" || arg == "-v") verbosity = (Verbosity) (verbosity + 1); - else if (arg == "--quiet") verbosity = verbosity > lvlError ? (Verbosity) (verbosity - 1) : lvlError; - else if (arg == "--log-type") { - string s = getArg(arg, i, args.end()); - setLogType(s); - } - else if (arg == "--no-build-output" || arg == "-Q") - settings.buildVerbosity = lvlVomit; - else if (arg == "--print-build-trace") - settings.printBuildTrace = true; - else if (arg == "--help") { - printHelp(); - return; - } - else if (arg == "--version") { - std::cout << format("%1% (Nix) %2%") % programId % nixVersion << std::endl; - return; - } - else if (arg == "--keep-failed" || arg == "-K") - settings.keepFailed = true; - else if (arg == "--keep-going" || arg == "-k") - settings.keepGoing = true; - else if (arg == "--fallback") - settings.set("build-fallback", "true"); - else if (arg == "--max-jobs" || arg == "-j") - settings.set("build-max-jobs", getArg(arg, i, args.end())); - else if (arg == "--cores") - settings.set("build-cores", getArg(arg, i, args.end())); - else if (arg == "--readonly-mode") - settings.readOnlyMode = true; - else if (arg == "--max-silent-time") - settings.set("build-max-silent-time", getArg(arg, i, args.end())); - else if (arg == "--timeout") - settings.set("build-timeout", getArg(arg, i, args.end())); - else if (arg == "--no-build-hook") - settings.useBuildHook = false; - else if (arg == "--show-trace") - settings.showTrace = true; - else if (arg == "--no-gc-warning") - gcWarning = false; - else if (arg == "--option") { - ++i; if (i == args.end()) throw UsageError("`--option' requires two arguments"); - string name = *i; - ++i; if (i == args.end()) throw UsageError("`--option' requires two arguments"); - string value = *i; - settings.set(name, value); - } - else remaining.push_back(arg); - } - - if (char *pack = getenv("_NIX_OPTIONS")) - settings.unpack(pack); - - settings.update(); - - run(remaining); - - /* Close the Nix database. */ - store.reset((StoreAPI *) 0); -} - - -void showManPage(const string & name) -{ - string cmd = "man " + name; - if (system(cmd.c_str()) != 0) - throw Error(format("command `%1%' failed") % cmd); -} - - -int exitCode = 0; -char * * argvSaved = 0; - -} - - -static char buf[1024]; - -int main(int argc, char * * argv) -{ - using namespace nix; - - argvSaved = argv; - - /* Turn on buffering for cerr. */ -#if HAVE_PUBSETBUF - std::cerr.rdbuf()->pubsetbuf(buf, sizeof(buf)); -#endif - - std::ios::sync_with_stdio(false); - - try { - try { - initAndRun(argc, argv); - } catch (...) { - /* Subtle: we have to make sure that any `interrupted' - condition is discharged before we reach printMsg() - below, since otherwise it will throw an (uncaught) - exception. */ - blockInt = 1; /* ignore further SIGINTs */ - _isInterrupted = 0; - throw; - } - } catch (UsageError & e) { - printMsg(lvlError, - format( - "error: %1%\n" - "Try `%2% --help' for more information.") - % e.what() % programId); - return 1; - } catch (BaseError & e) { - printMsg(lvlError, format("error: %1%%2%") % (settings.showTrace ? e.prefix() : "") % e.msg()); - if (e.prefix() != "" && !settings.showTrace) - printMsg(lvlError, "(use `--show-trace' to show detailed location information)"); - return e.status; - } catch (std::bad_alloc & e) { - printMsg(lvlError, "error: out of memory"); - return 1; - } catch (std::exception & e) { - printMsg(lvlError, format("error: %1%") % e.what()); - return 1; - } - - return exitCode; -} diff --git a/src/libmain/shared.hh b/src/libmain/shared.hh deleted file mode 100644 index b29b08bb59..0000000000 --- a/src/libmain/shared.hh +++ /dev/null @@ -1,73 +0,0 @@ -#pragma once - -#include "util.hh" - -#include - -#include - - -/* These are not implemented here, but must be implemented by a - program linking against libmain. */ - -/* Main program. Called by main() after the ATerm library has been - initialised and some default arguments have been processed (and - removed from `args'). main() will catch all exceptions. */ -void run(nix::Strings args); - -/* Should print a help message to stdout and return. */ -void printHelp(); - -extern std::string programId; - - -namespace nix { - -MakeError(UsageError, nix::Error); - -class StoreAPI; - -/* Ugh. No better place to put this. */ -void printGCWarning(); - -void printMissing(StoreAPI & store, const PathSet & paths); - -void printMissing(const PathSet & willBuild, - const PathSet & willSubstitute, const PathSet & unknown, - unsigned long long downloadSize, unsigned long long narSize); - -template N getIntArg(const string & opt, - Strings::iterator & i, const Strings::iterator & end, bool allowUnit) -{ - ++i; - if (i == end) throw UsageError(format("`%1%' requires an argument") % opt); - string s = *i; - N multiplier = 1; - if (allowUnit && !s.empty()) { - char u = std::toupper(*s.rbegin()); - if (std::isalpha(u)) { - if (u == 'K') multiplier = 1ULL << 10; - else if (u == 'M') multiplier = 1ULL << 20; - else if (u == 'G') multiplier = 1ULL << 30; - else if (u == 'T') multiplier = 1ULL << 40; - else throw UsageError(format("invalid unit specifier `%1%'") % u); - s.resize(s.size() - 1); - } - } - N n; - if (!string2Int(s, n)) - throw UsageError(format("`%1%' requires an integer argument") % opt); - return n * multiplier; -} - -/* Show the manual page for the specified program. */ -void showManPage(const string & name); - -extern volatile ::sig_atomic_t blockInt; - -/* Exit code of the program. */ -extern int exitCode; - -extern char * * argvSaved; - -} diff --git a/src/libmain/stack.cc b/src/libmain/stack.cc deleted file mode 100644 index 64df95547e..0000000000 --- a/src/libmain/stack.cc +++ /dev/null @@ -1,72 +0,0 @@ -#include "config.h" - -#include "types.hh" - -#include -#include -#include - -#include -#include - -namespace nix { - - -static void sigsegvHandler(int signo, siginfo_t * info, void * ctx) -{ - /* Detect stack overflows by comparing the faulting address with - the stack pointer. Unfortunately, getting the stack pointer is - not portable. */ - bool haveSP = true; - char * sp; -#if defined(__x86_64__) && defined(REG_RSP) - sp = (char *) ((ucontext *) ctx)->uc_mcontext.gregs[REG_RSP]; -#elif defined(REG_ESP) - sp = (char *) ((ucontext *) ctx)->uc_mcontext.gregs[REG_ESP]; -#else - haveSP = false; -#endif - - if (haveSP) { - ptrdiff_t diff = (char *) info->si_addr - sp; - if (diff < 0) diff = -diff; - if (diff < 4096) { - char msg[] = "error: stack overflow (possible infinite recursion)\n"; - write(2, msg, strlen(msg)); - _exit(1); // maybe abort instead? - } - } - - /* Restore default behaviour (i.e. segfault and dump core). */ - struct sigaction act; - sigfillset(&act.sa_mask); - act.sa_handler = SIG_DFL; - act.sa_flags = 0; - if (sigaction(SIGSEGV, &act, 0)) abort(); -} - - -void detectStackOverflow() -{ -#if defined(SA_SIGINFO) && defined (SA_ONSTACK) - /* Install a SIGSEGV handler to detect stack overflows. This - requires an alternative stack, otherwise the signal cannot be - delivered when we're out of stack space. */ - stack_t stack; - stack.ss_size = 4096 * 4 + MINSIGSTKSZ; - stack.ss_sp = new char[stack.ss_size]; - if (!stack.ss_sp) throw Error("cannot allocate alternative stack"); - stack.ss_flags = 0; - if (sigaltstack(&stack, 0) == -1) throw SysError("cannot set alternative stack"); - - struct sigaction act; - sigfillset(&act.sa_mask); - act.sa_sigaction = sigsegvHandler; - act.sa_flags = SA_SIGINFO | SA_ONSTACK; - if (sigaction(SIGSEGV, &act, 0)) - throw SysError("resetting SIGCHLD"); -#endif -} - - -} diff --git a/src/libstore/local.mk b/src/libstore/local.mk deleted file mode 100644 index 2dddce740d..0000000000 --- a/src/libstore/local.mk +++ /dev/null @@ -1,28 +0,0 @@ -libraries += libstore - -libstore_NAME = libnixstore - -libstore_DIR := $(d) - -libstore_SOURCES := $(wildcard $(d)/*.cc) - -libstore_LIBS = libutil libformat - -libstore_LDFLAGS = -lsqlite3 -lbz2 - -libstore_CXXFLAGS = \ - -DNIX_STORE_DIR=\"$(storedir)\" \ - -DNIX_DATA_DIR=\"$(datadir)\" \ - -DNIX_STATE_DIR=\"$(localstatedir)/nix\" \ - -DNIX_LOG_DIR=\"$(localstatedir)/log/nix\" \ - -DNIX_CONF_DIR=\"$(sysconfdir)/nix\" \ - -DNIX_LIBEXEC_DIR=\"$(libexecdir)\" \ - -DNIX_BIN_DIR=\"$(bindir)\" \ - -DPACKAGE_VERSION=\"$(PACKAGE_VERSION)\" - -$(d)/local-store.cc: $(d)/schema.sql.hh - -%.sql.hh: %.sql - $(trace-gen) sed -e 's/"/\\"/g' -e 's/\(.*\)/"\1\\n"/' < $< > $@ || (rm $@ && exit 1) - -clean-files += $(d)/schema.sql.hh diff --git a/src/libutil/local.mk b/src/libutil/local.mk deleted file mode 100644 index 8af2e78d9c..0000000000 --- a/src/libutil/local.mk +++ /dev/null @@ -1,15 +0,0 @@ -libraries += libutil - -libutil_NAME = libnixutil - -libutil_DIR := $(d) - -libutil_SOURCES := $(wildcard $(d)/*.cc) - -ifeq ($(HAVE_OPENSSL), 1) - libutil_LDFLAGS = $(OPENSSL_LIBS) -else - libutil_SOURCES += $(d)/md5.c $(d)/sha1.c $(d)/sha256.c -endif - -libutil_LIBS = libformat diff --git a/src/nix-daemon/local.mk b/src/nix-daemon/local.mk deleted file mode 100644 index db071a3f7c..0000000000 --- a/src/nix-daemon/local.mk +++ /dev/null @@ -1,9 +0,0 @@ -programs += nix-daemon - -nix-daemon_DIR := $(d) - -nix-daemon_SOURCES := $(d)/nix-daemon.cc - -nix-daemon_LIBS = libmain libstore libutil libformat - -$(eval $(call install-symlink, nix-daemon, $(bindir)/nix-worker)) diff --git a/src/nix-env/local.mk b/src/nix-env/local.mk deleted file mode 100644 index e80719cd76..0000000000 --- a/src/nix-env/local.mk +++ /dev/null @@ -1,7 +0,0 @@ -programs += nix-env - -nix-env_DIR := $(d) - -nix-env_SOURCES := $(wildcard $(d)/*.cc) - -nix-env_LIBS = libexpr libmain libstore libutil libformat diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc deleted file mode 100644 index 8a80526347..0000000000 --- a/src/nix-env/nix-env.cc +++ /dev/null @@ -1,1441 +0,0 @@ -#include "profiles.hh" -#include "names.hh" -#include "globals.hh" -#include "misc.hh" -#include "shared.hh" -#include "eval.hh" -#include "get-drvs.hh" -#include "attr-path.hh" -#include "common-opts.hh" -#include "xml-writer.hh" -#include "store-api.hh" -#include "user-env.hh" -#include "util.hh" -#include "value-to-json.hh" - -#include -#include -#include -#include -#include - -#include -#include -#include - - -using namespace nix; -using std::cout; - - -typedef enum { - srcNixExprDrvs, - srcNixExprs, - srcStorePaths, - srcProfile, - srcAttrPath, - srcUnknown -} InstallSourceType; - - -struct InstallSourceInfo -{ - InstallSourceType type; - Path nixExprPath; /* for srcNixExprDrvs, srcNixExprs */ - Path profile; /* for srcProfile */ - string systemFilter; /* for srcNixExprDrvs */ - Bindings autoArgs; -}; - - -struct Globals -{ - InstallSourceInfo instSource; - Path profile; - EvalState state; - bool dryRun; - bool preserveInstalled; - bool removeAll; - string forceName; - bool prebuiltOnly; -}; - - -typedef void (* Operation) (Globals & globals, - Strings args, Strings opFlags, Strings opArgs); - - -void printHelp() -{ - showManPage("nix-env"); -} - - -static string needArg(Strings::iterator & i, - Strings & args, const string & arg) -{ - if (i == args.end()) throw UsageError( - format("`%1%' requires an argument") % arg); - return *i++; -} - - -static bool parseInstallSourceOptions(Globals & globals, - Strings::iterator & i, Strings & args, const string & arg) -{ - if (arg == "--from-expression" || arg == "-E") - globals.instSource.type = srcNixExprs; - else if (arg == "--from-profile") { - globals.instSource.type = srcProfile; - globals.instSource.profile = needArg(i, args, arg); - } - else if (arg == "--attr" || arg == "-A") - globals.instSource.type = srcAttrPath; - else return false; - return true; -} - - -static bool isNixExpr(const Path & path, struct stat & st) -{ - return S_ISREG(st.st_mode) || (S_ISDIR(st.st_mode) && pathExists(path + "/default.nix")); -} - - -static void getAllExprs(EvalState & state, - const Path & path, StringSet & attrs, Value & v) -{ - Strings names = readDirectory(path); - StringSet namesSorted(names.begin(), names.end()); - - foreach (StringSet::iterator, i, namesSorted) { - /* Ignore the manifest.nix used by profiles. This is - necessary to prevent it from showing up in channels (which - are implemented using profiles). */ - if (*i == "manifest.nix") continue; - - Path path2 = path + "/" + *i; - - struct stat st; - if (stat(path2.c_str(), &st) == -1) - continue; // ignore dangling symlinks in ~/.nix-defexpr - - if (isNixExpr(path2, st) && (!S_ISREG(st.st_mode) || hasSuffix(path2, ".nix"))) { - /* Strip off the `.nix' filename suffix (if applicable), - otherwise the attribute cannot be selected with the - `-A' option. Useful if you want to stick a Nix - expression directly in ~/.nix-defexpr. */ - string attrName = *i; - if (hasSuffix(attrName, ".nix")) - attrName = string(attrName, 0, attrName.size() - 4); - if (attrs.find(attrName) != attrs.end()) { - printMsg(lvlError, format("warning: name collision in input Nix expressions, skipping `%1%'") % path2); - continue; - } - attrs.insert(attrName); - /* Load the expression on demand. */ - Value & vFun(*state.allocValue()); - Value & vArg(*state.allocValue()); - state.getBuiltin("import", vFun); - mkString(vArg, path2); - mkApp(*state.allocAttr(v, state.symbols.create(attrName)), vFun, vArg); - } - else if (S_ISDIR(st.st_mode)) - /* `path2' is a directory (with no default.nix in it); - recurse into it. */ - getAllExprs(state, path2, attrs, v); - } -} - - -static void loadSourceExpr(EvalState & state, const Path & path, Value & v) -{ - struct stat st; - if (stat(path.c_str(), &st) == -1) - throw SysError(format("getting information about `%1%'") % path); - - if (isNixExpr(path, st)) { - state.evalFile(path, v); - return; - } - - /* The path is a directory. Put the Nix expressions in the - directory in a set, with the file name of each expression as - the attribute name. Recurse into subdirectories (but keep the - set flat, not nested, to make it easier for a user to have a - ~/.nix-defexpr directory that includes some system-wide - directory). */ - if (S_ISDIR(st.st_mode)) { - state.mkAttrs(v, 16); - state.mkList(*state.allocAttr(v, state.symbols.create("_combineChannels")), 0); - StringSet attrs; - getAllExprs(state, path, attrs, v); - v.attrs->sort(); - } -} - - -static void loadDerivations(EvalState & state, Path nixExprPath, - string systemFilter, Bindings & autoArgs, - const string & pathPrefix, DrvInfos & elems) -{ - Value vRoot; - loadSourceExpr(state, nixExprPath, vRoot); - - Value & v(*findAlongAttrPath(state, pathPrefix, autoArgs, vRoot)); - - getDerivations(state, v, pathPrefix, autoArgs, elems, true); - - /* Filter out all derivations not applicable to the current - system. */ - for (DrvInfos::iterator i = elems.begin(), j; i != elems.end(); i = j) { - j = i; j++; - if (systemFilter != "*" && i->system != systemFilter) - elems.erase(i); - } -} - - -static Path getHomeDir() -{ - Path homeDir(getEnv("HOME", "")); - if (homeDir == "") throw Error("HOME environment variable not set"); - return homeDir; -} - - -static Path getDefNixExprPath() -{ - return getHomeDir() + "/.nix-defexpr"; -} - - -static int getPriority(EvalState & state, DrvInfo & drv) -{ - return drv.queryMetaInt("priority", 0); -} - - -static int comparePriorities(EvalState & state, DrvInfo & drv1, DrvInfo & drv2) -{ - return getPriority(state, drv2) - getPriority(state, drv1); -} - - -// FIXME: this function is rather slow since it checks a single path -// at a time. -static bool isPrebuilt(EvalState & state, DrvInfo & elem) -{ - Path path = elem.queryOutPath(); - if (store->isValidPath(path)) return true; - PathSet ps = store->querySubstitutablePaths(singleton(path)); - return ps.find(path) != ps.end(); -} - - -static void checkSelectorUse(DrvNames & selectors) -{ - /* Check that all selectors have been used. */ - foreach (DrvNames::iterator, i, selectors) - if (i->hits == 0 && i->fullName != "*") - throw Error(format("selector `%1%' matches no derivations") % i->fullName); -} - - -static DrvInfos filterBySelector(EvalState & state, const DrvInfos & allElems, - const Strings & args, bool newestOnly) -{ - DrvNames selectors = drvNamesFromArgs(args); - if (selectors.empty()) - selectors.push_back(DrvName("*")); - - DrvInfos elems; - set done; - - foreach (DrvNames::iterator, i, selectors) { - typedef list > Matches; - Matches matches; - unsigned int n = 0; - for (DrvInfos::const_iterator j = allElems.begin(); - j != allElems.end(); ++j, ++n) - { - DrvName drvName(j->name); - if (i->matches(drvName)) { - i->hits++; - matches.push_back(std::pair(*j, n)); - } - } - - /* If `newestOnly', if a selector matches multiple derivations - with the same name, pick the one matching the current - system. If there are still multiple derivations, pick the - one with the highest priority. If there are still multiple - derivations, pick the one with the highest version. - Finally, if there are still multiple derivations, - arbitrarily pick the first one. */ - if (newestOnly) { - - /* Map from package names to derivations. */ - typedef map > Newest; - Newest newest; - StringSet multiple; - - for (Matches::iterator j = matches.begin(); j != matches.end(); ++j) { - DrvName drvName(j->first.name); - int d = 1; - - Newest::iterator k = newest.find(drvName.name); - - if (k != newest.end()) { - d = j->first.system == k->second.first.system ? 0 : - j->first.system == settings.thisSystem ? 1 : - k->second.first.system == settings.thisSystem ? -1 : 0; - if (d == 0) - d = comparePriorities(state, j->first, k->second.first); - if (d == 0) - d = compareVersions(drvName.version, DrvName(k->second.first.name).version); - } - - if (d > 0) { - newest.erase(drvName.name); - newest.insert(Newest::value_type(drvName.name, *j)); - multiple.erase(j->first.name); - } else if (d == 0) { - multiple.insert(j->first.name); - } - } - - matches.clear(); - for (Newest::iterator j = newest.begin(); j != newest.end(); ++j) { - if (multiple.find(j->second.first.name) != multiple.end()) - printMsg(lvlInfo, - format("warning: there are multiple derivations named `%1%'; using the first one") - % j->second.first.name); - matches.push_back(j->second); - } - } - - /* Insert only those elements in the final list that we - haven't inserted before. */ - for (Matches::iterator j = matches.begin(); j != matches.end(); ++j) - if (done.find(j->second) == done.end()) { - done.insert(j->second); - elems.push_back(j->first); - } - } - - checkSelectorUse(selectors); - - return elems; -} - - -static bool isPath(const string & s) -{ - return s.find('/') != string::npos; -} - - -static void queryInstSources(EvalState & state, - InstallSourceInfo & instSource, const Strings & args, - DrvInfos & elems, bool newestOnly) -{ - InstallSourceType type = instSource.type; - if (type == srcUnknown && args.size() > 0 && isPath(args.front())) - type = srcStorePaths; - - switch (type) { - - /* Get the available user environment elements from the - derivations specified in a Nix expression, including only - those with names matching any of the names in `args'. */ - case srcUnknown: - case srcNixExprDrvs: { - - /* Load the derivations from the (default or specified) - Nix expression. */ - DrvInfos allElems; - loadDerivations(state, instSource.nixExprPath, - instSource.systemFilter, instSource.autoArgs, "", allElems); - - elems = filterBySelector(state, allElems, args, newestOnly); - - break; - } - - /* Get the available user environment elements from the Nix - expressions specified on the command line; these should be - functions that take the default Nix expression file as - argument, e.g., if the file is `./foo.nix', then the - argument `x: x.bar' is equivalent to `(x: x.bar) - (import ./foo.nix)' = `(import ./foo.nix).bar'. */ - case srcNixExprs: { - - Value vArg; - loadSourceExpr(state, instSource.nixExprPath, vArg); - - foreach (Strings::const_iterator, i, args) { - Expr * eFun = state.parseExprFromString(*i, absPath(".")); - Value vFun, vTmp; - state.eval(eFun, vFun); - mkApp(vTmp, vFun, vArg); - getDerivations(state, vTmp, "", instSource.autoArgs, elems, true); - } - - break; - } - - /* The available user environment elements are specified as a - list of store paths (which may or may not be - derivations). */ - case srcStorePaths: { - - foreach (Strings::const_iterator, i, args) { - Path path = followLinksToStorePath(*i); - - string name = baseNameOf(path); - string::size_type dash = name.find('-'); - if (dash != string::npos) - name = string(name, dash + 1); - - DrvInfo elem(state, name, "", "", 0); - - if (isDerivation(path)) { - elem.setDrvPath(path); - elem.setOutPath(findOutput(derivationFromPath(*store, path), "out")); - if (name.size() >= drvExtension.size() && - string(name, name.size() - drvExtension.size()) == drvExtension) - name = string(name, 0, name.size() - drvExtension.size()); - } - else elem.setOutPath(path); - - elems.push_back(elem); - } - - break; - } - - /* Get the available user environment elements from another - user environment. These are then filtered as in the - `srcNixExprDrvs' case. */ - case srcProfile: { - elems = filterBySelector(state, - queryInstalled(state, instSource.profile), - args, newestOnly); - break; - } - - case srcAttrPath: { - Value vRoot; - loadSourceExpr(state, instSource.nixExprPath, vRoot); - foreach (Strings::const_iterator, i, args) { - Value & v(*findAlongAttrPath(state, *i, instSource.autoArgs, vRoot)); - getDerivations(state, v, "", instSource.autoArgs, elems, true); - } - break; - } - } -} - - -static void printMissing(EvalState & state, DrvInfos & elems) -{ - PathSet targets; - foreach (DrvInfos::iterator, i, elems) { - Path drvPath = i->queryDrvPath(); - if (drvPath != "") - targets.insert(drvPath); - else - targets.insert(i->queryOutPath()); - } - - printMissing(*store, targets); -} - - -static bool keep(DrvInfo & drv) -{ - return drv.queryMetaBool("keep", false); -} - - -static void installDerivations(Globals & globals, - const Strings & args, const Path & profile) -{ - debug(format("installing derivations")); - - /* Get the set of user environment elements to be installed. */ - DrvInfos newElems, newElemsTmp; - queryInstSources(globals.state, globals.instSource, args, newElemsTmp, true); - - /* If --prebuilt-only is given, filter out source-only packages. */ - foreach (DrvInfos::iterator, i, newElemsTmp) - if (!globals.prebuiltOnly || isPrebuilt(globals.state, *i)) - newElems.push_back(*i); - - StringSet newNames; - for (DrvInfos::iterator i = newElems.begin(); i != newElems.end(); ++i) { - /* `forceName' is a hack to get package names right in some - one-click installs, namely those where the name used in the - path is not the one we want (e.g., `java-front' versus - `java-front-0.9pre15899'). */ - if (globals.forceName != "") - i->name = globals.forceName; - newNames.insert(DrvName(i->name).name); - } - - - while (true) { - string lockToken = optimisticLockProfile(profile); - - DrvInfos allElems(newElems); - - /* Add in the already installed derivations, unless they have - the same name as a to-be-installed element. */ - if (!globals.removeAll) { - DrvInfos installedElems = queryInstalled(globals.state, profile); - - foreach (DrvInfos::iterator, i, installedElems) { - DrvName drvName(i->name); - if (!globals.preserveInstalled && - newNames.find(drvName.name) != newNames.end() && - !keep(*i)) - printMsg(lvlInfo, format("replacing old `%1%'") % i->name); - else - allElems.push_back(*i); - } - - foreach (DrvInfos::iterator, i, newElems) - printMsg(lvlInfo, format("installing `%1%'") % i->name); - } - - printMissing(globals.state, newElems); - - if (globals.dryRun) return; - - if (createUserEnv(globals.state, allElems, - profile, settings.envKeepDerivations, lockToken)) break; - } -} - - -static void opInstall(Globals & globals, - Strings args, Strings opFlags, Strings opArgs) -{ - for (Strings::iterator i = opFlags.begin(); i != opFlags.end(); ) { - string arg = *i++; - if (parseInstallSourceOptions(globals, i, opFlags, arg)) ; - else if (arg == "--preserve-installed" || arg == "-P") - globals.preserveInstalled = true; - else if (arg == "--remove-all" || arg == "-r") - globals.removeAll = true; - else throw UsageError(format("unknown flag `%1%'") % arg); - } - - installDerivations(globals, opArgs, globals.profile); -} - - -typedef enum { utLt, utLeq, utEq, utAlways } UpgradeType; - - -static void upgradeDerivations(Globals & globals, - const Strings & args, UpgradeType upgradeType) -{ - debug(format("upgrading derivations")); - - /* Upgrade works as follows: we take all currently installed - derivations, and for any derivation matching any selector, look - for a derivation in the input Nix expression that has the same - name and a higher version number. */ - - while (true) { - string lockToken = optimisticLockProfile(globals.profile); - - DrvInfos installedElems = queryInstalled(globals.state, globals.profile); - - /* Fetch all derivations from the input file. */ - DrvInfos availElems; - queryInstSources(globals.state, globals.instSource, args, availElems, false); - - /* Go through all installed derivations. */ - DrvInfos newElems; - foreach (DrvInfos::iterator, i, installedElems) { - DrvName drvName(i->name); - - try { - - if (keep(*i)) { - newElems.push_back(*i); - continue; - } - - /* Find the derivation in the input Nix expression - with the same name that satisfies the version - constraints specified by upgradeType. If there are - multiple matches, take the one with the highest - priority. If there are still multiple matches, - take the one with the highest version. */ - DrvInfos::iterator bestElem = availElems.end(); - DrvName bestName; - foreach (DrvInfos::iterator, j, availElems) { - DrvName newName(j->name); - if (newName.name == drvName.name) { - int d = comparePriorities(globals.state, *i, *j); - if (d == 0) d = compareVersions(drvName.version, newName.version); - if ((upgradeType == utLt && d < 0) || - (upgradeType == utLeq && d <= 0) || - (upgradeType == utEq && d == 0) || - upgradeType == utAlways) - { - int d2 = -1; - if (bestElem != availElems.end()) { - d2 = comparePriorities(globals.state, *bestElem, *j); - if (d2 == 0) d2 = compareVersions(bestName.version, newName.version); - } - if (d2 < 0 && (!globals.prebuiltOnly || isPrebuilt(globals.state, *j))) { - bestElem = j; - bestName = newName; - } - } - } - } - - if (bestElem != availElems.end() && - i->queryOutPath() != - bestElem->queryOutPath()) - { - printMsg(lvlInfo, - format("upgrading `%1%' to `%2%'") - % i->name % bestElem->name); - newElems.push_back(*bestElem); - } else newElems.push_back(*i); - - } catch (Error & e) { - e.addPrefix(format("while trying to find an upgrade for `%1%':\n") % i->name); - throw; - } - } - - printMissing(globals.state, newElems); - - if (globals.dryRun) return; - - if (createUserEnv(globals.state, newElems, - globals.profile, settings.envKeepDerivations, lockToken)) break; - } -} - - -static void opUpgrade(Globals & globals, - Strings args, Strings opFlags, Strings opArgs) -{ - UpgradeType upgradeType = utLt; - for (Strings::iterator i = opFlags.begin(); i != opFlags.end(); ) { - string arg = *i++; - if (parseInstallSourceOptions(globals, i, opFlags, arg)) ; - else if (arg == "--lt") upgradeType = utLt; - else if (arg == "--leq") upgradeType = utLeq; - else if (arg == "--eq") upgradeType = utEq; - else if (arg == "--always") upgradeType = utAlways; - else throw UsageError(format("unknown flag `%1%'") % arg); - } - - upgradeDerivations(globals, opArgs, upgradeType); -} - - -static void setMetaFlag(EvalState & state, DrvInfo & drv, - const string & name, const string & value) -{ - Value * v = state.allocValue(); - mkString(*v, value.c_str()); - drv.setMeta(name, v); -} - - -static void opSetFlag(Globals & globals, - Strings args, Strings opFlags, Strings opArgs) -{ - if (opFlags.size() > 0) - throw UsageError(format("unknown flag `%1%'") % opFlags.front()); - if (opArgs.size() < 2) - throw UsageError("not enough arguments to `--set-flag'"); - - Strings::iterator arg = opArgs.begin(); - string flagName = *arg++; - string flagValue = *arg++; - DrvNames selectors = drvNamesFromArgs(Strings(arg, opArgs.end())); - - while (true) { - string lockToken = optimisticLockProfile(globals.profile); - - DrvInfos installedElems = queryInstalled(globals.state, globals.profile); - - /* Update all matching derivations. */ - foreach (DrvInfos::iterator, i, installedElems) { - DrvName drvName(i->name); - foreach (DrvNames::iterator, j, selectors) - if (j->matches(drvName)) { - printMsg(lvlInfo, format("setting flag on `%1%'") % i->name); - j->hits++; - setMetaFlag(globals.state, *i, flagName, flagValue); - break; - } - } - - checkSelectorUse(selectors); - - /* Write the new user environment. */ - if (createUserEnv(globals.state, installedElems, - globals.profile, settings.envKeepDerivations, lockToken)) break; - } -} - - -static void opSet(Globals & globals, - Strings args, Strings opFlags, Strings opArgs) -{ - for (Strings::iterator i = opFlags.begin(); i != opFlags.end(); ) { - string arg = *i++; - if (parseInstallSourceOptions(globals, i, opFlags, arg)) ; - else throw UsageError(format("unknown flag `%1%'") % arg); - } - - DrvInfos elems; - queryInstSources(globals.state, globals.instSource, opArgs, elems, true); - - if (elems.size() != 1) - throw Error("--set requires exactly one derivation"); - - DrvInfo & drv(elems.front()); - - if (drv.queryDrvPath() != "") { - PathSet paths = singleton(drv.queryDrvPath()); - printMissing(*store, paths); - if (globals.dryRun) return; - store->buildPaths(paths, globals.state.repair ? bmRepair : bmNormal); - } - else { - printMissing(*store, singleton(drv.queryOutPath())); - if (globals.dryRun) return; - store->ensurePath(drv.queryOutPath()); - } - - debug(format("switching to new user environment")); - Path generation = createGeneration(globals.profile, drv.queryOutPath()); - switchLink(globals.profile, generation); -} - - -static void uninstallDerivations(Globals & globals, Strings & selectors, - Path & profile) -{ - while (true) { - string lockToken = optimisticLockProfile(profile); - - DrvInfos installedElems = queryInstalled(globals.state, profile); - DrvInfos newElems; - - foreach (DrvInfos::iterator, i, installedElems) { - DrvName drvName(i->name); - bool found = false; - foreach (Strings::iterator, j, selectors) - /* !!! the repeated calls to followLinksToStorePath() - are expensive, should pre-compute them. */ - if ((isPath(*j) && i->queryOutPath() == followLinksToStorePath(*j)) - || DrvName(*j).matches(drvName)) - { - printMsg(lvlInfo, format("uninstalling `%1%'") % i->name); - found = true; - break; - } - if (!found) newElems.push_back(*i); - } - - if (globals.dryRun) return; - - if (createUserEnv(globals.state, newElems, - profile, settings.envKeepDerivations, lockToken)) break; - } -} - - -static void opUninstall(Globals & globals, - Strings args, Strings opFlags, Strings opArgs) -{ - if (opFlags.size() > 0) - throw UsageError(format("unknown flag `%1%'") % opFlags.front()); - uninstallDerivations(globals, opArgs, globals.profile); -} - - -static bool cmpChars(char a, char b) -{ - return toupper(a) < toupper(b); -} - - -static bool cmpElemByName(const DrvInfo & a, const DrvInfo & b) -{ - return lexicographical_compare( - a.name.begin(), a.name.end(), - b.name.begin(), b.name.end(), cmpChars); -} - - -typedef list Table; - - -void printTable(Table & table) -{ - unsigned int nrColumns = table.size() > 0 ? table.front().size() : 0; - - vector widths; - widths.resize(nrColumns); - - foreach (Table::iterator, i, table) { - assert(i->size() == nrColumns); - Strings::iterator j; - unsigned int column; - for (j = i->begin(), column = 0; j != i->end(); ++j, ++column) - if (j->size() > widths[column]) widths[column] = j->size(); - } - - foreach (Table::iterator, i, table) { - Strings::iterator j; - unsigned int column; - for (j = i->begin(), column = 0; j != i->end(); ++j, ++column) { - string s = *j; - replace(s.begin(), s.end(), '\n', ' '); - cout << s; - if (column < nrColumns - 1) - cout << string(widths[column] - s.size() + 2, ' '); - } - cout << std::endl; - } -} - - -/* This function compares the version of an element against the - versions in the given set of elements. `cvLess' means that only - lower versions are in the set, `cvEqual' means that at most an - equal version is in the set, and `cvGreater' means that there is at - least one element with a higher version in the set. `cvUnavail' - means that there are no elements with the same name in the set. */ - -typedef enum { cvLess, cvEqual, cvGreater, cvUnavail } VersionDiff; - -static VersionDiff compareVersionAgainstSet( - const DrvInfo & elem, const DrvInfos & elems, string & version) -{ - DrvName name(elem.name); - - VersionDiff diff = cvUnavail; - version = "?"; - - for (DrvInfos::const_iterator i = elems.begin(); i != elems.end(); ++i) { - DrvName name2(i->name); - if (name.name == name2.name) { - int d = compareVersions(name.version, name2.version); - if (d < 0) { - diff = cvGreater; - version = name2.version; - } - else if (diff != cvGreater && d == 0) { - diff = cvEqual; - version = name2.version; - } - else if (diff != cvGreater && diff != cvEqual && d > 0) { - diff = cvLess; - if (version == "" || compareVersions(version, name2.version) < 0) - version = name2.version; - } - } - } - - return diff; -} - - -static string colorString(const string & s) -{ - if (!isatty(STDOUT_FILENO)) return s; - return "\e[1;31m" + s + "\e[0m"; -} - - -static void queryJSON(Globals & globals, vector & elems) -{ - JSONObject topObj(cout); - foreach (vector::iterator, i, elems) { - topObj.attr(i->attrPath); - JSONObject pkgObj(cout); - - pkgObj.attr("name", i->name); - pkgObj.attr("system", i->system); - - pkgObj.attr("meta"); - JSONObject metaObj(cout); - StringSet metaNames = i->queryMetaNames(); - foreach (StringSet::iterator, j, metaNames) { - metaObj.attr(*j); - Value * v = i->queryMeta(*j); - if (!v) - printMsg(lvlError, format("derivation `%1%' has invalid meta attribute `%2%'") % i->name % *j); - else { - PathSet context; - printValueAsJSON(globals.state, true, *v, cout, context); - } - } - } -} - - -static void opQuery(Globals & globals, - Strings args, Strings opFlags, Strings opArgs) -{ - Strings remaining; - string attrPath; - - bool printStatus = false; - bool printName = true; - bool printAttrPath = false; - bool printSystem = false; - bool printDrvPath = false; - bool printOutPath = false; - bool printDescription = false; - bool printMeta = false; - bool compareVersions = false; - bool xmlOutput = false; - bool jsonOutput = false; - - enum { sInstalled, sAvailable } source = sInstalled; - - settings.readOnlyMode = true; /* makes evaluation a bit faster */ - - for (Strings::iterator i = args.begin(); i != args.end(); ) { - string arg = *i++; - if (arg == "--status" || arg == "-s") printStatus = true; - else if (arg == "--no-name") printName = false; - else if (arg == "--system") printSystem = true; - else if (arg == "--description") printDescription = true; - else if (arg == "--compare-versions" || arg == "-c") compareVersions = true; - else if (arg == "--drv-path") printDrvPath = true; - else if (arg == "--out-path") printOutPath = true; - else if (arg == "--meta") printMeta = true; - else if (arg == "--installed") source = sInstalled; - else if (arg == "--available" || arg == "-a") source = sAvailable; - else if (arg == "--xml") xmlOutput = true; - else if (arg == "--json") jsonOutput = true; - else if (arg == "--attr-path" || arg == "-P") printAttrPath = true; - else if (arg == "--attr" || arg == "-A") - attrPath = needArg(i, args, arg); - else if (arg[0] == '-') - throw UsageError(format("unknown flag `%1%'") % arg); - else remaining.push_back(arg); - } - - - /* Obtain derivation information from the specified source. */ - DrvInfos availElems, installedElems; - - if (source == sInstalled || compareVersions || printStatus) - installedElems = queryInstalled(globals.state, globals.profile); - - if (source == sAvailable || compareVersions) - loadDerivations(globals.state, globals.instSource.nixExprPath, - globals.instSource.systemFilter, globals.instSource.autoArgs, - attrPath, availElems); - - DrvInfos elems_ = filterBySelector(globals.state, - source == sInstalled ? installedElems : availElems, - remaining, false); - - DrvInfos & otherElems(source == sInstalled ? availElems : installedElems); - - - /* Sort them by name. */ - /* !!! */ - vector elems; - for (DrvInfos::iterator i = elems_.begin(); i != elems_.end(); ++i) - elems.push_back(*i); - sort(elems.begin(), elems.end(), cmpElemByName); - - - /* We only need to know the installed paths when we are querying - the status of the derivation. */ - PathSet installed; /* installed paths */ - - if (printStatus) { - for (DrvInfos::iterator i = installedElems.begin(); - i != installedElems.end(); ++i) - installed.insert(i->queryOutPath()); - } - - - /* Query which paths have substitutes. */ - PathSet validPaths, substitutablePaths; - if (printStatus || globals.prebuiltOnly) { - PathSet paths; - foreach (vector::iterator, i, elems) - try { - paths.insert(i->queryOutPath()); - } catch (AssertionError & e) { - printMsg(lvlTalkative, format("skipping derivation named `%1%' which gives an assertion failure") % i->name); - i->setFailed(); - } - validPaths = store->queryValidPaths(paths); - substitutablePaths = store->querySubstitutablePaths(paths); - } - - - /* Print the desired columns, or XML output. */ - if (jsonOutput) { - queryJSON(globals, elems); - return; - } - - Table table; - std::ostringstream dummy; - XMLWriter xml(true, *(xmlOutput ? &cout : &dummy)); - XMLOpenElement xmlRoot(xml, "items"); - - foreach (vector::iterator, i, elems) { - try { - if (i->hasFailed()) continue; - - startNest(nest, lvlDebug, format("outputting query result `%1%'") % i->attrPath); - - if (globals.prebuiltOnly && - validPaths.find(i->queryOutPath()) == validPaths.end() && - substitutablePaths.find(i->queryOutPath()) == substitutablePaths.end()) - continue; - - /* For table output. */ - Strings columns; - - /* For XML output. */ - XMLAttrs attrs; - - if (printStatus) { - Path outPath = i->queryOutPath(); - bool hasSubs = substitutablePaths.find(outPath) != substitutablePaths.end(); - bool isInstalled = installed.find(outPath) != installed.end(); - bool isValid = validPaths.find(outPath) != validPaths.end(); - if (xmlOutput) { - attrs["installed"] = isInstalled ? "1" : "0"; - attrs["valid"] = isValid ? "1" : "0"; - attrs["substitutable"] = hasSubs ? "1" : "0"; - } else - columns.push_back( - (string) (isInstalled ? "I" : "-") - + (isValid ? "P" : "-") - + (hasSubs ? "S" : "-")); - } - - if (xmlOutput) - attrs["attrPath"] = i->attrPath; - else if (printAttrPath) - columns.push_back(i->attrPath); - - if (xmlOutput) - attrs["name"] = i->name; - else if (printName) - columns.push_back(i->name); - - if (compareVersions) { - /* Compare this element against the versions of the - same named packages in either the set of available - elements, or the set of installed elements. !!! - This is O(N * M), should be O(N * lg M). */ - string version; - VersionDiff diff = compareVersionAgainstSet(*i, otherElems, version); - - char ch; - switch (diff) { - case cvLess: ch = '>'; break; - case cvEqual: ch = '='; break; - case cvGreater: ch = '<'; break; - case cvUnavail: ch = '-'; break; - default: abort(); - } - - if (xmlOutput) { - if (diff != cvUnavail) { - attrs["versionDiff"] = ch; - attrs["maxComparedVersion"] = version; - } - } else { - string column = (string) "" + ch + " " + version; - if (diff == cvGreater) column = colorString(column); - columns.push_back(column); - } - } - - if (xmlOutput) { - if (i->system != "") attrs["system"] = i->system; - } - else if (printSystem) - columns.push_back(i->system); - - if (printDrvPath) { - string drvPath = i->queryDrvPath(); - if (xmlOutput) { - if (drvPath != "") attrs["drvPath"] = drvPath; - } else - columns.push_back(drvPath == "" ? "-" : drvPath); - } - - if (printOutPath && !xmlOutput) { - DrvInfo::Outputs outputs = i->queryOutputs(); - string s; - foreach (DrvInfo::Outputs::iterator, j, outputs) { - if (!s.empty()) s += ';'; - if (j->first != "out") { s += j->first; s += "="; } - s += j->second; - } - columns.push_back(s); - } - - if (printDescription) { - string descr = i->queryMetaString("description"); - if (xmlOutput) { - if (descr != "") attrs["description"] = descr; - } else - columns.push_back(descr); - } - - if (xmlOutput) { - if (printOutPath || printMeta) { - XMLOpenElement item(xml, "item", attrs); - if (printOutPath) { - DrvInfo::Outputs outputs = i->queryOutputs(); - foreach (DrvInfo::Outputs::iterator, j, outputs) { - XMLAttrs attrs2; - attrs2["name"] = j->first; - attrs2["path"] = j->second; - xml.writeEmptyElement("output", attrs2); - } - } - if (printMeta) { - StringSet metaNames = i->queryMetaNames(); - foreach (StringSet::iterator, j, metaNames) { - XMLAttrs attrs2; - attrs2["name"] = *j; - Value * v = i->queryMeta(*j); - if (!v) - printMsg(lvlError, format("derivation `%1%' has invalid meta attribute `%2%'") % i->name % *j); - else { - if (v->type == tString) { - attrs2["type"] = "string"; - attrs2["value"] = v->string.s; - xml.writeEmptyElement("meta", attrs2); - } else if (v->type == tInt) { - attrs2["type"] = "int"; - attrs2["value"] = (format("%1%") % v->integer).str(); - xml.writeEmptyElement("meta", attrs2); - } else if (v->type == tBool) { - attrs2["type"] = "bool"; - attrs2["value"] = v->boolean ? "true" : "false"; - xml.writeEmptyElement("meta", attrs2); - } else if (v->type == tList) { - attrs2["type"] = "strings"; - XMLOpenElement m(xml, "meta", attrs2); - for (unsigned int j = 0; j < v->list.length; ++j) { - if (v->list.elems[j]->type != tString) continue; - XMLAttrs attrs3; - attrs3["value"] = v->list.elems[j]->string.s; - xml.writeEmptyElement("string", attrs3); - } - } - } - } - } - } else - xml.writeEmptyElement("item", attrs); - } else - table.push_back(columns); - - cout.flush(); - - } catch (AssertionError & e) { - printMsg(lvlTalkative, format("skipping derivation named `%1%' which gives an assertion failure") % i->name); - } catch (Error & e) { - e.addPrefix(format("while querying the derivation named `%1%':\n") % i->name); - throw; - } - } - - if (!xmlOutput) printTable(table); -} - - -static void opSwitchProfile(Globals & globals, - Strings args, Strings opFlags, Strings opArgs) -{ - if (opFlags.size() > 0) - throw UsageError(format("unknown flag `%1%'") % opFlags.front()); - if (opArgs.size() != 1) - throw UsageError(format("exactly one argument expected")); - - Path profile = absPath(opArgs.front()); - Path profileLink = getHomeDir() + "/.nix-profile"; - - switchLink(profileLink, profile); -} - - -static const int prevGen = -2; - - -static void switchGeneration(Globals & globals, int dstGen) -{ - PathLocks lock; - lockProfile(lock, globals.profile); - - int curGen; - Generations gens = findGenerations(globals.profile, curGen); - - Generation dst; - for (Generations::iterator i = gens.begin(); i != gens.end(); ++i) - if ((dstGen == prevGen && i->number < curGen) || - (dstGen >= 0 && i->number == dstGen)) - dst = *i; - - if (!dst) { - if (dstGen == prevGen) - throw Error(format("no generation older than the current (%1%) exists") - % curGen); - else - throw Error(format("generation %1% does not exist") % dstGen); - } - - printMsg(lvlInfo, format("switching from generation %1% to %2%") - % curGen % dst.number); - - if (globals.dryRun) return; - - switchLink(globals.profile, dst.path); -} - - -static void opSwitchGeneration(Globals & globals, - Strings args, Strings opFlags, Strings opArgs) -{ - if (opFlags.size() > 0) - throw UsageError(format("unknown flag `%1%'") % opFlags.front()); - if (opArgs.size() != 1) - throw UsageError(format("exactly one argument expected")); - - int dstGen; - if (!string2Int(opArgs.front(), dstGen)) - throw UsageError(format("expected a generation number")); - - switchGeneration(globals, dstGen); -} - - -static void opRollback(Globals & globals, - Strings args, Strings opFlags, Strings opArgs) -{ - if (opFlags.size() > 0) - throw UsageError(format("unknown flag `%1%'") % opFlags.front()); - if (opArgs.size() != 0) - throw UsageError(format("no arguments expected")); - - switchGeneration(globals, prevGen); -} - - -static void opListGenerations(Globals & globals, - Strings args, Strings opFlags, Strings opArgs) -{ - if (opFlags.size() > 0) - throw UsageError(format("unknown flag `%1%'") % opFlags.front()); - if (opArgs.size() != 0) - throw UsageError(format("no arguments expected")); - - PathLocks lock; - lockProfile(lock, globals.profile); - - int curGen; - Generations gens = findGenerations(globals.profile, curGen); - - for (Generations::iterator i = gens.begin(); i != gens.end(); ++i) { - tm t; - if (!localtime_r(&i->creationTime, &t)) throw Error("cannot convert time"); - cout << format("%|4| %|4|-%|02|-%|02| %|02|:%|02|:%|02| %||\n") - % i->number - % (t.tm_year + 1900) % (t.tm_mon + 1) % t.tm_mday - % t.tm_hour % t.tm_min % t.tm_sec - % (i->number == curGen ? "(current)" : ""); - } -} - - -static void deleteGeneration2(Globals & globals, unsigned int gen) -{ - if (globals.dryRun) - printMsg(lvlInfo, format("would remove generation %1%") % gen); - else { - printMsg(lvlInfo, format("removing generation %1%") % gen); - deleteGeneration(globals.profile, gen); - } - -} - - -static void opDeleteGenerations(Globals & globals, - Strings args, Strings opFlags, Strings opArgs) -{ - if (opFlags.size() > 0) - throw UsageError(format("unknown flag `%1%'") % opFlags.front()); - - PathLocks lock; - lockProfile(lock, globals.profile); - - int curGen; - Generations gens = findGenerations(globals.profile, curGen); - - for (Strings::iterator i = opArgs.begin(); i != opArgs.end(); ++i) { - - if (*i == "old") { - for (Generations::iterator j = gens.begin(); j != gens.end(); ++j) - if (j->number != curGen) - deleteGeneration2(globals, j->number); - } else if (i->size() >= 2 && tolower(*i->rbegin()) == 'd') { - time_t curTime = time(NULL); - time_t oldTime; - string strDays = string(*i, 0, i->size() - 1); - int days; - - if (!string2Int(strDays, days) || days < 1) - throw UsageError(format("invalid number of days specifier `%1%'") % *i); - - oldTime = curTime - days * 24 * 3600; - - for (Generations::iterator j = gens.begin(); j != gens.end(); ++j) { - if (j->number == curGen) continue; - - if (j->creationTime < oldTime) - deleteGeneration2(globals, j->number); - } - } else { - int n; - if (!string2Int(*i, n) || n < 0) - throw UsageError(format("invalid generation specifier `%1%'") % *i); - bool found = false; - for (Generations::iterator j = gens.begin(); j != gens.end(); ++j) { - if (j->number == n) { - deleteGeneration2(globals, j->number); - found = true; - break; - } - } - if (!found) - printMsg(lvlError, format("generation %1% does not exist") % n); - } - } -} - - -void run(Strings args) -{ - Strings opFlags, opArgs, remaining; - Operation op = 0; - - Globals globals; - - globals.instSource.type = srcUnknown; - globals.instSource.nixExprPath = getDefNixExprPath(); - globals.instSource.systemFilter = "*"; - - globals.dryRun = false; - globals.preserveInstalled = false; - globals.removeAll = false; - globals.prebuiltOnly = false; - - for (Strings::iterator i = args.begin(); i != args.end(); ) { - string arg = *i++; - - Operation oldOp = op; - - if (arg == "--install" || arg == "-i") - op = opInstall; - else if (parseOptionArg(arg, i, args.end(), - globals.state, globals.instSource.autoArgs)) - ; - else if (parseSearchPathArg(arg, i, args.end(), globals.state)) - ; - else if (arg == "--force-name") // undocumented flag for nix-install-package - globals.forceName = needArg(i, args, arg); - else if (arg == "--uninstall" || arg == "-e") - op = opUninstall; - else if (arg == "--upgrade" || arg == "-u") - op = opUpgrade; - else if (arg == "--set-flag") - op = opSetFlag; - else if (arg == "--set") - op = opSet; - else if (arg == "--query" || arg == "-q") - op = opQuery; - else if (arg == "--profile" || arg == "-p") - globals.profile = absPath(needArg(i, args, arg)); - else if (arg == "--file" || arg == "-f") - globals.instSource.nixExprPath = lookupFileArg(globals.state, needArg(i, args, arg)); - else if (arg == "--switch-profile" || arg == "-S") - op = opSwitchProfile; - else if (arg == "--switch-generation" || arg == "-G") - op = opSwitchGeneration; - else if (arg == "--rollback") - op = opRollback; - else if (arg == "--list-generations") - op = opListGenerations; - else if (arg == "--delete-generations") - op = opDeleteGenerations; - else if (arg == "--dry-run") { - printMsg(lvlInfo, "(dry run; not doing anything)"); - globals.dryRun = true; - } - else if (arg == "--system-filter") - globals.instSource.systemFilter = needArg(i, args, arg); - else if (arg == "--prebuilt-only" || arg == "-b") - globals.prebuiltOnly = true; - else if (arg == "--repair") - globals.state.repair = true; - else { - remaining.push_back(arg); - if (arg[0] == '-') { - opFlags.push_back(arg); - if (arg == "--from-profile") { /* !!! hack */ - if (i != args.end()) opFlags.push_back(*i++); - } - } else opArgs.push_back(arg); - } - - if (oldOp && oldOp != op) - throw UsageError("only one operation may be specified"); - } - - if (!op) throw UsageError("no operation specified"); - - if (globals.profile == "") - globals.profile = getEnv("NIX_PROFILE", ""); - - if (globals.profile == "") { - Path profileLink = getHomeDir() + "/.nix-profile"; - globals.profile = pathExists(profileLink) - ? absPath(readLink(profileLink), dirOf(profileLink)) - : canonPath(settings.nixStateDir + "/profiles/default"); - } - - store = openStore(); - - op(globals, remaining, opFlags, opArgs); - - globals.state.printStats(); -} - - -string programId = "nix-env"; diff --git a/src/nix-env/profiles.cc b/src/nix-env/profiles.cc deleted file mode 100644 index f7b306890d..0000000000 --- a/src/nix-env/profiles.cc +++ /dev/null @@ -1,147 +0,0 @@ -#include "profiles.hh" -#include "store-api.hh" -#include "util.hh" - -#include -#include -#include -#include -#include - - -namespace nix { - - -static bool cmpGensByNumber(const Generation & a, const Generation & b) -{ - return a.number < b.number; -} - - -/* Parse a generation name of the format - `--link'. */ -static int parseName(const string & profileName, const string & name) -{ - if (string(name, 0, profileName.size() + 1) != profileName + "-") return -1; - string s = string(name, profileName.size() + 1); - string::size_type p = s.find("-link"); - if (p == string::npos) return -1; - int n; - if (string2Int(string(s, 0, p), n) && n >= 0) - return n; - else - return -1; -} - - - -Generations findGenerations(Path profile, int & curGen) -{ - Generations gens; - - Path profileDir = dirOf(profile); - string profileName = baseNameOf(profile); - - Strings names = readDirectory(profileDir); - for (Strings::iterator i = names.begin(); i != names.end(); ++i) { - int n; - if ((n = parseName(profileName, *i)) != -1) { - Generation gen; - gen.path = profileDir + "/" + *i; - gen.number = n; - struct stat st; - if (lstat(gen.path.c_str(), &st) != 0) - throw SysError(format("statting `%1%'") % gen.path); - gen.creationTime = st.st_mtime; - gens.push_back(gen); - } - } - - gens.sort(cmpGensByNumber); - - curGen = pathExists(profile) - ? parseName(profileName, readLink(profile)) - : -1; - - return gens; -} - - -static void makeName(const Path & profile, unsigned int num, - Path & outLink) -{ - Path prefix = (format("%1%-%2%") % profile % num).str(); - outLink = prefix + "-link"; -} - - -Path createGeneration(Path profile, Path outPath) -{ - /* The new generation number should be higher than old the - previous ones. */ - int dummy; - Generations gens = findGenerations(profile, dummy); - unsigned int num = gens.size() > 0 ? gens.back().number : 0; - - /* Create the new generation. Note that addPermRoot() blocks if - the garbage collector is running to prevent the stuff we've - built from moving from the temporary roots (which the GC knows) - to the permanent roots (of which the GC would have a stale - view). If we didn't do it this way, the GC might remove the - user environment etc. we've just built. */ - Path generation; - makeName(profile, num + 1, generation); - addPermRoot(*store, outPath, generation, false, true); - - return generation; -} - - -static void removeFile(const Path & path) -{ - if (remove(path.c_str()) == -1) - throw SysError(format("cannot unlink `%1%'") % path); -} - - -void deleteGeneration(const Path & profile, unsigned int gen) -{ - Path generation; - makeName(profile, gen, generation); - removeFile(generation); -} - - -void switchLink(Path link, Path target) -{ - /* Hacky. */ - if (dirOf(target) == dirOf(link)) target = baseNameOf(target); - - Path tmp = canonPath(dirOf(link) + "/.new_" + baseNameOf(link)); - createSymlink(target, tmp); - /* The rename() system call is supposed to be essentially atomic - on Unix. That is, if we have links `current -> X' and - `new_current -> Y', and we rename new_current to current, a - process accessing current will see X or Y, but never a - file-not-found or other error condition. This is sufficient to - atomically switch user environments. */ - if (rename(tmp.c_str(), link.c_str()) != 0) - throw SysError(format("renaming `%1%' to `%2%'") % tmp % link); -} - - -void lockProfile(PathLocks & lock, const Path & profile) -{ - lock.lockPaths(singleton(profile), - (format("waiting for lock on profile `%1%'") % profile).str()); - lock.setDeletion(true); -} - - -string optimisticLockProfile(const Path & profile) -{ - return pathExists(profile) ? readLink(profile) : ""; -} - - -} diff --git a/src/nix-env/profiles.hh b/src/nix-env/profiles.hh deleted file mode 100644 index 30d2376d99..0000000000 --- a/src/nix-env/profiles.hh +++ /dev/null @@ -1,55 +0,0 @@ -#pragma once - -#include "types.hh" -#include "pathlocks.hh" - -#include - - -namespace nix { - - -struct Generation -{ - int number; - Path path; - time_t creationTime; - Generation() - { - number = -1; - } - operator bool() const - { - return number != -1; - } -}; - -typedef list Generations; - - -/* Returns the list of currently present generations for the specified - profile, sorted by generation number. */ -Generations findGenerations(Path profile, int & curGen); - -Path createGeneration(Path profile, Path outPath); - -void deleteGeneration(const Path & profile, unsigned int gen); - -void switchLink(Path link, Path target); - -/* Ensure exclusive access to a profile. Any command that modifies - the profile first acquires this lock. */ -void lockProfile(PathLocks & lock, const Path & profile); - -/* Optimistic locking is used by long-running operations like `nix-env - -i'. Instead of acquiring the exclusive lock for the entire - duration of the operation, we just perform the operation - optimistically (without an exclusive lock), and check at the end - whether the profile changed while we were busy (i.e., the symlink - target changed). If so, the operation is restarted. Restarting is - generally cheap, since the build results are still in the Nix - store. Most of the time, only the user environment has to be - rebuilt. */ -string optimisticLockProfile(const Path & profile); - -} diff --git a/src/nix-env/user-env.cc b/src/nix-env/user-env.cc deleted file mode 100644 index a95c4cba93..0000000000 --- a/src/nix-env/user-env.cc +++ /dev/null @@ -1,149 +0,0 @@ -#include "user-env.hh" -#include "util.hh" -#include "derivations.hh" -#include "store-api.hh" -#include "globals.hh" -#include "shared.hh" -#include "eval.hh" -#include "eval-inline.hh" -#include "profiles.hh" - - -namespace nix { - - -DrvInfos queryInstalled(EvalState & state, const Path & userEnv) -{ - DrvInfos elems; - Path manifestFile = userEnv + "/manifest.nix"; - if (pathExists(manifestFile)) { - Value v; - state.evalFile(manifestFile, v); - Bindings bindings; - getDerivations(state, v, "", bindings, elems, false); - } - return elems; -} - - -bool createUserEnv(EvalState & state, DrvInfos & elems, - const Path & profile, bool keepDerivations, - const string & lockToken) -{ - /* Build the components in the user environment, if they don't - exist already. */ - PathSet drvsToBuild; - foreach (DrvInfos::iterator, i, elems) - if (i->queryDrvPath() != "") - drvsToBuild.insert(i->queryDrvPath()); - - debug(format("building user environment dependencies")); - store->buildPaths(drvsToBuild, state.repair ? bmRepair : bmNormal); - - /* Construct the whole top level derivation. */ - PathSet references; - Value manifest; - state.mkList(manifest, elems.size()); - unsigned int n = 0; - foreach (DrvInfos::iterator, i, elems) { - /* Create a pseudo-derivation containing the name, system, - output paths, and optionally the derivation path, as well - as the meta attributes. */ - Path drvPath = keepDerivations ? i->queryDrvPath() : ""; - - Value & v(*state.allocValue()); - manifest.list.elems[n++] = &v; - state.mkAttrs(v, 16); - - mkString(*state.allocAttr(v, state.sType), "derivation"); - mkString(*state.allocAttr(v, state.sName), i->name); - if (!i->system.empty()) - mkString(*state.allocAttr(v, state.sSystem), i->system); - mkString(*state.allocAttr(v, state.sOutPath), i->queryOutPath()); - if (drvPath != "") - mkString(*state.allocAttr(v, state.sDrvPath), i->queryDrvPath()); - - // Copy each output. - DrvInfo::Outputs outputs = i->queryOutputs(); - Value & vOutputs = *state.allocAttr(v, state.sOutputs); - state.mkList(vOutputs, outputs.size()); - unsigned int m = 0; - foreach (DrvInfo::Outputs::iterator, j, outputs) { - mkString(*(vOutputs.list.elems[m++] = state.allocValue()), j->first); - Value & vOutputs = *state.allocAttr(v, state.symbols.create(j->first)); - state.mkAttrs(vOutputs, 2); - mkString(*state.allocAttr(vOutputs, state.sOutPath), j->second); - - /* This is only necessary when installing store paths, e.g., - `nix-env -i /nix/store/abcd...-foo'. */ - store->addTempRoot(j->second); - store->ensurePath(j->second); - - references.insert(j->second); - } - - // Copy the meta attributes. - Value & vMeta = *state.allocAttr(v, state.sMeta); - state.mkAttrs(vMeta, 16); - StringSet metaNames = i->queryMetaNames(); - foreach (StringSet::iterator, j, metaNames) { - Value * v = i->queryMeta(*j); - if (!v) continue; - vMeta.attrs->push_back(Attr(state.symbols.create(*j), v)); - } - vMeta.attrs->sort(); - v.attrs->sort(); - - if (drvPath != "") references.insert(drvPath); - } - - /* Also write a copy of the list of user environment elements to - the store; we need it for future modifications of the - environment. */ - Path manifestFile = store->addTextToStore("env-manifest.nix", - (format("%1%") % manifest).str(), references); - - /* Get the environment builder expression. */ - Value envBuilder; - state.evalFile(state.findFile("nix/buildenv.nix"), envBuilder); - - /* Construct a Nix expression that calls the user environment - builder with the manifest as argument. */ - Value args, topLevel; - state.mkAttrs(args, 3); - mkString(*state.allocAttr(args, state.symbols.create("manifest")), - manifestFile, singleton(manifestFile)); - args.attrs->push_back(Attr(state.symbols.create("derivations"), &manifest)); - args.attrs->sort(); - mkApp(topLevel, envBuilder, args); - - /* Evaluate it. */ - debug("evaluating user environment builder"); - state.forceValue(topLevel); - PathSet context; - Path topLevelDrv = state.coerceToPath(*topLevel.attrs->find(state.sDrvPath)->value, context); - Path topLevelOut = state.coerceToPath(*topLevel.attrs->find(state.sOutPath)->value, context); - - /* Realise the resulting store expression. */ - debug("building user environment"); - store->buildPaths(singleton(topLevelDrv), state.repair ? bmRepair : bmNormal); - - /* Switch the current user environment to the output path. */ - PathLocks lock; - lockProfile(lock, profile); - - Path lockTokenCur = optimisticLockProfile(profile); - if (lockToken != lockTokenCur) { - printMsg(lvlError, format("profile `%1%' changed while we were busy; restarting") % profile); - return false; - } - - debug(format("switching to new user environment")); - Path generation = createGeneration(profile, topLevelOut); - switchLink(profile, generation); - - return true; -} - - -} diff --git a/src/nix-env/user-env.hh b/src/nix-env/user-env.hh deleted file mode 100644 index f188efe9b4..0000000000 --- a/src/nix-env/user-env.hh +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include "get-drvs.hh" - -namespace nix { - -DrvInfos queryInstalled(EvalState & state, const Path & userEnv); - -bool createUserEnv(EvalState & state, DrvInfos & elems, - const Path & profile, bool keepDerivations, - const string & lockToken); - -} diff --git a/src/nix-hash/local.mk b/src/nix-hash/local.mk deleted file mode 100644 index 7c290ca846..0000000000 --- a/src/nix-hash/local.mk +++ /dev/null @@ -1,7 +0,0 @@ -programs += nix-hash - -nix-hash_DIR := $(d) - -nix-hash_SOURCES := $(d)/nix-hash.cc - -nix-hash_LIBS = libmain libstore libutil libformat diff --git a/src/nix-hash/nix-hash.cc b/src/nix-hash/nix-hash.cc deleted file mode 100644 index af3dda4ad7..0000000000 --- a/src/nix-hash/nix-hash.cc +++ /dev/null @@ -1,64 +0,0 @@ -#include "hash.hh" -#include "shared.hh" - -#include - - -using namespace nix; - - -void printHelp() -{ - showManPage("nix-hash"); -} - - -void run(Strings args) -{ - HashType ht = htMD5; - bool flat = false; - bool base32 = false; - bool truncate = false; - enum { opHash, opTo32, opTo16 } op = opHash; - - Strings ss; - - for (Strings::iterator i = args.begin(); - i != args.end(); i++) - { - if (*i == "--flat") flat = true; - else if (*i == "--base32") base32 = true; - else if (*i == "--truncate") truncate = true; - else if (*i == "--type") { - ++i; - if (i == args.end()) throw UsageError("`--type' requires an argument"); - ht = parseHashType(*i); - if (ht == htUnknown) - throw UsageError(format("unknown hash type `%1%'") % *i); - } - else if (*i == "--to-base16") op = opTo16; - else if (*i == "--to-base32") op = opTo32; - else ss.push_back(*i); - } - - if (op == opHash) { - foreach (Strings::iterator, i, ss) { - Hash h = flat ? hashFile(ht, *i) : hashPath(ht, *i).first; - if (truncate && h.hashSize > 20) h = compressHash(h, 20); - std::cout << format("%1%\n") % - (base32 ? printHash32(h) : printHash(h)); - } - } - - else { - foreach (Strings::iterator, i, ss) { - Hash h = parseHash16or32(ht, *i); - std::cout << format("%1%\n") % - (op == opTo16 ? printHash(h) : printHash32(h)); - } - } -} - - -string programId = "nix-hash"; - diff --git a/src/nix-instantiate/local.mk b/src/nix-instantiate/local.mk deleted file mode 100644 index 7d1bc5ec9d..0000000000 --- a/src/nix-instantiate/local.mk +++ /dev/null @@ -1,7 +0,0 @@ -programs += nix-instantiate - -nix-instantiate_DIR := $(d) - -nix-instantiate_SOURCES := $(d)/nix-instantiate.cc - -nix-instantiate_LIBS = libexpr libmain libstore libutil libformat diff --git a/src/nix-instantiate/nix-instantiate.cc b/src/nix-instantiate/nix-instantiate.cc deleted file mode 100644 index afd16b3a52..0000000000 --- a/src/nix-instantiate/nix-instantiate.cc +++ /dev/null @@ -1,185 +0,0 @@ -#include "globals.hh" -#include "shared.hh" -#include "eval.hh" -#include "eval-inline.hh" -#include "get-drvs.hh" -#include "attr-path.hh" -#include "value-to-xml.hh" -#include "util.hh" -#include "store-api.hh" -#include "common-opts.hh" -#include "misc.hh" - -#include -#include - - -using namespace nix; - - -void printHelp() -{ - showManPage("nix-instantiate"); -} - - -static Expr * parseStdin(EvalState & state) -{ - startNest(nest, lvlTalkative, format("parsing standard input")); - return state.parseExprFromString(drainFD(0), absPath(".")); -} - - -static Path gcRoot; -static int rootNr = 0; -static bool indirectRoot = false; - - -void processExpr(EvalState & state, const Strings & attrPaths, - bool parseOnly, bool strict, Bindings & autoArgs, - bool evalOnly, bool xmlOutput, bool location, Expr * e) -{ - if (parseOnly) { - std::cout << format("%1%\n") % *e; - return; - } - - Value vRoot; - state.eval(e, vRoot); - - foreach (Strings::const_iterator, i, attrPaths) { - Value & v(*findAlongAttrPath(state, *i, autoArgs, vRoot)); - state.forceValue(v); - - PathSet context; - if (evalOnly) - if (xmlOutput) - printValueAsXML(state, strict, location, v, std::cout, context); - else { - if (strict) state.strictForceValue(v); - std::cout << v << std::endl; - } - else { - DrvInfos drvs; - getDerivations(state, v, "", autoArgs, drvs, false); - foreach (DrvInfos::iterator, i, drvs) { - Path drvPath = i->queryDrvPath(); - - /* What output do we want? */ - string outputName = i->queryOutputName(); - if (outputName == "") - throw Error(format("derivation `%1%' lacks an `outputName' attribute ") % drvPath); - - if (gcRoot == "") - printGCWarning(); - else { - Path rootName = gcRoot; - if (++rootNr > 1) rootName += "-" + int2String(rootNr); - drvPath = addPermRoot(*store, drvPath, rootName, indirectRoot); - } - std::cout << format("%1%%2%\n") % drvPath % (outputName != "out" ? "!" + outputName : ""); - } - } - } -} - - -void run(Strings args) -{ - EvalState state; - Strings files; - bool readStdin = false; - bool fromArgs = false; - bool findFile = false; - bool evalOnly = false; - bool parseOnly = false; - bool xmlOutput = false; - bool xmlOutputSourceLocation = true; - bool strict = false; - Strings attrPaths; - Bindings autoArgs; - bool wantsReadWrite = false; - - for (Strings::iterator i = args.begin(); i != args.end(); ) { - string arg = *i++; - - if (arg == "-") - readStdin = true; - else if (arg == "--expr" || arg == "-E") - fromArgs = true; - else if (arg == "--eval" || arg == "--eval-only") - evalOnly = true; - else if (arg == "--read-write-mode") - wantsReadWrite = true; - else if (arg == "--parse" || arg == "--parse-only") - parseOnly = evalOnly = true; - else if (arg == "--find-file") - findFile = true; - else if (arg == "--attr" || arg == "-A") { - if (i == args.end()) - throw UsageError("`--attr' requires an argument"); - attrPaths.push_back(*i++); - } - else if (parseOptionArg(arg, i, args.end(), state, autoArgs)) - ; - else if (parseSearchPathArg(arg, i, args.end(), state)) - ; - else if (arg == "--add-root") { - if (i == args.end()) - throw UsageError("`--add-root' requires an argument"); - gcRoot = absPath(*i++); - } - else if (arg == "--indirect") - indirectRoot = true; - else if (arg == "--xml") - xmlOutput = true; - else if (arg == "--no-location") - xmlOutputSourceLocation = false; - else if (arg == "--strict") - strict = true; - else if (arg == "--repair") - state.repair = true; - else if (arg == "--dry-run") - settings.readOnlyMode = true; - else if (arg[0] == '-') - throw UsageError(format("unknown flag `%1%'") % arg); - else - files.push_back(arg); - } - - if (evalOnly && !wantsReadWrite) - settings.readOnlyMode = true; - - if (attrPaths.empty()) attrPaths.push_back(""); - - if (findFile) { - foreach (Strings::iterator, i, files) { - Path p = state.findFile(*i); - if (p == "") throw Error(format("unable to find `%1%'") % *i); - std::cout << p << std::endl; - } - return; - } - - store = openStore(); - - if (readStdin) { - Expr * e = parseStdin(state); - processExpr(state, attrPaths, parseOnly, strict, autoArgs, - evalOnly, xmlOutput, xmlOutputSourceLocation, e); - } else if (files.empty() && !fromArgs) - files.push_back("./default.nix"); - - foreach (Strings::iterator, i, files) { - Expr * e = fromArgs - ? state.parseExprFromString(*i, absPath(".")) - : state.parseExprFromFile(resolveExprPath(lookupFileArg(state, *i))); - processExpr(state, attrPaths, parseOnly, strict, autoArgs, - evalOnly, xmlOutput, xmlOutputSourceLocation, e); - } - - state.printStats(); -} - - -string programId = "nix-instantiate"; diff --git a/src/nix-log2xml/local.mk b/src/nix-log2xml/local.mk deleted file mode 100644 index 46eb2e02ca..0000000000 --- a/src/nix-log2xml/local.mk +++ /dev/null @@ -1,8 +0,0 @@ -programs += nix-log2xml - -nix-log2xml_DIR := $(d) - -nix-log2xml_SOURCES := $(d)/log2xml.cc - -$(foreach file, mark-errors.xsl log2html.xsl treebits.js, \ - $(eval $(call install-data-in, $(d)/$(file), $(datadir)/nix/log2html))) diff --git a/src/nix-log2xml/log2html.xsl b/src/nix-log2xml/log2html.xsl deleted file mode 100644 index 2093994706..0000000000 --- a/src/nix-log2xml/log2html.xsl +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - -
    - - - - linelastline - -
  • - - - - -
  • -
    -
-
- -
- - - - - - error - - - - - - - - - - /... - - - -
\ No newline at end of file diff --git a/src/nix-log2xml/log2xml.cc b/src/nix-log2xml/log2xml.cc deleted file mode 100644 index 6645dc500f..0000000000 --- a/src/nix-log2xml/log2xml.cc +++ /dev/null @@ -1,200 +0,0 @@ -#include -#include -#include -#include -#include - -using namespace std; - - -struct Decoder -{ - enum { stTop, stEscape, stCSI } state; - string line; - bool inHeader; - int level; - vector args; - bool newNumber; - int priority; - bool ignoreLF; - int lineNo, charNo; - bool warning; - bool error; - - Decoder() - { - state = stTop; - line = ""; - inHeader = false; - level = 0; - priority = 1; - ignoreLF = false; - lineNo = 1; - charNo = 0; - warning = false; - error = false; - } - - void pushChar(char c); - - void finishLine(); - - void decodeFile(istream & st); -}; - - -void Decoder::pushChar(char c) -{ - if (c == '\n') { - lineNo++; - charNo = 0; - } else charNo++; - - switch (state) { - - case stTop: - if (c == '\e') { - state = stEscape; - } else if (c == '\n' && !ignoreLF) { - finishLine(); - } else line += c; - break; - - case stEscape: - if (c == '[') { - state = stCSI; - args.clear(); - newNumber = true; - } else - state = stTop; /* !!! wrong */ - break; - - case stCSI: - if (c >= 0x40 && c != 0x7e) { - state = stTop; - switch (c) { - case 'p': - if (line.size()) finishLine(); - level++; - inHeader = true; - cout << "" << endl; - priority = args.size() >= 1 ? args[0] : 1; - break; - case 'q': - if (line.size()) finishLine(); - if (level > 0) { - level--; - cout << "" << endl; - } else - cerr << "not enough nesting levels at line " - << lineNo << ", character " << charNo << endl; - break; - case 's': - if (line.size()) finishLine(); - priority = args.size() >= 1 ? args[0] : 1; - break; - case 'a': - ignoreLF = true; - break; - case 'b': - ignoreLF = false; - break; - case 'e': - error = true; - break; - case 'w': - warning = true; - break; - } - } else if (c >= '0' && c <= '9') { - int n = 0; - if (!newNumber) { - n = args.back() * 10; - args.pop_back(); - } - n += c - '0'; - args.push_back(n); - } - break; - - } -} - - -void Decoder::finishLine() -{ - string storeDir = "/nix/store/"; - int sz = storeDir.size(); - string tag = inHeader ? "head" : "line"; - cout << "<" << tag; - if (priority != 1) cout << " priority='" << priority << "'"; - if (warning) cout << " warning='1'"; - if (error) cout << " error='1'"; - cout << ">"; - - for (unsigned int i = 0; i < line.size(); i++) { - - if (line[i] == '<') cout << "<"; - else if (line[i] == '&') cout << "&"; - else if (line[i] == '\r') ; /* ignore carriage return */ - else if (line[i] < 32 && line[i] != 9) cout << "�"; - else if (i + sz + 33 < line.size() && - string(line, i, sz) == storeDir && - line[i + sz + 32] == '-') - { - int j = i + sz + 32; - /* skip name */ - while (!strchr("/\n\r\t ()[]:;?<>", line[j])) j++; - int k = j; - while (!strchr("\n\r\t ()[]:;?<>", line[k])) k++; - // !!! escaping - cout << "" - << "" - << string(line, i, sz) - << "" - << "" - << string(line, i + sz, 32) - << "" - << "" - << string(line, i + sz + 32, j - (i + sz + 32)) - << "" - << "" - << string(line, j, k - j) - << "" - << ""; - i = k - 1; - } else cout << line[i]; - } - - cout << "" << endl; - line = ""; - inHeader = false; - priority = 1; - warning = false; - error = false; -} - - -void Decoder::decodeFile(istream & st) -{ - int c; - - cout << "" << endl; - - while ((c = st.get()) != EOF) { - pushChar(c); - } - - if (line.size()) finishLine(); - - while (level--) cout << "" << endl; - - cout << "" << endl; -} - - -int main(int argc, char * * argv) -{ - Decoder dec; - dec.decodeFile(cin); -} diff --git a/src/nix-log2xml/logfile.css b/src/nix-log2xml/logfile.css deleted file mode 100644 index ed390d64a9..0000000000 --- a/src/nix-log2xml/logfile.css +++ /dev/null @@ -1,86 +0,0 @@ -body { - font-family: sans-serif; - background: white; -} - - -ul.nesting, ul.toplevel { - padding: 0; - margin: 0; -} - -ul.toplevel { - list-style-type: none; -} - -ul.nesting li.line, ul.nesting li.lastline { - position: relative; - list-style-type: none; -} - -ul.nesting li.line { - padding-left: 1.1em; -} - -ul.nesting li.lastline { - padding-left: 1.2em; // for the 0.1em border-left in .lastline > .lineconn -} - -li.line { - border-left: 0.1em solid #6185a0; -} - -li.line > span.lineconn, li.lastline > span.lineconn { - position: absolute; - height: 0.65em; - left: 0em; - width: 1em; - border-bottom: 0.1em solid #6185a0; -} - -li.lastline > span.lineconn { - border-left: 0.1em solid #6185a0; -} - - -em.storeref { - color: #500000; - position: relative; - width: 100%; -} - -em.storeref:hover { - background-color: #eeeeee; -} - -*.popup { - display: none; -/* background: url('http://losser.st-lab.cs.uu.nl/~mbravenb/menuback.png') repeat; */ - background: #ffffcd; - border: solid #555555 1px; - position: absolute; - top: 0em; - left: 0em; - margin: 0; - padding: 0; - z-index: 100; -} - -em.storeref:hover span.popup { - display: inline; -} - - -.toggle { - text-decoration: none; -} - -.showTree, .hideTree { - font-family: monospace; - font-size: larger; -} - -.error { - color: #ff0000; - font-weight: bold; -} \ No newline at end of file diff --git a/src/nix-log2xml/mark-errors.xsl b/src/nix-log2xml/mark-errors.xsl deleted file mode 100644 index 4e91913e57..0000000000 --- a/src/nix-log2xml/mark-errors.xsl +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/nix-log2xml/treebits.js b/src/nix-log2xml/treebits.js deleted file mode 100644 index 3011b391d8..0000000000 --- a/src/nix-log2xml/treebits.js +++ /dev/null @@ -1,50 +0,0 @@ -/* Acknowledgement: this is based on the Wikipedia table-of-contents - * toggle. */ - - -var idCounter = 0; - - -function showTreeToggle(isHidden) { - if (document.getElementById) { - var id = "toggle_" + idCounter; - document.writeln( - '
' + - '+' + - '-' + - ''); - idCounter = idCounter + 1; - } -} - - -function toggleTree(id) { - - var href = document.getElementById(id); - - var node = href; - var tree = null; - while (node != null) { - if (node.className == "nesting") tree = node; - node = node.nextSibling; - } - - node = href.firstChild; - var hideTree = null; - var showTree = null; - while (node != null) { - if (node.className == "showTree") showTree = node; - else if (node.className == "hideTree") hideTree = node; - node = node.nextSibling; - } - - if (tree.style.display == 'none') { - tree.style.display = ''; - hideTree.style.display = ''; - showTree.style.display = 'none'; - } else { - tree.style.display = 'none'; - hideTree.style.display = 'none'; - showTree.style.display = ''; - } -} diff --git a/src/nix-store/dotgraph.cc b/src/nix-store/dotgraph.cc deleted file mode 100644 index 72146eb68e..0000000000 --- a/src/nix-store/dotgraph.cc +++ /dev/null @@ -1,162 +0,0 @@ -#include "dotgraph.hh" -#include "util.hh" -#include "store-api.hh" - -#include - - -using std::cout; - -namespace nix { - - -static string dotQuote(const string & s) -{ - return "\"" + s + "\""; -} - - -static string nextColour() -{ - static int n = 0; - static string colours[] = - { "black", "red", "green", "blue" - , "magenta", "burlywood" }; - return colours[n++ % (sizeof(colours) / sizeof(string))]; -} - - -static string makeEdge(const string & src, const string & dst) -{ - format f = format("%1% -> %2% [color = %3%];\n") - % dotQuote(src) % dotQuote(dst) % dotQuote(nextColour()); - return f.str(); -} - - -static string makeNode(const string & id, const string & label, - const string & colour) -{ - format f = format("%1% [label = %2%, shape = box, " - "style = filled, fillcolor = %3%];\n") - % dotQuote(id) % dotQuote(label) % dotQuote(colour); - return f.str(); -} - - -static string symbolicName(const string & path) -{ - string p = baseNameOf(path); - int dash = p.find('-'); - return string(p, dash + 1); -} - - -#if 0 -string pathLabel(const Path & nePath, const string & elemPath) -{ - return (string) nePath + "-" + elemPath; -} - - -void printClosure(const Path & nePath, const StoreExpr & fs) -{ - PathSet workList(fs.closure.roots); - PathSet doneSet; - - for (PathSet::iterator i = workList.begin(); i != workList.end(); ++i) { - cout << makeEdge(pathLabel(nePath, *i), nePath); - } - - while (!workList.empty()) { - Path path = *(workList.begin()); - workList.erase(path); - - if (doneSet.find(path) == doneSet.end()) { - doneSet.insert(path); - - ClosureElems::const_iterator elem = fs.closure.elems.find(path); - if (elem == fs.closure.elems.end()) - throw Error(format("bad closure, missing path `%1%'") % path); - - for (StringSet::const_iterator i = elem->second.refs.begin(); - i != elem->second.refs.end(); ++i) - { - workList.insert(*i); - cout << makeEdge(pathLabel(nePath, *i), pathLabel(nePath, path)); - } - - cout << makeNode(pathLabel(nePath, path), - symbolicName(path), "#ff0000"); - } - } -} -#endif - - -void printDotGraph(const PathSet & roots) -{ - PathSet workList(roots); - PathSet doneSet; - - cout << "digraph G {\n"; - - while (!workList.empty()) { - Path path = *(workList.begin()); - workList.erase(path); - - if (doneSet.find(path) != doneSet.end()) continue; - doneSet.insert(path); - - cout << makeNode(path, symbolicName(path), "#ff0000"); - - PathSet references; - store->queryReferences(path, references); - - for (PathSet::iterator i = references.begin(); - i != references.end(); ++i) - { - if (*i != path) { - workList.insert(*i); - cout << makeEdge(*i, path); - } - } - - -#if 0 - StoreExpr ne = storeExprFromPath(path); - - string label, colour; - - if (ne.type == StoreExpr::neDerivation) { - for (PathSet::iterator i = ne.derivation.inputs.begin(); - i != ne.derivation.inputs.end(); ++i) - { - workList.insert(*i); - cout << makeEdge(*i, path); - } - - label = "derivation"; - colour = "#00ff00"; - for (StringPairs::iterator i = ne.derivation.env.begin(); - i != ne.derivation.env.end(); ++i) - if (i->first == "name") label = i->second; - } - - else if (ne.type == StoreExpr::neClosure) { - label = ""; - colour = "#00ffff"; - printClosure(path, ne); - } - - else abort(); - - cout << makeNode(path, label, colour); -#endif - } - - cout << "}\n"; -} - - -} diff --git a/src/nix-store/dotgraph.hh b/src/nix-store/dotgraph.hh deleted file mode 100644 index 68410d8415..0000000000 --- a/src/nix-store/dotgraph.hh +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include "types.hh" - -namespace nix { - -void printDotGraph(const PathSet & roots); - -} diff --git a/src/nix-store/local.mk b/src/nix-store/local.mk deleted file mode 100644 index 7f93e4c191..0000000000 --- a/src/nix-store/local.mk +++ /dev/null @@ -1,9 +0,0 @@ -programs += nix-store - -nix-store_DIR := $(d) - -nix-store_SOURCES := $(wildcard $(d)/*.cc) - -nix-store_LIBS = libmain libstore libutil libformat - -nix-store_LDFLAGS = -lbz2 diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc deleted file mode 100644 index 341a4f6776..0000000000 --- a/src/nix-store/nix-store.cc +++ /dev/null @@ -1,1007 +0,0 @@ -#include "globals.hh" -#include "misc.hh" -#include "archive.hh" -#include "shared.hh" -#include "dotgraph.hh" -#include "xmlgraph.hh" -#include "local-store.hh" -#include "util.hh" -#include "serve-protocol.hh" -#include "worker-protocol.hh" - -#include -#include -#include - -#include -#include -#include - -#include - - -using namespace nix; -using std::cin; -using std::cout; - - -typedef void (* Operation) (Strings opFlags, Strings opArgs); - - -void printHelp() -{ - showManPage("nix-store"); -} - - -static Path gcRoot; -static int rootNr = 0; -static bool indirectRoot = false; -static bool noOutput = false; - - -LocalStore & ensureLocalStore() -{ - LocalStore * store2(dynamic_cast(store.get())); - if (!store2) throw Error("you don't have sufficient rights to use this command"); - return *store2; -} - - -static Path useDeriver(Path path) -{ - if (!isDerivation(path)) { - path = store->queryDeriver(path); - if (path == "") - throw Error(format("deriver of path `%1%' is not known") % path); - } - return path; -} - - -/* Realise the given path. For a derivation that means build it; for - other paths it means ensure their validity. */ -static PathSet realisePath(Path path, bool build = true) -{ - DrvPathWithOutputs p = parseDrvPathWithOutputs(path); - - if (isDerivation(p.first)) { - if (build) store->buildPaths(singleton(path)); - Derivation drv = derivationFromPath(*store, p.first); - rootNr++; - - if (p.second.empty()) - foreach (DerivationOutputs::iterator, i, drv.outputs) p.second.insert(i->first); - - PathSet outputs; - foreach (StringSet::iterator, j, p.second) { - DerivationOutputs::iterator i = drv.outputs.find(*j); - if (i == drv.outputs.end()) - throw Error(format("derivation `%1%' does not have an output named `%2%'") % p.first % *j); - Path outPath = i->second.path; - if (gcRoot == "") - printGCWarning(); - else { - Path rootName = gcRoot; - if (rootNr > 1) rootName += "-" + int2String(rootNr); - if (i->first != "out") rootName += "-" + i->first; - outPath = addPermRoot(*store, outPath, rootName, indirectRoot); - } - outputs.insert(outPath); - } - return outputs; - } - - else { - if (build) store->ensurePath(path); - else if (!store->isValidPath(path)) throw Error(format("path `%1%' does not exist and cannot be created") % path); - if (gcRoot == "") - printGCWarning(); - else { - Path rootName = gcRoot; - rootNr++; - if (rootNr > 1) rootName += "-" + int2String(rootNr); - path = addPermRoot(*store, path, rootName, indirectRoot); - } - return singleton(path); - } -} - - -/* Realise the given paths. */ -static void opRealise(Strings opFlags, Strings opArgs) -{ - bool dryRun = false; - BuildMode buildMode = bmNormal; - bool ignoreUnknown = false; - - foreach (Strings::iterator, i, opFlags) - if (*i == "--dry-run") dryRun = true; - else if (*i == "--repair") buildMode = bmRepair; - else if (*i == "--check") buildMode = bmCheck; - else if (*i == "--ignore-unknown") ignoreUnknown = true; - else throw UsageError(format("unknown flag `%1%'") % *i); - - Paths paths; - foreach (Strings::iterator, i, opArgs) { - DrvPathWithOutputs p = parseDrvPathWithOutputs(*i); - paths.push_back(makeDrvPathWithOutputs(followLinksToStorePath(p.first), p.second)); - } - - unsigned long long downloadSize, narSize; - PathSet willBuild, willSubstitute, unknown; - queryMissing(*store, PathSet(paths.begin(), paths.end()), - willBuild, willSubstitute, unknown, downloadSize, narSize); - - if (ignoreUnknown) { - Paths paths2; - foreach (Paths::iterator, i, paths) - if (unknown.find(*i) == unknown.end()) paths2.push_back(*i); - paths = paths2; - unknown = PathSet(); - } - - printMissing(willBuild, willSubstitute, unknown, downloadSize, narSize); - - if (dryRun) return; - - /* Build all paths at the same time to exploit parallelism. */ - store->buildPaths(PathSet(paths.begin(), paths.end()), buildMode); - - if (!ignoreUnknown) - foreach (Paths::iterator, i, paths) { - PathSet paths = realisePath(*i, false); - if (!noOutput) - foreach (PathSet::iterator, j, paths) - cout << format("%1%\n") % *j; - } -} - - -/* Add files to the Nix store and print the resulting paths. */ -static void opAdd(Strings opFlags, Strings opArgs) -{ - if (!opFlags.empty()) throw UsageError("unknown flag"); - - for (Strings::iterator i = opArgs.begin(); i != opArgs.end(); ++i) - cout << format("%1%\n") % store->addToStore(*i); -} - - -/* Preload the output of a fixed-output derivation into the Nix - store. */ -static void opAddFixed(Strings opFlags, Strings opArgs) -{ - bool recursive = false; - - for (Strings::iterator i = opFlags.begin(); - i != opFlags.end(); ++i) - if (*i == "--recursive") recursive = true; - else throw UsageError(format("unknown flag `%1%'") % *i); - - if (opArgs.empty()) - throw UsageError("first argument must be hash algorithm"); - - HashType hashAlgo = parseHashType(opArgs.front()); - opArgs.pop_front(); - - for (Strings::iterator i = opArgs.begin(); i != opArgs.end(); ++i) - cout << format("%1%\n") % store->addToStore(*i, recursive, hashAlgo); -} - - -/* Hack to support caching in `nix-prefetch-url'. */ -static void opPrintFixedPath(Strings opFlags, Strings opArgs) -{ - bool recursive = false; - - for (Strings::iterator i = opFlags.begin(); - i != opFlags.end(); ++i) - if (*i == "--recursive") recursive = true; - else throw UsageError(format("unknown flag `%1%'") % *i); - - if (opArgs.size() != 3) - throw UsageError(format("`--print-fixed-path' requires three arguments")); - - Strings::iterator i = opArgs.begin(); - HashType hashAlgo = parseHashType(*i++); - string hash = *i++; - string name = *i++; - - cout << format("%1%\n") % - makeFixedOutputPath(recursive, hashAlgo, - parseHash16or32(hashAlgo, hash), name); -} - - -static PathSet maybeUseOutputs(const Path & storePath, bool useOutput, bool forceRealise) -{ - if (forceRealise) realisePath(storePath); - if (useOutput && isDerivation(storePath)) { - Derivation drv = derivationFromPath(*store, storePath); - PathSet outputs; - foreach (DerivationOutputs::iterator, i, drv.outputs) - outputs.insert(i->second.path); - return outputs; - } - else return singleton(storePath); -} - - -/* Some code to print a tree representation of a derivation dependency - graph. Topological sorting is used to keep the tree relatively - flat. */ - -const string treeConn = "+---"; -const string treeLine = "| "; -const string treeNull = " "; - - -static void printTree(const Path & path, - const string & firstPad, const string & tailPad, PathSet & done) -{ - if (done.find(path) != done.end()) { - cout << format("%1%%2% [...]\n") % firstPad % path; - return; - } - done.insert(path); - - cout << format("%1%%2%\n") % firstPad % path; - - PathSet references; - store->queryReferences(path, references); - - /* Topologically sort under the relation A < B iff A \in - closure(B). That is, if derivation A is an (possibly indirect) - input of B, then A is printed first. This has the effect of - flattening the tree, preventing deeply nested structures. */ - Paths sorted = topoSortPaths(*store, references); - reverse(sorted.begin(), sorted.end()); - - foreach (Paths::iterator, i, sorted) { - Paths::iterator j = i; ++j; - printTree(*i, tailPad + treeConn, - j == sorted.end() ? tailPad + treeNull : tailPad + treeLine, - done); - } -} - - -/* Perform various sorts of queries. */ -static void opQuery(Strings opFlags, Strings opArgs) -{ - enum { qOutputs, qRequisites, qReferences, qReferrers - , qReferrersClosure, qDeriver, qBinding, qHash, qSize - , qTree, qGraph, qXml, qResolve, qRoots } query = qOutputs; - bool useOutput = false; - bool includeOutputs = false; - bool forceRealise = false; - string bindingName; - - foreach (Strings::iterator, i, opFlags) - if (*i == "--outputs") query = qOutputs; - else if (*i == "--requisites" || *i == "-R") query = qRequisites; - else if (*i == "--references") query = qReferences; - else if (*i == "--referrers" || *i == "--referers") query = qReferrers; - else if (*i == "--referrers-closure" || *i == "--referers-closure") query = qReferrersClosure; - else if (*i == "--deriver" || *i == "-d") query = qDeriver; - else if (*i == "--binding" || *i == "-b") { - if (opArgs.size() == 0) - throw UsageError("expected binding name"); - bindingName = opArgs.front(); - opArgs.pop_front(); - query = qBinding; - } - else if (*i == "--hash") query = qHash; - else if (*i == "--size") query = qSize; - else if (*i == "--tree") query = qTree; - else if (*i == "--graph") query = qGraph; - else if (*i == "--xml") query = qXml; - else if (*i == "--resolve") query = qResolve; - else if (*i == "--roots") query = qRoots; - else if (*i == "--use-output" || *i == "-u") useOutput = true; - else if (*i == "--force-realise" || *i == "--force-realize" || *i == "-f") forceRealise = true; - else if (*i == "--include-outputs") includeOutputs = true; - else throw UsageError(format("unknown flag `%1%'") % *i); - - switch (query) { - - case qOutputs: { - foreach (Strings::iterator, i, opArgs) { - *i = followLinksToStorePath(*i); - if (forceRealise) realisePath(*i); - Derivation drv = derivationFromPath(*store, *i); - foreach (DerivationOutputs::iterator, j, drv.outputs) - cout << format("%1%\n") % j->second.path; - } - break; - } - - case qRequisites: - case qReferences: - case qReferrers: - case qReferrersClosure: { - PathSet paths; - foreach (Strings::iterator, i, opArgs) { - PathSet ps = maybeUseOutputs(followLinksToStorePath(*i), useOutput, forceRealise); - foreach (PathSet::iterator, j, ps) { - if (query == qRequisites) computeFSClosure(*store, *j, paths, false, includeOutputs); - else if (query == qReferences) store->queryReferences(*j, paths); - else if (query == qReferrers) store->queryReferrers(*j, paths); - else if (query == qReferrersClosure) computeFSClosure(*store, *j, paths, true); - } - } - Paths sorted = topoSortPaths(*store, paths); - for (Paths::reverse_iterator i = sorted.rbegin(); - i != sorted.rend(); ++i) - cout << format("%s\n") % *i; - break; - } - - case qDeriver: - foreach (Strings::iterator, i, opArgs) { - Path deriver = store->queryDeriver(followLinksToStorePath(*i)); - cout << format("%1%\n") % - (deriver == "" ? "unknown-deriver" : deriver); - } - break; - - case qBinding: - foreach (Strings::iterator, i, opArgs) { - Path path = useDeriver(followLinksToStorePath(*i)); - Derivation drv = derivationFromPath(*store, path); - StringPairs::iterator j = drv.env.find(bindingName); - if (j == drv.env.end()) - throw Error(format("derivation `%1%' has no environment binding named `%2%'") - % path % bindingName); - cout << format("%1%\n") % j->second; - } - break; - - case qHash: - case qSize: - foreach (Strings::iterator, i, opArgs) { - PathSet paths = maybeUseOutputs(followLinksToStorePath(*i), useOutput, forceRealise); - foreach (PathSet::iterator, j, paths) { - ValidPathInfo info = store->queryPathInfo(*j); - if (query == qHash) { - assert(info.hash.type == htSHA256); - cout << format("sha256:%1%\n") % printHash32(info.hash); - } else if (query == qSize) - cout << format("%1%\n") % info.narSize; - } - } - break; - - case qTree: { - PathSet done; - foreach (Strings::iterator, i, opArgs) - printTree(followLinksToStorePath(*i), "", "", done); - break; - } - - case qGraph: { - PathSet roots; - foreach (Strings::iterator, i, opArgs) { - PathSet paths = maybeUseOutputs(followLinksToStorePath(*i), useOutput, forceRealise); - roots.insert(paths.begin(), paths.end()); - } - printDotGraph(roots); - break; - } - - case qXml: { - PathSet roots; - foreach (Strings::iterator, i, opArgs) { - PathSet paths = maybeUseOutputs(followLinksToStorePath(*i), useOutput, forceRealise); - roots.insert(paths.begin(), paths.end()); - } - printXmlGraph(roots); - break; - } - - case qResolve: { - foreach (Strings::iterator, i, opArgs) - cout << format("%1%\n") % followLinksToStorePath(*i); - break; - } - - case qRoots: { - PathSet referrers; - foreach (Strings::iterator, i, opArgs) { - PathSet paths = maybeUseOutputs(followLinksToStorePath(*i), useOutput, forceRealise); - foreach (PathSet::iterator, j, paths) - computeFSClosure(*store, *j, referrers, true, - settings.gcKeepOutputs, settings.gcKeepDerivations); - } - Roots roots = store->findRoots(); - foreach (Roots::iterator, i, roots) - if (referrers.find(i->second) != referrers.end()) - cout << format("%1%\n") % i->first; - break; - } - - default: - abort(); - } -} - - -static string shellEscape(const string & s) -{ - string r; - foreach (string::const_iterator, i, s) - if (*i == '\'') r += "'\\''"; else r += *i; - return r; -} - - -static void opPrintEnv(Strings opFlags, Strings opArgs) -{ - if (!opFlags.empty()) throw UsageError("unknown flag"); - if (opArgs.size() != 1) throw UsageError("`--print-env' requires one derivation store path"); - - Path drvPath = opArgs.front(); - Derivation drv = derivationFromPath(*store, drvPath); - - /* Print each environment variable in the derivation in a format - that can be sourced by the shell. */ - foreach (StringPairs::iterator, i, drv.env) - cout << format("export %1%; %1%='%2%'\n") % i->first % shellEscape(i->second); - - /* Also output the arguments. This doesn't preserve whitespace in - arguments. */ - cout << "export _args; _args='"; - foreach (Strings::iterator, i, drv.args) { - if (i != drv.args.begin()) cout << ' '; - cout << shellEscape(*i); - } - cout << "'\n"; -} - - -static void opReadLog(Strings opFlags, Strings opArgs) -{ - if (!opFlags.empty()) throw UsageError("unknown flag"); - - foreach (Strings::iterator, i, opArgs) { - Path path = useDeriver(followLinksToStorePath(*i)); - - for (int j = 0; j <= 2; j++) { - if (j == 2) throw Error(format("build log of derivation `%1%' is not available") % path); - - string baseName = baseNameOf(path); - Path logPath = - j == 0 - ? (format("%1%/%2%/%3%/%4%") % settings.nixLogDir % drvsLogDir % string(baseName, 0, 2) % string(baseName, 2)).str() - : (format("%1%/%2%/%3%") % settings.nixLogDir % drvsLogDir % baseName).str(); - Path logBz2Path = logPath + ".bz2"; - - if (pathExists(logPath)) { - /* !!! Make this run in O(1) memory. */ - string log = readFile(logPath); - writeFull(STDOUT_FILENO, (const unsigned char *) log.data(), log.size()); - break; - } - - else if (pathExists(logBz2Path)) { - AutoCloseFD fd = open(logBz2Path.c_str(), O_RDONLY); - FILE * f = 0; - if (fd == -1 || (f = fdopen(fd.borrow(), "r")) == 0) - throw SysError(format("opening file `%1%'") % logBz2Path); - int err; - BZFILE * bz = BZ2_bzReadOpen(&err, f, 0, 0, 0, 0); - if (!bz) throw Error(format("cannot open bzip2 file `%1%'") % logBz2Path); - unsigned char buf[128 * 1024]; - do { - int n = BZ2_bzRead(&err, bz, buf, sizeof(buf)); - if (err != BZ_OK && err != BZ_STREAM_END) - throw Error(format("error reading bzip2 file `%1%'") % logBz2Path); - writeFull(STDOUT_FILENO, buf, n); - } while (err != BZ_STREAM_END); - BZ2_bzReadClose(&err, bz); - break; - } - } - } -} - - -static void opDumpDB(Strings opFlags, Strings opArgs) -{ - if (!opFlags.empty()) throw UsageError("unknown flag"); - if (!opArgs.empty()) - throw UsageError("no arguments expected"); - PathSet validPaths = store->queryAllValidPaths(); - foreach (PathSet::iterator, i, validPaths) - cout << store->makeValidityRegistration(singleton(*i), true, true); -} - - -static void registerValidity(bool reregister, bool hashGiven, bool canonicalise) -{ - ValidPathInfos infos; - - while (1) { - ValidPathInfo info = decodeValidPathInfo(cin, hashGiven); - if (info.path == "") break; - if (!store->isValidPath(info.path) || reregister) { - /* !!! races */ - if (canonicalise) - canonicalisePathMetaData(info.path, -1); - if (!hashGiven) { - HashResult hash = hashPath(htSHA256, info.path); - info.hash = hash.first; - info.narSize = hash.second; - } - infos.push_back(info); - } - } - - ensureLocalStore().registerValidPaths(infos); -} - - -static void opLoadDB(Strings opFlags, Strings opArgs) -{ - if (!opFlags.empty()) throw UsageError("unknown flag"); - if (!opArgs.empty()) - throw UsageError("no arguments expected"); - registerValidity(true, true, false); -} - - -static void opRegisterValidity(Strings opFlags, Strings opArgs) -{ - bool reregister = false; // !!! maybe this should be the default - bool hashGiven = false; - - for (Strings::iterator i = opFlags.begin(); - i != opFlags.end(); ++i) - if (*i == "--reregister") reregister = true; - else if (*i == "--hash-given") hashGiven = true; - else throw UsageError(format("unknown flag `%1%'") % *i); - - if (!opArgs.empty()) throw UsageError("no arguments expected"); - - registerValidity(reregister, hashGiven, true); -} - - -static void opCheckValidity(Strings opFlags, Strings opArgs) -{ - bool printInvalid = false; - - for (Strings::iterator i = opFlags.begin(); - i != opFlags.end(); ++i) - if (*i == "--print-invalid") printInvalid = true; - else throw UsageError(format("unknown flag `%1%'") % *i); - - for (Strings::iterator i = opArgs.begin(); - i != opArgs.end(); ++i) - { - Path path = followLinksToStorePath(*i); - if (!store->isValidPath(path)) { - if (printInvalid) - cout << format("%1%\n") % path; - else - throw Error(format("path `%1%' is not valid") % path); - } - } -} - - -static string showBytes(unsigned long long bytes) -{ - return (format("%.2f MiB") % (bytes / (1024.0 * 1024.0))).str(); -} - - -struct PrintFreed -{ - bool show; - const GCResults & results; - PrintFreed(bool show, const GCResults & results) - : show(show), results(results) { } - ~PrintFreed() - { - if (show) - cout << format("%1% store paths deleted, %2% freed\n") - % results.paths.size() - % showBytes(results.bytesFreed); - } -}; - - -static void opGC(Strings opFlags, Strings opArgs) -{ - bool printRoots = false; - GCOptions options; - options.action = GCOptions::gcDeleteDead; - - GCResults results; - - /* Do what? */ - foreach (Strings::iterator, i, opFlags) - if (*i == "--print-roots") printRoots = true; - else if (*i == "--print-live") options.action = GCOptions::gcReturnLive; - else if (*i == "--print-dead") options.action = GCOptions::gcReturnDead; - else if (*i == "--delete") options.action = GCOptions::gcDeleteDead; - else if (*i == "--max-freed") { - long long maxFreed = getIntArg(*i, i, opFlags.end(), true); - options.maxFreed = maxFreed >= 0 ? maxFreed : 0; - } - else throw UsageError(format("bad sub-operation `%1%' in GC") % *i); - - if (!opArgs.empty()) throw UsageError("no arguments expected"); - - if (printRoots) { - Roots roots = store->findRoots(); - foreach (Roots::iterator, i, roots) - cout << i->first << " -> " << i->second << std::endl; - } - - else { - PrintFreed freed(options.action == GCOptions::gcDeleteDead, results); - store->collectGarbage(options, results); - - if (options.action != GCOptions::gcDeleteDead) - foreach (PathSet::iterator, i, results.paths) - cout << *i << std::endl; - } -} - - -/* Remove paths from the Nix store if possible (i.e., if they do not - have any remaining referrers and are not reachable from any GC - roots). */ -static void opDelete(Strings opFlags, Strings opArgs) -{ - GCOptions options; - options.action = GCOptions::gcDeleteSpecific; - - foreach (Strings::iterator, i, opFlags) - if (*i == "--ignore-liveness") options.ignoreLiveness = true; - else throw UsageError(format("unknown flag `%1%'") % *i); - - foreach (Strings::iterator, i, opArgs) - options.pathsToDelete.insert(followLinksToStorePath(*i)); - - GCResults results; - PrintFreed freed(true, results); - store->collectGarbage(options, results); -} - - -/* Dump a path as a Nix archive. The archive is written to standard - output. */ -static void opDump(Strings opFlags, Strings opArgs) -{ - if (!opFlags.empty()) throw UsageError("unknown flag"); - if (opArgs.size() != 1) throw UsageError("only one argument allowed"); - - FdSink sink(STDOUT_FILENO); - string path = *opArgs.begin(); - dumpPath(path, sink); -} - - -/* Restore a value from a Nix archive. The archive is read from - standard input. */ -static void opRestore(Strings opFlags, Strings opArgs) -{ - if (!opFlags.empty()) throw UsageError("unknown flag"); - if (opArgs.size() != 1) throw UsageError("only one argument allowed"); - - FdSource source(STDIN_FILENO); - restorePath(*opArgs.begin(), source); -} - - -static void opExport(Strings opFlags, Strings opArgs) -{ - bool sign = false; - for (Strings::iterator i = opFlags.begin(); - i != opFlags.end(); ++i) - if (*i == "--sign") sign = true; - else throw UsageError(format("unknown flag `%1%'") % *i); - - FdSink sink(STDOUT_FILENO); - Paths sorted = topoSortPaths(*store, PathSet(opArgs.begin(), opArgs.end())); - reverse(sorted.begin(), sorted.end()); - exportPaths(*store, sorted, sign, sink); -} - - -static void opImport(Strings opFlags, Strings opArgs) -{ - bool requireSignature = false; - foreach (Strings::iterator, i, opFlags) - if (*i == "--require-signature") requireSignature = true; - else throw UsageError(format("unknown flag `%1%'") % *i); - - if (!opArgs.empty()) throw UsageError("no arguments expected"); - - FdSource source(STDIN_FILENO); - Paths paths = store->importPaths(requireSignature, source); - - foreach (Paths::iterator, i, paths) - cout << format("%1%\n") % *i << std::flush; -} - - -/* Initialise the Nix databases. */ -static void opInit(Strings opFlags, Strings opArgs) -{ - if (!opFlags.empty()) throw UsageError("unknown flag"); - if (!opArgs.empty()) - throw UsageError("no arguments expected"); - /* Doesn't do anything right now; database tables are initialised - automatically. */ -} - - -/* Verify the consistency of the Nix environment. */ -static void opVerify(Strings opFlags, Strings opArgs) -{ - if (!opArgs.empty()) - throw UsageError("no arguments expected"); - - bool checkContents = false; - bool repair = false; - - for (Strings::iterator i = opFlags.begin(); - i != opFlags.end(); ++i) - if (*i == "--check-contents") checkContents = true; - else if (*i == "--repair") repair = true; - else throw UsageError(format("unknown flag `%1%'") % *i); - - if (ensureLocalStore().verifyStore(checkContents, repair)) { - printMsg(lvlError, "warning: not all errors were fixed"); - exitCode = 1; - } -} - - -/* Verify whether the contents of the given store path have not changed. */ -static void opVerifyPath(Strings opFlags, Strings opArgs) -{ - if (!opFlags.empty()) - throw UsageError("no flags expected"); - - foreach (Strings::iterator, i, opArgs) { - Path path = followLinksToStorePath(*i); - printMsg(lvlTalkative, format("checking path `%1%'...") % path); - ValidPathInfo info = store->queryPathInfo(path); - HashResult current = hashPath(info.hash.type, path); - if (current.first != info.hash) { - printMsg(lvlError, - format("path `%1%' was modified! expected hash `%2%', got `%3%'") - % path % printHash(info.hash) % printHash(current.first)); - exitCode = 1; - } - } -} - - -/* Repair the contents of the given path by redownloading it using a - substituter (if available). */ -static void opRepairPath(Strings opFlags, Strings opArgs) -{ - if (!opFlags.empty()) - throw UsageError("no flags expected"); - - foreach (Strings::iterator, i, opArgs) { - Path path = followLinksToStorePath(*i); - ensureLocalStore().repairPath(path); - } -} - - -static void showOptimiseStats(OptimiseStats & stats) -{ - printMsg(lvlError, - format("%1% freed by hard-linking %2% files; there are %3% files with equal contents out of %4% files in total") - % showBytes(stats.bytesFreed) - % stats.filesLinked - % stats.sameContents - % stats.totalFiles); -} - - -/* Optimise the disk space usage of the Nix store by hard-linking - files with the same contents. */ -static void opOptimise(Strings opFlags, Strings opArgs) -{ - if (!opArgs.empty() || !opFlags.empty()) - throw UsageError("no arguments expected"); - - OptimiseStats stats; - try { - ensureLocalStore().optimiseStore(stats); - } catch (...) { - showOptimiseStats(stats); - throw; - } - showOptimiseStats(stats); -} - - -static void opQueryFailedPaths(Strings opFlags, Strings opArgs) -{ - if (!opArgs.empty() || !opFlags.empty()) - throw UsageError("no arguments expected"); - PathSet failed = store->queryFailedPaths(); - foreach (PathSet::iterator, i, failed) - cout << format("%1%\n") % *i; -} - - -static void opClearFailedPaths(Strings opFlags, Strings opArgs) -{ - if (!opFlags.empty()) - throw UsageError("no flags expected"); - store->clearFailedPaths(PathSet(opArgs.begin(), opArgs.end())); -} - - -/* Serve the nix store in a way usable by a restricted ssh user. */ -static void opServe(Strings opFlags, Strings opArgs) -{ - if (!opArgs.empty() || !opFlags.empty()) - throw UsageError("no arguments or flags expected"); - - FdSource in(STDIN_FILENO); - FdSink out(STDOUT_FILENO); - - /* Exchange the greeting. */ - unsigned int magic = readInt(in); - if (magic != SERVE_MAGIC_1) throw Error("protocol mismatch"); - writeInt(SERVE_MAGIC_2, out); - writeInt(SERVE_PROTOCOL_VERSION, out); - out.flush(); - readInt(in); // Client version, unused for now - - ServeCommand cmd = (ServeCommand) readInt(in); - switch (cmd) { - case cmdQuery: - while (true) { - QueryCommand qCmd; - try { - qCmd = (QueryCommand) readInt(in); - } catch (EndOfFile & e) { - break; - } - switch (qCmd) { - case qCmdHave: { - PathSet paths = readStorePaths(in); - writeStrings(store->queryValidPaths(paths), out); - break; - } - case qCmdInfo: { - PathSet paths = readStorePaths(in); - // !!! Maybe we want a queryPathInfos? - foreach (PathSet::iterator, i, paths) { - if (!store->isValidPath(*i)) - continue; - ValidPathInfo info = store->queryPathInfo(*i); - writeString(info.path, out); - writeString(info.deriver, out); - writeStrings(info.references, out); - // !!! Maybe we want compression? - writeLongLong(info.narSize, out); // downloadSize - writeLongLong(info.narSize, out); - } - writeString("", out); - break; - } - default: - throw Error(format("unknown serve query `%1%'") % cmd); - } - out.flush(); - } - break; - case cmdSubstitute: - dumpPath(readString(in), out); - break; - default: - throw Error(format("unknown serve command `%1%'") % cmd); - } -} - - -/* Scan the arguments; find the operation, set global flags, put all - other flags in a list, and put all other arguments in another - list. */ -void run(Strings args) -{ - Strings opFlags, opArgs; - Operation op = 0; - - for (Strings::iterator i = args.begin(); i != args.end(); ) { - string arg = *i++; - - Operation oldOp = op; - - if (arg == "--realise" || arg == "--realize" || arg == "-r") - op = opRealise; - else if (arg == "--add" || arg == "-A") - op = opAdd; - else if (arg == "--add-fixed") - op = opAddFixed; - else if (arg == "--print-fixed-path") - op = opPrintFixedPath; - else if (arg == "--delete") - op = opDelete; - else if (arg == "--query" || arg == "-q") - op = opQuery; - else if (arg == "--print-env") - op = opPrintEnv; - else if (arg == "--read-log" || arg == "-l") - op = opReadLog; - else if (arg == "--dump-db") - op = opDumpDB; - else if (arg == "--load-db") - op = opLoadDB; - else if (arg == "--register-validity") - op = opRegisterValidity; - else if (arg == "--check-validity") - op = opCheckValidity; - else if (arg == "--gc") - op = opGC; - else if (arg == "--dump") - op = opDump; - else if (arg == "--restore") - op = opRestore; - else if (arg == "--export") - op = opExport; - else if (arg == "--import") - op = opImport; - else if (arg == "--init") - op = opInit; - else if (arg == "--verify") - op = opVerify; - else if (arg == "--verify-path") - op = opVerifyPath; - else if (arg == "--repair-path") - op = opRepairPath; - else if (arg == "--optimise" || arg == "--optimize") - op = opOptimise; - else if (arg == "--query-failed-paths") - op = opQueryFailedPaths; - else if (arg == "--clear-failed-paths") - op = opClearFailedPaths; - else if (arg == "--add-root") { - if (i == args.end()) - throw UsageError("`--add-root requires an argument"); - gcRoot = absPath(*i++); - } - else if (arg == "--indirect") - indirectRoot = true; - else if (arg == "--no-output") - noOutput = true; - else if (arg == "--serve") - op = opServe; - else if (arg[0] == '-') { - opFlags.push_back(arg); - if (arg == "--max-freed" || arg == "--max-links" || arg == "--max-atime") { /* !!! hack */ - if (i != args.end()) opFlags.push_back(*i++); - } - } - else - opArgs.push_back(arg); - - if (oldOp && oldOp != op) - throw UsageError("only one operation may be specified"); - } - - if (!op) throw UsageError("no operation specified"); - - if (op != opDump && op != opRestore) /* !!! hack */ - store = openStore(op != opGC); - - op(opFlags, opArgs); -} - - -string programId = "nix-store"; diff --git a/src/nix-store/serve-protocol.hh b/src/nix-store/serve-protocol.hh deleted file mode 100644 index 69277bc1b9..0000000000 --- a/src/nix-store/serve-protocol.hh +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -namespace nix { - - -#define SERVE_MAGIC_1 0x390c9deb -#define SERVE_MAGIC_2 0x5452eecb - -#define SERVE_PROTOCOL_VERSION 0x101 -#define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00) -#define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff) - - -typedef enum { - cmdQuery = 0, - cmdSubstitute = 1, -} ServeCommand; - -typedef enum { - qCmdHave = 0, - qCmdInfo = 1, -} QueryCommand; - -} diff --git a/src/nix-store/xmlgraph.cc b/src/nix-store/xmlgraph.cc deleted file mode 100644 index 1b3ad3d28a..0000000000 --- a/src/nix-store/xmlgraph.cc +++ /dev/null @@ -1,71 +0,0 @@ -#include "xmlgraph.hh" -#include "util.hh" -#include "store-api.hh" - -#include - - -using std::cout; - -namespace nix { - - -static inline const string & xmlQuote(const string & s) -{ - // Luckily, store paths shouldn't contain any character that needs to be - // quoted. - return s; -} - - -static string makeEdge(const string & src, const string & dst) -{ - format f = format(" \n") - % xmlQuote(src) % xmlQuote(dst); - return f.str(); -} - - -static string makeNode(const string & id) -{ - format f = format(" \n") % xmlQuote(id); - return f.str(); -} - - -void printXmlGraph(const PathSet & roots) -{ - PathSet workList(roots); - PathSet doneSet; - - cout << "\n" - << "\n"; - - while (!workList.empty()) { - Path path = *(workList.begin()); - workList.erase(path); - - if (doneSet.find(path) != doneSet.end()) continue; - doneSet.insert(path); - - cout << makeNode(path); - - PathSet references; - store->queryReferences(path, references); - - for (PathSet::iterator i = references.begin(); - i != references.end(); ++i) - { - if (*i != path) { - workList.insert(*i); - cout << makeEdge(*i, path); - } - } - - } - - cout << "\n"; -} - - -} diff --git a/src/nix-store/xmlgraph.hh b/src/nix-store/xmlgraph.hh deleted file mode 100644 index c2216c5a46..0000000000 --- a/src/nix-store/xmlgraph.hh +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include "types.hh" - -namespace nix { - -void printXmlGraph(const PathSet & roots); - -} diff --git a/tests/add.sh b/tests/add.sh deleted file mode 100644 index e26e05843d..0000000000 --- a/tests/add.sh +++ /dev/null @@ -1,28 +0,0 @@ -source common.sh - -path1=$(nix-store --add ./dummy) -echo $path1 - -path2=$(nix-store --add-fixed sha256 --recursive ./dummy) -echo $path2 - -if test "$path1" != "$path2"; then - echo "nix-store --add and --add-fixed mismatch" - exit 1 -fi - -path3=$(nix-store --add-fixed sha256 ./dummy) -echo $path3 -test "$path1" != "$path3" || exit 1 - -path4=$(nix-store --add-fixed sha1 --recursive ./dummy) -echo $path4 -test "$path1" != "$path4" || exit 1 - -hash1=$(nix-store -q --hash $path1) -echo $hash1 - -hash2=$(nix-hash --type sha256 --base32 ./dummy) -echo $hash2 - -test "$hash1" = "sha256:$hash2" diff --git a/tests/binary-cache.sh b/tests/binary-cache.sh deleted file mode 100644 index 6f0c36f630..0000000000 --- a/tests/binary-cache.sh +++ /dev/null @@ -1,89 +0,0 @@ -source common.sh - -clearStore -clearManifests -clearCache - -# Create the binary cache. -outPath=$(nix-build dependencies.nix --no-out-link) - -nix-push --dest $cacheDir $outPath - - -# By default, a binary cache doesn't support "nix-env -qas", but does -# support installation. -clearStore -rm -f $NIX_STATE_DIR/binary-cache* - -export _NIX_CACHE_FILE_URLS=1 - -nix-env --option binary-caches "file://$cacheDir" -f dependencies.nix -qas \* | grep -- "---" - -nix-store --option binary-caches "file://$cacheDir" -r $outPath - -[ -x $outPath/program ] - - -# But with the right configuration, "nix-env -qas" should also work. -clearStore -rm -f $NIX_STATE_DIR/binary-cache* -echo "WantMassQuery: 1" >> $cacheDir/nix-cache-info - -nix-env --option binary-caches "file://$cacheDir" -f dependencies.nix -qas \* | grep -- "--S" - -x=$(nix-env -f dependencies.nix -qas \* --prebuilt-only) -[ -z "$x" ] - -nix-store --option binary-caches "file://$cacheDir" -r $outPath - -nix-store --check-validity $outPath -nix-store -qR $outPath | grep input-2 - - -# Test whether Nix notices if the NAR doesn't match the hash in the NAR info. -clearStore - -nar=$(ls $cacheDir/*.nar.xz | head -n1) -mv $nar $nar.good -mkdir -p $TEST_ROOT/empty -nix-store --dump $TEST_ROOT/empty | xz > $nar - -nix-build --option binary-caches "file://$cacheDir" dependencies.nix -o $TEST_ROOT/result 2>&1 | tee $TEST_ROOT/log -grep -q "hash mismatch in downloaded path" $TEST_ROOT/log - -mv $nar.good $nar - - -# Test whether this unsigned cache is rejected if the user requires signed caches. -clearStore - -rm -f $NIX_STATE_DIR/binary-cache* - -if nix-store --option binary-caches "file://$cacheDir" --option signed-binary-caches '*' -r $outPath; then - echo "unsigned binary cache incorrectly accepted" - exit 1 -fi - - -# Test whether fallback works if we have cached info but the -# corresponding NAR has disappeared. -clearStore - -nix-build --option binary-caches "file://$cacheDir" dependencies.nix --dry-run # get info - -mkdir $cacheDir/tmp -mv $cacheDir/*.nar* $cacheDir/tmp/ - -NIX_DEBUG_SUBST=1 nix-build --option binary-caches "file://$cacheDir" dependencies.nix -o $TEST_ROOT/result --fallback - -mv $cacheDir/tmp/* $cacheDir/ - - -# Test whether building works if the binary cache contains an -# incomplete closure. -clearStore - -rm $(grep -l "StorePath:.*dependencies-input-2" $cacheDir/*.narinfo) - -nix-build --option binary-caches "file://$cacheDir" dependencies.nix -o $TEST_ROOT/result 2>&1 | tee $TEST_ROOT/log -grep -q "Downloading" $TEST_ROOT/log diff --git a/tests/binary-patching.nix b/tests/binary-patching.nix deleted file mode 100644 index 8ed474d1f2..0000000000 --- a/tests/binary-patching.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ version }: - -with import ./config.nix; - -mkDerivation { - name = "foo-${toString version}"; - builder = builtins.toFile "builder.sh" - '' - mkdir $out - (for ((n = 1; n < 100000; n++)); do echo $n; done) > $out/foo - ${if version != 1 then '' - (for ((n = 100000; n < 110000; n++)); do echo $n; done) >> $out/foo - '' else ""} - ${if version == 3 then '' - echo foobar >> $out/foo - '' else ""} - ''; -} diff --git a/tests/binary-patching.sh b/tests/binary-patching.sh deleted file mode 100644 index 188be109a0..0000000000 --- a/tests/binary-patching.sh +++ /dev/null @@ -1,61 +0,0 @@ -source common.sh - -clearManifests - -mkdir -p $TEST_ROOT/cache2 $TEST_ROOT/patches - -RESULT=$TEST_ROOT/result - -# Build version 1 and 2 of the "foo" package. -nix-push --dest $TEST_ROOT/cache2 --manifest --bzip2 \ - $(nix-build -o $RESULT binary-patching.nix --arg version 1) -mv $TEST_ROOT/cache2/MANIFEST $TEST_ROOT/manifest1 - -out2=$(nix-build -o $RESULT binary-patching.nix --arg version 2) -nix-push --dest $TEST_ROOT/cache2 --manifest --bzip2 $out2 -mv $TEST_ROOT/cache2/MANIFEST $TEST_ROOT/manifest2 - -out3=$(nix-build -o $RESULT binary-patching.nix --arg version 3) -nix-push --dest $TEST_ROOT/cache2 --manifest --bzip2 $out3 -mv $TEST_ROOT/cache2/MANIFEST $TEST_ROOT/manifest3 - -rm $RESULT - -# Generate binary patches. -nix-generate-patches $TEST_ROOT/cache2 $TEST_ROOT/patches \ - file://$TEST_ROOT/patches $TEST_ROOT/manifest1 $TEST_ROOT/manifest2 - -nix-generate-patches $TEST_ROOT/cache2 $TEST_ROOT/patches \ - file://$TEST_ROOT/patches $TEST_ROOT/manifest2 $TEST_ROOT/manifest3 - -grep -q "patch {" $TEST_ROOT/manifest3 - -# Get rid of versions 2 and 3. -nix-store --delete $out2 $out3 - -# Pull the manifest containing the patches. -clearManifests -nix-pull file://$TEST_ROOT/manifest3 - -# Make sure that the download size prediction uses the patches rather -# than the full download. -nix-build -o $RESULT binary-patching.nix --arg version 3 --dry-run 2>&1 | grep -q "0.01 MiB" - -# Now rebuild it. This should use the two patches generated above. -rm -f $TEST_ROOT/var/log/nix/downloads -nix-build -o $RESULT binary-patching.nix --arg version 3 -rm $RESULT -[ "$(grep ' patch ' $TEST_ROOT/var/log/nix/downloads | wc -l)" -eq 2 ] - -# Add a patch from version 1 directly to version 3. -nix-generate-patches $TEST_ROOT/cache2 $TEST_ROOT/patches \ - file://$TEST_ROOT/patches $TEST_ROOT/manifest1 $TEST_ROOT/manifest3 - -# Rebuild version 3. This should use the direct patch rather than the -# sequence of two patches. -nix-store --delete $out2 $out3 -clearManifests -rm $TEST_ROOT/var/log/nix/downloads -nix-pull file://$TEST_ROOT/manifest3 -nix-build -o $RESULT binary-patching.nix --arg version 3 -[ "$(grep ' patch ' $TEST_ROOT/var/log/nix/downloads | wc -l)" -eq 1 ] diff --git a/tests/build-hook.hook.sh b/tests/build-hook.hook.sh deleted file mode 100755 index ff709985d3..0000000000 --- a/tests/build-hook.hook.sh +++ /dev/null @@ -1,23 +0,0 @@ -#! /bin/sh - -#set -x - -while read x y drv rest; do - - echo "HOOK for $drv" >&2 - - outPath=`sed 's/Derive(\[("out",\"\([^\"]*\)\".*/\1/' $drv` - - echo "output path is $outPath" >&2 - - if `echo $outPath | grep -q input-1`; then - echo "# accept" >&2 - read inputs - read outputs - mkdir $outPath - echo "BAR" > $outPath/foo - else - echo "# decline" >&2 - fi - -done \ No newline at end of file diff --git a/tests/build-hook.nix b/tests/build-hook.nix deleted file mode 100644 index 666cc6ef80..0000000000 --- a/tests/build-hook.nix +++ /dev/null @@ -1,22 +0,0 @@ -with import ./config.nix; - -let - - input1 = mkDerivation { - name = "build-hook-input-1"; - builder = ./dependencies.builder1.sh; - }; - - input2 = mkDerivation { - name = "build-hook-input-2"; - builder = ./dependencies.builder2.sh; - }; - -in - - mkDerivation { - name = "build-hook"; - builder = ./dependencies.builder0.sh; - input1 = " " + input1 + "/."; - input2 = " ${input2}/."; - } diff --git a/tests/build-hook.sh b/tests/build-hook.sh deleted file mode 100644 index 681f65cc3b..0000000000 --- a/tests/build-hook.sh +++ /dev/null @@ -1,10 +0,0 @@ -source common.sh - -export NIX_BUILD_HOOK="build-hook.hook.sh" - -outPath=$(nix-build build-hook.nix --no-out-link) - -echo "output path is $outPath" - -text=$(cat "$outPath"/foobar) -if test "$text" != "BARBAR"; then exit 1; fi diff --git a/tests/check-refs.nix b/tests/check-refs.nix deleted file mode 100644 index 63791fe160..0000000000 --- a/tests/check-refs.nix +++ /dev/null @@ -1,58 +0,0 @@ -with import ./config.nix; - -rec { - - dep = import ./dependencies.nix; - - makeTest = nr: args: mkDerivation ({ - name = "check-refs-" + toString nr; - } // args); - - src = builtins.toFile "aux-ref" "bla bla"; - - test1 = makeTest 1 { - builder = builtins.toFile "builder.sh" "mkdir $out; ln -s $dep $out/link"; - inherit dep; - }; - - test2 = makeTest 2 { - builder = builtins.toFile "builder.sh" "mkdir $out; ln -s ${src} $out/link"; - inherit dep; - }; - - test3 = makeTest 3 { - builder = builtins.toFile "builder.sh" "mkdir $out; ln -s $dep $out/link"; - allowedReferences = []; - inherit dep; - }; - - test4 = makeTest 4 { - builder = builtins.toFile "builder.sh" "mkdir $out; ln -s $dep $out/link"; - allowedReferences = [dep]; - inherit dep; - }; - - test5 = makeTest 5 { - builder = builtins.toFile "builder.sh" "mkdir $out"; - allowedReferences = []; - inherit dep; - }; - - test6 = makeTest 6 { - builder = builtins.toFile "builder.sh" "mkdir $out; ln -s $out $out/link"; - allowedReferences = []; - inherit dep; - }; - - test7 = makeTest 7 { - builder = builtins.toFile "builder.sh" "mkdir $out; ln -s $out $out/link"; - allowedReferences = ["out"]; - inherit dep; - }; - - test8 = makeTest 8 { - builder = builtins.toFile "builder.sh" "mkdir $out; ln -s ${test1} $out/link"; - inherit dep; - }; - -} diff --git a/tests/check-refs.sh b/tests/check-refs.sh deleted file mode 100644 index 08fe01ec18..0000000000 --- a/tests/check-refs.sh +++ /dev/null @@ -1,36 +0,0 @@ -source common.sh - -set -x - -RESULT=$TEST_ROOT/result - -dep=$(nix-build -o $RESULT check-refs.nix -A dep) - -# test1 references dep, not itself. -test1=$(nix-build -o $RESULT check-refs.nix -A test1) -! nix-store -q --references $test1 | grep -q $test1 -nix-store -q --references $test1 | grep -q $dep - -# test2 references src, not itself nor dep. -test2=$(nix-build -o $RESULT check-refs.nix -A test2) -! nix-store -q --references $test2 | grep -q $test2 -! nix-store -q --references $test2 | grep -q $dep -nix-store -q --references $test2 | grep -q aux-ref - -# test3 should fail (unallowed ref). -! nix-build -o $RESULT check-refs.nix -A test3 - -# test4 should succeed. -nix-build -o $RESULT check-refs.nix -A test4 - -# test5 should succeed. -nix-build -o $RESULT check-refs.nix -A test5 - -# test6 should fail (unallowed self-ref). -! nix-build -o $RESULT check-refs.nix -A test6 - -# test7 should succeed (allowed self-ref). -nix-build -o $RESULT check-refs.nix -A test7 - -# test8 should fail (toFile depending on derivation output). -! nix-build -o $RESULT check-refs.nix -A test8 diff --git a/tests/common.sh.in b/tests/common.sh.in deleted file mode 100644 index 48ca7d2ddd..0000000000 --- a/tests/common.sh.in +++ /dev/null @@ -1,89 +0,0 @@ -set -e - -datadir="@datadir@" - -export TEST_ROOT=$(pwd)/test-tmp -export NIX_STORE_DIR -if ! NIX_STORE_DIR=$(readlink -f $TEST_ROOT/store 2> /dev/null); then - # Maybe the build directory is symlinked. - export NIX_IGNORE_SYMLINK_STORE=1 - NIX_STORE_DIR=$TEST_ROOT/store -fi -export NIX_LOCALSTATE_DIR=$TEST_ROOT/var -export NIX_LOG_DIR=$TEST_ROOT/var/log/nix -export NIX_STATE_DIR=$TEST_ROOT/var/nix -export NIX_DB_DIR=$TEST_ROOT/db -export NIX_CONF_DIR=$TEST_ROOT/etc -export NIX_MANIFESTS_DIR=$TEST_ROOT/var/nix/manifests -export _NIX_TEST_SHARED=$TEST_ROOT/shared -export NIX_REMOTE=$NIX_REMOTE_ - -export PATH=@bindir@:$PATH - -export NIX_BUILD_HOOK= -export dot=@dot@ -export xmllint="@xmllint@" -export xsltproc="@xsltproc@" -export SHELL="@bash@" - -export version=@PACKAGE_VERSION@ -export system=@system@ - -cacheDir=$TEST_ROOT/binary-cache - -readLink() { - ls -l "$1" | sed 's/.*->\ //' -} - -clearProfiles() { - profiles="$NIX_STATE_DIR"/profiles - rm -rf $profiles -} - -clearStore() { - echo "clearing store..." - chmod -R +w "$NIX_STORE_DIR" - rm -rf "$NIX_STORE_DIR" - mkdir "$NIX_STORE_DIR" - rm -rf "$NIX_DB_DIR" - mkdir "$NIX_DB_DIR" - nix-store --init - clearProfiles - rm -f "$NIX_STATE_DIR"/gcroots/auto/* - rm -f "$NIX_STATE_DIR"/gcroots/ref -} - -clearManifests() { - rm -f $NIX_STATE_DIR/manifests/* -} - -clearCache() { - rm -rf "$cacheDir" -} - -startDaemon() { - # Start the daemon, wait for the socket to appear. !!! - # ‘nix-daemon’ should have an option to fork into the background. - rm -f $NIX_STATE_DIR/daemon-socket/socket - nix-daemon & - for ((i = 0; i < 30; i++)); do - if [ -e $NIX_STATE_DIR/daemon-socket/socket ]; then break; fi - sleep 1 - done - pidDaemon=$! - trap "kill -9 $pidDaemon" EXIT - export NIX_REMOTE=daemon -} - -killDaemon() { - kill -9 $pidDaemon - wait $pidDaemon || true - trap "" EXIT -} - -fail() { - echo "$1" - exit 1 -} - -set -x diff --git a/tests/config.nix b/tests/config.nix deleted file mode 100644 index 6244a15fa4..0000000000 --- a/tests/config.nix +++ /dev/null @@ -1,20 +0,0 @@ -with import ; - -rec { - inherit shell; - - path = coreutils; - - system = builtins.currentSystem; - - shared = builtins.getEnv "_NIX_TEST_SHARED"; - - mkDerivation = args: - derivation ({ - inherit system; - builder = shell; - args = ["-e" args.builder]; - PATH = path; - } // removeAttrs args ["builder" "meta"]) - // { meta = args.meta or {}; }; -} diff --git a/tests/dependencies.builder0.sh b/tests/dependencies.builder0.sh deleted file mode 100644 index c37bf909a5..0000000000 --- a/tests/dependencies.builder0.sh +++ /dev/null @@ -1,16 +0,0 @@ -[ "${input1: -2}" = /. ] -[ "${input2: -2}" = /. ] - -mkdir $out -echo $(cat $input1/foo)$(cat $input2/bar) > $out/foobar - -ln -s $input2 $out/input-2 - -# Self-reference. -ln -s $out $out/self - -# Executable. -echo program > $out/program -chmod +x $out/program - -echo FOO diff --git a/tests/dependencies.builder1.sh b/tests/dependencies.builder1.sh deleted file mode 100644 index 4b006a17d7..0000000000 --- a/tests/dependencies.builder1.sh +++ /dev/null @@ -1,2 +0,0 @@ -mkdir $out -echo FOO > $out/foo diff --git a/tests/dependencies.builder2.sh b/tests/dependencies.builder2.sh deleted file mode 100644 index 4f886fdb3a..0000000000 --- a/tests/dependencies.builder2.sh +++ /dev/null @@ -1,2 +0,0 @@ -mkdir $out -echo BAR > $out/bar diff --git a/tests/dependencies.nix b/tests/dependencies.nix deleted file mode 100644 index 687237add8..0000000000 --- a/tests/dependencies.nix +++ /dev/null @@ -1,23 +0,0 @@ -with import ./config.nix; - -let { - - input1 = mkDerivation { - name = "dependencies-input-1"; - builder = ./dependencies.builder1.sh; - }; - - input2 = mkDerivation { - name = "dependencies-input-2"; - builder = "${./dependencies.builder2.sh}"; - }; - - body = mkDerivation { - name = "dependencies"; - builder = ./dependencies.builder0.sh + "/FOOBAR/../."; - input1 = input1 + "/."; - input2 = "${input2}/."; - meta.description = "Random test package"; - }; - -} diff --git a/tests/dependencies.sh b/tests/dependencies.sh deleted file mode 100644 index df204d185d..0000000000 --- a/tests/dependencies.sh +++ /dev/null @@ -1,52 +0,0 @@ -source common.sh - -clearStore - -drvPath=$(nix-instantiate dependencies.nix) - -echo "derivation is $drvPath" - -nix-store -q --tree "$drvPath" | grep ' +---.*builder1.sh' - -# Test Graphviz graph generation. -nix-store -q --graph "$drvPath" > $TEST_ROOT/graph -if test -n "$dot"; then - # Does it parse? - $dot < $TEST_ROOT/graph -fi - -outPath=$(nix-store -rvv "$drvPath") || fail "build failed" - -# Test Graphviz graph generation. -nix-store -q --graph "$outPath" > $TEST_ROOT/graph -if test -n "$dot"; then - # Does it parse? - $dot < $TEST_ROOT/graph -fi - -nix-store -q --tree "$outPath" | grep '+---.*dependencies-input-2' - -echo "output path is $outPath" - -text=$(cat "$outPath"/foobar) -if test "$text" != "FOOBAR"; then exit 1; fi - -deps=$(nix-store -quR "$drvPath") - -echo "output closure contains $deps" - -# The output path should be in the closure. -echo "$deps" | grep -q "$outPath" - -# Input-1 is not retained. -if echo "$deps" | grep -q "dependencies-input-1"; then exit 1; fi - -# Input-2 is retained. -input2OutPath=$(echo "$deps" | grep "dependencies-input-2") - -# The referrers closure of input-2 should include outPath. -nix-store -q --referrers-closure "$input2OutPath" | grep "$outPath" - -# Check that the derivers are set properly. -test $(nix-store -q --deriver "$outPath") = "$drvPath" -nix-store -q --deriver "$input2OutPath" | grep -q -- "-input-2.drv" diff --git a/tests/dump-db.sh b/tests/dump-db.sh deleted file mode 100644 index 234b7ac026..0000000000 --- a/tests/dump-db.sh +++ /dev/null @@ -1,20 +0,0 @@ -source common.sh - -clearStore - -path=$(nix-build dependencies.nix -o $TEST_ROOT/result) - -deps="$(nix-store -qR $TEST_ROOT/result)" - -nix-store --dump-db > $TEST_ROOT/dump - -rm -rf $NIX_DB_DIR - -nix-store --load-db < $TEST_ROOT/dump - -deps2="$(nix-store -qR $TEST_ROOT/result)" - -[ "$deps" = "$deps2" ]; - -nix-store --dump-db > $TEST_ROOT/dump2 -cmp $TEST_ROOT/dump $TEST_ROOT/dump2 diff --git a/tests/export-graph.nix b/tests/export-graph.nix deleted file mode 100644 index fdac9583db..0000000000 --- a/tests/export-graph.nix +++ /dev/null @@ -1,29 +0,0 @@ -with import ./config.nix; - -rec { - - printRefs = - '' - echo $exportReferencesGraph - while read path; do - read drv - read nrRefs - echo "$path has $nrRefs references" - echo "$path" >> $out - for ((n = 0; n < $nrRefs; n++)); do read ref; echo "ref $ref"; test -e "$ref"; done - done < refs - ''; - - foo."bar.runtimeGraph" = mkDerivation { - name = "dependencies"; - builder = builtins.toFile "build-graph-builder" "${printRefs}"; - exportReferencesGraph = ["refs" (import ./dependencies.nix)]; - }; - - foo."bar.buildGraph" = mkDerivation { - name = "dependencies"; - builder = builtins.toFile "build-graph-builder" "${printRefs}"; - exportReferencesGraph = ["refs" (import ./dependencies.nix).drvPath]; - }; - -} diff --git a/tests/export-graph.sh b/tests/export-graph.sh deleted file mode 100644 index a6fd690544..0000000000 --- a/tests/export-graph.sh +++ /dev/null @@ -1,30 +0,0 @@ -source common.sh - -clearStore -clearProfiles - -checkRef() { - nix-store -q --references $TEST_ROOT/result | grep -q "$1" || fail "missing reference $1" -} - -# Test the export of the runtime dependency graph. - -outPath=$(nix-build ./export-graph.nix -A 'foo."bar.runtimeGraph"' -o $TEST_ROOT/result) - -test $(nix-store -q --references $TEST_ROOT/result | wc -l) = 2 || fail "bad nr of references" - -checkRef input-2 -for i in $(cat $outPath); do checkRef $i; done - -# Test the export of the build-time dependency graph. - -nix-store --gc # should force rebuild of input-1 - -outPath=$(nix-build ./export-graph.nix -A 'foo."bar.buildGraph"' -o $TEST_ROOT/result) - -checkRef input-1 -checkRef input-1.drv -checkRef input-2 -checkRef input-2.drv - -for i in $(cat $outPath); do checkRef $i; done diff --git a/tests/export.sh b/tests/export.sh deleted file mode 100644 index ec7560f197..0000000000 --- a/tests/export.sh +++ /dev/null @@ -1,31 +0,0 @@ -source common.sh - -clearStore - -outPath=$(nix-build dependencies.nix --no-out-link) - -nix-store --export $outPath > $TEST_ROOT/exp - -nix-store --export $(nix-store -qR $outPath) > $TEST_ROOT/exp_all - - -clearStore - -if nix-store --import < $TEST_ROOT/exp; then - echo "importing a non-closure should fail" - exit 1 -fi - - -clearStore - -nix-store --import < $TEST_ROOT/exp_all - -nix-store --export $(nix-store -qR $outPath) > $TEST_ROOT/exp_all2 - - -clearStore - -# Regression test: the derivers in exp_all2 are empty, which shouldn't -# cause a failure. -nix-store --import < $TEST_ROOT/exp_all2 diff --git a/tests/fallback.sh b/tests/fallback.sh deleted file mode 100644 index f3a6b50515..0000000000 --- a/tests/fallback.sh +++ /dev/null @@ -1,20 +0,0 @@ -source common.sh - -clearStore - -drvPath=$(nix-instantiate simple.nix) -echo "derivation is $drvPath" - -outPath=$(nix-store -q --fallback "$drvPath") -echo "output path is $outPath" - -# Build with a substitute that fails. This should fail. -export NIX_SUBSTITUTERS=$(pwd)/substituter2.sh -if nix-store -r "$drvPath"; then echo unexpected fallback; exit 1; fi - -# Build with a substitute that fails. This should fall back to a source build. -export NIX_SUBSTITUTERS=$(pwd)/substituter2.sh -nix-store -r --fallback "$drvPath" - -text=$(cat "$outPath"/hello) -if test "$text" != "Hello World!"; then exit 1; fi diff --git a/tests/fetchurl.nix b/tests/fetchurl.nix deleted file mode 100644 index 2abcc039a8..0000000000 --- a/tests/fetchurl.nix +++ /dev/null @@ -1,6 +0,0 @@ -{ filename, sha256 }: - -import { - url = "file://${filename}"; - inherit sha256; -} diff --git a/tests/fetchurl.sh b/tests/fetchurl.sh deleted file mode 100644 index 6acc87eafc..0000000000 --- a/tests/fetchurl.sh +++ /dev/null @@ -1,9 +0,0 @@ -source common.sh - -clearStore - -hash=$(nix-hash --flat --type sha256 ./fetchurl.nix) - -outPath=$(nix-build ./fetchurl.nix --argstr filename $(pwd)/fetchurl.nix --argstr sha256 $hash --no-out-link) - -cmp $outPath fetchurl.nix diff --git a/tests/filter-source.nix b/tests/filter-source.nix deleted file mode 100644 index a620f0fda5..0000000000 --- a/tests/filter-source.nix +++ /dev/null @@ -1,12 +0,0 @@ -with import ./config.nix; - -mkDerivation { - name = "filter"; - builder = builtins.toFile "builder" "ln -s $input $out"; - input = - let filter = path: type: - type != "symlink" - && baseNameOf path != "foo" - && !((import ./lang/lib.nix).hasSuffix ".bak" (baseNameOf path)); - in builtins.filterSource filter ./test-tmp/filterin; -} diff --git a/tests/filter-source.sh b/tests/filter-source.sh deleted file mode 100644 index f7a096ed60..0000000000 --- a/tests/filter-source.sh +++ /dev/null @@ -1,20 +0,0 @@ -source common.sh - -rm -rf $TEST_ROOT/filterin -mkdir $TEST_ROOT/filterin -mkdir $TEST_ROOT/filterin/foo -touch $TEST_ROOT/filterin/foo/bar -touch $TEST_ROOT/filterin/xyzzy -touch $TEST_ROOT/filterin/b -touch $TEST_ROOT/filterin/bak -touch $TEST_ROOT/filterin/bla.c.bak -ln -s xyzzy $TEST_ROOT/filterin/link - -nix-build ./filter-source.nix -o $TEST_ROOT/filterout - -set -x -test ! -e $TEST_ROOT/filterout/foo/bar -test -e $TEST_ROOT/filterout/xyzzy -test -e $TEST_ROOT/filterout/bak -test ! -e $TEST_ROOT/filterout/bla.c.bak -test ! -L $TEST_ROOT/filterout/link diff --git a/tests/fixed.builder1.sh b/tests/fixed.builder1.sh deleted file mode 100644 index c41bb2b9a6..0000000000 --- a/tests/fixed.builder1.sh +++ /dev/null @@ -1,3 +0,0 @@ -if test "$IMPURE_VAR1" != "foo"; then exit 1; fi -if test "$IMPURE_VAR2" != "bar"; then exit 1; fi -echo "Hello World!" > $out diff --git a/tests/fixed.builder2.sh b/tests/fixed.builder2.sh deleted file mode 100644 index 31ea1579a5..0000000000 --- a/tests/fixed.builder2.sh +++ /dev/null @@ -1,6 +0,0 @@ -echo dummy: $dummy -if test -n "$dummy"; then sleep 2; fi -mkdir $out -mkdir $out/bla -echo "Hello World!" > $out/foo -ln -s foo $out/bar diff --git a/tests/fixed.nix b/tests/fixed.nix deleted file mode 100644 index 76580ffa19..0000000000 --- a/tests/fixed.nix +++ /dev/null @@ -1,50 +0,0 @@ -with import ./config.nix; - -rec { - - f2 = dummy: builder: mode: algo: hash: mkDerivation { - name = "fixed"; - inherit builder; - outputHashMode = mode; - outputHashAlgo = algo; - outputHash = hash; - inherit dummy; - impureEnvVars = ["IMPURE_VAR1" "IMPURE_VAR2"]; - }; - - f = f2 ""; - - good = [ - (f ./fixed.builder1.sh "flat" "md5" "8ddd8be4b179a529afa5f2ffae4b9858") - (f ./fixed.builder1.sh "flat" "sha1" "a0b65939670bc2c010f4d5d6a0b3e4e4590fb92b") - (f ./fixed.builder2.sh "recursive" "md5" "3670af73070fa14077ad74e0f5ea4e42") - (f ./fixed.builder2.sh "recursive" "sha1" "vw46m23bizj4n8afrc0fj19wrp7mj3c0") - ]; - - good2 = [ - # Yes, this looks fscked up: builder2 doesn't have that result. - # But Nix sees that an output with the desired hash already - # exists, and will refrain from building it. - (f ./fixed.builder2.sh "flat" "md5" "8ddd8be4b179a529afa5f2ffae4b9858") - ]; - - sameAsAdd = - f ./fixed.builder2.sh "recursive" "sha256" "1ixr6yd3297ciyp9im522dfxpqbkhcw0pylkb2aab915278fqaik"; - - bad = [ - (f ./fixed.builder1.sh "flat" "md5" "0ddd8be4b179a529afa5f2ffae4b9858") - ]; - - reallyBad = [ - # Hash too short, and not base-32 either. - (f ./fixed.builder1.sh "flat" "md5" "ddd8be4b179a529afa5f2ffae4b9858") - ]; - - # Test for building two derivations in parallel that produce the - # same output path because they're fixed-output derivations. - parallelSame = [ - (f2 "foo" ./fixed.builder2.sh "recursive" "md5" "3670af73070fa14077ad74e0f5ea4e42") - (f2 "bar" ./fixed.builder2.sh "recursive" "md5" "3670af73070fa14077ad74e0f5ea4e42") - ]; - -} diff --git a/tests/fixed.sh b/tests/fixed.sh deleted file mode 100644 index ed0d06dd29..0000000000 --- a/tests/fixed.sh +++ /dev/null @@ -1,52 +0,0 @@ -source common.sh - -clearStore - -export IMPURE_VAR1=foo -export IMPURE_VAR2=bar - -echo 'testing good...' -nix-build fixed.nix -A good --no-out-link - -echo 'testing good2...' -nix-build fixed.nix -A good2 --no-out-link - -echo 'testing bad...' -nix-build fixed.nix -A bad --no-out-link && fail "should fail" - -echo 'testing reallyBad...' -nix-instantiate fixed.nix -A reallyBad && fail "should fail" - -# While we're at it, check attribute selection a bit more. -echo 'testing attribute selection...' -test $(nix-instantiate fixed.nix -A good.1 | wc -l) = 1 - -# Test parallel builds of derivations that produce the same output. -# Only one should run at the same time. -echo 'testing parallelSame...' -clearStore -nix-build fixed.nix -A parallelSame --no-out-link -j2 - -# Fixed-output derivations with a recursive SHA-256 hash should -# produce the same path as "nix-store --add". -echo 'testing sameAsAdd...' -out=$(nix-build fixed.nix -A sameAsAdd --no-out-link) - -# This is what fixed.builder2 produces... -rm -rf $TEST_ROOT/fixed -mkdir $TEST_ROOT/fixed -mkdir $TEST_ROOT/fixed/bla -echo "Hello World!" > $TEST_ROOT/fixed/foo -ln -s foo $TEST_ROOT/fixed/bar - -out2=$(nix-store --add $TEST_ROOT/fixed) -echo $out2 -test "$out" = "$out2" || exit 1 - -out3=$(nix-store --add-fixed --recursive sha256 $TEST_ROOT/fixed) -echo $out3 -test "$out" = "$out3" || exit 1 - -out4=$(nix-store --print-fixed-path --recursive sha256 "1ixr6yd3297ciyp9im522dfxpqbkhcw0pylkb2aab915278fqaik" fixed) -echo $out4 -test "$out" = "$out4" || exit 1 diff --git a/tests/gc-concurrent.builder.sh b/tests/gc-concurrent.builder.sh deleted file mode 100644 index 0cd67df3ae..0000000000 --- a/tests/gc-concurrent.builder.sh +++ /dev/null @@ -1,13 +0,0 @@ -mkdir $out -echo $(cat $input1/foo)$(cat $input2/bar) > $out/foobar - -sleep 10 - -# $out should not have been GC'ed while we were sleeping, but just in -# case... -mkdir -p $out - -# Check that the GC hasn't deleted the lock on our output. -test -e "$out.lock" - -ln -s $input2 $out/input-2 diff --git a/tests/gc-concurrent.nix b/tests/gc-concurrent.nix deleted file mode 100644 index c0595cc471..0000000000 --- a/tests/gc-concurrent.nix +++ /dev/null @@ -1,27 +0,0 @@ -with import ./config.nix; - -rec { - - input1 = mkDerivation { - name = "dependencies-input-1"; - builder = ./dependencies.builder1.sh; - }; - - input2 = mkDerivation { - name = "dependencies-input-2"; - builder = ./dependencies.builder2.sh; - }; - - test1 = mkDerivation { - name = "gc-concurrent"; - builder = ./gc-concurrent.builder.sh; - inherit input1 input2; - }; - - test2 = mkDerivation { - name = "gc-concurrent2"; - builder = ./gc-concurrent2.builder.sh; - inherit input1 input2; - }; - -} diff --git a/tests/gc-concurrent.sh b/tests/gc-concurrent.sh deleted file mode 100644 index 0bc5a12d31..0000000000 --- a/tests/gc-concurrent.sh +++ /dev/null @@ -1,58 +0,0 @@ -source common.sh - -clearStore - -drvPath1=$(nix-instantiate gc-concurrent.nix -A test1) -outPath1=$(nix-store -q $drvPath1) - -drvPath2=$(nix-instantiate gc-concurrent.nix -A test2) -outPath2=$(nix-store -q $drvPath2) - -drvPath3=$(nix-instantiate simple.nix) -outPath3=$(nix-store -r $drvPath3) - -! test -e $outPath3.lock -touch $outPath3.lock - -rm -f "$NIX_STATE_DIR"/gcroots/foo* -ln -s $drvPath2 "$NIX_STATE_DIR"/gcroots/foo -ln -s $outPath3 "$NIX_STATE_DIR"/gcroots/foo2 - -# Start build #1 in the background. It starts immediately. -nix-store -rvv "$drvPath1" & -pid1=$! - -# Start build #2 in the background after 10 seconds. -(sleep 10 && nix-store -rvv "$drvPath2") & -pid2=$! - -# Run the garbage collector while the build is running. -sleep 6 -nix-collect-garbage - -# Wait for build #1/#2 to finish. -echo waiting for pid $pid1 to finish... -wait $pid1 -echo waiting for pid $pid2 to finish... -wait $pid2 - -# Check that the root of build #1 and its dependencies haven't been -# deleted. The should not be deleted by the GC because they were -# being built during the GC. -cat $outPath1/foobar -cat $outPath1/input-2/bar - -# Check that build #2 has succeeded. It should succeed because the -# derivation is a GC root. -cat $outPath2/foobar - -rm -f "$NIX_STATE_DIR"/gcroots/foo* - -# The collector should have deleted lock files for paths that have -# been built previously. -! test -e $outPath3.lock - -# If we run the collector now, it should delete outPath1/2. -nix-collect-garbage -! test -e $outPath1 -! test -e $outPath2 diff --git a/tests/gc-concurrent2.builder.sh b/tests/gc-concurrent2.builder.sh deleted file mode 100644 index 4bfb33103e..0000000000 --- a/tests/gc-concurrent2.builder.sh +++ /dev/null @@ -1,7 +0,0 @@ -mkdir $out -echo $(cat $input1/foo)$(cat $input2/bar)xyzzy > $out/foobar - -# Check that the GC hasn't deleted the lock on our output. -test -e "$out.lock" - -sleep 6 diff --git a/tests/gc-runtime.nix b/tests/gc-runtime.nix deleted file mode 100644 index ee5980bdff..0000000000 --- a/tests/gc-runtime.nix +++ /dev/null @@ -1,17 +0,0 @@ -with import ./config.nix; - -mkDerivation { - name = "gc-runtime"; - builder = - # Test inline source file definitions. - builtins.toFile "builder.sh" '' - mkdir $out - - cat > $out/program < $TEST_ROOT/vector - hash=$(nix-hash $EXTRA --flat --type "$1" $TEST_ROOT/vector) - if test "$hash" != "$3"; then - echo "hash $1, expected $3, got $hash" - exit 1 - fi -} - -try md5 "" "d41d8cd98f00b204e9800998ecf8427e" -try md5 "a" "0cc175b9c0f1b6a831c399e269772661" -try md5 "abc" "900150983cd24fb0d6963f7d28e17f72" -try md5 "message digest" "f96b697d7cb7938d525a2f31aaf161d0" -try md5 "abcdefghijklmnopqrstuvwxyz" "c3fcd3d76192e4007dfb496cca67e13b" -try md5 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" "d174ab98d277d9f5a5611c2c9f419d9f" -try md5 "12345678901234567890123456789012345678901234567890123456789012345678901234567890" "57edf4a22be3c955ac49da2e2107b67a" - -try sha1 "abc" "a9993e364706816aba3e25717850c26c9cd0d89d" -try sha1 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" "84983e441c3bd26ebaae4aa1f95129e5e54670f1" - -try sha256 "abc" "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad" -try sha256 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1" - -EXTRA=--base32 -try sha256 "abc" "1b8m03r63zqhnjf7l5wnldhh7c134ap5vpj0850ymkq1iyzicy5s" -EXTRA= - -try2 () { - hash=$(nix-hash --type "$1" $TEST_ROOT/hash-path) - if test "$hash" != "$2"; then - echo "hash $1, expected $2, got $hash" - exit 1 - fi -} - -rm -rf $TEST_ROOT/hash-path -mkdir $TEST_ROOT/hash-path -echo "Hello World" > $TEST_ROOT/hash-path/hello - -try2 md5 "ea9b55537dd4c7e104515b2ccfaf4100" - -# Execute bit matters. -chmod +x $TEST_ROOT/hash-path/hello -try2 md5 "20f3ffe011d4cfa7d72bfabef7882836" - -# Mtime and other bits don't. -touch -r . $TEST_ROOT/hash-path/hello -chmod 744 $TEST_ROOT/hash-path/hello -try2 md5 "20f3ffe011d4cfa7d72bfabef7882836" - -# File type (e.g., symlink) does. -rm $TEST_ROOT/hash-path/hello -ln -s x $TEST_ROOT/hash-path/hello -try2 md5 "f78b733a68f5edbdf9413899339eaa4a" - -# Conversion. -test $(nix-hash --type sha256 --to-base32 "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad") = "1b8m03r63zqhnjf7l5wnldhh7c134ap5vpj0850ymkq1iyzicy5s" -test $(nix-hash --type sha256 --to-base16 "1b8m03r63zqhnjf7l5wnldhh7c134ap5vpj0850ymkq1iyzicy5s") = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad" -test $(nix-hash --type sha1 --to-base32 "800d59cfcd3c05e900cb4e214be48f6b886a08df") = "vw46m23bizj4n8afrc0fj19wrp7mj3c0" -test $(nix-hash --type sha1 --to-base16 "vw46m23bizj4n8afrc0fj19wrp7mj3c0") = "800d59cfcd3c05e900cb4e214be48f6b886a08df" diff --git a/tests/import-derivation.nix b/tests/import-derivation.nix deleted file mode 100644 index 91adcd288f..0000000000 --- a/tests/import-derivation.nix +++ /dev/null @@ -1,23 +0,0 @@ -with import ./config.nix; - -let - - bar = mkDerivation { - name = "bar"; - builder = builtins.toFile "builder.sh" - '' - echo 'builtins.add 123 456' > $out - ''; - }; - - value = import bar; - -in - -mkDerivation { - name = "foo"; - builder = builtins.toFile "builder.sh" - '' - echo -n FOO${toString value} > $out - ''; -} diff --git a/tests/import-derivation.sh b/tests/import-derivation.sh deleted file mode 100644 index 98d61ef49b..0000000000 --- a/tests/import-derivation.sh +++ /dev/null @@ -1,12 +0,0 @@ -source common.sh - -clearStore - -if nix-instantiate --readonly-mode ./import-derivation.nix; then - echo "read-only evaluation of an imported derivation unexpectedly failed" - exit 1 -fi - -outPath=$(nix-build ./import-derivation.nix --no-out-link) - -[ "$(cat $outPath)" = FOO579 ] diff --git a/tests/init.sh b/tests/init.sh deleted file mode 100644 index 37480f52bd..0000000000 --- a/tests/init.sh +++ /dev/null @@ -1,32 +0,0 @@ -source common.sh - -echo "NIX_STORE_DIR=$NIX_STORE_DIR NIX_DB_DIR=$NIX_DB_DIR" - -test -n "$TEST_ROOT" -if test -d "$TEST_ROOT"; then - chmod -R u+w "$TEST_ROOT" - rm -rf "$TEST_ROOT" -fi -mkdir "$TEST_ROOT" - -mkdir "$NIX_STORE_DIR" -mkdir "$NIX_LOCALSTATE_DIR" -mkdir -p "$NIX_LOG_DIR"/drvs -mkdir "$NIX_STATE_DIR" -mkdir "$NIX_DB_DIR" -mkdir "$NIX_CONF_DIR" - -cat > "$NIX_CONF_DIR"/nix.conf < ./dummy diff --git a/tests/install-package.sh b/tests/install-package.sh deleted file mode 100644 index 653dfee4c8..0000000000 --- a/tests/install-package.sh +++ /dev/null @@ -1,21 +0,0 @@ -source common.sh - -# Note: this test expects to be run *after* nix-push.sh. - -drvPath=$(nix-instantiate ./dependencies.nix) -outPath=$(nix-store -q $drvPath) - -clearStore -clearProfiles - -cat > $TEST_ROOT/foo.nixpkg <&1 | grep -q Hello -! nix-instantiate --show-trace --eval -E 'builtins.addErrorContext "Hello" 123' 2>&1 | grep -q Hello -nix-instantiate --show-trace --eval -E 'builtins.addErrorContext "Hello" (throw "Foo")' 2>&1 | grep -q Hello - -set +x - -fail=0 - -for i in lang/parse-fail-*.nix; do - echo "parsing $i (should fail)"; - i=$(basename $i .nix) - if nix-instantiate --parse - < lang/$i.nix; then - echo "FAIL: $i shouldn't parse" - fail=1 - fi -done - -for i in lang/parse-okay-*.nix; do - echo "parsing $i (should succeed)"; - i=$(basename $i .nix) - if ! nix-instantiate --parse - < lang/$i.nix > lang/$i.out; then - echo "FAIL: $i should parse" - fail=1 - fi -done - -for i in lang/eval-fail-*.nix; do - echo "evaluating $i (should fail)"; - i=$(basename $i .nix) - if nix-instantiate --eval lang/$i.nix; then - echo "FAIL: $i shouldn't evaluate" - fail=1 - fi -done - -for i in lang/eval-okay-*.nix; do - echo "evaluating $i (should succeed)"; - i=$(basename $i .nix) - - if test -e lang/$i.exp; then - flags= - if test -e lang/$i.flags; then - flags=$(cat lang/$i.flags) - fi - if ! NIX_PATH=lang/dir3:lang/dir4_PATH nix-instantiate $flags --eval --strict lang/$i.nix > lang/$i.out; then - echo "FAIL: $i should evaluate" - fail=1 - elif ! diff lang/$i.out lang/$i.exp; then - echo "FAIL: evaluation result of $i not as expected" - fail=1 - fi - fi - - if test -e lang/$i.exp.xml; then - if ! nix-instantiate --eval --xml --no-location --strict \ - lang/$i.nix > lang/$i.out.xml; then - echo "FAIL: $i should evaluate" - fail=1 - elif ! cmp -s lang/$i.out.xml lang/$i.exp.xml; then - echo "FAIL: XML evaluation result of $i not as expected" - fail=1 - fi - fi -done - -exit $fail diff --git a/tests/lang/dir1/a.nix b/tests/lang/dir1/a.nix deleted file mode 100644 index 231f150c57..0000000000 --- a/tests/lang/dir1/a.nix +++ /dev/null @@ -1 +0,0 @@ -"a" diff --git a/tests/lang/dir2/a.nix b/tests/lang/dir2/a.nix deleted file mode 100644 index 170df520ab..0000000000 --- a/tests/lang/dir2/a.nix +++ /dev/null @@ -1 +0,0 @@ -"X" diff --git a/tests/lang/dir2/b.nix b/tests/lang/dir2/b.nix deleted file mode 100644 index 19010cc35c..0000000000 --- a/tests/lang/dir2/b.nix +++ /dev/null @@ -1 +0,0 @@ -"b" diff --git a/tests/lang/dir3/a.nix b/tests/lang/dir3/a.nix deleted file mode 100644 index 170df520ab..0000000000 --- a/tests/lang/dir3/a.nix +++ /dev/null @@ -1 +0,0 @@ -"X" diff --git a/tests/lang/dir3/b.nix b/tests/lang/dir3/b.nix deleted file mode 100644 index 170df520ab..0000000000 --- a/tests/lang/dir3/b.nix +++ /dev/null @@ -1 +0,0 @@ -"X" diff --git a/tests/lang/dir3/c.nix b/tests/lang/dir3/c.nix deleted file mode 100644 index cdf158597e..0000000000 --- a/tests/lang/dir3/c.nix +++ /dev/null @@ -1 +0,0 @@ -"c" diff --git a/tests/lang/dir4/a.nix b/tests/lang/dir4/a.nix deleted file mode 100644 index 170df520ab..0000000000 --- a/tests/lang/dir4/a.nix +++ /dev/null @@ -1 +0,0 @@ -"X" diff --git a/tests/lang/dir4/c.nix b/tests/lang/dir4/c.nix deleted file mode 100644 index 170df520ab..0000000000 --- a/tests/lang/dir4/c.nix +++ /dev/null @@ -1 +0,0 @@ -"X" diff --git a/tests/lang/eval-fail-abort.nix b/tests/lang/eval-fail-abort.nix deleted file mode 100644 index 75c51bceb5..0000000000 --- a/tests/lang/eval-fail-abort.nix +++ /dev/null @@ -1 +0,0 @@ -if true then abort "this should fail" else 1 diff --git a/tests/lang/eval-fail-antiquoted-path.nix b/tests/lang/eval-fail-antiquoted-path.nix deleted file mode 100644 index f2f08107b5..0000000000 --- a/tests/lang/eval-fail-antiquoted-path.nix +++ /dev/null @@ -1,4 +0,0 @@ -# This must fail to evaluate, since ./fnord doesn't exist. If it did -# exist, it would produce "/nix/store/-fnord/xyzzy" (with an -# appropriate context). -"${./fnord}/xyzzy" diff --git a/tests/lang/eval-fail-assert.nix b/tests/lang/eval-fail-assert.nix deleted file mode 100644 index 3b7a1e8bf0..0000000000 --- a/tests/lang/eval-fail-assert.nix +++ /dev/null @@ -1,5 +0,0 @@ -let { - x = arg: assert arg == "y"; 123; - - body = x "x"; -} \ No newline at end of file diff --git a/tests/lang/eval-fail-bad-antiquote-1.nix b/tests/lang/eval-fail-bad-antiquote-1.nix deleted file mode 100644 index ffe9c983c2..0000000000 --- a/tests/lang/eval-fail-bad-antiquote-1.nix +++ /dev/null @@ -1 +0,0 @@ -"${x: x}" diff --git a/tests/lang/eval-fail-bad-antiquote-2.nix b/tests/lang/eval-fail-bad-antiquote-2.nix deleted file mode 100644 index 3745235ce9..0000000000 --- a/tests/lang/eval-fail-bad-antiquote-2.nix +++ /dev/null @@ -1 +0,0 @@ -"${./fnord}" diff --git a/tests/lang/eval-fail-bad-antiquote-3.nix b/tests/lang/eval-fail-bad-antiquote-3.nix deleted file mode 100644 index 65b9d4f505..0000000000 --- a/tests/lang/eval-fail-bad-antiquote-3.nix +++ /dev/null @@ -1 +0,0 @@ -''${x: x}'' diff --git a/tests/lang/eval-fail-blackhole.nix b/tests/lang/eval-fail-blackhole.nix deleted file mode 100644 index 81133b511c..0000000000 --- a/tests/lang/eval-fail-blackhole.nix +++ /dev/null @@ -1,5 +0,0 @@ -let { - body = x; - x = y; - y = x; -} diff --git a/tests/lang/eval-fail-missing-arg.nix b/tests/lang/eval-fail-missing-arg.nix deleted file mode 100644 index c4be9797c5..0000000000 --- a/tests/lang/eval-fail-missing-arg.nix +++ /dev/null @@ -1 +0,0 @@ -({x, y, z}: x + y + z) {x = "foo"; z = "bar";} diff --git a/tests/lang/eval-fail-remove.nix b/tests/lang/eval-fail-remove.nix deleted file mode 100644 index 539e0eb0a6..0000000000 --- a/tests/lang/eval-fail-remove.nix +++ /dev/null @@ -1,5 +0,0 @@ -let { - attrs = {x = 123; y = 456;}; - - body = (removeAttrs attrs ["x"]).x; -} \ No newline at end of file diff --git a/tests/lang/eval-fail-scope-5.nix b/tests/lang/eval-fail-scope-5.nix deleted file mode 100644 index f89a65a99b..0000000000 --- a/tests/lang/eval-fail-scope-5.nix +++ /dev/null @@ -1,10 +0,0 @@ -let { - - x = "a"; - y = "b"; - - f = {x ? y, y ? x}: x + y; - - body = f {}; - -} diff --git a/tests/lang/eval-fail-substring.nix b/tests/lang/eval-fail-substring.nix deleted file mode 100644 index f37c2bc0a1..0000000000 --- a/tests/lang/eval-fail-substring.nix +++ /dev/null @@ -1 +0,0 @@ -builtins.substring (builtins.sub 0 1) 1 "x" diff --git a/tests/lang/eval-fail-to-path.nix b/tests/lang/eval-fail-to-path.nix deleted file mode 100644 index 5e322bc313..0000000000 --- a/tests/lang/eval-fail-to-path.nix +++ /dev/null @@ -1 +0,0 @@ -builtins.toPath "foo/bar" diff --git a/tests/lang/eval-fail-undeclared-arg.nix b/tests/lang/eval-fail-undeclared-arg.nix deleted file mode 100644 index cafdf16362..0000000000 --- a/tests/lang/eval-fail-undeclared-arg.nix +++ /dev/null @@ -1 +0,0 @@ -({x, z}: x + z) {x = "foo"; y = "bla"; z = "bar";} diff --git a/tests/lang/eval-okay-arithmetic.exp b/tests/lang/eval-okay-arithmetic.exp deleted file mode 100644 index b195055b7a..0000000000 --- a/tests/lang/eval-okay-arithmetic.exp +++ /dev/null @@ -1 +0,0 @@ -2188 diff --git a/tests/lang/eval-okay-arithmetic.nix b/tests/lang/eval-okay-arithmetic.nix deleted file mode 100644 index bbbbc4691d..0000000000 --- a/tests/lang/eval-okay-arithmetic.nix +++ /dev/null @@ -1,55 +0,0 @@ -with import ./lib.nix; - -let { - - /* Supposedly tail recursive version: - - range_ = accum: first: last: - if first == last then ([first] ++ accum) - else range_ ([first] ++ accum) (builtins.add first 1) last; - - range = range_ []; - */ - - x = 12; - - err = abort "urgh"; - - body = sum - [ (sum (range 1 50)) - (123 + 456) - (0 + -10 + -(-11) + -x) - (10 - 7 - -2) - (10 - (6 - -1)) - (10 - 1 + 2) - (3 * 4 * 5) - (56088 / 123 / 2) - (3 + 4 * const 5 0 - 6 / id 2) - - (if 3 < 7 then 1 else err) - (if 7 < 3 then err else 1) - (if 3 < 3 then err else 1) - - (if 3 <= 7 then 1 else err) - (if 7 <= 3 then err else 1) - (if 3 <= 3 then 1 else err) - - (if 3 > 7 then err else 1) - (if 7 > 3 then 1 else err) - (if 3 > 3 then err else 1) - - (if 3 >= 7 then err else 1) - (if 7 >= 3 then 1 else err) - (if 3 >= 3 then 1 else err) - - (if 2 > 1 == 1 < 2 then 1 else err) - (if 1 + 2 * 3 >= 7 then 1 else err) - (if 1 + 2 * 3 < 7 then err else 1) - - # Not integer, but so what. - (if "aa" < "ab" then 1 else err) - (if "aa" < "aa" then err else 1) - (if "foo" < "foobar" then 1 else err) - ]; - -} diff --git a/tests/lang/eval-okay-attrnames.exp b/tests/lang/eval-okay-attrnames.exp deleted file mode 100644 index b4aa387e07..0000000000 --- a/tests/lang/eval-okay-attrnames.exp +++ /dev/null @@ -1 +0,0 @@ -"newxfoonewxy" diff --git a/tests/lang/eval-okay-attrnames.nix b/tests/lang/eval-okay-attrnames.nix deleted file mode 100644 index 978138f0c0..0000000000 --- a/tests/lang/eval-okay-attrnames.nix +++ /dev/null @@ -1,11 +0,0 @@ -with import ./lib.nix; - -let - - attrs = {y = "y"; x = "x"; foo = "foo";} // rec {x = "newx"; bar = x;}; - - names = builtins.attrNames attrs; - - values = map (name: builtins.getAttr name attrs) names; - -in concat values diff --git a/tests/lang/eval-okay-attrs.exp b/tests/lang/eval-okay-attrs.exp deleted file mode 100644 index 45b0f829eb..0000000000 --- a/tests/lang/eval-okay-attrs.exp +++ /dev/null @@ -1 +0,0 @@ -987 diff --git a/tests/lang/eval-okay-attrs.nix b/tests/lang/eval-okay-attrs.nix deleted file mode 100644 index 810b31a5da..0000000000 --- a/tests/lang/eval-okay-attrs.nix +++ /dev/null @@ -1,5 +0,0 @@ -let { - as = { x = 123; y = 456; } // { z = 789; } // { z = 987; }; - - body = if as ? a then as.a else assert as ? z; as.z; -} diff --git a/tests/lang/eval-okay-attrs2.exp b/tests/lang/eval-okay-attrs2.exp deleted file mode 100644 index 45b0f829eb..0000000000 --- a/tests/lang/eval-okay-attrs2.exp +++ /dev/null @@ -1 +0,0 @@ -987 diff --git a/tests/lang/eval-okay-attrs2.nix b/tests/lang/eval-okay-attrs2.nix deleted file mode 100644 index 9e06b83ac1..0000000000 --- a/tests/lang/eval-okay-attrs2.nix +++ /dev/null @@ -1,10 +0,0 @@ -let { - as = { x = 123; y = 456; } // { z = 789; } // { z = 987; }; - - A = "a"; - Z = "z"; - - body = if builtins.hasAttr A as - then builtins.getAttr A as - else assert builtins.hasAttr Z as; builtins.getAttr Z as; -} diff --git a/tests/lang/eval-okay-attrs3.exp b/tests/lang/eval-okay-attrs3.exp deleted file mode 100644 index 19de4fdf79..0000000000 --- a/tests/lang/eval-okay-attrs3.exp +++ /dev/null @@ -1 +0,0 @@ -"foo 22 80 itchyxac" diff --git a/tests/lang/eval-okay-attrs3.nix b/tests/lang/eval-okay-attrs3.nix deleted file mode 100644 index f29de11fe6..0000000000 --- a/tests/lang/eval-okay-attrs3.nix +++ /dev/null @@ -1,22 +0,0 @@ -let - - config = - { - services.sshd.enable = true; - services.sshd.port = 22; - services.httpd.port = 80; - hostName = "itchy"; - a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z = "x"; - foo = { - a = "a"; - b.c = "c"; - }; - }; - -in - if config.services.sshd.enable - then "foo ${toString config.services.sshd.port} ${toString config.services.httpd.port} ${config.hostName}" - + "${config.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z}" - + "${config.foo.a}" - + "${config.foo.b.c}" - else "bar" diff --git a/tests/lang/eval-okay-attrs4.exp b/tests/lang/eval-okay-attrs4.exp deleted file mode 100644 index 1851731442..0000000000 --- a/tests/lang/eval-okay-attrs4.exp +++ /dev/null @@ -1 +0,0 @@ -[ true false true false false true false false ] diff --git a/tests/lang/eval-okay-attrs4.nix b/tests/lang/eval-okay-attrs4.nix deleted file mode 100644 index 43ec81210f..0000000000 --- a/tests/lang/eval-okay-attrs4.nix +++ /dev/null @@ -1,7 +0,0 @@ -let - - as = { x.y.z = 123; a.b.c = 456; }; - - bs = null; - -in [ (as ? x) (as ? y) (as ? x.y.z) (as ? x.y.z.a) (as ? x.y.a) (as ? a.b.c) (bs ? x) (bs ? x.y.z) ] diff --git a/tests/lang/eval-okay-attrs5.exp b/tests/lang/eval-okay-attrs5.exp deleted file mode 100644 index ce0430d780..0000000000 --- a/tests/lang/eval-okay-attrs5.exp +++ /dev/null @@ -1 +0,0 @@ -[ 123 "foo" 456 456 "foo" "xyzzy" "xyzzy" true ] diff --git a/tests/lang/eval-okay-attrs5.nix b/tests/lang/eval-okay-attrs5.nix deleted file mode 100644 index 0a98b8fdff..0000000000 --- a/tests/lang/eval-okay-attrs5.nix +++ /dev/null @@ -1,21 +0,0 @@ -with import ./lib.nix; - -let - - as = { x.y.z = 123; a.b.c = 456; }; - - bs = { f-o-o.bar = "foo"; }; - - or = x: y: x || y; - -in - [ as.x.y.z - as.foo or "foo" - as.x.y.bla or as.a.b.c - as.a.b.c or as.x.y.z - as.x.y.bla or bs.f-o-o.bar or "xyzzy" - as.x.y.bla or bs.bar.foo or "xyzzy" - 123.bla or null.foo or "xyzzy" - # Backwards compatibility test. - (fold or [] [true false false]) - ] diff --git a/tests/lang/eval-okay-autoargs.exp b/tests/lang/eval-okay-autoargs.exp deleted file mode 100644 index 7a8391786a..0000000000 --- a/tests/lang/eval-okay-autoargs.exp +++ /dev/null @@ -1 +0,0 @@ -"xyzzy!xyzzy!foobar" diff --git a/tests/lang/eval-okay-autoargs.flags b/tests/lang/eval-okay-autoargs.flags deleted file mode 100644 index ae37622544..0000000000 --- a/tests/lang/eval-okay-autoargs.flags +++ /dev/null @@ -1 +0,0 @@ ---arg lib import(lang/lib.nix) --argstr xyzzy xyzzy! -A result diff --git a/tests/lang/eval-okay-autoargs.nix b/tests/lang/eval-okay-autoargs.nix deleted file mode 100644 index 815f51b1d6..0000000000 --- a/tests/lang/eval-okay-autoargs.nix +++ /dev/null @@ -1,15 +0,0 @@ -let - - foobar = "foobar"; - -in - -{ xyzzy2 ? xyzzy # mutually recursive args -, xyzzy ? "blaat" # will be overridden by --argstr -, fb ? foobar -, lib # will be set by --arg -}: - -{ - result = lib.concat [xyzzy xyzzy2 fb]; -} diff --git a/tests/lang/eval-okay-builtins.exp b/tests/lang/eval-okay-builtins.exp deleted file mode 100644 index 0661686d61..0000000000 --- a/tests/lang/eval-okay-builtins.exp +++ /dev/null @@ -1 +0,0 @@ -/foo diff --git a/tests/lang/eval-okay-builtins.nix b/tests/lang/eval-okay-builtins.nix deleted file mode 100644 index e9d65e88a8..0000000000 --- a/tests/lang/eval-okay-builtins.nix +++ /dev/null @@ -1,12 +0,0 @@ -assert builtins ? currentSystem; -assert !builtins ? __currentSystem; - -let { - - x = if builtins ? dirOf then builtins.dirOf /foo/bar else ""; - - y = if builtins ? fnord then builtins.fnord "foo" else ""; - - body = x + y; - -} diff --git a/tests/lang/eval-okay-closure.exp.xml b/tests/lang/eval-okay-closure.exp.xml deleted file mode 100644 index dffc03a998..0000000000 --- a/tests/lang/eval-okay-closure.exp.xml +++ /dev/null @@ -1,343 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/lang/eval-okay-closure.nix b/tests/lang/eval-okay-closure.nix deleted file mode 100644 index cccd4dc357..0000000000 --- a/tests/lang/eval-okay-closure.nix +++ /dev/null @@ -1,13 +0,0 @@ -let - - closure = builtins.genericClosure { - startSet = [{key = 80;}]; - operator = {key, foo ? false}: - if builtins.lessThan key 0 - then [] - else [{key = builtins.sub key 9;} {key = builtins.sub key 13; foo = true;}]; - }; - - sort = (import ./lib.nix).sortBy (a: b: builtins.lessThan a.key b.key); - -in sort closure diff --git a/tests/lang/eval-okay-concat.exp b/tests/lang/eval-okay-concat.exp deleted file mode 100644 index bb4bbd5774..0000000000 --- a/tests/lang/eval-okay-concat.exp +++ /dev/null @@ -1 +0,0 @@ -[ 1 2 3 4 5 6 7 8 9 ] diff --git a/tests/lang/eval-okay-concat.nix b/tests/lang/eval-okay-concat.nix deleted file mode 100644 index d158a9bf05..0000000000 --- a/tests/lang/eval-okay-concat.nix +++ /dev/null @@ -1 +0,0 @@ -[1 2 3] ++ [4 5 6] ++ [7 8 9] diff --git a/tests/lang/eval-okay-context.exp b/tests/lang/eval-okay-context.exp deleted file mode 100644 index 2f535bdbc4..0000000000 --- a/tests/lang/eval-okay-context.exp +++ /dev/null @@ -1 +0,0 @@ -"foo eval-okay-context.nix bar" diff --git a/tests/lang/eval-okay-context.nix b/tests/lang/eval-okay-context.nix deleted file mode 100644 index b3f1748975..0000000000 --- a/tests/lang/eval-okay-context.nix +++ /dev/null @@ -1,6 +0,0 @@ -let s = "foo ${builtins.substring 33 100 (baseNameOf ./eval-okay-context.nix)} bar"; -in - if s == "foo eval-okay-context.nix bar" - then abort "context not discarded" - else builtins.unsafeDiscardStringContext s - diff --git a/tests/lang/eval-okay-curpos.exp b/tests/lang/eval-okay-curpos.exp deleted file mode 100644 index 65fd65b4d0..0000000000 --- a/tests/lang/eval-okay-curpos.exp +++ /dev/null @@ -1 +0,0 @@ -[ 3 7 4 9 ] diff --git a/tests/lang/eval-okay-curpos.nix b/tests/lang/eval-okay-curpos.nix deleted file mode 100644 index b79553df0b..0000000000 --- a/tests/lang/eval-okay-curpos.nix +++ /dev/null @@ -1,5 +0,0 @@ -# Bla -let - x = __curPos; - y = __curPos; -in [ x.line x.column y.line y.column ] diff --git a/tests/lang/eval-okay-delayed-with-inherit.exp b/tests/lang/eval-okay-delayed-with-inherit.exp deleted file mode 100644 index eaacb55c1a..0000000000 --- a/tests/lang/eval-okay-delayed-with-inherit.exp +++ /dev/null @@ -1 +0,0 @@ -"b-overridden" diff --git a/tests/lang/eval-okay-delayed-with-inherit.nix b/tests/lang/eval-okay-delayed-with-inherit.nix deleted file mode 100644 index 84b388c271..0000000000 --- a/tests/lang/eval-okay-delayed-with-inherit.nix +++ /dev/null @@ -1,24 +0,0 @@ -let - pkgs_ = with pkgs; { - a = derivation { - name = "a"; - system = builtins.currentSystem; - builder = "/bin/sh"; - args = [ "-c" "touch $out" ]; - inherit b; - }; - - inherit b; - }; - - packageOverrides = p: { - b = derivation { - name = "b-overridden"; - system = builtins.currentSystem; - builder = "/bin/sh"; - args = [ "-c" "touch $out" ]; - }; - }; - - pkgs = pkgs_ // (packageOverrides pkgs_); -in pkgs.a.b.name diff --git a/tests/lang/eval-okay-delayed-with.exp b/tests/lang/eval-okay-delayed-with.exp deleted file mode 100644 index 8e7c61ab8e..0000000000 --- a/tests/lang/eval-okay-delayed-with.exp +++ /dev/null @@ -1 +0,0 @@ -"b-overridden b-overridden a" diff --git a/tests/lang/eval-okay-delayed-with.nix b/tests/lang/eval-okay-delayed-with.nix deleted file mode 100644 index 3fb023e1cd..0000000000 --- a/tests/lang/eval-okay-delayed-with.nix +++ /dev/null @@ -1,29 +0,0 @@ -let - - pkgs_ = with pkgs; { - a = derivation { - name = "a"; - system = builtins.currentSystem; - builder = "/bin/sh"; - args = [ "-c" "touch $out" ]; - inherit b; - }; - - b = derivation { - name = "b"; - system = builtins.currentSystem; - builder = "/bin/sh"; - args = [ "-c" "touch $out" ]; - inherit a; - }; - - c = b; - }; - - packageOverrides = pkgs: with pkgs; { - b = derivation (b.drvAttrs // { name = "${b.name}-overridden"; }); - }; - - pkgs = pkgs_ // (packageOverrides pkgs_); - -in "${pkgs.a.b.name} ${pkgs.c.name} ${pkgs.b.a.name}" diff --git a/tests/lang/eval-okay-dynamic-attrs-2.exp b/tests/lang/eval-okay-dynamic-attrs-2.exp deleted file mode 100644 index 27ba77ddaf..0000000000 --- a/tests/lang/eval-okay-dynamic-attrs-2.exp +++ /dev/null @@ -1 +0,0 @@ -true diff --git a/tests/lang/eval-okay-dynamic-attrs-2.nix b/tests/lang/eval-okay-dynamic-attrs-2.nix deleted file mode 100644 index 6d57bf8549..0000000000 --- a/tests/lang/eval-okay-dynamic-attrs-2.nix +++ /dev/null @@ -1 +0,0 @@ -{ a."${"b"}" = true; a."${"c"}" = false; }.a.b diff --git a/tests/lang/eval-okay-dynamic-attrs-bare.exp b/tests/lang/eval-okay-dynamic-attrs-bare.exp deleted file mode 100644 index df8750afc0..0000000000 --- a/tests/lang/eval-okay-dynamic-attrs-bare.exp +++ /dev/null @@ -1 +0,0 @@ -{ binds = true; hasAttrs = true; multiAttrs = true; recBinds = true; selectAttrs = true; selectOrAttrs = true; } diff --git a/tests/lang/eval-okay-dynamic-attrs-bare.nix b/tests/lang/eval-okay-dynamic-attrs-bare.nix deleted file mode 100644 index 0dbe15e638..0000000000 --- a/tests/lang/eval-okay-dynamic-attrs-bare.nix +++ /dev/null @@ -1,17 +0,0 @@ -let - aString = "a"; - - bString = "b"; -in { - hasAttrs = { a.b = null; } ? ${aString}.b; - - selectAttrs = { a.b = true; }.a.${bString}; - - selectOrAttrs = { }.${aString} or true; - - binds = { ${aString}."${bString}c" = true; }.a.bc; - - recBinds = rec { ${bString} = a; a = true; }.b; - - multiAttrs = { ${aString} = true; ${bString} = false; }.a; -} diff --git a/tests/lang/eval-okay-dynamic-attrs.exp b/tests/lang/eval-okay-dynamic-attrs.exp deleted file mode 100644 index df8750afc0..0000000000 --- a/tests/lang/eval-okay-dynamic-attrs.exp +++ /dev/null @@ -1 +0,0 @@ -{ binds = true; hasAttrs = true; multiAttrs = true; recBinds = true; selectAttrs = true; selectOrAttrs = true; } diff --git a/tests/lang/eval-okay-dynamic-attrs.nix b/tests/lang/eval-okay-dynamic-attrs.nix deleted file mode 100644 index ee02ac7e65..0000000000 --- a/tests/lang/eval-okay-dynamic-attrs.nix +++ /dev/null @@ -1,17 +0,0 @@ -let - aString = "a"; - - bString = "b"; -in { - hasAttrs = { a.b = null; } ? "${aString}".b; - - selectAttrs = { a.b = true; }.a."${bString}"; - - selectOrAttrs = { }."${aString}" or true; - - binds = { "${aString}"."${bString}c" = true; }.a.bc; - - recBinds = rec { "${bString}" = a; a = true; }.b; - - multiAttrs = { "${aString}" = true; "${bString}" = false; }.a; -} diff --git a/tests/lang/eval-okay-elem.exp b/tests/lang/eval-okay-elem.exp deleted file mode 100644 index 3cf6c0e962..0000000000 --- a/tests/lang/eval-okay-elem.exp +++ /dev/null @@ -1 +0,0 @@ -[ true false 30 ] diff --git a/tests/lang/eval-okay-elem.nix b/tests/lang/eval-okay-elem.nix deleted file mode 100644 index 71ea7a4ed0..0000000000 --- a/tests/lang/eval-okay-elem.nix +++ /dev/null @@ -1,6 +0,0 @@ -with import ./lib.nix; - -let xs = range 10 40; in - -[ (builtins.elem 23 xs) (builtins.elem 42 xs) (builtins.elemAt xs 20) ] - diff --git a/tests/lang/eval-okay-empty-args.exp b/tests/lang/eval-okay-empty-args.exp deleted file mode 100644 index cb5537d5d7..0000000000 --- a/tests/lang/eval-okay-empty-args.exp +++ /dev/null @@ -1 +0,0 @@ -"ab" diff --git a/tests/lang/eval-okay-empty-args.nix b/tests/lang/eval-okay-empty-args.nix deleted file mode 100644 index 78c133afdd..0000000000 --- a/tests/lang/eval-okay-empty-args.nix +++ /dev/null @@ -1 +0,0 @@ -({}: {x,y,}: "${x}${y}") {} {x = "a"; y = "b";} diff --git a/tests/lang/eval-okay-eq-derivations.exp b/tests/lang/eval-okay-eq-derivations.exp deleted file mode 100644 index ec04aab6ae..0000000000 --- a/tests/lang/eval-okay-eq-derivations.exp +++ /dev/null @@ -1 +0,0 @@ -[ true true true false ] diff --git a/tests/lang/eval-okay-eq-derivations.nix b/tests/lang/eval-okay-eq-derivations.nix deleted file mode 100644 index d526cb4a21..0000000000 --- a/tests/lang/eval-okay-eq-derivations.nix +++ /dev/null @@ -1,10 +0,0 @@ -let - - drvA1 = derivation { name = "a"; builder = "/foo"; system = "i686-linux"; }; - drvA2 = derivation { name = "a"; builder = "/foo"; system = "i686-linux"; }; - drvA3 = derivation { name = "a"; builder = "/foo"; system = "i686-linux"; } // { dummy = 1; }; - - drvC1 = derivation { name = "c"; builder = "/foo"; system = "i686-linux"; }; - drvC2 = derivation { name = "c"; builder = "/bar"; system = "i686-linux"; }; - -in [ (drvA1 == drvA1) (drvA1 == drvA2) (drvA1 == drvA3) (drvC1 == drvC2) ] diff --git a/tests/lang/eval-okay-eq.exp.disabled b/tests/lang/eval-okay-eq.exp.disabled deleted file mode 100644 index 2015847b65..0000000000 --- a/tests/lang/eval-okay-eq.exp.disabled +++ /dev/null @@ -1 +0,0 @@ -Bool(True) diff --git a/tests/lang/eval-okay-eq.nix b/tests/lang/eval-okay-eq.nix deleted file mode 100644 index 73d200b381..0000000000 --- a/tests/lang/eval-okay-eq.nix +++ /dev/null @@ -1,3 +0,0 @@ -["foobar" (rec {x = 1; y = x;})] -== -[("foo" + "bar") ({x = 1; y = 1;})] diff --git a/tests/lang/eval-okay-filter.exp b/tests/lang/eval-okay-filter.exp deleted file mode 100644 index 355d51c27d..0000000000 --- a/tests/lang/eval-okay-filter.exp +++ /dev/null @@ -1 +0,0 @@ -[ 0 2 4 6 8 10 100 102 104 106 108 110 ] diff --git a/tests/lang/eval-okay-filter.nix b/tests/lang/eval-okay-filter.nix deleted file mode 100644 index 85109b0d0e..0000000000 --- a/tests/lang/eval-okay-filter.nix +++ /dev/null @@ -1,5 +0,0 @@ -with import ./lib.nix; - -builtins.filter - (x: x / 2 * 2 == x) - (builtins.concatLists [ (range 0 10) (range 100 110) ]) diff --git a/tests/lang/eval-okay-flatten.exp b/tests/lang/eval-okay-flatten.exp deleted file mode 100644 index b979b2b8b9..0000000000 --- a/tests/lang/eval-okay-flatten.exp +++ /dev/null @@ -1 +0,0 @@ -"1234567" diff --git a/tests/lang/eval-okay-flatten.nix b/tests/lang/eval-okay-flatten.nix deleted file mode 100644 index fe911e9683..0000000000 --- a/tests/lang/eval-okay-flatten.nix +++ /dev/null @@ -1,8 +0,0 @@ -with import ./lib.nix; - -let { - - l = ["1" "2" ["3" ["4"] ["5" "6"]] "7"]; - - body = concat (flatten l); -} diff --git a/tests/lang/eval-okay-functionargs.exp.xml b/tests/lang/eval-okay-functionargs.exp.xml deleted file mode 100644 index 651f54c363..0000000000 --- a/tests/lang/eval-okay-functionargs.exp.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/tests/lang/eval-okay-functionargs.nix b/tests/lang/eval-okay-functionargs.nix deleted file mode 100644 index 68dca62ee1..0000000000 --- a/tests/lang/eval-okay-functionargs.nix +++ /dev/null @@ -1,80 +0,0 @@ -let - - stdenvFun = { }: { name = "stdenv"; }; - stdenv2Fun = { }: { name = "stdenv2"; }; - fetchurlFun = { stdenv }: assert stdenv.name == "stdenv"; { name = "fetchurl"; }; - atermFun = { stdenv, fetchurl }: { name = "aterm-${stdenv.name}"; }; - aterm2Fun = { stdenv, fetchurl }: { name = "aterm2-${stdenv.name}"; }; - nixFun = { stdenv, fetchurl, aterm }: { name = "nix-${stdenv.name}-${aterm.name}"; }; - - mplayerFun = - { stdenv, fetchurl, enableX11 ? false, xorg ? null, enableFoo ? true, foo ? null }: - assert stdenv.name == "stdenv2"; - assert enableX11 -> xorg.libXv.name == "libXv"; - assert enableFoo -> foo != null; - { name = "mplayer-${stdenv.name}.${xorg.libXv.name}-${xorg.libX11.name}"; }; - - makeOverridable = f: origArgs: f origArgs // - { override = newArgs: - makeOverridable f (origArgs // (if builtins.isFunction newArgs then newArgs origArgs else newArgs)); - }; - - callPackage_ = pkgs: f: args: - makeOverridable f ((builtins.intersectAttrs (builtins.functionArgs f) pkgs) // args); - - allPackages = - { overrides ? (pkgs: pkgsPrev: { }) }: - let - callPackage = callPackage_ pkgs; - pkgs = pkgsStd // (overrides pkgs pkgsStd); - pkgsStd = { - inherit pkgs; - stdenv = callPackage stdenvFun { }; - stdenv2 = callPackage stdenv2Fun { }; - fetchurl = callPackage fetchurlFun { }; - aterm = callPackage atermFun { }; - xorg = callPackage xorgFun { }; - mplayer = callPackage mplayerFun { stdenv = pkgs.stdenv2; enableFoo = false; }; - nix = callPackage nixFun { }; - }; - in pkgs; - - libX11Fun = { stdenv, fetchurl }: { name = "libX11"; }; - libX11_2Fun = { stdenv, fetchurl }: { name = "libX11_2"; }; - libXvFun = { stdenv, fetchurl, libX11 }: { name = "libXv"; }; - - xorgFun = - { pkgs }: - let callPackage = callPackage_ (pkgs // pkgs.xorg); in - { - libX11 = callPackage libX11Fun { }; - libXv = callPackage libXvFun { }; - }; - -in - -let - - pkgs = allPackages { }; - - pkgs2 = allPackages { - overrides = pkgs: pkgsPrev: { - stdenv = pkgs.stdenv2; - nix = pkgsPrev.nix.override { aterm = aterm2Fun { inherit (pkgs) stdenv fetchurl; }; }; - xorg = pkgsPrev.xorg // { libX11 = libX11_2Fun { inherit (pkgs) stdenv fetchurl; }; }; - }; - }; - -in - - [ pkgs.stdenv.name - pkgs.fetchurl.name - pkgs.aterm.name - pkgs2.aterm.name - pkgs.xorg.libX11.name - pkgs.xorg.libXv.name - pkgs.mplayer.name - pkgs2.mplayer.name - pkgs.nix.name - pkgs2.nix.name - ] diff --git a/tests/lang/eval-okay-getattrpos.exp b/tests/lang/eval-okay-getattrpos.exp deleted file mode 100644 index 469249bbc6..0000000000 --- a/tests/lang/eval-okay-getattrpos.exp +++ /dev/null @@ -1 +0,0 @@ -{ column = 5; file = "eval-okay-getattrpos.nix"; line = 3; } diff --git a/tests/lang/eval-okay-getattrpos.nix b/tests/lang/eval-okay-getattrpos.nix deleted file mode 100644 index ca6b079615..0000000000 --- a/tests/lang/eval-okay-getattrpos.nix +++ /dev/null @@ -1,6 +0,0 @@ -let - as = { - foo = "bar"; - }; - pos = builtins.unsafeGetAttrPos "foo" as; -in { inherit (pos) column line; file = baseNameOf pos.file; } diff --git a/tests/lang/eval-okay-getenv.exp b/tests/lang/eval-okay-getenv.exp deleted file mode 100644 index 14e24d4190..0000000000 --- a/tests/lang/eval-okay-getenv.exp +++ /dev/null @@ -1 +0,0 @@ -"foobar" diff --git a/tests/lang/eval-okay-getenv.nix b/tests/lang/eval-okay-getenv.nix deleted file mode 100644 index 4cfec5f553..0000000000 --- a/tests/lang/eval-okay-getenv.nix +++ /dev/null @@ -1 +0,0 @@ -builtins.getEnv "TEST_VAR" + (if builtins.getEnv "NO_SUCH_VAR" == "" then "bar" else "bla") diff --git a/tests/lang/eval-okay-hash.exp b/tests/lang/eval-okay-hash.exp deleted file mode 100644 index 7bbe452bcc..0000000000 --- a/tests/lang/eval-okay-hash.exp +++ /dev/null @@ -1 +0,0 @@ -[ "d41d8cd98f00b204e9800998ecf8427e" "6c69ee7f211c640419d5366cc076ae46" "bb3438fbabd460ea6dbd27d153e2233b" "da39a3ee5e6b4b0d3255bfef95601890afd80709" "cd54e8568c1b37cf1e5badb0779bcbf382212189" "6d12e10b1d331dad210e47fd25d4f260802b7e77" "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" "900a4469df00ccbfd0c145c6d1e4b7953dd0afafadd7534e3a4019e8d38fc663" "ad0387b3bd8652f730ca46d25f9c170af0fd589f42e7f23f5a9e6412d97d7e56" ] diff --git a/tests/lang/eval-okay-hash.nix b/tests/lang/eval-okay-hash.nix deleted file mode 100644 index 2fff17f849..0000000000 --- a/tests/lang/eval-okay-hash.nix +++ /dev/null @@ -1,7 +0,0 @@ -let - md5 = builtins.hashString "md5"; - sha1 = builtins.hashString "sha1"; - sha256 = builtins.hashString "sha256"; - strings = [ "" "text 1" "text 2" ]; -in - (builtins.map md5 strings) ++ (builtins.map sha1 strings) ++ (builtins.map sha256 strings) diff --git a/tests/lang/eval-okay-if.exp b/tests/lang/eval-okay-if.exp deleted file mode 100644 index 00750edc07..0000000000 --- a/tests/lang/eval-okay-if.exp +++ /dev/null @@ -1 +0,0 @@ -3 diff --git a/tests/lang/eval-okay-if.nix b/tests/lang/eval-okay-if.nix deleted file mode 100644 index 23e4c74d50..0000000000 --- a/tests/lang/eval-okay-if.nix +++ /dev/null @@ -1 +0,0 @@ -if "foo" != "f" + "oo" then 1 else if false then 2 else 3 diff --git a/tests/lang/eval-okay-ind-string.exp b/tests/lang/eval-okay-ind-string.exp deleted file mode 100644 index 886219dcf6..0000000000 --- a/tests/lang/eval-okay-ind-string.exp +++ /dev/null @@ -1 +0,0 @@ -"This is an indented multi-line string\nliteral. An amount of whitespace at\nthe start of each line matching the minimum\nindentation of all lines in the string\nliteral together will be removed. Thus,\nin this case four spaces will be\nstripped from each line, even though\n THIS LINE is indented six spaces.\n\nAlso, empty lines don't count in the\ndetermination of the indentation level (the\nprevious empty line has indentation 0, but\nit doesn't matter).\nIf the string starts with whitespace\n followed by a newline, it's stripped, but\n that's not the case here. Two spaces are\n stripped because of the \" \" at the start. \nThis line is indented\na bit further.\nAnti-quotations, like so, are\nalso allowed.\n The \\ is not special here.\n' can be followed by any character except another ', e.g. 'x'.\nLikewise for $, e.g. $$ or $varName.\nBut ' followed by ' is special, as is $ followed by {.\nIf you want them, use anti-quotations: '', ${.\n Tabs are not interpreted as whitespace (since we can't guess\n what tab settings are intended), so don't use them.\n\tThis line starts with a space and a tab, so only one\n space will be stripped from each line.\nAlso note that if the last line (just before the closing ' ')\nconsists only of whitespace, it's ignored. But here there is\nsome non-whitespace stuff, so the line isn't removed. \nThis shows a hacky way to preserve an empty line after the start.\nBut there's no reason to do so: you could just repeat the empty\nline.\n Similarly you can force an indentation level,\n in this case to 2 spaces. This works because the anti-quote\n is significant (not whitespace).\nstart on network-interfaces\n\nstart script\n\n rm -f /var/run/opengl-driver\n ln -sf 123 /var/run/opengl-driver\n\n rm -f /var/log/slim.log\n \nend script\n\nenv SLIM_CFGFILE=abc\nenv SLIM_THEMESDIR=def\nenv FONTCONFIG_FILE=/etc/fonts/fonts.conf \t\t\t\t# !!! cleanup\nenv XKB_BINDIR=foo/bin \t\t\t\t# Needed for the Xkb extension.\nenv LD_LIBRARY_PATH=libX11/lib:libXext/lib:/usr/lib/ # related to xorg-sys-opengl - needed to load libglx for (AI)GLX support (for compiz)\n\nenv XORG_DRI_DRIVER_PATH=nvidiaDrivers/X11R6/lib/modules/drivers/ \n\nexec slim/bin/slim\nEscaping of ' followed by ': ''\nEscaping of $ followed by {: ${\nAnd finally to interpret \\n etc. as in a string: \n, \r, \t.\nfoo\n'bla'\nbar\n" diff --git a/tests/lang/eval-okay-ind-string.nix b/tests/lang/eval-okay-ind-string.nix deleted file mode 100644 index 1556aae9f5..0000000000 --- a/tests/lang/eval-okay-ind-string.nix +++ /dev/null @@ -1,120 +0,0 @@ -let - - s1 = '' - This is an indented multi-line string - literal. An amount of whitespace at - the start of each line matching the minimum - indentation of all lines in the string - literal together will be removed. Thus, - in this case four spaces will be - stripped from each line, even though - THIS LINE is indented six spaces. - - Also, empty lines don't count in the - determination of the indentation level (the - previous empty line has indentation 0, but - it doesn't matter). - ''; - - s2 = '' If the string starts with whitespace - followed by a newline, it's stripped, but - that's not the case here. Two spaces are - stripped because of the " " at the start. - ''; - - s3 = '' - This line is indented - a bit further. - ''; # indentation of last line doesn't count if it's empty - - s4 = '' - Anti-quotations, like ${if true then "so" else "not so"}, are - also allowed. - ''; - - s5 = '' - The \ is not special here. - ' can be followed by any character except another ', e.g. 'x'. - Likewise for $, e.g. $$ or $varName. - But ' followed by ' is special, as is $ followed by {. - If you want them, use anti-quotations: ${"''"}, ${"\${"}. - ''; - - s6 = '' - Tabs are not interpreted as whitespace (since we can't guess - what tab settings are intended), so don't use them. - This line starts with a space and a tab, so only one - space will be stripped from each line. - ''; - - s7 = '' - Also note that if the last line (just before the closing ' ') - consists only of whitespace, it's ignored. But here there is - some non-whitespace stuff, so the line isn't removed. ''; - - s8 = '' ${""} - This shows a hacky way to preserve an empty line after the start. - But there's no reason to do so: you could just repeat the empty - line. - ''; - - s9 = '' - ${""} Similarly you can force an indentation level, - in this case to 2 spaces. This works because the anti-quote - is significant (not whitespace). - ''; - - s10 = '' - ''; - - s11 = ''''; - - s12 = '' ''; - - s13 = '' - start on network-interfaces - - start script - - rm -f /var/run/opengl-driver - ${if true - then "ln -sf 123 /var/run/opengl-driver" - else if true - then "ln -sf 456 /var/run/opengl-driver" - else "" - } - - rm -f /var/log/slim.log - - end script - - env SLIM_CFGFILE=${"abc"} - env SLIM_THEMESDIR=${"def"} - env FONTCONFIG_FILE=/etc/fonts/fonts.conf # !!! cleanup - env XKB_BINDIR=${"foo"}/bin # Needed for the Xkb extension. - env LD_LIBRARY_PATH=${"libX11"}/lib:${"libXext"}/lib:/usr/lib/ # related to xorg-sys-opengl - needed to load libglx for (AI)GLX support (for compiz) - - ${if true - then "env XORG_DRI_DRIVER_PATH=${"nvidiaDrivers"}/X11R6/lib/modules/drivers/" - else if true - then "env XORG_DRI_DRIVER_PATH=${"mesa"}/lib/modules/dri" - else "" - } - - exec ${"slim"}/bin/slim - ''; - - s14 = '' - Escaping of ' followed by ': ''' - Escaping of $ followed by {: ''${ - And finally to interpret \n etc. as in a string: ''\n, ''\r, ''\t. - ''; - - # Regression test: antiquotation in '${x}' should work, but didn't. - s15 = let x = "bla"; in '' - foo - '${x}' - bar - ''; - -in s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + s13 + s14 + s15 diff --git a/tests/lang/eval-okay-let.exp b/tests/lang/eval-okay-let.exp deleted file mode 100644 index 14e24d4190..0000000000 --- a/tests/lang/eval-okay-let.exp +++ /dev/null @@ -1 +0,0 @@ -"foobar" diff --git a/tests/lang/eval-okay-let.nix b/tests/lang/eval-okay-let.nix deleted file mode 100644 index fe118c5282..0000000000 --- a/tests/lang/eval-okay-let.nix +++ /dev/null @@ -1,5 +0,0 @@ -let { - x = "foo"; - y = "bar"; - body = x + y; -} diff --git a/tests/lang/eval-okay-list.exp b/tests/lang/eval-okay-list.exp deleted file mode 100644 index f784f26d83..0000000000 --- a/tests/lang/eval-okay-list.exp +++ /dev/null @@ -1 +0,0 @@ -"foobarblatest" diff --git a/tests/lang/eval-okay-list.nix b/tests/lang/eval-okay-list.nix deleted file mode 100644 index d433bcf908..0000000000 --- a/tests/lang/eval-okay-list.nix +++ /dev/null @@ -1,7 +0,0 @@ -with import ./lib.nix; - -let { - - body = concat ["foo" "bar" "bla" "test"]; - -} \ No newline at end of file diff --git a/tests/lang/eval-okay-listtoattrs.exp b/tests/lang/eval-okay-listtoattrs.exp deleted file mode 100644 index 74abef7bc6..0000000000 --- a/tests/lang/eval-okay-listtoattrs.exp +++ /dev/null @@ -1 +0,0 @@ -"AAbar" diff --git a/tests/lang/eval-okay-listtoattrs.nix b/tests/lang/eval-okay-listtoattrs.nix deleted file mode 100644 index 4186e029b5..0000000000 --- a/tests/lang/eval-okay-listtoattrs.nix +++ /dev/null @@ -1,11 +0,0 @@ -# this test shows how to use listToAttrs and that evaluation is still lazy (throw isn't called) -with import ./lib.nix; - -let - asi = name: value : { inherit name value; }; - list = [ ( asi "a" "A" ) ( asi "b" "B" ) ]; - a = builtins.listToAttrs list; - b = builtins.listToAttrs ( list ++ list ); - r = builtins.listToAttrs [ (asi "result" [ a b ]) ( asi "throw" (throw "this should not be thrown")) ]; - x = builtins.listToAttrs [ (asi "foo" "bar") (asi "foo" "bla") ]; -in concat (map (x: x.a) r.result) + x.foo diff --git a/tests/lang/eval-okay-logic.exp b/tests/lang/eval-okay-logic.exp deleted file mode 100644 index d00491fd7e..0000000000 --- a/tests/lang/eval-okay-logic.exp +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/tests/lang/eval-okay-logic.nix b/tests/lang/eval-okay-logic.nix deleted file mode 100644 index fbb1279440..0000000000 --- a/tests/lang/eval-okay-logic.nix +++ /dev/null @@ -1 +0,0 @@ -assert !false && (true || false) -> true; 1 diff --git a/tests/lang/eval-okay-map.exp b/tests/lang/eval-okay-map.exp deleted file mode 100644 index dbb64f717b..0000000000 --- a/tests/lang/eval-okay-map.exp +++ /dev/null @@ -1 +0,0 @@ -"foobarblabarxyzzybar" diff --git a/tests/lang/eval-okay-map.nix b/tests/lang/eval-okay-map.nix deleted file mode 100644 index a76c1d8114..0000000000 --- a/tests/lang/eval-okay-map.nix +++ /dev/null @@ -1,3 +0,0 @@ -with import ./lib.nix; - -concat (map (x: x + "bar") [ "foo" "bla" "xyzzy" ]) \ No newline at end of file diff --git a/tests/lang/eval-okay-new-let.exp b/tests/lang/eval-okay-new-let.exp deleted file mode 100644 index f98b388071..0000000000 --- a/tests/lang/eval-okay-new-let.exp +++ /dev/null @@ -1 +0,0 @@ -"xyzzyfoobar" diff --git a/tests/lang/eval-okay-new-let.nix b/tests/lang/eval-okay-new-let.nix deleted file mode 100644 index 7381231415..0000000000 --- a/tests/lang/eval-okay-new-let.nix +++ /dev/null @@ -1,14 +0,0 @@ -let - - f = z: - - let - x = "foo"; - y = "bar"; - body = 1; # compat test - in - z + x + y; - - arg = "xyzzy"; - -in f arg diff --git a/tests/lang/eval-okay-null-dynamic-attrs.exp b/tests/lang/eval-okay-null-dynamic-attrs.exp deleted file mode 100644 index 27ba77ddaf..0000000000 --- a/tests/lang/eval-okay-null-dynamic-attrs.exp +++ /dev/null @@ -1 +0,0 @@ -true diff --git a/tests/lang/eval-okay-null-dynamic-attrs.nix b/tests/lang/eval-okay-null-dynamic-attrs.nix deleted file mode 100644 index b060c0bc98..0000000000 --- a/tests/lang/eval-okay-null-dynamic-attrs.nix +++ /dev/null @@ -1 +0,0 @@ -{ ${null} = true; } == {} diff --git a/tests/lang/eval-okay-overrides.exp b/tests/lang/eval-okay-overrides.exp deleted file mode 100644 index 0cfbf08886..0000000000 --- a/tests/lang/eval-okay-overrides.exp +++ /dev/null @@ -1 +0,0 @@ -2 diff --git a/tests/lang/eval-okay-overrides.nix b/tests/lang/eval-okay-overrides.nix deleted file mode 100644 index 358742b36e..0000000000 --- a/tests/lang/eval-okay-overrides.nix +++ /dev/null @@ -1,9 +0,0 @@ -let - - overrides = { a = 2; }; - -in (rec { - __overrides = overrides; - x = a; - a = 1; -}).x diff --git a/tests/lang/eval-okay-pathexists.exp b/tests/lang/eval-okay-pathexists.exp deleted file mode 100644 index 27ba77ddaf..0000000000 --- a/tests/lang/eval-okay-pathexists.exp +++ /dev/null @@ -1 +0,0 @@ -true diff --git a/tests/lang/eval-okay-pathexists.nix b/tests/lang/eval-okay-pathexists.nix deleted file mode 100644 index 50c28ee0cd..0000000000 --- a/tests/lang/eval-okay-pathexists.nix +++ /dev/null @@ -1,5 +0,0 @@ -builtins.pathExists (builtins.toPath ./lib.nix) -&& builtins.pathExists (builtins.toPath (builtins.toString ./lib.nix)) -&& !builtins.pathExists (builtins.toPath (builtins.toString ./bla.nix)) -&& builtins.pathExists ./lib.nix -&& !builtins.pathExists ./bla.nix diff --git a/tests/lang/eval-okay-patterns.exp b/tests/lang/eval-okay-patterns.exp deleted file mode 100644 index a4304010fe..0000000000 --- a/tests/lang/eval-okay-patterns.exp +++ /dev/null @@ -1 +0,0 @@ -"abcxyzDDDDEFijk" diff --git a/tests/lang/eval-okay-patterns.nix b/tests/lang/eval-okay-patterns.nix deleted file mode 100644 index 96fd25a015..0000000000 --- a/tests/lang/eval-okay-patterns.nix +++ /dev/null @@ -1,16 +0,0 @@ -let - - f = args@{x, y, z}: x + args.y + z; - - g = {x, y, z}@args: f args; - - h = {x ? "d", y ? x, z ? args.x}@args: x + y + z; - - j = {x, y, z, ...}: x + y + z; - -in - f {x = "a"; y = "b"; z = "c";} + - g {x = "x"; y = "y"; z = "z";} + - h {x = "D";} + - h {x = "D"; y = "E"; z = "F";} + - j {x = "i"; y = "j"; z = "k"; bla = "bla"; foo = "bar";} diff --git a/tests/lang/eval-okay-readfile.exp b/tests/lang/eval-okay-readfile.exp deleted file mode 100644 index a2c87d0c43..0000000000 --- a/tests/lang/eval-okay-readfile.exp +++ /dev/null @@ -1 +0,0 @@ -"builtins.readFile ./eval-okay-readfile.nix\n" diff --git a/tests/lang/eval-okay-readfile.nix b/tests/lang/eval-okay-readfile.nix deleted file mode 100644 index 82f7cb1743..0000000000 --- a/tests/lang/eval-okay-readfile.nix +++ /dev/null @@ -1 +0,0 @@ -builtins.readFile ./eval-okay-readfile.nix diff --git a/tests/lang/eval-okay-redefine-builtin.exp b/tests/lang/eval-okay-redefine-builtin.exp deleted file mode 100644 index c508d5366f..0000000000 --- a/tests/lang/eval-okay-redefine-builtin.exp +++ /dev/null @@ -1 +0,0 @@ -false diff --git a/tests/lang/eval-okay-redefine-builtin.nix b/tests/lang/eval-okay-redefine-builtin.nix deleted file mode 100644 index df9fc3f37d..0000000000 --- a/tests/lang/eval-okay-redefine-builtin.nix +++ /dev/null @@ -1,3 +0,0 @@ -let - throw = abort "Error!"; -in (builtins.tryEval ).success diff --git a/tests/lang/eval-okay-remove.exp b/tests/lang/eval-okay-remove.exp deleted file mode 100644 index 8d38505c16..0000000000 --- a/tests/lang/eval-okay-remove.exp +++ /dev/null @@ -1 +0,0 @@ -456 diff --git a/tests/lang/eval-okay-remove.nix b/tests/lang/eval-okay-remove.nix deleted file mode 100644 index 4ad5ba897f..0000000000 --- a/tests/lang/eval-okay-remove.nix +++ /dev/null @@ -1,5 +0,0 @@ -let { - attrs = {x = 123; y = 456;}; - - body = (removeAttrs attrs ["x"]).y; -} \ No newline at end of file diff --git a/tests/lang/eval-okay-scope-1.exp b/tests/lang/eval-okay-scope-1.exp deleted file mode 100644 index 00750edc07..0000000000 --- a/tests/lang/eval-okay-scope-1.exp +++ /dev/null @@ -1 +0,0 @@ -3 diff --git a/tests/lang/eval-okay-scope-1.nix b/tests/lang/eval-okay-scope-1.nix deleted file mode 100644 index fa38a7174e..0000000000 --- a/tests/lang/eval-okay-scope-1.nix +++ /dev/null @@ -1,6 +0,0 @@ -(({x}: x: - - { x = 1; - y = x; - } -) {x = 2;} 3).y diff --git a/tests/lang/eval-okay-scope-2.exp b/tests/lang/eval-okay-scope-2.exp deleted file mode 100644 index d00491fd7e..0000000000 --- a/tests/lang/eval-okay-scope-2.exp +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/tests/lang/eval-okay-scope-2.nix b/tests/lang/eval-okay-scope-2.nix deleted file mode 100644 index eb8b02bc49..0000000000 --- a/tests/lang/eval-okay-scope-2.nix +++ /dev/null @@ -1,6 +0,0 @@ -((x: {x}: - rec { - x = 1; - y = x; - } -) 2 {x = 3;}).y diff --git a/tests/lang/eval-okay-scope-3.exp b/tests/lang/eval-okay-scope-3.exp deleted file mode 100644 index b8626c4cff..0000000000 --- a/tests/lang/eval-okay-scope-3.exp +++ /dev/null @@ -1 +0,0 @@ -4 diff --git a/tests/lang/eval-okay-scope-3.nix b/tests/lang/eval-okay-scope-3.nix deleted file mode 100644 index 10d6bc04d8..0000000000 --- a/tests/lang/eval-okay-scope-3.nix +++ /dev/null @@ -1,6 +0,0 @@ -((x: as: {x}: - rec { - inherit (as) x; - y = x; - } -) 2 {x = 4;} {x = 3;}).y diff --git a/tests/lang/eval-okay-scope-4.exp b/tests/lang/eval-okay-scope-4.exp deleted file mode 100644 index 00ff03a46c..0000000000 --- a/tests/lang/eval-okay-scope-4.exp +++ /dev/null @@ -1 +0,0 @@ -"ccdd" diff --git a/tests/lang/eval-okay-scope-4.nix b/tests/lang/eval-okay-scope-4.nix deleted file mode 100644 index dc8243bc85..0000000000 --- a/tests/lang/eval-okay-scope-4.nix +++ /dev/null @@ -1,10 +0,0 @@ -let { - - x = "a"; - y = "b"; - - f = {x ? y, y ? x}: x + y; - - body = f {x = "c";} + f {y = "d";}; - -} diff --git a/tests/lang/eval-okay-scope-6.exp b/tests/lang/eval-okay-scope-6.exp deleted file mode 100644 index 00ff03a46c..0000000000 --- a/tests/lang/eval-okay-scope-6.exp +++ /dev/null @@ -1 +0,0 @@ -"ccdd" diff --git a/tests/lang/eval-okay-scope-6.nix b/tests/lang/eval-okay-scope-6.nix deleted file mode 100644 index 0995d4e7e7..0000000000 --- a/tests/lang/eval-okay-scope-6.nix +++ /dev/null @@ -1,7 +0,0 @@ -let { - - f = {x ? y, y ? x}: x + y; - - body = f {x = "c";} + f {y = "d";}; - -} diff --git a/tests/lang/eval-okay-scope-7.exp b/tests/lang/eval-okay-scope-7.exp deleted file mode 100644 index d00491fd7e..0000000000 --- a/tests/lang/eval-okay-scope-7.exp +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/tests/lang/eval-okay-scope-7.nix b/tests/lang/eval-okay-scope-7.nix deleted file mode 100644 index 4da02968f6..0000000000 --- a/tests/lang/eval-okay-scope-7.nix +++ /dev/null @@ -1,6 +0,0 @@ -rec { - inherit (x) y; - x = { - y = 1; - }; -}.y diff --git a/tests/lang/eval-okay-search-path.exp b/tests/lang/eval-okay-search-path.exp deleted file mode 100644 index d0bc8c5e86..0000000000 --- a/tests/lang/eval-okay-search-path.exp +++ /dev/null @@ -1 +0,0 @@ -"abcc" diff --git a/tests/lang/eval-okay-search-path.flags b/tests/lang/eval-okay-search-path.flags deleted file mode 100644 index a28e682100..0000000000 --- a/tests/lang/eval-okay-search-path.flags +++ /dev/null @@ -1 +0,0 @@ --I lang/dir1 -I lang/dir2 -I dir5=lang/dir3 \ No newline at end of file diff --git a/tests/lang/eval-okay-search-path.nix b/tests/lang/eval-okay-search-path.nix deleted file mode 100644 index 9b71150233..0000000000 --- a/tests/lang/eval-okay-search-path.nix +++ /dev/null @@ -1,3 +0,0 @@ -assert builtins.pathExists ; - -import + import + import + import diff --git a/tests/lang/eval-okay-string.exp b/tests/lang/eval-okay-string.exp deleted file mode 100644 index 6079202470..0000000000 --- a/tests/lang/eval-okay-string.exp +++ /dev/null @@ -1 +0,0 @@ -"foobar/a/b/c/d/foo/xyzzy/foo.txt/../foo/x/yescape: \"quote\" \n \\end\nof\nlinefoobarblaatfoo$bar" diff --git a/tests/lang/eval-okay-string.nix b/tests/lang/eval-okay-string.nix deleted file mode 100644 index 839539e6c1..0000000000 --- a/tests/lang/eval-okay-string.nix +++ /dev/null @@ -1,10 +0,0 @@ -"foo" + "bar" - + toString (/a/b + /c/d) - + toString (/foo/bar + "/../xyzzy/." + "/foo.txt") - + ("/../foo" + toString /x/y) - + "escape: \"quote\" \n \\" - + "end -of -line" - + "foo${if true then "b${"a" + "r"}" else "xyzzy"}blaat" - + "foo$bar" diff --git a/tests/lang/eval-okay-strings-as-attrs-names.exp b/tests/lang/eval-okay-strings-as-attrs-names.exp deleted file mode 100644 index 27ba77ddaf..0000000000 --- a/tests/lang/eval-okay-strings-as-attrs-names.exp +++ /dev/null @@ -1 +0,0 @@ -true diff --git a/tests/lang/eval-okay-strings-as-attrs-names.nix b/tests/lang/eval-okay-strings-as-attrs-names.nix deleted file mode 100644 index 5e40928dbe..0000000000 --- a/tests/lang/eval-okay-strings-as-attrs-names.nix +++ /dev/null @@ -1,20 +0,0 @@ -let - - attr = { - "key 1" = "test"; - "key 2" = "caseok"; - }; - - t1 = builtins.getAttr "key 1" attr; - t2 = attr."key 2"; - t3 = attr ? "key 1"; - t4 = builtins.attrNames { inherit (attr) "key 1"; }; - - # This is permitted, but there is currently no way to reference this - # variable. - "foo bar" = 1; - -in t1 == "test" - && t2 == "caseok" - && t3 == true - && t4 == ["key 1"] diff --git a/tests/lang/eval-okay-substring.exp b/tests/lang/eval-okay-substring.exp deleted file mode 100644 index 6aace04b0f..0000000000 --- a/tests/lang/eval-okay-substring.exp +++ /dev/null @@ -1 +0,0 @@ -"ooxfoobarybarzobaabbc" diff --git a/tests/lang/eval-okay-substring.nix b/tests/lang/eval-okay-substring.nix deleted file mode 100644 index 424af00d9b..0000000000 --- a/tests/lang/eval-okay-substring.nix +++ /dev/null @@ -1,21 +0,0 @@ -with builtins; - -let - - s = "foobar"; - -in - -substring 1 2 s -+ "x" -+ substring 0 (stringLength s) s -+ "y" -+ substring 3 100 s -+ "z" -+ substring 2 (sub (stringLength s) 3) s -+ "a" -+ substring 3 0 s -+ "b" -+ substring 3 1 s -+ "c" -+ substring 5 10 "perl" diff --git a/tests/lang/eval-okay-tail-call-1.exp-disabled b/tests/lang/eval-okay-tail-call-1.exp-disabled deleted file mode 100644 index f7393e847d..0000000000 --- a/tests/lang/eval-okay-tail-call-1.exp-disabled +++ /dev/null @@ -1 +0,0 @@ -100000 diff --git a/tests/lang/eval-okay-tail-call-1.nix b/tests/lang/eval-okay-tail-call-1.nix deleted file mode 100644 index a3962ce3fd..0000000000 --- a/tests/lang/eval-okay-tail-call-1.nix +++ /dev/null @@ -1,3 +0,0 @@ -let - f = n: if n == 100000 then n else f (n + 1); -in f 0 diff --git a/tests/lang/eval-okay-tojson.exp b/tests/lang/eval-okay-tojson.exp deleted file mode 100644 index e8164af2b6..0000000000 --- a/tests/lang/eval-okay-tojson.exp +++ /dev/null @@ -1 +0,0 @@ -"{\"a\":123,\"b\":-456,\"c\":\"foo\",\"d\":\"foo\\n\\\"bar\\\"\",\"e\":true,\"f\":false,\"g\":[1,2,3],\"h\":[\"a\",[\"b\",{\"foo\\nbar\":{}}]],\"i\":3}" diff --git a/tests/lang/eval-okay-tojson.nix b/tests/lang/eval-okay-tojson.nix deleted file mode 100644 index 0d4e55b3d3..0000000000 --- a/tests/lang/eval-okay-tojson.nix +++ /dev/null @@ -1,11 +0,0 @@ -builtins.toJSON - { a = 123; - b = -456; - c = "foo"; - d = "foo\n\"bar\""; - e = true; - f = false; - g = [ 1 2 3 ]; - h = [ "a" [ "b" { "foo\nbar" = {}; } ] ]; - i = 1 + 2; - } diff --git a/tests/lang/eval-okay-toxml.exp b/tests/lang/eval-okay-toxml.exp deleted file mode 100644 index 828220890e..0000000000 --- a/tests/lang/eval-okay-toxml.exp +++ /dev/null @@ -1 +0,0 @@ -"\n\n \n \n \n \n \n\n" diff --git a/tests/lang/eval-okay-toxml.nix b/tests/lang/eval-okay-toxml.nix deleted file mode 100644 index 068c97a6c1..0000000000 --- a/tests/lang/eval-okay-toxml.nix +++ /dev/null @@ -1,3 +0,0 @@ -# Make sure the expected XML output is produced; in particular, make sure it -# doesn't contain source location information. -builtins.toXML { a = "s"; } diff --git a/tests/lang/eval-okay-toxml2.exp b/tests/lang/eval-okay-toxml2.exp deleted file mode 100644 index 634a841eb1..0000000000 --- a/tests/lang/eval-okay-toxml2.exp +++ /dev/null @@ -1 +0,0 @@ -"\n\n \n \n \n \n \n \n \n \n \n \n \n \n\n" diff --git a/tests/lang/eval-okay-toxml2.nix b/tests/lang/eval-okay-toxml2.nix deleted file mode 100644 index ff1791b30e..0000000000 --- a/tests/lang/eval-okay-toxml2.nix +++ /dev/null @@ -1 +0,0 @@ -builtins.toXML [("a" + "b") 10 (rec {x = "x"; y = x;})] diff --git a/tests/lang/eval-okay-tryeval.exp b/tests/lang/eval-okay-tryeval.exp deleted file mode 100644 index 2b2e6fa711..0000000000 --- a/tests/lang/eval-okay-tryeval.exp +++ /dev/null @@ -1 +0,0 @@ -{ x = { success = true; value = "x"; }; y = { success = false; value = false; }; z = { success = false; value = false; }; } diff --git a/tests/lang/eval-okay-tryeval.nix b/tests/lang/eval-okay-tryeval.nix deleted file mode 100644 index 629bc440a8..0000000000 --- a/tests/lang/eval-okay-tryeval.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ - x = builtins.tryEval "x"; - y = builtins.tryEval (assert false; "y"); - z = builtins.tryEval (throw "bla"); -} diff --git a/tests/lang/eval-okay-types.exp b/tests/lang/eval-okay-types.exp deleted file mode 100644 index 82487f7100..0000000000 --- a/tests/lang/eval-okay-types.exp +++ /dev/null @@ -1 +0,0 @@ -[ true false true false true false true false true false true false "int" "bool" "string" "null" "set" "list" "lambda" "lambda" "lambda" "lambda" ] diff --git a/tests/lang/eval-okay-types.nix b/tests/lang/eval-okay-types.nix deleted file mode 100644 index 8cb225e247..0000000000 --- a/tests/lang/eval-okay-types.nix +++ /dev/null @@ -1,25 +0,0 @@ -with builtins; - -[ (isNull null) - (isNull (x: x)) - (isFunction (x: x)) - (isFunction "fnord") - (isString ("foo" + "bar")) - (isString [ "x" ]) - (isInt (1 + 2)) - (isInt { x = 123; }) - (isBool (true && false)) - (isBool null) - (isAttrs { x = 123; }) - (isAttrs null) - (typeOf (3 * 4)) - (typeOf true) - (typeOf "xyzzy") - (typeOf null) - (typeOf { x = 456; }) - (typeOf [ 1 2 3 ]) - (typeOf (x: x)) - (typeOf ((x: y: x) 1)) - (typeOf map) - (typeOf (map (x: x))) -] diff --git a/tests/lang/eval-okay-versions.exp b/tests/lang/eval-okay-versions.exp deleted file mode 100644 index 27ba77ddaf..0000000000 --- a/tests/lang/eval-okay-versions.exp +++ /dev/null @@ -1 +0,0 @@ -true diff --git a/tests/lang/eval-okay-versions.nix b/tests/lang/eval-okay-versions.nix deleted file mode 100644 index e63c36586b..0000000000 --- a/tests/lang/eval-okay-versions.nix +++ /dev/null @@ -1,40 +0,0 @@ -let - - name1 = "hello-1.0.2"; - name2 = "hello"; - name3 = "915resolution-0.5.2"; - name4 = "xf86-video-i810-1.7.4"; - - eq = 0; - lt = builtins.sub 0 1; - gt = 1; - - versionTest = v1: v2: expected: - let d1 = builtins.compareVersions v1 v2; - d2 = builtins.compareVersions v2 v1; - in d1 == builtins.sub 0 d2 && d1 == expected; - - tests = [ - ((builtins.parseDrvName name1).name == "hello") - ((builtins.parseDrvName name1).version == "1.0.2") - ((builtins.parseDrvName name2).name == "hello") - ((builtins.parseDrvName name2).version == "") - ((builtins.parseDrvName name3).name == "915resolution") - ((builtins.parseDrvName name3).version == "0.5.2") - ((builtins.parseDrvName name4).name == "xf86-video-i810") - ((builtins.parseDrvName name4).version == "1.7.4") - (versionTest "1.0" "2.3" lt) - (versionTest "2.1" "2.3" lt) - (versionTest "2.3" "2.3" eq) - (versionTest "2.5" "2.3" gt) - (versionTest "3.1" "2.3" gt) - (versionTest "2.3.1" "2.3" gt) - (versionTest "2.3.1" "2.3a" gt) - (versionTest "2.3pre1" "2.3" lt) - (versionTest "2.3pre3" "2.3pre12" lt) - (versionTest "2.3a" "2.3c" lt) - (versionTest "2.3pre1" "2.3c" lt) - (versionTest "2.3pre1" "2.3q" lt) - ]; - -in (import ./lib.nix).and tests diff --git a/tests/lang/eval-okay-with.exp b/tests/lang/eval-okay-with.exp deleted file mode 100644 index 378c8dc804..0000000000 --- a/tests/lang/eval-okay-with.exp +++ /dev/null @@ -1 +0,0 @@ -"xyzzybarxyzzybar" diff --git a/tests/lang/eval-okay-with.nix b/tests/lang/eval-okay-with.nix deleted file mode 100644 index 033e8d3aba..0000000000 --- a/tests/lang/eval-okay-with.nix +++ /dev/null @@ -1,19 +0,0 @@ -let { - - a = "xyzzy"; - - as = { - a = "foo"; - b = "bar"; - }; - - bs = { - a = "bar"; - }; - - x = with as; a + b; - - y = with as; with bs; a + b; - - body = x + y; -} diff --git a/tests/lang/eval-okay-xml.exp.xml b/tests/lang/eval-okay-xml.exp.xml deleted file mode 100644 index f124f939ed..0000000000 --- a/tests/lang/eval-okay-xml.exp.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/lang/eval-okay-xml.nix b/tests/lang/eval-okay-xml.nix deleted file mode 100644 index b9389bfae7..0000000000 --- a/tests/lang/eval-okay-xml.nix +++ /dev/null @@ -1,19 +0,0 @@ -rec { - - x = 123; - - a = "foo"; - - b = "bar"; - - c = "foo" + "bar"; - - f = {z, x, y}: if y then x else z; - - id = x: x; - - at = args@{x, y, z}: x; - - ellipsis = {x, y, z, ...}: x; - -} diff --git a/tests/lang/lib.nix b/tests/lang/lib.nix deleted file mode 100644 index 882005dc1b..0000000000 --- a/tests/lang/lib.nix +++ /dev/null @@ -1,61 +0,0 @@ -with builtins; - -rec { - - fold = op: nul: list: - if list == [] - then nul - else op (head list) (fold op nul (tail list)); - - concat = - fold (x: y: x + y) ""; - - and = fold (x: y: x && y) true; - - flatten = x: - if isList x - then fold (x: y: (flatten x) ++ y) [] x - else [x]; - - sum = fold (x: y: add x y) 0; - - hasSuffix = ext: fileName: - let lenFileName = stringLength fileName; - lenExt = stringLength ext; - in !(lessThan lenFileName lenExt) && - substring (sub lenFileName lenExt) lenFileName fileName == ext; - - # Split a list at the given position. - splitAt = pos: list: - if pos == 0 then {first = []; second = list;} else - if list == [] then {first = []; second = [];} else - let res = splitAt (sub pos 1) (tail list); - in {first = [(head list)] ++ res.first; second = res.second;}; - - # Stable merge sort. - sortBy = comp: list: - if lessThan 1 (length list) - then - let - split = splitAt (div (length list) 2) list; - first = sortBy comp split.first; - second = sortBy comp split.second; - in mergeLists comp first second - else list; - - mergeLists = comp: list1: list2: - if list1 == [] then list2 else - if list2 == [] then list1 else - if comp (head list2) (head list1) then [(head list2)] ++ mergeLists comp list1 (tail list2) else - [(head list1)] ++ mergeLists comp (tail list1) list2; - - id = x: x; - - const = x: y: x; - - range = first: last: - if builtins.lessThan last first - then [] - else [first] ++ range (builtins.add first 1) last; - -} diff --git a/tests/lang/parse-fail-dup-attrs-1.nix b/tests/lang/parse-fail-dup-attrs-1.nix deleted file mode 100644 index 2c02317d2a..0000000000 --- a/tests/lang/parse-fail-dup-attrs-1.nix +++ /dev/null @@ -1,4 +0,0 @@ -{ x = 123; - y = 456; - x = 789; -} diff --git a/tests/lang/parse-fail-dup-attrs-2.nix b/tests/lang/parse-fail-dup-attrs-2.nix deleted file mode 100644 index 864d9865e0..0000000000 --- a/tests/lang/parse-fail-dup-attrs-2.nix +++ /dev/null @@ -1,13 +0,0 @@ -let { - - as = { - x = 123; - y = 456; - }; - - bs = { - x = 789; - inherit (as) x; - }; - -} diff --git a/tests/lang/parse-fail-dup-attrs-3.nix b/tests/lang/parse-fail-dup-attrs-3.nix deleted file mode 100644 index 114d19779f..0000000000 --- a/tests/lang/parse-fail-dup-attrs-3.nix +++ /dev/null @@ -1,13 +0,0 @@ -let { - - as = { - x = 123; - y = 456; - }; - - bs = rec { - x = 789; - inherit (as) x; - }; - -} diff --git a/tests/lang/parse-fail-dup-attrs-4.nix b/tests/lang/parse-fail-dup-attrs-4.nix deleted file mode 100644 index 77417432b3..0000000000 --- a/tests/lang/parse-fail-dup-attrs-4.nix +++ /dev/null @@ -1,4 +0,0 @@ -{ - services.ssh.port = 22; - services.ssh.port = 23; -} diff --git a/tests/lang/parse-fail-dup-attrs-6.nix b/tests/lang/parse-fail-dup-attrs-6.nix deleted file mode 100644 index ae6d7a7693..0000000000 --- a/tests/lang/parse-fail-dup-attrs-6.nix +++ /dev/null @@ -1,4 +0,0 @@ -{ - services.ssh.port = 23; - services.ssh = { enable = true; }; -} diff --git a/tests/lang/parse-fail-dup-attrs-7.nix b/tests/lang/parse-fail-dup-attrs-7.nix deleted file mode 100644 index bbc3eb08c0..0000000000 --- a/tests/lang/parse-fail-dup-attrs-7.nix +++ /dev/null @@ -1,9 +0,0 @@ -rec { - - x = 1; - - as = { - inherit x; - inherit x; - }; -} \ No newline at end of file diff --git a/tests/lang/parse-fail-dup-formals.nix b/tests/lang/parse-fail-dup-formals.nix deleted file mode 100644 index a0edd91a96..0000000000 --- a/tests/lang/parse-fail-dup-formals.nix +++ /dev/null @@ -1 +0,0 @@ -{x, y, x}: x \ No newline at end of file diff --git a/tests/lang/parse-fail-patterns-1.nix b/tests/lang/parse-fail-patterns-1.nix deleted file mode 100644 index 7b40616417..0000000000 --- a/tests/lang/parse-fail-patterns-1.nix +++ /dev/null @@ -1 +0,0 @@ -args@{args, x, y, z}: x diff --git a/tests/lang/parse-fail-regression-20060610.nix b/tests/lang/parse-fail-regression-20060610.nix deleted file mode 100644 index b1934f7e1e..0000000000 --- a/tests/lang/parse-fail-regression-20060610.nix +++ /dev/null @@ -1,11 +0,0 @@ -let { - x = - {gcc}: - { - inherit gcc; - }; - - body = ({ - inherit gcc; - }).gcc; -} diff --git a/tests/lang/parse-fail-undef-var-2.nix b/tests/lang/parse-fail-undef-var-2.nix deleted file mode 100644 index c10a52b1ea..0000000000 --- a/tests/lang/parse-fail-undef-var-2.nix +++ /dev/null @@ -1,7 +0,0 @@ -let { - - f = {x, y : ["baz" "bar" z "bat"]}: x + y; - - body = f {x = "foo"; y = "bar";}; - -} diff --git a/tests/lang/parse-fail-undef-var.nix b/tests/lang/parse-fail-undef-var.nix deleted file mode 100644 index 7b63008110..0000000000 --- a/tests/lang/parse-fail-undef-var.nix +++ /dev/null @@ -1 +0,0 @@ -x: y diff --git a/tests/lang/parse-okay-1.nix b/tests/lang/parse-okay-1.nix deleted file mode 100644 index 23a58ed109..0000000000 --- a/tests/lang/parse-okay-1.nix +++ /dev/null @@ -1 +0,0 @@ -{x, y, z}: x + y + z diff --git a/tests/lang/parse-okay-crlf.nix b/tests/lang/parse-okay-crlf.nix deleted file mode 100644 index 21518d4c6d..0000000000 --- a/tests/lang/parse-okay-crlf.nix +++ /dev/null @@ -1,17 +0,0 @@ -rec { - - /* Dit is - een test. */ - - x = - # Dit is een test. y; - - y = 123; - - # CR or CR/LF (but not explicit \r's) in strings should be - # translated to LF. - foo = "multi line - string - test\r"; - - z = 456; } diff --git a/tests/lang/parse-okay-dup-attrs-5.nix b/tests/lang/parse-okay-dup-attrs-5.nix deleted file mode 100644 index f4b9efd0c5..0000000000 --- a/tests/lang/parse-okay-dup-attrs-5.nix +++ /dev/null @@ -1,4 +0,0 @@ -{ - services.ssh = { enable = true; }; - services.ssh.port = 23; -} diff --git a/tests/lang/parse-okay-regression-20041027.nix b/tests/lang/parse-okay-regression-20041027.nix deleted file mode 100644 index ae2e256eea..0000000000 --- a/tests/lang/parse-okay-regression-20041027.nix +++ /dev/null @@ -1,11 +0,0 @@ -{stdenv, fetchurl /* pkgconfig, libX11 */ }: - -stdenv.mkDerivation { - name = "libXi-6.0.1"; - src = fetchurl { - url = http://freedesktop.org/~xlibs/release/libXi-6.0.1.tar.bz2; - md5 = "7e935a42428d63a387b3c048be0f2756"; - }; -/* buildInputs = [pkgconfig]; - propagatedBuildInputs = [libX11]; */ -} diff --git a/tests/lang/parse-okay-subversion.nix b/tests/lang/parse-okay-subversion.nix deleted file mode 100644 index 356272815d..0000000000 --- a/tests/lang/parse-okay-subversion.nix +++ /dev/null @@ -1,43 +0,0 @@ -{ localServer ? false -, httpServer ? false -, sslSupport ? false -, pythonBindings ? false -, javaSwigBindings ? false -, javahlBindings ? false -, stdenv, fetchurl -, openssl ? null, httpd ? null, db4 ? null, expat, swig ? null, j2sdk ? null -}: - -assert expat != null; -assert localServer -> db4 != null; -assert httpServer -> httpd != null && httpd.expat == expat; -assert sslSupport -> openssl != null && (httpServer -> httpd.openssl == openssl); -assert pythonBindings -> swig != null && swig.pythonSupport; -assert javaSwigBindings -> swig != null && swig.javaSupport; -assert javahlBindings -> j2sdk != null; - -stdenv.mkDerivation { - name = "subversion-1.1.1"; - - builder = /foo/bar; - src = fetchurl { - url = http://subversion.tigris.org/tarballs/subversion-1.1.1.tar.bz2; - md5 = "a180c3fe91680389c210c99def54d9e0"; - }; - - # This is a hopefully temporary fix for the problem that - # libsvnjavahl.so isn't linked against libstdc++, which causes - # loading the library into the JVM to fail. - patches = if javahlBindings then [/javahl.patch] else []; - - openssl = if sslSupport then openssl else null; - httpd = if httpServer then httpd else null; - db4 = if localServer then db4 else null; - swig = if pythonBindings || javaSwigBindings then swig else null; - python = if pythonBindings then swig.python else null; - j2sdk = if javaSwigBindings then swig.j2sdk else - if javahlBindings then j2sdk else null; - - inherit expat localServer httpServer sslSupport - pythonBindings javaSwigBindings javahlBindings; -} diff --git a/tests/lang/parse-okay-url.nix b/tests/lang/parse-okay-url.nix deleted file mode 100644 index fce3b13ee6..0000000000 --- a/tests/lang/parse-okay-url.nix +++ /dev/null @@ -1,7 +0,0 @@ -[ x:x - https://svn.cs.uu.nl:12443/repos/trace/trunk - http://www2.mplayerhq.hu/MPlayer/releases/fonts/font-arial-iso-8859-1.tar.bz2 - http://losser.st-lab.cs.uu.nl/~armijn/.nix/gcc-3.3.4-static-nix.tar.gz - http://fpdownload.macromedia.com/get/shockwave/flash/english/linux/7.0r25/install_flash_player_7_linux.tar.gz - ftp://ftp.gtk.org/pub/gtk/v1.2/gtk+-1.2.10.tar.gz -] diff --git a/tests/local.mk b/tests/local.mk deleted file mode 100644 index ab170dfe51..0000000000 --- a/tests/local.mk +++ /dev/null @@ -1,21 +0,0 @@ -check: - @echo "Warning: Nix has no 'make check'. Please install Nix and run 'make installcheck' instead." - -nix_tests = \ - init.sh hash.sh lang.sh add.sh simple.sh dependencies.sh \ - parallel.sh build-hook.sh substitutes.sh substitutes2.sh \ - fallback.sh nix-push.sh gc.sh gc-concurrent.sh nix-pull.sh \ - referrers.sh user-envs.sh logging.sh nix-build.sh misc.sh fixed.sh \ - gc-runtime.sh install-package.sh check-refs.sh filter-source.sh \ - remote-store.sh export.sh export-graph.sh negative-caching.sh \ - binary-patching.sh timeout.sh secure-drv-outputs.sh nix-channel.sh \ - multiple-outputs.sh import-derivation.sh fetchurl.sh optimise-store.sh \ - binary-cache.sh nix-profile.sh repair.sh dump-db.sh - -install-tests += $(foreach x, $(nix_tests), tests/$(x)) - -tests-environment = NIX_REMOTE= $(bash) -e - -clean-files += $(d)/common.sh - -installcheck: $(d)/common.sh diff --git a/tests/logging.sh b/tests/logging.sh deleted file mode 100644 index 5ba71c3e40..0000000000 --- a/tests/logging.sh +++ /dev/null @@ -1,34 +0,0 @@ -source common.sh - -clearStore - -# Produce an escaped log file. -set -x -path=$(nix-build --log-type escapes -vv dependencies.nix --no-out-link 2> $TEST_ROOT/log.esc) - -# Convert it to an XML representation. -nix-log2xml < $TEST_ROOT/log.esc > $TEST_ROOT/log.xml - -# Is this well-formed XML? -if test "$xmllint" != "false"; then - $xmllint --noout $TEST_ROOT/log.xml || fail "malformed XML" -fi - -# Convert to HTML. -if test "$xsltproc" != "false"; then - (cd $datadir/nix/log2html && $xsltproc mark-errors.xsl - | $xsltproc log2html.xsl -) < $TEST_ROOT/log.xml > $TEST_ROOT/log.html - # Ideally we would check that the generated HTML is valid... - - # A few checks... - grep ".*FOO" $TEST_ROOT/log.html || fail "bad HTML output" -fi - -# Test nix-store -l. -[ "$(nix-store -l $path)" = FOO ] - -# Test compressed logs. -clearStore -rm -rf $NIX_LOG_DIR -! nix-store -l $path -nix-build dependencies.nix --no-out-link --option build-compress-log true -[ "$(nix-store -l $path)" = FOO ] diff --git a/tests/misc.sh b/tests/misc.sh deleted file mode 100644 index 1b4d8f2cfc..0000000000 --- a/tests/misc.sh +++ /dev/null @@ -1,16 +0,0 @@ -source common.sh - -# Tests miscellaneous commands. - -# Do all commands have help? -#nix-env --help | grep -q install -#nix-store --help | grep -q realise -#nix-instantiate --help | grep -q eval -#nix-hash --help | grep -q base32 - -# Can we ask for the version number? -nix-env --version | grep "$version" - -# Usage errors. -nix-env --foo 2>&1 | grep "no operation" -nix-env -q --foo 2>&1 | grep "unknown flag" diff --git a/tests/multiple-outputs.nix b/tests/multiple-outputs.nix deleted file mode 100644 index 4a9010d186..0000000000 --- a/tests/multiple-outputs.nix +++ /dev/null @@ -1,68 +0,0 @@ -with import ./config.nix; - -rec { - - a = mkDerivation { - name = "multiple-outputs-a"; - outputs = [ "first" "second" ]; - builder = builtins.toFile "builder.sh" - '' - mkdir $first $second - test -z $all - echo "first" > $first/file - echo "second" > $second/file - ln -s $first $second/link - ''; - helloString = "Hello, world!"; - }; - - b = mkDerivation { - defaultOutput = assert a.second.helloString == "Hello, world!"; a; - firstOutput = assert a.outputName == "first"; a.first.first; - secondOutput = assert a.second.outputName == "second"; a.second.first.first.second.second.first.second; - allOutputs = a.all; - name = "multiple-outputs-b"; - builder = builtins.toFile "builder.sh" - '' - mkdir $out - test "$firstOutput $secondOutput" = "$allOutputs" - test "$defaultOutput" = "$firstOutput" - test "$(cat $firstOutput/file)" = "first" - test "$(cat $secondOutput/file)" = "second" - echo "success" > $out/file - ''; - }; - - c = mkDerivation { - name = "multiple-outputs-c"; - drv = b.drvPath; - builder = builtins.toFile "builder.sh" - '' - mkdir $out - ln -s $drv $out/drv - ''; - }; - - d = mkDerivation { - name = "multiple-outputs-d"; - drv = builtins.unsafeDiscardOutputDependency b.drvPath; - builder = builtins.toFile "builder.sh" - '' - mkdir $out - echo $drv > $out/drv - ''; - }; - - cyclic = (mkDerivation { - name = "cyclic-outputs"; - outputs = [ "a" "b" "c" ]; - builder = builtins.toFile "builder.sh" - '' - mkdir $a $b $c - echo $a > $b/foo - echo $b > $c/bar - echo $c > $a/baz - ''; - }).a; - -} diff --git a/tests/multiple-outputs.sh b/tests/multiple-outputs.sh deleted file mode 100644 index ac622a7b4e..0000000000 --- a/tests/multiple-outputs.sh +++ /dev/null @@ -1,63 +0,0 @@ -source common.sh - -clearStore - -# Test whether read-only evaluation works when referring to the -# ‘drvPath’ attribute. -echo "evaluating c..." -#drvPath=$(nix-instantiate multiple-outputs.nix -A c --readonly-mode) - -# And check whether the resulting derivation explicitly depends on all -# outputs. -drvPath=$(nix-instantiate multiple-outputs.nix -A c) -#[ "$drvPath" = "$drvPath2" ] -grep -q 'multiple-outputs-a.drv",\["first","second"\]' $drvPath -grep -q 'multiple-outputs-b.drv",\["out"\]' $drvPath - -# While we're at it, test the ‘unsafeDiscardOutputDependency’ primop. -outPath=$(nix-build multiple-outputs.nix -A d --no-out-link) -drvPath=$(cat $outPath/drv) -outPath=$(nix-store -q $drvPath) -! [ -e "$outPath" ] - -# Do a build of something that depends on a derivation with multiple -# outputs. -echo "building b..." -outPath=$(nix-build multiple-outputs.nix -A b --no-out-link) -echo "output path is $outPath" -[ "$(cat "$outPath"/file)" = "success" ] - -# Test nix-build on a derivation with multiple outputs. -nix-build multiple-outputs.nix -A a -o $TEST_ROOT/result -[ -e $TEST_ROOT/result-first ] -! [ -e $TEST_ROOT/result-second ] -nix-build multiple-outputs.nix -A a.all -o $TEST_ROOT/result -[ "$(cat $TEST_ROOT/result-first/file)" = "first" ] -[ "$(cat $TEST_ROOT/result-second/file)" = "second" ] -[ "$(cat $TEST_ROOT/result-second/link/file)" = "first" ] -hash1=$(nix-store -q --hash $TEST_ROOT/result-second) - -# Delete one of the outputs and rebuild it. This will cause a hash -# rewrite. -nix-store --delete $TEST_ROOT/result-second --ignore-liveness -nix-build multiple-outputs.nix -A a.all -o $TEST_ROOT/result -[ "$(cat $TEST_ROOT/result-second/file)" = "second" ] -[ "$(cat $TEST_ROOT/result-second/link/file)" = "first" ] -hash2=$(nix-store -q --hash $TEST_ROOT/result-second) -[ "$hash1" = "$hash2" ] - -# Make sure that nix-build works on derivations with multiple outputs. -echo "building a.first..." -nix-build multiple-outputs.nix -A a.first --no-out-link - -# Cyclic outputs should be rejected. -echo "building cyclic..." -if nix-build multiple-outputs.nix -A cyclic --no-out-link; then - echo "Cyclic outputs incorrectly accepted!" - exit 1 -fi - -echo "collecting garbage..." -rm $TEST_ROOT/result* -nix-store --gc --option gc-keep-derivations true --option gc-keep-outputs true -nix-store --gc --print-roots diff --git a/tests/negative-caching.nix b/tests/negative-caching.nix deleted file mode 100644 index 10df67a748..0000000000 --- a/tests/negative-caching.nix +++ /dev/null @@ -1,21 +0,0 @@ -with import ./config.nix; - -rec { - - fail = mkDerivation { - name = "fail"; - builder = builtins.toFile "builder.sh" "echo FAIL; exit 1"; - }; - - succeed = mkDerivation { - name = "succeed"; - builder = builtins.toFile "builder.sh" "echo SUCCEED; mkdir $out"; - }; - - depOnFail = mkDerivation { - name = "dep-on-fail"; - builder = builtins.toFile "builder.sh" "echo URGH; mkdir $out"; - inputs = [fail succeed]; - }; - -} diff --git a/tests/negative-caching.sh b/tests/negative-caching.sh deleted file mode 100644 index 4217bc38e1..0000000000 --- a/tests/negative-caching.sh +++ /dev/null @@ -1,22 +0,0 @@ -source common.sh - -clearStore - -set +e - -opts="--option build-cache-failure true --print-build-trace" - -# This build should fail, and the failure should be cached. -log=$(nix-build $opts negative-caching.nix -A fail --no-out-link 2>&1) && fail "should fail" -echo "$log" | grep -q "@ build-failed" || fail "no build-failed trace" - -# Do it again. The build shouldn't be tried again. -log=$(nix-build $opts negative-caching.nix -A fail --no-out-link 2>&1) && fail "should fail" -echo "$log" | grep -q "FAIL" && fail "failed build not cached" -echo "$log" | grep -q "@ build-failed .* cached" || fail "trace doesn't say cached" - -# Check that --keep-going works properly with cached failures. -log=$(nix-build $opts --keep-going negative-caching.nix -A depOnFail --no-out-link 2>&1) && fail "should fail" -echo "$log" | grep -q "FAIL" && fail "failed build not cached (2)" -echo "$log" | grep -q "@ build-failed .* cached" || fail "trace doesn't say cached (2)" -echo "$log" | grep -q "@ build-succeeded .*-succeed" || fail "didn't keep going" diff --git a/tests/nix-build.sh b/tests/nix-build.sh deleted file mode 100644 index dc0e99c736..0000000000 --- a/tests/nix-build.sh +++ /dev/null @@ -1,19 +0,0 @@ -source common.sh - -clearStore - -nix-build dependencies.nix -o $TEST_ROOT/result -test "$(cat $TEST_ROOT/result/foobar)" = FOOBAR - -# The result should be retained by a GC. -echo A -target=$(readLink $TEST_ROOT/result) -echo B -echo target is $target -nix-store --gc -test -e $target/foobar - -# But now it should be gone. -rm $TEST_ROOT/result -nix-store --gc -if test -e $target/foobar; then false; fi diff --git a/tests/nix-channel.sh b/tests/nix-channel.sh deleted file mode 100644 index a25d56bec1..0000000000 --- a/tests/nix-channel.sh +++ /dev/null @@ -1,43 +0,0 @@ -source common.sh - -clearProfiles -clearManifests - -rm -f $TEST_ROOT/.nix-channels - -# Override location of ~/.nix-channels. -export HOME=$TEST_ROOT - -# Test add/list/remove. -nix-channel --add http://foo/bar xyzzy -nix-channel --list | grep -q http://foo/bar -nix-channel --remove xyzzy - -[ -e $TEST_ROOT/.nix-channels ] -[ "$(cat $TEST_ROOT/.nix-channels)" = '' ] - -# Create a channel. -rm -rf $TEST_ROOT/foo -mkdir -p $TEST_ROOT/foo -nix-push --dest $TEST_ROOT/foo --manifest --bzip2 $(nix-store -r $(nix-instantiate dependencies.nix)) -rm -rf $TEST_ROOT/nixexprs -mkdir -p $TEST_ROOT/nixexprs -cp config.nix dependencies.nix dependencies.builder*.sh $TEST_ROOT/nixexprs/ -ln -s dependencies.nix $TEST_ROOT/nixexprs/default.nix -(cd $TEST_ROOT && tar cvf - nixexprs) | bzip2 > $TEST_ROOT/foo/nixexprs.tar.bz2 - -# Test the update action. -nix-channel --add file://$TEST_ROOT/foo -nix-channel --update - -# Do a query. -nix-env -qa \* --meta --xml --out-path > $TEST_ROOT/meta.xml -if [ "$xmllint" != false ]; then - $xmllint --noout $TEST_ROOT/meta.xml || fail "malformed XML" -fi -grep -q 'meta.*description.*Random test package' $TEST_ROOT/meta.xml -grep -q 'item.*attrPath="foo".*name="dependencies"' $TEST_ROOT/meta.xml - -# Do an install. -nix-env -i dependencies -[ -e $TEST_ROOT/var/nix/profiles/default/foobar ] diff --git a/tests/nix-copy-closure.nix b/tests/nix-copy-closure.nix deleted file mode 100644 index 66c19a45d4..0000000000 --- a/tests/nix-copy-closure.nix +++ /dev/null @@ -1,54 +0,0 @@ -# Test ‘nix-copy-closure’. - -{ system, nix }: - -with import { inherit system; }; - -makeTest ({ pkgs, ... }: let pkgA = pkgs.aterm; pkgB = pkgs.wget; in { - - nodes = - { client = - { config, pkgs, ... }: - { virtualisation.writableStore = true; - virtualisation.pathsInNixDB = [ pkgA ]; - environment.nix = nix; - }; - - server = - { config, pkgs, ... }: - { services.openssh.enable = true; - virtualisation.writableStore = true; - virtualisation.pathsInNixDB = [ pkgB ]; - environment.nix = nix; - }; - }; - - testScript = { nodes }: - '' - startAll; - - # Create an SSH key on the client. - my $key = `${pkgs.openssh}/bin/ssh-keygen -t dsa -f key -N ""`; - $client->succeed("mkdir -m 700 /root/.ssh"); - $client->copyFileFromHost("key", "/root/.ssh/id_dsa"); - $client->succeed("chmod 600 /root/.ssh/id_dsa"); - - # Install the SSH key on the server. - $server->succeed("mkdir -m 700 /root/.ssh"); - $server->copyFileFromHost("key.pub", "/root/.ssh/authorized_keys"); - $server->waitForUnit("sshd"); - $client->waitForUnit("network.target"); - $client->succeed("ssh -o StrictHostKeyChecking=no " . $server->name() . " 'echo hello world'"); - - # Copy the closure of package A from the client to the server. - $server->fail("nix-store --check-validity ${pkgA}"); - $client->succeed("nix-copy-closure --to server --gzip ${pkgA} >&2"); - $server->succeed("nix-store --check-validity ${pkgA}"); - - # Copy the closure of package B from the server to the client. - $client->fail("nix-store --check-validity ${pkgB}"); - $client->succeed("nix-copy-closure --from server --gzip ${pkgB} >&2"); - $client->succeed("nix-store --check-validity ${pkgB}"); - ''; - -}) diff --git a/tests/nix-profile.sh b/tests/nix-profile.sh deleted file mode 100644 index 3586a7efc3..0000000000 --- a/tests/nix-profile.sh +++ /dev/null @@ -1,10 +0,0 @@ -source common.sh - -home=$TEST_ROOT/home -rm -rf $home -mkdir -p $home -HOME=$home $SHELL -e -c ". ../scripts/nix-profile.sh" -HOME=$home $SHELL -e -c ". ../scripts/nix-profile.sh" # test idempotency - -[ -L $home/.nix-profile ] -[ -e $home/.nix-channels ] diff --git a/tests/nix-pull.sh b/tests/nix-pull.sh deleted file mode 100644 index 87239948c4..0000000000 --- a/tests/nix-pull.sh +++ /dev/null @@ -1,33 +0,0 @@ -source common.sh - -pullCache () { - echo "pulling cache..." - nix-pull file://$TEST_ROOT/cache/MANIFEST -} - -clearStore -clearManifests -pullCache - -drvPath=$(nix-instantiate dependencies.nix) -outPath=$(nix-store -q $drvPath) - -echo "building $outPath using substitutes..." -nix-store -r $outPath - -cat $outPath/input-2/bar - -clearStore -clearManifests -pullCache - -echo "building $drvPath using substitutes..." -nix-store -r $drvPath - -cat $outPath/input-2/bar - -# Check that the derivers are set properly. -test $(nix-store -q --deriver "$outPath") = "$drvPath" -nix-store -q --deriver $(readLink $outPath/input-2) | grep -q -- "-input-2.drv" - -clearManifests diff --git a/tests/nix-push.sh b/tests/nix-push.sh deleted file mode 100644 index 8ea59516c6..0000000000 --- a/tests/nix-push.sh +++ /dev/null @@ -1,12 +0,0 @@ -source common.sh - -clearStore - -drvPath=$(nix-instantiate dependencies.nix) -outPath=$(nix-store -r $drvPath) - -echo "pushing $drvPath" - -mkdir -p $TEST_ROOT/cache - -nix-push --dest $TEST_ROOT/cache --manifest $drvPath --bzip2 diff --git a/tests/optimise-store.sh b/tests/optimise-store.sh deleted file mode 100644 index ea4478693e..0000000000 --- a/tests/optimise-store.sh +++ /dev/null @@ -1,43 +0,0 @@ -source common.sh - -clearStore - -outPath1=$(echo 'with import ./config.nix; mkDerivation { name = "foo1"; builder = builtins.toFile "builder" "mkdir $out; echo hello > $out/foo"; }' | nix-build - --no-out-link --option auto-optimise-store true) -outPath2=$(echo 'with import ./config.nix; mkDerivation { name = "foo2"; builder = builtins.toFile "builder" "mkdir $out; echo hello > $out/foo"; }' | nix-build - --no-out-link --option auto-optimise-store true) - -inode1="$(perl -e "print ((lstat('$outPath1/foo'))[1])")" -inode2="$(perl -e "print ((lstat('$outPath2/foo'))[1])")" -if [ "$inode1" != "$inode2" ]; then - echo "inodes do not match" - exit 1 -fi - -nlink="$(perl -e "print ((lstat('$outPath1/foo'))[3])")" -if [ "$nlink" != 3 ]; then - echo "link count incorrect" - exit 1 -fi - -outPath3=$(echo 'with import ./config.nix; mkDerivation { name = "foo3"; builder = builtins.toFile "builder" "mkdir $out; echo hello > $out/foo"; }' | nix-build - --no-out-link) - -inode3="$(perl -e "print ((lstat('$outPath3/foo'))[1])")" -if [ "$inode1" = "$inode3" ]; then - echo "inodes match unexpectedly" - exit 1 -fi - -nix-store --optimise - -inode1="$(perl -e "print ((lstat('$outPath1/foo'))[1])")" -inode3="$(perl -e "print ((lstat('$outPath3/foo'))[1])")" -if [ "$inode1" != "$inode3" ]; then - echo "inodes do not match" - exit 1 -fi - -nix-store --gc - -if [ -n "$(ls $NIX_STORE_DIR/.links)" ]; then - echo ".links directory not empty after GC" - exit 1 -fi diff --git a/tests/parallel.builder.sh b/tests/parallel.builder.sh deleted file mode 100644 index d092bc5a6b..0000000000 --- a/tests/parallel.builder.sh +++ /dev/null @@ -1,29 +0,0 @@ -echo "DOING $text" - - -# increase counter -while ! ln -s x $shared.lock 2> /dev/null; do - sleep 1 -done -test -f $shared.cur || echo 0 > $shared.cur -test -f $shared.max || echo 0 > $shared.max -new=$(($(cat $shared.cur) + 1)) -if test $new -gt $(cat $shared.max); then - echo $new > $shared.max -fi -echo $new > $shared.cur -rm $shared.lock - - -echo -n $(cat $inputs)$text > $out - -sleep $sleepTime - - -# decrease counter -while ! ln -s x $shared.lock 2> /dev/null; do - sleep 1 -done -test -f $shared.cur || echo 0 > $shared.cur -echo $(($(cat $shared.cur) - 1)) > $shared.cur -rm $shared.lock diff --git a/tests/parallel.nix b/tests/parallel.nix deleted file mode 100644 index 23f142059f..0000000000 --- a/tests/parallel.nix +++ /dev/null @@ -1,19 +0,0 @@ -{sleepTime ? 3}: - -with import ./config.nix; - -let - - mkDrv = text: inputs: mkDerivation { - name = "parallel"; - builder = ./parallel.builder.sh; - inherit text inputs shared sleepTime; - }; - - a = mkDrv "a" []; - b = mkDrv "b" [a]; - c = mkDrv "c" [a]; - d = mkDrv "d" [a]; - e = mkDrv "e" [b c d]; - -in e diff --git a/tests/parallel.sh b/tests/parallel.sh deleted file mode 100644 index 3b7bbe5a22..0000000000 --- a/tests/parallel.sh +++ /dev/null @@ -1,56 +0,0 @@ -source common.sh - - -# First, test that -jN performs builds in parallel. -echo "testing nix-build -j..." - -clearStore - -rm -f $_NIX_TEST_SHARED.cur $_NIX_TEST_SHARED.max - -outPath=$(nix-build -j10000 parallel.nix --no-out-link) - -echo "output path is $outPath" - -text=$(cat "$outPath") -if test "$text" != "abacade"; then exit 1; fi - -if test "$(cat $_NIX_TEST_SHARED.cur)" != 0; then fail "wrong current process count"; fi -if test "$(cat $_NIX_TEST_SHARED.max)" != 3; then fail "not enough parallelism"; fi - - -# Second, test that parallel invocations of nix-build perform builds -# in parallel, and don't block waiting on locks held by the others. -echo "testing multiple nix-build -j1..." - -clearStore - -rm -f $_NIX_TEST_SHARED.cur $_NIX_TEST_SHARED.max - -drvPath=$(nix-instantiate parallel.nix --argstr sleepTime 15) - -cmd="nix-store -j1 -r $drvPath" - -$cmd & -pid1=$! -echo "pid 1 is $pid1" - -$cmd & -pid2=$! -echo "pid 2 is $pid2" - -$cmd & -pid3=$! -echo "pid 3 is $pid3" - -$cmd & -pid4=$! -echo "pid 4 is $pid4" - -wait $pid1 || fail "instance 1 failed: $?" -wait $pid2 || fail "instance 2 failed: $?" -wait $pid3 || fail "instance 3 failed: $?" -wait $pid4 || fail "instance 4 failed: $?" - -if test "$(cat $_NIX_TEST_SHARED.cur)" != 0; then fail "wrong current process count"; fi -if test "$(cat $_NIX_TEST_SHARED.max)" != 3; then fail "not enough parallelism"; fi diff --git a/tests/referrers.sh b/tests/referrers.sh deleted file mode 100644 index 0a1c86e0ab..0000000000 --- a/tests/referrers.sh +++ /dev/null @@ -1,36 +0,0 @@ -source common.sh - -clearStore - -max=500 - -reference=$NIX_STORE_DIR/abcdef -touch $reference -(echo $reference && echo && echo 0) | nix-store --register-validity - -echo "making registration..." - -set +x -for ((n = 0; n < $max; n++)); do - storePath=$NIX_STORE_DIR/$n - echo -n > $storePath - ref2=$NIX_STORE_DIR/$((n+1)) - if test $((n+1)) = $max; then - ref2=$reference - fi - echo $storePath; echo; echo 2; echo $reference; echo $ref2 -done > $TEST_ROOT/reg_info -set -x - -echo "registering..." - -nix-store --register-validity < $TEST_ROOT/reg_info - -echo "collecting garbage..." -ln -sfn $reference "$NIX_STATE_DIR"/gcroots/ref -nix-store --gc - -if [ -n "$(type -p sqlite3)" -a "$(sqlite3 ./test-tmp/db/db.sqlite 'select count(*) from Refs')" -ne 0 ]; then - echo "referrers not cleaned up" - exit 1 -fi diff --git a/tests/remote-builds.nix b/tests/remote-builds.nix deleted file mode 100644 index 56514e1749..0000000000 --- a/tests/remote-builds.nix +++ /dev/null @@ -1,98 +0,0 @@ -# Test Nix's remote build feature. - -{ system, nix }: - -with import { inherit system; }; - -makeTest ({ pkgs, ... }: - -let - - # The configuration of the build slaves. - slave = - { config, pkgs, ... }: - { services.openssh.enable = true; - virtualisation.writableStore = true; - environment.nix = nix; - }; - - # Trivial Nix expression to build remotely. - expr = config: nr: pkgs.writeText "expr.nix" - '' - let utils = builtins.storePath ${config.system.build.extraUtils}; in - derivation { - name = "hello-${toString nr}"; - system = "i686-linux"; - PATH = "''${utils}/bin"; - builder = "''${utils}/bin/sh"; - args = [ "-c" "echo Hello; mkdir $out; cat /proc/sys/kernel/hostname > $out/host; sleep 3" ]; - } - ''; - -in - -{ - - nodes = - { slave1 = slave; - slave2 = slave; - - client = - { config, pkgs, ... }: - { nix.maxJobs = 0; # force remote building - nix.distributedBuilds = true; - nix.buildMachines = - [ { hostName = "slave1"; - sshUser = "root"; - sshKey = "/root/.ssh/id_dsa"; - system = "i686-linux"; - maxJobs = 1; - } - { hostName = "slave2"; - sshUser = "root"; - sshKey = "/root/.ssh/id_dsa"; - system = "i686-linux"; - maxJobs = 1; - } - ]; - virtualisation.writableStore = true; - virtualisation.pathsInNixDB = [ config.system.build.extraUtils ]; - environment.nix = nix; - }; - }; - - testScript = { nodes }: - '' - startAll; - - # Create an SSH key on the client. - my $key = `${pkgs.openssh}/bin/ssh-keygen -t dsa -f key -N ""`; - $client->succeed("mkdir -m 700 /root/.ssh"); - $client->copyFileFromHost("key", "/root/.ssh/id_dsa"); - $client->succeed("chmod 600 /root/.ssh/id_dsa"); - - # Install the SSH key on the slaves. - $client->waitForUnit("network.target"); - foreach my $slave ($slave1, $slave2) { - $slave->succeed("mkdir -m 700 /root/.ssh"); - $slave->copyFileFromHost("key.pub", "/root/.ssh/authorized_keys"); - $slave->waitForUnit("sshd"); - $client->succeed("ssh -o StrictHostKeyChecking=no " . $slave->name() . " 'echo hello world'"); - } - - # Perform a build and check that it was performed on the slave. - my $out = $client->succeed("nix-build ${expr nodes.client.config 1}"); - $slave1->succeed("test -e $out"); - - # And a parallel build. - my ($out1, $out2) = split /\s/, - $client->succeed("nix-store -r \$(nix-instantiate ${expr nodes.client.config 2} ${expr nodes.client.config 3})"); - $slave1->succeed("test -e $out1 -o -e $out2"); - $slave2->succeed("test -e $out1 -o -e $out2"); - - # Test whether the build hook automatically skips unavailable slaves. - $slave1->block; - $client->succeed("nix-build ${expr nodes.client.config 4}"); - ''; - -}) diff --git a/tests/remote-store.sh b/tests/remote-store.sh deleted file mode 100644 index 8312424f0a..0000000000 --- a/tests/remote-store.sh +++ /dev/null @@ -1,16 +0,0 @@ -source common.sh - -clearStore -clearManifests - -startDaemon - -$SHELL ./user-envs.sh - -nix-store --dump-db > $TEST_ROOT/d1 -NIX_REMOTE= nix-store --dump-db > $TEST_ROOT/d2 -cmp $TEST_ROOT/d1 $TEST_ROOT/d2 - -nix-store --gc --max-freed 1K - -killDaemon diff --git a/tests/repair.sh b/tests/repair.sh deleted file mode 100644 index ae82b649c6..0000000000 --- a/tests/repair.sh +++ /dev/null @@ -1,65 +0,0 @@ -source common.sh - -clearStore - -path=$(nix-build dependencies.nix -o $TEST_ROOT/result) -path2=$(nix-store -qR $path | grep input-2) - -nix-store --verify --check-contents -v - -hash=$(nix-hash $path2) - -# Corrupt a path and check whether nix-build --repair can fix it. -chmod u+w $path2 -touch $path2/bad - -if nix-store --verify --check-contents -v; then - echo "nix-store --verify succeeded unexpectedly" >&2 - exit 1 -fi - -if nix-store --verify --check-contents --repair; then - echo "nix-store --verify --repair succeeded unexpectedly" >&2 - exit 1 -fi - -nix-build dependencies.nix -o $TEST_ROOT/result --repair - -if [ "$(nix-hash $path2)" != "$hash" -o -e $path2/bad ]; then - echo "path not repaired properly" >&2 - exit 1 -fi - -# Corrupt a path that has a substitute and check whether nix-store -# --verify can fix it. -clearCache - -nix-push --dest $cacheDir $path - -chmod u+w $path2 -rm -rf $path2 - -nix-store --verify --check-contents --repair --option binary-caches "file://$cacheDir" - -if [ "$(nix-hash $path2)" != "$hash" -o -e $path2/bad ]; then - echo "path not repaired properly" >&2 - exit 1 -fi - -# Check --verify-path and --repair-path. -nix-store --verify-path $path2 - -chmod u+w $path2 -rm -rf $path2 - -if nix-store --verify-path $path2; then - echo "nix-store --verify-path succeeded unexpectedly" >&2 - exit 1 -fi - -nix-store --repair-path $path2 --option binary-caches "file://$cacheDir" - -if [ "$(nix-hash $path2)" != "$hash" -o -e $path2/bad ]; then - echo "path not repaired properly" >&2 - exit 1 -fi diff --git a/tests/secure-drv-outputs.nix b/tests/secure-drv-outputs.nix deleted file mode 100644 index b4ac8ff531..0000000000 --- a/tests/secure-drv-outputs.nix +++ /dev/null @@ -1,23 +0,0 @@ -with import ./config.nix; - -{ - - good = mkDerivation { - name = "good"; - builder = builtins.toFile "builder" - '' - mkdir $out - echo > $out/good - ''; - }; - - bad = mkDerivation { - name = "good"; - builder = builtins.toFile "builder" - '' - mkdir $out - echo > $out/bad - ''; - }; - -} diff --git a/tests/secure-drv-outputs.sh b/tests/secure-drv-outputs.sh deleted file mode 100644 index 4888123da9..0000000000 --- a/tests/secure-drv-outputs.sh +++ /dev/null @@ -1,37 +0,0 @@ -# Test that users cannot register specially-crafted derivations that -# produce output paths belonging to other derivations. This could be -# used to inject malware into the store. - -source common.sh - -clearStore -clearManifests - -startDaemon - -# Determine the output path of the "good" derivation. -goodOut=$(nix-store -q $(nix-instantiate ./secure-drv-outputs.nix -A good)) - -# Instantiate the "bad" derivation. -badDrv=$(nix-instantiate ./secure-drv-outputs.nix -A bad) -badOut=$(nix-store -q $badDrv) - -# Rewrite the bad derivation to produce the output path of the good -# derivation. -rm -f $TEST_ROOT/bad.drv -sed -e "s|$badOut|$goodOut|g" < $badDrv > $TEST_ROOT/bad.drv - -# Add the manipulated derivation to the store and build it. This -# should fail. -if badDrv2=$(nix-store --add $TEST_ROOT/bad.drv); then - nix-store -r "$badDrv2" -fi - -# Now build the good derivation. -goodOut2=$(nix-build ./secure-drv-outputs.nix -A good --no-out-link) -test "$goodOut" = "$goodOut2" - -if ! test -e "$goodOut"/good; then - echo "Bad derivation stole the output path of the good derivation!" - exit 1 -fi diff --git a/tests/simple.builder.sh b/tests/simple.builder.sh deleted file mode 100644 index 569e8ca88c..0000000000 --- a/tests/simple.builder.sh +++ /dev/null @@ -1,11 +0,0 @@ -echo "PATH=$PATH" - -# Verify that the PATH is empty. -if mkdir foo 2> /dev/null; then exit 1; fi - -# Set a PATH (!!! impure). -export PATH=$goodPath - -mkdir $out - -echo "Hello World!" > $out/hello \ No newline at end of file diff --git a/tests/simple.nix b/tests/simple.nix deleted file mode 100644 index 4223c0f23a..0000000000 --- a/tests/simple.nix +++ /dev/null @@ -1,8 +0,0 @@ -with import ./config.nix; - -mkDerivation { - name = "simple"; - builder = ./simple.builder.sh; - PATH = ""; - goodPath = path; -} diff --git a/tests/simple.sh b/tests/simple.sh deleted file mode 100644 index af8bccc2b4..0000000000 --- a/tests/simple.sh +++ /dev/null @@ -1,25 +0,0 @@ -source common.sh - -drvPath=$(nix-instantiate simple.nix) - -test "$(nix-store -q --binding system "$drvPath")" = "$system" - -echo "derivation is $drvPath" - -outPath=$(nix-store -rvv "$drvPath") - -echo "output path is $outPath" - -text=$(cat "$outPath"/hello) -if test "$text" != "Hello World!"; then exit 1; fi - -# Directed delete: $outPath is not reachable from a root, so it should -# be deleteable. -nix-store --delete $outPath -if test -e $outPath/hello; then false; fi - -outPath="$(NIX_STORE_DIR=/foo nix-instantiate --readonly-mode hash-check.nix)" -if test "$outPath" != "/foo/lfy1s6ca46rm5r6w4gg9hc0axiakjcnm-dependencies.drv"; then - echo "hashDerivationModulo appears broken, got $outPath" - exit 1 -fi diff --git a/tests/substituter.sh b/tests/substituter.sh deleted file mode 100755 index 9aab295de8..0000000000 --- a/tests/substituter.sh +++ /dev/null @@ -1,37 +0,0 @@ -#! /bin/sh -e -echo -echo substituter args: $* >&2 - -if test $1 = "--query"; then - while read cmd args; do - echo "CMD = $cmd, ARGS = $args" >&2 - if test "$cmd" = "have"; then - for path in $args; do - read path - if grep -q "$path" $TEST_ROOT/sub-paths; then - echo $path - fi - done - echo - elif test "$cmd" = "info"; then - for path in $args; do - echo $path - echo "" # deriver - echo 0 # nr of refs - echo $((1 * 1024 * 1024)) # download size - echo $((2 * 1024 * 1024)) # nar size - done - echo - else - echo "bad command $cmd" - exit 1 - fi - done -elif test $1 = "--substitute"; then - mkdir $2 - echo "Hallo Wereld" > $2/hello - echo # no expected hash -else - echo "unknown substituter operation" - exit 1 -fi diff --git a/tests/substituter2.sh b/tests/substituter2.sh deleted file mode 100755 index 5d1763599c..0000000000 --- a/tests/substituter2.sh +++ /dev/null @@ -1,33 +0,0 @@ -#! /bin/sh -e -echo -echo substituter2 args: $* >&2 - -if test $1 = "--query"; then - while read cmd args; do - if test "$cmd" = have; then - for path in $args; do - if grep -q "$path" $TEST_ROOT/sub-paths; then - echo $path - fi - done - echo - elif test "$cmd" = info; then - for path in $args; do - echo $path - echo "" # deriver - echo 0 # nr of refs - echo 0 # download size - echo 0 # nar size - done - echo - else - echo "bad command $cmd" - exit 1 - fi - done -elif test $1 = "--substitute"; then - exit 1 -else - echo "unknown substituter operation" - exit 1 -fi diff --git a/tests/substitutes.sh b/tests/substitutes.sh deleted file mode 100644 index 0c6adf2601..0000000000 --- a/tests/substitutes.sh +++ /dev/null @@ -1,22 +0,0 @@ -source common.sh - -clearStore - -# Instantiate. -drvPath=$(nix-instantiate simple.nix) -echo "derivation is $drvPath" - -# Find the output path. -outPath=$(nix-store -qvv "$drvPath") -echo "output path is $outPath" - -echo $outPath > $TEST_ROOT/sub-paths - -export NIX_SUBSTITUTERS=$(pwd)/substituter.sh - -nix-store -r "$drvPath" --dry-run 2>&1 | grep -q "1.00 MiB.*2.00 MiB" - -nix-store -rvv "$drvPath" - -text=$(cat "$outPath"/hello) -if test "$text" != "Hallo Wereld"; then echo "wrong substitute output: $text"; exit 1; fi diff --git a/tests/substitutes2.sh b/tests/substitutes2.sh deleted file mode 100644 index bd914575cc..0000000000 --- a/tests/substitutes2.sh +++ /dev/null @@ -1,21 +0,0 @@ -source common.sh - -clearStore - -# Instantiate. -drvPath=$(nix-instantiate simple.nix) -echo "derivation is $drvPath" - -# Find the output path. -outPath=$(nix-store -qvvvvv "$drvPath") -echo "output path is $outPath" - -echo $outPath > $TEST_ROOT/sub-paths - -# First try a substituter that fails, then one that succeeds -export NIX_SUBSTITUTERS=$(pwd)/substituter2.sh:$(pwd)/substituter.sh - -nix-store -j0 -rvv "$drvPath" - -text=$(cat "$outPath"/hello) -if test "$text" != "Hallo Wereld"; then echo "wrong substitute output: $text"; exit 1; fi diff --git a/tests/timeout.builder.sh b/tests/timeout.builder.sh deleted file mode 100644 index 1ddb44e99c..0000000000 --- a/tests/timeout.builder.sh +++ /dev/null @@ -1,2 +0,0 @@ -echo "\`timeout' builder entering an infinite loop" -while true ; do echo -n .; done diff --git a/tests/timeout.nix b/tests/timeout.nix deleted file mode 100644 index b41368bb38..0000000000 --- a/tests/timeout.nix +++ /dev/null @@ -1,6 +0,0 @@ -with import ./config.nix; - -mkDerivation { - name = "timeout"; - builder = ./timeout.builder.sh; -} diff --git a/tests/timeout.sh b/tests/timeout.sh deleted file mode 100644 index 4a4769a165..0000000000 --- a/tests/timeout.sh +++ /dev/null @@ -1,21 +0,0 @@ -# Test the `--timeout' option. - -source common.sh - -failed=0 -messages="`nix-build timeout.nix --timeout 2 2>&1 || failed=1`" -if [ $failed -ne 0 ]; then - echo "error: \`nix-store' succeeded; should have timed out" - exit 1 -fi - -if ! echo "$messages" | grep -q "timed out"; then - echo "error: build may have failed for reasons other than timeout; output:" - echo "$messages" >&2 - exit 1 -fi - -if nix-build timeout.nix --option build-max-log-size 100; then - echo "build should have failed" - exit 1 -fi diff --git a/tests/user-envs.builder.sh b/tests/user-envs.builder.sh deleted file mode 100644 index 5fafa797f1..0000000000 --- a/tests/user-envs.builder.sh +++ /dev/null @@ -1,5 +0,0 @@ -mkdir $out -mkdir $out/bin -echo "#! $shell" > $out/bin/$progName -echo "echo $name" >> $out/bin/$progName -chmod +x $out/bin/$progName diff --git a/tests/user-envs.nix b/tests/user-envs.nix deleted file mode 100644 index 1aa410cc96..0000000000 --- a/tests/user-envs.nix +++ /dev/null @@ -1,29 +0,0 @@ -# Some dummy arguments... -{ foo ? "foo" -}: - -with import ./config.nix; - -assert foo == "foo"; - -let - - makeDrv = name: progName: (mkDerivation { - inherit name progName system; - builder = ./user-envs.builder.sh; - } // { - meta = { - description = "A silly test package"; - }; - }); - -in - - [ - (makeDrv "foo-1.0" "foo") - (makeDrv "foo-2.0pre1" "foo") - (makeDrv "bar-0.1" "bar") - (makeDrv "foo-2.0" "foo") - (makeDrv "bar-0.1.1" "bar") - (makeDrv "foo-0.1" "foo" // { meta.priority = 10; }) - ] diff --git a/tests/user-envs.sh b/tests/user-envs.sh deleted file mode 100644 index 0d997acd69..0000000000 --- a/tests/user-envs.sh +++ /dev/null @@ -1,168 +0,0 @@ -source common.sh - -clearStore -clearProfiles - -set -x - -# Query installed: should be empty. -test "$(nix-env -p $profiles/test -q '*' | wc -l)" -eq 0 - -export HOME=$TEST_ROOT/home -mkdir -p $HOME -nix-env --switch-profile $profiles/test - -# Query available: should contain several. -test "$(nix-env -f ./user-envs.nix -qa '*' | wc -l)" -eq 6 -outPath10=$(nix-env -f ./user-envs.nix -qa --out-path --no-name '*' | grep foo-1.0) -drvPath10=$(nix-env -f ./user-envs.nix -qa --drv-path --no-name '*' | grep foo-1.0) -[ -n "$outPath10" -a -n "$drvPath10" ] - -# Query descriptions. -nix-env -f ./user-envs.nix -qa '*' --description | grep -q silly -rm -f $HOME/.nix-defexpr -ln -s $(pwd)/user-envs.nix $HOME/.nix-defexpr -nix-env -qa '*' --description | grep -q silly - -# Install "foo-1.0". -nix-env -i foo-1.0 - -# Query installed: should contain foo-1.0 now (which should be -# executable). -test "$(nix-env -q '*' | wc -l)" -eq 1 -nix-env -q '*' | grep -q foo-1.0 -test "$($profiles/test/bin/foo)" = "foo-1.0" - -# Test nix-env -qc to compare installed against available packages, and vice versa. -nix-env -qc '*' | grep -q '< 2.0' -nix-env -qac '*' | grep -q '> 1.0' - -# Test the -b flag to filter out source-only packages. -[ "$(nix-env -qab | wc -l)" -eq 1 ] - -# Test the -s flag to get package status. -nix-env -qas | grep -q 'IP- foo-1.0' -nix-env -qas | grep -q -- '--- bar-0.1' - -# Disable foo. -nix-env --set-flag active false foo -! [ -e "$profiles/test/bin/foo" ] - -# Enable foo. -nix-env --set-flag active true foo -[ -e "$profiles/test/bin/foo" ] - -# Store the path of foo-1.0. -outPath10_=$(nix-env -q --out-path --no-name '*' | grep foo-1.0) -echo "foo-1.0 = $outPath10" -[ "$outPath10" = "$outPath10_" ] - -# Install "foo-2.0pre1": should remove foo-1.0. -nix-env -i foo-2.0pre1 - -# Query installed: should contain foo-2.0pre1 now. -test "$(nix-env -q '*' | wc -l)" -eq 1 -nix-env -q '*' | grep -q foo-2.0pre1 -test "$($profiles/test/bin/foo)" = "foo-2.0pre1" - -# Upgrade "foo": should install foo-2.0. -NIX_PATH=nixpkgs=./user-envs.nix:$NIX_PATH nix-env -f '' -u foo - -# Query installed: should contain foo-2.0 now. -test "$(nix-env -q '*' | wc -l)" -eq 1 -nix-env -q '*' | grep -q foo-2.0 -test "$($profiles/test/bin/foo)" = "foo-2.0" - -# Store the path of foo-2.0. -outPath20=$(nix-env -q --out-path --no-name '*' | grep foo-2.0) -test -n "$outPath20" - -# Install bar-0.1, uninstall foo. -nix-env -i bar-0.1 -nix-env -e foo - -# Query installed: should only contain bar-0.1 now. -if nix-env -q '*' | grep -q foo; then false; fi -nix-env -q '*' | grep -q bar - -# Rollback: should bring "foo" back. -oldGen="$(nix-store -q --resolve $profiles/test)" -nix-env --rollback -[ "$(nix-store -q --resolve $profiles/test)" != "$oldGen" ] -nix-env -q '*' | grep -q foo-2.0 -nix-env -q '*' | grep -q bar - -# Rollback again: should remove "bar". -nix-env --rollback -nix-env -q '*' | grep -q foo-2.0 -if nix-env -q '*' | grep -q bar; then false; fi - -# Count generations. -nix-env --list-generations -test "$(nix-env --list-generations | wc -l)" -eq 7 - -# Switch to a specified generation. -nix-env --switch-generation 7 -[ "$(nix-store -q --resolve $profiles/test)" = "$oldGen" ] - -# Install foo-1.0, now using its store path. -nix-env -i "$outPath10" -nix-env -q '*' | grep -q foo-1.0 -nix-store -qR $profiles/test | grep "$outPath10" -nix-store -q --referrers-closure $profiles/test | grep "$(nix-store -q --resolve $profiles/test)" -[ "$(nix-store -q --deriver "$outPath10")" = $drvPath10 ] - -# Uninstall foo-1.0, using a symlink to its store path. -ln -sfn $outPath10/bin/foo $TEST_ROOT/symlink -nix-env -e $TEST_ROOT/symlink -if nix-env -q '*' | grep -q foo; then false; fi -! nix-store -qR $profiles/test | grep "$outPath10" - -# Install foo-1.0, now using a symlink to its store path. -nix-env -i $TEST_ROOT/symlink -nix-env -q '*' | grep -q foo - -# Delete all old generations. -nix-env --delete-generations old - -# Run the garbage collector. This should get rid of foo-2.0 but not -# foo-1.0. -nix-collect-garbage -test -e "$outPath10" -! [ -e "$outPath20" ] - -# Uninstall everything -nix-env -e '*' -test "$(nix-env -q '*' | wc -l)" -eq 0 - -# Installing "foo" should only install the newest foo. -nix-env -i foo -test "$(nix-env -q '*' | grep foo- | wc -l)" -eq 1 -nix-env -q '*' | grep -q foo-2.0 - -# On the other hand, this should install both (and should fail due to -# a collision). -nix-env -e '*' -! nix-env -i foo-1.0 foo-2.0 - -# Installing "*" should install one foo and one bar. -nix-env -e '*' -nix-env -i '*' -test "$(nix-env -q '*' | wc -l)" -eq 2 -nix-env -q '*' | grep -q foo-2.0 -nix-env -q '*' | grep -q bar-0.1.1 - -# Test priorities: foo-0.1 has a lower priority than foo-1.0, so it -# should be possible to install both without a collision. Also test -# ‘--set-flag priority’ to manually override the declared priorities. -nix-env -e '*' -nix-env -i foo-0.1 foo-1.0 -[ "$($profiles/test/bin/foo)" = "foo-1.0" ] -nix-env --set-flag priority 1 foo-0.1 -[ "$($profiles/test/bin/foo)" = "foo-0.1" ] - -# Test nix-env --set. -nix-env --set $outPath10 -[ "$(nix-store -q --resolve $profiles/test)" = $outPath10 ] -nix-env --set $drvPath10 -[ "$(nix-store -q --resolve $profiles/test)" = $outPath10 ] diff --git a/version b/version deleted file mode 100644 index 7c483e8f4f..0000000000 --- a/version +++ /dev/null @@ -1 +0,0 @@ -1.7 \ No newline at end of file