Skip to content
Snippets Groups Projects
default.nix 10.5 KiB
Newer Older
François Bobot's avatar
François Bobot committed
# paramaterised derivation with dependencies injected (callPackage style)
{ pkgs, stdenv, src ? ../., opam2nix, ocaml_version ? "ocaml-ng.ocamlPackages_4_08.ocaml", plugins ? { } }:
François Bobot's avatar
François Bobot committed

let mk_buildInputs = { opamPackages ? [], nixPackages ? [] } :
    [ pkgs.gnugrep pkgs.gnused  pkgs.autoconf pkgs.gnumake pkgs.gcc pkgs.ncurses pkgs.time pkgs.python3 pkgs.perl pkgs.file pkgs.which pkgs.dos2unix] ++ nixPackages ++ opam2nix.build {
           specs = opam2nix.toSpecs ([ "ocamlfind" "zarith" "ocamlgraph" "yojson"
                { name = "coq"; constraint = "=8.11.1";  }
                { name = "why3" ; constraint = "=1.3.1"; }
                { name = "why3-coq" ; constraint = "=1.3.1"; }
François Bobot's avatar
François Bobot committed
                { name = "menhir"; constraint = "=20190924"; }
                { name = "dune"; constraint = "=1.11.4"; }
                { name = "camlzip"; constraint = "=1.07"; }  #so that why3 is always compiled with it
François Bobot's avatar
François Bobot committed
                ] ++ opamPackages
François Bobot's avatar
François Bobot committed
              );
           ocamlAttr = ocaml_version;
        };

    # Extends the call to stdenv.mkDerivation with parameters common for all
    # frama-c derivations
    mk_deriv = args:
        stdenv.mkDerivation ({
            # Disable Nix's GCC hardening
            hardeningDisable = [ "all" ];
        } // args);
François Bobot's avatar
François Bobot committed
in

rec {
  inherit src mk_buildInputs;
François Bobot's avatar
François Bobot committed
  buildInputs = mk_buildInputs {};
  installed = main.out;
François Bobot's avatar
François Bobot committed
        name = "frama-c";
        inherit src buildInputs;
        outputs = [ "out" "build_dir" ];
        postPatch = ''
               patchShebangs .
        '';
        configurePhase = ''
               unset CC
               autoconf
               ./configure --prefix=$out
        '';
        buildPhase = ''
                make -j 4
        '';
        installPhase = ''
               make install
               mkdir -p $build_dir
               tar -cf $build_dir/dir.tar .
               pwd > $build_dir/old_pwd
        '';
        setupHook = pkgs.writeText "setupHook.sh" ''
          addFramaCPath () {
            if test -d "$1/lib/frama-c/plugins"; then
              export FRAMAC_PLUGIN="''${FRAMAC_PLUGIN:-}''${FRAMAC_PLUGIN:+:}$1/lib/frama-c/plugins"
              export OCAMLPATH="''${OCAMLPATH:-}''${OCAMLPATH:+:}$1/lib/frama-c/plugins"
François Bobot's avatar
François Bobot committed
            fi

            if test -d "$1/lib/frama-c"; then
              export OCAMLPATH="''${OCAMLPATH:-}''${OCAMLPATH:+:}$1/lib/frama-c"
François Bobot's avatar
François Bobot committed
            fi

            if test -d "$1/share/frama-c/"; then
              export FRAMAC_EXTRA_SHARE="''${FRAMAC_EXTRA_SHARE:-}''${FRAMAC_EXTRA_SHARE:+:}$1/share/frama-c"
François Bobot's avatar
François Bobot committed
            fi

          }

          addEnvHooks "$targetOffset" addFramaCPath
        '';
  };

François Bobot's avatar
François Bobot committed
        name = "frama-c-lint";
        inherit src;
        buildInputs = (mk_buildInputs { opamPackages = [ { name = "ocp-indent"; constraint = "=1.7.0"; } ];} )
                      ++ [ pkgs.bc plugins.headache.installed ];
François Bobot's avatar
François Bobot committed
        outputs = [ "out" ];
        postPatch = ''
               patchShebangs .
        '';
        configurePhase = ''
               unset CC
               autoconf
               ./configure --prefix=$out
        '';
        buildPhase = ''
               make lint
               make stats-lint
               make check-headers
        '';
        installPhase = ''
               true
        '';
  };

