diff options
Diffstat (limited to 'pkgs/applications/science/misc/openmodelica/mkderivation/default.nix')
-rw-r--r-- | pkgs/applications/science/misc/openmodelica/mkderivation/default.nix | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/pkgs/applications/science/misc/openmodelica/mkderivation/default.nix b/pkgs/applications/science/misc/openmodelica/mkderivation/default.nix new file mode 100644 index 00000000000..94029fead48 --- /dev/null +++ b/pkgs/applications/science/misc/openmodelica/mkderivation/default.nix @@ -0,0 +1,101 @@ +# mkOpenModelicaDerivation is an mkDerivation function for packages +# from OpenModelica suite. + +{ stdenv, lib, fetchgit, autoconf, automake, libtool, cmake, autoreconfHook, symlinkJoin }: +pkg: +let + inherit (builtins) hasAttr getAttr length elemAt; + inherit (lib) attrByPath concatStringsSep; + + + # A few helpers functions: + + # getAttrDef is just a getAttr with default fallback + getAttrDef = attr: default: x: attrByPath [ attr ] default x; + + # getAttr-like helper for optional append to string: + # "Hello" + appendByAttr "a" " " {a = "world";} = "Hello world" + # "Hello" + appendByAttr "a" " " {} = "Hello" + appendByAttr = attr: sep: x: if hasAttr attr x then sep + (getAttr attr x) else ""; + + # Are there any OM dependencies at all? + ifDeps = length pkg.omdeps != 0; + + # Dependencies of current OpenModelica-target joined in one file tree. + # Return the dep itself in case it is a single one. + joinedDeps = + if length pkg.omdeps == 1 + then elemAt pkg.omdeps 0 + else + symlinkJoin { + name = pkg.pname + "-omhome"; + paths = pkg.omdeps; + }; + + # Should we run ./configure for the target pkg? + omautoconf = getAttrDef "omautoconf" false pkg; + + # Name of the make target + omtarget = getAttrDef "omtarget" pkg.pname pkg; + + # Directory of target sources + omdir = getAttrDef "omdir" pkg.pname pkg; + + # Simple to to m4 configuration scripts + postPatch = lib.optionalString ifDeps '' + sed -i ''$(find -name omhome.m4) -e 's|if test ! -z "$USINGPRESETBUILDDIR"|if test ! -z "$USINGPRESETBUILDDIR" -a -z "$OMHOME"|' + '' + + appendByAttr "postPatch" "\n" pkg; + + # Update shebangs in the scripts before running configuration. + preAutoreconf = "patchShebangs --build common" + + appendByAttr "preAutoreconf" "\n" pkg; + + # Tell OpenModelica where built dependencies are located. + configureFlags = lib.optional ifDeps "--with-openmodelicahome=${joinedDeps}" ++ + getAttrDef "configureFlags" [ ] pkg; + + # Our own configurePhase that accounts for omautoconf + configurePhase = '' + runHook preConfigure + export configureFlags="''${configureFlags} --with-ombuilddir=$PWD/build --prefix=$prefix" + ./configure --no-recursion $configureFlags + ${lib.optionalString omautoconf "(cd ${omdir}; ./configure $configureFlags)"} + runHook postConfigure + ''; + + # Targets that we want to build ourselves: + deptargets = lib.forEach pkg.omdeps (dep: dep.omtarget); + + # ... so we ask openmodelica makefile to skip those targets. + preBuild = '' + for target in ${concatStringsSep " " deptargets}; do + touch ''${target}.skip; + done + '' + + appendByAttr "preBuild" "\n" pkg; + + makeFlags = "${omtarget}" + + appendByAttr "makeFlags" " " pkg; + + installFlags = "-i " + + appendByAttr "installFlags" " " pkg; + + +in +stdenv.mkDerivation (pkg // { + inherit omtarget postPatch preAutoreconf configureFlags configurePhase preBuild makeFlags installFlags; + + src = fetchgit (import ./src-main.nix); + version = "1.17.0"; + + nativeBuildInputs = getAttrDef "nativeBuildInputs" [ ] pkg + ++ [ autoconf automake libtool cmake autoreconfHook ]; + + buildInputs = getAttrDef "buildInputs" [ ] pkg + ++ lib.optional ifDeps joinedDeps; + + dontUseCmakeConfigure = true; + + hardeningDisable = [ "format" ]; +}) |