nova-nix-0.9.0.0: nova-nix.cabal
cabal-version: 3.0
name: nova-nix
version: 0.9.0.0
synopsis: Windows-native Nix implementation in Haskell and C99
description:
An implementation of Nix for Windows, written in Haskell with a C99
data layer that keeps evaluation data off the GHC heap. It also runs
on macOS and Linux. It has its own parser, lazy evaluator, store,
derivation builder and binary-cache substituter, and does not need an
existing Nix installation.
On the 22 derivations its CI checks, over pinned pairs of Nix and
nixpkgs from 2.24.9 with nixpkgs 24.11 to 2.35.4 with nixpkgs unstable,
the derivation paths it computes match upstream. On Windows it builds
packages from source through a stage-1 stdenv over a store-pinned
MinGW-w64 toolchain. The project is experimental; see the README for
what is not implemented yet.
Evaluation needs the C data layer, so library code must run it between
@Nix.Eval.Arena.arenaInit@ and @Nix.Eval.Arena.arenaDestroy@.
Built on @nova-cache@ for NAR serialization, narinfo handling, and
Ed25519-signed binary substitution.
license: Apache-2.0
license-file: LICENSE
copyright: 2026 Novavero AI Inc.
author: Devon Tomlin
maintainer: devon.tomlin@novavero.ai
homepage: https://github.com/Novavero-AI/nova-nix
bug-reports: https://github.com/Novavero-AI/nova-nix/issues
category: Nix, Distribution, System
stability: experimental
build-type: Simple
tested-with: GHC == 9.14.1
extra-doc-files:
CHANGELOG.md
NOTICE
README.md
-- C data-layer headers. These are #included by the cbits/*.c sources
-- (via include-dirs: cbits) but are not auto-added to the sdist by the
-- c-sources field, so they must be listed here or the Hackage build
-- fails with "nn_*.h: No such file or directory".
extra-source-files:
cbits/*.h
data-files:
nix/fetchurl.nix
data-dir: data
-- ---------------------------------------------------------------------------
-- Library: core modules (parser, evaluator, store, builder, substituter)
-- ---------------------------------------------------------------------------
library
exposed-modules:
Nix.Expr
Nix.Expr.ClosureTrim
Nix.Expr.Resolve
Nix.Expr.Types
Nix.Parser
Nix.Parser.Expr
Nix.Parser.Internal
Nix.Parser.Lexer
Nix.Parser.ParseError
Nix.Eval
Nix.Eval.CallDepth
Nix.Eval.CanonPath
Nix.Eval.Context
Nix.Eval.Types
Nix.Eval.IO
Nix.Eval.Policy
Nix.Eval.Operator
Nix.Eval.Print
Nix.Eval.SourceError
Nix.Eval.StringInterp
Nix.Eval.Symbol
Nix.Eval.CAttrSet
Nix.Eval.CThunk
Nix.Eval.CEnv
Nix.Eval.CLambda
Nix.Eval.CList
Nix.Eval.CCtxStr
Nix.Eval.CBytecode
Nix.Eval.Compile
Nix.Eval.EvalFormals
Nix.Eval.Arena
Nix.Eval.AttrPath
Nix.Eval.CStatus
Nix.Store
Nix.Store.Path
Nix.Store.Path.Internal
Nix.Store.DB
Nix.Store.GC
Nix.Store.Handle
Nix.Store.Lock
Nix.Store.Symlink
Nix.Store.CaseSensitive
Nix.Store.EntryName
Nix.Store.ExecBit
Nix.DependencyGraph
Nix.Derivation
Nix.Derivation.StructuredAttrs
Nix.Builder
Nix.Builder.Unpack
Nix.Compression
Nix.Config
Nix.Environment
Nix.HostPath
Nix.Push
Nix.Substituter
Nix.Builtins
Nix.Hash
Nix.Http
Nix.Json
autogen-modules: Paths_nova_nix
other-modules:
Nix.Store.Exclusive
Paths_nova_nix
build-depends:
base >= 4.22 && < 5
, array >= 0.5 && < 0.6
, bytestring >= 0.11 && < 0.13
, containers >= 0.6 && < 0.9
, crypton >= 1.1 && < 2
, directory >= 1.3.8 && < 1.4
, filepath >= 1.4.100 && < 1.6
, http-client >= 0.7 && < 0.8
, http-client-tls >= 0.3 && < 0.5
, http-types >= 0.12 && < 0.13
, ram >= 0.20 && < 1
, filelock >= 0.1.1 && < 0.2
, mtl >= 2.2 && < 2.4
, nova-cache:{nova-cache, xz, zstandard, bzip2} >= 0.11.1.1 && < 0.12
, process >= 1.6 && < 1.7
, random >= 1.2 && < 1.4
, regex-tdfa >= 1.3 && < 1.4
, sqlite-simple >= 0.4 && < 0.5
, tar >= 0.7.1 && < 0.8
, text >= 2.0 && < 2.2
, time >= 1.9 && < 1.17
, zstd >= 0.1 && < 0.2
-- Platform calls base cannot express: the exclusive create behind NAR
-- unpacking (Nix.Store.Exclusive), and reading the environment as
-- bytes on POSIX (Nix.Environment; getenv, as upstream reads it), where
-- Windows reads it through base's UTF-16 API. Win32 2.9 is the first
-- whose hANDLEToHandle serves the native Windows I/O manager; unix 2.8
-- is the first whose openFd takes creat and cloexec in its flags.
if os(windows)
build-depends:
Win32 >= 2.9 && < 2.15
else
build-depends:
unix >= 2.8 && < 2.9
c-sources:
cbits/nn_symbol.c
cbits/nn_attrset.c
cbits/nn_thunk.c
cbits/nn_env.c
cbits/nn_list.c
cbits/nn_ctxstr.c
cbits/nn_arena.c
cbits/nn_bytecode.c
cbits/nn_lambda.c
cbits/nn_winfs.c
cbits/nn_darwinfs.c
include-dirs: cbits
-- -Werror deliberately NOT baked in: a future gcc/clang adding a new
-- -Wall diagnostic must not retroactively break installing published
-- releases. CI enforces warnings-as-errors via its C99-strict job.
cc-options: -std=c99 -Wall -Wextra -pedantic
hs-source-dirs: src
default-language: Haskell2010
default-extensions:
BangPatterns
OverloadedStrings
ghc-options:
-Wall
-Wcompat
-Wincomplete-record-updates
-Wincomplete-uni-patterns
-- GHC 9.14 deprecates the pattern namespace specifier in import and
-- export lists in favour of data, but hlint (through 3.10) cannot
-- parse the replacement. The old spelling stays, warning muted,
-- until hlint learns it (then: pattern -> data, drop these flags).
-Wno-pattern-namespace-specifier
-- ---------------------------------------------------------------------------
-- CLI executable
-- ---------------------------------------------------------------------------
executable nova-nix
main-is: Main.hs
hs-source-dirs: app
autogen-modules: Paths_nova_nix
other-modules: Paths_nova_nix
default-language: Haskell2010
default-extensions:
OverloadedStrings
ghc-options: -Wall -Wcompat -threaded -rtsopts
-- file-io reads a config file by the bytes of its path. 0.1.1 is the
-- first whose read does not create a missing file on Windows, which
-- would turn a missing include into an empty one.
build-depends:
base >= 4.22 && < 5
, bytestring >= 0.11 && < 0.13
, containers >= 0.6 && < 0.9
, directory >= 1.3.8 && < 1.4
, file-io >= 0.1.1 && < 0.2
, filepath >= 1.4.100 && < 1.6
, nova-nix
, text >= 2.0 && < 2.2
-- ---------------------------------------------------------------------------
-- Tests
-- ---------------------------------------------------------------------------
test-suite nova-nix-test
type: exitcode-stdio-1.0
main-is: Main.hs
hs-source-dirs: test
other-modules: HttpFixture
default-language: Haskell2010
default-extensions:
OverloadedStrings
-- -threaded: the path-lock race tests hold a blocking OS file lock in
-- one thread while another waits on it, which needs real concurrency
-- under blocking foreign calls.
ghc-options: -Wall -Wcompat -Wno-pattern-namespace-specifier -threaded
build-depends:
base >= 4.22 && < 5
, async >= 2.2 && < 2.3
, bytestring >= 0.11 && < 0.13
, containers >= 0.6 && < 0.9
, directory >= 1.3 && < 1.4
, filepath >= 1.4.100 && < 1.6
, http-client >= 0.7 && < 0.8
, http-types >= 0.12 && < 0.13
, network >= 3.2 && < 3.3
, nova-cache:{nova-cache, zstandard} >= 0.11.1.1 && < 0.12
, nova-nix
, process >= 1.6.12 && < 1.7
, QuickCheck >= 2.12.5 && < 2.19
, sqlite-simple >= 0.4 && < 0.5
, tar >= 0.7.1 && < 0.8
, text >= 2.0 && < 2.2
, zstd >= 0.1 && < 0.2
source-repository head
type: git
location: https://github.com/Novavero-AI/nova-nix
branch: main