3
0
Fork 0
forked from mirrors/nixpkgs
nixpkgs/pkgs/applications/science/machine-learning/shogun/default.nix
Sebastián Mancilla e810fad47a shogun: remove non-distributable SVMlight code
SVMlight uses a non-standard license [0] that doesn't allow distribution
without the author's permission:

> The software must not be modified and distributed without prior permission of the author.

So remove all code related to it when building the binary package.
Use upstream's own script to do it (which they use to create and
distribute their own Debian package), with a few fixes.

There is still the option of building from source with SVMlight enabled
with an override that sets the withSvmLight parameter.

If SVMlight is enabled set the license to unfree. Also fix the
deprecated gpl3 license to gpl3Plus.

[0]: https://github.com/shogun-toolbox/shogun/blob/shogun_6.1.4/doc/license/LICENSE_SVMlight.md
2021-09-17 15:04:34 -03:00

116 lines
3.6 KiB
Nix

{ stdenv, lib, fetchFromGitHub, fetchpatch, fetchurl, cmake, ctags, swig
# data, compression
, bzip2, curl, hdf5, json_c, xz, lzo, protobuf, snappy
# maths
, blas, lapack, eigen, nlopt, lp_solve, colpack, glpk
# libraries
, libarchive, libxml2
# extra support
, pythonSupport ? true, pythonPackages ? null
, opencvSupport ? false, opencv ? null
, withSvmLight ? false
}:
assert pythonSupport -> pythonPackages != null;
assert opencvSupport -> opencv != null;
assert (!blas.isILP64) && (!lapack.isILP64);
let
pname = "shogun";
version = "6.1.4";
rxcppVersion = "4.0.0";
gtestVersion = "1.8.0";
srcs = {
toolbox = fetchFromGitHub {
owner = pname + "-toolbox";
repo = pname;
rev = pname + "_" + version;
sha256 = "05s9dclmk7x5d7wnnj4qr6r6c827m72a44gizcv09lxr28pr9inz";
fetchSubmodules = true;
};
# we need the packed archive
rxcpp = fetchurl {
url = "https://github.com/Reactive-Extensions/RxCpp/archive/v${rxcppVersion}.tar.gz";
sha256 = "0y2isr8dy2n1yjr9c5570kpc9lvdlch6jv0jvw000amwn5d3krsh";
};
gtest = fetchurl {
url = "https://github.com/google/googletest/archive/release-${gtestVersion}.tar.gz";
sha256 = "1n5p1m2m3fjrjdj752lf92f9wq3pl5cbsfrb49jqbg52ghkz99jq";
};
};
in
stdenv.mkDerivation rec {
inherit pname version;
src = srcs.toolbox;
postUnpack = ''
mkdir -p $sourceRoot/third_party/{rxcpp,gtest}
ln -s ${srcs.rxcpp} $sourceRoot/third_party/rxcpp/v${rxcppVersion}.tar.gz
ln -s ${srcs.gtest} $sourceRoot/third_party/gtest/release-${gtestVersion}.tar.gz
'';
# broken
doCheck = false;
patches = [
(fetchpatch {
url = "https://github.com/awild82/shogun/commit/365ce4c4c700736d2eec8ba6c975327a5ac2cd9b.patch";
sha256 = "158hqv4xzw648pmjbwrhxjp7qcppqa7kvriif87gn3zdn711c49s";
})
] ++ lib.optional (!withSvmLight) ./svmlight-scrubber.patch;
CCACHE_DISABLE="1";
CCACHE_DIR=".ccache";
nativeBuildInputs = [ cmake ];
buildInputs = with lib; [
blas lapack bzip2 colpack curl ctags eigen hdf5 json_c lp_solve xz lzo
protobuf nlopt snappy swig (libarchive.dev) libxml2 lapack glpk
]
++ optionals (pythonSupport) (with pythonPackages; [ python ply numpy ])
++ optional (opencvSupport) opencv;
NIX_CFLAGS_COMPILE="-faligned-new";
cmakeFlags =
let
onOff = b: if b then "ON" else "OFF";
flag = n: b: "-D"+n+"="+onOff b;
in
with lib; [
(flag "ENABLE_TESTING" doCheck)
(flag "BUILD_META_EXAMPLES" doCheck)
(flag "CMAKE_VERBOSE_MAKEFILE:BOOL" doCheck)
(flag "PythonModular" pythonSupport)
(flag "OpenCV" opencvSupport)
(flag "USE_SVMLIGHT" withSvmLight)
];
postPatch = ''
# Fix preprocessing SVMlight code
sed -i \
-e 's@#ifdef SVMLIGHT@#ifdef USE_SVMLIGHT@' \
-e '/^#ifdef USE_SVMLIGHT/,/^#endif/ s@#endif@#endif //USE_SVMLIGHT@' \
src/shogun/kernel/string/CommUlongStringKernel.cpp
sed -i -e 's/#if USE_SVMLIGHT/#ifdef USE_SVMLIGHT/' src/interfaces/swig/Machine.i
sed -i -e 's@// USE_SVMLIGHT@//USE_SVMLIGHT@' src/interfaces/swig/Transfer.i
sed -i -e 's@/\* USE_SVMLIGHT \*/@//USE_SVMLIGHT@' src/interfaces/swig/Transfer_includes.i
'' + lib.optionalString (!withSvmLight) ''
# Run SVMlight scrubber
patchShebangs scripts/light-scrubber.sh
echo "removing SVMlight code"
./scripts/light-scrubber.sh
'';
meta = with lib; {
description = "A toolbox which offers a wide range of efficient and unified machine learning methods";
homepage = "http://shogun-toolbox.org/";
license = if withSvmLight then licenses.unfree else licenses.gpl3Plus;
maintainers = with maintainers; [ edwtjo ];
};
}