From c7293111e8e81ca36ae1ca454c3765a10d2f5b87 Mon Sep 17 00:00:00 2001 From: piegames Date: Sat, 10 Jul 2021 19:05:40 +0200 Subject: [PATCH] Add Nix CI --- .github/workflows/ci.yml | 9 ++++++ .gitignore | 2 ++ default.nix | 67 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 default.nix diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8b19470138..74fa1a4d50 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,3 +38,12 @@ jobs: run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" make test -j$(nproc) + build-with-nix: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: cachix/install-nix-action@v13 + with: + nix_path: nixpkgs=channel:nixos-stable + - name: Build the CI package set + run: nix-build default.nix -A ciPackages diff --git a/.gitignore b/.gitignore index 3b5cb5b347..b6ddc27070 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,5 @@ options.inc core ld gentoo +result # nix build output symlink +result-* diff --git a/default.nix b/default.nix new file mode 100644 index 0000000000..43a0023e89 --- /dev/null +++ b/default.nix @@ -0,0 +1,67 @@ +let + # Pin some fairly new nixpkgs + sources = builtins.fetchTarball { + name = "nixpkgs-unstable-2021-07-06"; + url = "https://github.com/nixos/nixpkgs/archive/291b3ff5af268eb7a656bb11c73f2fe535ea2170.tar.gz"; + sha256 = "1z2l7q4cmiaqb99cd8yfisdr1n6xbwcczr9020ss47y2z1cn1x7x"; + }; + + # For bootstrapping, and also as comparison baseline + pkgs = import sources { + overlays = [ + (pkgs: super: { + # TODO replace with proper packaging once https://github.com/NixOS/nixpkgs/pull/128889 is merged + mold = pkgs.stdenv.mkDerivation { + name = "mold"; + src = ./.; + buildInputs = with pkgs; [ zlib openssl ]; + nativeBuildInputs = with pkgs; [ autoPatchelfHook cmake xxHash ]; + dontUseCmakeConfigure = true; + buildPhase = "make -j $NIX_BUILD_CORES"; + installPhase = "make PREFIX=$out install"; + }; + + binutils_mold = pkgs.wrapBintoolsWith { + bintools = pkgs.binutils-unwrapped.overrideAttrs (old: { + postInstall = "ln -sf ${pkgs.mold}/bin/mold $out/bin/ld"; + }); + }; + + stdenv_mold = super.overrideCC super.stdenv (super.wrapCCWith rec { + cc = super.gcc-unwrapped; + bintools = pkgs.binutils_mold; + }); + }) + ]; + }; + + # Actual nixpkgs with patched linker in all packages. Note: + # - This will bootstrap the entire toolchain and build all transitive dependencies every time mold changes. + # - Packages that require a custom linker (like lld or some special GCC) won't be built with mold regardless. + pkgsMold = import sources { + overlays = [ + (self: super: { + stdenv = pkgs.stdenv_mold; + mold = pkgs.mold; + }) + ]; + }; + + # Like pkgsMold, but we disable mold individually for known failing packages until their issues are resolved + pkgsMoldCI = pkgsMold.appendOverlays [ + (self: super: { + inherit (pkgs) + valgrind # https://github.com/rui314/mold/issues/81#issuecomment-876425070 + ; + }) + ]; +in { + inherit pkgs pkgsMold pkgsMoldCI; + + # Packages we already know that work in order to catch regressions + ciPackages = with pkgsMoldCI; linkFarmFromDrvs "packages-with-mold" [ + binutils + stdenv + # TODO + ]; +}