diff --git a/ci.nix b/ci.nix index 942166ea..575d84f6 100644 --- a/ci.nix +++ b/ci.nix @@ -6,6 +6,7 @@ let pkgs = import nixpkgs-path {}; + # xo.nix now returns a plain attrset (not pkgs.extend) xoPkgs = import ./xo.nix { inherit pkgs; }; in diff --git a/default.nix b/default.nix index 9cb962bd..c0666ee3 100644 --- a/default.nix +++ b/default.nix @@ -112,111 +112,9 @@ let }); }; + # xo packages defined in xo.nix; wrap as overlay so pkgs.xo-* works xo-overlay = self: super: - # use 'super' when you want to override the terms of a package. - # use 'self' when pointing to an existing package - - let - # note: - # - problems with nix llvm build-from-source w/ gcc 13.3. - # - building outside nix following linuxfromscratch instructions, using gcc 12.3, works fine. - # - llvmXo = self.callPackage pkgs/llvm.nix {}; - - # Choose the LLVM version you want - llvmPackages1 = super.llvmPackages_18; - - in - let - - # on darwin, rebuild stdenv to use clang tied to that LLVM version. - # otherwise we get conflicts since darwin stdenv is using clang+llvm for gcc. - # - clangStdenv = super.overrideCC super.stdenv llvmPackages1.clang; - - # stdenv to use for xo-jit - jitStdenv = if super.stdenv.isDarwin then clangStdenv else super.stdenv; - - in - { - xo-cmake = self.callPackage pkgs/xo-cmake.nix { stdenv = jitStdenv; }; - xo-indentlog = self.callPackage pkgs/xo-indentlog.nix { stdenv = jitStdenv; buildDocs = true; buildExamples = true; }; - xo-reflectutil = self.callPackage pkgs/xo-reflectutil.nix { stdenv = jitStdenv; }; - xo-randomgen = self.callPackage pkgs/xo-randomgen.nix { stdenv = jitStdenv; buildExamples = true; }; - xo-arena = self.callPackage pkgs/xo-arena.nix { stdenv = jitStdenv; buildDocs = true; }; - xo-facet = self.callPackage pkgs/xo-facet.nix { stdenv = jitStdenv; }; - xo-allocutil = self.callPackage pkgs/xo-allocutil.nix { stdenv = jitStdenv; }; - xo-refcnt = self.callPackage pkgs/xo-refcnt.nix { stdenv = jitStdenv; }; - xo-subsys = self.callPackage pkgs/xo-subsys.nix { stdenv = jitStdenv; }; - xo-testutil = self.callPackage pkgs/xo-testutil.nix { stdenv = jitStdenv; }; - xo-flatstring = self.callPackage pkgs/xo-flatstring.nix { stdenv = jitStdenv; buildDocs = true; buildExamples = true; }; - xo-pyutil = self.callPackage pkgs/xo-pyutil.nix { stdenv = jitStdenv; }; - xo-reflect = self.callPackage pkgs/xo-reflect.nix { stdenv = jitStdenv; }; - xo-pyreflect = self.callPackage pkgs/xo-pyreflect.nix { stdenv = jitStdenv; }; - xo-ratio = self.callPackage pkgs/xo-ratio.nix { stdenv = jitStdenv; buildDocs = true; buildExamples = true; }; - xo-unit = self.callPackage pkgs/xo-unit.nix { stdenv = jitStdenv; buildDocs = true; buildExamples = true; }; - xo-pyunit = self.callPackage pkgs/xo-pyunit.nix { stdenv = jitStdenv; }; - xo-callback = self.callPackage pkgs/xo-callback.nix { stdenv = jitStdenv; }; - xo-printable2 = self.callPackage pkgs/xo-printable2.nix { stdenv = jitStdenv; }; - xo-alloc = self.callPackage pkgs/xo-alloc.nix { stdenv = jitStdenv; buildDocs = true; }; - xo-alloc2 = self.callPackage pkgs/xo-alloc2.nix { stdenv = jitStdenv; buildDocs = true; }; - xo-stringtable2 = self.callPackage pkgs/xo-stringtable2.nix { stdenv = jitStdenv; }; - xo-gc = self.callPackage pkgs/xo-gc.nix { stdenv = jitStdenv; buildDocs = true; }; - xo-object = self.callPackage pkgs/xo-object.nix { stdenv = jitStdenv; }; - xo-type = self.callPackage pkgs/xo-type.nix { stdenv = jitStdenv; }; - xo-object2 = self.callPackage pkgs/xo-object2.nix { stdenv = jitStdenv; }; - - xo-procedure2 = self.callPackage pkgs/xo-procedure2.nix { stdenv = jitStdenv; }; - xo-numeric = self.callPackage pkgs/xo-numeric.nix { stdenv = jitStdenv; }; - - xo-ordinaltree = self.callPackage pkgs/xo-ordinaltree.nix { stdenv = jitStdenv; }; - xo-tokenizer2 = self.callPackage pkgs/xo-tokenizer2.nix { stdenv = jitStdenv; buildExamples = true; }; - # - # xo-expression2 - # xo-reader2 - # xo-interpreter2 - # - xo-webutil = self.callPackage pkgs/xo-webutil.nix { stdenv = jitStdenv; }; - xo-pywebutil = self.callPackage pkgs/xo-pywebutil.nix {}; - xo-printjson = self.callPackage pkgs/xo-printjson.nix {}; - xo-pyprintjson = self.callPackage pkgs/xo-pyprintjson.nix {}; - xo-reactor = self.callPackage pkgs/xo-reactor.nix {}; - xo-pyreactor = self.callPackage pkgs/xo-pyreactor.nix {}; - xo-websock = self.callPackage pkgs/xo-websock.nix {}; - xo-pywebsock = self.callPackage pkgs/xo-pywebsock.nix {}; - # - xo-statistics = self.callPackage pkgs/xo-statistics.nix {}; - xo-distribution = self.callPackage pkgs/xo-distribution.nix {}; - xo-pydistribution = self.callPackage pkgs/xo-pydistribution.nix {}; - xo-simulator = self.callPackage pkgs/xo-simulator.nix {}; - xo-pysimulator = self.callPackage pkgs/xo-pysimulator.nix {}; - xo-process = self.callPackage pkgs/xo-process.nix {}; - xo-pyprocess = self.callPackage pkgs/xo-pyprocess.nix {}; - xo-kalmanfilter = self.callPackage pkgs/xo-kalmanfilter.nix {}; - xo-pykalmanfilter = self.callPackage pkgs/xo-pykalmanfilter.nix {}; - # - - xo-expression = self.callPackage pkgs/xo-expression.nix { buildExamples = true; }; - xo-pyexpression = self.callPackage pkgs/xo-pyexpression.nix {}; - xo-tokenizer = self.callPackage pkgs/xo-tokenizer.nix { buildDocs = true; buildExamples = true; }; - xo-reader = self.callPackage pkgs/xo-reader.nix { buildDocs = true; buildExamples = true; }; - - xo-jit = self.callPackage pkgs/xo-jit.nix { buildDocs = true; buildExamples = true; - #stdenv = jitStdenv; - #clang = llvmPackages2.clang; - llvm = llvmPackages1.llvm; }; - xo-pyjit = self.callPackage pkgs/xo-pyjit.nix {}; - - # - xo-userenv = self.callPackage pkgs/xo-userenv.nix {}; - xo-userenv-slow = self.callPackage pkgs/xo-userenv-slow.nix { stdenv = jitStdenv; - #clang = llvmPackages.clang; - llvm = llvmPackages1.llvm; - }; - # xo-packaged version of llvm; fewer packaging features than nixpkgs - # but easier to debug/modify - llvmXo = llvmXo; - }; + import ./xo.nix { pkgs = self; }; in let diff --git a/patches/git-subtree-cache-fix.patch b/patches/git-subtree-cache-fix.patch new file mode 100644 index 00000000..798e52c1 --- /dev/null +++ b/patches/git-subtree-cache-fix.patch @@ -0,0 +1,18 @@ +--- a/git-subtree ++++ b/git-subtree +@@ -341,7 +341,13 @@ cache_set () { + if test "$oldrev" != "latest_old" && + test "$oldrev" != "latest_new" && + test -e "$cachedir/$oldrev" + then +- die "fatal: cache for $oldrev already exists!" ++ existing=$(cat "$cachedir/$oldrev") ++ if test "$existing" = "$newrev" ++ then ++ return ++ else ++ die "fatal: cache for $oldrev already exists!" ++ fi + fi + echo "$newrev" >"$cachedir/$oldrev" +} diff --git a/patches/junk b/patches/junk new file mode 100644 index 00000000..68fc55ff --- /dev/null +++ b/patches/junk @@ -0,0 +1,17 @@ +--- a/git-subtree ++++ b/git-subtree +@@ -339,7 +339,13 @@ cache_set () { + test "$oldrev" != "latest_new" && + test -e "$cachedir/$oldrev" + then +- die "fatal: cache for $oldrev already exists!" ++ existing=$(cat "$cachedir/$oldrev") ++ if test "$existing" = "$newrev" ++ then ++ return ++ else ++ die "fatal: cache for $oldrev already exists!" ++ fi + fi + echo "$newrev" >"$cachedir/$oldrev" +} diff --git a/xo.nix b/xo.nix index a2d8b474..a6bcfdf5 100644 --- a/xo.nix +++ b/xo.nix @@ -1,83 +1,88 @@ -# xo.nix - xo package overlay, independent of nixpkgs source +# xo.nix - xo package set, independent of nixpkgs source # Accepts a pkgs instance (with or without non-xo overlays applied) -# Returns pkgs extended with xo packages +# Returns attrset of xo packages. +# +# Callers decide how to consume: +# ci.nix - uses as plain attrset +# default.nix - wraps as overlay for dev shell # { pkgs }: let - xo-overlay = self: super: - let - llvmXo = self.callPackage pkgs/llvm.nix {}; + inherit (pkgs) lib stdenv; - llvmPackages1 = super.llvmPackages_18; + llvmXo = lib.callPackageWith (pkgs // xoPackages) pkgs/llvm.nix {}; - clangStdenv = super.overrideCC super.stdenv llvmPackages1.clang; + llvmPackages1 = pkgs.llvmPackages_18; - jitStdenv = if super.stdenv.isDarwin then clangStdenv else super.stdenv; - in - { - xo-cmake = self.callPackage pkgs/xo-cmake.nix { stdenv = jitStdenv; }; - xo-indentlog = self.callPackage pkgs/xo-indentlog.nix { stdenv = jitStdenv; buildDocs = true; buildExamples = true; }; - xo-reflectutil = self.callPackage pkgs/xo-reflectutil.nix { stdenv = jitStdenv; }; - xo-randomgen = self.callPackage pkgs/xo-randomgen.nix { stdenv = jitStdenv; buildExamples = true; }; - xo-arena = self.callPackage pkgs/xo-arena.nix { stdenv = jitStdenv; buildDocs = true; }; - xo-facet = self.callPackage pkgs/xo-facet.nix { stdenv = jitStdenv; }; - xo-allocutil = self.callPackage pkgs/xo-allocutil.nix { stdenv = jitStdenv; }; - xo-refcnt = self.callPackage pkgs/xo-refcnt.nix { stdenv = jitStdenv; }; - xo-subsys = self.callPackage pkgs/xo-subsys.nix { stdenv = jitStdenv; }; - xo-testutil = self.callPackage pkgs/xo-testutil.nix { stdenv = jitStdenv; }; - xo-flatstring = self.callPackage pkgs/xo-flatstring.nix { stdenv = jitStdenv; buildDocs = true; buildExamples = true; }; - xo-pyutil = self.callPackage pkgs/xo-pyutil.nix { stdenv = jitStdenv; }; - xo-reflect = self.callPackage pkgs/xo-reflect.nix { stdenv = jitStdenv; }; - xo-pyreflect = self.callPackage pkgs/xo-pyreflect.nix { stdenv = jitStdenv; }; - xo-ratio = self.callPackage pkgs/xo-ratio.nix { stdenv = jitStdenv; buildDocs = true; buildExamples = true; }; - xo-unit = self.callPackage pkgs/xo-unit.nix { stdenv = jitStdenv; buildDocs = true; buildExamples = true; }; - xo-pyunit = self.callPackage pkgs/xo-pyunit.nix { stdenv = jitStdenv; }; - xo-callback = self.callPackage pkgs/xo-callback.nix { stdenv = jitStdenv; }; - xo-printable2 = self.callPackage pkgs/xo-printable2.nix { stdenv = jitStdenv; }; - xo-alloc = self.callPackage pkgs/xo-alloc.nix { stdenv = jitStdenv; buildDocs = true; }; - xo-alloc2 = self.callPackage pkgs/xo-alloc2.nix { stdenv = jitStdenv; buildDocs = true; }; - xo-stringtable2 = self.callPackage pkgs/xo-stringtable2.nix { stdenv = jitStdenv; }; - xo-gc = self.callPackage pkgs/xo-gc.nix { stdenv = jitStdenv; buildDocs = true; }; - xo-object = self.callPackage pkgs/xo-object.nix { stdenv = jitStdenv; }; - xo-type = self.callPackage pkgs/xo-type.nix { stdenv = jitStdenv; }; - xo-object2 = self.callPackage pkgs/xo-object2.nix { stdenv = jitStdenv; }; - xo-procedure2 = self.callPackage pkgs/xo-procedure2.nix { stdenv = jitStdenv; }; - xo-numeric = self.callPackage pkgs/xo-numeric.nix { stdenv = jitStdenv; }; - xo-ordinaltree = self.callPackage pkgs/xo-ordinaltree.nix { stdenv = jitStdenv; }; - xo-tokenizer2 = self.callPackage pkgs/xo-tokenizer2.nix { stdenv = jitStdenv; buildExamples = true; }; - xo-webutil = self.callPackage pkgs/xo-webutil.nix {}; - xo-pywebutil = self.callPackage pkgs/xo-pywebutil.nix {}; - xo-printjson = self.callPackage pkgs/xo-printjson.nix {}; - xo-pyprintjson = self.callPackage pkgs/xo-pyprintjson.nix {}; - xo-reactor = self.callPackage pkgs/xo-reactor.nix {}; - xo-pyreactor = self.callPackage pkgs/xo-pyreactor.nix {}; - xo-websock = self.callPackage pkgs/xo-websock.nix {}; - xo-pywebsock = self.callPackage pkgs/xo-pywebsock.nix {}; - xo-statistics = self.callPackage pkgs/xo-statistics.nix {}; - xo-distribution = self.callPackage pkgs/xo-distribution.nix {}; - xo-pydistribution = self.callPackage pkgs/xo-pydistribution.nix {}; - xo-simulator = self.callPackage pkgs/xo-simulator.nix {}; - xo-pysimulator = self.callPackage pkgs/xo-pysimulator.nix {}; - xo-process = self.callPackage pkgs/xo-process.nix {}; - xo-pyprocess = self.callPackage pkgs/xo-pyprocess.nix {}; - xo-kalmanfilter = self.callPackage pkgs/xo-kalmanfilter.nix {}; - xo-pykalmanfilter = self.callPackage pkgs/xo-pykalmanfilter.nix {}; - xo-expression = self.callPackage pkgs/xo-expression.nix { buildExamples = true; }; - xo-pyexpression = self.callPackage pkgs/xo-pyexpression.nix {}; - xo-tokenizer = self.callPackage pkgs/xo-tokenizer.nix { buildDocs = true; buildExamples = true; }; - xo-reader = self.callPackage pkgs/xo-reader.nix { buildDocs = true; buildExamples = true; }; - xo-jit = self.callPackage pkgs/xo-jit.nix { buildDocs = true; buildExamples = true; - llvm = llvmPackages1.llvm; }; - xo-pyjit = self.callPackage pkgs/xo-pyjit.nix {}; - xo-userenv = self.callPackage pkgs/xo-userenv.nix {}; - xo-userenv-slow = self.callPackage pkgs/xo-userenv-slow.nix { stdenv = jitStdenv; - llvm = llvmPackages1.llvm; }; - llvmXo = llvmXo; - }; + clangStdenv = pkgs.overrideCC stdenv llvmPackages1.clang; - # applies overlay to already-constructed package collection - xoPkgs = pkgs.extend xo-overlay; + # stdenv to use for xo-jit and friends + jitStdenv = if stdenv.isDarwin then clangStdenv else stdenv; -in -xoPkgs + # callPackageWith sees both nixpkgs AND xo packages, + # so xo-alloc2 can resolve xo-arena etc. + callPackage = lib.callPackageWith (pkgs // xoPackages); + + xoPackages = { + xo-cmake = callPackage pkgs/xo-cmake.nix { stdenv = jitStdenv; }; + xo-indentlog = callPackage pkgs/xo-indentlog.nix { stdenv = jitStdenv; buildDocs = true; buildExamples = true; }; + xo-reflectutil = callPackage pkgs/xo-reflectutil.nix { stdenv = jitStdenv; }; + xo-randomgen = callPackage pkgs/xo-randomgen.nix { stdenv = jitStdenv; buildExamples = true; }; + xo-arena = callPackage pkgs/xo-arena.nix { stdenv = jitStdenv; buildDocs = true; }; + xo-facet = callPackage pkgs/xo-facet.nix { stdenv = jitStdenv; }; + xo-allocutil = callPackage pkgs/xo-allocutil.nix { stdenv = jitStdenv; }; + xo-refcnt = callPackage pkgs/xo-refcnt.nix { stdenv = jitStdenv; }; + xo-subsys = callPackage pkgs/xo-subsys.nix { stdenv = jitStdenv; }; + xo-testutil = callPackage pkgs/xo-testutil.nix { stdenv = jitStdenv; }; + xo-flatstring = callPackage pkgs/xo-flatstring.nix { stdenv = jitStdenv; buildDocs = true; buildExamples = true; }; + xo-pyutil = callPackage pkgs/xo-pyutil.nix { stdenv = jitStdenv; }; + xo-reflect = callPackage pkgs/xo-reflect.nix { stdenv = jitStdenv; }; + xo-pyreflect = callPackage pkgs/xo-pyreflect.nix { stdenv = jitStdenv; }; + xo-ratio = callPackage pkgs/xo-ratio.nix { stdenv = jitStdenv; buildDocs = true; buildExamples = true; }; + xo-unit = callPackage pkgs/xo-unit.nix { stdenv = jitStdenv; buildDocs = true; buildExamples = true; }; + xo-pyunit = callPackage pkgs/xo-pyunit.nix { stdenv = jitStdenv; }; + xo-callback = callPackage pkgs/xo-callback.nix { stdenv = jitStdenv; }; + xo-printable2 = callPackage pkgs/xo-printable2.nix { stdenv = jitStdenv; }; + xo-alloc = callPackage pkgs/xo-alloc.nix { stdenv = jitStdenv; buildDocs = true; }; + xo-alloc2 = callPackage pkgs/xo-alloc2.nix { stdenv = jitStdenv; buildDocs = true; }; + xo-stringtable2 = callPackage pkgs/xo-stringtable2.nix { stdenv = jitStdenv; }; + xo-gc = callPackage pkgs/xo-gc.nix { stdenv = jitStdenv; buildDocs = true; }; + xo-object = callPackage pkgs/xo-object.nix { stdenv = jitStdenv; }; + xo-type = callPackage pkgs/xo-type.nix { stdenv = jitStdenv; }; + xo-object2 = callPackage pkgs/xo-object2.nix { stdenv = jitStdenv; }; + xo-procedure2 = callPackage pkgs/xo-procedure2.nix { stdenv = jitStdenv; }; + xo-numeric = callPackage pkgs/xo-numeric.nix { stdenv = jitStdenv; }; + xo-ordinaltree = callPackage pkgs/xo-ordinaltree.nix { stdenv = jitStdenv; }; + xo-tokenizer2 = callPackage pkgs/xo-tokenizer2.nix { stdenv = jitStdenv; buildExamples = true; }; + xo-webutil = callPackage pkgs/xo-webutil.nix { stdenv = jitStdenv; }; + xo-pywebutil = callPackage pkgs/xo-pywebutil.nix {}; + xo-printjson = callPackage pkgs/xo-printjson.nix {}; + xo-pyprintjson = callPackage pkgs/xo-pyprintjson.nix {}; + xo-reactor = callPackage pkgs/xo-reactor.nix {}; + xo-pyreactor = callPackage pkgs/xo-pyreactor.nix {}; + xo-websock = callPackage pkgs/xo-websock.nix {}; + xo-pywebsock = callPackage pkgs/xo-pywebsock.nix {}; + xo-statistics = callPackage pkgs/xo-statistics.nix {}; + xo-distribution = callPackage pkgs/xo-distribution.nix {}; + xo-pydistribution = callPackage pkgs/xo-pydistribution.nix {}; + xo-simulator = callPackage pkgs/xo-simulator.nix {}; + xo-pysimulator = callPackage pkgs/xo-pysimulator.nix {}; + xo-process = callPackage pkgs/xo-process.nix {}; + xo-pyprocess = callPackage pkgs/xo-pyprocess.nix {}; + xo-kalmanfilter = callPackage pkgs/xo-kalmanfilter.nix {}; + xo-pykalmanfilter = callPackage pkgs/xo-pykalmanfilter.nix {}; + xo-expression = callPackage pkgs/xo-expression.nix { buildExamples = true; }; + xo-pyexpression = callPackage pkgs/xo-pyexpression.nix {}; + xo-tokenizer = callPackage pkgs/xo-tokenizer.nix { buildDocs = true; buildExamples = true; }; + xo-reader = callPackage pkgs/xo-reader.nix { buildDocs = true; buildExamples = true; }; + xo-jit = callPackage pkgs/xo-jit.nix { buildDocs = true; buildExamples = true; + llvm = llvmPackages1.llvm; }; + xo-pyjit = callPackage pkgs/xo-pyjit.nix {}; + xo-userenv = callPackage pkgs/xo-userenv.nix {}; + xo-userenv-slow = callPackage pkgs/xo-userenv-slow.nix { stdenv = jitStdenv; + llvm = llvmPackages1.llvm; }; + inherit llvmXo; + }; + +in xoPackages