Compare commits

...

No commits in common. "c8s" and "c10s" have entirely different histories.
c8s ... c10s

23 changed files with 2118 additions and 3093 deletions

10
.gitignore vendored
View File

@ -1,2 +1,8 @@
SOURCES/ocaml-4.07.0.tar.xz /.build*.log
/ocaml-4.07.0.tar.xz /clog
/ocaml-*.tar.bz2
/ocaml-*.tar.gz
/ocaml-*.tar.xz
/ocaml-*-refman.pdf
/4.11.0.tar.gz
/4.13.1.tar.gz

View File

@ -0,0 +1,90 @@
From 5538fa66e94fad3d2b4f110d23bef3b4d2d6342c Mon Sep 17 00:00:00 2001
From: Florian Angeletti <florian.angeletti@inria.fr>
Date: Mon, 13 May 2024 11:39:37 +0200
Subject: [PATCH 1/7] Changes: synchronisation and consistency with trunk
---
Changes | 25 ++++++++++++++-----------
1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/Changes b/Changes
index 208d5e8697..1af198ba77 100644
--- a/Changes
+++ b/Changes
@@ -140,9 +140,6 @@ OCaml 5.2.0
(Guillaume Munch-Maccagnoni, bug reports and suggestion by Mark
Shinwell, review by Nick Barnes and Stephen Dolan)
-- #12876: Port ThreadSanitizer support to Linux on POWER
- (Miod Vallat, review by Tim McGilchrist)
-
- #12408: `Domain.spawn` no longer leaks its functional argument for
the whole duration of the children domain lifetime.
(Guillaume Munch-Maccagnoni, review by Gabriel Scherer)
@@ -156,8 +153,10 @@ OCaml 5.2.0
review by Damien Doligez, Sébastien Hinderer, Jacques-Henri Jourdan, Luc
Maranget, Guillaume Munch-Maccagnoni, Gabriel Scherer)
-- #11911, #12381: Restore statmemprof functionality in part
- (API changes in Gc.Memprof). (Nick Barnes)
+- #11911, #12381: Restore statmemprof functionality in part, with
+ some API changes in Gc.Memprof.
+ (Nick Barnes, review by Jacques-Henri Jourdan
+ and Guillaume Munch-Maccagnoni).
- #12430: Simplify dynamic bytecode loading in Meta.reify_bytecode
(Stephen Dolan, review by Sébastien Hinderer, Vincent Laviron and Xavier
@@ -216,9 +215,10 @@ OCaml 5.2.0
Ojeda Bar)
- #11911, #12382, #12383: Restore statmemprof functionality in part
- (backtrace buffers, per-thread and per-domain data structures).
- (Nick Barnes, review by Gabriel Scherer, Fabrice Buoro, Sadiq
- Jaffer, and Guillaume Munch-Maccagnoni).
+ (backtrace buffers, per-thread and per-domain data structures,
+ GC/allocation interface). (Nick Barnes, review by Gabriel Scherer,
+ Fabrice Buoro, Sadiq Jaffer, Guillaume Munch-Maccagnoni, and
+ Jacques-Henri Jourdan).
- #12735: Store both ends of the stack chain in continuations
(Leo White, review by Miod Vallat and KC Sivaramakrishnan)
@@ -248,6 +248,9 @@ OCaml 5.2.0
Hari Hara Naveen S, reviewed by Fabrice Buoro, Gabriel Scherer and
Miod Vallat)
+- #12876: Port ThreadSanitizer support to Linux on POWER
+ (Miod Vallat, review by Tim McGilchrist)
+
- #12886: Reinitialize IO mutexes after fork
(Max Slater, review by Guillaume Munch-Maccagnoni and Xavier Leroy)
@@ -990,7 +993,7 @@ OCaml 5.1.0 (14 September 2023)
`Seq.find_mapi`, `Seq.find_index`, `Array.find_mapi`, `Array.find_index`,
`Float.Array.find_opt`, `Float.Array.find_index`, `Float.Array.find_map`,
`Float.Array.find_mapi`.
- (Sima Kinsart, review by Daniel Bünzli and Nicolás Ojeda Bär)
+ (Tima Kinsart, review by Daniel Bünzli and Nicolás Ojeda Bär)
- #11410: Add Set.to_list, Map.to_list, Map.of_list,
`Map.add_to_list: key -> 'a -> 'a list t -> 'a list t`.
@@ -1771,7 +1774,7 @@ Some of those changes will benefit all OCaml packages.
- #11846: Mark rbx as destroyed at C call for Win64 (mingw-w64 and Cygwin64).
Reserve the shadow store for the ABI in the c_stack_link struct instead of
- explictly when calling C functions. This simultaneously reduces the number of
+ explicitly when calling C functions. This simultaneously reduces the number of
stack pointer manipulations and also fixes a bug when calling noalloc
functions where the shadow store was not being reserved.
(David Allsopp, report by Vesa Karvonen, review by Xavier Leroy and
@@ -2791,7 +2794,7 @@ OCaml 4.14.0 (28 March 2022)
- #8516: Change representation of class signatures
(Leo White, review by Thomas Refis)
-- #9444: -dtypedtree, print more explictly extra nodes in pattern ast.
+- #9444: -dtypedtree, print more explicitly extra nodes in pattern ast.
(Frédéric Bour, review by Gabriel Scherer)
- #10337: Normalize type_expr nodes on access
--
2.44.0

View File

@ -1,27 +0,0 @@
From 8ddacdf1283fe3d7054f51a4b764bc6b44d7a342 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/8] Don't add rpaths to libraries.
---
tools/Makefile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/tools/Makefile b/tools/Makefile
index 78d2a1068..fbec019ed 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -157,8 +157,8 @@ $(call byte_and_opt,ocamlmklib,ocamlmklibconfig.cmo config.cmo misc.cmo \
ocamlmklibconfig.ml: ../config/Makefile Makefile
(echo 'let bindir = "$(BINDIR)"'; \
echo 'let supports_shared_libraries = $(SUPPORTS_SHARED_LIBRARIES)';\
- echo 'let default_rpath = "$(RPATH)"'; \
- echo 'let mksharedlibrpath = "$(MKSHAREDLIBRPATH)"'; \
+ echo 'let default_rpath = ""'; \
+ echo 'let mksharedlibrpath = ""'; \
echo 'let toolpref = "$(TOOLPREF)"'; \
sed -n -e 's/^#ml //p' ../config/Makefile) \
> ocamlmklibconfig.ml
--
2.17.1

View File

@ -0,0 +1,515 @@
From 7a20c9322f827923baa6a9907998f670463ce447 Mon Sep 17 00:00:00 2001
From: Florian Angeletti <florian.angeletti@inria.fr>
Date: Mon, 13 May 2024 14:28:08 +0200
Subject: [PATCH 2/7] Changes copy-editing
---
Changes | 398 ++++++++++++++++++++++++++++----------------------------
1 file changed, 201 insertions(+), 197 deletions(-)
diff --git a/Changes b/Changes
index 1af198ba77..75842fc216 100644
--- a/Changes
+++ b/Changes
@@ -1,5 +1,5 @@
-OCaml 5.2.0
-------------
+OCaml 5.2.0 (13 May 2024)
+-------------------------
(Changes that can break existing programs are marked with a "*")
@@ -12,60 +12,6 @@ OCaml 5.2.0
- #12667: extend the latter to POWER 64 bits, big-endian, ELFv2 ABI
(A. Wilcox, review by Xavier Leroy)
-### Language features:
-
-- #12295, #12568: Give `while true' a polymorphic type, similarly to
- `assert false'
- (Jeremy Yallop, review by Nicolás Ojeda Bär and Gabriel Scherer,
- suggestion by Rodolphe Lepigre and John Whitington)
-
-- #12315: Use type annotations from arguments in let rec
- (Stephen Dolan, review by Gabriel Scherer)
-
-- #11252, RFC 27: Support raw identifier syntax \#foo
- (Stephen Dolan, review by David Allsopp, Gabriel Scherer and Olivier Nicole)
-
-- #12044: Add local module open syntax for types.
- ```
- module A = struct
- type t = int
- type r = unit
- type s = string
- end
-
- type example = A.(t * r * s)
- ```
- (Alistair O'Brien, review by Gabriel Scherer, Nicolás Ojeda Bär
- and Florian Angeletti)
-
-- #12456: Document the incompatibility between effects on the one
- hand, and `caml_callback` and asynchronous callbacks (signal
- handlers, finalisers, memprof callbacks...) on the other hand.
- (Guillaume Munch-Maccagnoni, review by KC Sivaramakrishnan)
-
-- #12375: allow use of [@untagged] for all immediate types like char, bool,
- and variant with only constant constructors.
- (Christophe Raffalli, review by Gabriel Scherer)
-
-* #12502: the compiler now normalizes the newline sequence \r\n to
- a single \n character during lexing, to guarantee that the semantics
- of newlines in string literals is not modified by Windows tools
- transforming \n into \r\n in source files.
- Warning 29 [eol-in-string] is not emitted anymore, as the normalization
- gives a more robust semantics to newlines in string literals.
- (Gabriel Scherer and Damien Doligez, review by Daniel Bünzli, David
- Allsopp, Andreas Rossberg, Xavier Leroy, report by Andreas Rossberg)
-
-- #13130: minor fixes to pprintast for raw identifiers and local module open
- syntax for types.
- (Chet Murthy, review by Gabriel Scherer)
-
-### Type system:
-
-- #12313, #11799: Do not re-build as-pattern type when a ground type annotation
- is given. This allows to work around problems with GADTs in as-patterns.
- (Jacques Garrigue, report by Leo White, review by Gabriel Scherer)
-
### Runtime system:
- #12193: Re-introduce GC compaction for shared pools
@@ -76,6 +22,12 @@ OCaml 5.2.0
David Allsopp, Miod Vallat, Artem Pianykh, Stephen Dolan, Mark Shinwell
and KC Sivaramakrishnan)
+- #12114: Add ThreadSanitizer support
+ (Fabrice Buoro and Olivier Nicole, based on an initial work by Anmol Sahoo,
+ review by Damien Doligez, Sébastien Hinderer, Jacques-Henri Jourdan, Luc
+ Maranget, Guillaume Munch-Maccagnoni, Gabriel Scherer)
+
+
- #12850: Update Gc.quick_stat data at the end of major cycles and compaction
This PR adds an additional caml_collect_gc_stats_sample_stw to the major heap
cycling stw. This means that Gc.quick_stat now actually reflects the state of
@@ -148,11 +100,6 @@ OCaml 5.2.0
arise at specific locations during domain creation and shutdown.
(Guillaume Munch-Maccagnoni, review by Gabriel Scherer)
-- #12114: Add ThreadSanitizer support
- (Fabrice Buoro and Olivier Nicole, based on an initial work by Anmol Sahoo,
- review by Damien Doligez, Sébastien Hinderer, Jacques-Henri Jourdan, Luc
- Maranget, Guillaume Munch-Maccagnoni, Gabriel Scherer)
-
- #11911, #12381: Restore statmemprof functionality in part, with
some API changes in Gc.Memprof.
(Nick Barnes, review by Jacques-Henri Jourdan
@@ -264,34 +211,48 @@ OCaml 5.2.0
(Olivier Nicole, suggested by Stephen Dolan, review by Gabriel Scherer,
Miod Vallat and Damien Doligez)
-### Code generation and optimizations:
+### Language features:
-- #11239: on x86-64 and RISC-V, reduce alignment of OCaml stacks from 16 to 8.
- This reduces stack usage. It's only C stacks that require 16-alignment.
- (Xavier Leroy, review by Gabriel Scherer and Stephen Dolan)
+- #12295, #12568: Give `while true' a polymorphic type, similarly to
+ `assert false'
+ (Jeremy Yallop, review by Nicolás Ojeda Bär and Gabriel Scherer,
+ suggestion by Rodolphe Lepigre and John Whitington)
-- #12311: on POWER, 32-bit FP numbers stored in memory (e.g. in bigarrays)
- were not correctly rounded sometimes.
- (Xavier Leroy, review by Anil Madhavapeddy and Tim McGilchrist)
+- #12044: Add local module open syntax for types.
+ ```
+ module A = struct
+ type t = int
+ type r = unit
+ type s = string
+ end
-- #12551, #12608, #12782, #12596: Overhaul of recursive value compilation.
- Non-function recursive bindings are now forbidden from Lambda onwards,
- and compiled using a new Value_rec_compiler module.
- (Vincent Laviron and Lunia Ayanides, review by Gabriel Scherer,
- Stefan Muenzel and Nathanaëlle Courant)
+ type example = A.(t * r * s)
+ ```
+ (Alistair O'Brien, review by Gabriel Scherer, Nicolás Ojeda Bär
+ and Florian Angeletti)
-- #1809, #12181: rewrite `compare x y op 0` to `x op y` when values are integers
- (Xavier Clerc, Stefan Muenzel, review by Gabriel Scherer and Vincent Laviron)
+- #11252, RFC 27: Support raw identifier syntax \#foo
+ (Stephen Dolan, review by David Allsopp, Gabriel Scherer and Olivier Nicole)
-- #12825: disable common subexpression elimination for atomic loads... again.
- (Gabriel Scherer, review by KC Sivaramakrishnan, Xavier Leroy
- and Vincent Laviron, report by Vesa Karvonen)
+
+- #12315: Use type annotations from arguments in let rec
+ (Stephen Dolan, review by Gabriel Scherer)
+
+- #12375: allow use of [@untagged] for all immediate types like char, bool,
+ and variant with only constant constructors.
+ (Christophe Raffalli, review by Gabriel Scherer)
+
+* #12502: the compiler now normalizes the newline sequence \r\n to
+ a single \n character during lexing, to guarantee that the semantics
+ of newlines in string literals is not modified by Windows tools
+ transforming \n into \r\n in source files.
+ Warning 29 [eol-in-string] is not emitted anymore, as the normalization
+ gives a more robust semantics to newlines in string literals.
+ (Gabriel Scherer and Damien Doligez, review by Daniel Bünzli, David
+ Allsopp, Andreas Rossberg, Xavier Leroy, report by Andreas Rossberg)
### Standard library:
-- #12716: Add `Format.pp_print_nothing` function.
- (Léo Andrès, review by Gabriel Scherer and Nicolás Ojeda Bär)
-
- #11563: Add the Dynarray module to the stdlib. Dynamic arrays are
arrays whose length can be changed by adding or removing elements at
the end, similar to 'vectors' in C++ or Rust.
@@ -299,6 +260,10 @@ OCaml 5.2.0
Daniel Bünzli, Guillaume Munch-Maccagnoni, Clément Allain,
Damien Doligez, Wiktor Kuchta and Pieter Goetschalckx)
+
+- #12716: Add `Format.pp_print_nothing` function.
+ (Léo Andrès, review by Gabriel Scherer and Nicolás Ojeda Bär)
+
* #6732, #12423: Make Buffer.add_substitute surjective and fix its
documentation.
(Damien Doligez, review by Antonin Décimo)
@@ -380,6 +345,35 @@ OCaml 5.2.0
C API.
(David Allsopp, review by Nicolás Ojeda Bär and Xavier Leroy)
+### Type system:
+
+- #12313, #11799: Do not re-build as-pattern type when a ground type annotation
+ is given. This allows to work around problems with GADTs in as-patterns.
+ (Jacques Garrigue, report by Leo White, review by Gabriel Scherer)
+
+### Code generation and optimizations:
+
+- #11239: on x86-64 and RISC-V, reduce alignment of OCaml stacks from 16 to 8.
+ This reduces stack usage. It's only C stacks that require 16-alignment.
+ (Xavier Leroy, review by Gabriel Scherer and Stephen Dolan)
+
+- #12311: on POWER, 32-bit FP numbers stored in memory (e.g. in bigarrays)
+ were not correctly rounded sometimes.
+ (Xavier Leroy, review by Anil Madhavapeddy and Tim McGilchrist)
+
+- #12551, #12608, #12782, #12596: Overhaul of recursive value compilation.
+ Non-function recursive bindings are now forbidden from Lambda onwards,
+ and compiled using a new Value_rec_compiler module.
+ (Vincent Laviron and Lunia Ayanides, review by Gabriel Scherer,
+ Stefan Muenzel and Nathanaëlle Courant)
+
+- #1809, #12181: rewrite `compare x y op 0` to `x op y` when values are integers
+ (Xavier Clerc, Stefan Muenzel, review by Gabriel Scherer and Vincent Laviron)
+
+- #12825: disable common subexpression elimination for atomic loads... again.
+ (Gabriel Scherer, review by KC Sivaramakrishnan, Xavier Leroy
+ and Vincent Laviron, report by Vesa Karvonen)
+
### Other libraries:
- #12213: Dynlink library, improve legibility of error messages
@@ -390,98 +384,14 @@ OCaml 5.2.0
instead of `value`.
(Xavier Leroy, review by David Allsopp)
-### Tools:
-
-- #12340: testsuite: collect known issues with current -short-paths
- implementation for existential types
- (Florian Angeletti, Samuel Hym, review by Florian Angeletti and Thomas Refis)
-
-- #12147: ocamllex: Allow carriage returns at the end of line directives.
- (SeungCheol Jung, review by Nicolás Ojeda Bär)
-
-- #12260: Fix invalid_argument on some external or module aliases in ocamlnat
- (Fabian Hemmer, review by Vincent Laviron)
-
-- #12185: New script language for ocamltest.
- (Damien Doligez with Florian Angeletti, Sébastien Hinderer, Gabriel Scherer,
- review by Sébastien Hinderer and Gabriel Scherer)
-
-- #12371: ocamltest: fix recursive expansion of variables.
- (Antonin Décimo, Damien Doligez, review by Sébastien Hinderer,
- Damien Doligez, Gabriel Scherer, and Xavier Leroy)
-
-* #12497, #12613: Make ocamlc/ocamlopt fail with an error when no
- input files are specified to build an executable.
- (Antonin Décimo, review by Sébastien Hinderer)
-
-- #12576: ocamldep: various refactors.
- (Antonin Décimo, review by Florian Angeletti, Gabriel Scherer, and Léo Andrès)
-
-- #12615: ocamldoc: get rid of the odoc_literate and odoc_todo generators.
- (Sébaistien Hinderer, review by Gabriel Scherer and Florian Angeletti)
-
-- #12624: Use $XDG_CONFIG_DIRS in addition to $XDG_CONFIG_HOME when searching
- for init.ml and use this to extend init.ml support to the toplevel when
- running on Windows.
- (David Allsopp, report by Jonah Beckford, review by Nicolás Ojeda Bär and
- Antonin Décimo)
-
-- #12688: Setting the env variable `NO_COLOR` with an empty value no longer
- has effects. Previously, setting `NO_COLOR` with any value, including
- the empty value, would disable colors (unless `OCAML_COLOR` is also set).
- After this change, the user must set `NO_COLOR` with an non-empty value
- to disable colors. This reflects a specification clarification/change
- from the upstream website at https://no-color.org.
- (Favonia, review by Gabriel Scherer)
-
-- #12744: ocamltest: run tests in recursive subdirs more eagerly
- (Nick Roberts, review by Nicolás Ojeda Bär)
-
-- #12901, 12908: ocamllex: add overflow checks to prevent generating incorrect
- lexers; use unsigned numbers in the table encoding when possible.
- (Vincent Laviron, report by Edwin Török, review by Xavier Leroy)
-
-### Manual and documentation:
-
-- #12338: clarification of the documentation of process related function in
- the unix module regarding the first element of args and shell's pid.
- (Christophe Raffalli, review by Florian Angeletti)
-
-- #12473: Document in runtime/memory.c our current understanding of
- accesses to the OCaml heap from the C runtime code -- the problem
- of hybrid programs mixing two memory models.
- (Gabriel Scherer and Guillaume Munch-Maccagnoni, review by Olivier
- Nicole and Xavier Leroy)
-
-- #12694: Document in runtime/tsan.c the TSan instrumentation choices and the
- consequences with regard to the memory model.
- (Olivier Nicole, review by Miod Vallat, Gabriel Scherer, Guillaume
- Munch-Maccagnoni and Fabrice Buoro)
-
-- #12802: Add manual chapter about ThreadSanitizer support
- (Olivier Nicole, review by Miod Vallat, Sebastien Hinderer, Fabrice Buoro,
- Gabriel Scherer and KC Sivaramakrishnan)
-
-- #12819: Clarify which runtime interactions are allowed in custom ops
- (Basile Clément, review by Guillaume Munch-Maccagnoni and Xavier Leroy)
-
-- #12840: manual: update runtime tracing chapter for custom events (ex #12335)
- (Lucas Pluvinage, Sadiq Jaffer and Olivier Nicole, review by Gabriel Scherer,
- David Allsopp, Tim McGilchrist and Thomas Leonard)
-
-- #13066, update OCAMLRUNPARAM documentation for the stack size parameter l
- (Florian Angeletti, review by Nicolás Ojeda Bär, Tim McGilchrist, and
- Miod Vallat)
-
-- #13078: update Format tutorial on structural boxes to mention alignment
- questions.
- (Edwin Török, review by Florian Angeletti)
-
-- #13092: document the existence of the `[@@poll error]` built-in attribute
- (Florian Angeletti, review by Gabriel Scherer)
-
### Compiler user-interface and warnings:
+- #11989, #12246, RFC 31: New flag, -H, to allow for transitive dependencies
+ without including them in the initial environment.
+ (Chris Casinghino, François Bobot, and Gabriel Scherer, review by Leo White
+ and Stefan Muenzel, RFC by François Bobot)
+
+
* #10613, #12405: Simplify the values used for the system variable (`system:` in
`ocamlopt -config` or the `Config.system` constant). In particular, s390x and
ppc64 now report "linux" instead of "elf"; all variants of 32-bit ARM on Linux
@@ -493,11 +403,6 @@ OCaml 5.2.0
(David Allsopp, request by Kate Deplaix, review by Sébastien Hinderer and
Xavier Leroy)
-- #11989, #12246, RFC 31: New flag, -H, to allow for transitive dependencies
- without including them in the initial environment.
- (Chris Casinghino, François Bobot, and Gabriel Scherer, review by Leo White
- and Stefan Muenzel, RFC by François Bobot)
-
- #12247: configure: --disable-ocamldebug can now be used instead
of --disable-debugger (which remains available for compatibility)
(Gabriel Scherer, review by Damien Doligez and Sébastien Hinderer)
@@ -546,9 +451,125 @@ OCaml 5.2.0
* #12942: Fix an line ordering in some module inclusion error messages
(Nick Roberts, review by Florian Angeletti, report by Carl Eastlund)
+### Manual and documentation:
+
+- #12338: clarification of the documentation of process related function in
+ the unix module regarding the first element of args and shell's pid.
+ (Christophe Raffalli, review by Florian Angeletti)
+
+- #12473: Document in runtime/memory.c our current understanding of
+ accesses to the OCaml heap from the C runtime code -- the problem
+ of hybrid programs mixing two memory models.
+ (Gabriel Scherer and Guillaume Munch-Maccagnoni, review by Olivier
+ Nicole and Xavier Leroy)
+
+- #12456: Document the incompatibility between effects on the one
+ hand, and `caml_callback` and asynchronous callbacks (signal
+ handlers, finalisers, memprof callbacks...) on the other hand.
+ (Guillaume Munch-Maccagnoni, review by KC Sivaramakrishnan)
+
+- #12694: Document in runtime/tsan.c the TSan instrumentation choices and the
+ consequences with regard to the memory model.
+ (Olivier Nicole, review by Miod Vallat, Gabriel Scherer, Guillaume
+ Munch-Maccagnoni and Fabrice Buoro)
+
+- #12802: Add manual chapter about ThreadSanitizer support
+ (Olivier Nicole, review by Miod Vallat, Sebastien Hinderer, Fabrice Buoro,
+ Gabriel Scherer and KC Sivaramakrishnan)
+
+- #12819: Clarify which runtime interactions are allowed in custom ops
+ (Basile Clément, review by Guillaume Munch-Maccagnoni and Xavier Leroy)
+
+- #12840: manual: update runtime tracing chapter for custom events (ex #12335)
+ (Lucas Pluvinage, Sadiq Jaffer and Olivier Nicole, review by Gabriel Scherer,
+ David Allsopp, Tim McGilchrist and Thomas Leonard)
+
+- #13066, update OCAMLRUNPARAM documentation for the stack size parameter l
+ (Florian Angeletti, review by Nicolás Ojeda Bär, Tim McGilchrist, and
+ Miod Vallat)
+
+- #13078: update Format tutorial on structural boxes to mention alignment
+ questions.
+ (Edwin Török, review by Florian Angeletti)
+
+- #13092: document the existence of the `[@@poll error]` built-in attribute
+ (Florian Angeletti, review by Gabriel Scherer)
+
+### Tools:
+
+- #12340: testsuite: collect known issues with current -short-paths
+ implementation for existential types
+ (Florian Angeletti, Samuel Hym, review by Florian Angeletti and Thomas Refis)
+
+- #12147: ocamllex: Allow carriage returns at the end of line directives.
+ (SeungCheol Jung, review by Nicolás Ojeda Bär)
+
+- #12260: Fix invalid_argument on some external or module aliases in ocamlnat
+ (Fabian Hemmer, review by Vincent Laviron)
+
+- #12185: New script language for ocamltest.
+ (Damien Doligez with Florian Angeletti, Sébastien Hinderer, Gabriel Scherer,
+ review by Sébastien Hinderer and Gabriel Scherer)
+
+- #12371: ocamltest: fix recursive expansion of variables.
+ (Antonin Décimo, Damien Doligez, review by Sébastien Hinderer,
+ Damien Doligez, Gabriel Scherer, and Xavier Leroy)
+
+* #12497, #12613: Make ocamlc/ocamlopt fail with an error when no
+ input files are specified to build an executable.
+ (Antonin Décimo, review by Sébastien Hinderer)
+
+- #12576: ocamldep: various refactors.
+ (Antonin Décimo, review by Florian Angeletti, Gabriel Scherer, and Léo Andrès)
+
+- #12615: ocamldoc: get rid of the odoc_literate and odoc_todo generators.
+ (Sébaistien Hinderer, review by Gabriel Scherer and Florian Angeletti)
+
+- #12624: Use $XDG_CONFIG_DIRS in addition to $XDG_CONFIG_HOME when searching
+ for init.ml and use this to extend init.ml support to the toplevel when
+ running on Windows.
+ (David Allsopp, report by Jonah Beckford, review by Nicolás Ojeda Bär and
+ Antonin Décimo)
+
+- #12688: Setting the env variable `NO_COLOR` with an empty value no longer
+ has effects. Previously, setting `NO_COLOR` with any value, including
+ the empty value, would disable colors (unless `OCAML_COLOR` is also set).
+ After this change, the user must set `NO_COLOR` with an non-empty value
+ to disable colors. This reflects a specification clarification/change
+ from the upstream website at https://no-color.org.
+ (Favonia, review by Gabriel Scherer)
+
+- #12744: ocamltest: run tests in recursive subdirs more eagerly
+ (Nick Roberts, review by Nicolás Ojeda Bär)
+
+- #12901, 12908: ocamllex: add overflow checks to prevent generating incorrect
+ lexers; use unsigned numbers in the table encoding when possible.
+ (Vincent Laviron, report by Edwin Török, review by Xavier Leroy)
### Internal/compiler-libs changes:
+- #12508 : Add compiler-side support for project-wide occurrences in Merlin, by
+ generating index tables of all identifier occurrences. This extra data in .cmt
+ files is only added when the new flag -bin-annot-occurrences is passed.
+ (Ulysse Gérard, Nathanaëlle Courant, suggestions by Gabriel Scherer and Thomas
+ Refis, review by Florian Angeletti, Gabriel Scherer and Thomas Refis)
+
+- #12236, #12386, #12391, #12496, #12673: Use syntax as sole determiner of arity
+ This changes function arity to be based solely on the source program's
+ parsetree. Previously, the heuristic for arity had more subtle heuristics
+ that involved type information about patterns. Function arity is important
+ because it determines when a pattern match's effects run and is an input
+ into the fast path for function application.
+
+ This change affects tooling: it changes the function constructs in parsetree
+ and typedtree.
+
+ See https://github.com/ocaml/RFCs/pull/32 for the original RFC.
+
+ (Nick Roberts; review by Richard Eisenberg, Leo White, and Gabriel Scherer;
+ RFC by Stephen Dolan)
+
+
- #12639: parsing: Attach a location to the RHS of Ptyp_alias
and improve the 'alias type mismatch' error message.
(Jules Aguillon, review by Florian Angeletti)
@@ -583,21 +604,6 @@ OCaml 5.2.0
in Typecore in favor of local mutable state.
(Nick Roberts, review by Takafumi Saikawa)
-- #12236, #12386, #12391, #12496, #12673: Use syntax as sole determiner of arity
- This changes function arity to be based solely on the source program's
- parsetree. Previously, the heuristic for arity had more subtle heuristics
- that involved type information about patterns. Function arity is important
- because it determines when a pattern match's effects run and is an input
- into the fast path for function application.
-
- This change affects tooling: it changes the function constructs in parsetree
- and typedtree.
-
- See https://github.com/ocaml/RFCs/pull/32 for the original RFC.
-
- (Nick Roberts; review by Richard Eisenberg, Leo White, and Gabriel Scherer;
- RFC by Stephen Dolan)
-
- #12542: Minor bugfix to #12236: restore dropped call to `instance`
(Nick Roberts, review by Jacques Garrigue)
@@ -650,12 +656,6 @@ OCaml 5.2.0
- #12764: Move all installable headers in `caml/` sub-directories.
(Antonin Décimo, review by Gabriel Scherer and David Allsopp)
-- #12508 : Add compiler-side support for project-wide occurrences in Merlin, by
- generating index tables of all identifier occurrences. This extra data in .cmt
- files is only added when the new flag -bin-annot-occurrences is passed.
- (Ulysse Gérard, Nathanaëlle Courant, suggestions by Gabriel Scherer and Thomas
- Refis, review by Florian Angeletti, Gabriel Scherer and Thomas Refis)
-
- #12914: Slightly change the s390x assembly dialect in order to build with
Clang's integrated assembler.
(Miod Vallat, review by Gabriel Scherer)
@@ -888,6 +888,10 @@ OCaml 5.2.0
- #13094: Fix undefined behavior of left-shifting a negative number.
(Antonin Décimo, review by Miod Vallat and Nicolás Ojeda Bär)
+- #13130: minor fixes to pprintast for raw identifiers and local module open
+ syntax for types.
+ (Chet Murthy, review by Gabriel Scherer)
+
OCaml 5.1.1 (8 December 2023)
----------------------------
--
2.44.0

View File

@ -1,240 +0,0 @@
From 118057a71576cb39d71633bf80a37815bf4ff932 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 29 May 2012 20:40:36 +0100
Subject: [PATCH 2/8] ocamlbyteinfo, ocamlplugininfo: Useful utilities from
Debian, sent upstream.
See:
http://git.debian.org/?p=pkg-ocaml-maint/packages/ocaml.git;a=tree;f=debian/ocamlbyteinfo;hb=HEAD
---
ocamlbyteinfo.ml | 101 +++++++++++++++++++++++++++++++++++++++++
ocamlplugininfo.ml | 109 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 210 insertions(+)
create mode 100644 ocamlbyteinfo.ml
create mode 100644 ocamlplugininfo.ml
diff --git a/ocamlbyteinfo.ml b/ocamlbyteinfo.ml
new file mode 100644
index 000000000..0a537e4d5
--- /dev/null
+++ b/ocamlbyteinfo.ml
@@ -0,0 +1,101 @@
+(***********************************************************************)
+(* *)
+(* Objective Caml *)
+(* *)
+(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *)
+(* *)
+(* Copyright 2009 Institut National de Recherche en Informatique et *)
+(* en Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU Library General Public License, with *)
+(* the special exception on linking described in file ../../LICENSE. *)
+(* *)
+(***********************************************************************)
+
+(* $Id$ *)
+
+(* Dumps a bytecode binary file *)
+
+open Sys
+open Dynlinkaux
+
+let input_stringlist ic len =
+ let get_string_list sect len =
+ let rec fold s e acc =
+ if e != len then
+ if sect.[e] = '\000' then
+ fold (e+1) (e+1) (String.sub sect s (e-s) :: acc)
+ else fold s (e+1) acc
+ else acc
+ in fold 0 0 []
+ in
+ let sect = Bytes.create len in
+ let _ = really_input ic sect 0 len in
+ get_string_list (Bytes.to_string sect) len
+
+let print = Printf.printf
+let perr s =
+ Printf.eprintf "%s\n" s;
+ exit(1)
+let p_title title = print "%s:\n" title
+
+let p_section title format pdata = function
+ | [] -> ()
+ | l ->
+ p_title title;
+ List.iter
+ (fun (name, data) -> print format (pdata data) name)
+ l
+
+let p_list title format = function
+ | [] -> ()
+ | l ->
+ p_title title;
+ List.iter
+ (fun name -> print format name)
+ l
+
+let _ =
+ try
+ let input_name = Sys.argv.(1) in
+ let ic = open_in_bin input_name in
+ Bytesections.read_toc ic;
+ List.iter
+ (fun section ->
+ try
+ let len = Bytesections.seek_section ic section in
+ if len > 0 then match section with
+ | "CRCS" ->
+ p_section
+ "Imported Units"
+ "\t%s\t%s\n"
+ Digest.to_hex
+ (input_value ic : (string * Digest.t) list)
+ | "DLLS" ->
+ p_list
+ "Used Dlls" "\t%s\n"
+ (input_stringlist ic len)
+ | "DLPT" ->
+ p_list
+ "Additional Dll paths"
+ "\t%s\n"
+ (input_stringlist ic len)
+ | "PRIM" ->
+ let prims = (input_stringlist ic len) in
+ print "Uses unsafe features: ";
+ begin match prims with
+ [] -> print "no\n"
+ | l -> print "YES\n";
+ p_list "Primitives declared in this module"
+ "\t%s\n"
+ l
+ end
+ | _ -> ()
+ with Not_found | Failure _ | Invalid_argument _ -> ()
+ )
+ ["CRCS"; "DLLS"; "DLPT"; "PRIM"];
+ close_in ic
+ with
+ | Sys_error msg ->
+ perr msg
+ | Invalid_argument("index out of bounds") ->
+ perr (Printf.sprintf "Usage: %s filename" Sys.argv.(0))
diff --git a/ocamlplugininfo.ml b/ocamlplugininfo.ml
new file mode 100644
index 000000000..e28800f31
--- /dev/null
+++ b/ocamlplugininfo.ml
@@ -0,0 +1,109 @@
+(***********************************************************************)
+(* *)
+(* Objective Caml *)
+(* *)
+(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *)
+(* *)
+(* Copyright 2009 Institut National de Recherche en Informatique et *)
+(* en Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU Library General Public License, with *)
+(* the special exception on linking described in file ../../LICENSE. *)
+(* *)
+(***********************************************************************)
+
+(* $Id$ *)
+
+(* Dumps a .cmxs file *)
+
+open Natdynlink
+open Format
+
+let file =
+ try
+ Sys.argv.(1)
+ with _ -> begin
+ Printf.eprintf "Usage: %s file.cmxs\n" Sys.argv.(0);
+ exit(1)
+ end
+
+exception Abnormal_exit
+
+let error s e =
+ let eprint = Printf.eprintf in
+ let print_exc s = function
+ | End_of_file ->
+ eprint "%s: %s\n" s file
+ | Abnormal_exit ->
+ eprint "%s\n" s
+ | e -> eprint "%s\n" (Printexc.to_string e)
+ in
+ print_exc s e;
+ exit(1)
+
+let read_in command =
+ let cmd = Printf.sprintf command file in
+ let ic = Unix.open_process_in cmd in
+ try
+ let line = input_line ic in
+ begin match (Unix.close_process_in ic) with
+ | Unix.WEXITED 0 -> Str.split (Str.regexp "[ ]+") line
+ | Unix.WEXITED _ | Unix.WSIGNALED _ | Unix.WSTOPPED _ ->
+ error
+ (Printf.sprintf
+ "Command \"%s\" exited abnormally"
+ cmd
+ )
+ Abnormal_exit
+ end
+ with e -> error "File is empty" e
+
+let get_offset adr_off adr_sec =
+ try
+ let adr = List.nth adr_off 4 in
+ let off = List.nth adr_off 5 in
+ let sec = List.hd adr_sec in
+
+ let (!) x = Int64.of_string ("0x" ^ x) in
+ let (+) = Int64.add in
+ let (-) = Int64.sub in
+
+ Int64.to_int (!off + !sec - !adr)
+
+ with Failure _ | Invalid_argument _ ->
+ error
+ "Command output doesn't have the expected format"
+ Abnormal_exit
+
+let print_infos name crc defines cmi cmx =
+ let print_name_crc (name, crc) =
+ printf "@ %s (%s)" name (Digest.to_hex crc)
+ in
+ let pr_imports ppf imps = List.iter print_name_crc imps in
+ printf "Name: %s@." name;
+ printf "CRC of implementation: %s@." (Digest.to_hex crc);
+ printf "@[<hov 2>Globals defined:";
+ List.iter (fun s -> printf "@ %s" s) defines;
+ printf "@]@.";
+ printf "@[<v 2>Interfaces imported:%a@]@." pr_imports cmi;
+ printf "@[<v 2>Implementations imported:%a@]@." pr_imports cmx
+
+let _ =
+ let adr_off = read_in "objdump -h %s | grep ' .data '" in
+ let adr_sec = read_in "objdump -T %s | grep ' caml_plugin_header$'" in
+
+ let ic = open_in file in
+ let _ = seek_in ic (get_offset adr_off adr_sec) in
+ let header = (input_value ic : Natdynlink.dynheader) in
+ if header.magic <> Natdynlink.dyn_magic_number then
+ raise(Error(Natdynlink.Not_a_bytecode_file file))
+ else begin
+ List.iter
+ (fun ui ->
+ print_infos
+ ui.name
+ ui.crc
+ ui.defines
+ ui.imports_cmi
+ ui.imports_cmx)
+ header.units
+ end
--
2.17.1

View File

@ -0,0 +1,25 @@
From 507a1382cb82160c2a6cfc0ea5bcb3e33ece7307 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 3/7] Don't add rpaths to libraries.
---
configure.ac | 2 --
1 file changed, 2 deletions(-)
diff --git a/configure.ac b/configure.ac
index 0c9d63859a..48aa9f0a29 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1221,8 +1221,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.44.0

View File

@ -1,27 +0,0 @@
From 8ddd2fb4909bf6ed1a3506723126432da8fcf0c4 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 3/8] configure: Allow user defined C compiler flags.
---
configure | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/configure b/configure
index 1316b3c1e..53f45f85b 100755
--- a/configure
+++ b/configure
@@ -2050,6 +2050,10 @@ if $flat_float_array; then
echo "#define FLAT_FLOAT_ARRAY" >> m.h
fi
+# Allow user defined C Compiler flags
+bytecccompopts="$bytecccompopts $CFLAGS"
+nativecccompopts="$nativecccompopts $CFLAGS"
+
# Finish generated files
cclibs="$cclibs $mathlib"
--
2.17.1

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,45 @@
From edd903fc73b98eb784b307a47110985967cb1d09 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 4/7] configure: Allow user defined C compiler flags.
---
configure.ac | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/configure.ac b/configure.ac
index 48aa9f0a29..fc29c88f50 100644
--- a/configure.ac
+++ b/configure.ac
@@ -869,6 +869,10 @@ AS_CASE([$ocaml_cc_vendor],
internal_cflags="$cc_warnings"],
[common_cflags="-O"])
+# Allow CFLAGS and LDFLAGS to be added.
+common_cflags="$common_cflags $CFLAGS"
+cclibs="$cclibs $LDFLAGS"
+
# Enable SSE2 on x86 mingw to avoid using 80-bit registers.
AS_CASE([$host],
[i686-*-mingw32*],
@@ -2648,7 +2652,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"])
@@ -2674,7 +2678,7 @@ ${mkdll_ldflags}"
],[
mkdll_ldflags='$(OC_DLL_LDFLAGS) $(LDFLAGS)'
mkdll_ldflags_exp="${oc_dll_ldflags}"
- AS_IF([test -n ${LDFLAGS}],
+ AS_IF([test -n "${LDFLAGS}"],
[mkdll_ldflags_exp="$mkdll_ldflags_exp $LDFLAGS"])
mkexe_ldflags="\$(OC_LDFLAGS) \$(LDFLAGS)"
mkexe_ldflags_exp="${oc_ldflags} ${LDFLAGS}"
--
2.44.0

View File

@ -1,717 +0,0 @@
From 2e4038b6b8073f55012613f18cb19a4c99e8219d Mon Sep 17 00:00:00 2001
From: Nicolas Ojeda Bar <n.oje.bar@gmail.com>
Date: Fri, 1 Dec 2017 14:39:46 +0100
Subject: [PATCH 5/8] Copyright, untabify
---
asmrun/riscv.S | 608 ++++++++++++++++++++++++-------------------------
1 file changed, 304 insertions(+), 304 deletions(-)
diff --git a/asmrun/riscv.S b/asmrun/riscv.S
index a82048efc..88d7ab924 100644
--- a/asmrun/riscv.S
+++ b/asmrun/riscv.S
@@ -4,7 +4,7 @@
/* */
/* Nicolas Ojeda Bar <n.oje.bar@gmail.com> */
/* */
-/* Copyright 1996 Institut National de Recherche en Informatique et */
+/* Copyright 2017 Institut National de Recherche en Informatique et */
/* en Automatique. All rights reserved. This file is distributed */
/* under the terms of the GNU Library General Public License, with */
/* the special exception on linking described in file ../LICENSE. */
@@ -37,388 +37,388 @@
.option nopic
#endif
- .section .text
+ .section .text
/* Invoke the garbage collector. */
- .globl caml_system__code_begin
+ .globl caml_system__code_begin
caml_system__code_begin:
- .align 2
- .globl caml_call_gc
- .type caml_call_gc, @function
+ .align 2
+ .globl caml_call_gc
+ .type caml_call_gc, @function
caml_call_gc:
/* Record return address */
- store ra, caml_last_return_address, TMP0
+ store ra, caml_last_return_address, TMP0
/* Record lowest stack address */
- mv TMP1, sp
- store sp, caml_bottom_of_stack, TMP0
+ mv TMP1, sp
+ store sp, caml_bottom_of_stack, TMP0
.Lcaml_call_gc:
- /* Set up stack space, saving return address */
+ /* Set up stack space, saving return address */
/* (1 reg for RA, 1 reg for FP, 21 allocatable int regs, 20 caller-save float regs) * 8 */
/* + 1 for alignment */
- addi sp, sp, -0x160
- mv s0, sp
- store ra, 0x8(sp)
- store s0, 0x0(sp)
+ addi sp, sp, -0x160
+ mv s0, sp
+ store ra, 0x8(sp)
+ store s0, 0x0(sp)
/* Save allocatable integer registers on the stack,
in the order given in proc.ml */
- store a0, 0x10(sp)
- store a1, 0x18(sp)
- store a2, 0x20(sp)
- store a3, 0x28(sp)
- store a4, 0x30(sp)
- store a5, 0x38(sp)
- store a6, 0x40(sp)
- store a7, 0x48(sp)
- store s2, 0x50(sp)
- store s3, 0x58(sp)
- store s4, 0x60(sp)
- store s5, 0x68(sp)
- store s6, 0x70(sp)
- store s7, 0x78(sp)
- store s8, 0x80(sp)
- store s9, 0x88(sp)
- store t2, 0x90(sp)
- store t3, 0x98(sp)
- store t4, 0xa0(sp)
- store t5, 0xa8(sp)
- store t6, 0xb0(sp)
+ store a0, 0x10(sp)
+ store a1, 0x18(sp)
+ store a2, 0x20(sp)
+ store a3, 0x28(sp)
+ store a4, 0x30(sp)
+ store a5, 0x38(sp)
+ store a6, 0x40(sp)
+ store a7, 0x48(sp)
+ store s2, 0x50(sp)
+ store s3, 0x58(sp)
+ store s4, 0x60(sp)
+ store s5, 0x68(sp)
+ store s6, 0x70(sp)
+ store s7, 0x78(sp)
+ store s8, 0x80(sp)
+ store s9, 0x88(sp)
+ store t2, 0x90(sp)
+ store t3, 0x98(sp)
+ store t4, 0xa0(sp)
+ store t5, 0xa8(sp)
+ store t6, 0xb0(sp)
/* Save caller-save floating-point registers on the stack
(callee-saves are preserved by caml_garbage_collection) */
- fsd ft0, 0xb8(sp)
- fsd ft1, 0xc0(sp)
- fsd ft2, 0xc8(sp)
- fsd ft3, 0xd0(sp)
- fsd ft4, 0xd8(sp)
- fsd ft5, 0xe0(sp)
- fsd ft6, 0xe8(sp)
- fsd ft7, 0xf0(sp)
- fsd fa0, 0xf8(sp)
- fsd fa1, 0x100(sp)
- fsd fa2, 0x108(sp)
- fsd fa3, 0x110(sp)
- fsd fa4, 0x118(sp)
- fsd fa5, 0x120(sp)
- fsd fa6, 0x128(sp)
- fsd fa7, 0x130(sp)
- fsd ft8, 0x138(sp)
- fsd ft9, 0x140(sp)
- fsd ft9, 0x148(sp)
- fsd ft10, 0x150(sp)
- fsd ft11, 0x158(sp)
+ fsd ft0, 0xb8(sp)
+ fsd ft1, 0xc0(sp)
+ fsd ft2, 0xc8(sp)
+ fsd ft3, 0xd0(sp)
+ fsd ft4, 0xd8(sp)
+ fsd ft5, 0xe0(sp)
+ fsd ft6, 0xe8(sp)
+ fsd ft7, 0xf0(sp)
+ fsd fa0, 0xf8(sp)
+ fsd fa1, 0x100(sp)
+ fsd fa2, 0x108(sp)
+ fsd fa3, 0x110(sp)
+ fsd fa4, 0x118(sp)
+ fsd fa5, 0x120(sp)
+ fsd fa6, 0x128(sp)
+ fsd fa7, 0x130(sp)
+ fsd ft8, 0x138(sp)
+ fsd ft9, 0x140(sp)
+ fsd ft9, 0x148(sp)
+ fsd ft10, 0x150(sp)
+ fsd ft11, 0x158(sp)
/* Store pointer to saved integer registers in caml_gc_regs */
- addi TMP1, sp, 16
- store TMP1, caml_gc_regs, TMP0
+ addi TMP1, sp, 16
+ store TMP1, caml_gc_regs, TMP0
/* Save current allocation pointer for debugging purposes */
- store ALLOC_PTR, caml_young_ptr, TMP0
+ store ALLOC_PTR, caml_young_ptr, TMP0
/* Save trap pointer in case an exception is raised during GC */
- store TRAP_PTR, caml_exception_pointer, TMP0
+ store TRAP_PTR, caml_exception_pointer, TMP0
/* Call the garbage collector */
- call caml_garbage_collection
+ call caml_garbage_collection
/* Restore registers */
- load a0, 0x10(sp)
- load a1, 0x18(sp)
- load a2, 0x20(sp)
- load a3, 0x28(sp)
- load a4, 0x30(sp)
- load a5, 0x38(sp)
- load a6, 0x40(sp)
- load a7, 0x48(sp)
- load s2, 0x50(sp)
- load s3, 0x58(sp)
- load s4, 0x60(sp)
- load s5, 0x68(sp)
- load s6, 0x70(sp)
- load s7, 0x78(sp)
- load s8, 0x80(sp)
- load s9, 0x88(sp)
- load t2, 0x90(sp)
- load t3, 0x98(sp)
- load t4, 0xa0(sp)
- load t5, 0xa8(sp)
- load t6, 0xb0(sp)
- fld ft0, 0xb8(sp)
- fld ft1, 0xc0(sp)
- fld ft2, 0xc8(sp)
- fld ft3, 0xd0(sp)
- fld ft4, 0xd8(sp)
- fld ft5, 0xe0(sp)
- fld ft6, 0xe8(sp)
- fld ft7, 0xf0(sp)
- fld fa0, 0xf8(sp)
- fld fa1, 0x100(sp)
- fld fa2, 0x108(sp)
- fld fa3, 0x110(sp)
- fld fa4, 0x118(sp)
- fld fa5, 0x120(sp)
- fld fa6, 0x128(sp)
- fld fa7, 0x130(sp)
- fld ft8, 0x138(sp)
- fld ft9, 0x140(sp)
- fld ft9, 0x148(sp)
- fld ft10, 0x150(sp)
- fld ft11, 0x158(sp)
+ load a0, 0x10(sp)
+ load a1, 0x18(sp)
+ load a2, 0x20(sp)
+ load a3, 0x28(sp)
+ load a4, 0x30(sp)
+ load a5, 0x38(sp)
+ load a6, 0x40(sp)
+ load a7, 0x48(sp)
+ load s2, 0x50(sp)
+ load s3, 0x58(sp)
+ load s4, 0x60(sp)
+ load s5, 0x68(sp)
+ load s6, 0x70(sp)
+ load s7, 0x78(sp)
+ load s8, 0x80(sp)
+ load s9, 0x88(sp)
+ load t2, 0x90(sp)
+ load t3, 0x98(sp)
+ load t4, 0xa0(sp)
+ load t5, 0xa8(sp)
+ load t6, 0xb0(sp)
+ fld ft0, 0xb8(sp)
+ fld ft1, 0xc0(sp)
+ fld ft2, 0xc8(sp)
+ fld ft3, 0xd0(sp)
+ fld ft4, 0xd8(sp)
+ fld ft5, 0xe0(sp)
+ fld ft6, 0xe8(sp)
+ fld ft7, 0xf0(sp)
+ fld fa0, 0xf8(sp)
+ fld fa1, 0x100(sp)
+ fld fa2, 0x108(sp)
+ fld fa3, 0x110(sp)
+ fld fa4, 0x118(sp)
+ fld fa5, 0x120(sp)
+ fld fa6, 0x128(sp)
+ fld fa7, 0x130(sp)
+ fld ft8, 0x138(sp)
+ fld ft9, 0x140(sp)
+ fld ft9, 0x148(sp)
+ fld ft10, 0x150(sp)
+ fld ft11, 0x158(sp)
/* Reload new allocation pointer and allocation limit */
- load ALLOC_PTR, caml_young_ptr
- load ALLOC_LIMIT, caml_young_limit
+ load ALLOC_PTR, caml_young_ptr
+ load ALLOC_LIMIT, caml_young_limit
/* Free stack space and return to caller */
- load ra, 0x8(sp)
- load s0, 0x0(sp)
- addi sp, sp, 0x160
+ load ra, 0x8(sp)
+ load s0, 0x0(sp)
+ addi sp, sp, 0x160
ret
- .size caml_call_gc, .-caml_call_gc
+ .size caml_call_gc, .-caml_call_gc
/* Call a C function from OCaml */
/* Function to call is in ARG */
- .align 2
- .globl caml_c_call
- .type caml_c_call, @function
+ .align 2
+ .globl caml_c_call
+ .type caml_c_call, @function
caml_c_call:
/* Preserve return address in callee-save register s2 */
- mv s2, ra
+ mv s2, ra
/* Record lowest stack address and return address */
- store ra, caml_last_return_address, TMP0
- store sp, caml_bottom_of_stack, TMP0
+ store ra, caml_last_return_address, TMP0
+ store sp, caml_bottom_of_stack, TMP0
/* Make the exception handler alloc ptr available to the C code */
- store ALLOC_PTR, caml_young_ptr, TMP0
- store TRAP_PTR, caml_exception_pointer, TMP0
+ store ALLOC_PTR, caml_young_ptr, TMP0
+ store TRAP_PTR, caml_exception_pointer, TMP0
/* Call the function */
- jalr ARG
+ jalr ARG
/* Reload alloc ptr and alloc limit */
- load ALLOC_PTR, caml_young_ptr
- load TRAP_PTR, caml_exception_pointer
+ load ALLOC_PTR, caml_young_ptr
+ load TRAP_PTR, caml_exception_pointer
/* Return */
- jr s2
- .size caml_c_call, .-caml_c_call
+ jr s2
+ .size caml_c_call, .-caml_c_call
/* Raise an exception from OCaml */
- .align 2
- .globl caml_raise_exn
- .type caml_raise_exn, @function
+ .align 2
+ .globl caml_raise_exn
+ .type caml_raise_exn, @function
caml_raise_exn:
/* Test if backtrace is active */
- load TMP1, caml_backtrace_active
- bnez TMP1, 2f
+ load TMP1, caml_backtrace_active
+ bnez TMP1, 2f
1: /* Cut stack at current trap handler */
- mv sp, TRAP_PTR
+ mv sp, TRAP_PTR
/* Pop previous handler and jump to it */
- load TMP1, 8(sp)
- load TRAP_PTR, 0(sp)
- addi sp, sp, 16
- jr TMP1
+ load TMP1, 8(sp)
+ load TRAP_PTR, 0(sp)
+ addi sp, sp, 16
+ jr TMP1
2: /* Preserve exception bucket in callee-save register s2 */
- mv s2, a0
+ mv s2, a0
/* Stash the backtrace */
- mv a1, ra
- mv a2, sp
- mv a3, TRAP_PTR
- call caml_stash_backtrace
+ mv a1, ra
+ mv a2, sp
+ mv a3, TRAP_PTR
+ call caml_stash_backtrace
/* Restore exception bucket and raise */
- mv a0, s2
- j 1b
- .size caml_raise_exn, .-caml_raise_exn
+ mv a0, s2
+ j 1b
+ .size caml_raise_exn, .-caml_raise_exn
- .globl caml_reraise_exn
- .type caml_reraise_exn, @function
+ .globl caml_reraise_exn
+ .type caml_reraise_exn, @function
/* Raise an exception from C */
- .align 2
- .globl caml_raise_exception
- .type caml_raise_exception, @function
+ .align 2
+ .globl caml_raise_exception
+ .type caml_raise_exception, @function
caml_raise_exception:
- load TRAP_PTR, caml_exception_pointer
- load ALLOC_PTR, caml_young_ptr
- load ALLOC_LIMIT, caml_young_limit
- load TMP1, caml_backtrace_active
- bnez TMP1, 2f
+ load TRAP_PTR, caml_exception_pointer
+ load ALLOC_PTR, caml_young_ptr
+ load ALLOC_LIMIT, caml_young_limit
+ load TMP1, caml_backtrace_active
+ bnez TMP1, 2f
1: /* Cut stack at current trap handler */
- mv sp, TRAP_PTR
- load TMP1, 8(sp)
- load TRAP_PTR, 0(sp)
- addi sp, sp, 16
- jr TMP1
+ mv sp, TRAP_PTR
+ load TMP1, 8(sp)
+ load TRAP_PTR, 0(sp)
+ addi sp, sp, 16
+ jr TMP1
2: /* Preserve exception bucket in callee-save register s2 */
- mv s2, a0
- load a1, caml_last_return_address
- load a2, caml_bottom_of_stack
- mv a3, TRAP_PTR
- call caml_stash_backtrace
- mv a0, s2
- j 1b
- .size caml_raise_exception, .-caml_raise_exception
+ mv s2, a0
+ load a1, caml_last_return_address
+ load a2, caml_bottom_of_stack
+ mv a3, TRAP_PTR
+ call caml_stash_backtrace
+ mv a0, s2
+ j 1b
+ .size caml_raise_exception, .-caml_raise_exception
/* Start the OCaml program */
- .align 2
- .globl caml_start_program
- .type caml_start_program, @function
+ .align 2
+ .globl caml_start_program
+ .type caml_start_program, @function
caml_start_program:
- la ARG, caml_program
+ la ARG, caml_program
/* Code shared with caml_callback* */
/* Address of OCaml code to call is in ARG */
/* Arguments to the OCaml code are in a0 ... a7 */
.Ljump_to_caml:
- /* Set up stack frame and save callee-save registers */
- addi sp, sp, -0xd0
- store ra, 0xc0(sp)
- store s0, 0x0(sp)
- store s1, 0x8(sp)
- store s2, 0x10(sp)
- store s3, 0x18(sp)
- store s4, 0x20(sp)
- store s5, 0x28(sp)
- store s6, 0x30(sp)
- store s7, 0x38(sp)
- store s8, 0x40(sp)
- store s9, 0x48(sp)
- store s10, 0x50(sp)
- store s11, 0x58(sp)
- fsd fs0, 0x60(sp)
- fsd fs1, 0x68(sp)
- fsd fs2, 0x70(sp)
- fsd fs3, 0x78(sp)
- fsd fs4, 0x80(sp)
- fsd fs5, 0x88(sp)
- fsd fs6, 0x90(sp)
- fsd fs7, 0x98(sp)
- fsd fs8, 0xa0(sp)
- fsd fs9, 0xa8(sp)
- fsd fs10, 0xb0(sp)
- fsd fs11, 0xb8(sp)
- addi sp, sp, -32
+ /* Set up stack frame and save callee-save registers */
+ addi sp, sp, -0xd0
+ store ra, 0xc0(sp)
+ store s0, 0x0(sp)
+ store s1, 0x8(sp)
+ store s2, 0x10(sp)
+ store s3, 0x18(sp)
+ store s4, 0x20(sp)
+ store s5, 0x28(sp)
+ store s6, 0x30(sp)
+ store s7, 0x38(sp)
+ store s8, 0x40(sp)
+ store s9, 0x48(sp)
+ store s10, 0x50(sp)
+ store s11, 0x58(sp)
+ fsd fs0, 0x60(sp)
+ fsd fs1, 0x68(sp)
+ fsd fs2, 0x70(sp)
+ fsd fs3, 0x78(sp)
+ fsd fs4, 0x80(sp)
+ fsd fs5, 0x88(sp)
+ fsd fs6, 0x90(sp)
+ fsd fs7, 0x98(sp)
+ fsd fs8, 0xa0(sp)
+ fsd fs9, 0xa8(sp)
+ fsd fs10, 0xb0(sp)
+ fsd fs11, 0xb8(sp)
+ addi sp, sp, -32
/* Setup a callback link on the stack */
- load TMP1, caml_bottom_of_stack
- store TMP1, 0(sp)
- load TMP1, caml_last_return_address
- store TMP1, 8(sp)
- load TMP1, caml_gc_regs
- store TMP1, 16(sp)
- /* set up a trap frame */
- addi sp, sp, -16
- load TMP1, caml_exception_pointer
- store TMP1, 0(sp)
- lla TMP0, .Ltrap_handler
- store TMP0, 8(sp)
- mv TRAP_PTR, sp
- load ALLOC_PTR, caml_young_ptr
- load ALLOC_LIMIT, caml_young_limit
- store x0, caml_last_return_address, TMP0
- jalr ARG
-.Lcaml_retaddr: /* pop trap frame, restoring caml_exception_pointer */
- load TMP1, 0(sp)
- store TMP1, caml_exception_pointer, TMP0
- addi sp, sp, 16
-.Lreturn_result: /* pop callback link, restoring global variables */
- load TMP1, 0(sp)
- store TMP1, caml_bottom_of_stack, TMP0
- load TMP1, 8(sp)
- store TMP1, caml_last_return_address, TMP0
- load TMP1, 16(sp)
- store TMP1, caml_gc_regs, TMP0
- addi sp, sp, 32
- /* Update allocation pointer */
- store ALLOC_PTR, caml_young_ptr, TMP0
- /* reload callee-save registers and return */
- load ra, 0xc0(sp)
- load s0, 0x0(sp)
- load s1, 0x8(sp)
- load s2, 0x10(sp)
- load s3, 0x18(sp)
- load s4, 0x20(sp)
- load s5, 0x28(sp)
- load s6, 0x30(sp)
- load s7, 0x38(sp)
- load s8, 0x40(sp)
- load s9, 0x48(sp)
- load s10, 0x50(sp)
- load s11, 0x58(sp)
- fld fs0, 0x60(sp)
- fld fs1, 0x68(sp)
- fld fs2, 0x70(sp)
- fld fs3, 0x78(sp)
- fld fs4, 0x80(sp)
- fld fs5, 0x88(sp)
- fld fs6, 0x90(sp)
- fld fs7, 0x98(sp)
- fld fs8, 0xa0(sp)
- fld fs9, 0xa8(sp)
- fld fs10, 0xb0(sp)
- fld fs11, 0xb8(sp)
- addi sp, sp, 0xd0
- ret
+ load TMP1, caml_bottom_of_stack
+ store TMP1, 0(sp)
+ load TMP1, caml_last_return_address
+ store TMP1, 8(sp)
+ load TMP1, caml_gc_regs
+ store TMP1, 16(sp)
+ /* set up a trap frame */
+ addi sp, sp, -16
+ load TMP1, caml_exception_pointer
+ store TMP1, 0(sp)
+ lla TMP0, .Ltrap_handler
+ store TMP0, 8(sp)
+ mv TRAP_PTR, sp
+ load ALLOC_PTR, caml_young_ptr
+ load ALLOC_LIMIT, caml_young_limit
+ store x0, caml_last_return_address, TMP0
+ jalr ARG
+.Lcaml_retaddr: /* pop trap frame, restoring caml_exception_pointer */
+ load TMP1, 0(sp)
+ store TMP1, caml_exception_pointer, TMP0
+ addi sp, sp, 16
+.Lreturn_result: /* pop callback link, restoring global variables */
+ load TMP1, 0(sp)
+ store TMP1, caml_bottom_of_stack, TMP0
+ load TMP1, 8(sp)
+ store TMP1, caml_last_return_address, TMP0
+ load TMP1, 16(sp)
+ store TMP1, caml_gc_regs, TMP0
+ addi sp, sp, 32
+ /* Update allocation pointer */
+ store ALLOC_PTR, caml_young_ptr, TMP0
+ /* reload callee-save registers and return */
+ load ra, 0xc0(sp)
+ load s0, 0x0(sp)
+ load s1, 0x8(sp)
+ load s2, 0x10(sp)
+ load s3, 0x18(sp)
+ load s4, 0x20(sp)
+ load s5, 0x28(sp)
+ load s6, 0x30(sp)
+ load s7, 0x38(sp)
+ load s8, 0x40(sp)
+ load s9, 0x48(sp)
+ load s10, 0x50(sp)
+ load s11, 0x58(sp)
+ fld fs0, 0x60(sp)
+ fld fs1, 0x68(sp)
+ fld fs2, 0x70(sp)
+ fld fs3, 0x78(sp)
+ fld fs4, 0x80(sp)
+ fld fs5, 0x88(sp)
+ fld fs6, 0x90(sp)
+ fld fs7, 0x98(sp)
+ fld fs8, 0xa0(sp)
+ fld fs9, 0xa8(sp)
+ fld fs10, 0xb0(sp)
+ fld fs11, 0xb8(sp)
+ addi sp, sp, 0xd0
+ ret
.Ltrap_handler:
- store TRAP_PTR, caml_exception_pointer, TMP0
- ori a0, a0, 2
- j .Lreturn_result
- .size caml_start_program, .-caml_start_program
+ store TRAP_PTR, caml_exception_pointer, TMP0
+ ori a0, a0, 2
+ j .Lreturn_result
+ .size caml_start_program, .-caml_start_program
/* Callback from C to OCaml */
- .align 2
- .globl caml_callback_exn
- .type caml_callback_exn, @function
+ .align 2
+ .globl caml_callback_exn
+ .type caml_callback_exn, @function
caml_callback_exn:
/* Initial shuffling of arguments (a0 = closure, a1 = first arg) */
- mv TMP1, a0
- mv a0, a1 /* a0 = first arg */
- mv a1, TMP1 /* a1 = closure environment */
- load ARG, 0(TMP1) /* code pointer */
- j .Ljump_to_caml
- .size caml_callback_exn, .-caml_callback_exn
+ mv TMP1, a0
+ mv a0, a1 /* a0 = first arg */
+ mv a1, TMP1 /* a1 = closure environment */
+ load ARG, 0(TMP1) /* code pointer */
+ j .Ljump_to_caml
+ .size caml_callback_exn, .-caml_callback_exn
- .align 2
- .globl caml_callback2_exn
- .type caml_callback2_exn, @function
+ .align 2
+ .globl caml_callback2_exn
+ .type caml_callback2_exn, @function
caml_callback2_exn:
/* Initial shuffling of arguments (a0 = closure, a1 = arg1, a2 = arg2) */
- mv TMP1, a0
- mv a0, a1
- mv a1, a2
- mv a2, TMP1
- la ARG, caml_apply2
- j .Ljump_to_caml
- .size caml_callback2_exn, .-caml_callback2_exn
+ mv TMP1, a0
+ mv a0, a1
+ mv a1, a2
+ mv a2, TMP1
+ la ARG, caml_apply2
+ j .Ljump_to_caml
+ .size caml_callback2_exn, .-caml_callback2_exn
- .align 2
- .globl caml_callback3_exn
- .type caml_callback3_exn, @function
+ .align 2
+ .globl caml_callback3_exn
+ .type caml_callback3_exn, @function
caml_callback3_exn:
/* Initial shuffling of argumnets */
/* (a0 = closure, a1 = arg1, a2 = arg2, a3 = arg3) */
- mv TMP1, a0
- mv a0, a1
- mv a1, a2
- mv a2, a3
- mv a3, TMP1
- la ARG, caml_apply3
- j .Ljump_to_caml
- .size caml_callback3_exn, .-caml_callback3_exn
+ mv TMP1, a0
+ mv a0, a1
+ mv a1, a2
+ mv a2, a3
+ mv a3, TMP1
+ la ARG, caml_apply3
+ j .Ljump_to_caml
+ .size caml_callback3_exn, .-caml_callback3_exn
- .align 2
- .globl caml_ml_array_bound_error
- .type caml_ml_array_bound_error, @function
+ .align 2
+ .globl caml_ml_array_bound_error
+ .type caml_ml_array_bound_error, @function
caml_ml_array_bound_error:
/* Load address of [caml_array_bound_error] in ARG */
- la ARG, caml_array_bound_error
+ la ARG, caml_array_bound_error
/* Call that function */
- j caml_c_call
+ j caml_c_call
- .globl caml_system__code_end
+ .globl caml_system__code_end
caml_system__code_end:
/* GC roots for callback */
- .section .data
- .align 3
- .globl caml_system__frametable
- .type caml_system__frametable, @object
+ .section .data
+ .align 3
+ .globl caml_system__frametable
+ .type caml_system__frametable, @object
caml_system__frametable:
- .quad 1 /* one descriptor */
- .quad .Lcaml_retaddr /* return address into callback */
- .short -1 /* negative frame size => use callback link */
- .short 0 /* no roots */
- .align 3
- .size caml_system__frametable, .-caml_system__frametable
+ .quad 1 /* one descriptor */
+ .quad .Lcaml_retaddr /* return address into callback */
+ .short -1 /* negative frame size => use callback link */
+ .short 0 /* no roots */
+ .align 3
+ .size caml_system__frametable, .-caml_system__frametable
--
2.17.1

View File

@ -0,0 +1,114 @@
From acdc441ff1acb5390467e649bc9a9bfddd7df774 Mon Sep 17 00:00:00 2001
From: Florian Weimer <fweimer@redhat.com>
Date: Thu, 9 May 2024 10:03:23 +0200
Subject: [PATCH 5/7] flambda: Improve transitive closure in
invariant_params_in_recursion (#13150)
The old implementation did not really exploit the sparseness of the
graph because it used newly discovered edges in later iterations.
The new implementation processes each original relation only once
per starting node, and does not re-process newly discovered relations.
(cherry picked from commit 787b4fbb5aaf3728de54ca240ba9ca0bf56ace60)
---
Changes | 5 ++
middle_end/flambda/invariant_params.ml | 66 ++++++++++----------------
2 files changed, 31 insertions(+), 40 deletions(-)
diff --git a/Changes b/Changes
index 75842fc216..d26512067d 100644
--- a/Changes
+++ b/Changes
@@ -1,6 +1,11 @@
OCaml 5.2.0 (13 May 2024)
-------------------------
+- #13150: improve a transitive-closure computation algorithm in the flambda
+ middle-end to avoid a compilation time blowup on Menhir-generated code
+ (Florian Weimer, review by Gabriel Scherer and Pierre Chambart,
+ report by Richard Jones)
+
(Changes that can break existing programs are marked with a "*")
### Restored and new backends:
diff --git a/middle_end/flambda/invariant_params.ml b/middle_end/flambda/invariant_params.ml
index 414d39310a..dba63970fd 100644
--- a/middle_end/flambda/invariant_params.ml
+++ b/middle_end/flambda/invariant_params.ml
@@ -65,47 +65,33 @@ let implies relation from to_ =
relation
let transitive_closure state =
- let union s1 s2 =
- match s1, s2 with
- | Top, _ | _, Top -> Top
- | Implication s1, Implication s2 ->
- Implication (Variable.Pair.Set.union s1 s2)
+ (* Depth-first search for all implications for one argument.
+ Arguments are moved from candidate to frontier, assuming
+ they are newly added to the result. *)
+ let rec loop candidate frontier result =
+ match (candidate, frontier) with
+ | ([], []) -> Implication result
+ | ([], frontier::fs) ->
+ (* Obtain fresh candidate for the frontier argument. *)
+ (match Variable.Pair.Map.find frontier state with
+ | exception Not_found -> loop [] fs result
+ | Top -> Top
+ | Implication candidate ->
+ loop (Variable.Pair.Set.elements candidate) fs result)
+ | (candidate::cs, frontier) ->
+ let result' = Variable.Pair.Set.add candidate result in
+ if result' != result then
+ (* Result change means candidate becomes part of frontier. *)
+ loop cs (candidate :: frontier) result'
+ else
+ loop cs frontier result
in
- let equal s1 s2 =
- match s1, s2 with
- | Top, Implication _ | Implication _, Top -> false
- | Top, Top -> true
- | Implication s1, Implication s2 -> Variable.Pair.Set.equal s1 s2
- in
- let update arg state =
- let original_set =
- try Variable.Pair.Map.find arg state with
- | Not_found -> Implication Variable.Pair.Set.empty
- in
- match original_set with
- | Top -> state
- | Implication arguments ->
- let set =
- Variable.Pair.Set.fold
- (fun orig acc->
- let set =
- try Variable.Pair.Map.find orig state with
- | Not_found -> Implication Variable.Pair.Set.empty in
- union set acc)
- arguments original_set
- in
- Variable.Pair.Map.add arg set state
- in
- let once state =
- Variable.Pair.Map.fold (fun arg _ state -> update arg state) state state
- in
- let rec fp state =
- let state' = once state in
- if Variable.Pair.Map.equal equal state state'
- then state
- else fp state'
- in
- fp state
+ Variable.Pair.Map.map
+ (fun set ->
+ match set with
+ | Top -> Top
+ | Implication set -> loop [] (Variable.Pair.Set.elements set) set)
+ state
(* CR-soon pchambart: to move to Flambda_utils and document
mshinwell: I think this calculation is basically the same as
--
2.44.0

View File

@ -0,0 +1,165 @@
From 8637cac022907501c3c0d941e07e436b70c9d4ac Mon Sep 17 00:00:00 2001
From: Miod Vallat <118974489+dustanddreams@users.noreply.github.com>
Date: Thu, 30 May 2024 09:57:41 +0000
Subject: [PATCH 6/7] Reload exception pointer register in caml_c_call*
The invoked code may end up causing caml_try_realloc_stack() to be invoked,
which in turn may replace the stack TRAP_PTR points to, leading to
either crashes with the debug runtime (thanks to the old stack contents
being overwritten) or all kinds of memory or control flow corruption otherwise.
Added test for stack reallocation in callback followed by exception raising.
(cherry picked from commit 6964d3a90f84402ed6066fb1821679435e063067)
(cherry picked from commit 1e8a91d305f1fa4668444fb1cce97952dbc39810)
---
Changes | 9 +++++++++
runtime/arm64.S | 6 ++++--
runtime/power.S | 6 ++++--
runtime/riscv.S | 6 ++++--
runtime/s390x.S | 5 +++--
testsuite/tests/callback/test1.ml | 5 +++++
6 files changed, 29 insertions(+), 8 deletions(-)
diff --git a/Changes b/Changes
index d26512067d..53bb5369b9 100644
--- a/Changes
+++ b/Changes
@@ -1,3 +1,12 @@
+OCaml 5.2 maintenance version
+-----------------------------
+
+- #13207: Be sure to reload the register caching the exception handler in
+ caml_c_call and caml_c_call_stack_args, as its value may have been changed
+ if the OCaml stack is expanded during a callback.
+ (Miod Vallat, report by Vesa Karvonen, review by Gabriel Scherer and
+ Xavier Leroy)
+
OCaml 5.2.0 (13 May 2024)
-------------------------
diff --git a/runtime/arm64.S b/runtime/arm64.S
index e71f25ebba..6c6495a0a8 100644
--- a/runtime/arm64.S
+++ b/runtime/arm64.S
@@ -569,8 +569,9 @@ FUNCTION(caml_c_call)
str TRAP_PTR, Caml_state(exn_handler)
/* Call the function */
blr ADDITIONAL_ARG
- /* Reload alloc ptr */
+ /* Reload new allocation pointer & exn handler */
ldr ALLOC_PTR, Caml_state(young_ptr)
+ ldr TRAP_PTR, Caml_state(exn_handler)
/* Load ocaml stack */
SWITCH_C_TO_OCAML
#if defined(WITH_THREAD_SANITIZER)
@@ -625,8 +626,9 @@ FUNCTION(caml_c_call_stack_args)
blr ADDITIONAL_ARG
/* Restore stack */
mov sp, x19
- /* Reload alloc ptr */
+ /* Reload new allocation pointer & exn handler */
ldr ALLOC_PTR, Caml_state(young_ptr)
+ ldr TRAP_PTR, Caml_state(exn_handler)
/* Switch from C to OCaml */
SWITCH_C_TO_OCAML
/* Return */
diff --git a/runtime/power.S b/runtime/power.S
index bfb37fa989..257678100e 100644
--- a/runtime/power.S
+++ b/runtime/power.S
@@ -445,8 +445,9 @@ FUNCTION caml_c_call
mr 2, C_CALL_TOC /* restore current TOC */
/* Restore return address (in register C_CALL_RET_ADDR, preserved by C) */
mtlr C_CALL_RET_ADDR
- /* Reload allocation pointer*/
+ /* Reload new allocation pointer and exception pointer */
ld ALLOC_PTR, Caml_state(young_ptr)
+ ld TRAP_PTR, Caml_state(exn_handler)
#if defined(WITH_THREAD_SANITIZER)
TSAN_SETUP_C_CALL 16
/* Save return value registers. Since the called function could be anything,
@@ -497,8 +498,9 @@ FUNCTION caml_c_call_stack_args
add SP, SP, STACK_ARG_BYTES
/* Restore return address (in register C_CALL_RET_ADDR, preserved by C) */
mtlr C_CALL_RET_ADDR
- /* Reload allocation pointer*/
+ /* Reload new allocation pointer and exception pointer */
ld ALLOC_PTR, Caml_state(young_ptr)
+ ld TRAP_PTR, Caml_state(exn_handler)
/* Switch from C to OCaml */
SWITCH_C_TO_OCAML
/* Return to caller */
diff --git a/runtime/riscv.S b/runtime/riscv.S
index a2eca7a315..8934db0bb3 100644
--- a/runtime/riscv.S
+++ b/runtime/riscv.S
@@ -516,8 +516,9 @@ L(caml_c_call):
sd TRAP_PTR, Caml_state(exn_handler)
/* Call the function */
jalr ADDITIONAL_ARG
- /* Reload alloc ptr */
+ /* Reload new allocation pointer & exn handler */
ld ALLOC_PTR, Caml_state(young_ptr)
+ ld TRAP_PTR, Caml_state(exn_handler)
/* Load ocaml stack */
SWITCH_C_TO_OCAML
#if defined(WITH_THREAD_SANITIZER)
@@ -575,8 +576,9 @@ FUNCTION(caml_c_call_stack_args)
jalr ADDITIONAL_ARG
/* Restore stack */
mv sp, s2
- /* Reload alloc ptr */
+ /* Reload new allocation pointer & exn handler */
ld ALLOC_PTR, Caml_state(young_ptr)
+ ld TRAP_PTR, Caml_state(exn_handler)
/* Switch from C to OCaml */
SWITCH_C_TO_OCAML
/* Return */
diff --git a/runtime/s390x.S b/runtime/s390x.S
index b59822ce57..113831a376 100644
--- a/runtime/s390x.S
+++ b/runtime/s390x.S
@@ -515,7 +515,7 @@ LBL(caml_c_call):
#endif
basr %r14, ADDITIONAL_ARG
CLEANUP_AFTER_C_CALL
- /* Reload alloc ptr */
+ /* Reload new allocation pointer & exn handler */
lg ALLOC_PTR, Caml_state(young_ptr)
lg TRAP_PTR, Caml_state(exn_handler)
/* Load ocaml stack and restore global variables */
@@ -584,8 +584,9 @@ LBL(106):
CLEANUP_AFTER_C_CALL
/* Restore stack */
lgr %r15, %r12
- /* Reload alloc ptr */
+ /* Reload new allocation pointer & exn handler */
lg ALLOC_PTR, Caml_state(young_ptr)
+ lg TRAP_PTR, Caml_state(exn_handler)
/* Switch from C to OCaml */
SWITCH_C_TO_OCAML
/* Return */
diff --git a/testsuite/tests/callback/test1.ml b/testsuite/tests/callback/test1.ml
index c39be0c586..f6ad4356cf 100644
--- a/testsuite/tests/callback/test1.ml
+++ b/testsuite/tests/callback/test1.ml
@@ -11,6 +11,9 @@ external mycallback3 : ('a -> 'b -> 'c -> 'd) -> 'a -> 'b -> 'c -> 'd
external mycallback4 :
('a -> 'b -> 'c -> 'd -> 'e) -> 'a -> 'b -> 'c -> 'd -> 'e = "mycallback4"
+let rec growstack n =
+ if n <= 0 then 0 else 1 + growstack (n - 1)
+
let rec tak (x, y, z as _tuple) =
if x > y then tak(tak (x-1, y, z), tak (y-1, z, x), tak (z-1, x, y))
else z
@@ -46,3 +49,5 @@ let _ =
print_int(trapexit ()); print_newline();
print_string(tripwire mypushroot); print_newline();
print_string(tripwire mycamlparam); print_newline();
+ begin try ignore (mycallback1 growstack 1_000); raise Exit
+ with Exit -> () end
--
2.44.0

View File

@ -1,25 +0,0 @@
From 207fbbc2616ee44e048dd5bb133e52f252cd1caf Mon Sep 17 00:00:00 2001
From: Nicolas Ojeda Bar <n.oje.bar@gmail.com>
Date: Sat, 2 Dec 2017 10:44:41 +0100
Subject: [PATCH 6/8] fix caml_c_call: reload caml_young_limit
---
asmrun/riscv.S | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/asmrun/riscv.S b/asmrun/riscv.S
index 88d7ab924..121f8ba71 100644
--- a/asmrun/riscv.S
+++ b/asmrun/riscv.S
@@ -187,7 +187,7 @@ caml_c_call:
jalr ARG
/* Reload alloc ptr and alloc limit */
load ALLOC_PTR, caml_young_ptr
- load TRAP_PTR, caml_exception_pointer
+ load ALLOC_LIMIT, caml_young_limit
/* Return */
jr s2
.size caml_c_call, .-caml_c_call
--
2.17.1

View File

@ -1,67 +0,0 @@
From a89427d52a20633be40056fe008b7eeec5ded7dd 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, 15 May 2018 07:17:06 +0000
Subject: [PATCH 7/8] Adapt to 4.07
---
asmcomp/riscv/emit.mlp | 28 +++++++++++++++++-----------
asmcomp/riscv/selection.ml | 2 +-
2 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/asmcomp/riscv/emit.mlp b/asmcomp/riscv/emit.mlp
index 51165d0f1..718dca080 100644
--- a/asmcomp/riscv/emit.mlp
+++ b/asmcomp/riscv/emit.mlp
@@ -461,19 +461,25 @@ let emit_instr i =
` {emit_string name} {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}, {emit_label lbl}\n`
| Iinttest_imm _ ->
fatal_error "Emit.emit_instr (Iinttest_imm _)"
- | Ifloattest(cmp, neg) ->
- let neg = match cmp with
- | Ceq -> ` feq.d {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; neg
- | Cne -> ` feq.d {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; not neg
- | Clt -> ` flt.d {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; neg
- | Cgt -> ` flt.d {emit_reg reg_tmp1}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}\n`; neg
- | Cle -> ` fle.d {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; neg
- | Cge -> ` fle.d {emit_reg reg_tmp1}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}\n`; neg
- in
- if neg then
+ | Ifloattest cmp ->
+ begin match cmp with
+ | CFeq | CFneq ->
+ ` feq.d {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`
+ | CFlt | CFnlt ->
+ ` flt.d {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`
+ | CFgt | CFngt ->
+ ` flt.d {emit_reg reg_tmp1}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}\n`
+ | CFle | CFnle ->
+ ` fle.d {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`
+ | CFge | CFnge ->
+ ` fle.d {emit_reg reg_tmp1}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}\n`
+ end;
+ begin match cmp with
+ | CFneq | CFnlt | CFngt | CFnle | CFnge ->
` beqz {emit_reg reg_tmp1}, {emit_label lbl}\n`
- else
+ | CFeq | CFlt | CFgt | CFle | CFge ->
` bnez {emit_reg reg_tmp1}, {emit_label lbl}\n`
+ end
| Ioddtest ->
` andi {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, 1\n`;
` bnez {emit_reg reg_tmp1}, {emit_label lbl}\n`
diff --git a/asmcomp/riscv/selection.ml b/asmcomp/riscv/selection.ml
index 092ca88aa..1f0af6abc 100644
--- a/asmcomp/riscv/selection.ml
+++ b/asmcomp/riscv/selection.ml
@@ -61,7 +61,7 @@ method! select_condition = function
| Cop(Ccmpa cmp, args, _) ->
(Iinttest(Iunsigned cmp), Ctuple args)
| Cop(Ccmpf cmp, args, _) ->
- (Ifloattest(cmp, false), Ctuple args)
+ (Ifloattest cmp, Ctuple args)
| Cop(Cand, [arg; Cconst_int 1], _) ->
(Ioddtest, arg)
| arg ->
--
2.17.1

View File

@ -0,0 +1,178 @@
From 4eb80b13779125fcd76a445ab0004ca064fab634 Mon Sep 17 00:00:00 2001
From: Miod Vallat <miod@tarides.com>
Date: Fri, 7 Jun 2024 06:19:45 +0000
Subject: [PATCH 7/7] Compute more accurate instruction sizes for branch
relaxation.
(cherry picked from commit 114ddae2d4c85391a4f939dc6623424ae35a07aa)
---
Changes | 4 ++
asmcomp/power/emit.mlp | 87 ++++++++++++++++++++++++------------------
2 files changed, 53 insertions(+), 38 deletions(-)
diff --git a/Changes b/Changes
index 53bb5369b9..1a81509247 100644
--- a/Changes
+++ b/Changes
@@ -7,6 +7,10 @@ OCaml 5.2 maintenance version
(Miod Vallat, report by Vesa Karvonen, review by Gabriel Scherer and
Xavier Leroy)
+- #13221: Compute more accurate instruction sizes for branch relocation on
+ POWER.
+ (Miod Vallat, review by Gabriel Scherer)
+
OCaml 5.2.0 (13 May 2024)
-------------------------
diff --git a/asmcomp/power/emit.mlp b/asmcomp/power/emit.mlp
index 47f5419a92..fdf22996fa 100644
--- a/asmcomp/power/emit.mlp
+++ b/asmcomp/power/emit.mlp
@@ -177,6 +177,28 @@ let emit_tocload emit_dest dest entry =
(* Output a load or store operation *)
+let load_mnemonic = function
+ | Byte_unsigned -> "lbz"
+ | Byte_signed -> "lbz"
+ | Sixteen_unsigned -> "lhz"
+ | Sixteen_signed -> "lha"
+ | Thirtytwo_unsigned -> "lwz"
+ | Thirtytwo_signed -> "lwa"
+ | Word_int | Word_val -> "ld"
+ | Single -> "lfs"
+ | Double -> "lfd"
+
+let store_mnemonic = function
+ | Byte_unsigned | Byte_signed -> "stb"
+ | Sixteen_unsigned | Sixteen_signed -> "sth"
+ | Thirtytwo_unsigned | Thirtytwo_signed -> "stw"
+ | Word_int | Word_val -> "std"
+ | Single -> "stfs"
+ | Double -> "stfd"
+
+let store_needs_lwsync chunk assignment =
+ assignment && (chunk = Word_int || chunk = Word_val)
+
let valid_offset instr ofs =
ofs land 3 = 0 || (instr <> "ld" && instr <> "std" && instr <> "lwa")
@@ -383,11 +405,17 @@ module BR = Branch_relaxation.Make (struct
let tocload_size = 2
- let load_store_size = function
+ let load_store_size instr = function
| Ibased(_s, d) ->
- let (_lo, hi) = low_high_s d in
- tocload_size + (if hi = 0 then 1 else 2)
- | Iindexed ofs -> if is_immediate ofs then 1 else 3
+ let (lo, hi) = low_high_s d in
+ tocload_size +
+ (if hi <> 0 then 1 else 0) +
+ (if valid_offset instr lo then 1 else 2)
+ | Iindexed ofs ->
+ if is_immediate ofs && valid_offset instr ofs then 1 else begin
+ let (lo, _hi) = low_high_u ofs in
+ if lo <> 0 then 3 else 2
+ end
| Iindexed2 -> 1
let instr_size f = function
@@ -415,16 +443,16 @@ module BR = Branch_relaxation.Make (struct
else if alloc then tocload_size + 2
else 5
| Lop(Istackoffset _) -> 1
- | Lop(Iload {memory_chunk; addressing_mode; _ }) ->
- if memory_chunk = Byte_signed
- then load_store_size addressing_mode + 1
- else load_store_size addressing_mode
+ | Lop(Iload {memory_chunk; addressing_mode; is_atomic }) ->
+ let loadinstr = load_mnemonic memory_chunk in
+ (if is_atomic then 4 else 0) +
+ (if memory_chunk = Byte_signed then 1 else 0) +
+ load_store_size loadinstr addressing_mode
| Lop(Istore(chunk, addr, assignment)) ->
- (match chunk with
- | Single -> 1
- | Word_int | Word_val when assignment -> 1
- | _ -> 0)
- + load_store_size addr
+ let storeinstr = store_mnemonic chunk in
+ (if chunk = Single then 1 else 0) +
+ (if store_needs_lwsync chunk assignment then 1 else 0) +
+ load_store_size storeinstr addr
| Lop(Ialloc _) -> 5
| Lop(Ispecific(Ialloc_far _)) -> 6
| Lop(Ipoll { return_label = Some(_) }) -> 5
@@ -442,12 +470,12 @@ module BR = Branch_relaxation.Make (struct
| Lop(Ispecific(Icheckbound_imm_far _)) -> 3
| Lop(Iintop_imm _) -> 1
| Lop(Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf) -> 1
- | Lop(Ifloatofint) -> 9
- | Lop(Iintoffloat) -> 4
+ | Lop(Ifloatofint) -> 3
+ | Lop(Iintoffloat) -> 3
| Lop(Iopaque) -> 0
| Lop(Ispecific _) -> 1
- | Lop (Idls_get) -> 1
- | Lop (Ireturn_addr) -> 1
+ | Lop(Idls_get) -> 1
+ | Lop(Ireturn_addr) -> 1
| Lreloadretaddr -> 2
| Lreturn -> 2
| Llabel _ -> 0
@@ -457,7 +485,7 @@ module BR = Branch_relaxation.Make (struct
1 + (if lbl0 = None then 0 else 1)
+ (if lbl1 = None then 0 else 1)
+ (if lbl2 = None then 0 else 1)
- | Lswitch _ -> 5 + tocload_size
+ | Lswitch _ -> 7 + tocload_size
| Lentertrap -> 1
| Ladjust_trap_depth _ -> 0
| Lpushtrap _ -> 4 + tocload_size
@@ -705,17 +733,7 @@ let emit_instr env i =
` addi 1, 1, {emit_int (-n)}\n`;
adjust_stack_offset env n
| Lop(Iload { memory_chunk; addressing_mode; is_atomic }) ->
- let loadinstr =
- match memory_chunk with
- | Byte_unsigned -> "lbz"
- | Byte_signed -> "lbz"
- | Sixteen_unsigned -> "lhz"
- | Sixteen_signed -> "lha"
- | Thirtytwo_unsigned -> "lwz"
- | Thirtytwo_signed -> "lwa"
- | Word_int | Word_val -> "ld"
- | Single -> "lfs"
- | Double -> "lfd" in
+ let loadinstr = load_mnemonic memory_chunk in
if is_atomic then
` sync\n`;
emit_load_store loadinstr addressing_mode i.arg 0 i.res.(0);
@@ -731,19 +749,12 @@ let emit_instr env i =
` frsp {emit_reg tmp}, {emit_reg i.arg.(0)}\n`;
emit_load_store "stfs" addr i.arg 1 tmp
| Lop(Istore(chunk, addr, assignment)) ->
- let storeinstr =
- match chunk with
- | Byte_unsigned | Byte_signed -> "stb"
- | Sixteen_unsigned | Sixteen_signed -> "sth"
- | Thirtytwo_unsigned | Thirtytwo_signed -> "stw"
- | Word_int | Word_val -> "std"
- | Single -> assert false
- | Double -> "stfd" in
+ let storeinstr = store_mnemonic chunk in
(* Non-initializing stores need a memory barrier to follow the
Multicore OCaml memory model. Stores of size other than
Word_int and Word_val do not follow the memory model and therefore
do not need a barrier *)
- if assignment && (chunk = Word_int || chunk = Word_val) then
+ if store_needs_lwsync chunk assignment then
` lwsync\n`;
emit_load_store storeinstr addr i.arg 1 i.arg.(0)
| Lop(Ialloc { bytes; dbginfo }) ->
--
2.44.0

View File

@ -1,40 +0,0 @@
From af276d83f41cb9eb9f1e50a75a9be205c9b2fee6 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 5 Jun 2018 19:48:08 +0000
Subject: [PATCH 8/8] riscv: Emit debug info.
---
asmcomp/riscv/emit.mlp | 3 +++
1 file changed, 3 insertions(+)
diff --git a/asmcomp/riscv/emit.mlp b/asmcomp/riscv/emit.mlp
index 718dca080..e42ee9770 100644
--- a/asmcomp/riscv/emit.mlp
+++ b/asmcomp/riscv/emit.mlp
@@ -261,6 +261,7 @@ let tailrec_entry_point = ref 0
(* Output the assembly code for an instruction *)
let emit_instr i =
+ emit_debug_info i.dbg;
match i.desc with
Lend -> ()
| Lop(Imove | Ispill | Ireload) ->
@@ -560,6 +561,7 @@ let fundecl fundecl =
emit_stack_adjustment (-n);
if !contains_calls then store_ra n;
`{emit_label !tailrec_entry_point}:\n`;
+ emit_debug_info fundecl.fun_dbg;
emit_all fundecl.fun_body;
List.iter emit_call_gc !call_gc_sites;
List.iter emit_call_bound_error !bound_error_sites;
@@ -619,6 +621,7 @@ let data l =
let begin_assembly() =
` .file \"\"\n`; (* PR#7073 *)
+ reset_debug_info ();
(* Emit the beginning of the segments *)
let lbl_begin = Compilenv.make_symbol (Some "data_begin") in
` {emit_string data_space}\n`;
--
2.17.1

2
gating.yaml Normal file → Executable file
View File

@ -1,6 +1,6 @@
--- !Policy --- !Policy
product_versions: product_versions:
- rhel-8 - rhel-*
decision_context: osci_compose_gate decision_context: osci_compose_gate
rules: rules:
- !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional} - !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional}

69
macros.ocaml-rpm Normal file
View 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}}

