From e97770a4d14720832fa7a30c9f70cb006f29874f Mon Sep 17 00:00:00 2001 From: cadkin Date: Tue, 4 Feb 2025 20:19:41 -0500 Subject: [PATCH 1/8] Rework nix flake to use nixpkgs' callPackage utility --- flake.lock | 40 ++--- flake.nix | 286 ++++------------------------------- nix/adamantine/common.nix | 50 ++++++ nix/dependencies/adiak.nix | 29 ++++ nix/dependencies/arborx.nix | 36 +++++ nix/dependencies/caliper.nix | 42 +++++ nix/dependencies/dealii.nix | 45 ++++++ nix/nixpkgs/config.nix | 23 +++ 8 files changed, 272 insertions(+), 279 deletions(-) create mode 100644 nix/adamantine/common.nix create mode 100644 nix/dependencies/adiak.nix create mode 100644 nix/dependencies/arborx.nix create mode 100644 nix/dependencies/caliper.nix create mode 100644 nix/dependencies/dealii.nix create mode 100644 nix/nixpkgs/config.nix diff --git a/flake.lock b/flake.lock index 51cde9df..e45d75bd 100644 --- a/flake.lock +++ b/flake.lock @@ -1,23 +1,5 @@ { "nodes": { - "flake-utils": { - "inputs": { - "systems": "systems" - }, - "locked": { - "lastModified": 1731533236, - "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, "nixpkgs": { "locked": { "lastModified": 1736916166, @@ -36,8 +18,8 @@ }, "root": { "inputs": { - "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs", + "utils": "utils" } }, "systems": { @@ -54,6 +36,24 @@ "repo": "default", "type": "github" } + }, + "utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index bffa2854..88d978e2 100644 --- a/flake.nix +++ b/flake.nix @@ -1,272 +1,40 @@ ## See NIX.md for help getting started with Nix { + description = "Software to simulate heat transfer for additive manufacturing"; + inputs = { - nixpkgs = { - url = "github:nixos/nixpkgs/nixos-24.11"; - }; - flake-utils = { - url = "github:numtide/flake-utils"; - }; + nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11"; + utils.url = "github:numtide/flake-utils"; }; - outputs = { nixpkgs, flake-utils, ... }: flake-utils.lib.eachDefaultSystem (system: - let - pkgs = import nixpkgs { + + outputs = inputs @ { self, utils, ... }: utils.lib.eachDefaultSystem (system: rec { + config = rec { + pkgs = import inputs.nixpkgs { inherit system; - config.allowUnfree = true; + inherit (import ./nix/nixpkgs/config.nix {}) overlays config; }; + }; - adiak = (with pkgs; stdenv.mkDerivation { - pname = "adiak"; - version = "0.4.0"; - - src = fetchgit { - url = "https://github.com/LLNL/Adiak"; - rev = "v0.4.0"; - sha256 = "sha256-S4ZLU6f/njdZXyoQdCJIDzpQTSmfapZiRe4zIex5f0Q="; - fetchSubmodules = true; - }; - - buildInputs = [ - cmake - ]; - - cmakeFlags = [ - "-DBUILD_SHARED_LIBS=ON" - "-DCMAKE_BUILD_TYPE=Release" - ]; - }); - - caliper = (with pkgs; stdenv.mkDerivation { - pname = "caliper"; - version = "2.10.0"; - - src = fetchgit { - url = "https://github.com/LLNL/caliper"; - rev = "9b5b5efe9096e3f2b306fcca91ae739ae5d00716"; - sha256 = "sha256-4rnPbRYtciohLnThtonTrUBO+d8vyWvJsCgoqbJI5Rg="; - fetchSubmodules = true; - }; - - buildInputs = [ - cmake - adiak - python3 - openmpi - ]; - - cmakeFlags = [ - "-DCMAKE_BUILD_TYPE=Release" - "-DBUILD_SHARED_LIBS=ON" - "-DWITH_ADIAK=ON" - "-DWITH_LIBDW=ON" - "-DWITH_LIBPFM=ON" - "-DWITH_LIBUNWIND=ON" - "-DWITH_MPI=ON" - "-DWITH_SAMPLER=ON" - ]; - }); - - arborx = (with pkgs; stdenv.mkDerivation { - pname = "arborx"; - version = "1.5"; - - src = fetchgit { - url = "https://github.com/arborx/ArborX"; - rev = "v1.5"; - sha256 = "sha256-qEC4BocPyH9mmU9Ys0nNu8s0l3HQGPHg8B1oNcGwXOQ="; - fetchSubmodules = true; - }; - - buildInputs = [ - cmake - openmpi - trilinos_override - ]; - - cmakeFlags = [ - "-DCMAKE_BUILD_TYPE=Release" - "-DBUILD_SHARED_LIBS=ON" - "-DCMAKE_CXX_EXTENSIONS=OFF" - "-DARBORX_ENABLE_MPI=ON" - ]; - }); - - deal_II_952 = (with pkgs; stdenv.mkDerivation { - pname = "deal_II"; - version = "9.5.2"; - src = fetchgit { - url = "https://github.com/dealii/dealii"; - rev = "6f07117be556bf929220c50820b4dead54dc31d0"; - sha256 = "sha256-wJIrSuEDU19eZT66MN0DIuSiWQ1/gdu+gHeMYrbQkxk="; - fetchSubmodules = true; - }; - - buildInputs = [ - cmake - openmpi - trilinos_override - arborx - p4est - boost183 - ]; - - cmakeFlags = [ - "-DCMAKE_BUILD_TYPE=DebugRelease" - "-DCMAKE_CXX_STANDARD=17" - "-DCMAKE_CXX_EXTENSIONS=OFF" - "-DDEAL_II_WITH_TBB=OFF" - "-DDEAL_II_WITH_64BIT_INDICES=ON" - "-DDEAL_II_WITH_COMPLEX_VALUES=OFF" - "-DDEAL_II_WITH_MPI=ON" - "-DDEAL_II_WITH_P4EST=ON" - "-DP4EST_DIR=${p4est}" - "-DDEAL_II_WITH_ARBORX=ON" - "-DARBORX_DIR=${arborx}" - "-DDEAL_II_WITH_TRILINOS=ON" - "-DTRILINOS_DIR=${trilinos_override}" - "-DDEAL_II_TRILINOS_WITH_SEACAS=OFF" - "-DDEAL_II_COMPONENT_EXAMPLES=OFF" - "-DDEAL_II_WITH_ADOLC=OFF" - "-DDEAL_II_ALLOW_BUNDLED=OFF" - ]; - }); - - deal_II_962 = deal_II_952.overrideAttrs ( with pkgs; previousAttrs : rec { - version = "9.6.2"; - src = previousAttrs.src.override { - rev = "v9.6.2"; - sha256 = "sha256-YVOQbvzWWSl9rmYd6LBx4w2S8wuxhVF8T2dKdOphta4="; - }; - }); - - trilinos_extra_args = '' - -DTrilinos_ENABLE_ML=ON - -DBoost_INCLUDE_DIRS=${pkgs.boost183}/include - -DBoostLib_INCLUDE_DIRS=${pkgs.boost183}/include - -DBoostLib_LIBRARY_DIRS=${pkgs.boost183}/lib - -DTPL_ENABLE_BoostLib=ON - ''; - trilinos_withMPI = pkgs.trilinos.override ( previous: { withMPI = true; boost = pkgs.boost183; }); - trilinos_override = trilinos_withMPI.overrideAttrs ( previousAttrs : rec { - preConfigure = previousAttrs.preConfigure + '' - cmakeFlagsArray+=(${trilinos_extra_args}) - ''; - version = "14.4.0"; - src = previousAttrs.src.override { - rev = "${previousAttrs.pname}-release-${pkgs.lib.replaceStrings [ "." ] [ "-" ] version}"; - sha256 = "sha256-jbXQYEyf/p9F2I/I7jP+0/6OOcH5ArFlUk6LHn453qY="; - }; - } - ); - - adamantine-base = (with pkgs; stdenv.mkDerivation rec { - pname = "adamantine"; - version = "1.0"; - - src = fetchgit { - url = "https://github.com/adamantine-sim/adamantine"; - rev = "v1.0"; - sha256 = "sha256-pwwGgk4uIEOkyNLN26nRYvkzQZR53TJW14R9P99E3Ts="; - }; - - buildInputs = [ - arborx - adiak - caliper - cmake - p4est - trilinos_override - boost183 - ] ++ propagatedBuildInputs; - - - propagatedBuildInputs = [ - openmpi - ]; - - cmakeFlags = [ - "-DADAMANTINE_ENABLE_ADIAK=ON" - "-DADAMANTINE_ENABLE_CALIPER=ON" - "-DBOOST_DIR=${boost183}" - ]; - - installPhase = '' - mkdir -p $out/bin - cp bin/adamantine $out/bin - ''; - - doCheck = true; - check = '' - ctest -R integration_2d - ''; - }); - - adamantine-release = adamantine-base.overrideAttrs ( with pkgs; previousAttrs : rec { - buildInputs = previousAttrs.buildInputs ++ [ deal_II_952 ]; - cmakeFlags = previousAttrs.cmakeFlags ++ [ - "-DDEAL_II_DIR=${deal_II_952}" - "-DCMAKE_BUILD_TYPE=Release" - "-DCMAKE_CXX_FLAGS=-ffast-math" - ]; - }); - - adamantine-latest = adamantine-base.overrideAttrs ( with pkgs; previousAttrs : rec { - version = "latest"; - src = pkgs.lib.cleanSource ./.; - buildInputs = previousAttrs.buildInputs ++ [ deal_II_962 ]; - cmakeFlags = previousAttrs.cmakeFlags ++ [ - "-DDEAL_II_DIR=${deal_II_962}" - "-DCMAKE_BUILD_TYPE=Release" - "-DCMAKE_CXX_FLAGS=-ffast-math" - ]; - }); - - adamantine-debug = adamantine-base.overrideAttrs ( with pkgs; previousAttrs : rec { - version = "debug"; - separateDebugInfo = true; - src = pkgs.lib.cleanSource ./.; - buildInputs = previousAttrs.buildInputs ++ [ deal_II_962 ]; - cmakeFlags = previousAttrs.cmakeFlags ++ [ - "-DDEAL_II_DIR=${deal_II_962}" - "-DCMAKE_BUILD_TYPE=Debug" - "-DCMAKE_CXX_FLAGS=-O0" - "-DCMAKE_CXX_FLAGS_DEBUG=-g3" - ]; - }); - - myDebugInfoDirs = pkgs.symlinkJoin { - name = "myDebugInfoDirs"; - paths = with pkgs; [ - adamantine-debug.debug - ]; - }; - - in rec { - defaultApp = flake-utils.lib.mkApp { - drv = defaultPackage; - }; - defaultPackage = adamantine-latest; + lib = with config; { + callPackage = set: pkgs.lib.callPackageWith (pkgs // set); + }; - devShells.default = pkgs.mkShell { - buildInputs = [ - adamantine-latest - ]; + packages = with config; rec { + libs = let + callPackage = lib.callPackage libs; + in { + adiak = callPackage ./nix/dependencies/adiak.nix {}; + caliper = callPackage ./nix/dependencies/caliper.nix {}; + arborx = callPackage ./nix/dependencies/arborx.nix {}; + dealii = callPackage ./nix/dependencies/dealii.nix {}; }; - devShells.release = pkgs.mkShell { - buildInputs = [ - adamantine-release - ]; - }; + adamantine = (lib.callPackage libs) ./nix/adamantine/common.nix { version = self.dirtyShortRev; src = self; }; + }; - devShells.debug = pkgs.mkShell { - NIX_DEBUG_INFO_DIRS = "${pkgs.lib.getLib myDebugInfoDirs}/lib/debug"; - buildInputs = [ - adamantine-debug - pkgs.gdb - ]; - }; - } - ); + devShells = with config; rec { + # TODO + }; + }); } diff --git a/nix/adamantine/common.nix b/nix/adamantine/common.nix new file mode 100644 index 00000000..200c6f97 --- /dev/null +++ b/nix/adamantine/common.nix @@ -0,0 +1,50 @@ +{ + src, version, + + stdenv, fetchFromGitHub, + + cmake, + + arborx, adiak, caliper, p4est, trilinos-mpi, boost, openmpi, dealii +}: + +stdenv.mkDerivation rec { + pname = "adamantine"; + inherit version; + + inherit src; + + nativeBuildInputs = [ + cmake + ]; + + buildInputs = [ + arborx + adiak + caliper + p4est + trilinos-mpi + boost + dealii + ]; + + propagatedBuildInputs = [ + openmpi + ]; + + cmakeFlags = [ + "-DADAMANTINE_ENABLE_ADIAK=ON" + "-DADAMANTINE_ENABLE_CALIPER=ON" + ]; + + installPhase = '' + mkdir -p $out/bin + cp bin/adamantine $out/bin + ''; + + doCheck = true; + check = '' + ctest -R integration_2d + ''; +} + diff --git a/nix/dependencies/adiak.nix b/nix/dependencies/adiak.nix new file mode 100644 index 00000000..9d74d794 --- /dev/null +++ b/nix/dependencies/adiak.nix @@ -0,0 +1,29 @@ +{ + stdenv, fetchFromGitHub, + + cmake +}: + +stdenv.mkDerivation rec { + pname = "adiak"; + version = "0.4.0"; + + src = fetchFromGitHub { + owner = "LLNL"; + repo = "Adiak"; + rev = "v${version}"; + hash = "sha256-S4ZLU6f/njdZXyoQdCJIDzpQTSmfapZiRe4zIex5f0Q="; + + fetchSubmodules = true; + }; + + nativeBuildInputs = [ + cmake + ]; + + cmakeFlags = [ + "-DBUILD_SHARED_LIBS=ON" + "-DCMAKE_BUILD_TYPE=Release" + ]; +} + diff --git a/nix/dependencies/arborx.nix b/nix/dependencies/arborx.nix new file mode 100644 index 00000000..43539f23 --- /dev/null +++ b/nix/dependencies/arborx.nix @@ -0,0 +1,36 @@ +{ + stdenv, fetchFromGitHub, + + cmake, + + openmpi, trilinos-mpi +}: + +stdenv.mkDerivation rec { + pname = "arborx"; + version = "1.5"; + + src = fetchFromGitHub { + owner = "arborx"; + repo = "ArborX"; + rev = "v${version}"; + hash = "sha256-XhvWKex7sKACY90emvV9uGw/ACI00dLq1HoeG2nWthk="; + }; + + nativeBuildInputs = [ + cmake + ]; + + buildInputs = [ + openmpi + trilinos-mpi + ]; + + cmakeFlags = [ + "-DCMAKE_BUILD_TYPE=Release" + "-DBUILD_SHARED_LIBS=ON" + "-DCMAKE_CXX_EXTENSIONS=OFF" + "-DARBORX_ENABLE_MPI=ON" + ]; +} + diff --git a/nix/dependencies/caliper.nix b/nix/dependencies/caliper.nix new file mode 100644 index 00000000..7a23c680 --- /dev/null +++ b/nix/dependencies/caliper.nix @@ -0,0 +1,42 @@ +{ + stdenv, fetchFromGitHub, + + cmake, python3, + + adiak, openmpi +}: + +stdenv.mkDerivation rec { + pname = "caliper"; + version = "2.10.0"; + + src = fetchFromGitHub { + owner = "LLNL"; + repo = "caliper"; + rev = "v${version}"; + hash = "sha256-4rnPbRYtciohLnThtonTrUBO+d8vyWvJsCgoqbJI5Rg="; + + fetchSubmodules = true; + }; + + nativeBuildInputs = [ + cmake + python3 + ]; + + buildInputs = [ + adiak + openmpi + ]; + + cmakeFlags = [ + "-DCMAKE_BUILD_TYPE=Release" + "-DBUILD_SHARED_LIBS=ON" + "-DWITH_ADIAK=ON" + "-DWITH_LIBDW=ON" + "-DWITH_LIBPFM=ON" + "-DWITH_LIBUNWIND=ON" + "-DWITH_MPI=ON" + "-DWITH_SAMPLER=ON" + ]; +} diff --git a/nix/dependencies/dealii.nix b/nix/dependencies/dealii.nix new file mode 100644 index 00000000..adcf4204 --- /dev/null +++ b/nix/dependencies/dealii.nix @@ -0,0 +1,45 @@ +{ + stdenv, fetchFromGitHub, + + cmake, + + openmpi, trilinos-mpi, arborx, p4est, boost +}: + +stdenv.mkDerivation rec { + pname = "dealii"; + version = "9.6.2"; + + src = fetchFromGitHub { + owner = "dealii"; + repo = "dealii"; + rev = "v${version}"; + hash = "sha256-sIyGSEmGc2JMKwvFRkJJLROUNdLKVhPgfUx1IfjT3dI="; + }; + + buildInputs = [ + cmake + openmpi + trilinos-mpi + arborx + p4est + boost + ]; + + cmakeFlags = [ + "-DCMAKE_BUILD_TYPE=DebugRelease" + "-DCMAKE_CXX_STANDARD=17" + "-DCMAKE_CXX_EXTENSIONS=OFF" + "-DDEAL_II_WITH_TBB=OFF" + "-DDEAL_II_WITH_64BIT_INDICES=ON" + "-DDEAL_II_WITH_COMPLEX_VALUES=OFF" + "-DDEAL_II_WITH_MPI=ON" + "-DDEAL_II_WITH_P4EST=ON" + "-DDEAL_II_WITH_ARBORX=ON" + "-DDEAL_II_WITH_TRILINOS=ON" + "-DDEAL_II_TRILINOS_WITH_SEACAS=OFF" + "-DDEAL_II_COMPONENT_EXAMPLES=OFF" + "-DDEAL_II_WITH_ADOLC=OFF" + "-DDEAL_II_ALLOW_BUNDLED=OFF" + ]; +} diff --git a/nix/nixpkgs/config.nix b/nix/nixpkgs/config.nix new file mode 100644 index 00000000..0e319728 --- /dev/null +++ b/nix/nixpkgs/config.nix @@ -0,0 +1,23 @@ +{ ... }: + +{ + overlays = [( + finalPkgs: prevPkgs: { + trilinos-mpi = prevPkgs.trilinos-mpi.overrideAttrs (final: prev: rec { + version = "14.4.0"; + + preConfigure = prev.preConfigure + '' + cmakeFlagsArray+=(-DTrilinos_ENABLE_ML=ON); + ''; + + src = prev.src.override { + sha256 = "sha256-jbXQYEyf/p9F2I/I7jP+0/6OOcH5ArFlUk6LHn453qY="; + }; + }); + } + )]; + + config = { + allowUnfree = true; + }; +} From 5b86d51ff864d950aff98baf3fc9f495383fd2d2 Mon Sep 17 00:00:00 2001 From: cadkin Date: Tue, 4 Feb 2025 21:02:27 -0500 Subject: [PATCH 2/8] Add nix dev shell, stable adamantine variant, multiple dealii revisions --- .envrc | 1 + flake.nix | 80 ++++++++++++++++--- nix/adamantine/common.nix | 7 +- nix/adamantine/v1.0.0.nix | 13 +++ .../{adiak.nix => adiak/default.nix} | 0 .../{arborx.nix => arborx/default.nix} | 0 .../{caliper.nix => caliper/default.nix} | 0 .../{dealii.nix => dealii/common.nix} | 23 +++--- nix/dependencies/dealii/v9.5.2.nix | 13 +++ nix/dependencies/dealii/v9.6.2.nix | 13 +++ nix/nixpkgs/config.nix | 2 +- 11 files changed, 129 insertions(+), 23 deletions(-) create mode 100644 .envrc create mode 100644 nix/adamantine/v1.0.0.nix rename nix/dependencies/{adiak.nix => adiak/default.nix} (100%) rename nix/dependencies/{arborx.nix => arborx/default.nix} (100%) rename nix/dependencies/{caliper.nix => caliper/default.nix} (100%) rename nix/dependencies/{dealii.nix => dealii/common.nix} (71%) create mode 100644 nix/dependencies/dealii/v9.5.2.nix create mode 100644 nix/dependencies/dealii/v9.6.2.nix diff --git a/.envrc b/.envrc new file mode 100644 index 00000000..3723584d --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake -L diff --git a/flake.nix b/flake.nix index 88d978e2..33745504 100644 --- a/flake.nix +++ b/flake.nix @@ -20,21 +20,81 @@ callPackage = set: pkgs.lib.callPackageWith (pkgs // set); }; - packages = with config; rec { - libs = let - callPackage = lib.callPackage libs; - in { - adiak = callPackage ./nix/dependencies/adiak.nix {}; - caliper = callPackage ./nix/dependencies/caliper.nix {}; - arborx = callPackage ./nix/dependencies/arborx.nix {}; - dealii = callPackage ./nix/dependencies/dealii.nix {}; + packages = with config; let + callPackage = lib.callPackage libs; + + libs = { + adiak = callPackage ./nix/dependencies/adiak {}; + caliper = callPackage ./nix/dependencies/caliper {}; + arborx = callPackage ./nix/dependencies/arborx {}; + + dealii = let + versions = rec { + latest = v962; + v962 = callPackage ./nix/dependencies/dealii/v9.6.2.nix { inherit callPackage; }; + v952 = callPackage ./nix/dependencies/dealii/v9.5.2.nix { inherit callPackage; }; + }; + in (versions.latest) // { + inherit versions; + }; }; + in rec { + inherit libs; + inherit pkgs; + + default = adamantine.versions.devel; - adamantine = (lib.callPackage libs) ./nix/adamantine/common.nix { version = self.dirtyShortRev; src = self; }; + adamantine = let + versions = rec { + devel = callPackage ./nix/adamantine/common.nix { + version = self.shortRev or self.dirtyShortRev; + src = self; + }; + + stable = v100; + + v100 = callPackage ./nix/adamantine/v1.0.0.nix { + inherit callPackage; + dealii = libs.dealii.versions.v952; + }; + }; + in (versions.devel) // { + inherit versions; + }; }; devShells = with config; rec { - # TODO + default = adamantineDev; + + adamantineDev = pkgs.mkShell rec { + name = "adamantine-dev"; + + packages = with pkgs; [ + git + gdb + clang-tools + ninja + ] ++ pkgs.lib.optionals (pkgs.stdenv.hostPlatform.isLinux) [ + cntr + ] ++ self.outputs.packages.${system}.default.buildInputs + ++ self.outputs.packages.${system}.default.nativeBuildInputs + ++ self.outputs.packages.${system}.default.propagatedBuildInputs; + + # For dev, we want to disable hardening. + hardeningDisable = [ + "bindnow" + "format" + "fortify" + "fortify3" + "pic" + "relro" + "stackprotector" + "strictoverflow" + ]; + + # Ensure the locales point at the correct archive location. + LOCALE_ARCHIVE = "${pkgs.glibcLocales}/lib/locale/locale-archive"; + }; }; }); } diff --git a/nix/adamantine/common.nix b/nix/adamantine/common.nix index 200c6f97..b4a80f99 100644 --- a/nix/adamantine/common.nix +++ b/nix/adamantine/common.nix @@ -1,11 +1,14 @@ { src, version, - stdenv, fetchFromGitHub, + stdenv, cmake, - arborx, adiak, caliper, p4est, trilinos-mpi, boost, openmpi, dealii + arborx, adiak, caliper, p4est, trilinos-mpi, boost, openmpi, dealii, + + # Allow extra args as needed for callPackage chaining - not ideal. + ... }: stdenv.mkDerivation rec { diff --git a/nix/adamantine/v1.0.0.nix b/nix/adamantine/v1.0.0.nix new file mode 100644 index 00000000..4f023470 --- /dev/null +++ b/nix/adamantine/v1.0.0.nix @@ -0,0 +1,13 @@ +attrs @ { callPackage, fetchFromGitHub, ... }: + +callPackage ./common.nix ( + rec { + version = "1.0"; + src = fetchFromGitHub { + owner = "adamantine-sim"; + repo = "adamantine"; + rev = "v${version}"; + hash = "sha256-pwwGgk4uIEOkyNLN26nRYvkzQZR53TJW14R9P99E3Ts="; + }; + } // attrs +) diff --git a/nix/dependencies/adiak.nix b/nix/dependencies/adiak/default.nix similarity index 100% rename from nix/dependencies/adiak.nix rename to nix/dependencies/adiak/default.nix diff --git a/nix/dependencies/arborx.nix b/nix/dependencies/arborx/default.nix similarity index 100% rename from nix/dependencies/arborx.nix rename to nix/dependencies/arborx/default.nix diff --git a/nix/dependencies/caliper.nix b/nix/dependencies/caliper/default.nix similarity index 100% rename from nix/dependencies/caliper.nix rename to nix/dependencies/caliper/default.nix diff --git a/nix/dependencies/dealii.nix b/nix/dependencies/dealii/common.nix similarity index 71% rename from nix/dependencies/dealii.nix rename to nix/dependencies/dealii/common.nix index adcf4204..13b820e4 100644 --- a/nix/dependencies/dealii.nix +++ b/nix/dependencies/dealii/common.nix @@ -1,24 +1,27 @@ { - stdenv, fetchFromGitHub, + src, version, + + stdenv, cmake, - openmpi, trilinos-mpi, arborx, p4est, boost + openmpi, trilinos-mpi, arborx, p4est, boost, + + # Allow extra args as needed for callPackage chaining - not ideal. + ... }: stdenv.mkDerivation rec { pname = "dealii"; - version = "9.6.2"; + inherit version; - src = fetchFromGitHub { - owner = "dealii"; - repo = "dealii"; - rev = "v${version}"; - hash = "sha256-sIyGSEmGc2JMKwvFRkJJLROUNdLKVhPgfUx1IfjT3dI="; - }; + inherit src; - buildInputs = [ + nativeBuildInputs = [ cmake + ]; + + buildInputs = [ openmpi trilinos-mpi arborx diff --git a/nix/dependencies/dealii/v9.5.2.nix b/nix/dependencies/dealii/v9.5.2.nix new file mode 100644 index 00000000..c36fbb9d --- /dev/null +++ b/nix/dependencies/dealii/v9.5.2.nix @@ -0,0 +1,13 @@ +attrs @ { callPackage, fetchFromGitHub, ... }: + +callPackage ./common.nix ( + rec { + version = "9.5.2"; + src = fetchFromGitHub { + owner = "dealii"; + repo = "dealii"; + rev = "v${version}"; + hash = "sha256-m2+1HCAkfY6w3QBT4fuz5dm7E3qurvukRf9nI6xyfpY="; + }; + } // attrs +) diff --git a/nix/dependencies/dealii/v9.6.2.nix b/nix/dependencies/dealii/v9.6.2.nix new file mode 100644 index 00000000..dc95dfd1 --- /dev/null +++ b/nix/dependencies/dealii/v9.6.2.nix @@ -0,0 +1,13 @@ +attrs @ { callPackage, fetchFromGitHub, ... }: + +callPackage ./common.nix ( + rec { + version = "9.6.2"; + src = fetchFromGitHub { + owner = "dealii"; + repo = "dealii"; + rev = "v${version}"; + hash = "sha256-sIyGSEmGc2JMKwvFRkJJLROUNdLKVhPgfUx1IfjT3dI="; + }; + } // attrs +) diff --git a/nix/nixpkgs/config.nix b/nix/nixpkgs/config.nix index 0e319728..34a24d7a 100644 --- a/nix/nixpkgs/config.nix +++ b/nix/nixpkgs/config.nix @@ -7,7 +7,7 @@ version = "14.4.0"; preConfigure = prev.preConfigure + '' - cmakeFlagsArray+=(-DTrilinos_ENABLE_ML=ON); + cmakeFlagsArray+=(-DTrilinos_ENABLE_ML=ON); ''; src = prev.src.override { From 7ebc44aba6d6c59c4b694b93e37f84b7e283a7dc Mon Sep 17 00:00:00 2001 From: cadkin Date: Sat, 8 Feb 2025 20:04:53 -0500 Subject: [PATCH 3/8] Change adamantine to object library for install Should make targets like `make install` work now. --- CMakeLists.txt | 6 +++--- CMakePresets.json | 32 ++++++++++++++++++++++++++++++++ application/CMakeLists.txt | 2 ++ flake.nix | 4 +++- nix/adamantine/common.nix | 11 ++++------- nix/nixpkgs/config.nix | 1 + source/CMakeLists.txt | 24 ++++++++++++------------ 7 files changed, 57 insertions(+), 23 deletions(-) create mode 100644 CMakePresets.json diff --git a/CMakeLists.txt b/CMakeLists.txt index 36f0eef5..81dd8729 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,7 @@ set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) # TPL and adamantine include(SetupDealII) -project(adamantine LANGUAGES CXX VERSION 1.0.9) +project(Adamantine LANGUAGES CXX VERSION 1.0.9) include(SetupTPLs) include(SetupAdamantine) @@ -36,14 +36,14 @@ if (ADAMANTINE_ENABLE_TESTS) add_test(NAME indent_code WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ./indent - ) + ) endif() # Provide "indent" target for indenting all the header and the source files. add_custom_target(indent WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ./indent - ) +) if (ADAMANTINE_ENABLE_DOCUMENTATION) add_subdirectory(doc) diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 00000000..01ed6560 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,32 @@ +{ + "version": 6, + "configurePresets": [ + { + "name": "generic-gcc-ninja", + "displayName": "Generic (gcc-ninja)", + "description": "Basic configuration with the GCC toolchain using Ninja generator.", + "generator": "Ninja Multi-Config", + "binaryDir": "${sourceDir}/build/${presetName}", + "cacheVariables": { + "CMAKE_CXX_COMPILER": "g++" + } + } + ], + "buildPresets": [ + { + "name": "debug-gcc-ninja", + "displayName": "Debug (gcc-ninja)", + "description": "Compile a debug build using GCC.", + "configurePreset": "generic-gcc-ninja", + "configuration": "Debug" + }, + { + "name": "release-gcc-ninja", + "displayName": "Release (gcc-ninja)", + "description": "Compile a release build using GCC.", + "configurePreset": "generic-gcc-ninja", + "configuration": "Release" + } + ] +} + diff --git a/application/CMakeLists.txt b/application/CMakeLists.txt index 05efe5b9..62b6ccc1 100644 --- a/application/CMakeLists.txt +++ b/application/CMakeLists.txt @@ -21,3 +21,5 @@ endif() file(COPY input.info DESTINATION ${CMAKE_BINARY_DIR}/bin) file(COPY input_scan_path.txt DESTINATION ${CMAKE_BINARY_DIR}/bin) + +install(TARGETS adamantine) diff --git a/flake.nix b/flake.nix index 33745504..805bf8fa 100644 --- a/flake.nix +++ b/flake.nix @@ -93,7 +93,9 @@ ]; # Ensure the locales point at the correct archive location. - LOCALE_ARCHIVE = "${pkgs.glibcLocales}/lib/locale/locale-archive"; + LOCALE_ARCHIVE = pkgs.lib.optional (pkgs.stdenv.hostPlatform.isLinux) ( + "${pkgs.glibcLocales}/lib/locale/locale-archive" + ); }; }; }); diff --git a/nix/adamantine/common.nix b/nix/adamantine/common.nix index b4a80f99..a5db19c7 100644 --- a/nix/adamantine/common.nix +++ b/nix/adamantine/common.nix @@ -1,7 +1,7 @@ { src, version, - stdenv, + lib, stdenv, cmake, @@ -38,16 +38,13 @@ stdenv.mkDerivation rec { cmakeFlags = [ "-DADAMANTINE_ENABLE_ADIAK=ON" "-DADAMANTINE_ENABLE_CALIPER=ON" + "-DBUILD_SHARED_LIBS=ON" ]; - installPhase = '' + # Manual install if using versions 1.0 since adamantine was lacking CMake installs. + installPhase = lib.optional (version == "1.0") '' mkdir -p $out/bin cp bin/adamantine $out/bin ''; - - doCheck = true; - check = '' - ctest -R integration_2d - ''; } diff --git a/nix/nixpkgs/config.nix b/nix/nixpkgs/config.nix index 34a24d7a..8859242d 100644 --- a/nix/nixpkgs/config.nix +++ b/nix/nixpkgs/config.nix @@ -11,6 +11,7 @@ ''; src = prev.src.override { + rev = "${prev.pname}-release-${prevPkgs.lib.replaceStrings [ "." ] [ "-" ] version}"; sha256 = "sha256-jbXQYEyf/p9F2I/I7jP+0/6OOcH5ArFlUk6LHn453qY="; }; }); diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index c56e1a17..f14887c7 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -72,24 +72,24 @@ set(Adamantine_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/validate_input_database.cc ) -# Because the Adamantine library is just used to simplify testing, we make it -# static. Thus, once the application is created it can be moved around. The -# other libraries can still be shared. -add_library(Adamantine STATIC ${Adamantine_SOURCES} ${Adamantine_HEADERS}) +add_library(${PROJECT_NAME} OBJECT) +target_sources(${PROJECT_NAME} PRIVATE ${Adamantine_SOURCES}) +target_sources(${PROJECT_NAME} PUBLIC FILE_SET HEADERS FILES ${Adamantine_HEADERS}) -DEAL_II_SETUP_TARGET(Adamantine) +DEAL_II_SETUP_TARGET(${PROJECT_NAME}) -set_target_properties(Adamantine PROPERTIES +set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF ) -target_link_libraries(Adamantine Boost::boost) -target_link_libraries(Adamantine Boost::chrono) -target_link_libraries(Adamantine Boost::program_options) -target_link_libraries(Adamantine MPI::MPI_CXX) -target_include_directories(Adamantine PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(${PROJECT_NAME} Boost::boost) +target_link_libraries(${PROJECT_NAME} Boost::chrono) +target_link_libraries(${PROJECT_NAME} Boost::program_options) +target_link_libraries(${PROJECT_NAME} MPI::MPI_CXX) if (ADAMANTINE_ENABLE_CALIPER) - target_link_libraries(Adamantine caliper) + target_link_libraries(${PROJECT_NAME} caliper) endif() + + From 7de00cb9706d384aaca592c321b0700fd0588f82 Mon Sep 17 00:00:00 2001 From: cadkin Date: Tue, 4 Feb 2025 22:18:47 -0500 Subject: [PATCH 4/8] Update nix docs --- NIX.md | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 73 insertions(+), 11 deletions(-) diff --git a/NIX.md b/NIX.md index da4dd56e..db2bdcbc 100644 --- a/NIX.md +++ b/NIX.md @@ -1,19 +1,81 @@ -# Nix Install +## Nix -First install the [Nix package manager][NIX] and then enable -[Flakes]. See [nix.dev][nix.dev] for more help with Nix. To install -without cloning from this repository use, +First install the [Nix package manager][NIX] and then enable [Flakes][Flakes]. +Alternatively, check out the [Determinate Systems Installer][Determinate] for +an out of the box experience. See [nix.dev][nix.dev] for more help with Nix. - $ nix develop github:adamantine-sim/adamantine - -to install the latest version on master. To install the lastest release use, +To get a shell with adamantine temporarily installed, run: - $ nix develop github:adamantine-sim/adamantine#release - -To install from a working copy use, + $ nix shell github:adamantine-sim/adamantine + # Adamantine now available + $ adamantine --help + +To install this permanently, run: + + $ nix profile install github:adamantine-sim/adamantine + +To get the latest stable release, use: + + $ nix shell github:adamantine-sim/adamantine#adamantine.versions.stable + +To build from a working copy use `nix develop` and run CMake manually: $ nix develop - + $ cmake -B build -GNinja + $ cmake --build build + +## Cache + +To avoid unnecessary builds, you can use the cache as configured in +`flake.nix`. The only requirement is that your user is a "trusted user" by the +nix dameon. + +If you are not a trusted user, you may make yourself one by editing +`/etc/nix/nix.conf` and add the following line: + + ... + trusted-users = [YOUR USERNAME HERE] + ... + +Then, when running a nix operation with the Adamantine flake, you should be +prompted if you want to add the cache to your configuration. Say yes to all +queries to enable the cache permanently. + +For more info, see the docs for this option [here][Trusted]. + +## direnv + +This repository also supports `direnv` for integration with both your shell and +tools like VSCode. + +First install direnv from either your distro or via Nix: + + # Via apt... + $ sudo apt install direnv + # ... or nix. + $ nix profile install direnv + +Setup direnv for your shell. Tutorials for various shells can be found +[here][DirenvHook]. For bash: + + $ echo "eval \"\$(direnv hook bash)\"" >> ~/.bashrc + +Restart your shell and then allow direnv: + + $ cd path/to/my/adamantine + $ direnv allow + +This will automatically enter the nix development shell whenever you enter the +adamantine directory. + +If you use VSCode, a great extension that adds direnv support can be found +[here][DirenvVSCode]. + + [NIX]: https://nixos.org/download.html [Flakes]: https://nixos.wiki/wiki/Flakes [nix.dev]: https://nix.dev +[Determinate]: https://github.com/DeterminateSystems/nix-installer +[DirenvHook]: https://direnv.net/docs/hook.html +[DirenvVSCode]: https://marketplace.visualstudio.com/items?itemName=mkhl.direnv +[Trusted]: https://nix.dev/manual/nix/2.24/command-ref/conf-file#conf-trusted-users From c44484850834e1802dfd81f6c8652ec711b1dcbf Mon Sep 17 00:00:00 2001 From: cadkin Date: Wed, 12 Feb 2025 11:05:10 -0500 Subject: [PATCH 5/8] Add cachix repo --- flake.nix | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/flake.nix b/flake.nix index 805bf8fa..53109dd1 100644 --- a/flake.nix +++ b/flake.nix @@ -99,4 +99,9 @@ }; }; }); + + nixConfig = { + extra-substituters = [ "https://mdfbaam.cachix.org" ]; + extra-trusted-public-keys = [ "mdfbaam.cachix.org-1:WCQinXaMJP7Ny4sMlKdisNUyhcO2MHnPoobUef5aTmQ=" ]; + }; } From 03c50c79b48fcb4b7d6e1874107062dfc3ee4624 Mon Sep 17 00:00:00 2001 From: cadkin Date: Thu, 13 Feb 2025 15:13:07 -0500 Subject: [PATCH 6/8] Make flake checks succeed + darwin fix --- flake.nix | 15 ++++++++------- nix/adamantine/common.nix | 10 +++++++++- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/flake.nix b/flake.nix index 53109dd1..b9126482 100644 --- a/flake.nix +++ b/flake.nix @@ -20,7 +20,7 @@ callPackage = set: pkgs.lib.callPackageWith (pkgs // set); }; - packages = with config; let + derivations = with config; rec { callPackage = lib.callPackage libs; libs = { @@ -38,11 +38,6 @@ inherit versions; }; }; - in rec { - inherit libs; - inherit pkgs; - - default = adamantine.versions.devel; adamantine = let versions = rec { @@ -63,6 +58,12 @@ }; }; + packages = rec { + default = adamantine.versions.devel; + + inherit (derivations) adamantine; + }; + devShells = with config; rec { default = adamantineDev; @@ -71,10 +72,10 @@ packages = with pkgs; [ git - gdb clang-tools ninja ] ++ pkgs.lib.optionals (pkgs.stdenv.hostPlatform.isLinux) [ + gdb cntr ] ++ self.outputs.packages.${system}.default.buildInputs ++ self.outputs.packages.${system}.default.nativeBuildInputs diff --git a/nix/adamantine/common.nix b/nix/adamantine/common.nix index a5db19c7..940dcd8e 100644 --- a/nix/adamantine/common.nix +++ b/nix/adamantine/common.nix @@ -7,6 +7,8 @@ arborx, adiak, caliper, p4est, trilinos-mpi, boost, openmpi, dealii, + doCheck ? true, + # Allow extra args as needed for callPackage chaining - not ideal. ... }: @@ -38,7 +40,8 @@ stdenv.mkDerivation rec { cmakeFlags = [ "-DADAMANTINE_ENABLE_ADIAK=ON" "-DADAMANTINE_ENABLE_CALIPER=ON" - "-DBUILD_SHARED_LIBS=ON" + ] ++ lib.optionals (doCheck) [ + "-DADAMANTINE_ENABLE_TESTS=ON" ]; # Manual install if using versions 1.0 since adamantine was lacking CMake installs. @@ -46,5 +49,10 @@ stdenv.mkDerivation rec { mkdir -p $out/bin cp bin/adamantine $out/bin ''; + + inherit doCheck; + checkPhase = '' + ctest -R integration_2d + ''; } From 87a98a476cb6410314b938137a9580d8dbe4f07c Mon Sep 17 00:00:00 2001 From: Daniel Wheeler Date: Fri, 14 Feb 2025 12:19:10 -0500 Subject: [PATCH 7/8] add github action for nix build --- .github/workflows/nix.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/nix.yml diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml new file mode 100644 index 00000000..dae4827d --- /dev/null +++ b/.github/workflows/nix.yml @@ -0,0 +1,23 @@ +--- +name: Nix +on: [push, pull_request] +jobs: + test: + strategy: + matrix: + os: [ubuntu-latest, macos-latest] + runs-on: ${{ matrix.os }} + defaults: + run: + working-directory: ./ + steps: + - uses: actions/checkout@v4 + - uses: cachix/install-nix-action@v27 + with: + nix_path: nixpkgs=channel:nixos-unstable + extra_nix_config: | + trusted-public-keys = mdfbaam.cachix.org-1:WCQinXaMJP7Ny4sMlKdisNUyhcO2MHnPoobUef5aTmQ= cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= + substituters = https://mdfbaam.cachix.org https://cache.nixos.org + - run: nix flake check + - run: nix build + From 789fffa7700f5cac2e6a2060f9f1c43efca9b2e8 Mon Sep 17 00:00:00 2001 From: cadkin Date: Tue, 18 Feb 2025 14:02:18 -0500 Subject: [PATCH 8/8] Bump nixpkgs rev Also fixes some dealii build warnings --- flake.lock | 6 +++--- nix/dependencies/dealii/common.nix | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index e45d75bd..fb3d9458 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1736916166, - "narHash": "sha256-puPDoVKxkuNmYIGMpMQiK8bEjaACcCksolsG36gdaNQ=", + "lastModified": 1739758141, + "narHash": "sha256-uq6A2L7o1/tR6VfmYhZWoVAwb3gTy7j4Jx30MIrH0rE=", "owner": "nixos", "repo": "nixpkgs", - "rev": "e24b4c09e963677b1beea49d411cd315a024ad3a", + "rev": "c618e28f70257593de75a7044438efc1c1fc0791", "type": "github" }, "original": { diff --git a/nix/dependencies/dealii/common.nix b/nix/dependencies/dealii/common.nix index 13b820e4..0bf37e1b 100644 --- a/nix/dependencies/dealii/common.nix +++ b/nix/dependencies/dealii/common.nix @@ -29,6 +29,11 @@ stdenv.mkDerivation rec { boost ]; + hardeningDisable = [ + "fortify" + "fortify3" + ]; + cmakeFlags = [ "-DCMAKE_BUILD_TYPE=DebugRelease" "-DCMAKE_CXX_STANDARD=17"