2018-06-19 21:15:55 +01:00
|
|
|
{ stdenv, fetchurl, m4, cxx ? !hostPlatform.useAndroidPrebuilt
|
|
|
|
, buildPackages, hostPlatform
|
2017-04-26 04:52:53 +01:00
|
|
|
, withStatic ? false }:
|
2015-03-26 05:59:04 +00:00
|
|
|
|
2017-02-09 01:52:13 +00:00
|
|
|
let inherit (stdenv.lib) optional optionalString; in
|
2015-03-26 05:59:04 +00:00
|
|
|
|
2015-10-15 16:43:23 +01:00
|
|
|
let self = stdenv.mkDerivation rec {
|
2017-04-11 10:53:37 +01:00
|
|
|
name = "gmp-6.1.2";
|
2015-03-26 05:59:04 +00:00
|
|
|
|
|
|
|
src = fetchurl { # we need to use bz2, others aren't in bootstrapping stdenv
|
|
|
|
urls = [ "mirror://gnu/gmp/${name}.tar.bz2" "ftp://ftp.gmplib.org/pub/${name}/${name}.tar.bz2" ];
|
2017-04-11 10:53:37 +01:00
|
|
|
sha256 = "1clg7pbpk6qwxj5b2mw0pghzawp2qlm3jf9gdd8i6fl6yh2bnxaj";
|
2015-03-26 05:59:04 +00:00
|
|
|
};
|
|
|
|
|
2016-04-17 13:32:35 +01:00
|
|
|
#outputs TODO: split $cxx due to libstdc++ dependency
|
2015-10-28 10:34:02 +00:00
|
|
|
# maybe let ghc use a version with *.so shared with rest of nixpkgs and *.a added
|
|
|
|
# - see #5855 for related discussion
|
2016-08-29 01:30:01 +01:00
|
|
|
outputs = [ "out" "dev" "info" ];
|
2015-10-15 16:43:23 +01:00
|
|
|
passthru.static = self.out;
|
2015-10-28 10:34:02 +00:00
|
|
|
|
2017-06-26 04:10:03 +01:00
|
|
|
depsBuildBuild = [ buildPackages.stdenv.cc ];
|
|
|
|
nativeBuildInputs = [ m4 ];
|
2015-03-26 05:59:04 +00:00
|
|
|
|
2018-08-03 16:58:20 +01:00
|
|
|
configureFlags = [
|
|
|
|
"--with-pic"
|
|
|
|
(stdenv.lib.enableFeature cxx "cxx")
|
2015-03-26 05:59:04 +00:00
|
|
|
# Build a "fat binary", with routines for several sub-architectures
|
|
|
|
# (x86), except on Solaris where some tests crash with "Memory fault".
|
|
|
|
# See <http://hydra.nixos.org/build/2760931>, for instance.
|
|
|
|
#
|
|
|
|
# no darwin because gmp uses ASM that clang doesn't like
|
2018-08-03 16:58:20 +01:00
|
|
|
(stdenv.lib.enableFeature (!stdenv.isSunOS && stdenv.hostPlatform.isx86) "fat")
|
|
|
|
] ++ optional (cxx && stdenv.isDarwin) "CPPFLAGS=-fexceptions"
|
2018-06-14 20:44:26 +01:00
|
|
|
++ optional (stdenv.isDarwin && stdenv.is64bit) "ABI=64"
|
|
|
|
++ optional (with stdenv.hostPlatform; useAndroidPrebuilt || useiOSPrebuilt) "--disable-assembly"
|
2015-03-26 05:59:04 +00:00
|
|
|
;
|
|
|
|
|
2015-06-12 08:33:59 +01:00
|
|
|
# The config.guess in GMP tries to runtime-detect various
|
|
|
|
# ARM optimization flags via /proc/cpuinfo (and is also
|
|
|
|
# broken on multicore CPUs). Avoid this impurity.
|
treewide: isArm -> isAarch32
Following legacy packing conventions, `isArm` was defined just for
32-bit ARM instruction set. This is confusing to non packagers though,
because Aarch64 is an ARM instruction set.
The official ARM overview for ARMv8[1] is surprisingly not confusing,
given the overall state of affairs for ARM naming conventions, and
offers us a solution. It divides the nomenclature into three levels:
```
ISA: ARMv8 {-A, -R, -M}
/ \
Mode: Aarch32 Aarch64
| / \
Encoding: A64 A32 T32
```
At the top is the overall v8 instruction set archicture. Second are the
two modes, defined by bitwidth but differing in other semantics too, and
buttom are the encodings, (hopefully?) isomorphic if they encode the
same mode.
The 32 bit encodings are mostly backwards compatible with previous
non-Thumb and Thumb encodings, and if so we can pun the mode names to
instead mean "sets of compatable or isomorphic encodings", and then
voilà we have nice names for 32-bit and 64-bit arm instruction sets
which do not use the word ARM so as to not confused either laymen or
experienced ARM packages.
[1]: https://developer.arm.com/products/architecture/a-profile
2018-03-20 02:41:06 +00:00
|
|
|
preConfigure = optionalString stdenv.isAarch32 ''
|
2015-06-12 08:33:59 +01:00
|
|
|
configureFlagsArray+=("--build=$(./configfsf.guess)")
|
|
|
|
'';
|
|
|
|
|
2018-01-08 07:19:47 +00:00
|
|
|
doCheck = true; # not cross;
|
2015-03-26 05:59:04 +00:00
|
|
|
|
|
|
|
dontDisableStatic = withStatic;
|
|
|
|
|
|
|
|
enableParallelBuilding = true;
|
|
|
|
|
|
|
|
meta = with stdenv.lib; {
|
2017-08-02 22:50:51 +01:00
|
|
|
homepage = https://gmplib.org/;
|
2015-03-26 05:59:04 +00:00
|
|
|
description = "GNU multiple precision arithmetic library";
|
|
|
|
license = licenses.gpl3Plus;
|
|
|
|
|
|
|
|
longDescription =
|
|
|
|
'' GMP is a free library for arbitrary precision arithmetic, operating
|
|
|
|
on signed integers, rational numbers, and floating point numbers.
|
|
|
|
There is no practical limit to the precision except the ones implied
|
|
|
|
by the available memory in the machine GMP runs on. GMP has a rich
|
|
|
|
set of functions, and the functions have a regular interface.
|
|
|
|
|
|
|
|
The main target applications for GMP are cryptography applications
|
|
|
|
and research, Internet security applications, algebra systems,
|
|
|
|
computational algebra research, etc.
|
|
|
|
|
|
|
|
GMP is carefully designed to be as fast as possible, both for small
|
|
|
|
operands and for huge operands. The speed is achieved by using
|
|
|
|
fullwords as the basic arithmetic type, by using fast algorithms,
|
|
|
|
with highly optimised assembly code for the most common inner loops
|
|
|
|
for a lot of CPUs, and by a general emphasis on speed.
|
|
|
|
|
|
|
|
GMP is faster than any other bignum library. The advantage for GMP
|
|
|
|
increases with the operand sizes for many operations, since GMP uses
|
|
|
|
asymptotically faster algorithms.
|
|
|
|
'';
|
|
|
|
|
|
|
|
platforms = platforms.all;
|
2016-07-07 04:22:15 +01:00
|
|
|
maintainers = [ maintainers.peti maintainers.vrthra ];
|
2015-03-26 05:59:04 +00:00
|
|
|
};
|
2015-10-15 16:43:23 +01:00
|
|
|
};
|
|
|
|
in self
|