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

let mydir = builtins.getEnv("PWD");
   mk-opam-selection = { name, opamSrc?{}, ... }: {
      src = opamSrc;
      selection = "${mydir}/${name}-${ocaml.version}-opam-selection.nix";
     opamPackages =
      [ "ocamlfind" "zarith" "ocamlgraph" "yojson" "zmq"
        "ppx_deriving" "ppx_deriving_yojson"
        "coq=8.13.0" "alt-ergo=2.2.0"
        "why3=1.4.0" "why3-coq=1.4.0"
    # only pure nix packages. See mk_deriv below for adding opam2nix packages
    [ 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;
    # Extends the call to stdenv.mkDerivation with parameters common for all
    # frama-c derivations
    mk_deriv = args:
            if args?opamPackages then
              opamPackages ++ args.opamPackages
            else opamPackages
          opam-selection = mk-opam-selection args;
          buildInputs = args.buildInputs ++ opam2nix.buildInputs opam-selection;
        stdenv.mkDerivation (
          args //
          {
            # Disable Nix's GCC hardening
            hardeningDisable = [ "all" ];
            inherit buildInputs;
          })
        { gen-opam-selection =
            opam2nix.resolve opam-selection my_opam_packages; }
François Bobot's avatar
François Bobot committed
in

pkgs.lib.makeExtensible
(self: {
  inherit src mk_buildInputs opamPackages mk_deriv;
François Bobot's avatar
François Bobot committed
  buildInputs = mk_buildInputs {};
  installed = self.main.out;
François Bobot's avatar
François Bobot committed
        name = "frama-c";
        src = self.src;
        buildInputs =self.buildInputs;
François Bobot's avatar
François Bobot committed
        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";
        opamPackages = [ "ocp-indent=1.7.0" "headache=1.05"];
          self.mk_buildInputs { nixPackages = [ pkgs.bc pkgs.clang_10 ]; };
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
               STRICT_HEADERS=yes make check-headers
François Bobot's avatar
François Bobot committed
        '';
        installPhase = ''
               true
        '';
  };

  doc = mk_deriv {
        name = "frama-c-doc";
        buildInputs = self.buildInputs;
        build_dir = self.main.build_dir;
        src = self.main.build_dir + "/dir.tar";
        sourceRoot = ".";
        postPatch = ''
               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 doc
        '';
        installPhase = ''
               true
        '';
  } // { other-opam-selection = "main";};

François Bobot's avatar
François Bobot committed
        name = "frama-c-test";
        buildInputs = self.buildInputs;
        build_dir = self.main.build_dir;
        src = self.main.build_dir + "/dir.tar";
François Bobot's avatar
François Bobot committed
        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
        '';
  } // { other-opam-selection = "main"; };
François Bobot's avatar
François Bobot committed

  build-distrib-tarball = mk_deriv {
        name = "frama-c-build-distrib-tarball";
        outputs = [ "out" ];
François Bobot's avatar
François Bobot committed
        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";
        buildInputs = self.buildInputs;
        opamPackages = self.build-distrib-tarball.opamPackages;
        src = self.build-distrib-tarball.out ;
        outputs = [ "out" ];
        postPatch = ''
               patchShebangs .
        '';
François Bobot's avatar
François Bobot committed
        configurePhase = ''
               unset CC
               autoconf
               ./configure --prefix=$out
        '';
        buildPhase = ''
                make -j 4
        '';
               make clean_share_link
               make create_share_link
               make tests -j4 PTESTS_OPTS="-error-code -j 4"
François Bobot's avatar
François Bobot committed
        installPhase = ''
François Bobot's avatar
François Bobot committed
        '';
  } // { other-opam-selection = "build-distrib-tarball"; };
François Bobot's avatar
François Bobot committed

François Bobot's avatar
François Bobot committed
        name = "frama-c-wp-qualif";
        buildInputs = self.mk_buildInputs { };
        build_dir = self.main.build_dir;
        src = self.main.build_dir + "/dir.tar";
François Bobot's avatar
François Bobot committed
        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
Loïc Correnson's avatar
Loïc Correnson committed
               why3 config detect
               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
        '';
  } // { other-opam-selection = "main"; };
François Bobot's avatar
François Bobot committed

  aorai-prove = mk_deriv {
        name = "frama-c-aorai-prove";
        buildInputs = self.mk_buildInputs { };
        build_dir = self.main.build_dir;
        src = self.main.build_dir + "/dir.tar";
        sourceRoot = ".";
        postUnpack = ''
               find . \( -name "Makefile*" -or -name ".depend" -o -name "ptests_config" -o -name "test_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
Loïc Correnson's avatar
Loïc Correnson committed
          why3 config detect
          make src/plugins/aorai/tests/ptests_config
          export AORAI_WP_CACHE=replay
          export AORAI_WP_CACHEDIR=${plugins.wp-cache.src}
          make PTESTS_OPTS="-error-code" aorai-test-prove
  } // { other-opam-selection = "main"; };
  eva-tests = mk_deriv {
        name = "frama-c-eva-tests";
        buildInputs = self.mk_buildInputs { };
        build_dir = self.main.build_dir;
        src = self.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
               export CONFIGS="equality bitwise symblocs gauges octagon"
               src/plugins/value/vtests -j 4 -error-code
Andre Maroneze's avatar
Andre Maroneze committed
  } // { other-opam-selection = "main"; };
        name = "frama-c-e-acsl-tests-dev";
        buildInputs = self.mk_buildInputs { nixPackages = [ pkgs.gmp pkgs.getopt ]; };
        build_dir = self.main.build_dir;
        src = self.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
  } // { other-opam-selection = "main"; };
François Bobot's avatar
François Bobot committed
        name = "frama-c-internal";
        buildInputs =
          self.mk_buildInputs
            { nixPackages =
                [ pkgs.getopt 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
                rm src/plugins/pathcrawler/extern/eclipseCLP/lib/x86_64_linux/bitmap.so
                rm -fr src/plugins/pathcrawler/extern/eclipseCLP/lib/i386_linux
                rm src/plugins/pathcrawler/src/generator/COLIBRI/float_util_sparc_sunos5.so
                rm src/plugins/pathcrawler/src/generator/COLIBRI/float_util_i386_linux.so.*
                rm src/plugins/pathcrawler/share/bin/float_util_sparc_sunos5.so
                find src/plugins/pathcrawler -name '*_i386_*.so' -delete
                autoPatchelf src/plugins/pathcrawler/
François Bobot's avatar
François Bobot committed
                make -j 4
                ln -sr src/plugins/pathcrawler/share share/pc
                # Setup Why3
                mkdir home
                HOME=$(pwd)/home
Loïc Correnson's avatar
Loïc Correnson committed
                why3 config detect
                # Setup WP related
                export CAVEAT_IMPORTER_NIX_MODE=yes
                export GENASSIGNS_NIX_MODE=yes
                export FRAMAC_WP_CACHE=replay
                export FRAMAC_WP_CACHEDIR=${plugins.wp-cache.src}
François Bobot's avatar
François Bobot committed
                make tests -j4 PTESTS_OPTS="-error-code -j 4"
        '';
        installPhase = ''
               make install
        '';
  };