Paul Garlick writes: > * gnu/packages/simulation.scm: New file > * gnu/packages/patches/openfoam-cleanup.patch: New file > * gnu/local.mk(GNU_SYSTEM_MODULES): Add module > (dist_patch_DATA): Add patch Thanks a lot for this! The patch does not apply for me, can you rebase this on current 'master'? Meanwhile, some comments... > +diff -ur OpenFOAM-4.x-version-4.1.org/wmake/src/Makefile OpenFOAM-4.x-version-4.1/wmake/src/Makefile > +--- OpenFOAM-4.x-version-4.1.org/wmake/src/Makefile > ++++ OpenFOAM-4.x-version-4.1/wmake/src/Makefile > +@@ -33,7 +33,7 @@ > + # The Makefile use a POSIX shell > + #------------------------------------------------------------------------------ > + > +-SHELL = /bin/sh > ++# SHELL = /bin/sh This particular hunk is not necessary since gnu-build-system will search for Makefiles and adjust SHELL as needed. > +diff -ur OpenFOAM-4.x-version-4.1.org/wmake/makefiles/general OpenFOAM-4.x-version-4.1/wmake/makefiles/general > +--- OpenFOAM-4.x-version-4.1.org/wmake/makefiles/general > ++++ OpenFOAM-4.x-version-4.1/wmake/makefiles/general > +@@ -33,7 +33,7 @@ > + # The Makefile uses a POSIX shell > + #------------------------------------------------------------------------------ > + > +-SHELL = /bin/sh > ++# SHELL = /bin/sh ...although this file named "general" would not be patched automatically. > + #------------------------------------------------------------------------------ > +diff -ur OpenFOAM-4.x-version-4.1.org/wmake/wmake OpenFOAM-4.x-version-4.1/wmake/wmake > +--- OpenFOAM-4.x-version-4.1.org/wmake/wmake > ++++ OpenFOAM-4.x-version-4.1/wmake/wmake > +@@ -163,7 +163,7 @@ > + then > + if [ "$WM_NCOMPPROCS" -gt 1 -a ! "$MAKEFLAGS" ] > + then > +- lockDir=$HOME/.$WM_PROJECT/.wmake > ++ lockDir=$(cd $(dirname $BASH_SOURCE)/../.. && pwd -P)/.$WM_PROJECT/.wmake > + > + if [ -d $lockDir ] > + then > +diff -ur OpenFOAM-4.x-version-4.1.org/wmake/wmakeScheduler OpenFOAM-4.x-version-4.1/wmake/wmakeScheduler > +--- OpenFOAM-4.x-version-4.1.org/wmake/wmakeScheduler > ++++ OpenFOAM-4.x-version-4.1/wmake/wmakeScheduler > +@@ -53,7 +53,7 @@ > + # csh sets HOST, bash sets HOSTNAME > + : ${HOST:=$HOSTNAME} > + > +-lockDir=$HOME/.$WM_PROJECT/.wmake > ++lockDir=$(cd $(dirname $BASH_SOURCE)/../.. && pwd -P)/.$WM_PROJECT/.wmake > + > + # Fallback - 1 core on current host > + : ${WM_HOSTS:=$HOST:1} > +diff -ur OpenFOAM-4.x-version-4.1.org/wmake/wmakeSchedulerUptime OpenFOAM-4.x-version-4.1/wmake/wmakeSchedulerUptime > +--- OpenFOAM-4.x-version-4.1.org/wmake/wmakeSchedulerUptime > ++++ OpenFOAM-4.x-version-4.1/wmake/wmakeSchedulerUptime > +@@ -53,7 +53,7 @@ > + # csh sets HOST, bash sets HOSTNAME > + : ${HOST:=$HOSTNAME} > + > +-lockDir=$HOME/.$WM_PROJECT/.wmake > ++lockDir=$(cd $(dirname $BASH_SOURCE)/../.. && pwd -P)/.$WM_PROJECT/.wmake > + # Fallback - 1 core on current host > + : ${WM_HOSTS:=$HOST:1} Maybe these could be replaced with something like... (substitute* (find-files "." "^\\.wmake$") (("\\$HOME) (getenv "PWD"))) $PWD is initially the source directory, which I think is what the $(dirname $BASH_SOURCE ...) is aiming for(?). > +diff -ur OpenFOAM-4.x-version-4.1.org/src/parallel/decompose/metisDecomp/metisDecomp.C OpenFOAM-4.x-version-4.1/src/parallel/decompose/metisDecomp/metisDecomp.C > +--- OpenFOAM-4.x-version-4.1.org/src/parallel/decompose/metisDecomp/metisDecomp.C > ++++ OpenFOAM-4.x-version-4.1/src/parallel/decompose/metisDecomp/metisDecomp.C > +@@ -67,7 +67,7 @@ > + > + // Processor weights initialised with no size, only used if specified in > + // a file > +- Field processorWeights; > ++ Field processorWeights; This seems unrelated to unbundling :) Is this a known issue? > diff --git a/gnu/packages/simulation.scm b/gnu/packages/simulation.scm > new file mode 100644 > index 000000000..5aa5f8f03 > --- /dev/null > +++ b/gnu/packages/simulation.scm > @@ -0,0 +1,197 @@ > +;;; GNU Guix --- Functional package management for GNU > +;;; Copyright © 2017 Paul Garlick > +;;; > +;;; This file is part of GNU Guix. > +;;; > +;;; GNU Guix 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 3 of the License, or (at > +;;; your option) any later version. > +;;; > +;;; GNU Guix 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 GNU Guix. If not, see . > + > +(define-module (gnu packages simulation) > + #:use-module (gnu packages) > + #:use-module (gnu packages base) > + #:use-module (gnu packages bash) > + #:use-module (gnu packages bison) > + #:use-module (gnu packages boost) > + #:use-module (gnu packages compression) > + #:use-module (gnu packages flex) > + #:use-module (gnu packages gettext) > + #:use-module (gnu packages gcc) > + #:use-module (gnu packages gl) > + #:use-module (gnu packages graphics) > + #:use-module (gnu packages gtk) > + #:use-module (gnu packages linux) > + #:use-module (gnu packages m4) > + #:use-module (gnu packages maths) > + #:use-module (gnu packages mpi) > + #:use-module (gnu packages multiprecision) > + #:use-module (gnu packages ncurses) > + #:use-module (gnu packages readline) > + #:use-module (gnu packages tls) > + #:use-module (gnu packages version-control) > + #:use-module (gnu packages xml) > + #:use-module (gnu packages xorg) > + #:use-module (guix download) > + #:use-module (guix build utils) > + #:use-module (guix build-system gnu) > + #:use-module ((guix licenses) #:prefix license:) > + #:use-module (guix packages) > + #:use-module (guix utils) > + #:use-module (ice-9 ftw) > + #:use-module (ice-9 regex) > + #:use-module (srfi srfi-1)) > + > +(define-public openfoam > + (package > + (name "openfoam") > + (version "4.1") > + (source > + (origin > + (method url-fetch) > + (uri (string-append > + "http://dl.openfoam.org/source/" > + (string-replace-substring version "." "-"))) > + (file-name (string-append name "-" version ".tar.gz")) > + (sha256 > + (base32 "1hgh2kw7fqv4bfachhbjhw16v8j35jbv6s576fmz4ka2q4ks4wg3")) > + (patches (search-patches "openfoam-cleanup.patch")) > + (modules '((guix build utils))))) > + (build-system gnu-build-system) > + (native-inputs > + `(("bison" ,bison))) > + (propagated-inputs > + `(("boost" ,boost) > + ("cgal" ,cgal) > + ("flex" ,flex) > + ("git" ,git) > + ("gmp" ,gmp) > + ("gzip" ,gzip) > + ("gnuplot" ,gnuplot) > + ("libxt" ,libxt) > + ("metis" ,metis) > + ("mpfr" ,mpfr) > + ("ncurses" ,ncurses) > + ("openmpi" ,openmpi) > + ("readline" ,readline) > + ("scotch" ,pt-scotch) > + ("zlib" ,zlib))) We try to avoid propagating inputs to minimize risk of profile conflicts. Typically, the linker will add things to RUNPATH as necessary and then we only have to fully qualify command-line references and e.g. dlopen()'d solibs. Can you try making these normal inputs? If the dependencies show up in "guix gc -R $(./pre-inst-env guix build openfoam)" when added as regular inputs, propagation is usually not necessary. > + (arguments > + `(;; executable files and shared libraries are located in the 'platforms' > + ;; subdirectory > + #:strip-directories (list (string-append > + "OpenFOAM-" ,version > + "/platforms/linux64GccDPInt32Opt/bin") > + (string-append > + "OpenFOAM-" ,version > + "/platforms/linux64GccDPInt32Opt/lib")) > + ;; '#:elf-directories' is not recognised here so skip validation phase > + #:validate-runpath? #f I don't suppose it's easy to move everything up to the top store level, which is already in a versioned directory and would allow these phases to proceed normally? > + #:phases (modify-phases %standard-phases > + (add-after 'unpack 'rename-build-directory > + (lambda _ > + (use-modules (ice-9 ftw)) > + (use-modules (ice-9 regex)) > + (chdir "..") > + ;; use 'OpenFOAM-version' convention to match path name > + ;; expectations in the build phase > + (let ((unpack-dir (string-append > + (getcwd) "/" > + (list-ref (scandir (getcwd) (lambda (name) > + (string-match "^OpenFOAM" name))) 0))) > + (build-dir (string-append > + (getcwd) "/OpenFOAM-" ,version))) > + ;; re-name build directory > + (rename-file unpack-dir build-dir) > + ;; move to build directory > + (chdir (basename build-dir))))) Nit-pick: (chdir ...) (and setenv below) have unspecified return values, so please add an explicit #t at the end of such phases for determinism. Consult the Guile manual when unsure if a return value can be "trusted". > + (add-after 'patch-source-shebangs 'set-environment-variables > + (lambda _ > + (let ((libraries '("boost" "cgal" "gmp" "metis" "mpfr" "scotch"))) > + ;; set variables to define store paths > + (for-each (lambda (library) > + (setenv (string-append > + (string-upcase library) "_ROOT") > + (assoc-ref %build-inputs library))) libraries)) > + ;; set variables to define package versions > + (setenv "SCOTCHVERSION" ,(package-version scotch)) > + (setenv "METISVERSION" ,(package-version metis)))) > + (delete 'configure) ; no configure phase > + (delete 'patch-generated-file-shebangs) ; no generated files Does this phase fail somehow, or is it deleted simply because it's not needed? Just curious :-) > + (replace 'build > + (lambda _ > + ;; compile OpenFOAM libraries and applications > + (zero? (system (format #f > + "source ./etc/bashrc && ./Allwmake -j~a" > + (parallel-job-count)))))) > + (add-after 'build 'update-configuration-files > + (lambda _ > + ;; record store paths and package versions in configuration files > + (zero? (system (format #f "sed -i 's|~a|'~:*~s'|' ~a" > + "$CGAL_ROOT" "etc/config.sh/CGAL"))) > + (zero? (system (format #f "sed -i 's|~a|'~:*~s'|' ~a" > + "$BOOST_ROOT" "etc/config.sh/CGAL"))) > + (zero? (system (format #f "sed -i 's|~a|'~:*~s'|' ~a" > + "$METIS_ROOT" "etc/config.sh/metis"))) > + (zero? (system (format #f "sed -i 's|~a|'~:*~s'|' ~a" > + "$METISVERSION" "etc/config.sh/metis"))) > + (zero? (system (format #f "sed -i 's|~a|'~:*~s'|' ~a" > + "$SCOTCH_ROOT" "etc/config.sh/scotch"))) > + (zero? (system (format #f "sed -i 's|~a|'~:*~s'|' ~a" > + "$SCOTCHVERSION" "etc/config.sh/scotch"))) > + (zero? (system (format #f "sed -i 's|~a|'~:*~s'|' ~a" > + "$GMP_ROOT" "etc/config.sh/settings"))) > + (zero? (system (format #f "sed -i 's|~a|'~:*~s'|' ~a" > + "$MPFR_ROOT" "etc/config.sh/settings"))))) Can you try to use (substitute* ...) here instead? I failed to parse the four single quotes in the sed expression in the format string :-/ > + (delete 'check) ; no tests to run You can set #:tests? #f instead of deleting this phase. > + (replace 'install > + (lambda _ > + ;; use 'OpenFOAM-version' convention > + (let ((install-dir (string-append > + %output "/OpenFOAM-" ,version))) > + ;; create install directory > + (mkdir-p install-dir) > + ;; move contents of build directory to install directory > + (copy-recursively "." install-dir))))))) Related to the earlier question, but it would be nice if we could just copy the contents of platforms/linux64GccDPInt32Opt to %output directly. > + ;; Note: tutorial files are installed read-only in /gnu/store. > + ;; To allow write permissions on files copied from the store a > + ;; 'chmod' step is needed before running the applications. For > + ;; example, from a user's login: > + ;; $ source $GUIX_PROFILE/OpenFOAM-4.1/etc/bashrc > + ;; $ mkdir -p $FOAM_RUN > + ;; $ cd $FOAM_RUN > + ;; $ cp -r $FOAM_TUTORIALS/incompressible/simpleFoam/pitzdaily . > + ;; $ cd pitzdaily > + ;; $ chmod -R u+w . > + ;; $ blockMesh > + (native-search-paths > + ;; define the FOAM_INST_DIR variable > + (list (search-path-specification > + (variable "FOAM_INST_DIR") > + (files '("."))))) ...maybe by utilizing this variable? It would also be better to wrap the binaries with it, instead of depending on it being in a profile. > + (synopsis "Framework for numerical simulation of fluid flow") > + (description "OpenFOAM provides a set of solvers and methods for tackling > +problems in the field of Computational Fluid Dynamics (CFD). It is written in > +C++. Complex governing equations such as the Navier-Stokes equations can be > +solved in integral form. Physical processes such as phase change, droplet > +transport and chemical reaction can be modelled. Numerical methods are > +included to deal with sharp gradients, such as those encountered in flows with > +shock waves and flows with gas/liquid interfaces. > + > +OpenFOAM implements the Finite Volume Method for discretizing the spacial > +dimensions. Computational grids defining geometries in two- and > +three-dimensional domains may be generated by the included blockMesh and > +snappyHexMesh routines or imported from external grid-generation packages. > +Grids may be unstructured in layout and may contain any combination of > +polyhedral cells. Large problems may be split into smaller, connected > +problems for efficient solution on parallel systems") Missing ".' ---> ^^^ Having packaged a fair share of academic software myself, I fully expect that some of the suggestions above are overly optimistic, but had to ask regardless ;-) Hopefully it didn't sound too demanding. Can you send an updated patch please? :-)