Compare commits
38 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cba5f7abbe | ||
|
|
b015f12145 | ||
|
|
5a8dd543c6 | ||
|
|
2e0cb1fe44 | ||
|
|
e3af15bd11 | ||
|
|
360b98ce78 | ||
|
|
ee9df08052 | ||
|
|
c129230259 | ||
|
|
aa50731ee3 | ||
|
|
ebbc5125da | ||
|
|
bc284a4d37 | ||
|
|
b9c837a453 | ||
|
|
5b0d3a3f5d | ||
|
|
9d17af02a5 | ||
|
|
5018fa7019 | ||
|
|
a7c6be2f53 | ||
|
|
0e1aab5f28 | ||
|
|
561453cd2d | ||
|
|
13ff7d0244 | ||
|
|
7f5edb92c0 | ||
|
|
f299c84c6d | ||
|
|
a3771460e1 | ||
|
|
2883f28bbd | ||
|
|
4f34985ad8 | ||
|
|
b40114b0c9 | ||
|
|
48b6d0088d | ||
|
|
ebbf4c122f | ||
|
|
2ec55e949b | ||
|
|
a8e366538a | ||
|
|
c37874e266 | ||
|
|
a433439c10 | ||
|
|
4a09b96d7b | ||
|
|
64f662b9c5 | ||
|
|
5ebc943f98 | ||
|
|
772b17b666 | ||
|
|
be2dfe04db | ||
|
|
cec11e3cd8 | ||
|
|
68671b2fe6 |
33 changed files with 845 additions and 2122 deletions
|
|
@ -1,192 +0,0 @@
|
|||
From 2912ed4fde14e34b58c482cb81fb88676ab3ffc2 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Nicol=C3=A1s=20Ojeda=20B=C3=A4r?= <n.oje.bar@gmail.com>
|
||||
Date: Wed, 27 Apr 2022 14:46:47 +0200
|
||||
Subject: [PATCH 01/24] Do not trigger warning when calling virtual methods
|
||||
introduced by constraining "self" (#11204)
|
||||
|
||||
(cherry picked from commit 1e7af3f6261502bb384dc9e23a74ad0990bfd854)
|
||||
---
|
||||
Changes | 11 ++++++-
|
||||
testsuite/tests/typing-objects/Tests.ml | 15 ++++++++++
|
||||
typing/typeclass.ml | 40 ++++++++++---------------
|
||||
3 files changed, 40 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index a8ce94bdc6..931a74b8d1 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -1,3 +1,13 @@
|
||||
+OCaml 4.14 maintenance branch
|
||||
+-----------------------------
|
||||
+
|
||||
+### Bug fixes:
|
||||
+
|
||||
+- #11204: Fix regression introduced in 4.14.0 that would trigger Warning 17 when
|
||||
+ calling virtual methods introduced by constraining the self type from within
|
||||
+ the class definition.
|
||||
+ (Nicolás Ojeda Bär, review by Leo White)
|
||||
+
|
||||
OCaml 4.14.0 (28 March 2022)
|
||||
----------------------------
|
||||
|
||||
@@ -62,7 +72,6 @@ OCaml 4.14.0 (28 March 2022)
|
||||
definition-aware operations.
|
||||
(Ulysse Gérard, Thomas Refis and Leo White, review by Florian Angeletti)
|
||||
|
||||
-
|
||||
### Language features:
|
||||
|
||||
- #10462: Add attribute to produce a compiler error for polls.
|
||||
diff --git a/testsuite/tests/typing-objects/Tests.ml b/testsuite/tests/typing-objects/Tests.ml
|
||||
index f617bcf1b9..3dcd87c43c 100644
|
||||
--- a/testsuite/tests/typing-objects/Tests.ml
|
||||
+++ b/testsuite/tests/typing-objects/Tests.ml
|
||||
@@ -955,6 +955,21 @@ Warning 17 [undeclared-virtual-method]: the virtual method m is not declared.
|
||||
class c : object method m : int method n : int end
|
||||
|}];;
|
||||
|
||||
+class virtual c = object (self : 'c)
|
||||
+ constraint 'c = < f : int; .. >
|
||||
+end
|
||||
+[%%expect {|
|
||||
+class virtual c : object method virtual f : int end
|
||||
+|}];;
|
||||
+
|
||||
+class virtual c = object (self : 'c)
|
||||
+ constraint 'c = < f : int; .. >
|
||||
+ method g = self # f
|
||||
+end
|
||||
+[%%expect {|
|
||||
+class virtual c : object method virtual f : int method g : int end
|
||||
+|}];;
|
||||
+
|
||||
class [ 'a ] c = object (_ : 'a) end;;
|
||||
let o = object
|
||||
method m = 1
|
||||
diff --git a/typing/typeclass.ml b/typing/typeclass.ml
|
||||
index 048ee998b0..fedbc0e025 100644
|
||||
--- a/typing/typeclass.ml
|
||||
+++ b/typing/typeclass.ml
|
||||
@@ -552,12 +552,11 @@ type first_pass_accummulater =
|
||||
concrete_vals : VarSet.t;
|
||||
local_meths : MethSet.t;
|
||||
local_vals : VarSet.t;
|
||||
- vars : Ident.t Vars.t;
|
||||
- meths : Ident.t Meths.t; }
|
||||
+ vars : Ident.t Vars.t; }
|
||||
|
||||
let rec class_field_first_pass self_loc cl_num sign self_scope acc cf =
|
||||
let { rev_fields; val_env; par_env; concrete_meths; concrete_vals;
|
||||
- local_meths; local_vals; vars; meths } = acc
|
||||
+ local_meths; local_vals; vars } = acc
|
||||
in
|
||||
let loc = cf.pcf_loc in
|
||||
let attributes = cf.pcf_attributes in
|
||||
@@ -612,13 +611,6 @@ let rec class_field_first_pass self_loc cl_num sign self_scope acc cf =
|
||||
(val_env, par_env, inherited_vars, vars))
|
||||
parent_sign.csig_vars (val_env, par_env, [], vars)
|
||||
in
|
||||
- let meths =
|
||||
- Meths.fold
|
||||
- (fun label _ meths ->
|
||||
- if Meths.mem label meths then meths
|
||||
- else Meths.add label (Ident.create_local label) meths)
|
||||
- parent_sign.csig_meths meths
|
||||
- in
|
||||
(* Methods available through super *)
|
||||
let super_meths =
|
||||
MethSet.fold
|
||||
@@ -641,7 +633,7 @@ let rec class_field_first_pass self_loc cl_num sign self_scope acc cf =
|
||||
in
|
||||
let rev_fields = field :: rev_fields in
|
||||
{ acc with rev_fields; val_env; par_env;
|
||||
- concrete_meths; concrete_vals; vars; meths })
|
||||
+ concrete_meths; concrete_vals; vars })
|
||||
| Pcf_val (label, mut, Cfk_virtual styp) ->
|
||||
with_attrs
|
||||
(fun () ->
|
||||
@@ -723,15 +715,11 @@ let rec class_field_first_pass self_loc cl_num sign self_scope acc cf =
|
||||
let cty = transl_simple_type val_env false sty in
|
||||
let ty = cty.ctyp_type in
|
||||
add_method loc val_env label.txt priv Virtual ty sign;
|
||||
- let meths =
|
||||
- if Meths.mem label.txt meths then meths
|
||||
- else Meths.add label.txt (Ident.create_local label.txt) meths
|
||||
- in
|
||||
let field =
|
||||
Virtual_method { label; priv; cty; loc; attributes }
|
||||
in
|
||||
let rev_fields = field :: rev_fields in
|
||||
- { acc with rev_fields; meths })
|
||||
+ { acc with rev_fields })
|
||||
|
||||
| Pcf_method (label, priv, Cfk_concrete (override, expr)) ->
|
||||
with_attrs
|
||||
@@ -785,10 +773,6 @@ let rec class_field_first_pass self_loc cl_num sign self_scope acc cf =
|
||||
raise(Error(loc, val_env,
|
||||
Field_type_mismatch ("method", label.txt, err)))
|
||||
end;
|
||||
- let meths =
|
||||
- if Meths.mem label.txt meths then meths
|
||||
- else Meths.add label.txt (Ident.create_local label.txt) meths
|
||||
- in
|
||||
let sdefinition = make_method self_loc cl_num expr in
|
||||
let warning_state = Warnings.backup () in
|
||||
let field =
|
||||
@@ -799,7 +783,7 @@ let rec class_field_first_pass self_loc cl_num sign self_scope acc cf =
|
||||
let rev_fields = field :: rev_fields in
|
||||
let concrete_meths = MethSet.add label.txt concrete_meths in
|
||||
let local_meths = MethSet.add label.txt local_meths in
|
||||
- { acc with rev_fields; concrete_meths; local_meths; meths })
|
||||
+ { acc with rev_fields; concrete_meths; local_meths })
|
||||
|
||||
| Pcf_constraint (sty1, sty2) ->
|
||||
with_attrs
|
||||
@@ -837,11 +821,10 @@ and class_fields_first_pass self_loc cl_num sign self_scope
|
||||
let local_meths = MethSet.empty in
|
||||
let local_vals = VarSet.empty in
|
||||
let vars = Vars.empty in
|
||||
- let meths = Meths.empty in
|
||||
let init_acc =
|
||||
{ rev_fields; val_env; par_env;
|
||||
concrete_meths; concrete_vals;
|
||||
- local_meths; local_vals; vars; meths }
|
||||
+ local_meths; local_vals; vars }
|
||||
in
|
||||
let acc =
|
||||
Builtin_attributes.warning_scope []
|
||||
@@ -850,7 +833,7 @@ and class_fields_first_pass self_loc cl_num sign self_scope
|
||||
(class_field_first_pass self_loc cl_num sign self_scope)
|
||||
init_acc cfs)
|
||||
in
|
||||
- List.rev acc.rev_fields, acc.vars, acc.meths
|
||||
+ List.rev acc.rev_fields, acc.vars
|
||||
|
||||
and class_field_second_pass cl_num sign met_env field =
|
||||
let mkcf desc loc attrs =
|
||||
@@ -1003,7 +986,7 @@ and class_structure cl_num virt self_scope final val_env met_env loc
|
||||
end;
|
||||
|
||||
(* Typing of class fields *)
|
||||
- let (fields, vars, meths) =
|
||||
+ let (fields, vars) =
|
||||
class_fields_first_pass self_loc cl_num sign self_scope
|
||||
val_env par_env str
|
||||
in
|
||||
@@ -1016,6 +999,13 @@ and class_structure cl_num virt self_scope final val_env met_env loc
|
||||
update_class_signature loc val_env
|
||||
~warn_implicit_public:false virt kind sign;
|
||||
|
||||
+ let meths =
|
||||
+ Meths.fold
|
||||
+ (fun label _ meths ->
|
||||
+ Meths.add label (Ident.create_local label) meths)
|
||||
+ sign.csig_meths Meths.empty
|
||||
+ in
|
||||
+
|
||||
(* Close the signature if it is final *)
|
||||
begin match final with
|
||||
| Not_final -> ()
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
25
0001-Don-t-add-rpaths-to-libraries.patch
Normal file
25
0001-Don-t-add-rpaths-to-libraries.patch
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
From 04e523e937625bf30d775681c11e00f6dc6fc00a Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Tue, 24 Jun 2014 10:00:15 +0100
|
||||
Subject: [PATCH 1/2] Don't add rpaths to libraries.
|
||||
|
||||
---
|
||||
configure.ac | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 3754ad8a39..fb60c7c14c 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -1422,8 +1422,6 @@ AS_IF([test x"$enable_shared" != "xno"],
|
||||
[[*-*-openbsd7.[3-9]|*-*-openbsd[89].*]],
|
||||
[mkdll_flags="${mkdll_flags} -Wl,--no-execute-only"])
|
||||
oc_ldflags="$oc_ldflags -Wl,-E"
|
||||
- rpath="-Wl,-rpath,"
|
||||
- mksharedlibrpath="-Wl,-rpath,"
|
||||
natdynlinkopts="-Wl,-E"
|
||||
supports_shared_libraries=true],
|
||||
[mkdll='shared-libs-not-available'])
|
||||
--
|
||||
2.52.0
|
||||
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
From 623258a6517c8ec1d9e5f41cbdc05205a0e6ee1d Mon Sep 17 00:00:00 2001
|
||||
From: David Allsopp <david.allsopp@metastack.com>
|
||||
Date: Thu, 5 May 2022 20:01:44 +0100
|
||||
Subject: [PATCH 02/24] Merge pull request #11236 from Nymphium/missing-since2
|
||||
|
||||
Add missing @since annotation to Gc.eventlog_pause
|
||||
|
||||
(cherry picked from commit 77fee6035c25d8a31084dc556ee634e46bb39164)
|
||||
---
|
||||
stdlib/gc.mli | 10 ++++++++--
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/stdlib/gc.mli b/stdlib/gc.mli
|
||||
index b211197fd4..8031eeb8df 100644
|
||||
--- a/stdlib/gc.mli
|
||||
+++ b/stdlib/gc.mli
|
||||
@@ -442,7 +442,10 @@ external eventlog_pause : unit -> unit = "caml_eventlog_pause"
|
||||
Traces are collected if the program is linked to the instrumented runtime
|
||||
and started with the environment variable OCAML_EVENTLOG_ENABLED.
|
||||
Events are flushed to disk after pausing, and no new events will be
|
||||
- recorded until [eventlog_resume] is called. *)
|
||||
+ recorded until [eventlog_resume] is called.
|
||||
+
|
||||
+ @since 4.11
|
||||
+ *)
|
||||
|
||||
external eventlog_resume : unit -> unit = "caml_eventlog_resume"
|
||||
(** [eventlog_resume ()] will resume the collection of traces in the
|
||||
@@ -451,7 +454,10 @@ external eventlog_resume : unit -> unit = "caml_eventlog_resume"
|
||||
and started with the environment variable OCAML_EVENTLOG_ENABLED.
|
||||
This call can be used after calling [eventlog_pause], or if the program
|
||||
was started with OCAML_EVENTLOG_ENABLED=p. (which pauses the collection of
|
||||
- traces before the first event.) *)
|
||||
+ traces before the first event.)
|
||||
+
|
||||
+ @since 4.11
|
||||
+ *)
|
||||
|
||||
|
||||
(** [Memprof] is a sampling engine for allocated memory words. Every
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
25
0002-configure-Allow-user-defined-C-compiler-flags.patch
Normal file
25
0002-configure-Allow-user-defined-C-compiler-flags.patch
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
From ef549c9a97838331877b139f407269db2a0fc691 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Tue, 29 May 2012 20:44:18 +0100
|
||||
Subject: [PATCH 2/2] configure: Allow user defined C compiler flags.
|
||||
|
||||
---
|
||||
configure.ac | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index fb60c7c14c..f6a493ccf5 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -3243,7 +3243,7 @@ AC_CONFIG_COMMANDS_PRE([
|
||||
[mkexedebugflag="${mkexe_ldflags_prefix}${mkexedebugflag}"])
|
||||
mkdll_ldflags=""
|
||||
AS_IF([test -n "${LDFLAGS}"],
|
||||
- [for flag in ${LDFLAGS}; do
|
||||
+ [for flag in "${LDFLAGS}"; do
|
||||
mkdll_ldflags="${mkdll_ldflags} ${mkexe_ldflags_prefix}${flag}"
|
||||
done
|
||||
mkdll_ldflags_exp="$mkdll_ldflags"])
|
||||
--
|
||||
2.52.0
|
||||
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
From d497565758b5c80d8a7bf4cad02e5a4558ae6b00 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Nicol=C3=A1s=20Ojeda=20B=C3=A4r?= <n.oje.bar@gmail.com>
|
||||
Date: Tue, 17 May 2022 10:21:34 +0200
|
||||
Subject: [PATCH 03/24] misc.h: fix preprocessor conditional on _MSC_VER
|
||||
|
||||
(cherry picked from commit 253d605e10865371aed45967a94caed0642b7583)
|
||||
---
|
||||
runtime/caml/misc.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/runtime/caml/misc.h b/runtime/caml/misc.h
|
||||
index 5915c30a7b..494d45e8f8 100644
|
||||
--- a/runtime/caml/misc.h
|
||||
+++ b/runtime/caml/misc.h
|
||||
@@ -35,7 +35,7 @@
|
||||
/* Supported since at least GCC 3.1 */
|
||||
#define CAMLdeprecated_typedef(name, type) \
|
||||
typedef type name __attribute ((deprecated))
|
||||
-#elif _MSC_VER >= 1310
|
||||
+#elif defined(_MSC_VER) && _MSC_VER >= 1310
|
||||
/* NB deprecated("message") only supported from _MSC_VER >= 1400 */
|
||||
#define CAMLdeprecated_typedef(name, type) \
|
||||
typedef __declspec(deprecated) type name
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
From d2b9da6f7aff410e8a1499637ae88aaf0a135c2f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Nicol=C3=A1s=20Ojeda=20B=C3=A4r?= <n.oje.bar@gmail.com>
|
||||
Date: Tue, 17 May 2022 14:45:26 +0200
|
||||
Subject: [PATCH 04/24] Changes
|
||||
|
||||
(cherry picked from commit 9a157026f115364635f8fe0ae5805e15ef071de0)
|
||||
---
|
||||
Changes | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index 931a74b8d1..fdfffd78bb 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -8,6 +8,10 @@ OCaml 4.14 maintenance branch
|
||||
the class definition.
|
||||
(Nicolás Ojeda Bär, review by Leo White)
|
||||
|
||||
+- #11263: caml/misc.h: check whether `_MSC_VER` is defined before using it. This
|
||||
+ could break the build of the compiler on non-gcc non-clang Unix builds.
|
||||
+ (Nicolás Ojeda Bär, review by Sebastien Hinderer)
|
||||
+
|
||||
OCaml 4.14.0 (28 March 2022)
|
||||
----------------------------
|
||||
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,93 +0,0 @@
|
|||
From 513164232d897c39c4e571a7a8f167dee5c146b3 Mon Sep 17 00:00:00 2001
|
||||
From: David Allsopp <david.allsopp@metastack.com>
|
||||
Date: Wed, 18 May 2022 12:48:33 +0100
|
||||
Subject: [PATCH 05/24] Guard more instances of undefined _MSC_VER
|
||||
|
||||
---
|
||||
Changes | 8 +++++---
|
||||
runtime/caml/memory.h | 2 +-
|
||||
runtime/caml/misc.h | 12 +++++++-----
|
||||
3 files changed, 13 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index fdfffd78bb..590268262d 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -8,9 +8,11 @@ OCaml 4.14 maintenance branch
|
||||
the class definition.
|
||||
(Nicolás Ojeda Bär, review by Leo White)
|
||||
|
||||
-- #11263: caml/misc.h: check whether `_MSC_VER` is defined before using it. This
|
||||
- could break the build of the compiler on non-gcc non-clang Unix builds.
|
||||
- (Nicolás Ojeda Bär, review by Sebastien Hinderer)
|
||||
+- #11263, #11267: caml/{memory,misc}.h: check whether `_MSC_VER` is defined
|
||||
+ before using it to ensure that the headers can always be used in code which
|
||||
+ turns on -Wundef (or equivalent).
|
||||
+ (David Allsopp and Nicolás Ojeda Bär, review by Nicolás Ojeda Bär and
|
||||
+ Sebastien Hinderer)
|
||||
|
||||
OCaml 4.14.0 (28 March 2022)
|
||||
----------------------------
|
||||
diff --git a/runtime/caml/memory.h b/runtime/caml/memory.h
|
||||
index 1e9cdf6d9b..d9e58bc2d0 100644
|
||||
--- a/runtime/caml/memory.h
|
||||
+++ b/runtime/caml/memory.h
|
||||
@@ -329,7 +329,7 @@ struct caml__roots_block {
|
||||
#define CAMLunused_start __attribute__ ((unused))
|
||||
#define CAMLunused_end
|
||||
#define CAMLunused __attribute__ ((unused))
|
||||
-#elif _MSC_VER >= 1500
|
||||
+#elif defined(_MSC_VER) && _MSC_VER >= 1500
|
||||
#define CAMLunused_start __pragma( warning (push) ) \
|
||||
__pragma( warning (disable:4189 ) )
|
||||
#define CAMLunused_end __pragma( warning (pop))
|
||||
diff --git a/runtime/caml/misc.h b/runtime/caml/misc.h
|
||||
index 494d45e8f8..c605f8711e 100644
|
||||
--- a/runtime/caml/misc.h
|
||||
+++ b/runtime/caml/misc.h
|
||||
@@ -43,7 +43,8 @@
|
||||
#define CAMLdeprecated_typedef(name, type) typedef type name
|
||||
#endif
|
||||
|
||||
-#if defined(__GNUC__) && __STDC_VERSION__ >= 199901L || _MSC_VER >= 1925
|
||||
+#if defined(__GNUC__) && __STDC_VERSION__ >= 199901L \
|
||||
+ || defined(_MSC_VER) && _MSC_VER >= 1925
|
||||
|
||||
#define CAML_STRINGIFY(x) #x
|
||||
#ifdef _MSC_VER
|
||||
@@ -90,7 +91,7 @@ CAMLdeprecated_typedef(addr, char *);
|
||||
#define CAMLnoreturn_start
|
||||
#define CAMLnoreturn_end __attribute__ ((noreturn))
|
||||
#define Noreturn __attribute__ ((noreturn))
|
||||
-#elif _MSC_VER >= 1500
|
||||
+#elif defined(_MSC_VER) && _MSC_VER >= 1500
|
||||
#define CAMLnoreturn_start __declspec(noreturn)
|
||||
#define CAMLnoreturn_end
|
||||
#define Noreturn
|
||||
@@ -138,11 +139,12 @@ CAMLdeprecated_typedef(addr, char *);
|
||||
/* we need to be able to compute the exact offset of each member. */
|
||||
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
|
||||
#define CAMLalign(n) _Alignas(n)
|
||||
-#elif defined(__cplusplus) && (__cplusplus >= 201103L || _MSC_VER >= 1900)
|
||||
+#elif defined(__cplusplus) \
|
||||
+ && (__cplusplus >= 201103L || defined(_MSC_VER) && _MSC_VER >= 1900)
|
||||
#define CAMLalign(n) alignas(n)
|
||||
#elif defined(SUPPORTS_ALIGNED_ATTRIBUTE)
|
||||
#define CAMLalign(n) __attribute__((aligned(n)))
|
||||
-#elif _MSC_VER >= 1500
|
||||
+#elif defined(_MSC_VER) && _MSC_VER >= 1500
|
||||
#define CAMLalign(n) __declspec(align(n))
|
||||
#else
|
||||
#error "How do I align values on this platform?"
|
||||
@@ -170,7 +172,7 @@ CAMLdeprecated_typedef(addr, char *);
|
||||
#define CAMLunused_start __attribute__ ((unused))
|
||||
#define CAMLunused_end
|
||||
#define CAMLunused __attribute__ ((unused))
|
||||
-#elif _MSC_VER >= 1500
|
||||
+#elif defined(_MSC_VER) && _MSC_VER >= 1500
|
||||
#define CAMLunused_start __pragma( warning (push) ) \
|
||||
__pragma( warning (disable:4189 ) )
|
||||
#define CAMLunused_end __pragma( warning (pop))
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,95 +0,0 @@
|
|||
From fa904a7d3c89c2ad18a426017aeda5bb0d7dd8bd Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Fran=C3=A7ois=20Pottier?=
|
||||
<fpottier@users.noreply.github.com>
|
||||
Date: Fri, 24 Jun 2022 16:37:13 +0200
|
||||
Subject: [PATCH 06/24] Better documentation for [string_of_float]. (#11353)
|
||||
|
||||
Better documentation for [string_of_float] (and [Float.to_string])
|
||||
with similar warnings for [print_float] and [prerr_float] in a similar way.
|
||||
|
||||
(cherry picked from commit 40113fbc73930b41a7a2df468de18c94feeefdf5)
|
||||
---
|
||||
stdlib/float.mli | 7 ++++++-
|
||||
stdlib/stdlib.mli | 15 ++++++++++++---
|
||||
stdlib/templates/float.template.mli | 7 ++++++-
|
||||
3 files changed, 24 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/stdlib/float.mli b/stdlib/float.mli
|
||||
index ba84d9b0e2..93d2f3016d 100644
|
||||
--- a/stdlib/float.mli
|
||||
+++ b/stdlib/float.mli
|
||||
@@ -178,7 +178,12 @@ val of_string_opt: string -> float option
|
||||
(** Same as [of_string], but returns [None] instead of raising. *)
|
||||
|
||||
val to_string : float -> string
|
||||
-(** Return the string representation of a floating-point number. *)
|
||||
+(** Return a string representation of a floating-point number.
|
||||
+
|
||||
+ This conversion can involve a loss of precision. For greater control over
|
||||
+ the manner in which the number is printed, see {!Printf}.
|
||||
+
|
||||
+ This function is an alias for {!Stdlib.string_of_float}. *)
|
||||
|
||||
type fpclass = Stdlib.fpclass =
|
||||
FP_normal (** Normal number, none of the below *)
|
||||
diff --git a/stdlib/stdlib.mli b/stdlib/stdlib.mli
|
||||
index 237adfbdd8..0eaee2716e 100644
|
||||
--- a/stdlib/stdlib.mli
|
||||
+++ b/stdlib/stdlib.mli
|
||||
@@ -776,7 +776,10 @@ external int_of_string : string -> int = "caml_int_of_string"
|
||||
[Failure "int_of_string"] instead of returning [None]. *)
|
||||
|
||||
val string_of_float : float -> string
|
||||
-(** Return the string representation of a floating-point number. *)
|
||||
+(** Return a string representation of a floating-point number.
|
||||
+
|
||||
+ This conversion can involve a loss of precision. For greater control over
|
||||
+ the manner in which the number is printed, see {!Printf}. *)
|
||||
|
||||
val float_of_string_opt: string -> float option
|
||||
(** Convert the given string to a float. The string is read in decimal
|
||||
@@ -861,7 +864,10 @@ val print_int : int -> unit
|
||||
(** Print an integer, in decimal, on standard output. *)
|
||||
|
||||
val print_float : float -> unit
|
||||
-(** Print a floating-point number, in decimal, on standard output. *)
|
||||
+(** Print a floating-point number, in decimal, on standard output.
|
||||
+
|
||||
+ The conversion of the number to a string uses {!string_of_float} and
|
||||
+ can involve a loss of precision. *)
|
||||
|
||||
val print_endline : string -> unit
|
||||
(** Print a string, followed by a newline character, on
|
||||
@@ -889,7 +895,10 @@ val prerr_int : int -> unit
|
||||
(** Print an integer, in decimal, on standard error. *)
|
||||
|
||||
val prerr_float : float -> unit
|
||||
-(** Print a floating-point number, in decimal, on standard error. *)
|
||||
+(** Print a floating-point number, in decimal, on standard error.
|
||||
+
|
||||
+ The conversion of the number to a string uses {!string_of_float} and
|
||||
+ can involve a loss of precision. *)
|
||||
|
||||
val prerr_endline : string -> unit
|
||||
(** Print a string, followed by a newline character on standard
|
||||
diff --git a/stdlib/templates/float.template.mli b/stdlib/templates/float.template.mli
|
||||
index e35c01809f..e2f7411a02 100644
|
||||
--- a/stdlib/templates/float.template.mli
|
||||
+++ b/stdlib/templates/float.template.mli
|
||||
@@ -178,7 +178,12 @@ val of_string_opt: string -> float option
|
||||
(** Same as [of_string], but returns [None] instead of raising. *)
|
||||
|
||||
val to_string : float -> string
|
||||
-(** Return the string representation of a floating-point number. *)
|
||||
+(** Return a string representation of a floating-point number.
|
||||
+
|
||||
+ This conversion can involve a loss of precision. For greater control over
|
||||
+ the manner in which the number is printed, see {!Printf}.
|
||||
+
|
||||
+ This function is an alias for {!Stdlib.string_of_float}. *)
|
||||
|
||||
type fpclass = Stdlib.fpclass =
|
||||
FP_normal (** Normal number, none of the below *)
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
From 05874f93adc60f16ccd5cbeef1e2ff010cef12c1 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Angeletti <florian.angeletti@inria.fr>
|
||||
Date: Fri, 1 Jul 2022 14:41:25 +0200
|
||||
Subject: [PATCH 07/24] Merge pull request #11380 from
|
||||
damiendoligez/fix-fortran-test-on-macos
|
||||
|
||||
fix gfortran test on Macos
|
||||
|
||||
(cherry picked from commit d7a2e0fa7f2df9bd178109ba9725bb074affbd5c)
|
||||
---
|
||||
testsuite/tests/lib-bigarray-2/has-gfortran.sh | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/testsuite/tests/lib-bigarray-2/has-gfortran.sh b/testsuite/tests/lib-bigarray-2/has-gfortran.sh
|
||||
index 82f7ae8aee..051122113a 100644
|
||||
--- a/testsuite/tests/lib-bigarray-2/has-gfortran.sh
|
||||
+++ b/testsuite/tests/lib-bigarray-2/has-gfortran.sh
|
||||
@@ -5,6 +5,9 @@ if ! which gfortran > /dev/null 2>&1; then
|
||||
elif ! grep -q '^CC=gcc' ${ocamlsrcdir}/Makefile.config; then
|
||||
echo "OCaml was not compiled with gcc" > ${ocamltest_response}
|
||||
test_result=${TEST_SKIP}
|
||||
+elif gcc --version 2>&1 | grep 'Apple clang version'; then
|
||||
+ echo "OCaml was not compiled with gcc" > ${ocamltest_response}
|
||||
+ test_result=${TEST_SKIP}
|
||||
else
|
||||
test_result=${TEST_PASS}
|
||||
fi
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,101 +0,0 @@
|
|||
From b9afeb8b8dc8c32f9f1c74c8402de9e6265e9d5f Mon Sep 17 00:00:00 2001
|
||||
From: Xavier Leroy <xavierleroy@users.noreply.github.com>
|
||||
Date: Fri, 1 Jul 2022 17:14:44 +0200
|
||||
Subject: [PATCH 08/24] Refactor the initialization of bytecode threading
|
||||
(#11378)
|
||||
|
||||
Refactor the initialization of bytecode threading
|
||||
|
||||
Use a function `caml_init_thread_code` instead of exposing global variables
|
||||
`caml_instr_table` and `caml_instr_base`.
|
||||
|
||||
This should silence the GCC 12 "dangling-pointer" warning.
|
||||
|
||||
Fixes: #11358
|
||||
---
|
||||
Changes | 5 +++++
|
||||
runtime/caml/fix_code.h | 3 +--
|
||||
runtime/fix_code.c | 10 ++++++++--
|
||||
runtime/interp.c | 7 +++----
|
||||
4 files changed, 17 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index 590268262d..7ea4475b8d 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -14,6 +14,11 @@ OCaml 4.14 maintenance branch
|
||||
(David Allsopp and Nicolás Ojeda Bär, review by Nicolás Ojeda Bär and
|
||||
Sebastien Hinderer)
|
||||
|
||||
+- #11358, #11378: Refactor the initialization of bytecode threading.
|
||||
+ This avoids a "dangling pointer" warning of GCC 12.1.
|
||||
+ (Xavier Leroy, report by Armaël Guéneau, review by Gabriel Scherer)
|
||||
+
|
||||
+
|
||||
OCaml 4.14.0 (28 March 2022)
|
||||
----------------------------
|
||||
|
||||
diff --git a/runtime/caml/fix_code.h b/runtime/caml/fix_code.h
|
||||
index 83c393a17d..2eafaa814b 100644
|
||||
--- a/runtime/caml/fix_code.h
|
||||
+++ b/runtime/caml/fix_code.h
|
||||
@@ -34,8 +34,7 @@ void caml_set_instruction (code_t pos, opcode_t instr);
|
||||
int caml_is_instruction (opcode_t instr1, opcode_t instr2);
|
||||
|
||||
#ifdef THREADED_CODE
|
||||
-extern char ** caml_instr_table;
|
||||
-extern char * caml_instr_base;
|
||||
+void caml_init_thread_code(void ** instr_table, void * instr_base);
|
||||
void caml_thread_code (code_t code, asize_t len);
|
||||
#endif
|
||||
|
||||
diff --git a/runtime/fix_code.c b/runtime/fix_code.c
|
||||
index aa059be5df..5584019867 100644
|
||||
--- a/runtime/fix_code.c
|
||||
+++ b/runtime/fix_code.c
|
||||
@@ -82,8 +82,14 @@ void caml_fixup_endianness(code_t code, asize_t len)
|
||||
|
||||
#ifdef THREADED_CODE
|
||||
|
||||
-char ** caml_instr_table;
|
||||
-char * caml_instr_base;
|
||||
+static char ** caml_instr_table;
|
||||
+static char * caml_instr_base;
|
||||
+
|
||||
+void caml_init_thread_code(void ** instr_table, void * instr_base)
|
||||
+{
|
||||
+ caml_instr_table = (char **) instr_table;
|
||||
+ caml_instr_base = (char *) instr_base;
|
||||
+}
|
||||
|
||||
static int* opcode_nargs = NULL;
|
||||
int* caml_init_opcode_nargs(void)
|
||||
diff --git a/runtime/interp.c b/runtime/interp.c
|
||||
index a59811c87d..e6700994bc 100644
|
||||
--- a/runtime/interp.c
|
||||
+++ b/runtime/interp.c
|
||||
@@ -50,9 +50,9 @@ sp is a local copy of the global variable Caml_state->extern_sp. */
|
||||
#ifdef THREADED_CODE
|
||||
# define Instruct(name) lbl_##name
|
||||
# if defined(ARCH_SIXTYFOUR) && !defined(ARCH_CODE32)
|
||||
-# define Jumptbl_base ((char *) &&lbl_ACC0)
|
||||
+# define Jumptbl_base &&lbl_ACC0
|
||||
# else
|
||||
-# define Jumptbl_base ((char *) 0)
|
||||
+# define Jumptbl_base 0
|
||||
# define jumptbl_base ((char *) 0)
|
||||
# endif
|
||||
# ifdef DEBUG
|
||||
@@ -249,8 +249,7 @@ value caml_interprete(code_t prog, asize_t prog_size)
|
||||
|
||||
if (prog == NULL) { /* Interpreter is initializing */
|
||||
#ifdef THREADED_CODE
|
||||
- caml_instr_table = (char **) jumptable;
|
||||
- caml_instr_base = Jumptbl_base;
|
||||
+ caml_init_thread_code(jumptable, Jumptbl_base);
|
||||
#endif
|
||||
return Val_unit;
|
||||
}
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
From 7315c73e283eca4313403e959241d86d63f88d58 Mon Sep 17 00:00:00 2001
|
||||
From: Gabriel Scherer <gabriel.scherer@gmail.com>
|
||||
Date: Tue, 5 Jul 2022 09:27:54 +0200
|
||||
Subject: [PATCH 09/24] Merge pull request #11397 from
|
||||
Octachron/tast_mapper_fix_for_with_modtype
|
||||
|
||||
#11387: clean up envs inside Twith_modtype(subst)
|
||||
|
||||
(cherry picked from commit d9afa408c612e74a266b95f0fa25bb1efde72112)
|
||||
---
|
||||
Changes | 3 +++
|
||||
typing/tast_mapper.ml | 6 +++---
|
||||
2 files changed, 6 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index 7ea4475b8d..0fe7732a02 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -18,6 +18,9 @@ OCaml 4.14 maintenance branch
|
||||
This avoids a "dangling pointer" warning of GCC 12.1.
|
||||
(Xavier Leroy, report by Armaël Guéneau, review by Gabriel Scherer)
|
||||
|
||||
+- #11387, module type with constraints no longer crash the compiler in presence
|
||||
+ of both shadowing warnings and the `-bin-annot` compiler flag.
|
||||
+ (Florian Angeletti, report by Christophe Raffalli, review by Gabriel Scherer)
|
||||
|
||||
OCaml 4.14.0 (28 March 2022)
|
||||
----------------------------
|
||||
diff --git a/typing/tast_mapper.ml b/typing/tast_mapper.ml
|
||||
index 6d359a59a7..9eb7f64e88 100644
|
||||
--- a/typing/tast_mapper.ml
|
||||
+++ b/typing/tast_mapper.ml
|
||||
@@ -458,10 +458,10 @@ let module_type sub x =
|
||||
let with_constraint sub = function
|
||||
| Twith_type decl -> Twith_type (sub.type_declaration sub decl)
|
||||
| Twith_typesubst decl -> Twith_typesubst (sub.type_declaration sub decl)
|
||||
+ | Twith_modtype mty -> Twith_modtype (sub.module_type sub mty)
|
||||
+ | Twith_modtypesubst mty -> Twith_modtypesubst (sub.module_type sub mty)
|
||||
| Twith_module _
|
||||
- | Twith_modsubst _
|
||||
- | Twith_modtype _
|
||||
- | Twith_modtypesubst _ as d -> d
|
||||
+ | Twith_modsubst _ as d -> d
|
||||
|
||||
let open_description sub od =
|
||||
{od with open_env = sub.env sub od.open_env}
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,85 +0,0 @@
|
|||
From 9f72a2a2fec0902aeae5e5082779bb197657c1f4 Mon Sep 17 00:00:00 2001
|
||||
From: Gabriel Scherer <gabriel.scherer@gmail.com>
|
||||
Date: Tue, 5 Jul 2022 10:38:50 +0200
|
||||
Subject: [PATCH 10/24] Merge pull request #11396 from gasche/fix11392
|
||||
|
||||
Fix 11392 (assertion failure on external with -rectypes)
|
||||
|
||||
(cherry picked from commit 724cefb8b0f1f96ef5181fffc24975ac9460ce3e)
|
||||
---
|
||||
Changes | 3 ++
|
||||
testsuite/tests/typing-external/pr11392.ml | 34 ++++++++++++++++++++++
|
||||
typing/typedecl.ml | 2 +-
|
||||
3 files changed, 38 insertions(+), 1 deletion(-)
|
||||
create mode 100644 testsuite/tests/typing-external/pr11392.ml
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index 0fe7732a02..8182f5ced7 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -22,6 +22,9 @@ OCaml 4.14 maintenance branch
|
||||
of both shadowing warnings and the `-bin-annot` compiler flag.
|
||||
(Florian Angeletti, report by Christophe Raffalli, review by Gabriel Scherer)
|
||||
|
||||
+- #11392, #11392: assertion failure with -rectypes and external definitions
|
||||
+ (Gabriel Scherer, review by Florian Angeletti, report by Dmitrii Kosarev)
|
||||
+
|
||||
OCaml 4.14.0 (28 March 2022)
|
||||
----------------------------
|
||||
|
||||
diff --git a/testsuite/tests/typing-external/pr11392.ml b/testsuite/tests/typing-external/pr11392.ml
|
||||
new file mode 100644
|
||||
index 0000000000..91c8ea77eb
|
||||
--- /dev/null
|
||||
+++ b/testsuite/tests/typing-external/pr11392.ml
|
||||
@@ -0,0 +1,34 @@
|
||||
+(* TEST
|
||||
+ * expect
|
||||
+*)
|
||||
+
|
||||
+type 'self nat =
|
||||
+ | Z
|
||||
+ | S of 'self
|
||||
+;;
|
||||
+[%%expect{|
|
||||
+type 'self nat = Z | S of 'self
|
||||
+|}]
|
||||
+
|
||||
+
|
||||
+
|
||||
+(* without rectypes: rejected *)
|
||||
+external cast : int -> 'self nat as 'self = "%identity"
|
||||
+;;
|
||||
+[%%expect{|
|
||||
+Line 1, characters 16-41:
|
||||
+1 | external cast : int -> 'self nat as 'self = "%identity"
|
||||
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
+Error: This alias is bound to type int -> 'a nat
|
||||
+ but is used as an instance of type 'a
|
||||
+ The type variable 'a occurs inside int -> 'a nat
|
||||
+|}]
|
||||
+
|
||||
+#rectypes;;
|
||||
+
|
||||
+(* with rectypes: accepted (used to crash) *)
|
||||
+external cast : int -> 'self nat as 'self = "%identity"
|
||||
+;;
|
||||
+[%%expect{|
|
||||
+external cast : int -> 'a nat as 'a = "%identity"
|
||||
+|}]
|
||||
diff --git a/typing/typedecl.ml b/typing/typedecl.ml
|
||||
index 9d38ebe97e..d00c0fc450 100644
|
||||
--- a/typing/typedecl.ml
|
||||
+++ b/typing/typedecl.ml
|
||||
@@ -1334,7 +1334,7 @@ let rec parse_native_repr_attributes env core_type ty ~global_repr =
|
||||
parse_native_repr_attributes env ct2 t2 ~global_repr
|
||||
in
|
||||
(repr_arg :: repr_args, repr_res)
|
||||
- | Ptyp_poly (_, t), _, _ ->
|
||||
+ | (Ptyp_poly (_, t) | Ptyp_alias (t, _)), _, _ ->
|
||||
parse_native_repr_attributes env t ty ~global_repr
|
||||
| Ptyp_arrow _, _, _ | _, Tarrow _, _ -> assert false
|
||||
| _ -> ([], make_native_repr env core_type ty ~global_repr)
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
From 9d4faca7af8d9849093ff8d36509ad60608ac239 Mon Sep 17 00:00:00 2001
|
||||
From: Xavier Leroy <xavierleroy@users.noreply.github.com>
|
||||
Date: Thu, 7 Jul 2022 18:22:22 +0200
|
||||
Subject: [PATCH 11/24] Document limitation on `caml_callbackN` (#11409)
|
||||
|
||||
The `args` argument array must not be declared with `CAMLlocalN`, otherwise
|
||||
the array can be registered a second time by `caml_callbackN`, confusing
|
||||
the compactor.
|
||||
|
||||
Also: suggests using a C99 compound literal, it looks good and avoids the issue.
|
||||
|
||||
Fixes: #11045
|
||||
---
|
||||
Changes | 7 +++++++
|
||||
manual/src/cmds/intf-c.etex | 4 ++++
|
||||
2 files changed, 11 insertions(+)
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index 8182f5ced7..13eb7fef98 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -25,6 +25,13 @@ OCaml 4.14 maintenance branch
|
||||
- #11392, #11392: assertion failure with -rectypes and external definitions
|
||||
(Gabriel Scherer, review by Florian Angeletti, report by Dmitrii Kosarev)
|
||||
|
||||
+### Manual and documentation:
|
||||
+
|
||||
+- #11045, #11409: document that the array argument to `caml_callbackN`
|
||||
+ must not have been declared by `CAMLlocalN`.
|
||||
+ (Xavier Leroy, report by Stephen Dolan, review by Gabriel Scherer.)
|
||||
+
|
||||
+
|
||||
OCaml 4.14.0 (28 March 2022)
|
||||
----------------------------
|
||||
|
||||
diff --git a/manual/src/cmds/intf-c.etex b/manual/src/cmds/intf-c.etex
|
||||
index 7cd50a1372..bb420c2940 100644
|
||||
--- a/manual/src/cmds/intf-c.etex
|
||||
+++ b/manual/src/cmds/intf-c.etex
|
||||
@@ -1449,6 +1449,10 @@ the value \var{a} and returns the value returned by~\var{f}.
|
||||
(a curried OCaml function with three arguments) to \var{a}, \var{b} and \var{c}.
|
||||
\item "caml_callbackN("\var{f, n, args}")" applies the functional value \var{f}
|
||||
to the \var{n} arguments contained in the C array of values \var{args}.
|
||||
+The array \var{args} must \emph{not} be declared with "CAMLlocalN".
|
||||
+It should be declared as "value "\var{args}"["\var{n}"];".
|
||||
+Alternatively, a C99 compound literal can be used:
|
||||
+"caml_callbackN("\var{f, n, }"(value[]){"\nth{arg}{1}, \ldots, \nth{arg}{n}"})".
|
||||
\end{itemize}
|
||||
If the function \var{f} does not return, but raises an exception that
|
||||
escapes the scope of the application, then this exception is
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,327 +0,0 @@
|
|||
From 50fbd6685ec88f1dc81451923d7c80fb0d18ca8b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?S=C3=A9bastien=20Hinderer?= <Sebastien.Hinderer@inria.fr>
|
||||
Date: Thu, 14 Apr 2022 19:19:46 +0200
|
||||
Subject: [PATCH 12/24] Stop calling ranlib on created / installed libraries
|
||||
(#11184)
|
||||
|
||||
`ranlib` seems unnecessary if a POSIX-compliant `ar` is used and time stamps are preserved when a `.a` file is installed.
|
||||
|
||||
(cherry picked from commit c8e41bade529998c4e66975c88fabf3ac47d7078)
|
||||
---
|
||||
Changes | 5 +++++
|
||||
INSTALL.adoc | 4 ++--
|
||||
Makefile | 2 --
|
||||
Makefile.build_config.in | 2 +-
|
||||
Makefile.config.in | 4 ----
|
||||
configure | Bin 581827 -> 581549 bytes
|
||||
configure.ac | 16 +++-------------
|
||||
otherlibs/Makefile.otherlibs.common | 2 --
|
||||
otherlibs/dynlink/Makefile | 11 +++++------
|
||||
otherlibs/systhreads/Makefile | 3 ---
|
||||
stdlib/Makefile | 1 -
|
||||
tools/ocamlmklib.ml | 6 ++----
|
||||
utils/Makefile | 1 -
|
||||
utils/ccomp.ml | 8 ++------
|
||||
utils/config.mli | 3 ---
|
||||
utils/config.mlp | 2 --
|
||||
16 files changed, 20 insertions(+), 50 deletions(-)
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index 13eb7fef98..6f92ee9965 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -25,6 +25,11 @@ OCaml 4.14 maintenance branch
|
||||
- #11392, #11392: assertion failure with -rectypes and external definitions
|
||||
(Gabriel Scherer, review by Florian Angeletti, report by Dmitrii Kosarev)
|
||||
|
||||
+### Compiler user-interface and warnings:
|
||||
+
|
||||
+- #11184: Stop calling ranlib on created / installed libraries
|
||||
+ (Sébastien Hinderer, review by Xavier Leroy)
|
||||
+
|
||||
### Manual and documentation:
|
||||
|
||||
- #11045, #11409: document that the array argument to `caml_callbackN`
|
||||
diff --git a/INSTALL.adoc b/INSTALL.adoc
|
||||
index f4199ca49a..08d67ebbbe 100644
|
||||
--- a/INSTALL.adoc
|
||||
+++ b/INSTALL.adoc
|
||||
@@ -43,8 +43,8 @@
|
||||
* Under Cygwin, the `gcc-core` package is required. `flexdll` is also necessary
|
||||
for shared library support.
|
||||
|
||||
-* Binutils including `ar`, `ranlib`, and `strip` are required if your
|
||||
- distribution does not already provide them with the C compiler.
|
||||
+* Binutils including `ar` and `strip` are required if your distribution
|
||||
+ does not already provide them with the C compiler.
|
||||
|
||||
== Configuration
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 3c74bc79df..0e92785da2 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -585,8 +585,6 @@ endif
|
||||
ifeq "$(INSTALL_OCAMLNAT)" "true"
|
||||
$(INSTALL_PROG) ocamlnat$(EXE) "$(INSTALL_BINDIR)"
|
||||
endif
|
||||
- cd "$(INSTALL_COMPLIBDIR)" && \
|
||||
- $(RANLIB) ocamlcommon.$(A) ocamlbytecomp.$(A) ocamloptcomp.$(A)
|
||||
|
||||
# Installation of the *.ml sources of compiler-libs
|
||||
.PHONY: install-compiler-sources
|
||||
diff --git a/Makefile.build_config.in b/Makefile.build_config.in
|
||||
index eeac09dd76..4d6705d252 100644
|
||||
--- a/Makefile.build_config.in
|
||||
+++ b/Makefile.build_config.in
|
||||
@@ -20,7 +20,7 @@
|
||||
# $(ROOTDIR) has been defined.
|
||||
|
||||
include $(ROOTDIR)/Makefile.config
|
||||
-INSTALL ?= @INSTALL@
|
||||
+INSTALL ?= @INSTALL@ -p
|
||||
INSTALL_DATA ?= @INSTALL_DATA@
|
||||
INSTALL_PROG ?= @INSTALL_PROGRAM@
|
||||
|
||||
diff --git a/Makefile.config.in b/Makefile.config.in
|
||||
index eb3d85eb1d..4badb74c3f 100644
|
||||
--- a/Makefile.config.in
|
||||
+++ b/Makefile.config.in
|
||||
@@ -88,10 +88,6 @@ LDFLAGS?=@LDFLAGS@
|
||||
### How to invoke the C preprocessor through the C compiler
|
||||
CPP=@CPP@
|
||||
|
||||
-### How to invoke ranlib
|
||||
-RANLIB=@RANLIB@
|
||||
-RANLIBCMD=@RANLIBCMD@
|
||||
-
|
||||
### How to invoke ar
|
||||
ARCMD=@AR@
|
||||
|
||||
diff --git a/configure b/configure
|
||||
index 8a2c007fd221bc897a255b4aa80c7f23710fcb10..73ce66bfa0a3de5e886a88c973b2db288b5e4d03 100755
|
||||
GIT binary patch
|
||||
delta 91
|
||||
zcmX?nP<ics<qdoN*n%AWd_0{t@9~pl+59Z%$Itc$K8!%j1jNih%(DG~59<!M=|*j=
|
||||
q!qe@iu=Y&nn98a>-EJyt==60{S#P(`nZ^plY(UJuea<uvbuR!x+b0D8
|
||||
|
||||
delta 343
|
||||
zcmZ3xU-|Gs<qdoNHXremU=av%^z-p_a`tuMg0ME<4*L1C{gMwO5HkTWGZ3?EzvRQZ
|
||||
z%gt0-!L_2KC^5MtGcR2sGcPT_C^xYrGe1uuttdZNAty7bBtJh#y;vbRKQApay|f4{
|
||||
zIlXW-lc=kLwL(coYMz1>mx2P^N?Ror2wRCOHK#ZgE(H{K3{og6R<cG`tHd?E;VQet
|
||||
z^!bxndn_ROY*jQu{QZ3bf?VA+ixTsIE&!ULjHC%ee!AKeRs(K@#Jm&*h=%E5Q&>YK
|
||||
zU>4b?CTHZsIKV)ezG4dNJs|}(H3gMwh?TVpF)A8{?X6Q;ftU@5*|)b&<<Rf~05Vo_
|
||||
ARR910
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 2f4ebf9b30..13d6d1a326 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -119,8 +119,6 @@ AC_SUBST([bootstrapping_flexdll])
|
||||
AC_SUBST([long_shebang])
|
||||
AC_SUBST([shebangscripts])
|
||||
AC_SUBST([AR])
|
||||
-AC_SUBST([RANLIB])
|
||||
-AC_SUBST([RANLIBCMD])
|
||||
AC_SUBST([mklib])
|
||||
AC_SUBST([supports_shared_libraries])
|
||||
AC_SUBST([natdynlink])
|
||||
@@ -474,32 +472,24 @@ AS_CASE([$enable_dependency_generation],
|
||||
[compute_deps=true])],
|
||||
[compute_deps=false])])
|
||||
|
||||
-# Extracting information from libtool's configuration
|
||||
-AS_IF([test -n "$RANLIB" ],
|
||||
- [RANLIBCMD="$RANLIB"],
|
||||
- [RANLIB="$AR rs"; RANLIBCMD=""]
|
||||
-)
|
||||
-
|
||||
AS_CASE([$host],
|
||||
# In config/Makefile.mingw*, we had:
|
||||
# TARGET=i686-w64-mingw32 and x86_64-w64-mingw32
|
||||
# TOOLPREF=$(TARGET)-
|
||||
# ARCMD=$(TOOLPREF)ar
|
||||
- # RANLIB=$(TOOLPREF)ranlib
|
||||
- # RANLIBCMD=$(TOOLPREF)ranlib
|
||||
- # However autoconf and libtool seem to use ar and ranlib
|
||||
+ # However autoconf and libtool seem to use ar
|
||||
# So we let them do, at the moment
|
||||
[*-pc-windows],
|
||||
[
|
||||
libext=lib
|
||||
- AR=""; RANLIB=echo; RANLIBCMD=""
|
||||
+ AR=""
|
||||
AS_IF([test "$host_cpu" = "x86_64" ],
|
||||
[machine="-machine:AMD64 "],
|
||||
[machine=""])
|
||||
mklib="link -lib -nologo $machine /out:\$(1) \$(2)"
|
||||
],
|
||||
[
|
||||
- mklib="rm -f \$(1) && ${AR} rc \$(1) \$(2) && ${RANLIB} \$(1)"
|
||||
+ mklib="rm -f \$(1) && ${AR} rc \$(1) \$(2)"
|
||||
])
|
||||
|
||||
## Find vendor of the C compiler
|
||||
diff --git a/otherlibs/Makefile.otherlibs.common b/otherlibs/Makefile.otherlibs.common
|
||||
index 95ff4d58fe..17c8e2dfd7 100644
|
||||
--- a/otherlibs/Makefile.otherlibs.common
|
||||
+++ b/otherlibs/Makefile.otherlibs.common
|
||||
@@ -95,7 +95,6 @@ install::
|
||||
fi
|
||||
ifneq "$(STUBSLIB)" ""
|
||||
$(INSTALL_DATA) $(STUBSLIB) "$(INSTALL_LIBDIR)/"
|
||||
- cd "$(INSTALL_LIBDIR)"; $(RANLIB) lib$(CLIBNAME).$(A)
|
||||
endif
|
||||
|
||||
$(INSTALL_DATA) \
|
||||
@@ -115,7 +114,6 @@ installopt:
|
||||
$(INSTALL_DATA) \
|
||||
$(CAMLOBJS_NAT) $(LIBNAME).cmxa $(LIBNAME).$(A) \
|
||||
"$(INSTALL_LIBDIR)/"
|
||||
- cd "$(INSTALL_LIBDIR)"; $(RANLIB) $(LIBNAME).a
|
||||
if test -f $(LIBNAME).cmxs; then \
|
||||
$(INSTALL_PROG) $(LIBNAME).cmxs "$(INSTALL_LIBDIR)"; \
|
||||
fi
|
||||
diff --git a/otherlibs/dynlink/Makefile b/otherlibs/dynlink/Makefile
|
||||
index 6b02dc1979..c21bf573da 100644
|
||||
--- a/otherlibs/dynlink/Makefile
|
||||
+++ b/otherlibs/dynlink/Makefile
|
||||
@@ -249,12 +249,11 @@ ifeq "$(INSTALL_SOURCE_ARTIFACTS)" "true"
|
||||
endif
|
||||
|
||||
installopt:
|
||||
- if $(NATDYNLINK); then \
|
||||
- $(INSTALL_DATA) \
|
||||
- $(NATOBJS) dynlink.cmxa dynlink.$(A) \
|
||||
- "$(INSTALL_LIBDIR)" && \
|
||||
- cd "$(INSTALL_LIBDIR)" && $(RANLIB) dynlink.$(A); \
|
||||
- fi
|
||||
+ifeq "$(strip $(NATDYNLINK))" "true"
|
||||
+ $(INSTALL_DATA) \
|
||||
+ $(NATOBJS) dynlink.cmxa dynlink.$(A) \
|
||||
+ "$(INSTALL_LIBDIR)"
|
||||
+endif
|
||||
|
||||
partialclean:
|
||||
rm -f $(extract_crc) *.cm[ioaxt] *.cmti *.cmxa \
|
||||
diff --git a/otherlibs/systhreads/Makefile b/otherlibs/systhreads/Makefile
|
||||
index 8fc1bdb926..640a7666a8 100644
|
||||
--- a/otherlibs/systhreads/Makefile
|
||||
+++ b/otherlibs/systhreads/Makefile
|
||||
@@ -121,7 +121,6 @@ install:
|
||||
$(INSTALL_PROG) dllthreads$(EXT_DLL) "$(INSTALL_STUBLIBDIR)"; \
|
||||
fi
|
||||
$(INSTALL_DATA) libthreads.$(A) "$(INSTALL_LIBDIR)"
|
||||
- cd "$(INSTALL_LIBDIR)"; $(RANLIB) libthreads.$(A)
|
||||
mkdir -p "$(INSTALL_THREADSLIBDIR)"
|
||||
$(INSTALL_DATA) \
|
||||
$(CMIFILES) threads.cma \
|
||||
@@ -136,11 +135,9 @@ endif
|
||||
|
||||
installopt:
|
||||
$(INSTALL_DATA) libthreadsnat.$(A) "$(INSTALL_LIBDIR)"
|
||||
- cd "$(INSTALL_LIBDIR)"; $(RANLIB) libthreadsnat.$(A)
|
||||
$(INSTALL_DATA) \
|
||||
$(THREADS_NCOBJS) threads.cmxa threads.$(A) \
|
||||
"$(INSTALL_THREADSLIBDIR)"
|
||||
- cd "$(INSTALL_THREADSLIBDIR)" && $(RANLIB) threads.$(A)
|
||||
|
||||
%.cmi: %.mli
|
||||
$(CAMLC) -c $(COMPFLAGS) $<
|
||||
diff --git a/stdlib/Makefile b/stdlib/Makefile
|
||||
index df34bc2d49..f367956fbd 100644
|
||||
--- a/stdlib/Makefile
|
||||
+++ b/stdlib/Makefile
|
||||
@@ -105,7 +105,6 @@ installopt-default::
|
||||
$(INSTALL_DATA) \
|
||||
stdlib.cmxa stdlib.$(A) std_exit.$(O) *.cmx \
|
||||
"$(INSTALL_LIBDIR)"
|
||||
- cd "$(INSTALL_LIBDIR)"; $(RANLIB) stdlib.$(A)
|
||||
|
||||
ifeq "$(UNIX_OR_WIN32)" "unix"
|
||||
HEADERPROGRAM = header
|
||||
diff --git a/tools/ocamlmklib.ml b/tools/ocamlmklib.ml
|
||||
index 0ca7b80f3b..48f636bc10 100644
|
||||
--- a/tools/ocamlmklib.ml
|
||||
+++ b/tools/ocamlmklib.ml
|
||||
@@ -25,10 +25,8 @@ let mklib out files opts =
|
||||
then "-machine:AMD64 "
|
||||
else ""
|
||||
in
|
||||
- Printf.sprintf "link -lib -nologo %s-out:%s %s %s"
|
||||
- machine out opts files
|
||||
- else Printf.sprintf "%s rcs %s %s %s && %s %s"
|
||||
- Config.ar out opts files Config.ranlib out
|
||||
+ Printf.sprintf "link -lib -nologo %s-out:%s %s %s" machine out opts files
|
||||
+ else Printf.sprintf "%s rc %s %s %s" Config.ar out opts files
|
||||
|
||||
(* PR#4783: under Windows, don't use absolute paths because we do
|
||||
not know where the binary distribution will be installed. *)
|
||||
diff --git a/utils/Makefile b/utils/Makefile
|
||||
index 7231fae28e..de923900f1 100644
|
||||
--- a/utils/Makefile
|
||||
+++ b/utils/Makefile
|
||||
@@ -73,7 +73,6 @@ config.ml: config.mlp $(ROOTDIR)/Makefile.config Makefile
|
||||
$(call SUBST_STRING,OCAMLOPT_CPPFLAGS) \
|
||||
$(call SUBST_STRING,PACKLD) \
|
||||
$(call SUBST,PROFINFO_WIDTH) \
|
||||
- $(call SUBST_STRING,RANLIBCMD) \
|
||||
$(call SUBST_STRING,RPATH) \
|
||||
$(call SUBST_STRING,MKSHAREDLIBRPATH) \
|
||||
$(call SUBST,FORCE_SAFE_STRING) \
|
||||
diff --git a/utils/ccomp.ml b/utils/ccomp.ml
|
||||
index 955968d1cd..d23c3f2baa 100644
|
||||
--- a/utils/ccomp.ml
|
||||
+++ b/utils/ccomp.ml
|
||||
@@ -140,12 +140,8 @@ let create_archive archive file_list =
|
||||
quoted_archive (quote_files file_list))
|
||||
| _ ->
|
||||
assert(String.length Config.ar > 0);
|
||||
- let r1 =
|
||||
- command(Printf.sprintf "%s rc %s %s"
|
||||
- Config.ar quoted_archive (quote_files file_list)) in
|
||||
- if r1 <> 0 || String.length Config.ranlib = 0
|
||||
- then r1
|
||||
- else command(Config.ranlib ^ " " ^ quoted_archive)
|
||||
+ command(Printf.sprintf "%s rc %s %s"
|
||||
+ Config.ar quoted_archive (quote_files file_list))
|
||||
|
||||
let expand_libname cclibs =
|
||||
cclibs |> List.map (fun cclib ->
|
||||
diff --git a/utils/config.mli b/utils/config.mli
|
||||
index 7f70a52d52..94dee3cb92 100644
|
||||
--- a/utils/config.mli
|
||||
+++ b/utils/config.mli
|
||||
@@ -82,9 +82,6 @@ val mkexe: string
|
||||
val mkmaindll: string
|
||||
(** The linker command line to build main programs as dlls. *)
|
||||
|
||||
-val ranlib: string
|
||||
-(** Command to randomize a library, or "" if not needed *)
|
||||
-
|
||||
val default_rpath: string
|
||||
(** Option to add a directory to be searched for libraries at runtime
|
||||
(used by ocamlmklib) *)
|
||||
diff --git a/utils/config.mlp b/utils/config.mlp
|
||||
index 44c6ff8fa5..f758a9b483 100644
|
||||
--- a/utils/config.mlp
|
||||
+++ b/utils/config.mlp
|
||||
@@ -54,7 +54,6 @@ let native_c_compiler =
|
||||
c_compiler ^ " " ^ ocamlopt_cflags ^ " " ^ ocamlopt_cppflags
|
||||
let native_c_libraries = "%%NATIVECCLIBS%%"
|
||||
let native_pack_linker = "%%PACKLD%%"
|
||||
-let ranlib = "%%RANLIBCMD%%"
|
||||
let default_rpath = "%%RPATH%%"
|
||||
let mksharedlibrpath = "%%MKSHAREDLIBRPATH%%"
|
||||
let ar = "%%ARCMD%%"
|
||||
@@ -177,7 +176,6 @@ let configuration_variables =
|
||||
p "bytecomp_c_libraries" bytecomp_c_libraries;
|
||||
p "native_c_libraries" native_c_libraries;
|
||||
p "native_pack_linker" native_pack_linker;
|
||||
- p "ranlib" ranlib;
|
||||
p "architecture" architecture;
|
||||
p "model" model;
|
||||
p_int "int_size" Sys.int_size;
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
From c04f2fbb3ae4dc8f67882bfe35d8565f016dee0f Mon Sep 17 00:00:00 2001
|
||||
From: Xavier Leroy <xavier.leroy@college-de-france.fr>
|
||||
Date: Fri, 15 Jul 2022 14:23:10 +0200
|
||||
Subject: [PATCH 13/24] tests/lib-bigarray-2/has-gfortran.sh: don't print
|
||||
anything on stdout
|
||||
|
||||
It confuses the summarize.awk script.
|
||||
---
|
||||
testsuite/tests/lib-bigarray-2/has-gfortran.sh | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/testsuite/tests/lib-bigarray-2/has-gfortran.sh b/testsuite/tests/lib-bigarray-2/has-gfortran.sh
|
||||
index 051122113a..7eef1e662e 100644
|
||||
--- a/testsuite/tests/lib-bigarray-2/has-gfortran.sh
|
||||
+++ b/testsuite/tests/lib-bigarray-2/has-gfortran.sh
|
||||
@@ -5,7 +5,7 @@ if ! which gfortran > /dev/null 2>&1; then
|
||||
elif ! grep -q '^CC=gcc' ${ocamlsrcdir}/Makefile.config; then
|
||||
echo "OCaml was not compiled with gcc" > ${ocamltest_response}
|
||||
test_result=${TEST_SKIP}
|
||||
-elif gcc --version 2>&1 | grep 'Apple clang version'; then
|
||||
+elif gcc --version 2>&1 | grep -q 'Apple clang version'; then
|
||||
echo "OCaml was not compiled with gcc" > ${ocamltest_response}
|
||||
test_result=${TEST_SKIP}
|
||||
else
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,147 +0,0 @@
|
|||
From 4bb84be29e2ea5eb9f979c5e3bcbde1933aa300e Mon Sep 17 00:00:00 2001
|
||||
From: Florian Angeletti <florian.angeletti@inria.fr>
|
||||
Date: Mon, 18 Jul 2022 10:08:53 +0200
|
||||
Subject: [PATCH 14/24] Merge pull request #11417 from
|
||||
lpw25/fix-virtual-class-type-constrs
|
||||
|
||||
Fix regression allowing virtual methods in non-virtual classes
|
||||
|
||||
(cherry picked from commit 4be851ed8ea1f0c6be13dce04dcc97493c6c004b)
|
||||
---
|
||||
Changes | 13 +-----
|
||||
testsuite/tests/typing-objects/Tests.ml | 61 +++++++++++++++++++++++++
|
||||
typing/typeclass.ml | 11 +++++
|
||||
3 files changed, 74 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index 6f92ee9965..a9a9ee92f4 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -25,17 +25,8 @@ OCaml 4.14 maintenance branch
|
||||
- #11392, #11392: assertion failure with -rectypes and external definitions
|
||||
(Gabriel Scherer, review by Florian Angeletti, report by Dmitrii Kosarev)
|
||||
|
||||
-### Compiler user-interface and warnings:
|
||||
-
|
||||
-- #11184: Stop calling ranlib on created / installed libraries
|
||||
- (Sébastien Hinderer, review by Xavier Leroy)
|
||||
-
|
||||
-### Manual and documentation:
|
||||
-
|
||||
-- #11045, #11409: document that the array argument to `caml_callbackN`
|
||||
- must not have been declared by `CAMLlocalN`.
|
||||
- (Xavier Leroy, report by Stephen Dolan, review by Gabriel Scherer.)
|
||||
-
|
||||
+- #11417: Fix regression allowing virtual methods in non-virtual classes.
|
||||
+ (Leo White, review by Florian Angeletti)
|
||||
|
||||
OCaml 4.14.0 (28 March 2022)
|
||||
----------------------------
|
||||
diff --git a/testsuite/tests/typing-objects/Tests.ml b/testsuite/tests/typing-objects/Tests.ml
|
||||
index 3dcd87c43c..9cab28e432 100644
|
||||
--- a/testsuite/tests/typing-objects/Tests.ml
|
||||
+++ b/testsuite/tests/typing-objects/Tests.ml
|
||||
@@ -1344,3 +1344,64 @@ let _ = (new foo)#f true
|
||||
class foo : object method f : bool -> bool end
|
||||
- : bool = true
|
||||
|}];;
|
||||
+
|
||||
+
|
||||
+class c : object
|
||||
+ method virtual m : int
|
||||
+end = object
|
||||
+ method m = 9
|
||||
+ end
|
||||
+[%%expect {|
|
||||
+Lines 1-3, characters 10-3:
|
||||
+1 | ..........object
|
||||
+2 | method virtual m : int
|
||||
+3 | end.........
|
||||
+Error: This non-virtual class type has virtual methods.
|
||||
+ The following methods are virtual : m
|
||||
+|}];;
|
||||
+
|
||||
+class virtual c : object
|
||||
+ method virtual m : int
|
||||
+end = object
|
||||
+ method m = 42
|
||||
+ end
|
||||
+[%%expect {|
|
||||
+class virtual c : object method virtual m : int end
|
||||
+|}];;
|
||||
+
|
||||
+class virtual cv = object
|
||||
+ method virtual m : int
|
||||
+ end
|
||||
+
|
||||
+class c : cv = object
|
||||
+ method m = 42
|
||||
+ end
|
||||
+[%%expect {|
|
||||
+class virtual cv : object method virtual m : int end
|
||||
+Line 5, characters 10-12:
|
||||
+5 | class c : cv = object
|
||||
+ ^^
|
||||
+Error: This non-virtual class type has virtual methods.
|
||||
+ The following methods are virtual : m
|
||||
+|}];;
|
||||
+
|
||||
+class virtual c : cv = object
|
||||
+ method m = 41
|
||||
+ end
|
||||
+[%%expect {|
|
||||
+class virtual c : cv
|
||||
+|}];;
|
||||
+
|
||||
+class c = cv
|
||||
+[%%expect {|
|
||||
+Line 1, characters 10-12:
|
||||
+1 | class c = cv
|
||||
+ ^^
|
||||
+Error: This non-virtual class has virtual methods.
|
||||
+ The following methods are virtual : m
|
||||
+|}];;
|
||||
+
|
||||
+class virtual c = cv
|
||||
+[%%expect {|
|
||||
+class virtual c : cv
|
||||
+|}];;
|
||||
diff --git a/typing/typeclass.ml b/typing/typeclass.ml
|
||||
index fedbc0e025..8fa8523cc9 100644
|
||||
--- a/typing/typeclass.ml
|
||||
+++ b/typing/typeclass.ml
|
||||
@@ -177,6 +177,13 @@ let check_virtual loc env virt kind sign =
|
||||
| meths, vars ->
|
||||
raise(Error(loc, env, Virtual_class(kind, meths, vars)))
|
||||
|
||||
+let rec check_virtual_clty loc env virt kind clty =
|
||||
+ match clty with
|
||||
+ | Cty_constr(_, _, clty) | Cty_arrow(_, _, clty) ->
|
||||
+ check_virtual_clty loc env virt kind clty
|
||||
+ | Cty_signature sign ->
|
||||
+ check_virtual loc env virt kind sign
|
||||
+
|
||||
(* Return the constructor type associated to a class type *)
|
||||
let rec constructor_type constr cty =
|
||||
match cty with
|
||||
@@ -398,6 +405,8 @@ and class_type_aux env virt self_scope scty =
|
||||
) styl params
|
||||
in
|
||||
let typ = Cty_constr (path, params, clty) in
|
||||
+ (* Check for unexpected virtual methods *)
|
||||
+ check_virtual_clty scty.pcty_loc env virt Class_type typ;
|
||||
cltyp (Tcty_constr ( path, lid , ctys)) typ
|
||||
|
||||
| Pcty_signature pcsig ->
|
||||
@@ -1077,6 +1086,8 @@ and class_expr_aux cl_num val_env met_env virt self_scope scl =
|
||||
try Ctype.unify val_env ty' ty with Ctype.Unify err ->
|
||||
raise(Error(cty'.ctyp_loc, val_env, Parameter_mismatch err)))
|
||||
tyl params;
|
||||
+ (* Check for unexpected virtual methods *)
|
||||
+ check_virtual_clty scl.pcl_loc val_env virt Class clty';
|
||||
let cl =
|
||||
rc {cl_desc = Tcl_ident (path, lid, tyl);
|
||||
cl_loc = scl.pcl_loc;
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,154 +0,0 @@
|
|||
From 54eef17aeecfdbc6eeecd60b9cc64cd7c0129429 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Angeletti <florian.angeletti@inria.fr>
|
||||
Date: Wed, 20 Jul 2022 10:58:18 +0200
|
||||
Subject: [PATCH 15/24] Do not elide the whole module type error message
|
||||
(#11416)
|
||||
|
||||
(cherry picked from commit 8218be9e2b24907b8558776a34d12032bcc42496)
|
||||
---
|
||||
Changes | 5 +-
|
||||
.../inclusion_errors_elision.ml | 93 +++++++++++++++++++
|
||||
typing/includemod_errorprinter.ml | 11 ++-
|
||||
3 files changed, 107 insertions(+), 2 deletions(-)
|
||||
create mode 100644 testsuite/tests/typing-modules/inclusion_errors_elision.ml
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index a9a9ee92f4..6b9855f707 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -14,7 +14,10 @@ OCaml 4.14 maintenance branch
|
||||
(David Allsopp and Nicolás Ojeda Bär, review by Nicolás Ojeda Bär and
|
||||
Sebastien Hinderer)
|
||||
|
||||
-- #11358, #11378: Refactor the initialization of bytecode threading.
|
||||
+- #11314, #11416: fix non-informative error message for module inclusion
|
||||
+ (Florian Angeletti, report by Thierry Martinez, review by Gabriel Scherer)
|
||||
+
|
||||
+- #11358, #11379: Refactor the initialization of bytecode threading,
|
||||
This avoids a "dangling pointer" warning of GCC 12.1.
|
||||
(Xavier Leroy, report by Armaël Guéneau, review by Gabriel Scherer)
|
||||
|
||||
diff --git a/testsuite/tests/typing-modules/inclusion_errors_elision.ml b/testsuite/tests/typing-modules/inclusion_errors_elision.ml
|
||||
new file mode 100644
|
||||
index 0000000000..3dbd0e67ff
|
||||
--- /dev/null
|
||||
+++ b/testsuite/tests/typing-modules/inclusion_errors_elision.ml
|
||||
@@ -0,0 +1,93 @@
|
||||
+(* TEST
|
||||
+ flags ="-keep-original-error-size"
|
||||
+ * expect
|
||||
+ *)
|
||||
+
|
||||
+
|
||||
+module A = struct
|
||||
+ type a and b and c and d
|
||||
+end
|
||||
+
|
||||
+module type S = sig
|
||||
+ module B = A
|
||||
+end
|
||||
+
|
||||
+module C : S = struct
|
||||
+ module B = struct
|
||||
+ type a and b and c and d and e and f and g and h
|
||||
+ end
|
||||
+end
|
||||
+[%%expect {|
|
||||
+module A : sig type a and b and c and d end
|
||||
+module type S = sig module B = A end
|
||||
+Lines 9-13, characters 15-3:
|
||||
+ 9 | ...............struct
|
||||
+10 | module B = struct
|
||||
+11 | type a and b and c and d and e and f and g and h
|
||||
+12 | end
|
||||
+13 | end
|
||||
+Error: Signature mismatch:
|
||||
+ ...
|
||||
+ In module B:
|
||||
+ Modules do not match:
|
||||
+ sig
|
||||
+ type a = B.a
|
||||
+ and b = B.b
|
||||
+ and c = B.c
|
||||
+ and d = B.d
|
||||
+ and e = B.e
|
||||
+ and f = B.f
|
||||
+ and g = B.g
|
||||
+ and h = B.h
|
||||
+ end
|
||||
+ is not included in
|
||||
+ (module A)
|
||||
+|}]
|
||||
+
|
||||
+module A = struct
|
||||
+ type a and b and c and d
|
||||
+end
|
||||
+
|
||||
+module type S = sig
|
||||
+ module type B = sig
|
||||
+ module C = A
|
||||
+ end
|
||||
+end
|
||||
+
|
||||
+module D : S = struct
|
||||
+ module type B = sig
|
||||
+ module C: sig
|
||||
+ type a and b and c and d and e and f and g and h
|
||||
+ end
|
||||
+ end
|
||||
+end
|
||||
+[%%expect{|
|
||||
+module A : sig type a and b and c and d end
|
||||
+module type S = sig module type B = sig module C = A end end
|
||||
+Lines 11-17, characters 15-3:
|
||||
+11 | ...............struct
|
||||
+12 | module type B = sig
|
||||
+13 | module C: sig
|
||||
+14 | type a and b and c and d and e and f and g and h
|
||||
+15 | end
|
||||
+16 | end
|
||||
+17 | end
|
||||
+Error: Signature mismatch:
|
||||
+ ...
|
||||
+ ...
|
||||
+ ...
|
||||
+ At position module type B = sig module C : <here> end
|
||||
+ Modules do not match:
|
||||
+ sig
|
||||
+ type a = C.a
|
||||
+ and b = C.b
|
||||
+ and c = C.c
|
||||
+ and d = C.d
|
||||
+ and e = C.e
|
||||
+ and f = C.f
|
||||
+ and g = C.g
|
||||
+ and h = C.h
|
||||
+ end
|
||||
+ is not included in
|
||||
+ (module A)
|
||||
+|}]
|
||||
diff --git a/typing/includemod_errorprinter.ml b/typing/includemod_errorprinter.ml
|
||||
index 24d452fddc..b719e1627d 100644
|
||||
--- a/typing/includemod_errorprinter.ml
|
||||
+++ b/typing/includemod_errorprinter.ml
|
||||
@@ -709,7 +709,16 @@ let rec module_type ~expansion_token ~eqmode ~env ~before ~ctx diff =
|
||||
functor_params ~expansion_token ~env ~before ~ctx d
|
||||
| _ ->
|
||||
let inner = if eqmode then eq_module_types else module_types in
|
||||
- let next = dwith_context_and_elision ctx inner diff in
|
||||
+ let next =
|
||||
+ match diff.symptom with
|
||||
+ | Mt_core _ ->
|
||||
+ (* In those cases, the refined error messages for the current error
|
||||
+ will at most add some minor comments on the current error.
|
||||
+ It is thus better to avoid eliding the current error message.
|
||||
+ *)
|
||||
+ dwith_context ctx (inner diff)
|
||||
+ | _ -> dwith_context_and_elision ctx inner diff
|
||||
+ in
|
||||
let before = next :: before in
|
||||
module_type_symptom ~eqmode ~expansion_token ~env ~before ~ctx
|
||||
diff.symptom
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
From 4d316cbe4b564be3aa57b969acf9ba03910dcba4 Mon Sep 17 00:00:00 2001
|
||||
From: David Allsopp <david.allsopp@metastack.com>
|
||||
Date: Sat, 30 Jul 2022 11:51:12 +0200
|
||||
Subject: [PATCH 16/24] Merge pull request #11373 from dra27/flexlink-detect
|
||||
|
||||
Don't use CFLAGS when testing flexlink
|
||||
|
||||
(cherry picked from commit 004d313ce4fdb071d0aeda8736b9e74bb6c6a21b)
|
||||
---
|
||||
Changes | 6 ++++++
|
||||
aclocal.m4 | 1 +
|
||||
configure | Bin 581549 -> 581563 bytes
|
||||
3 files changed, 7 insertions(+)
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index 6b9855f707..99907b950a 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -1,6 +1,12 @@
|
||||
OCaml 4.14 maintenance branch
|
||||
-----------------------------
|
||||
|
||||
+### Build system:
|
||||
+
|
||||
+- #11370, #11373: Don't pass CFLAGS to flexlink during configure.
|
||||
+ (David Allsopp, report by William Hu, review by Xavier Leroy and
|
||||
+ Sébastien Hinderer)
|
||||
+
|
||||
### Bug fixes:
|
||||
|
||||
- #11204: Fix regression introduced in 4.14.0 that would trigger Warning 17 when
|
||||
diff --git a/aclocal.m4 b/aclocal.m4
|
||||
index 7e49468e48..2bc0a1dcc9 100644
|
||||
--- a/aclocal.m4
|
||||
+++ b/aclocal.m4
|
||||
@@ -328,6 +328,7 @@ AC_DEFUN([OCAML_TEST_FLEXLINK], [
|
||||
CC="$1 -chain $2 -exe"
|
||||
LIBS="conftest2.$ac_objext"
|
||||
CPPFLAGS="$3 $CPPFLAGS"
|
||||
+ CFLAGS=""
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_SOURCE([int main() { return 0; }])],
|
||||
[AC_MSG_RESULT([yes])],
|
||||
diff --git a/configure b/configure
|
||||
index 73ce66bfa0a3de5e886a88c973b2db288b5e4d03..c0dde03f183f86677b22a81238defdba60ad0080 100755
|
||||
GIT binary patch
|
||||
delta 57
|
||||
zcmZ3xUwQX_<%Sl<7N!>F7M3lnkFIk%yZJb}2iqzsO&46x?lIl3ot?8??*=OnvjH*t
|
||||
KcD)-M_3Qv?gA|zn
|
||||
|
||||
delta 47
|
||||
zcmdnJUwQ3*<%Sl<7N!>F7M3lnkFHM-Tg~P?U2ZNbN4xb6Rv=~rV)pIUH#i#D0n)${
|
||||
AvH$=8
|
||||
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
From defecc867a0b5653554c41b06e78c0f24f6c10a8 Mon Sep 17 00:00:00 2001
|
||||
From: David Allsopp <david.allsopp@metastack.com>
|
||||
Date: Tue, 2 Aug 2022 17:21:08 +0100
|
||||
Subject: [PATCH 17/24] Merge pull request #11468 from dra27/i686-mingw-ipv6
|
||||
|
||||
Fix detection of IPv6 on mingw-w64 i686
|
||||
|
||||
(cherry picked from commit 98392895940cc1c18534280ae001b70fa5bf24c2)
|
||||
---
|
||||
Changes | 4 ++++
|
||||
configure | Bin 581563 -> 581611 bytes
|
||||
configure.ac | 1 +
|
||||
3 files changed, 5 insertions(+)
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index 99907b950a..6b537edca9 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -37,6 +37,10 @@ OCaml 4.14 maintenance branch
|
||||
- #11417: Fix regression allowing virtual methods in non-virtual classes.
|
||||
(Leo White, review by Florian Angeletti)
|
||||
|
||||
+- #11468: Fix regression from #10186 (OCaml 4.13) detecting IPv6 on Windows for
|
||||
+ mingw-w64 i686 port.
|
||||
+ (David Allsopp, review by Xavier Leroy and Sébastien Hinderer)
|
||||
+
|
||||
OCaml 4.14.0 (28 March 2022)
|
||||
----------------------------
|
||||
|
||||
diff --git a/configure b/configure
|
||||
index c0dde03f183f86677b22a81238defdba60ad0080..536a1cbee58a430692bfa3de11901e7e2f6b4ee2 100755
|
||||
GIT binary patch
|
||||
delta 53
|
||||
zcmdnJU-|WZ<%Sl<7N!>F7M2#)7Pc+y(YK}x+-47$p3}xEG`-+2o7nVsH`#OBfnwVQ
|
||||
JZgZ?=0RTku6-595
|
||||
|
||||
delta 53
|
||||
zcmV-50LuUCzazW9BY=bfgaU*Egam{Iga)(+TiTa!+Xo<*Y=#9AmvH?C7MJeX2fc@o
|
||||
L+XuIh+X!0(RZ<pp
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 13d6d1a326..ebb8bbdb80 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -2016,6 +2016,7 @@ AS_CASE([$host],
|
||||
[*-*-mingw32],
|
||||
[AC_DEFINE([HAS_BROKEN_PRINTF])
|
||||
AC_DEFINE([HAS_STRERROR])
|
||||
+ AC_DEFINE([HAS_IPV6])
|
||||
AC_DEFINE([HAS_NICE])],
|
||||
[*-pc-windows],
|
||||
[AC_DEFINE([HAS_BROKEN_PRINTF])
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,194 +0,0 @@
|
|||
From 1c4df0352d5f75464acdb27377ccd10d1e0ba10a Mon Sep 17 00:00:00 2001
|
||||
From: Xavier Leroy <xavierleroy@users.noreply.github.com>
|
||||
Date: Mon, 22 Aug 2022 16:06:50 +0200
|
||||
Subject: [PATCH 18/24] More prudent deallocation of alternate signal stack
|
||||
(#11496)
|
||||
|
||||
After `caml_setup_stack_overflow_detection` is called,
|
||||
a C library can install its own alternate stack for signal handling.
|
||||
|
||||
Therefore, `caml_stop_stack_overflow_detection` must not free the
|
||||
alternate signal stack block, only the block that
|
||||
`caml_setup_stack_overflow_detection` allocated.
|
||||
|
||||
Fixes: #11489
|
||||
---
|
||||
Changes | 4 +++
|
||||
otherlibs/systhreads/st_stubs.c | 5 ++--
|
||||
runtime/caml/signals.h | 4 +--
|
||||
runtime/signals_byt.c | 4 +--
|
||||
runtime/signals_nat.c | 47 +++++++++++++++++++++------------
|
||||
5 files changed, 41 insertions(+), 23 deletions(-)
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index 6b537edca9..4d1bb10435 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -41,6 +41,10 @@ OCaml 4.14 maintenance branch
|
||||
mingw-w64 i686 port.
|
||||
(David Allsopp, review by Xavier Leroy and Sébastien Hinderer)
|
||||
|
||||
+- #11489, #11496: More prudent deallocation of alternate signal stack
|
||||
+ (Xavier Leroy, report by @rajdakin, review by Florian Angeletti)
|
||||
+
|
||||
+
|
||||
OCaml 4.14.0 (28 March 2022)
|
||||
----------------------------
|
||||
|
||||
diff --git a/otherlibs/systhreads/st_stubs.c b/otherlibs/systhreads/st_stubs.c
|
||||
index b7a6a9a6bb..043e07031e 100644
|
||||
--- a/otherlibs/systhreads/st_stubs.c
|
||||
+++ b/otherlibs/systhreads/st_stubs.c
|
||||
@@ -524,6 +524,7 @@ static ST_THREAD_FUNCTION caml_thread_start(void * arg)
|
||||
{
|
||||
caml_thread_t th = (caml_thread_t) arg;
|
||||
value clos;
|
||||
+ void * signal_stack;
|
||||
#ifdef NATIVE_CODE
|
||||
struct longjmp_buffer termination_buf;
|
||||
char tos;
|
||||
@@ -536,7 +537,7 @@ static ST_THREAD_FUNCTION caml_thread_start(void * arg)
|
||||
/* Acquire the global mutex */
|
||||
caml_leave_blocking_section();
|
||||
st_thread_set_id(Ident(th->descr));
|
||||
- caml_setup_stack_overflow_detection();
|
||||
+ signal_stack = caml_setup_stack_overflow_detection();
|
||||
#ifdef NATIVE_CODE
|
||||
/* Setup termination handler (for caml_thread_exit) */
|
||||
if (sigsetjmp(termination_buf.buf, 0) == 0) {
|
||||
@@ -550,7 +551,7 @@ static ST_THREAD_FUNCTION caml_thread_start(void * arg)
|
||||
#ifdef NATIVE_CODE
|
||||
}
|
||||
#endif
|
||||
- caml_stop_stack_overflow_detection();
|
||||
+ caml_stop_stack_overflow_detection(signal_stack);
|
||||
/* The thread now stops running */
|
||||
return 0;
|
||||
}
|
||||
diff --git a/runtime/caml/signals.h b/runtime/caml/signals.h
|
||||
index c6aeebfc78..62b0e7fafa 100644
|
||||
--- a/runtime/caml/signals.h
|
||||
+++ b/runtime/caml/signals.h
|
||||
@@ -87,8 +87,8 @@ value caml_do_pending_actions_exn (void);
|
||||
value caml_process_pending_actions_with_root (value extra_root); // raises
|
||||
value caml_process_pending_actions_with_root_exn (value extra_root);
|
||||
int caml_set_signal_action(int signo, int action);
|
||||
-CAMLextern int caml_setup_stack_overflow_detection(void);
|
||||
-CAMLextern int caml_stop_stack_overflow_detection(void);
|
||||
+CAMLextern void * caml_setup_stack_overflow_detection(void);
|
||||
+CAMLextern int caml_stop_stack_overflow_detection(void *);
|
||||
CAMLextern void caml_init_signals(void);
|
||||
CAMLextern void caml_terminate_signals(void);
|
||||
CAMLextern void (*caml_enter_blocking_section_hook)(void);
|
||||
diff --git a/runtime/signals_byt.c b/runtime/signals_byt.c
|
||||
index 439fb56404..7cb461ac4d 100644
|
||||
--- a/runtime/signals_byt.c
|
||||
+++ b/runtime/signals_byt.c
|
||||
@@ -81,7 +81,7 @@ int caml_set_signal_action(int signo, int action)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-CAMLexport int caml_setup_stack_overflow_detection(void) { return 0; }
|
||||
-CAMLexport int caml_stop_stack_overflow_detection(void) { return 0; }
|
||||
+CAMLexport void * caml_setup_stack_overflow_detection(void) { return NULL; }
|
||||
+CAMLexport int caml_stop_stack_overflow_detection(void * p) { return 0; }
|
||||
CAMLexport void caml_init_signals(void) { }
|
||||
CAMLexport void caml_terminate_signals(void) { }
|
||||
diff --git a/runtime/signals_nat.c b/runtime/signals_nat.c
|
||||
index 443f5d53b6..1dd8289c12 100644
|
||||
--- a/runtime/signals_nat.c
|
||||
+++ b/runtime/signals_nat.c
|
||||
@@ -254,6 +254,10 @@ DECLARE_SIGNAL_HANDLER(segv_handler)
|
||||
|
||||
/* Initialization of signal stuff */
|
||||
|
||||
+#ifdef HAS_STACK_OVERFLOW_DETECTION
|
||||
+static void * caml_signal_stack = NULL;
|
||||
+#endif
|
||||
+
|
||||
void caml_init_signals(void)
|
||||
{
|
||||
/* Bound-check trap handling */
|
||||
@@ -278,7 +282,8 @@ void caml_init_signals(void)
|
||||
#endif
|
||||
|
||||
#ifdef HAS_STACK_OVERFLOW_DETECTION
|
||||
- if (caml_setup_stack_overflow_detection() != -1) {
|
||||
+ caml_signal_stack = caml_setup_stack_overflow_detection();
|
||||
+ if (caml_signal_stack != NULL) {
|
||||
struct sigaction act;
|
||||
SET_SIGACT(act, segv_handler);
|
||||
act.sa_flags |= SA_ONSTACK | SA_NODEFER;
|
||||
@@ -314,7 +319,8 @@ void caml_terminate_signals(void)
|
||||
|
||||
#ifdef HAS_STACK_OVERFLOW_DETECTION
|
||||
set_signal_default(SIGSEGV);
|
||||
- caml_stop_stack_overflow_detection();
|
||||
+ caml_stop_stack_overflow_detection(caml_signal_stack);
|
||||
+ caml_signal_stack = NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -323,37 +329,44 @@ void caml_terminate_signals(void)
|
||||
Each thread needs its own alternate stack.
|
||||
The alternate stack used to be statically-allocated for the main thread,
|
||||
but this is incompatible with Glibc 2.34 and newer, where SIGSTKSZ
|
||||
- may not be a compile-time constant (issue #10250). */
|
||||
+ may not be a compile-time constant (issue #10250).
|
||||
+ Return the dynamically-allocated alternate signal stack, or NULL
|
||||
+ if an error occurred.
|
||||
+ The returned pointer must be passed to [caml_stop_stack_overflow_detection].
|
||||
+*/
|
||||
|
||||
-CAMLexport int caml_setup_stack_overflow_detection(void)
|
||||
+CAMLexport void * caml_setup_stack_overflow_detection(void)
|
||||
{
|
||||
#ifdef HAS_STACK_OVERFLOW_DETECTION
|
||||
stack_t stk;
|
||||
- stk.ss_sp = malloc(SIGSTKSZ);
|
||||
- if (stk.ss_sp == NULL) return -1;
|
||||
stk.ss_size = SIGSTKSZ;
|
||||
+ stk.ss_sp = malloc(stk.ss_size);
|
||||
+ if (stk.ss_sp == NULL) return NULL;
|
||||
stk.ss_flags = 0;
|
||||
if (sigaltstack(&stk, NULL) == -1) {
|
||||
free(stk.ss_sp);
|
||||
- return -1;
|
||||
+ return NULL;
|
||||
}
|
||||
+ return stk.ss_sp;
|
||||
+#else
|
||||
+ return NULL;
|
||||
#endif
|
||||
- /* Success (or stack overflow detection not available) */
|
||||
- return 0;
|
||||
}
|
||||
|
||||
-CAMLexport int caml_stop_stack_overflow_detection(void)
|
||||
+CAMLexport int caml_stop_stack_overflow_detection(void * signal_stack)
|
||||
{
|
||||
#ifdef HAS_STACK_OVERFLOW_DETECTION
|
||||
stack_t oldstk, stk;
|
||||
stk.ss_flags = SS_DISABLE;
|
||||
+ stk.ss_sp = NULL; /* not required but avoids a valgrind false alarm */
|
||||
+ stk.ss_size = SIGSTKSZ; /* macOS wants a valid size here */
|
||||
if (sigaltstack(&stk, &oldstk) == -1) return -1;
|
||||
- /* If caml_setup_stack_overflow_detection failed, we are not using
|
||||
- an alternate signal stack. SS_DISABLE will be set in oldstk,
|
||||
- and there is nothing to free in this case. */
|
||||
- if (! (oldstk.ss_flags & SS_DISABLE)) free(oldstk.ss_sp);
|
||||
- return 0;
|
||||
-#else
|
||||
- return 0;
|
||||
+ /* Check whether someone else installed their own signal stack */
|
||||
+ if (!(oldstk.ss_flags & SS_DISABLE) && oldstk.ss_sp != signal_stack) {
|
||||
+ /* Re-activate their signal stack. */
|
||||
+ sigaltstack(&oldstk, NULL);
|
||||
+ }
|
||||
+ free(signal_stack);
|
||||
#endif
|
||||
+ return 0;
|
||||
}
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
From a4633757e352b30f136d2a1cda827289d826ddc0 Mon Sep 17 00:00:00 2001
|
||||
From: David Allsopp <david.allsopp@metastack.com>
|
||||
Date: Thu, 25 Aug 2022 08:44:47 +0100
|
||||
Subject: [PATCH 19/24] Merge pull request #11487 from
|
||||
purplearmadillo77/fma_test
|
||||
|
||||
Thwart FMA test optimization during configure
|
||||
|
||||
(cherry picked from commit cd7dc7f6b9b5353acc2aa70bdc7bbecff56634d0)
|
||||
---
|
||||
Changes | 3 +++
|
||||
aclocal.m4 | 2 +-
|
||||
configure | Bin 581611 -> 581620 bytes
|
||||
3 files changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index 4d1bb10435..763c0fa4b7 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -7,6 +7,9 @@ OCaml 4.14 maintenance branch
|
||||
(David Allsopp, report by William Hu, review by Xavier Leroy and
|
||||
Sébastien Hinderer)
|
||||
|
||||
+- #11???: Thwart FMA test optimization during configure
|
||||
+ (William Hu, review by ???)
|
||||
+
|
||||
### Bug fixes:
|
||||
|
||||
- #11204: Fix regression introduced in 4.14.0 that would trigger Warning 17 when
|
||||
diff --git a/aclocal.m4 b/aclocal.m4
|
||||
index 2bc0a1dcc9..addb0d8bbf 100644
|
||||
--- a/aclocal.m4
|
||||
+++ b/aclocal.m4
|
||||
@@ -440,7 +440,7 @@ int main (void) {
|
||||
broken implementations of Cygwin64, mingw-w64 (x86_64) and VS2013-2017.
|
||||
The static volatile variables aim to thwart GCC's constant folding. */
|
||||
static volatile double x, y, z;
|
||||
- double t264, t265, t266;
|
||||
+ volatile double t264, t265, t266;
|
||||
x = 0x3.bd5b7dde5fddap-496;
|
||||
y = 0x3.bd5b7dde5fddap-496;
|
||||
z = -0xd.fc352bc352bap-992;
|
||||
diff --git a/configure b/configure
|
||||
index 536a1cbee58a430692bfa3de11901e7e2f6b4ee2..1a1dd61863e0435952ba6d6baf8131e68f070b3d 100755
|
||||
GIT binary patch
|
||||
delta 44
|
||||
zcmaF8U-`>^<%Sl<7N!>F7M2#)Eo_r#a+KxgB$j06q_$6*$p*yi+b7NBh;#!0qIVJx
|
||||
|
||||
delta 35
|
||||
qcmeyeU-|WZ<%Sl<7N!>F7M2#)Eo_r#w$GW#2E^>!=gj1Ya037qBM!s>
|
||||
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
From 19f5ef04dc344a82a3831f4b16f0be75c813dbf6 Mon Sep 17 00:00:00 2001
|
||||
From: David Allsopp <david.allsopp@metastack.com>
|
||||
Date: Thu, 25 Aug 2022 08:48:34 +0100
|
||||
Subject: [PATCH 20/24] Fixup Changes
|
||||
|
||||
---
|
||||
Changes | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index 763c0fa4b7..92d0837eb6 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -7,8 +7,8 @@ OCaml 4.14 maintenance branch
|
||||
(David Allsopp, report by William Hu, review by Xavier Leroy and
|
||||
Sébastien Hinderer)
|
||||
|
||||
-- #11???: Thwart FMA test optimization during configure
|
||||
- (William Hu, review by ???)
|
||||
+- #11487: Thwart FMA test optimization during configure
|
||||
+ (William Hu, review by David Allsopp and Sébastien Hinderer)
|
||||
|
||||
### Bug fixes:
|
||||
|
||||
@@ -21,7 +21,7 @@ OCaml 4.14 maintenance branch
|
||||
before using it to ensure that the headers can always be used in code which
|
||||
turns on -Wundef (or equivalent).
|
||||
(David Allsopp and Nicolás Ojeda Bär, review by Nicolás Ojeda Bär and
|
||||
- Sebastien Hinderer)
|
||||
+ Sébastien Hinderer)
|
||||
|
||||
- #11314, #11416: fix non-informative error message for module inclusion
|
||||
(Florian Angeletti, report by Thierry Martinez, review by Gabriel Scherer)
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,90 +0,0 @@
|
|||
From e6dfa704c0f7847fe8e7a2a153714b4075019a0f Mon Sep 17 00:00:00 2001
|
||||
From: Chris Casinghino <chris.casinghino@gmail.com>
|
||||
Date: Fri, 2 Sep 2022 10:28:55 -0400
|
||||
Subject: [PATCH 21/24] Fix [@deprecated_mutable], which couldn't be triggered.
|
||||
(#11524)
|
||||
|
||||
Fixes #11516
|
||||
|
||||
(cherry picked from commit 024ca164ab844a9be94e0675bb5a1693bab7c08f)
|
||||
---
|
||||
Changes | 2 ++
|
||||
.../warnings/deprecated_mutable.compilers.reference | 4 ++++
|
||||
testsuite/tests/warnings/deprecated_mutable.ml | 13 +++++++++++++
|
||||
typing/env.ml | 9 ++++++++-
|
||||
4 files changed, 27 insertions(+), 1 deletion(-)
|
||||
create mode 100644 testsuite/tests/warnings/deprecated_mutable.compilers.reference
|
||||
create mode 100644 testsuite/tests/warnings/deprecated_mutable.ml
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index 92d0837eb6..aa8880ad07 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -47,6 +47,8 @@ OCaml 4.14 maintenance branch
|
||||
- #11489, #11496: More prudent deallocation of alternate signal stack
|
||||
(Xavier Leroy, report by @rajdakin, review by Florian Angeletti)
|
||||
|
||||
+- #11516, #11524: Fix the `deprecated_mutable` attribute.
|
||||
+ (Chris Casinghino, review by Nicolás Ojeda Bär and Florian Angeletti)
|
||||
|
||||
OCaml 4.14.0 (28 March 2022)
|
||||
----------------------------
|
||||
diff --git a/testsuite/tests/warnings/deprecated_mutable.compilers.reference b/testsuite/tests/warnings/deprecated_mutable.compilers.reference
|
||||
new file mode 100644
|
||||
index 0000000000..620dc57de9
|
||||
--- /dev/null
|
||||
+++ b/testsuite/tests/warnings/deprecated_mutable.compilers.reference
|
||||
@@ -0,0 +1,4 @@
|
||||
+File "deprecated_mutable.ml", line 13, characters 11-12:
|
||||
+13 | let () = y.x <- 42
|
||||
+ ^
|
||||
+Alert deprecated: mutating field x
|
||||
diff --git a/testsuite/tests/warnings/deprecated_mutable.ml b/testsuite/tests/warnings/deprecated_mutable.ml
|
||||
new file mode 100644
|
||||
index 0000000000..78fb12ac41
|
||||
--- /dev/null
|
||||
+++ b/testsuite/tests/warnings/deprecated_mutable.ml
|
||||
@@ -0,0 +1,13 @@
|
||||
+(* TEST
|
||||
+
|
||||
+flags = "-w +A-70"
|
||||
+
|
||||
+* bytecode
|
||||
+
|
||||
+*)
|
||||
+
|
||||
+type t = {mutable x : int [@deprecated_mutable]}
|
||||
+
|
||||
+let y : t = {x = 5}
|
||||
+
|
||||
+let () = y.x <- 42
|
||||
diff --git a/typing/env.ml b/typing/env.ml
|
||||
index 06b99f4159..29d7cdb0e4 100644
|
||||
--- a/typing/env.ml
|
||||
+++ b/typing/env.ml
|
||||
@@ -104,6 +104,10 @@ let add_label_usage lu usage =
|
||||
lu.lu_mutation <- true;
|
||||
lu.lu_construct <- true
|
||||
|
||||
+let is_mutating_label_usage = function
|
||||
+ | Mutation -> true
|
||||
+ | (Projection | Construct | Exported_private | Exported) -> false
|
||||
+
|
||||
let label_usages () =
|
||||
{lu_projection = false; lu_mutation = false; lu_construct = false}
|
||||
|
||||
@@ -2723,7 +2727,10 @@ let use_cltype ~use ~loc path desc =
|
||||
let use_label ~use ~loc usage env lbl =
|
||||
if use then begin
|
||||
mark_label_description_used usage env lbl;
|
||||
- Builtin_attributes.check_alerts loc lbl.lbl_attributes lbl.lbl_name
|
||||
+ Builtin_attributes.check_alerts loc lbl.lbl_attributes lbl.lbl_name;
|
||||
+ if is_mutating_label_usage usage then
|
||||
+ Builtin_attributes.check_deprecated_mutable loc lbl.lbl_attributes
|
||||
+ lbl.lbl_name
|
||||
end
|
||||
|
||||
let use_constructor_desc ~use ~loc usage env cstr =
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
From e5312a9c481f91f2ca2cae1dc4176a78baaebf40 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Tue, 24 Jun 2014 10:00:15 +0100
|
||||
Subject: [PATCH 22/24] Don't add rpaths to libraries.
|
||||
|
||||
---
|
||||
utils/config.mlp | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/utils/config.mlp b/utils/config.mlp
|
||||
index f758a9b483..ee17a737dc 100644
|
||||
--- a/utils/config.mlp
|
||||
+++ b/utils/config.mlp
|
||||
@@ -54,8 +54,8 @@ let native_c_compiler =
|
||||
c_compiler ^ " " ^ ocamlopt_cflags ^ " " ^ ocamlopt_cppflags
|
||||
let native_c_libraries = "%%NATIVECCLIBS%%"
|
||||
let native_pack_linker = "%%PACKLD%%"
|
||||
-let default_rpath = "%%RPATH%%"
|
||||
-let mksharedlibrpath = "%%MKSHAREDLIBRPATH%%"
|
||||
+let default_rpath = ""
|
||||
+let mksharedlibrpath = ""
|
||||
let ar = "%%ARCMD%%"
|
||||
let supports_shared_libraries = %%SUPPORTS_SHARED_LIBRARIES%%
|
||||
let mkdll, mkexe, mkmaindll =
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
From 2501cd8b3c40188e5eb6dd2158d61cfa023236c2 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Tue, 29 May 2012 20:44:18 +0100
|
||||
Subject: [PATCH 23/24] configure: Allow user defined C compiler flags.
|
||||
|
||||
---
|
||||
configure.ac | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index ebb8bbdb80..9e6c0b9745 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -680,6 +680,10 @@ AS_CASE([$host],
|
||||
internal_cflags="$cc_warnings"],
|
||||
[common_cflags="-O"])])
|
||||
|
||||
+# Allow CFLAGS and LDFLAGS to be added.
|
||||
+common_cflags="$common_cflags $CFLAGS"
|
||||
+cclibs="$cclibs $LDFLAGS"
|
||||
+
|
||||
internal_cppflags="-DCAML_NAME_SPACE $internal_cppflags"
|
||||
|
||||
# Enable SSE2 on x86 mingw to avoid using 80-bit registers.
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
From 8e9ee6f765273d2c385b590a593e784472753d87 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Wed, 26 Jan 2022 15:47:02 +0000
|
||||
Subject: [PATCH 24/24] configure: Only use OC_* for building executables
|
||||
|
||||
Fedora >= 36 fills LD_FLAGS with lots of cruft, particularly stuff for
|
||||
"package notes" which contains build paths.
|
||||
|
||||
In any case it seems pointless having both the OC_* variables and also
|
||||
including the regular CFLAGS/LDFLAGS. Give me full control over what
|
||||
ocamlopt uses.
|
||||
---
|
||||
configure.ac | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 9e6c0b9745..cab4cbd579 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -37,7 +37,7 @@ CONFIGURE_ARGS="$*"
|
||||
# at the moment they are not taken into account on Windows, because
|
||||
# flexlink, which is used to build executables on this platform, can
|
||||
# not handle them.
|
||||
-mkexe="\$(CC) \$(OC_CFLAGS) \$(CFLAGS) \$(OC_LDFLAGS) \$(LDFLAGS)"
|
||||
+mkexe="\$(CC) \$(OC_CFLAGS) \$(OC_LDFLAGS)"
|
||||
|
||||
# Flags for building executable files with debugging symbols
|
||||
mkexedebugflag="-g"
|
||||
--
|
||||
2.37.0.rc2
|
||||
|
||||
6
gating.yaml
Executable file
6
gating.yaml
Executable file
|
|
@ -0,0 +1,6 @@
|
|||
--- !Policy
|
||||
product_versions:
|
||||
- rhel-*
|
||||
decision_context: osci_compose_gate
|
||||
rules:
|
||||
- !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional}
|
||||
69
macros.ocaml-rpm
Normal file
69
macros.ocaml-rpm
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
# Make %files lists from an installed tree of files.
|
||||
# Options:
|
||||
# -s: separate packaging; every subdirectory of %%{ocamldir}, except stublibs,
|
||||
# is placed in its own package. This option requires the existence of opam
|
||||
# *.install files in the build tree.
|
||||
# -n: suppress creation of a devel subpackage.
|
||||
%ocaml_files(sn) %{python3} /usr/lib/rpm/redhat/ocaml_files.py %{-s} %{-n} %{buildroot} %{ocamldir}
|
||||
|
||||
# Internal macro holding the common parts of ocaml_install and dune_install
|
||||
%ocaml_install_common(sn) %{expand:
|
||||
rm -rf %{buildroot}%{_prefix}/doc
|
||||
mlis=$(find %{buildroot}%{_libdir}/ocaml -name '*.mli')
|
||||
rm -f ${mlis//.mli/.ml}
|
||||
%ocaml_files %{-s} %{-n}}
|
||||
|
||||
# Install files listed in opam *.install files.
|
||||
# Options:
|
||||
# -s: separate packaging; every subdirectory of %%{ocamldir}, except stublibs,
|
||||
# is placed in its own package.
|
||||
# -n: suppress creation of a devel subpackage.
|
||||
%ocaml_install(sn) %{expand:
|
||||
%{python3} /usr/lib/rpm/redhat/ocaml_files.py -i %{-s} %{-n} %{buildroot} %{ocamldir}
|
||||
%ocaml_install_common %{-s} %{-n}}
|
||||
|
||||
# Add smp_mflags to arguments if no -j release option is given.
|
||||
# Add --release to arguments if no -p or --release option is given.
|
||||
# Add --verbose to arguments if it is not given.
|
||||
%dune_add_flags(-) %{lua:
|
||||
has_j = false
|
||||
has_p = false
|
||||
has_v = false
|
||||
for _, flag in pairs(arg) do
|
||||
if flag:find("^-j") then
|
||||
has_j = true
|
||||
elseif flag:find("^-p") or flag:find("^--release)") then
|
||||
has_p = true
|
||||
elseif flag:find("^--verbose") then
|
||||
has_v = true
|
||||
end
|
||||
end
|
||||
if not has_j then
|
||||
table.insert(arg, 1, rpm.expand("%{?_smp_mflags}"))
|
||||
end
|
||||
if not has_p then
|
||||
table.insert(arg, 1, "--release")
|
||||
end
|
||||
if not has_v then
|
||||
table.insert(arg, 1, "--verbose")
|
||||
end
|
||||
print(table.concat(arg, " "))
|
||||
}
|
||||
|
||||
# Build with dune
|
||||
%dune_build(-) dune build %{dune_add_flags %*}
|
||||
|
||||
# Run tests with dune
|
||||
%dune_check(-) dune runtest %{dune_add_flags %*}
|
||||
|
||||
# Install with dune
|
||||
# Options:
|
||||
# -s: separate packaging; every subdirectory of %%{ocamldir}, except stublibs,
|
||||
# is placed in its own package.
|
||||
# -n: suppress creation of a devel subpackage.
|
||||
%dune_install(sn) %{expand:
|
||||
dune install --destdir=%{buildroot} %{dune_add_flags %*}
|
||||
if [ -d _build/default/_doc/_html ]; then
|
||||
find _build/default/_doc/_html -name .dune-keep -delete
|
||||
fi
|
||||
%ocaml_install_common %{-s} %{-n}}
|
||||
347
ocaml.spec
347
ocaml.spec
|
|
@ -18,9 +18,14 @@
|
|||
%global natdynlink 0
|
||||
%endif
|
||||
|
||||
%global giturl https://github.com/ocaml/ocaml
|
||||
|
||||
# i686 support was dropped in OCaml 5 / Fedora 39.
|
||||
ExcludeArch: %{ix86}
|
||||
|
||||
# These are all the architectures that the tests run on. The tests
|
||||
# take a long time to run, so don't run them on slow machines.
|
||||
%global test_arches aarch64 %{power64} riscv64 x86_64
|
||||
%global test_arches %{arm64} %{power64} %{riscv64} s390x %{x86_64}
|
||||
# These are the architectures for which the tests must pass otherwise
|
||||
# the build will fail.
|
||||
#global test_arches_required aarch64 ppc64le x86_64
|
||||
|
|
@ -33,16 +38,19 @@
|
|||
%global rcver %{nil}
|
||||
|
||||
Name: ocaml
|
||||
Version: 4.14.0
|
||||
Release: 5%{?dist}
|
||||
Version: 5.5.0
|
||||
Release: 2%{?dist}
|
||||
|
||||
Summary: OCaml compiler and programming environment
|
||||
|
||||
License: QPL and (LGPLv2+ with exceptions)
|
||||
License: LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception
|
||||
|
||||
URL: https://www.ocaml.org
|
||||
VCS: git:%{giturl}.git
|
||||
|
||||
Source0: https://github.com/ocaml/ocaml/archive/%{version}/%{name}-%{version}.tar.gz
|
||||
Source0: %{giturl}/archive/%{version}%{rcver}/%{name}-%{version}%{rcver}.tar.gz
|
||||
Source1: macros.ocaml-rpm
|
||||
Source2: ocaml_files.py
|
||||
|
||||
# IMPORTANT NOTE:
|
||||
#
|
||||
|
|
@ -53,71 +61,55 @@ Source0: https://github.com/ocaml/ocaml/archive/%{version}/%{name}-%{vers
|
|||
#
|
||||
# https://pagure.io/fedora-ocaml
|
||||
#
|
||||
# Current branch: fedora-38-4.14.0
|
||||
# Current branch: fedora-45-5.4.1
|
||||
#
|
||||
# ALTERNATIVELY add a patch to the end of the list (leaving the
|
||||
# existing patches unchanged) adding a comment to note that it should
|
||||
# be incorporated into the git repo at a later time.
|
||||
|
||||
# Patches added after 4.14.0 was released
|
||||
Patch0001: 0001-Do-not-trigger-warning-when-calling-virtual-methods-.patch
|
||||
Patch0002: 0002-Merge-pull-request-11236-from-Nymphium-missing-since.patch
|
||||
Patch0003: 0003-misc.h-fix-preprocessor-conditional-on-_MSC_VER.patch
|
||||
Patch0004: 0004-Changes.patch
|
||||
Patch0005: 0005-Guard-more-instances-of-undefined-_MSC_VER.patch
|
||||
Patch0006: 0006-Better-documentation-for-string_of_float-.-11353.patch
|
||||
Patch0007: 0007-Merge-pull-request-11380-from-damiendoligez-fix-fort.patch
|
||||
Patch0008: 0008-Refactor-the-initialization-of-bytecode-threading-11.patch
|
||||
Patch0009: 0009-Merge-pull-request-11397-from-Octachron-tast_mapper_.patch
|
||||
Patch0010: 0010-Merge-pull-request-11396-from-gasche-fix11392.patch
|
||||
Patch0011: 0011-Document-limitation-on-caml_callbackN-11409.patch
|
||||
Patch0012: 0012-Stop-calling-ranlib-on-created-installed-libraries-1.patch
|
||||
Patch0013: 0013-tests-lib-bigarray-2-has-gfortran.sh-don-t-print-any.patch
|
||||
Patch0014: 0014-Merge-pull-request-11417-from-lpw25-fix-virtual-clas.patch
|
||||
Patch0015: 0015-Do-not-elide-the-whole-module-type-error-message-114.patch
|
||||
Patch0016: 0016-Merge-pull-request-11373-from-dra27-flexlink-detect.patch
|
||||
Patch0017: 0017-Merge-pull-request-11468-from-dra27-i686-mingw-ipv6.patch
|
||||
Patch0018: 0018-More-prudent-deallocation-of-alternate-signal-stack-.patch
|
||||
Patch0019: 0019-Merge-pull-request-11487-from-purplearmadillo77-fma_.patch
|
||||
Patch0020: 0020-Fixup-Changes.patch
|
||||
Patch0021: 0021-Fix-deprecated_mutable-which-couldn-t-be-triggered.-.patch
|
||||
|
||||
# Fedora-specific patches
|
||||
Patch0022: 0022-Don-t-add-rpaths-to-libraries.patch
|
||||
Patch0023: 0023-configure-Allow-user-defined-C-compiler-flags.patch
|
||||
Patch0024: 0024-configure-Only-use-OC_-for-building-executables.patch
|
||||
Patch: 0001-Don-t-add-rpaths-to-libraries.patch
|
||||
Patch: 0002-configure-Allow-user-defined-C-compiler-flags.patch
|
||||
|
||||
BuildRequires: make
|
||||
BuildRequires: git
|
||||
BuildRequires: git-core
|
||||
BuildRequires: gcc
|
||||
BuildRequires: autoconf
|
||||
BuildRequires: binutils-devel
|
||||
BuildRequires: ncurses-devel
|
||||
BuildRequires: gdbm-devel
|
||||
BuildRequires: gawk
|
||||
BuildRequires: perl-interpreter
|
||||
BuildRequires: util-linux
|
||||
BuildRequires: /usr/bin/annocheck
|
||||
BuildRequires: annobin-annocheck
|
||||
BuildRequires: pkgconfig(libzstd)
|
||||
|
||||
# Documentation requirements
|
||||
BuildRequires: asciidoc
|
||||
|
||||
# ocamlopt runs gcc to link binaries. Because Fedora includes
|
||||
# hardening flags automatically, redhat-rpm-config is also required.
|
||||
# Compressed marshaling requires libzstd-devel.
|
||||
Requires: gcc
|
||||
Requires: redhat-rpm-config
|
||||
Requires: libzstd-devel%{?_isa}
|
||||
|
||||
# Because we pass -c flag to ocaml-find-requires (to avoid circular
|
||||
# dependencies) we also have to explicitly depend on the right version
|
||||
# of ocaml-runtime.
|
||||
Requires: ocaml-runtime%{?_isa} = %{version}-%{release}
|
||||
|
||||
# Bundles an MD5 implementation in runtime/caml/md5.h and runtime/md5.c
|
||||
Provides: bundled(md5-plumb)
|
||||
# Force ocaml-srpm-macros to be at the latest version, both for builds
|
||||
# and installs, since OCaml 5.2 has a different set of native code
|
||||
# generators than previous versions.
|
||||
BuildRequires: ocaml-srpm-macros >= 10
|
||||
Requires: ocaml-srpm-macros >= 10
|
||||
|
||||
Provides: ocaml(compiler) = %{version}
|
||||
|
||||
%global __ocaml_requires_opts -c -f '%{buildroot}%{_bindir}/ocamlrun %{buildroot}%{_bindir}/ocamlobjinfo.byte'
|
||||
%if %{native_compiler}
|
||||
%global __ocaml_requires_opts -c -f '%{buildroot}%{_bindir}/ocamlrun %{buildroot}%{_bindir}/ocamlobjinfo.byte' -i Dynlink_cmo_format -i Dynlink_cmxs_format
|
||||
%else
|
||||
%global __ocaml_requires_opts -c -f '%{buildroot}%{_bindir}/ocamlrun %{buildroot}%{_bindir}/ocamlobjinfo.byte' -i Backend_intf -i Inlining_decision_intf -i Simplify_boxed_integer_ops_intf
|
||||
%endif
|
||||
%global __ocaml_provides_opts -f '%{buildroot}%{_bindir}/ocamlrun %{buildroot}%{_bindir}/ocamlobjinfo.byte'
|
||||
|
||||
|
||||
%description
|
||||
OCaml is a high-level, strongly-typed, functional and object-oriented
|
||||
programming language from the ML family of languages.
|
||||
|
|
@ -129,10 +121,16 @@ and a comprehensive library.
|
|||
|
||||
|
||||
%package runtime
|
||||
# LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception: the project as a whole
|
||||
# LicenseRef-Fedora-Public-Domain: the MD5 implementation in runtime/caml/md5.h
|
||||
# and runtime/md5.c
|
||||
License: LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception AND LicenseRef-Fedora-Public-Domain
|
||||
Summary: OCaml runtime environment
|
||||
Requires: util-linux
|
||||
Provides: ocaml(runtime) = %{version}
|
||||
|
||||
# Bundles an MD5 implementation in runtime/caml/md5.h and runtime/md5.c
|
||||
Provides: bundled(md5-plumb)
|
||||
|
||||
%description runtime
|
||||
OCaml is a high-level, strongly-typed, functional and object-oriented
|
||||
programming language from the ML family of languages.
|
||||
|
|
@ -150,6 +148,9 @@ Source code for OCaml libraries.
|
|||
|
||||
|
||||
%package ocamldoc
|
||||
# LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception: the project as a whole
|
||||
# LicenseRef-Fedora-Public-Domain: ocamldoc/ocamldoc.sty
|
||||
License: LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception AND LicenseRef-Fedora-Public-Domain
|
||||
Summary: Documentation generator for OCaml
|
||||
Requires: ocaml%{?_isa} = %{version}-%{release}
|
||||
Provides: ocamldoc = %{version}
|
||||
|
|
@ -160,6 +161,7 @@ Documentation generator for OCaml.
|
|||
|
||||
%package docs
|
||||
Summary: Documentation for OCaml
|
||||
BuildArch: noarch
|
||||
Requires: ocaml = %{version}-%{release}
|
||||
|
||||
|
||||
|
|
@ -185,6 +187,20 @@ Note that this exposes internal details of the OCaml compiler which
|
|||
may not be portable between versions.
|
||||
|
||||
|
||||
%package rpm-macros
|
||||
# LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception: the project as a whole
|
||||
# BSD-3-Clause: ocaml_files.py
|
||||
License: LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception AND BSD-3-Clause
|
||||
Summary: RPM macros for building OCaml packages
|
||||
BuildArch: noarch
|
||||
Requires: ocaml = %{version}-%{release}
|
||||
Requires: python3
|
||||
|
||||
|
||||
%description rpm-macros
|
||||
This package contains macros that are useful for building OCaml RPMs.
|
||||
|
||||
|
||||
%prep
|
||||
%autosetup -S git -n %{name}-%{version}%{rcver}
|
||||
# Patches touch configure.ac, so rebuild it:
|
||||
|
|
@ -199,6 +215,12 @@ unset MAKEFLAGS
|
|||
make=make
|
||||
%endif
|
||||
|
||||
# Set ocamlmklib default flags to include Fedora linker flags
|
||||
sed -i '/ld_opts/s|\[\]|["%{build_ldflags}"]|' tools/ocamlmklib.ml
|
||||
|
||||
# Expose a dependency on the math library
|
||||
sed -i '/^EXTRACAMLFLAGS=/aLINKOPTS=-cclib -lm' otherlibs/unix/Makefile
|
||||
|
||||
# Don't use %%configure macro because it sets --build, --host which
|
||||
# breaks some incorrect assumptions made by OCaml's configure.ac
|
||||
#
|
||||
|
|
@ -218,8 +240,26 @@ make=make
|
|||
--sysconfdir=%{_sysconfdir} \
|
||||
--mandir=%{_mandir} \
|
||||
--libdir=%{_libdir}/ocaml \
|
||||
OC_CFLAGS="$CFLAGS" \
|
||||
OC_LDFLAGS="$LDFLAGS" \
|
||||
--enable-flambda \
|
||||
%if %{native_compiler}
|
||||
--enable-native-compiler \
|
||||
--enable-native-toplevel \
|
||||
%else
|
||||
--disable-native-compiler \
|
||||
--disable-native-toplevel \
|
||||
%endif
|
||||
%ifarch %{x86_64} %{arm64}
|
||||
%if 0%{?_include_frame_pointers}
|
||||
--enable-frame-pointers \
|
||||
%endif
|
||||
%endif
|
||||
%ifarch %{test_arches}
|
||||
--enable-ocamltest \
|
||||
%else
|
||||
--disable-ocamltest \
|
||||
%endif
|
||||
OC_CFLAGS='%{build_cflags}' \
|
||||
OC_LDFLAGS='%{build_ldflags}' \
|
||||
%{nil}
|
||||
$make world
|
||||
%if %{native_compiler}
|
||||
|
|
@ -227,6 +267,13 @@ $make opt
|
|||
$make opt.opt
|
||||
%endif
|
||||
|
||||
# Build the README and fix up references to other doc files
|
||||
asciidoc -d book README.adoc
|
||||
for fil in CONTRIBUTING.md HACKING.adoc INSTALL.adoc README.win32.adoc; do
|
||||
sed -e "s,\"$fil\",\"https://github.com/ocaml/ocaml/blob/trunk/$fil\"," \
|
||||
-i README.html
|
||||
done
|
||||
|
||||
|
||||
%check
|
||||
%ifarch %{ocaml_native_compiler}
|
||||
|
|
@ -239,10 +286,6 @@ annocheck -v hello ||:
|
|||
%endif
|
||||
|
||||
%ifarch %{test_arches}
|
||||
make ocamltest
|
||||
%ifarch %{ocaml_native_compiler}
|
||||
make ocamltest.opt
|
||||
%endif
|
||||
%ifarch %{test_arches_required}
|
||||
make -j1 tests
|
||||
%else
|
||||
|
|
@ -253,16 +296,21 @@ make -j1 tests ||:
|
|||
|
||||
%install
|
||||
%make_install
|
||||
perl -pi -e "s|^$RPM_BUILD_ROOT||" $RPM_BUILD_ROOT%{_libdir}/ocaml/ld.conf
|
||||
|
||||
# OCaml 5.5.0 uses relative paths in ld.conf by default to support relocatable
|
||||
# OCaml, which we don't need. Overwrite ld.conf with the absolute path.
|
||||
echo %{_libdir}/ocaml/stublibs > $RPM_BUILD_ROOT%{_libdir}/ocaml/ld.conf
|
||||
|
||||
echo %{version} > $RPM_BUILD_ROOT%{_libdir}/ocaml/fedora-ocaml-release
|
||||
|
||||
# Remove the installed documentation. We will install it using %%doc
|
||||
rm -rf $RPM_BUILD_ROOT%{_docdir}/ocaml
|
||||
|
||||
# Remove this file. It's only created in certain situations and it's
|
||||
# unclear why it is created at all.
|
||||
rm -f $RPM_BUILD_ROOT%{_libdir}/ocaml/eventlog_metadata
|
||||
mkdir -p $RPM_BUILD_ROOT%{rpmmacrodir}
|
||||
install -m 0644 %{SOURCE1} $RPM_BUILD_ROOT%{rpmmacrodir}/macros.ocaml-rpm
|
||||
|
||||
mkdir -p $RPM_BUILD_ROOT%{_rpmconfigdir}/redhat
|
||||
install -m 0644 %{SOURCE2} $RPM_BUILD_ROOT%{_rpmconfigdir}/redhat
|
||||
|
||||
|
||||
%files
|
||||
|
|
@ -270,98 +318,110 @@ rm -f $RPM_BUILD_ROOT%{_libdir}/ocaml/eventlog_metadata
|
|||
%{_bindir}/ocaml
|
||||
|
||||
%{_bindir}/ocamlcmt
|
||||
%{_bindir}/ocamlcp
|
||||
%{_bindir}/ocamldebug
|
||||
#{_bindir}/ocaml-instr-graph
|
||||
#{_bindir}/ocaml-instr-report
|
||||
%{_bindir}/ocamlmklib
|
||||
%{_bindir}/ocamlmktop
|
||||
%{_bindir}/ocamlprof
|
||||
%{_bindir}/ocamlyacc
|
||||
|
||||
# symlink to either .byte or .opt version
|
||||
%{_bindir}/ocamlc
|
||||
%{_bindir}/ocamlcp
|
||||
%{_bindir}/ocamldep
|
||||
%{_bindir}/ocamllex
|
||||
%{_bindir}/ocamlmklib
|
||||
%{_bindir}/ocamlmktop
|
||||
%{_bindir}/ocamlobjinfo
|
||||
%{_bindir}/ocamloptp
|
||||
%{_bindir}/ocamlprof
|
||||
|
||||
# bytecode versions
|
||||
%{_bindir}/ocamlc.byte
|
||||
%{_bindir}/ocamlcp.byte
|
||||
%{_bindir}/ocamldep.byte
|
||||
%{_bindir}/ocamllex.byte
|
||||
%{_bindir}/ocamlmklib.byte
|
||||
%{_bindir}/ocamlmktop.byte
|
||||
%{_bindir}/ocamlobjinfo.byte
|
||||
%{_bindir}/ocamloptp.byte
|
||||
%{_bindir}/ocamlprof.byte
|
||||
|
||||
%if %{native_compiler}
|
||||
# native code versions
|
||||
%{_bindir}/ocamlc.opt
|
||||
%{_bindir}/ocamlcp.opt
|
||||
%{_bindir}/ocamldep.opt
|
||||
%{_bindir}/ocamllex.opt
|
||||
%{_bindir}/ocamlmklib.opt
|
||||
%{_bindir}/ocamlmktop.opt
|
||||
%{_bindir}/ocamlobjinfo.opt
|
||||
%{_bindir}/ocamloptp.opt
|
||||
%{_bindir}/ocamlprof.opt
|
||||
%endif
|
||||
|
||||
%if %{native_compiler}
|
||||
%{_bindir}/ocamlnat
|
||||
%{_bindir}/ocamlopt
|
||||
%{_bindir}/ocamlopt.byte
|
||||
%{_bindir}/ocamlopt.opt
|
||||
%{_bindir}/ocamloptp
|
||||
%endif
|
||||
|
||||
#%%{_libdir}/ocaml/addlabels
|
||||
#%%{_libdir}/ocaml/scrapelabels
|
||||
%{_libdir}/ocaml/camlheader
|
||||
%{_libdir}/ocaml/camlheader_ur
|
||||
%{_libdir}/ocaml/expunge
|
||||
%{_libdir}/ocaml/ld.conf
|
||||
%{_libdir}/ocaml/Makefile.config
|
||||
|
||||
%{_libdir}/ocaml/*.a
|
||||
%if %{natdynlink}
|
||||
%{_libdir}/ocaml/*.cmxs
|
||||
%endif
|
||||
%if %{native_compiler}
|
||||
%{_libdir}/ocaml/*.cmxa
|
||||
%{_libdir}/ocaml/*.cmx
|
||||
%{_libdir}/ocaml/*.o
|
||||
%{_libdir}/ocaml/libasmrun_shared.so
|
||||
%endif
|
||||
%{_libdir}/ocaml/*.mli
|
||||
%{_libdir}/ocaml/libcamlrun_shared.so
|
||||
#%%{_libdir}/ocaml/objinfo_helper
|
||||
%{_libdir}/ocaml/threads/*.mli
|
||||
%{_libdir}/ocaml/sys.ml.in
|
||||
|
||||
%{_libdir}/ocaml/{dynlink,runtime_events,str,threads,unix}/*.mli
|
||||
%if %{native_compiler}
|
||||
%{_libdir}/ocaml/threads/*.a
|
||||
%{_libdir}/ocaml/threads/*.cmxa
|
||||
%{_libdir}/ocaml/threads/*.cmx
|
||||
%{_libdir}/ocaml/{dynlink,runtime_events,str,threads,unix}/*.a
|
||||
%{_libdir}/ocaml/{dynlink,runtime_events,str,threads,unix}/*.cmxa
|
||||
%{_libdir}/ocaml/{dynlink,profiling,runtime_events,str,threads,unix}/*.cmx
|
||||
%{_libdir}/ocaml/profiling/*.o
|
||||
%endif
|
||||
%if %{natdynlink}
|
||||
%{_libdir}/ocaml/{runtime_events,str,unix}/*.cmxs
|
||||
%endif
|
||||
|
||||
# headers
|
||||
%{_libdir}/ocaml/caml
|
||||
|
||||
|
||||
%files runtime
|
||||
%doc README.adoc Changes
|
||||
%doc README.html Changes
|
||||
%license LICENSE
|
||||
%{_bindir}/ocamlrun
|
||||
%{_bindir}/*ocamlrun-a100
|
||||
%{_bindir}/ocamlrund
|
||||
%{_bindir}/*ocamlrund-a100
|
||||
%{_bindir}/ocamlruni
|
||||
%{_bindir}/*ocamlruni-a100
|
||||
%dir %{_libdir}/ocaml
|
||||
#%%{_libdir}/ocaml/VERSION
|
||||
%{_libdir}/ocaml/libasmrun*.so
|
||||
%{_libdir}/ocaml/libcamlrun*.so
|
||||
%{_libdir}/ocaml/*.cmo
|
||||
%{_libdir}/ocaml/*.cmi
|
||||
%{_libdir}/ocaml/*.cma
|
||||
%{_libdir}/ocaml/camlheaderd
|
||||
%{_libdir}/ocaml/camlheaderi
|
||||
%{_libdir}/ocaml/ld.conf
|
||||
%{_libdir}/ocaml/stublibs
|
||||
%dir %{_libdir}/ocaml/dynlink
|
||||
%{_libdir}/ocaml/dynlink/META
|
||||
%{_libdir}/ocaml/dynlink/*.cmi
|
||||
%{_libdir}/ocaml/dynlink/*.cma
|
||||
%dir %{_libdir}/ocaml/profiling
|
||||
%{_libdir}/ocaml/profiling/*.cmo
|
||||
%{_libdir}/ocaml/profiling/*.cmi
|
||||
%dir %{_libdir}/ocaml/runtime_events
|
||||
%{_libdir}/ocaml/runtime_events/META
|
||||
%{_libdir}/ocaml/runtime_events/*.cmi
|
||||
%{_libdir}/ocaml/runtime_events/*.cma
|
||||
%{_libdir}/ocaml/runtime-launch-info
|
||||
%{_libdir}/ocaml/stdlib
|
||||
%dir %{_libdir}/ocaml/str
|
||||
%{_libdir}/ocaml/str/META
|
||||
%{_libdir}/ocaml/str/*.cmi
|
||||
%{_libdir}/ocaml/str/*.cma
|
||||
%dir %{_libdir}/ocaml/threads
|
||||
%{_libdir}/ocaml/threads/META
|
||||
%{_libdir}/ocaml/threads/*.cmi
|
||||
%{_libdir}/ocaml/threads/*.cma
|
||||
%dir %{_libdir}/ocaml/unix
|
||||
%{_libdir}/ocaml/unix/META
|
||||
%{_libdir}/ocaml/unix/*.cmi
|
||||
%{_libdir}/ocaml/unix/*.cma
|
||||
%{_libdir}/ocaml/fedora-ocaml-release
|
||||
|
||||
|
||||
|
|
@ -386,20 +446,107 @@ rm -f $RPM_BUILD_ROOT%{_libdir}/ocaml/eventlog_metadata
|
|||
|
||||
%files compiler-libs
|
||||
%license LICENSE
|
||||
%dir %{_libdir}/ocaml/compiler-libs
|
||||
%{_libdir}/ocaml/compiler-libs/*.mli
|
||||
%{_libdir}/ocaml/compiler-libs/*.cmi
|
||||
%{_libdir}/ocaml/compiler-libs/*.cmo
|
||||
%{_libdir}/ocaml/compiler-libs/*.cma
|
||||
%if %{native_compiler}
|
||||
%{_libdir}/ocaml/compiler-libs/*.a
|
||||
%{_libdir}/ocaml/compiler-libs/*.cmxa
|
||||
%{_libdir}/ocaml/compiler-libs/*.cmx
|
||||
%{_libdir}/ocaml/compiler-libs/*.o
|
||||
%endif
|
||||
%{_libdir}/ocaml/compiler-libs
|
||||
|
||||
|
||||
%files rpm-macros
|
||||
%{rpmmacrodir}/macros.ocaml-rpm
|
||||
%{_rpmconfigdir}/redhat/ocaml_files.py
|
||||
|
||||
|
||||
%changelog
|
||||
* Thu Jul 16 2026 Fedora Release Engineering <releng@fedoraproject.org> - 5.5.0-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild
|
||||
|
||||
* Tue Jun 23 2026 Jerry James <loganjerry@gmail.com> - 5.5.0-1
|
||||
- New upstream version 5.5.0 (RHBZ#2442622)
|
||||
- Drop upstreamed fix for arm64 frame pointers
|
||||
- Reenable LTO
|
||||
- Move ld.conf, libasmrun, and libcamlrun to ocaml-runtime
|
||||
- Drop hardlink dependency; rpm now does this by default
|
||||
- Drop unused utilx-linux dependency
|
||||
|
||||
* Thu Feb 26 2026 Richard W.M. Jones <rjones@redhat.com> - 5.4.1-4
|
||||
- Backport fix for arm64 frame pointers
|
||||
|
||||
* Fri Feb 20 2026 Richard W.M. Jones <rjones@redhat.com> - 5.4.1-1
|
||||
- New upstream version 5.4.1 (RHBZ#2440356)
|
||||
|
||||
* Fri Jan 16 2026 Fedora Release Engineering <releng@fedoraproject.org> - 5.4.0-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild
|
||||
|
||||
* Mon Oct 13 2025 Richard W.M. Jones <rjones@redhat.com> - 5.4.0-1
|
||||
- New upstream version 5.4.0 (RHBZ#2368289)
|
||||
|
||||
* Thu Jul 24 2025 Fedora Release Engineering <releng@fedoraproject.org> - 5.3.0-4
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
|
||||
|
||||
* Sun Jun 22 2025 Yaakov Selkowitz <yselkowi@redhat.com> - 5.3.0-3
|
||||
- Fix RPM macros for Python 3.14
|
||||
|
||||
* Fri Jan 17 2025 Fedora Release Engineering <releng@fedoraproject.org> - 5.3.0-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
|
||||
|
||||
* Thu Jan 9 2025 Jerry James <loganjerry@gmail.com> - 5.3.0-1
|
||||
- New upstream version 5.3.0
|
||||
- Drop upstreamed patches
|
||||
- BR git-core instead of git
|
||||
|
||||
* Thu Jul 18 2024 Fedora Release Engineering <releng@fedoraproject.org> - 5.2.0-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
|
||||
|
||||
* Wed Jun 19 2024 Richard W.M. Jones <rjones@redhat.com> - 5.2.0-2
|
||||
- Add fix for ppc64le code generation issue found after 5.2.0 was released
|
||||
|
||||
* Thu May 23 2024 Jerry James <loganjerry@gmail.com> - 5.2.0-1
|
||||
- New upstream version 5.2.0 (RHBZ#2269805)
|
||||
- Drop upstreamed frame pointer and s390x patches
|
||||
|
||||
* Thu Jan 25 2024 Fedora Release Engineering <releng@fedoraproject.org> - 5.1.1-4
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||
|
||||
* Sun Jan 21 2024 Fedora Release Engineering <releng@fedoraproject.org> - 5.1.1-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||
|
||||
* Mon Dec 18 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.1-2
|
||||
- Add s390x code generation fix
|
||||
https://github.com/ocaml/ocaml/issues/12829
|
||||
|
||||
* Mon Dec 11 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.1-1
|
||||
- New upstream version 5.1.1 (RHBZ#2239227)
|
||||
|
||||
* Tue Nov 14 2023 Yaakov Selkowitz <yselkowi@redhat.com> - 5.1.0-5
|
||||
- Drop unused BR parallel
|
||||
|
||||
* Fri Oct 06 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.0-4
|
||||
- Use BR ocaml-srpm-macros to force latest to be built against
|
||||
|
||||
* Thu Oct 05 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.0-3
|
||||
- Rebuild against updated ocaml-srpm-macros
|
||||
|
||||
* Thu Oct 5 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.0-2
|
||||
- Add upstream patch added after 5.1.0
|
||||
|
||||
* Wed Oct 4 2023 Jerry James <loganjerry@gmail.com> - 5.1.0-1
|
||||
- Version 5.1.0
|
||||
- Add LicenseRef-Fedora-Public-Domain to the runtime License field
|
||||
- New ocaml-rpm-macros subpackage
|
||||
- Depend on libzstd-devel for compressed marshaling
|
||||
- Disable LTO
|
||||
|
||||
* Thu Jul 20 2023 Fedora Release Engineering <releng@fedoraproject.org> - 5.0.0-4
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
|
||||
|
||||
* Wed Jul 12 2023 Richard W.M. Jones <rjones@redhat.com> - 5.0.0-3
|
||||
- Force ocaml-srpm-macros to be the latest version.
|
||||
|
||||
* Wed Jun 14 2023 Jerry James <loganjerry@gmail.com> - 5.0.0-2
|
||||
- Version 5.0.0
|
||||
- Convert License tag to SPDX
|
||||
- Ship HTML documentation instead of asciidoc source
|
||||
- Set ocamlmklib default flags to the Fedora linker flags
|
||||
- Enable frame pointers on x86_64
|
||||
|
||||
* Mon Jan 23 2023 Richard W.M. Jones <rjones@redhat.com> - 4.14.0-5
|
||||
- Rebuild OCaml packages for F38
|
||||
|
||||
|
|
|
|||
451
ocaml_files.py
Normal file
451
ocaml_files.py
Normal file
|
|
@ -0,0 +1,451 @@
|
|||
# Copyright 2022-3, Jerry James
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# 3. Neither the name of Red Hat nor the names of its
|
||||
# contributors may be used to endorse or promote products derived
|
||||
# from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import shutil
|
||||
import string
|
||||
import sys
|
||||
from collections.abc import Iterable, Iterator
|
||||
from enum import Enum, auto
|
||||
from typing import Callable, final
|
||||
|
||||
# Version of this script
|
||||
version=2
|
||||
|
||||
#
|
||||
# BUILDROOT CATEGORIZATION
|
||||
#
|
||||
|
||||
# Directories to ignore when generating %dir entries
|
||||
root_dirs: set[str] = {
|
||||
'/',
|
||||
'/etc',
|
||||
'/usr',
|
||||
'/usr/bin',
|
||||
'/usr/lib',
|
||||
'/usr/lib/ocaml',
|
||||
'/usr/lib/ocaml/caml',
|
||||
'/usr/lib/ocaml/stublibs',
|
||||
'/usr/lib/ocaml/threads',
|
||||
'/usr/lib64',
|
||||
'/usr/lib64/ocaml',
|
||||
'/usr/lib64/ocaml/caml',
|
||||
'/usr/lib64/ocaml/stublibs',
|
||||
'/usr/lib64/ocaml/threads',
|
||||
'/usr/libexec',
|
||||
'/usr/sbin',
|
||||
'/usr/share',
|
||||
'/usr/share/doc'
|
||||
}
|
||||
|
||||
def find_buildroot_toplevel(buildroot: str) -> list[str]:
|
||||
"""Find toplevel files and directories in the buildroot.
|
||||
|
||||
:param str buildroot: path to the buildroot
|
||||
:return: a list of toplevel files and directories in the buildroot
|
||||
"""
|
||||
bfiles: list[str] = []
|
||||
for path, dirs, files in os.walk(buildroot):
|
||||
for i in range(len(dirs) - 1, -1, -1):
|
||||
d = os.path.join(path, dirs[i])[len(buildroot):]
|
||||
if d not in root_dirs and not d.startswith('/usr/share/man'):
|
||||
bfiles.append(d)
|
||||
del dirs[i]
|
||||
for f in files:
|
||||
realfile = os.path.join(path, f)[len(buildroot):]
|
||||
if realfile.startswith('/usr/share/man'):
|
||||
bfiles.append(realfile + '*')
|
||||
else:
|
||||
bfiles.append(realfile)
|
||||
return bfiles
|
||||
|
||||
# File suffixes that go into a devel subpackage
|
||||
dev_suffixes: set[str] = {
|
||||
'a', 'cmo', 'cmt', 'cmti', 'cmx', 'cmxa', 'h', 'idl', 'ml', 'mli', 'o'
|
||||
}
|
||||
|
||||
def is_devel_file(filname: str) -> bool:
|
||||
"""Determine whether a file belongs to a devel subpackage.
|
||||
|
||||
:param str filname: the filename to check
|
||||
:return: True if the file belongs to a devel subpackage, else False
|
||||
"""
|
||||
return (filname == 'dune-package' or filname == 'opam' or
|
||||
(os.path.splitext(filname)[1][1:] in dev_suffixes
|
||||
and not filname.endswith('_top_init.ml')))
|
||||
|
||||
def find_buildroot_all(buildroot: str, devel: bool, add_star: bool) -> list[set[str]]:
|
||||
"""Find all files and directories in the buildroot and optionally
|
||||
categorize them as 'main' or 'devel'.
|
||||
|
||||
:param Namespace args: parsed command line arguments
|
||||
:param bool devel: True to split into 'main' and 'devel', False otherwise
|
||||
:param bool add_star: True to add a star to man page filenames
|
||||
:return: a list of files and directories, in this order: main files,
|
||||
main directories, devel files, and devel directories
|
||||
"""
|
||||
bfiles: list[set[str]] = [set(), set(), set()]
|
||||
bdirs: set[str] = set()
|
||||
for path, dirs, files in os.walk(buildroot):
|
||||
for d in dirs:
|
||||
realdir = os.path.join(path, d)[len(buildroot):]
|
||||
if realdir not in root_dirs and not realdir.startswith('/usr/share/man'):
|
||||
bdirs.add(realdir)
|
||||
for f in files:
|
||||
realfile = os.path.join(path, f)[len(buildroot):]
|
||||
if devel and is_devel_file(os.path.basename(realfile)):
|
||||
bfiles[2].add(realfile)
|
||||
else:
|
||||
if add_star and realfile.startswith('/usr/share/man'):
|
||||
bfiles[0].add(realfile + '*')
|
||||
else:
|
||||
bfiles[0].add(realfile)
|
||||
parentdir = os.path.dirname(realfile)
|
||||
if parentdir in bdirs:
|
||||
bfiles[1].add(parentdir)
|
||||
bdirs.remove(parentdir)
|
||||
# Catch intermediate directories, as in ocaml-mtime
|
||||
parentdir = os.path.dirname(parentdir)
|
||||
if parentdir in bdirs:
|
||||
bfiles[1].add(parentdir)
|
||||
bdirs.remove(parentdir)
|
||||
bfiles.append(bdirs)
|
||||
return bfiles
|
||||
|
||||
#
|
||||
# INSTALL FILE LEXER AND PARSER
|
||||
#
|
||||
|
||||
class TokenType(Enum):
|
||||
"""The types of tokens that can appear in an opam *.install file."""
|
||||
ERROR = auto()
|
||||
COLON = auto()
|
||||
LBRACE = auto()
|
||||
RBRACE = auto()
|
||||
LBRACK = auto()
|
||||
RBRACK = auto()
|
||||
STRING = auto()
|
||||
FIELD = auto()
|
||||
|
||||
@final
|
||||
class InstallFileLexer(Iterator[tuple[TokenType, str]]):
|
||||
"""Convert an opam *.install file into a sequence of tokens."""
|
||||
__slots__ = ['index', 'text']
|
||||
|
||||
def __init__(self, filname: str) -> None:
|
||||
"""Create an opam *.install file lexer.
|
||||
|
||||
:param str filname: the name of the file to read from
|
||||
"""
|
||||
self.index = 0
|
||||
with open(filname, 'r') as f:
|
||||
# Limit reads to 4 MB in case this file is bogus.
|
||||
# Most install files are under 4K.
|
||||
self.text = f.read(4194304)
|
||||
|
||||
def skip_whitespace(self) -> None:
|
||||
"""Skip over whitespace in the input."""
|
||||
while self.index < len(self.text) and \
|
||||
(self.text[self.index] == '#' or
|
||||
self.text[self.index] in string.whitespace):
|
||||
if self.text[self.index] == '#':
|
||||
while (self.index < len(self.text) and
|
||||
self.text[self.index] != '\n' and
|
||||
self.text[self.index] != '\r'):
|
||||
self.index += 1
|
||||
else:
|
||||
self.index += 1
|
||||
|
||||
def __next__(self) -> tuple[TokenType, str]:
|
||||
"""Get the next token from the opam *.install file.
|
||||
|
||||
:return: a pair containing the type and text of the next token
|
||||
"""
|
||||
self.skip_whitespace()
|
||||
if self.index < len(self.text):
|
||||
ch = self.text[self.index]
|
||||
if ch == ':':
|
||||
self.index += 1
|
||||
return (TokenType.COLON, ch)
|
||||
if ch == '{':
|
||||
self.index += 1
|
||||
return (TokenType.LBRACE, ch)
|
||||
if ch == '}':
|
||||
self.index += 1
|
||||
return (TokenType.RBRACE, ch)
|
||||
if ch == '[':
|
||||
self.index += 1
|
||||
return (TokenType.LBRACK, ch)
|
||||
if ch == ']':
|
||||
self.index += 1
|
||||
return (TokenType.RBRACK, ch)
|
||||
if ch == '"':
|
||||
start = self.index + 1
|
||||
end = start
|
||||
while end < len(self.text) and self.text[end] != '"':
|
||||
end += 2 if self.text[end] == '\\' else 1
|
||||
self.index = end + 1
|
||||
return (TokenType.STRING, self.text[start:end])
|
||||
if ch in string.ascii_letters:
|
||||
start = self.index
|
||||
end = start + 1
|
||||
while (end < len(self.text) and
|
||||
(self.text[end] == '_' or
|
||||
self.text[end] in string.ascii_letters)):
|
||||
end += 1
|
||||
self.index = end
|
||||
return (TokenType.FIELD, self.text[start:end])
|
||||
return (TokenType.ERROR, ch)
|
||||
else:
|
||||
raise StopIteration
|
||||
|
||||
@final
|
||||
class InstallFileParser(Iterable[tuple[str, bool, str, str]]):
|
||||
"""Parse opam *.install files."""
|
||||
|
||||
__slots__ = ['pkgname', 'lexer', 'libdir']
|
||||
|
||||
def __init__(self, filname: str, libdir: str) -> None:
|
||||
"""Initialize an OCaml .install file parser.
|
||||
|
||||
:param str filname: name of the .install file to parse
|
||||
:param str libdir: the OCaml library directory
|
||||
"""
|
||||
self.pkgname = os.path.splitext(os.path.basename(filname))[0]
|
||||
self.lexer = InstallFileLexer(filname)
|
||||
self.libdir = libdir
|
||||
|
||||
def __iter__(self) -> Iterator[tuple[str, bool, str, str]]:
|
||||
"""Parse a .install file.
|
||||
If there are any parse errors, we assume this file is not really an
|
||||
opam .install file and abandon the parse.
|
||||
"""
|
||||
# Map opam installer names to directories
|
||||
opammap: dict[str, str] = {
|
||||
'lib': os.path.join(self.libdir, self.pkgname),
|
||||
'lib_root': self.libdir,
|
||||
'libexec': os.path.join(self.libdir, self.pkgname),
|
||||
'libexec_root': self.libdir,
|
||||
'bin': '/usr/bin',
|
||||
'sbin': '/usr/sbin',
|
||||
'toplevel': os.path.join(self.libdir, 'toplevel'),
|
||||
'share': os.path.join('/usr/share', self.pkgname),
|
||||
'share_root': '/usr/share',
|
||||
'etc': os.path.join('/etc', self.pkgname),
|
||||
'doc': os.path.join('/usr/doc', self.pkgname),
|
||||
'stublibs': os.path.join(self.libdir, 'stublibs'),
|
||||
'man': '/usr/share/man'
|
||||
}
|
||||
|
||||
# Parse the file
|
||||
try:
|
||||
toktyp, token = next(self.lexer)
|
||||
while toktyp == TokenType.FIELD:
|
||||
libname = token
|
||||
toktyp, token = next(self.lexer)
|
||||
if toktyp != TokenType.COLON:
|
||||
return
|
||||
|
||||
toktyp, token = next(self.lexer)
|
||||
if toktyp != TokenType.LBRACK:
|
||||
return
|
||||
|
||||
directory = opammap.get(libname)
|
||||
if not directory:
|
||||
return
|
||||
|
||||
toktyp, token = next(self.lexer)
|
||||
while toktyp == TokenType.STRING:
|
||||
source = token
|
||||
optional = source[0] == '?'
|
||||
if optional:
|
||||
source = source[1:]
|
||||
nexttp, nexttk = next(self.lexer)
|
||||
if nexttp == TokenType.LBRACE:
|
||||
nexttp, nexttk = next(self.lexer)
|
||||
if nexttp == TokenType.STRING:
|
||||
filname = os.path.join(directory, nexttk)
|
||||
bracetp, bractk = next(self.lexer)
|
||||
if bracetp != TokenType.RBRACE:
|
||||
return
|
||||
nexttp, nexttk = next(self.lexer)
|
||||
else:
|
||||
return
|
||||
elif libname == 'man':
|
||||
index = token.rfind('.')
|
||||
if index < 0:
|
||||
return
|
||||
mandir = os.path.join(directory, 'man' + token[index+1:])
|
||||
filname = os.path.join(mandir, os.path.basename(token))
|
||||
else:
|
||||
filname = os.path.join(directory, os.path.basename(token))
|
||||
toktyp, token = nexttp, nexttk
|
||||
yield (self.pkgname, optional, source, filname)
|
||||
|
||||
if toktyp != TokenType.RBRACK:
|
||||
return
|
||||
toktyp, token = next(self.lexer)
|
||||
except StopIteration:
|
||||
return
|
||||
|
||||
def install_files(buildroot: str, libdir: str) -> None:
|
||||
"""Install the files listed in opam .install files in the buildroot.
|
||||
|
||||
For some projects, there are install files in both the project root
|
||||
directory and somewhere under "_build", so be careful not to parse the same
|
||||
install file twice.
|
||||
|
||||
:param str buildroot: path to the buildroot
|
||||
:param str libdir: the OCaml library directory
|
||||
"""
|
||||
install_files = set()
|
||||
for path, dirs, files in os.walk('.'):
|
||||
for f in files:
|
||||
if f.endswith('.install') and f not in install_files:
|
||||
install_files.add(f)
|
||||
parser = InstallFileParser(os.path.join(path, f), libdir)
|
||||
for _, optional, source, filname in parser:
|
||||
if not optional or os.path.exists(source):
|
||||
installpath = os.path.join(buildroot, filname[1:])
|
||||
os.makedirs(os.path.dirname(installpath), exist_ok=True)
|
||||
shutil.copy2(source, installpath)
|
||||
|
||||
def get_package_map(buildroot: str, libdir: str, devel: bool) -> dict[str, set[str]]:
|
||||
"""Create a map from package names to installed files from the opam .install
|
||||
files in the buildroot.
|
||||
|
||||
For some projects, there are install files in both the project root
|
||||
directory and somewhere under "_build", so be careful not to parse the same
|
||||
install file twice."""
|
||||
|
||||
pmap: dict[str, set[str]] = dict()
|
||||
install_files = set()
|
||||
|
||||
def add_pkg(pkgname: str, filname: str) -> None:
|
||||
"""Add a mapping from a package name to a filename.
|
||||
|
||||
:param str pkgname: the package that acts as the map key
|
||||
:param str filname: the filename to add to the package set
|
||||
"""
|
||||
if pkgname not in pmap:
|
||||
pmap[pkgname] = set()
|
||||
pmap[pkgname].add(filname)
|
||||
|
||||
installed = find_buildroot_all(buildroot, devel, False)
|
||||
for path, dirs, files in os.walk('.'):
|
||||
for f in files:
|
||||
if f.endswith('.install') and f not in install_files:
|
||||
install_files.add(f)
|
||||
parser = InstallFileParser(os.path.join(path, f), libdir)
|
||||
for pkgname, _, _, filname in parser:
|
||||
if filname in installed[0]:
|
||||
if filname.startswith('/usr/share/man'):
|
||||
add_pkg(pkgname, filname + '*')
|
||||
else:
|
||||
add_pkg(pkgname, filname)
|
||||
dirname = os.path.dirname(filname)
|
||||
if dirname in installed[1]:
|
||||
add_pkg(pkgname, '%dir ' + dirname)
|
||||
installed[1].remove(dirname)
|
||||
elif filname in installed[2]:
|
||||
if filname.startswith('/usr/share/man'):
|
||||
add_pkg(pkgname + '-devel', filname + '*')
|
||||
else:
|
||||
add_pkg(pkgname + '-devel', filname)
|
||||
dirname = os.path.dirname(filname)
|
||||
if dirname in installed[3]:
|
||||
add_pkg(pkgname + '-devel', '%dir ' + dirname)
|
||||
installed[3].remove(dirname)
|
||||
return pmap
|
||||
|
||||
#
|
||||
# MAIN INTERFACE
|
||||
#
|
||||
|
||||
def ocaml_files(no_devel: bool, separate: bool, install: bool, buildroot: str,
|
||||
libdir: str) -> None:
|
||||
"""Generate %files lists from an installed buildroot.
|
||||
|
||||
:param bool no_devel: False to split files into a main package and a devel
|
||||
package
|
||||
:param bool separate: True to place each OCaml module in an RPM package
|
||||
:param bool install: True to install files, False to generate %files
|
||||
:param str buildroot: the installed buildroot
|
||||
:param str libdir: the OCaml library directory
|
||||
"""
|
||||
if install:
|
||||
install_files(buildroot, libdir)
|
||||
elif separate:
|
||||
pkgmap = get_package_map(buildroot, libdir, not no_devel)
|
||||
for pkg in pkgmap:
|
||||
with open('.ofiles-' + pkg, 'w') as f:
|
||||
for entry in pkgmap[pkg]:
|
||||
f.write(entry + '\n')
|
||||
elif no_devel:
|
||||
with open('.ofiles', 'w') as f:
|
||||
for entry in find_buildroot_toplevel(buildroot):
|
||||
f.write(entry + '\n')
|
||||
else:
|
||||
files = find_buildroot_all(buildroot, True, True)
|
||||
with open('.ofiles', 'w') as f:
|
||||
for entry in files[0]:
|
||||
f.write(entry + '\n')
|
||||
for entry in files[1]:
|
||||
f.write('%dir ' + entry + '\n')
|
||||
with open('.ofiles-devel', 'w') as f:
|
||||
for entry in files[2]:
|
||||
f.write(entry + '\n')
|
||||
for entry in files[3]:
|
||||
f.write('%dir ' + entry + '\n')
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description='Support for building OCaml RPM packages')
|
||||
parser.add_argument('-i', '--install',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help='install files instead of generating %%files')
|
||||
parser.add_argument('-n', '--no-devel',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help='suppress creation of a devel subpackage')
|
||||
parser.add_argument('-s', '--separate',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help='separate packaging. Each OCaml module is in a distinct RPM package. All modules are in a single RPM package by default.')
|
||||
parser.add_argument('-v', '--version',
|
||||
action='version',
|
||||
version=f'%(prog)s {str(version)}')
|
||||
parser.add_argument('buildroot', help='RPM build root')
|
||||
parser.add_argument('libdir', help='OCaml library directory')
|
||||
args = parser.parse_args()
|
||||
ocaml_files(args.no_devel,
|
||||
args.separate,
|
||||
args.install,
|
||||
args.buildroot,
|
||||
args.libdir)
|
||||
2
sources
2
sources
|
|
@ -1 +1 @@
|
|||
SHA512 (ocaml-4.14.0.tar.gz) = 3c5e5b9f00bb109dd99b5f7b0078cf8663d4247e548f3e601d6b2a55582e04bb20f6de85005c4cf2f78ae9aaa449f5ca6f2bab2f6ce83eeb3aeb386e3f2fcc32
|
||||
SHA512 (ocaml-5.5.0.tar.gz) = bf13c18cd1fc7b2e5e9623024ea8623710f646ff2fbc0f59dab70e4d4318ed8623bdcc3ec59ce37af07af2b767f520dea23fb474c26297b3e858b6c8e080b4e6
|
||||
|
|
|
|||
10
tests/basic-test.sh
Executable file
10
tests/basic-test.sh
Executable file
|
|
@ -0,0 +1,10 @@
|
|||
#!/bin/bash -
|
||||
set -e
|
||||
set -x
|
||||
|
||||
# Compile a trivial program and run it.
|
||||
echo 'print_endline "hello, world"' > hello.ml
|
||||
ocamlc.opt hello.ml -o hello
|
||||
./hello
|
||||
ocamlopt.opt hello.ml -o hello
|
||||
./hello
|
||||
11
tests/tests.yml
Executable file
11
tests/tests.yml
Executable file
|
|
@ -0,0 +1,11 @@
|
|||
- hosts: localhost
|
||||
roles:
|
||||
- role: standard-test-basic
|
||||
tags:
|
||||
- classic
|
||||
required_packages:
|
||||
- ocaml
|
||||
tests:
|
||||
- simple:
|
||||
dir: .
|
||||
run: ./basic-test.sh
|
||||
Loading…
Add table
Add a link
Reference in a new issue