François Bobot's avatar
François Bobot committed
        name = "frama-c-test";
        inherit buildInputs;
        build_dir = main.build_dir;
        src = main.build_dir + "/dir.tar";
        sourceRoot = ".";
        postUnpack = ''
               find . \( -name "Makefile*" -or -name ".depend" -o -name "ptests_config" -o -name "config.status" \) -exec bash -c "t=\$(stat -c %y \"\$0\"); sed -i -e \"s&$(cat $build_dir/old_pwd)&$(pwd)&g\" \"\$0\"; touch -d \"\$t\" \"\$0\"" {} \;
        '';
        configurePhase = ''
           true
        '';
        buildPhase = ''
               make clean_share_link
               make create_share_link
               make tests -j4 PTESTS_OPTS="-error-code -j 4"
        '';
        installPhase = ''
               true
        '';
  };

  build-distrib-tarball = mk_deriv {
        name = "frama-c-build-distrib-tarball";
François Bobot's avatar
François Bobot committed
        inherit src;
        buildInputs = buildInputs ++ [ plugins.headache.installed ];
        outputs = [ "out" ];
François Bobot's avatar
François Bobot committed
        postPatch = ''
               patchShebangs .
        '';
        configurePhase = ''
               unset CC
               autoconf
               ./configure --prefix=$out
        '';
        buildPhase = ''
                make DISTRIB="frama-c-archive" src-distrib
                tar -zcf frama-c-tests-archive.tar.gz tests src/plugins/*/tests
François Bobot's avatar
François Bobot committed
        '';
        installPhase = ''
               tar -C $out --strip-components=1 -xzf frama-c-archive.tar.gz
               tar -C $out -xzf frama-c-tests-archive.tar.gz
François Bobot's avatar
François Bobot committed
        '';
  };

  build-from-distrib-tarball = mk_deriv {
        name = "frama-c-build-from-distrib-tarball";
        inherit buildInputs;
        src = build-distrib-tarball.out ;
        outputs = [ "out" ];
François Bobot's avatar
François Bobot committed
        configurePhase = ''
               unset CC
               autoconf
               ./configure --prefix=$out
        '';
        buildPhase = ''
                make -j 4
        '';
        installPhase = ''
François Bobot's avatar
François Bobot committed
        '';
  };

François Bobot's avatar
François Bobot committed
        name = "frama-c-wp-qualif";
        buildInputs = mk_buildInputs { opamPackages = [
                    { name = "alt-ergo"; constraint = "=2.0.0"; }
François Bobot's avatar
François Bobot committed
               ]; };
        build_dir = main.build_dir;
        src = main.build_dir + "/dir.tar";
        sourceRoot = ".";
        postUnpack = ''
               find . \( -name "Makefile*" -or -name ".depend" -o -name "ptests_config" -o -name "config.status" \) -exec bash -c "t=\$(stat -c %y \"\$0\"); sed -i -e \"s&$(cat $build_dir/old_pwd)&$(pwd)&g\" \"\$0\"; touch -d \"\$t\" \"\$0\"" {} \;
        '';
        configurePhase = ''
           true
        '';
        buildPhase = ''
               make clean_share_link
               make create_share_link
               mkdir home
               HOME=$(pwd)/home
               why3 config --full-config
               make src/plugins/wp/tests/test_config_qualif
               export FRAMAC_WP_CACHE=replay
               export FRAMAC_WP_CACHEDIR=${plugins.wp-cache.src}
François Bobot's avatar
François Bobot committed
               bin/ptests.opt -error-code -config qualif src/plugins/wp/tests
        '';
        installPhase = ''
               true
        '';
  };

        name = "frama-c-e-acsl-tests-dev";
        buildInputs = mk_buildInputs { nixPackages = [ pkgs.gmp pkgs.getopt ]; };
        build_dir = main.build_dir;
        src = main.build_dir + "/dir.tar";
        sourceRoot = ".";
        postUnpack = ''
               find . \( -name "Makefile*" -or -name ".depend" -o -name "ptests_config" -o -name "config.status" \) -exec bash -c "t=\$(stat -c %y \"\$0\"); sed -i -e \"s&$(cat $build_dir/old_pwd)&$(pwd)&g\" \"\$0\"; touch -d \"\$t\" \"\$0\"" {} \;
        '';
        configurePhase = ''
           true
        '';
        buildPhase = ''
               make clean_share_link
               make create_share_link
               make E_ACSL_TESTS PTESTS_OPTS="-error-code" DEV=yes
François Bobot's avatar
François Bobot committed
        name = "frama-c-internal";
        inherit src;
        buildInputs = (mk_buildInputs { opamPackages = [ "xml-light" ]; } ) ++
                      pkgs.libxslt pkgs.libxml2 pkgs.autoPatchelfHook
                      pkgs.swiProlog
                      stdenv.cc.cc.lib
François Bobot's avatar
François Bobot committed
        ];
        counter_examples_src = plugins.counter-examples.src;
        genassigns_src = plugins.genassigns.src;
François Bobot's avatar
François Bobot committed
        frama_clang_src = plugins.frama-clang.src;
François Bobot's avatar
François Bobot committed
        pathcrawler_src = plugins.pathcrawler.src;
        mthread_src = plugins.mthread.src;
        caveat_importer_src = plugins.caveat-importer.src;
        acsl_importer_src = plugins.acsl-importer.src;
        volatile_src = plugins.volatile.src;
        security_src = plugins.security.src;
        context_from_precondition_src = plugins.context-from-precondition.src;
        metacsl_src = plugins.meta.src;
François Bobot's avatar
François Bobot committed
        postPatch = ''
               patchShebangs .
        '';
        postUnpack = ''
           cp -r --preserve=mode "$counter_examples_src" "$sourceRoot/src/plugins/counter-examples"
           chmod -R u+w -- "$sourceRoot/src/plugins/counter-examples"
           cp -r --preserve=mode "$genassigns_src" "$sourceRoot/src/plugins/genassigns"
           chmod -R u+w -- "$sourceRoot/src/plugins/genassigns"
           # cp -r --preserve=mode "$frama_clang_src" "$sourceRoot/src/plugins/frama-clang"
           # chmod -R u+w -- "$sourceRoot/src/plugins/frama-clang"
François Bobot's avatar
François Bobot committed
           cp -r --preserve=mode "$pathcrawler_src" "$sourceRoot/src/plugins/pathcrawler"
           chmod -R u+w -- "$sourceRoot/src/plugins/pathcrawler"
           cp -r --preserve=mode "$mthread_src" "$sourceRoot/src/plugins/mthread"
           chmod -R u+w -- "$sourceRoot/src/plugins/mthread"
           cp -r --preserve=mode "$caveat_importer_src" "$sourceRoot/src/plugins/caveat-importer"
           chmod -R u+w -- "$sourceRoot/src/plugins/caveat-importer"
           cp -r --preserve=mode "$volatile_src" "$sourceRoot/src/plugins/volatile"
           chmod -R u+w -- "$sourceRoot/src/plugins/volatile"
           cp -r --preserve=mode "$acsl_importer_src" "$sourceRoot/src/plugins/acsl-importer"
           chmod -R u+w -- "$sourceRoot/src/plugins/acsl-importer"
           echo IN_FRAMA_CI=yes > "$sourceRoot/in_frama_ci"
           cp -r --preserve=mode "$context_from_precondition_src" "$sourceRoot/src/plugins/context-from-precondition"
           chmod -R u+w -- "$sourceRoot/src/plugins/context-from-precondition"
           cp -r --preserve=mode "$security_src" "$sourceRoot/src/plugins/security"
           chmod -R u+w -- "$sourceRoot/src/plugins/security"
           '';

        configurePhase = ''
               unset CC
               autoconf
               ./configure --prefix=$out
        '';
        buildPhase = ''
                make unpack-eclipse
                sed -i src/plugins/pathcrawler/extern/eclipseCLP/RUNME -e "s/chmod 2755/chmod 755/g"
                rm src/plugins/pathcrawler/extern/eclipseCLP/lib/x86_64_linux/dbi_mysql.so
                rm src/plugins/pathcrawler/extern/eclipseCLP/lib/x86_64_linux/ic.so
                autoPatchelf src/plugins/pathcrawler
François Bobot's avatar
François Bobot committed
                make -j 4
                ln -sr src/plugins/pathcrawler/share share/pc
                make tests -j4 PTESTS_OPTS="-error-code -j 4"
        '';
        installPhase = ''
               make install
        '';
  };

}