2016-07-13 12:52:50 +00:00
|
|
|
{ minor_version, major_version, patch_version
|
2020-11-18 07:10:35 +00:00
|
|
|
, ...}@args:
|
2016-07-13 12:52:50 +00:00
|
|
|
let
|
|
|
|
versionNoPatch = "${toString major_version}.${toString minor_version}";
|
|
|
|
version = "${versionNoPatch}.${toString patch_version}";
|
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
|
|
|
safeX11 = stdenv: !(stdenv.isAarch32 || stdenv.isMips);
|
2016-07-13 12:52:50 +00:00
|
|
|
in
|
|
|
|
|
2021-01-22 11:25:31 +00:00
|
|
|
{ lib, stdenv, fetchurl, ncurses, buildEnv, libunwind
|
|
|
|
, libX11, xorgproto, useX11 ? safeX11 stdenv && !lib.versionAtLeast version "4.09"
|
2019-11-23 07:19:47 +00:00
|
|
|
, aflSupport ? false
|
2017-12-20 22:43:24 +00:00
|
|
|
, flambdaSupport ? false
|
2020-07-17 14:00:33 +00:00
|
|
|
, spaceTimeSupport ? false
|
2017-12-20 22:43:24 +00:00
|
|
|
}:
|
2016-07-13 12:52:50 +00:00
|
|
|
|
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
|
|
|
assert useX11 -> !stdenv.isAarch32 && !stdenv.isMips;
|
2021-01-22 11:25:31 +00:00
|
|
|
assert aflSupport -> lib.versionAtLeast version "4.05";
|
|
|
|
assert flambdaSupport -> lib.versionAtLeast version "4.03";
|
|
|
|
assert spaceTimeSupport -> lib.versionAtLeast version "4.04";
|
2016-07-13 12:52:50 +00:00
|
|
|
|
2020-11-18 07:10:35 +00:00
|
|
|
let
|
|
|
|
src = args.src or (fetchurl {
|
|
|
|
url = args.url or "http://caml.inria.fr/pub/distrib/ocaml-${versionNoPatch}/ocaml-${version}.tar.xz";
|
|
|
|
inherit (args) sha256;
|
|
|
|
});
|
|
|
|
in
|
|
|
|
|
2016-07-13 12:52:50 +00:00
|
|
|
let
|
|
|
|
useNativeCompilers = !stdenv.isMips;
|
2021-01-22 11:25:31 +00:00
|
|
|
inherit (lib) optional optionals optionalString;
|
2020-07-17 14:00:33 +00:00
|
|
|
name = "ocaml${optionalString aflSupport "+afl"}${optionalString spaceTimeSupport "+spacetime"}${optionalString flambdaSupport "+flambda"}-${version}";
|
2016-07-13 12:52:50 +00:00
|
|
|
in
|
|
|
|
|
2018-12-10 19:59:56 +00:00
|
|
|
let
|
2018-12-31 03:40:47 +00:00
|
|
|
x11env = buildEnv { name = "x11env"; paths = [libX11 xorgproto]; };
|
2016-07-13 12:52:50 +00:00
|
|
|
x11lib = x11env + "/lib";
|
|
|
|
x11inc = x11env + "/include";
|
2018-12-10 19:59:56 +00:00
|
|
|
in
|
|
|
|
|
2019-08-13 21:52:01 +00:00
|
|
|
stdenv.mkDerivation (args // {
|
2016-07-13 12:52:50 +00:00
|
|
|
|
|
|
|
inherit name;
|
2016-09-19 17:00:42 +00:00
|
|
|
inherit version;
|
2016-07-13 12:52:50 +00:00
|
|
|
|
2020-11-18 07:10:35 +00:00
|
|
|
inherit src;
|
2016-07-13 12:52:50 +00:00
|
|
|
|
|
|
|
prefixKey = "-prefix ";
|
2019-11-23 07:19:42 +00:00
|
|
|
configureFlags =
|
|
|
|
let flags = new: old:
|
2021-01-22 11:25:31 +00:00
|
|
|
if lib.versionAtLeast version "4.08"
|
2019-11-23 07:19:42 +00:00
|
|
|
then new else old
|
|
|
|
; in
|
|
|
|
optionals useX11 (flags
|
|
|
|
[ "--x-libraries=${x11lib}" "--x-includes=${x11inc}"]
|
|
|
|
[ "-x11lib" x11lib "-x11include" x11inc ])
|
2019-11-23 07:19:47 +00:00
|
|
|
++ optional aflSupport (flags "--with-afl" "-afl-instrument")
|
2019-11-23 07:19:42 +00:00
|
|
|
++ optional flambdaSupport (flags "--enable-flambda" "-flambda")
|
2020-07-17 14:00:33 +00:00
|
|
|
++ optional spaceTimeSupport (flags "--enable-spacetime" "-spacetime")
|
2021-08-05 12:00:00 +00:00
|
|
|
++ optional (stdenv.hostPlatform.isStatic && (lib.versionOlder version "4.08")) "-no-shared-libs"
|
|
|
|
++ optionals (stdenv.hostPlatform != stdenv.buildPlatform && lib.versionOlder version "4.08") [
|
|
|
|
"-host ${stdenv.hostPlatform.config}"
|
|
|
|
"-target ${stdenv.targetPlatform.config}"
|
|
|
|
];
|
|
|
|
dontAddStaticConfigureFlags = lib.versionOlder version "4.08";
|
|
|
|
configurePlatforms = lib.optionals (lib.versionAtLeast version "4.08") [ "host" "target" ];
|
|
|
|
# x86_64-unknown-linux-musl-ld: -r and -pie may not be used together
|
|
|
|
hardeningDisable = lib.optional (lib.versionAtLeast version "4.09" && stdenv.hostPlatform.isMusl) "pie";
|
2016-07-13 12:52:50 +00:00
|
|
|
|
2019-10-27 13:03:25 +00:00
|
|
|
buildFlags = [ "world" ] ++ optionals useNativeCompilers [ "bootstrap" "world.opt" ];
|
2021-01-22 11:25:31 +00:00
|
|
|
buildInputs = optional (!lib.versionAtLeast version "4.07") ncurses
|
2018-12-31 03:40:47 +00:00
|
|
|
++ optionals useX11 [ libX11 xorgproto ];
|
2020-07-17 14:00:33 +00:00
|
|
|
propagatedBuildInputs = optional spaceTimeSupport libunwind;
|
2019-10-27 13:03:25 +00:00
|
|
|
installTargets = [ "install" ] ++ optional useNativeCompilers "installopt";
|
2021-01-22 11:25:31 +00:00
|
|
|
preConfigure = optionalString (!lib.versionAtLeast version "4.04") ''
|
2016-07-13 12:52:50 +00:00
|
|
|
CAT=$(type -tp cat)
|
|
|
|
sed -e "s@/bin/cat@$CAT@" -i config/auto-aux/sharpbang
|
2021-02-27 04:20:19 +00:00
|
|
|
'' + optionalString (stdenv.isDarwin && stdenv.isAarch64) ''
|
|
|
|
# Do what upstream does by default now: https://github.com/ocaml/ocaml/pull/10176
|
|
|
|
# This is required for aarch64-darwin, everything else works as is.
|
|
|
|
AS="${stdenv.cc}/bin/cc -c" ASPP="${stdenv.cc}/bin/cc -c"
|
2021-08-05 12:00:00 +00:00
|
|
|
'' + optionalString (lib.versionOlder version "4.08" && stdenv.hostPlatform.isStatic) ''
|
|
|
|
configureFlagsArray+=("-cc" "$CC" "-as" "$AS" "-partialld" "$LD -r")
|
2016-07-13 12:52:50 +00:00
|
|
|
'';
|
|
|
|
postBuild = ''
|
|
|
|
mkdir -p $out/include
|
|
|
|
ln -sv $out/lib/ocaml/caml $out/include/caml
|
|
|
|
'';
|
|
|
|
|
|
|
|
passthru = {
|
|
|
|
nativeCompilers = useNativeCompilers;
|
|
|
|
};
|
|
|
|
|
2021-01-22 11:25:31 +00:00
|
|
|
meta = with lib; {
|
2021-06-03 14:16:27 +00:00
|
|
|
homepage = "https://ocaml.org/";
|
2016-11-26 09:35:23 +00:00
|
|
|
branch = versionNoPatch;
|
2016-07-13 12:52:50 +00:00
|
|
|
license = with licenses; [
|
|
|
|
qpl /* compiler */
|
|
|
|
lgpl2 /* library */
|
|
|
|
];
|
2021-06-03 14:16:27 +00:00
|
|
|
description = "OCaml is an industrial-strength programming language supporting functional, imperative and object-oriented styles";
|
|
|
|
|
|
|
|
longDescription = ''
|
|
|
|
OCaml is a general purpose programming language with an emphasis on expressiveness and safety. Developed for more than 20 years at Inria by a group of leading researchers, it has an advanced type system that helps catch your mistakes without getting in your way. It's used in environments where a single mistake can cost millions and speed matters, is supported by an active community, and has a rich set of libraries and development tools. It's widely used in teaching for its power and simplicity.
|
|
|
|
|
|
|
|
Strengths:
|
|
|
|
* A powerful type system, equipped with parametric polymorphism and type inference. For instance, the type of a collection can be parameterized by the type of its elements. This allows defining some operations over a collection independently of the type of its elements: sorting an array is one example. Furthermore, type inference allows defining such operations without having to explicitly provide the type of their parameters and result.
|
|
|
|
* User-definable algebraic data types and pattern-matching. New algebraic data types can be defined as combinations of records and sums. Functions that operate over such data structures can then be defined by pattern matching, a generalized form of the well-known switch statement, which offers a clean and elegant way of simultaneously examining and naming data.
|
|
|
|
* Automatic memory management, thanks to a fast, unobtrusive, incremental garbage collector.
|
|
|
|
* Separate compilation of standalone applications. Portable bytecode compilers allow creating stand-alone applications out of Caml Light or OCaml programs. A foreign function interface allows OCaml code to interoperate with C code when necessary. Interactive use of OCaml is also supported via a “read-evaluate-print” loop.
|
|
|
|
|
|
|
|
In addition, OCaml features:
|
|
|
|
* A sophisticated module system, which allows organizing modules hierarchically and parameterizing a module over a number of other modules.
|
|
|
|
* An expressive object-oriented layer, featuring multiple inheritance, parametric and virtual classes.
|
|
|
|
* Efficient native code compilers. In addition to its bytecode compiler, OCaml offers a compiler that produces efficient machine code for many architectures.
|
|
|
|
|
|
|
|
Learn more at: https://ocaml.org/learn/description.html
|
|
|
|
'';
|
2016-07-13 12:52:50 +00:00
|
|
|
|
|
|
|
platforms = with platforms; linux ++ darwin;
|
2021-01-22 11:25:31 +00:00
|
|
|
broken = stdenv.isAarch64 && !lib.versionAtLeast version "4.06";
|
2016-07-13 12:52:50 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
})
|