View File

@ -1,3 +1,13 @@
# Don't add -Wl,-dT,<build dir>
%undefine _package_note_flags
# OCaml 5.1 broke building with LTO. A file prims.c is generated with
# primitive function declarations, all with "void" for their parameter
# list. This does not match the real definitions, leading to lots of
# -Wlto-type-mismatch warnings. These change the output of the tests,
# leading to many failed tests. This is still a problem in 5.2.
%global _lto_cflags %{nil}
# OCaml has a bytecode backend that works on anything with a C # OCaml has a bytecode backend that works on anything with a C
# compiler, and a native code backend available on a subset of # compiler, and a native code backend available on a subset of
# architectures. A further subset of architectures support native # architectures. A further subset of architectures support native
@ -15,27 +25,37 @@
%global natdynlink 0 %global natdynlink 0
%endif %endif
# i686 support was dropped in OCaml 5 / Fedora 39.
ExcludeArch: %{ix86}
# These are all the architectures that the tests run on. The tests # 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. # take a long time to run, so don't run them on slow machines.
%global test_arches aarch64 %{power64} x86_64 %global test_arches aarch64 %{power64} riscv64 s390x x86_64
# These are the architectures for which the tests must pass otherwise # These are the architectures for which the tests must pass otherwise
# the build will fail. # the build will fail.
%global test_arches_required aarch64 x86_64 #global test_arches_required aarch64 ppc64le x86_64
%global test_arches_required NONE
# Architectures where parallel builds fail. # Architectures where parallel builds fail.
#%global no_parallel_build_arches aarch64 #global no_parallel_build_arches aarch64
#global rcver +git
%global rcver %{nil}
Name: ocaml Name: ocaml
Version: 4.07.0 Version: 5.2.0
Release: 3%{?dist} Release: 4%{?dist}
Summary: OCaml compiler and programming environment Summary: OCaml compiler and programming environment
License: QPL and (LGPLv2+ with exceptions) License: LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception
URL: http://www.ocaml.org URL: https://www.ocaml.org
VCS: https://github.com/ocaml/ocaml
Source0: http://caml.inria.fr/pub/distrib/ocaml-4.07/ocaml-%{version}.tar.xz Source0: %{vcs}/archive/%{version}%{rcver}/%{name}-%{version}%{rcver}.tar.gz
Source1: macros.ocaml-rpm
Source2: ocaml_files.py
# IMPORTANT NOTE: # IMPORTANT NOTE:
# #
@ -46,61 +66,77 @@ Source0: http://caml.inria.fr/pub/distrib/ocaml-4.07/ocaml-%{version}.tar
# #
# https://pagure.io/fedora-ocaml # https://pagure.io/fedora-ocaml
# #
# Current branch: fedora-29-4.07.0 # Current branch: fedora-41-5.2.0
# #
# ALTERNATIVELY add a patch to the end of the list (leaving the # ALTERNATIVELY add a patch to the end of the list (leaving the
# existing patches unchanged) adding a comment to note that it should # existing patches unchanged) adding a comment to note that it should
# be incorporated into the git repo at a later time. # be incorporated into the git repo at a later time.
#
# Fedora-specific downstream patches. # Upstream after 5.2.0:
Patch0001: 0001-Don-t-add-rpaths-to-libraries.patch Patch: 0001-Changes-synchronisation-and-consistency-with-trunk.patch
Patch0002: 0002-ocamlbyteinfo-ocamlplugininfo-Useful-utilities-from-.patch Patch: 0002-Changes-copy-editing.patch
Patch0003: 0003-configure-Allow-user-defined-C-compiler-flags.patch
# Out of tree patch for RISC-V support. # Fedora-specific patches
# https://github.com/nojb/riscv-ocaml Patch: 0003-Don-t-add-rpaths-to-libraries.patch
Patch0004: 0004-Add-RISC-V-backend.patch Patch: 0004-configure-Allow-user-defined-C-compiler-flags.patch
Patch0005: 0005-Copyright-untabify.patch
Patch0006: 0006-fix-caml_c_call-reload-caml_young_limit.patch
Patch0007: 0007-Adapt-to-4.07.patch
# RISC-V patch to add debuginfo (DWARF) generation. # Improve performance of flambda optimizer in some cases. Required to
# Sent upstream 2018-06-05. # compiler blow-up in coccinelle package. Upstream, but not included
Patch0008: 0008-riscv-Emit-debug-info.patch # in 5.2 branch.
# https://github.com/ocaml/ocaml/pull/13150
Patch: 0005-flambda-Improve-transitive-closure-in-invariant_para.patch
# Upstream after 5.2.0:
Patch: 0006-Reload-exception-pointer-register-in-caml_c_call.patch
# Fix for ppc64le code generation issue found after 5.2.0 was released.
# https://github.com/ocaml/ocaml/issues/13220
# https://github.com/ocaml/ocaml/commit/114ddae2d4c85391a4f939dc6623424ae35a07aa
Patch: 0007-Compute-more-accurate-instruction-sizes-for-branch-r.patch
BuildRequires: make
BuildRequires: git
BuildRequires: gcc BuildRequires: gcc
BuildRequires: binutils-devel BuildRequires: autoconf
BuildRequires: ncurses-devel
BuildRequires: gdbm-devel
BuildRequires: emacs
BuildRequires: gawk BuildRequires: gawk
BuildRequires: hardlink
BuildRequires: perl-interpreter BuildRequires: perl-interpreter
BuildRequires: util-linux BuildRequires: util-linux
BuildRequires: libICE-devel BuildRequires: /usr/bin/annocheck
BuildRequires: libSM-devel BuildRequires: pkgconfig(libzstd)
BuildRequires: libX11-devel
BuildRequires: libXaw-devel
BuildRequires: libXext-devel
BuildRequires: libXft-devel
BuildRequires: libXmu-devel
BuildRequires: libXrender-devel
BuildRequires: libXt-devel
BuildRequires: chrpath
# Documentation requirements
BuildRequires: asciidoc
BuildRequires: python3-pygments
# 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: gcc
Requires: redhat-rpm-config
Requires: libzstd-devel%{?_isa}
# Because we pass -c flag to ocaml-find-requires (to avoid circular # Because we pass -c flag to ocaml-find-requires (to avoid circular
# dependencies) we also have to explicitly depend on the right version # dependencies) we also have to explicitly depend on the right version
# of ocaml-runtime. # of ocaml-runtime.
Requires: ocaml-runtime = %{version}-%{release} Requires: ocaml-runtime%{?_isa} = %{version}-%{release}
# Bundles an MD5 implementation in byterun/md5.{c,h} # 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
# Bundles an MD5 implementation in runtime/caml/md5.h and runtime/md5.c
Provides: bundled(md5-plumb) Provides: bundled(md5-plumb)
Provides: ocaml(compiler) = %{version} Provides: ocaml(compiler) = %{version}
%if %{native_compiler}
%global __ocaml_requires_opts -c -f '%{buildroot}%{_bindir}/ocamlrun %{buildroot}%{_bindir}/ocamlobjinfo.byte' %global __ocaml_requires_opts -c -f '%{buildroot}%{_bindir}/ocamlrun %{buildroot}%{_bindir}/ocamlobjinfo.byte'
%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' %global __ocaml_provides_opts -f '%{buildroot}%{_bindir}/ocamlrun %{buildroot}%{_bindir}/ocamlobjinfo.byte'
@ -115,6 +151,10 @@ and a comprehensive library.
%package runtime %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 Summary: OCaml runtime environment
Requires: util-linux Requires: util-linux
Provides: ocaml(runtime) = %{version} Provides: ocaml(runtime) = %{version}
@ -129,44 +169,28 @@ bytecode.
%package source %package source
Summary: Source code for OCaml libraries Summary: Source code for OCaml libraries
Requires: ocaml = %{version}-%{release} Requires: ocaml%{?_isa} = %{version}-%{release}
%description source %description source
Source code for OCaml libraries. Source code for OCaml libraries.
%package x11
Summary: X11 support for OCaml
Requires: ocaml-runtime = %{version}-%{release}
Requires: libX11-devel
%description x11
X11 support for OCaml.
%package ocamldoc %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 Summary: Documentation generator for OCaml
Requires: ocaml = %{version}-%{release} Requires: ocaml%{?_isa} = %{version}-%{release}
Provides: ocamldoc Provides: ocamldoc = %{version}
%description ocamldoc %description ocamldoc
Documentation generator for OCaml. Documentation generator for OCaml.
%package emacs
Summary: Emacs mode for OCaml
Requires: ocaml = %{version}-%{release}
Requires: emacs(bin)
%description emacs
Emacs mode for OCaml.
%package docs %package docs
Summary: Documentation for OCaml Summary: Documentation for OCaml
BuildArch: noarch
Requires: ocaml = %{version}-%{release} Requires: ocaml = %{version}-%{release}
Requires(post): /sbin/install-info
Requires(preun): /sbin/install-info
%description docs %description docs
@ -178,7 +202,7 @@ This package contains man pages.
%package compiler-libs %package compiler-libs
Summary: Compiler libraries for OCaml Summary: Compiler libraries for OCaml
Requires: ocaml = %{version}-%{release} Requires: ocaml%{?_isa} = %{version}-%{release}
%description compiler-libs %description compiler-libs
@ -191,152 +215,177 @@ Note that this exposes internal details of the OCaml compiler which
may not be portable between versions. 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 %prep
%setup -q -T -b 0 -n %{name}-%{version} %autosetup -S git -n %{name}-%{version}%{rcver}
%autopatch -p1 # Patches touch configure.ac, so rebuild it:
autoconf --force
%build %build
%ifnarch %{no_parallel_build_arches} %ifnarch %{no_parallel_build_arches}
make="make %{?_smp_mflags}" make="%make_build"
%else %else
unset MAKEFLAGS unset MAKEFLAGS
make=make make=make
%endif %endif
CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing" \ # 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
#
# See also:
# https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/2O4HBOK6PTQZAFAVIRDVMZGG2PYB2QHM/
# https://github.com/ocaml/ocaml/issues/8647
#
# We set --libdir to the unusual directory because we want OCaml to
# install its libraries and other files into a subdirectory.
#
# OC_CFLAGS/OC_LDFLAGS control what flags OCaml passes to the linker
# when doing final linking of OCaml binaries. Setting these is
# necessary to ensure that generated binaries have Fedora hardening
# features.
./configure \ ./configure \
-bindir %{_bindir} \ --prefix=%{_prefix} \
-libdir %{_libdir}/ocaml \ --sysconfdir=%{_sysconfdir} \
-x11lib %{_libdir} \ --mandir=%{_mandir} \
-x11include %{_includedir} \ --libdir=%{_libdir}/ocaml \
-mandir %{_mandir}/man1 \ --enable-flambda \
-no-curses %if %{native_compiler}
--enable-native-compiler \
--enable-native-toplevel \
%else
--disable-native-compiler \
--disable-native-toplevel \
%endif
%ifarch x86_64
%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 $make world
%if %{native_compiler} %if %{native_compiler}
$make opt $make opt
$make opt.opt $make opt.opt
%endif %endif
make -C emacs ocamltags
# Currently these tools are supplied by Debian, but are expected # Build the README and fix up references to other doc files
# to go upstream at some point. asciidoc -d book README.adoc
includes="-nostdlib -I stdlib -I utils -I parsing -I typing -I bytecomp -I asmcomp -I driver -I otherlibs/unix -I otherlibs/str -I otherlibs/dynlink" for fil in CONTRIBUTING.md HACKING.adoc INSTALL.adoc README.win32.adoc; do
boot/ocamlrun ./ocamlc $includes dynlinkaux.cmo ocamlbyteinfo.ml -o ocamlbyteinfo sed -e "s,\"$fil\",\"https://github.com/ocaml/ocaml/blob/trunk/$fil\"," \
# ocamlplugininfo doesn't compile because it needs 'dynheader' (type -i README.html
# decl) and I have no idea where that comes from done
#cp otherlibs/dynlink/natdynlink.ml .
#boot/ocamlrun ./ocamlopt $includes unix.cmxa str.cmxa natdynlink.ml ocamlplugininfo.ml -o ocamlplugininfo
%check %check
%ifarch %{test_arches} %ifarch %{ocaml_native_compiler}
cd testsuite # For information only, compile a binary and dump the annocheck data
# from it. Useful so we know if hardening is being enabled, but don't
# fail because not every hardening feature can be enabled here.
echo 'print_endline "hello, world"' > hello.ml
./ocamlopt.opt -verbose -I stdlib hello.ml -o hello ||:
annocheck -v hello ||:
%endif
%ifarch %{test_arches}
%ifarch %{test_arches_required} %ifarch %{test_arches_required}
make -j1 all make -j1 tests
%else %else
make -j1 all ||: make -j1 tests ||:
%endif %endif
%endif %endif
%install %install
make install \ %make_install
BINDIR=$RPM_BUILD_ROOT%{_bindir} \
LIBDIR=$RPM_BUILD_ROOT%{_libdir}/ocaml \
MANDIR=$RPM_BUILD_ROOT%{_mandir}
perl -pi -e "s|^$RPM_BUILD_ROOT||" $RPM_BUILD_ROOT%{_libdir}/ocaml/ld.conf perl -pi -e "s|^$RPM_BUILD_ROOT||" $RPM_BUILD_ROOT%{_libdir}/ocaml/ld.conf
(
# install emacs files
cd emacs;
make install \
BINDIR=$RPM_BUILD_ROOT%{_bindir} \
EMACSDIR=$RPM_BUILD_ROOT%{_datadir}/emacs/site-lisp
make install-ocamltags BINDIR=$RPM_BUILD_ROOT%{_bindir}
)
echo %{version} > $RPM_BUILD_ROOT%{_libdir}/ocaml/fedora-ocaml-release echo %{version} > $RPM_BUILD_ROOT%{_libdir}/ocaml/fedora-ocaml-release
# Remove rpaths from stublibs .so files. # Remove the installed documentation. We will install it using %%doc
chrpath --delete $RPM_BUILD_ROOT%{_libdir}/ocaml/stublibs/*.so rm -rf $RPM_BUILD_ROOT%{_docdir}/ocaml
install -m 0755 ocamlbyteinfo $RPM_BUILD_ROOT%{_bindir} mkdir -p $RPM_BUILD_ROOT%{rpmmacrodir}
#install -m 0755 ocamlplugininfo $RPM_BUILD_ROOT%{_bindir} install -m 0644 %{SOURCE1} $RPM_BUILD_ROOT%{rpmmacrodir}/macros.ocaml-rpm
find $RPM_BUILD_ROOT -name .ignore -delete mkdir -p $RPM_BUILD_ROOT%{_rpmconfigdir}/redhat
install -m 0644 %{SOURCE2} $RPM_BUILD_ROOT%{_rpmconfigdir}/redhat
# Remove .cmt and .cmti files, for now. We could package them later. # Link, rather than copy, identical binaries
# See also: http://www.ocamlpro.com/blog/2012/08/20/ocamlpro-and-4.00.0.html hardlink -t $RPM_BUILD_ROOT%{_libdir}/ocaml/stublibs
find $RPM_BUILD_ROOT \( -name '*.cmt' -o -name '*.cmti' \) -a -delete
%files %files
%doc LICENSE %license LICENSE
%{_bindir}/ocaml %{_bindir}/ocaml
%{_bindir}/ocamlbyteinfo
%{_bindir}/ocamlcmt %{_bindir}/ocamlcmt
%{_bindir}/ocamlcp
%{_bindir}/ocamldebug %{_bindir}/ocamldebug
%{_bindir}/ocaml-instr-graph %{_bindir}/ocamlmklib
%{_bindir}/ocaml-instr-report %{_bindir}/ocamlmktop
#%{_bindir}/ocamlplugininfo %{_bindir}/ocamlprof
%{_bindir}/ocamlyacc %{_bindir}/ocamlyacc
# symlink to either .byte or .opt version # symlink to either .byte or .opt version
%{_bindir}/ocamlc %{_bindir}/ocamlc
%{_bindir}/ocamlcp
%{_bindir}/ocamldep %{_bindir}/ocamldep
%{_bindir}/ocamllex %{_bindir}/ocamllex
%{_bindir}/ocamlmklib
%{_bindir}/ocamlmktop
%{_bindir}/ocamlobjinfo %{_bindir}/ocamlobjinfo
%{_bindir}/ocamloptp
%{_bindir}/ocamlprof
# bytecode versions # bytecode versions
%{_bindir}/ocamlc.byte %{_bindir}/ocamlc.byte
%{_bindir}/ocamlcp.byte
%{_bindir}/ocamldep.byte %{_bindir}/ocamldep.byte
%{_bindir}/ocamllex.byte %{_bindir}/ocamllex.byte
%{_bindir}/ocamlmklib.byte
%{_bindir}/ocamlmktop.byte
%{_bindir}/ocamlobjinfo.byte %{_bindir}/ocamlobjinfo.byte
%{_bindir}/ocamloptp.byte
%{_bindir}/ocamlprof.byte
%if %{native_compiler} %if %{native_compiler}
# native code versions # native code versions
%{_bindir}/ocamlc.opt %{_bindir}/ocamlc.opt
%{_bindir}/ocamlcp.opt
%{_bindir}/ocamldep.opt %{_bindir}/ocamldep.opt
%{_bindir}/ocamllex.opt %{_bindir}/ocamllex.opt
%{_bindir}/ocamlmklib.opt
%{_bindir}/ocamlmktop.opt
%{_bindir}/ocamlobjinfo.opt %{_bindir}/ocamlobjinfo.opt
%{_bindir}/ocamloptp.opt
%{_bindir}/ocamlprof.opt
%endif %endif
%if %{native_compiler} %if %{native_compiler}
%{_bindir}/ocamlnat
%{_bindir}/ocamlopt %{_bindir}/ocamlopt
%{_bindir}/ocamlopt.byte %{_bindir}/ocamlopt.byte
%{_bindir}/ocamlopt.opt %{_bindir}/ocamlopt.opt
%{_bindir}/ocamloptp
%endif %endif
#%{_libdir}/ocaml/addlabels
#%{_libdir}/ocaml/scrapelabels
%{_libdir}/ocaml/camlheader
%{_libdir}/ocaml/camlheader_ur
%{_libdir}/ocaml/expunge %{_libdir}/ocaml/expunge
%{_libdir}/ocaml/extract_crc
%{_libdir}/ocaml/ld.conf %{_libdir}/ocaml/ld.conf
%{_libdir}/ocaml/Makefile.config %{_libdir}/ocaml/Makefile.config
%{_libdir}/ocaml/*.a %{_libdir}/ocaml/*.a
%if %{natdynlink}
%{_libdir}/ocaml/*.cmxs
%endif
%if %{native_compiler} %if %{native_compiler}
%{_libdir}/ocaml/*.cmxa %{_libdir}/ocaml/*.cmxa
%{_libdir}/ocaml/*.cmx %{_libdir}/ocaml/*.cmx
@ -344,55 +393,72 @@ find $RPM_BUILD_ROOT \( -name '*.cmt' -o -name '*.cmti' \) -a -delete
%{_libdir}/ocaml/libasmrun_shared.so %{_libdir}/ocaml/libasmrun_shared.so
%endif %endif
%{_libdir}/ocaml/*.mli %{_libdir}/ocaml/*.mli
%{_libdir}/ocaml/sys.ml.in
%{_libdir}/ocaml/libcamlrun_shared.so %{_libdir}/ocaml/libcamlrun_shared.so
%{_libdir}/ocaml/objinfo_helper
%{_libdir}/ocaml/vmthreads/*.mli %{_libdir}/ocaml/{dynlink,runtime_events,str,threads,unix}/*.mli
%{_libdir}/ocaml/vmthreads/*.a
%if %{native_compiler} %if %{native_compiler}
%{_libdir}/ocaml/threads/*.a %{_libdir}/ocaml/{dynlink,runtime_events,str,threads,unix}/*.a
%{_libdir}/ocaml/threads/*.cmxa %{_libdir}/ocaml/{dynlink,runtime_events,str,threads,unix}/*.cmxa
%{_libdir}/ocaml/threads/*.cmx %{_libdir}/ocaml/{dynlink,profiling,runtime_events,str,threads,unix}/*.cmx
%{_libdir}/ocaml/profiling/*.o
%endif %endif
%if %{natdynlink}
%{_libdir}/ocaml/{runtime_events,str,unix}/*.cmxs
%endif
# headers
%{_libdir}/ocaml/caml %{_libdir}/ocaml/caml
%exclude %{_libdir}/ocaml/graphicsX11.mli
%files runtime %files runtime
%doc README.adoc LICENSE Changes %doc README.html Changes
%license LICENSE
%{_bindir}/ocamlrun %{_bindir}/ocamlrun
%{_bindir}/ocamlrund %{_bindir}/ocamlrund
%{_bindir}/ocamlruni %{_bindir}/ocamlruni
%dir %{_libdir}/ocaml %dir %{_libdir}/ocaml
%{_libdir}/ocaml/VERSION
%{_libdir}/ocaml/*.cmo %{_libdir}/ocaml/*.cmo
%{_libdir}/ocaml/*.cmi %{_libdir}/ocaml/*.cmi
%{_libdir}/ocaml/*.cma %{_libdir}/ocaml/*.cma
%{_libdir}/ocaml/stublibs %{_libdir}/ocaml/stublibs
%{_libdir}/ocaml/target_camlheaderd %dir %{_libdir}/ocaml/dynlink
%{_libdir}/ocaml/target_camlheaderi %{_libdir}/ocaml/dynlink/META
%dir %{_libdir}/ocaml/vmthreads %{_libdir}/ocaml/dynlink/*.cmi
%{_libdir}/ocaml/vmthreads/*.cmi %{_libdir}/ocaml/dynlink/*.cma
%{_libdir}/ocaml/vmthreads/*.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 %dir %{_libdir}/ocaml/threads
%{_libdir}/ocaml/threads/META
%{_libdir}/ocaml/threads/*.cmi %{_libdir}/ocaml/threads/*.cmi
%{_libdir}/ocaml/threads/*.cma %{_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 %{_libdir}/ocaml/fedora-ocaml-release
%exclude %{_libdir}/ocaml/graphicsX11.cmi
%files source %files source
%doc LICENSE %license LICENSE
%{_libdir}/ocaml/*.ml %{_libdir}/ocaml/*.ml
%{_libdir}/ocaml/*.cmt*
%{_libdir}/ocaml/*/*.cmt*
%files x11
%doc LICENSE
%{_libdir}/ocaml/graphicsX11.cmi
%{_libdir}/ocaml/graphicsX11.mli
%files ocamldoc %files ocamldoc
%doc LICENSE %license LICENSE
%doc ocamldoc/Changes.txt %doc ocamldoc/Changes.txt
%{_bindir}/ocamldoc* %{_bindir}/ocamldoc*
%{_libdir}/ocaml/ocamldoc %{_libdir}/ocaml/ocamldoc
@ -403,30 +469,221 @@ find $RPM_BUILD_ROOT \( -name '*.cmt' -o -name '*.cmti' \) -a -delete
%{_mandir}/man3/* %{_mandir}/man3/*
%files emacs
%doc emacs/README
%{_datadir}/emacs/site-lisp/*
%{_bindir}/ocamltags
%files compiler-libs %files compiler-libs
%doc LICENSE %license LICENSE
%dir %{_libdir}/ocaml/compiler-libs %{_libdir}/ocaml/compiler-libs
%{_libdir}/ocaml/compiler-libs/*.mli
%{_libdir}/ocaml/compiler-libs/*.cmi
%{_libdir}/ocaml/compiler-libs/*.cmo %files rpm-macros
%{_libdir}/ocaml/compiler-libs/*.cma %{rpmmacrodir}/macros.ocaml-rpm
%if %{native_compiler} %{_rpmconfigdir}/redhat/ocaml_files.py
%{_libdir}/ocaml/compiler-libs/*.a
%{_libdir}/ocaml/compiler-libs/*.cmxa
%{_libdir}/ocaml/compiler-libs/*.cmx
%{_libdir}/ocaml/compiler-libs/*.o
%endif
%changelog %changelog
* Tue Jul 31 2018 Richard W.M. Jones <rjones@redhat.com> - 4.07.0-3 * Tue Oct 29 2024 Troy Dawson <tdawson@redhat.com> - 5.2.0-4
- Disable unreliable tests on ppc64le. - Bump release for October 2024 mass rebuild:
Resolves: RHEL-64018
* Mon Jun 24 2024 Troy Dawson <tdawson@redhat.com> - 5.2.0-3
- Bump release for June 2024 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
* Thu Jan 19 2023 Fedora Release Engineering <releng@fedoraproject.org> - 4.14.0-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
* Mon Sep 5 2022 Richard W.M. Jones <rjones@redhat.com> - 4.14.0-3
- Include more upstream patches from 4.14 branch
* Fri Jul 22 2022 Fedora Release Engineering <releng@fedoraproject.org> - 4.14.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
* Sat Jun 18 2022 Richard W.M. Jones <rjones@redhat.com> - 4.14.0-1
- New upstream version 4.14.0
* Thu Jun 9 2022 Jerry James <loganjerry@gmail.com> - 4.13.1-4
- Fix the Source0 URL
- chrpath is no longer needed
- Use the %%license macro
- Build the test binaries so the tests will run
* Fri Feb 04 2022 Richard W.M. Jones <rjones@redhat.com> - 4.13.1-4
- Rebuild 4.13.1 to remove package notes
* Wed Jan 26 2022 Richard W.M. Jones <rjones@redhat.com> - 4.13.1-3
- Disable package note misfeature
- Remove duplicate flags from mkexe
* Thu Jan 20 2022 Fedora Release Engineering <releng@fedoraproject.org> - 4.13.1-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
* Mon Oct 04 2021 Richard W.M. Jones <rjones@redhat.com> - 4.13.1-1
- New upstream version 4.13.1
* Thu Jul 22 2021 Fedora Release Engineering <releng@fedoraproject.org> - 4.12.0-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
* Wed Jun 23 2021 Richard W.M. Jones <rjones@redhat.com> - 4.12.0-2
- Move to final version of upstream patch for non-constant SIGSTKSZ
* Sun Feb 28 2021 Richard W.M. Jones <rjones@redhat.com> - 4.12.0-1
- OCaml 4.12.0 release (RHBZ#1893381).
- Workaround for glibc non-constant SIGSTKSZ
(https://github.com/ocaml/ocaml/issues/10250)
- Package *.cmt and *.cmti files.
- Remove objinfo_helper since it is no longer built.
* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 4.11.1-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
* Tue Sep 01 2020 Richard W.M. Jones <rjones@redhat.com> - 4.11.1-1
- OCaml 4.11.1 release (RHBZ#1870368#c26).
* Fri Aug 21 2020 Richard W.M. Jones <rjones@redhat.com> - 4.11.0-1
- OCaml 4.11.0 release (RHBZ#1870368).
* Tue Aug 04 2020 Richard W.M. Jones <rjones@redhat.com> - 4.11.0-0.9.dev2
- Bump and rebuild to fix DWARF versioning issues.
- Enable LTO again.
* Tue Jul 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 4.11.0-0.7.dev2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Tue Jul 14 2020 Tom Stellard <tstellar@redhat.com> - 4.11.0-0.6.dev2
- Use make macros
- https://fedoraproject.org/wiki/Changes/UseMakeBuildInstallMacro
* Wed Jul 01 2020 Jeff Law <law@redhat.com> - 4.11.0-0.5.dev2.fc33
- Disable LTO
* Mon May 04 2020 Richard W.M. Jones <rjones@redhat.com> - 4.11.0-0.4.dev2.fc33
- Move to OCaml 4.11.0+dev2-2020-04-22.
- Backport upstream RISC-V backend from 4.12 + fixes.
- Enable tests on riscv64.
- Disable ocaml-instr-* tools on riscv64.
* Tue Apr 21 2020 Richard W.M. Jones <rjones@redhat.com> - 4.11.0-0.3.pre.fc33
- Add fixes for various issues found in the previous build.
* Fri Apr 17 2020 Richard W.M. Jones <rjones@redhat.com> - 4.11.0-0.2.pre.fc33
- Move to OCaml 4.11.0 pre-release with support for RISC-V.
* Sat Apr 11 2020 Richard W.M. Jones <rjones@redhat.com> - 4.10.0-4.fc33
- Fix RISC-V backend.
* Thu Apr 02 2020 Richard W.M. Jones <rjones@redhat.com> - 4.10.0-3.fc33
- Update all OCaml dependencies for RPM 4.16.
* Thu Feb 27 2020 Richard W.M. Jones <rjones@redhat.com> - 4.10.0-2.fc33
- Add dist tag.
* Tue Feb 25 2020 Richard W.M. Jones <rjones@redhat.com> - 4.10.0-1
- OCaml 4.10.0 final.
* Wed Jan 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 4.10.0-0.beta1.0.1
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
* Sat Jan 18 2020 Richard W.M. Jones <rjones@redhat.com> - 4.10.0-0.beta1
- OCaml 4.10.0+beta1.
* Tue Jan 07 2020 Richard W.M. Jones <rjones@redhat.com> - 4.09.0-13
- Bump release and rebuild.
* Tue Jan 07 2020 Richard W.M. Jones <rjones@redhat.com> - 4.09.0-4
- OCaml 4.09.0 for riscv64
* Tue Dec 10 2019 Richard W.M. Jones <rjones@redhat.com> - 4.09.0-3
- Require redhat-rpm-config to get hardening flags when linking.
* Thu Dec 05 2019 Richard W.M. Jones <rjones@redhat.com> - 4.09.0-2
- OCaml 4.09.0 final.
- Use autosetup, remove old setup line.
- Remove ocamloptp binaries.
- Rename target_camlheader[di] -> camlheader[di] files.
- Remove vmthreads - old threading library which is no longer built.
- Remove x11 subpackage which is obsolete.
- Further fixes to CFLAGS and annobin.
* Fri Aug 16 2019 Richard W.M. Jones <rjones@redhat.com> - 4.08.1-1
- OCaml 4.08.1 final.
* Tue Jul 30 2019 Richard W.M. Jones <rjones@redhat.com> - 4.08.1-0.rc2.1
- OCaml 4.08.1+rc2.
- Include fix for miscompilation of off_t on 32 bit architectures.
* Thu Jul 25 2019 Fedora Release Engineering <releng@fedoraproject.org> - 4.08.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
* Thu Jun 27 2019 Richard W.M. Jones <rjones@redhat.com> - 4.08.0-1
- OCaml 4.08.0 (RHBZ#1673688).
* Fri Apr 26 2019 Richard W.M. Jones <rjones@redhat.com> - 4.08.0-0.beta3.1
- OCaml 4.08.0 beta 3 (RHBZ#1673688).
- emacs subpackage has been dropped (from upstream):
https://github.com/ocaml/ocaml/pull/2078#issuecomment-443322613
https://github.com/Chris00/caml-mode
- Remove ocamlbyteinfo and ocamlpluginfo, neither can be compiled.
- Disable tests on all architectures, temporarily hopefully.
- Package threads/*.mli files.
* Fri Feb 01 2019 Fedora Release Engineering <releng@fedoraproject.org> - 4.07.0-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
* Fri Aug 17 2018 Richard W.M. Jones <rjones@redhat.com> - 4.07.0-3
- Bootstrap from previously build Fedora compiler by default.
* Fri Jul 13 2018 Fedora Release Engineering <releng@fedoraproject.org> - 4.07.0-2 * Fri Jul 13 2018 Fedora Release Engineering <releng@fedoraproject.org> - 4.07.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild

451
ocaml_files.py Normal file
View 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)

View File

@ -1 +1 @@
SHA512 (ocaml-4.07.0.tar.xz) = 1c27c2c81919af6b51824fb69f203ebca009ab093af0dffb0dbe66d08ba980525ee14e9426edf142c527315144602ac9ef6e36d2266714b5f7ccc7c063e75ac8 SHA512 (ocaml-5.2.0.tar.gz) = 78115690186c13c1f2480e4812a9fe34cce2c28bf8a89d5c9810bca0391f930cecd9cee2b53daca8a32da1815628b33be68f3948f1ad03fa50b72b14e3ea84f2

10
tests/basic-test.sh Executable file
View 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
View File

@ -0,0 +1,11 @@
- hosts: localhost
roles:
- role: standard-test-basic
tags:
- classic
required_packages:
- ocaml
tests:
- simple:
dir: .
run: ./basic-test.sh