Newer
Older
# paramaterised derivation with dependencies injected (callPackage style)
{ pkgs, stdenv, src ? ../., opam2nix, ocaml ? pkgs.ocaml-ng.ocamlPackages_4_08.ocaml, plugins ? { } }:
let mydir = builtins.getEnv("PWD");
mk-opam-selection = { name, opamSrc?{}, ... }: {
Virgile Prevosto
committed
inherit ocaml;
selection = "${mydir}/${name}-${ocaml.version}-opam-selection.nix";
Virgile Prevosto
committed
};
Virgile Prevosto
committed
[ "ocamlfind" "zarith" "ocamlgraph" "yojson" "zmq"
"ppx_deriving" "ppx_deriving_yojson"
"menhir=20211012"
# only pure nix packages. See mk_deriv below for adding opam2nix packages
Virgile Prevosto
committed
mk_buildInputs = { 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;
# Extends the call to stdenv.mkDerivation with parameters common for all
# frama-c derivations
mk_deriv = args:
Virgile Prevosto
committed
let my_opam_packages =
Virgile Prevosto
committed
if args?opamPackages then
opamPackages ++ args.opamPackages
else opamPackages
Virgile Prevosto
committed
;
opam-selection = mk-opam-selection args;
buildInputs = args.buildInputs ++ opam2nix.buildInputs opam-selection;
Virgile Prevosto
committed
in
stdenv.mkDerivation (
args //
{
# Disable Nix's GCC hardening
hardeningDisable = [ "all" ];
Virgile Prevosto
committed
//
{ gen-opam-selection =
opam2nix.resolve opam-selection my_opam_packages; }
Virgile Prevosto
committed
;
pkgs.lib.makeExtensible
(self: {
inherit src mk_buildInputs opamPackages mk_deriv;
installed = self.main.out;
main = mk_deriv {
src = self.src;
buildInputs =self.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"
if test -d "$1/lib/frama-c"; then
export OCAMLPATH="''${OCAMLPATH:-}''${OCAMLPATH:+:}$1/lib/frama-c"
if test -d "$1/share/frama-c/"; then
export FRAMAC_EXTRA_SHARE="''${FRAMAC_EXTRA_SHARE:-}''${FRAMAC_EXTRA_SHARE:+:}$1/share/frama-c"
fi
}
addEnvHooks "$targetOffset" addFramaCPath
'';
};
lint = mk_deriv {
Virgile Prevosto
committed
opamPackages = [ "ocp-indent=1.7.0" "headache=1.05"];
self.mk_buildInputs { nixPackages = [ pkgs.bc pkgs.clang_10 ]; };
outputs = [ "out" ];
postPatch = ''
patchShebangs .
'';
configurePhase = ''
unset CC
autoconf
./configure --prefix=$out
'';
buildPhase = ''
make lint
make stats-lint
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";};
tests = mk_deriv {
buildInputs = self.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
make tests -j4 PTESTS_OPTS="-error-code -j 4"
'';
installPhase = ''
true
'';
} // { other-opam-selection = "main"; };
build-distrib-tarball = mk_deriv {
name = "frama-c-build-distrib-tarball";
Virgile Prevosto
committed
buildInputs = self.buildInputs;
Virgile Prevosto
committed
opamPackages = [ "headache=1.05" ];
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
tar -C $out --strip-components=1 -xzf frama-c-archive.tar.gz
tar -C $out -xzf frama-c-tests-archive.tar.gz
build-from-distrib-tarball = mk_deriv {
name = "frama-c-build-from-distrib-tarball";
doCheck = true;
buildInputs = self.buildInputs;
Virgile Prevosto
committed
opamPackages = self.build-distrib-tarball.opamPackages;
src = self.build-distrib-tarball.out ;
postPatch = ''
patchShebangs .
'';
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"
} // { other-opam-selection = "build-distrib-tarball"; };
wp-qualif = mk_deriv {
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
mkdir home
HOME=$(pwd)/home
make src/plugins/wp/tests/test_config_qualif
export FRAMAC_WP_CACHE=replay
export FRAMAC_WP_CACHEDIR=${plugins.wp-cache.src}
bin/ptests.opt -error-code -config qualif src/plugins/wp/tests
'';
installPhase = ''
true
'';
} // { other-opam-selection = "main"; };
Virgile Prevosto
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";
Virgile Prevosto
committed
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
Virgile Prevosto
committed
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
Virgile Prevosto
committed
'';
installPhase = ''
true
'';
} // { other-opam-selection = "main"; };
Virgile Prevosto
committed
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
'';
installPhase = ''
true
'';
e-acsl-tests-dev = mk_deriv {
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
'';
installPhase = ''
true
'';
} // { other-opam-selection = "main"; };
internal = mk_deriv {
Virgile Prevosto
committed
opamPackages = [ "xml-light" ];
Virgile Prevosto
committed
buildInputs =
self.mk_buildInputs
{ nixPackages =
[ pkgs.getopt pkgs.libxslt pkgs.libxml2 pkgs.autoPatchelfHook
pkgs.swiProlog stdenv.cc.cc.lib ];
};
counter_examples_src = plugins.counter-examples.src;
genassigns_src = plugins.genassigns.src;
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;
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"
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
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/
# Setup Why3
mkdir home
HOME=$(pwd)/home
# Setup WP related
export CAVEAT_IMPORTER_NIX_MODE=yes
export FRAMAC_WP_CACHE=replay
export FRAMAC_WP_CACHEDIR=${plugins.wp-cache.src}
make tests -j4 PTESTS_OPTS="-error-code -j 4"
'';
installPhase = ''
make install
'';
};