Compare commits

..

2 commits

Author SHA1 Message Date
Richard W.M. Jones
94f98cd258 Drop non-free documentation (RHBZ#1530647).
(cherry picked from commit e65cf15d35)
2018-01-10 14:37:04 +00:00
Richard W.M. Jones
7a76b44f15 Fix: ocaml: Insufficient sanitisation allows privilege escalation for
setuid binaries (CVE-2017-9772) (RHBZ#1464920).
2017-06-26 10:33:03 +01:00
20 changed files with 7861 additions and 1117 deletions

4
.gitignore vendored
View file

@ -2,7 +2,5 @@
/clog
/ocaml-*.tar.bz2
/ocaml-*.tar.gz
/ocaml-*.tar.xz
/ocaml-*-refman.pdf
/4.11.0.tar.gz
/4.13.1.tar.gz
/4.04.0+beta2.tar.gz

View file

@ -1,25 +1,29 @@
From 04e523e937625bf30d775681c11e00f6dc6fc00a Mon Sep 17 00:00:00 2001
From fc5ac0d955afce294fe58a20cab8e9dda572de78 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 24 Jun 2014 10:00:15 +0100
Subject: [PATCH 1/2] Don't add rpaths to libraries.
Subject: [PATCH 01/11] Don't add rpaths to libraries.
---
configure.ac | 2 --
1 file changed, 2 deletions(-)
tools/Makefile.shared | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/configure.ac b/configure.ac
index 3754ad8a39..fb60c7c14c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1422,8 +1422,6 @@ AS_IF([test x"$enable_shared" != "xno"],
[[*-*-openbsd7.[3-9]|*-*-openbsd[89].*]],
[mkdll_flags="${mkdll_flags} -Wl,--no-execute-only"])
oc_ldflags="$oc_ldflags -Wl,-E"
- rpath="-Wl,-rpath,"
- mksharedlibrpath="-Wl,-rpath,"
natdynlinkopts="-Wl,-E"
supports_shared_libraries=true],
[mkdll='shared-libs-not-available'])
diff --git a/tools/Makefile.shared b/tools/Makefile.shared
index 2803d7860..d6c42bb4b 100644
--- a/tools/Makefile.shared
+++ b/tools/Makefile.shared
@@ -154,9 +154,9 @@ $(call byte_and_opt,ocamlmklib,ocamlmklibconfig.cmo config.cmo \
ocamlmklibconfig.ml: ../config/Makefile Makefile
(echo 'let bindir = "$(BINDIR)"'; \
echo 'let supports_shared_libraries = $(SUPPORTS_SHARED_LIBRARIES)';\
- echo 'let byteccrpath = "$(BYTECCRPATH)"'; \
- echo 'let nativeccrpath = "$(NATIVECCRPATH)"'; \
- echo 'let mksharedlibrpath = "$(MKSHAREDLIBRPATH)"'; \
+ echo 'let byteccrpath = ""'; \
+ echo 'let nativeccrpath = ""'; \
+ echo 'let mksharedlibrpath = ""'; \
echo 'let toolpref = "$(TOOLPREF)"'; \
sed -n -e 's/^#ml //p' ../config/Makefile) \
> ocamlmklibconfig.ml
--
2.52.0
2.13.1

View file

@ -1,25 +0,0 @@
From ef549c9a97838331877b139f407269db2a0fc691 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 29 May 2012 20:44:18 +0100
Subject: [PATCH 2/2] configure: Allow user defined C compiler flags.
---
configure.ac | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/configure.ac b/configure.ac
index fb60c7c14c..f6a493ccf5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3243,7 +3243,7 @@ AC_CONFIG_COMMANDS_PRE([
[mkexedebugflag="${mkexe_ldflags_prefix}${mkexedebugflag}"])
mkdll_ldflags=""
AS_IF([test -n "${LDFLAGS}"],
- [for flag in ${LDFLAGS}; do
+ [for flag in "${LDFLAGS}"; do
mkdll_ldflags="${mkdll_ldflags} ${mkexe_ldflags_prefix}${flag}"
done
mkdll_ldflags_exp="$mkdll_ldflags"])
--
2.52.0

View file

@ -0,0 +1,240 @@
From 61bdb02cedd1be6ecdc37bc4a80ffe3f19aa5521 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 02/11] 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..eb9a293e3
--- /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 = String.create len in
+ let _ = really_input ic sect 0 len in
+ get_string_list 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.13.1

View file

@ -0,0 +1,27 @@
From 2f93494aea56c9216bb561800a6861b653f409ce 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 03/11] configure: Allow user defined C compiler flags.
---
configure | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/configure b/configure
index f43893a4e..41c9315cc 100755
--- a/configure
+++ b/configure
@@ -1901,6 +1901,10 @@ if $with_fpic; then
echo "#define CAML_WITH_FPIC" >> m.h
fi
+# Allow user defined C Compiler flags
+bytecccompopts="$bytecccompopts $CFLAGS"
+nativecccompopts="$nativecccompopts $CFLAGS"
+
# Finish generated files
cclibs="$cclibs $mathlib"
--
2.13.1

View file

@ -0,0 +1,28 @@
From cdd42ba82210bfaa97cfa010eaac3d805b80cb49 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 3 Nov 2016 19:50:20 +0000
Subject: [PATCH 04/11] Don't rewrite -Werror.
In Fedora our CFLAGS contains -Wall -Werror=format-security.
As written, the sed phrase substitutes this with -Wall=format-security
which is bogus. Remove this rewriting completely.
---
Makefile | 1 -
1 file changed, 1 deletion(-)
diff --git a/Makefile b/Makefile
index 85be2db2a..1764d0ed3 100644
--- a/Makefile
+++ b/Makefile
@@ -409,7 +409,6 @@ utils/config.ml: utils/config.mlp config/Makefile
-e 's|%%CCOMPTYPE%%|cc|' \
-e 's|%%BYTECC%%|$(BYTECC) $(BYTECCCOMPOPTS) $(SHAREDCCCOMPOPTS)|' \
-e 's|%%NATIVECC%%|$(NATIVECC) $(NATIVECCCOMPOPTS)|' \
- -e '/c_compiler =/s| -Werror||' \
-e 's|%%PACKLD%%|$(PACKLD)|' \
-e 's|%%BYTECCLIBS%%|$(BYTECCLIBS)|' \
-e 's|%%NATIVECCLIBS%%|$(NATIVECCLIBS)|' \
--
2.13.1

View file

@ -0,0 +1,29 @@
From d4a20446fc8d00223b0c23726618407e451472e8 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 9 Nov 2016 11:01:15 -0500
Subject: [PATCH 05/11] PR#7405: s390x: Fix address of caml_raise_exn in native
dynlink modules.
This commit started as Fedora patch e732c39340e86939530a087744caa8d8f1247878.
(cherry picked from commit d6f24c5f4ee9408ac9a00e3de84f417450b41215)
---
asmcomp/s390x/emit.mlp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/asmcomp/s390x/emit.mlp b/asmcomp/s390x/emit.mlp
index 5d233a365..f99380aee 100644
--- a/asmcomp/s390x/emit.mlp
+++ b/asmcomp/s390x/emit.mlp
@@ -611,7 +611,7 @@ let emit_instr i =
| Lraise k ->
begin match k with
| Cmm.Raise_withtrace ->
- ` brasl %r14, {emit_symbol "caml_raise_exn"}\n`;
+ ` {emit_call "caml_raise_exn"}\n`;
let lbl = record_frame Reg.Set.empty true i.dbg in
`{emit_label lbl}:\n`
| Cmm.Raise_notrace ->
--
2.13.1

View file

@ -0,0 +1,35 @@
From 427232f0f36bfcaafcb1ec2f8da3d1daad0b1121 Mon Sep 17 00:00:00 2001
From: Nicolas Ojeda Bar <n.oje.bar@gmail.com>
Date: Tue, 8 Nov 2016 23:56:50 +0100
Subject: [PATCH 06/11] Adapt config.guess for RISC-V
---
config/gnu/config.guess | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/config/gnu/config.guess b/config/gnu/config.guess
index b79252d6b..8335398b2 100755
--- a/config/gnu/config.guess
+++ b/config/gnu/config.guess
@@ -2,7 +2,7 @@
# Attempt to guess a canonical system name.
# Copyright 1992-2013 Free Software Foundation, Inc.
-timestamp='2013-06-10'
+timestamp='2016-10-23'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -1001,6 +1001,9 @@ EOF
ppcle:Linux:*:*)
echo powerpcle-unknown-linux-${LIBC}
exit ;;
+ riscv*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux
+ exit ;;
s390:Linux:*:* | s390x:Linux:*:*)
echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
exit ;;
--
2.13.1

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,43 @@
From f1be77d69e28ad3bd128c6c757d966e90bbf73d3 Mon Sep 17 00:00:00 2001
From: Nicolas Ojeda Bar <n.oje.bar@gmail.com>
Date: Thu, 10 Nov 2016 14:12:53 +0100
Subject: [PATCH 08/11] Try fix for andi/ori/xori immediates (#1)
---
asmcomp/riscv/selection.ml | 13 -------------
1 file changed, 13 deletions(-)
diff --git a/asmcomp/riscv/selection.ml b/asmcomp/riscv/selection.ml
index 60ec5cb4e..ad2b26e9b 100644
--- a/asmcomp/riscv/selection.ml
+++ b/asmcomp/riscv/selection.ml
@@ -36,11 +36,6 @@ method! select_operation op args =
match (op, args) with
(* RISC-V does not support immediate operands for multiply high *)
| (Cmulhi, _) -> (Iintop Imulh, args)
- (* The and, or and xor instructions have a different range of immediate
- operands than the other instructions *)
- | (Cand, _) -> self#select_logical Iand args
- | (Cor, _) -> self#select_logical Ior args
- | (Cxor, _) -> self#select_logical Ixor args
(* Recognize (neg-)mult-add and (neg-)mult-sub instructions *)
| (Caddf, [Cop(Cmulf, [arg1; arg2]); arg3])
| (Caddf, [arg3; Cop(Cmulf, [arg1; arg2])]) ->
@@ -58,14 +53,6 @@ method! select_operation op args =
| _ ->
super#select_operation op args
-method select_logical op = function
- | [arg; Cconst_int n] when n >= 0 && n <= 0xFFF ->
- (Iintop_imm(op, n), [arg])
- | [Cconst_int n; arg] when n >= 0 && n <= 0xFFF ->
- (Iintop_imm(op, n), [arg])
- | args ->
- (Iintop op, args)
-
(* Instruction selection for conditionals *)
method! select_condition = function
--
2.13.1

View file

@ -0,0 +1,156 @@
From b81417ea168c3cf9454eeb41f1f723b66b3210aa Mon Sep 17 00:00:00 2001
From: Nicolas Ojeda Bar <n.oje.bar@gmail.com>
Date: Tue, 22 Nov 2016 22:30:35 +0100
Subject: [PATCH 09/11] Fix immediates' range when adjusting/indexing sp
---
asmcomp/riscv/arch.ml | 3 +++
asmcomp/riscv/emit.mlp | 53 ++++++++++++++++++++++++++++++++++------------
asmcomp/riscv/selection.ml | 2 +-
3 files changed, 44 insertions(+), 14 deletions(-)
diff --git a/asmcomp/riscv/arch.ml b/asmcomp/riscv/arch.ml
index 61a38b1dd..22c807c49 100644
--- a/asmcomp/riscv/arch.ml
+++ b/asmcomp/riscv/arch.ml
@@ -32,6 +32,9 @@ let spacetime_node_hole_pointer_is_live_before = function
type addressing_mode =
| Iindexed of int (* reg + displ *)
+let is_immediate n =
+ (n <= 2047) && (n >= -2048)
+
(* Sizes, endianness *)
let big_endian = false
diff --git a/asmcomp/riscv/emit.mlp b/asmcomp/riscv/emit.mlp
index 6d0e3aefd..97c49ce80 100644
--- a/asmcomp/riscv/emit.mlp
+++ b/asmcomp/riscv/emit.mlp
@@ -93,6 +93,34 @@ let emit_stack r =
let ofs = slot_offset s (register_class r) in `{emit_int ofs}(sp)`
| _ -> fatal_error "Emit.emit_stack"
+(* Adjust sp by the given byte amount *)
+
+let emit_stack_adjustment = function
+ | 0 -> ()
+ | n when is_immediate n ->
+ ` addi sp, sp, {emit_int n}\n`
+ | n ->
+ ` li {emit_reg reg_tmp1}, {emit_int n}\n`;
+ ` add sp, sp, {emit_reg reg_tmp1}\n`
+
+let emit_store src ofs =
+ if is_immediate ofs then
+ ` {emit_string stg} {emit_reg src}, {emit_int ofs}(sp)\n`
+ else begin
+ ` li {emit_reg reg_tmp1}, {emit_int ofs}\n`;
+ ` add {emit_reg reg_tmp1}, sp, {emit_reg reg_tmp1}\n`;
+ ` {emit_string stg} {emit_reg src}, 0({emit_reg reg_tmp1})\n`
+ end
+
+let emit_load dst ofs =
+ if is_immediate ofs then
+ ` {emit_string lg} {emit_reg dst}, {emit_int ofs}(sp)\n`
+ else begin
+ ` li {emit_reg reg_tmp1}, {emit_int ofs}\n`;
+ ` add {emit_reg reg_tmp1}, sp, {emit_reg reg_tmp1}\n`;
+ ` {emit_string lg} {emit_reg dst}, 0({emit_reg reg_tmp1})\n`
+ end
+
(* Record live pointers at call points *)
let record_frame_label ?label live raise_ dbg =
@@ -218,6 +246,7 @@ let name_for_specific = function
(* Name of current function *)
let function_name = ref ""
+
(* Entry point for tail recursive calls *)
let tailrec_entry_point = ref 0
@@ -234,12 +263,14 @@ let emit_instr i =
` mv {emit_reg dst}, {emit_reg src}\n`
| {loc = Reg _; typ = Float}, {loc = Reg _; typ = Float} ->
` fmv.d {emit_reg dst}, {emit_reg src}\n`
- | {loc = Reg _; typ = (Val | Int | Addr)}, {loc = Stack _} ->
- ` {emit_string stg} {emit_reg src}, {emit_stack dst}\n`
+ | {loc = Reg _; typ = (Val | Int | Addr)}, {loc = Stack s} ->
+ let ofs = slot_offset s (register_class dst) in
+ emit_store src ofs
| {loc = Reg _; typ = Float}, {loc = Stack _} ->
` fsd {emit_reg src}, {emit_stack dst}\n`
- | {loc = Stack _; typ = (Val | Int | Addr)}, {loc = Reg _ } ->
- ` {emit_string lg} {emit_reg dst}, {emit_stack src}\n`
+ | {loc = Stack s; typ = (Val | Int | Addr)}, {loc = Reg _} ->
+ let ofs = slot_offset s (register_class src) in
+ emit_load dst ofs
| {loc = Stack _; typ = Float}, {loc = Reg _} ->
` fld {emit_reg dst}, {emit_stack src}\n`
| _ ->
@@ -263,8 +294,7 @@ let emit_instr i =
let n = frame_size() in
if !contains_calls then
` {emit_string lg} ra, {emit_int(n - size_addr)}(sp)\n`;
- if n > 0 then
- ` addi sp, sp, {emit_int n}\n`;
+ emit_stack_adjustment n;
` jr {emit_reg i.arg.(0)}\n`
| Lop(Itailcall_imm {func; label_after = _}) ->
if func = !function_name then begin
@@ -273,8 +303,7 @@ let emit_instr i =
let n = frame_size() in
if !contains_calls then
` {emit_string lg} ra, {emit_int(n - size_addr)}(sp)\n`;
- if n > 0 then
- ` addi sp, sp, {emit_int n}\n`;
+ emit_stack_adjustment n;
` tail {emit_symbol func}\n`
end
| Lop(Iextcall{func; alloc = true; label_after = label}) ->
@@ -285,7 +314,7 @@ let emit_instr i =
` call {emit_symbol func}\n`
| Lop(Istackoffset n) ->
assert (n mod 16 = 0);
- ` addi sp, sp, {emit_int (-n)}\n`;
+ emit_stack_adjustment (-n);
stack_offset := !stack_offset + n
| Lop(Iload(Single, Iindexed ofs)) ->
` flw {emit_reg i.res.(0)}, {emit_int ofs}({emit_reg i.arg.(0)})\n`;
@@ -398,8 +427,7 @@ let emit_instr i =
` {emit_string lg} ra, {emit_int(n - size_addr)}(sp)\n`
| Lreturn ->
let n = frame_size() in
- if n > 0 then
- ` addi sp, sp, {emit_int n}\n`;
+ emit_stack_adjustment n;
` ret\n`
| Llabel lbl ->
`{emit_label lbl}:\n`
@@ -513,8 +541,7 @@ let fundecl fundecl =
` .align 2\n`;
`{emit_symbol fundecl.fun_name}:\n`;
let n = frame_size() in
- if n > 0 then
- ` addi sp, sp, {emit_int(-n)}\n`;
+ emit_stack_adjustment (-n);
if !contains_calls then
` {emit_string stg} ra, {emit_int(n - size_addr)}(sp)\n`;
`{emit_label !tailrec_entry_point}:\n`;
diff --git a/asmcomp/riscv/selection.ml b/asmcomp/riscv/selection.ml
index ad2b26e9b..283233679 100644
--- a/asmcomp/riscv/selection.ml
+++ b/asmcomp/riscv/selection.ml
@@ -22,7 +22,7 @@ class selector = object (self)
inherit Selectgen.selector_generic as super
-method is_immediate n = (n <= 0x7FF) && (n >= -0x800)
+method is_immediate n = is_immediate n
method select_addressing _ = function
| Cop(Cadda, [arg; Cconst_int n]) when self#is_immediate n ->
--
2.13.1

View file

@ -0,0 +1,131 @@
From ab30529b723d451fd0ea8ac64d24fc417af55541 Mon Sep 17 00:00:00 2001
From: Nicolas Ojeda Bar <n.oje.bar@gmail.com>
Date: Wed, 23 Nov 2016 12:38:28 +0100
Subject: [PATCH 10/11] Another immediate range fix
---
asmcomp/riscv/emit.mlp | 57 ++++++++++++++++++++++++++++++--------------------
1 file changed, 34 insertions(+), 23 deletions(-)
diff --git a/asmcomp/riscv/emit.mlp b/asmcomp/riscv/emit.mlp
index 97c49ce80..6cc190864 100644
--- a/asmcomp/riscv/emit.mlp
+++ b/asmcomp/riscv/emit.mlp
@@ -85,14 +85,6 @@ let emit_reg = function
| {loc = Reg r} -> emit_string (register_name r)
| _ -> fatal_error "Emit.emit_reg"
-(* Output a stack reference *)
-
-let emit_stack r =
- match r.loc with
- Stack s ->
- let ofs = slot_offset s (register_class r) in `{emit_int ofs}(sp)`
- | _ -> fatal_error "Emit.emit_stack"
-
(* Adjust sp by the given byte amount *)
let emit_stack_adjustment = function
@@ -103,7 +95,27 @@ let emit_stack_adjustment = function
` li {emit_reg reg_tmp1}, {emit_int n}\n`;
` add sp, sp, {emit_reg reg_tmp1}\n`
-let emit_store src ofs =
+let reload_ra n =
+ let ofs = n - size_addr in
+ if is_immediate ofs then
+ ` {emit_string lg} ra, {emit_int ofs}(sp)\n`
+ else begin
+ ` li {emit_reg reg_tmp1}, {emit_int ofs}\n`;
+ ` add {emit_reg reg_tmp1}, sp, {emit_reg reg_tmp1}\n`;
+ ` {emit_string lg} ra, 0({emit_reg reg_tmp1})\n`
+ end
+
+let store_ra n =
+ let ofs = n - size_addr in
+ if is_immediate ofs then
+ ` {emit_string stg} ra, {emit_int(n - size_addr)}(sp)\n`
+ else begin
+ ` li {emit_reg reg_tmp1}, {emit_int ofs}\n`;
+ ` add {emit_reg reg_tmp1}, sp, {emit_reg reg_tmp1}\n`;
+ ` {emit_string stg} ra, 0({emit_reg reg_tmp1})\n`
+ end
+
+let emit_store stg src ofs =
if is_immediate ofs then
` {emit_string stg} {emit_reg src}, {emit_int ofs}(sp)\n`
else begin
@@ -112,7 +124,7 @@ let emit_store src ofs =
` {emit_string stg} {emit_reg src}, 0({emit_reg reg_tmp1})\n`
end
-let emit_load dst ofs =
+let emit_load lg dst ofs =
if is_immediate ofs then
` {emit_string lg} {emit_reg dst}, {emit_int ofs}(sp)\n`
else begin
@@ -265,14 +277,16 @@ let emit_instr i =
` fmv.d {emit_reg dst}, {emit_reg src}\n`
| {loc = Reg _; typ = (Val | Int | Addr)}, {loc = Stack s} ->
let ofs = slot_offset s (register_class dst) in
- emit_store src ofs
- | {loc = Reg _; typ = Float}, {loc = Stack _} ->
- ` fsd {emit_reg src}, {emit_stack dst}\n`
+ emit_store stg src ofs
+ | {loc = Reg _; typ = Float}, {loc = Stack s} ->
+ let ofs = slot_offset s (register_class dst) in
+ emit_store "fsd" src ofs
| {loc = Stack s; typ = (Val | Int | Addr)}, {loc = Reg _} ->
let ofs = slot_offset s (register_class src) in
- emit_load dst ofs
- | {loc = Stack _; typ = Float}, {loc = Reg _} ->
- ` fld {emit_reg dst}, {emit_stack src}\n`
+ emit_load lg dst ofs
+ | {loc = Stack s; typ = Float}, {loc = Reg _} ->
+ let ofs = slot_offset s (register_class src) in
+ emit_load "fld" dst ofs
| _ ->
fatal_error "Emit: Imove"
end
@@ -292,8 +306,7 @@ let emit_instr i =
record_frame ~label i.live false i.dbg
| Lop(Itailcall_ind {label_after = _}) ->
let n = frame_size() in
- if !contains_calls then
- ` {emit_string lg} ra, {emit_int(n - size_addr)}(sp)\n`;
+ if !contains_calls then reload_ra n;
emit_stack_adjustment n;
` jr {emit_reg i.arg.(0)}\n`
| Lop(Itailcall_imm {func; label_after = _}) ->
@@ -301,8 +314,7 @@ let emit_instr i =
` j {emit_label !tailrec_entry_point}\n`
end else begin
let n = frame_size() in
- if !contains_calls then
- ` {emit_string lg} ra, {emit_int(n - size_addr)}(sp)\n`;
+ if !contains_calls then reload_ra n;
emit_stack_adjustment n;
` tail {emit_symbol func}\n`
end
@@ -424,7 +436,7 @@ let emit_instr i =
` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(2)}\n`
| Lreloadretaddr ->
let n = frame_size () in
- ` {emit_string lg} ra, {emit_int(n - size_addr)}(sp)\n`
+ reload_ra n
| Lreturn ->
let n = frame_size() in
emit_stack_adjustment n;
@@ -542,8 +554,7 @@ let fundecl fundecl =
`{emit_symbol fundecl.fun_name}:\n`;
let n = frame_size() in
emit_stack_adjustment (-n);
- if !contains_calls then
- ` {emit_string stg} ra, {emit_int(n - size_addr)}(sp)\n`;
+ if !contains_calls then store_ra n;
`{emit_label !tailrec_entry_point}:\n`;
emit_all fundecl.fun_body;
List.iter emit_call_gc !call_gc_sites;
--
2.13.1

File diff suppressed because it is too large Load diff

View file

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

View file

@ -1,69 +0,0 @@
# 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,6 +1,3 @@
# Don't add -Wl,-dT,<build dir>
%undefine _package_note_flags
# OCaml has a bytecode backend that works on anything with a C
# compiler, and a native code backend available on a subset of
# architectures. A further subset of architectures support native
@ -18,39 +15,27 @@
%global natdynlink 0
%endif
%global giturl https://github.com/ocaml/ocaml
# i686 support was dropped in OCaml 5 / Fedora 39.
ExcludeArch: %{ix86}
# These are all the architectures that the tests run on. The tests
# take a long time to run, so don't run them on slow machines.
%global test_arches %{arm64} %{power64} %{riscv64} s390x %{x86_64}
%global test_arches aarch64 %{power64} x86_64
# These are the architectures for which the tests must pass otherwise
# the build will fail.
#global test_arches_required aarch64 ppc64le x86_64
%global test_arches_required NONE
%global test_arches_required aarch64 %{power64} x86_64
# Architectures where parallel builds fail.
#global no_parallel_build_arches aarch64
#global rcver +git
%global rcver %{nil}
%global no_parallel_build_arches aarch64
Name: ocaml
Version: 5.5.0
Release: 2%{?dist}
Version: 4.04.0
Release: 11%{?dist}
Summary: OCaml compiler and programming environment
License: LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception
License: QPL and (LGPLv2+ with exceptions)
URL: https://www.ocaml.org
VCS: git:%{giturl}.git
URL: http://www.ocaml.org
Source0: %{giturl}/archive/%{version}%{rcver}/%{name}-%{version}%{rcver}.tar.gz
Source1: macros.ocaml-rpm
Source2: ocaml_files.py
Source0: http://caml.inria.fr/pub/distrib/ocaml-4.04/ocaml-%{version}.tar.gz
# IMPORTANT NOTE:
#
@ -61,55 +46,67 @@ Source2: ocaml_files.py
#
# https://pagure.io/fedora-ocaml
#
# Current branch: fedora-45-5.4.1
# Current branch: fedora-26-4.04.0
#
# ALTERNATIVELY add a patch to the end of the list (leaving the
# existing patches unchanged) adding a comment to note that it should
# be incorporated into the git repo at a later time.
#
Patch0001: 0001-Don-t-add-rpaths-to-libraries.patch
Patch0002: 0002-ocamlbyteinfo-ocamlplugininfo-Useful-utilities-from-.patch
Patch0003: 0003-configure-Allow-user-defined-C-compiler-flags.patch
Patch0004: 0004-Don-t-rewrite-Werror.patch
Patch0005: 0005-PR-7405-s390x-Fix-address-of-caml_raise_exn-in-nativ.patch
# Out of tree patches from
# https://github.com/nojb/riscv-ocaml
Patch0006: 0006-Adapt-config.guess-for-RISC-V.patch
Patch0007: 0007-Add-RISC-V-backend-runtime.patch
Patch0008: 0008-Try-fix-for-andi-ori-xori-immediates-1.patch
Patch0009: 0009-Fix-immediates-range-when-adjusting-indexing-sp.patch
Patch0010: 0010-Another-immediate-range-fix.patch
# ocaml: Insufficient sanitisation allows privilege escalation for
# setuid binaries (CVE-2017-9772)
# https://bugzilla.redhat.com/show_bug.cgi?id=1464920
Patch0011: 0011-cherry-pick-the-fix-for-MPR-7557-from-4.04.patch
# Fedora-specific patches
Patch: 0001-Don-t-add-rpaths-to-libraries.patch
Patch: 0002-configure-Allow-user-defined-C-compiler-flags.patch
BuildRequires: make
BuildRequires: git-core
BuildRequires: gcc
BuildRequires: autoconf
BuildRequires: binutils-devel
BuildRequires: ncurses-devel
BuildRequires: gdbm-devel
%ifnarch riscv64
BuildRequires: emacs
%endif
BuildRequires: gawk
BuildRequires: perl-interpreter
BuildRequires: annobin-annocheck
BuildRequires: pkgconfig(libzstd)
BuildRequires: perl
BuildRequires: util-linux
BuildRequires: libICE-devel
BuildRequires: libSM-devel
BuildRequires: libX11-devel
BuildRequires: libXaw-devel
BuildRequires: libXext-devel
BuildRequires: libXft-devel
BuildRequires: libXmu-devel
BuildRequires: libXrender-devel
BuildRequires: libXt-devel
BuildRequires: mesa-libGL-devel
BuildRequires: mesa-libGLU-devel
BuildRequires: chrpath
# Documentation requirements
BuildRequires: asciidoc
# ocamlopt runs gcc to link binaries. Because Fedora includes
# hardening flags automatically, redhat-rpm-config is also required.
# Compressed marshaling requires libzstd-devel.
Requires: gcc
Requires: redhat-rpm-config
Requires: libzstd-devel%{?_isa}
# Because we pass -c flag to ocaml-find-requires (to avoid circular
# dependencies) we also have to explicitly depend on the right version
# of ocaml-runtime.
Requires: ocaml-runtime%{?_isa} = %{version}-%{release}
Requires: ocaml-runtime = %{version}-%{release}
# 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 byterun/md5.{c,h}
Provides: bundled(md5-plumb)
Provides: ocaml(compiler) = %{version}
%if %{native_compiler}
%global __ocaml_requires_opts -c -f '%{buildroot}%{_bindir}/ocamlrun %{buildroot}%{_bindir}/ocamlobjinfo.byte' -i Dynlink_cmo_format -i Dynlink_cmxs_format
%else
%global __ocaml_requires_opts -c -f '%{buildroot}%{_bindir}/ocamlrun %{buildroot}%{_bindir}/ocamlobjinfo.byte' -i Backend_intf -i Inlining_decision_intf -i Simplify_boxed_integer_ops_intf
%endif
%global __ocaml_requires_opts -c -f '%{buildroot}%{_bindir}/ocamlrun %{buildroot}%{_bindir}/ocamlobjinfo.byte'
%global __ocaml_provides_opts -f '%{buildroot}%{_bindir}/ocamlrun %{buildroot}%{_bindir}/ocamlobjinfo.byte'
%description
OCaml is a high-level, strongly-typed, functional and object-oriented
programming language from the ML family of languages.
@ -121,16 +118,10 @@ and a comprehensive library.
%package runtime
# LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception: the project as a whole
# LicenseRef-Fedora-Public-Domain: the MD5 implementation in runtime/caml/md5.h
# and runtime/md5.c
License: LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception AND LicenseRef-Fedora-Public-Domain
Summary: OCaml runtime environment
Requires: util-linux
Provides: ocaml(runtime) = %{version}
# Bundles an MD5 implementation in runtime/caml/md5.h and runtime/md5.c
Provides: bundled(md5-plumb)
%description runtime
OCaml is a high-level, strongly-typed, functional and object-oriented
programming language from the ML family of languages.
@ -141,28 +132,46 @@ bytecode.
%package source
Summary: Source code for OCaml libraries
Requires: ocaml%{?_isa} = %{version}-%{release}
Requires: ocaml = %{version}-%{release}
%description source
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
# LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception: the project as a whole
# LicenseRef-Fedora-Public-Domain: ocamldoc/ocamldoc.sty
License: LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception AND LicenseRef-Fedora-Public-Domain
Summary: Documentation generator for OCaml
Requires: ocaml%{?_isa} = %{version}-%{release}
Provides: ocamldoc = %{version}
Requires: ocaml = %{version}-%{release}
Provides: ocamldoc
%description ocamldoc
Documentation generator for OCaml.
%ifnarch riscv64
%package emacs
Summary: Emacs mode for OCaml
Requires: ocaml = %{version}-%{release}
Requires: emacs(bin)
%description emacs
Emacs mode for OCaml.
%endif
%package docs
Summary: Documentation for OCaml
BuildArch: noarch
Requires: ocaml = %{version}-%{release}
Requires(post): /sbin/install-info
Requires(preun): /sbin/install-info
%description docs
@ -174,7 +183,7 @@ This package contains man pages.
%package compiler-libs
Summary: Compiler libraries for OCaml
Requires: ocaml%{?_isa} = %{version}-%{release}
Requires: ocaml = %{version}-%{release}
%description compiler-libs
@ -187,253 +196,205 @@ Note that this exposes internal details of the OCaml compiler which
may not be portable between versions.
%package rpm-macros
# LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception: the project as a whole
# BSD-3-Clause: ocaml_files.py
License: LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception AND BSD-3-Clause
Summary: RPM macros for building OCaml packages
BuildArch: noarch
Requires: ocaml = %{version}-%{release}
Requires: python3
%description rpm-macros
This package contains macros that are useful for building OCaml RPMs.
%prep
%autosetup -S git -n %{name}-%{version}%{rcver}
# Patches touch configure.ac, so rebuild it:
autoconf --force
%setup -q -T -b 0 -n %{name}-%{version}
%autopatch -p1
%build
%ifnarch %{no_parallel_build_arches}
make="%make_build"
make="make %{?_smp_mflags}"
%else
unset MAKEFLAGS
make=make
%endif
# Set ocamlmklib default flags to include Fedora linker flags
sed -i '/ld_opts/s|\[\]|["%{build_ldflags}"]|' tools/ocamlmklib.ml
# Expose a dependency on the math library
sed -i '/^EXTRACAMLFLAGS=/aLINKOPTS=-cclib -lm' otherlibs/unix/Makefile
# Don't use %%configure macro because it sets --build, --host which
# breaks some incorrect assumptions made by OCaml's configure.ac
#
# 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.
CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing" \
./configure \
--prefix=%{_prefix} \
--sysconfdir=%{_sysconfdir} \
--mandir=%{_mandir} \
--libdir=%{_libdir}/ocaml \
--enable-flambda \
%if %{native_compiler}
--enable-native-compiler \
--enable-native-toplevel \
%else
--disable-native-compiler \
--disable-native-toplevel \
%endif
%ifarch %{x86_64} %{arm64}
%if 0%{?_include_frame_pointers}
--enable-frame-pointers \
%endif
%endif
%ifarch %{test_arches}
--enable-ocamltest \
%else
--disable-ocamltest \
%endif
OC_CFLAGS='%{build_cflags}' \
OC_LDFLAGS='%{build_ldflags}' \
%{nil}
-bindir %{_bindir} \
-libdir %{_libdir}/ocaml \
-x11lib %{_libdir} \
-x11include %{_includedir} \
-mandir %{_mandir}/man1 \
-no-curses
$make world
%if %{native_compiler}
$make opt
$make opt.opt
%endif
%ifnarch riscv64
make -C emacs ocamltags
%endif
# Build the README and fix up references to other doc files
asciidoc -d book README.adoc
for fil in CONTRIBUTING.md HACKING.adoc INSTALL.adoc README.win32.adoc; do
sed -e "s,\"$fil\",\"https://github.com/ocaml/ocaml/blob/trunk/$fil\"," \
-i README.html
done
# Currently these tools are supplied by Debian, but are expected
# to go upstream at some point.
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"
boot/ocamlrun ./ocamlc $includes dynlinkaux.cmo ocamlbyteinfo.ml -o ocamlbyteinfo
# ocamlplugininfo doesn't compile because it needs 'dynheader' (type
# decl) and I have no idea where that comes from
#cp otherlibs/dynlink/natdynlink.ml .
#boot/ocamlrun ./ocamlopt $includes unix.cmxa str.cmxa natdynlink.ml ocamlplugininfo.ml -o ocamlplugininfo
%check
%ifarch %{ocaml_native_compiler}
# 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}
cd testsuite
%ifarch %{test_arches_required}
make -j1 tests
make -j1 all
%else
make -j1 tests ||:
make -j1 all ||:
%endif
%endif
%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
# OCaml 5.5.0 uses relative paths in ld.conf by default to support relocatable
# OCaml, which we don't need. Overwrite ld.conf with the absolute path.
echo %{_libdir}/ocaml/stublibs > $RPM_BUILD_ROOT%{_libdir}/ocaml/ld.conf
%ifnarch riscv64
(
# 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}
)
%endif
echo %{version} > $RPM_BUILD_ROOT%{_libdir}/ocaml/fedora-ocaml-release
# Remove the installed documentation. We will install it using %%doc
rm -rf $RPM_BUILD_ROOT%{_docdir}/ocaml
# Remove rpaths from stublibs .so files.
chrpath --delete $RPM_BUILD_ROOT%{_libdir}/ocaml/stublibs/*.so
mkdir -p $RPM_BUILD_ROOT%{rpmmacrodir}
install -m 0644 %{SOURCE1} $RPM_BUILD_ROOT%{rpmmacrodir}/macros.ocaml-rpm
install -m 0755 ocamlbyteinfo $RPM_BUILD_ROOT%{_bindir}
#install -m 0755 ocamlplugininfo $RPM_BUILD_ROOT%{_bindir}
mkdir -p $RPM_BUILD_ROOT%{_rpmconfigdir}/redhat
install -m 0644 %{SOURCE2} $RPM_BUILD_ROOT%{_rpmconfigdir}/redhat
find $RPM_BUILD_ROOT -name .ignore -delete
# Remove .cmt and .cmti files, for now. We could package them later.
# See also: http://www.ocamlpro.com/blog/2012/08/20/ocamlpro-and-4.00.0.html
find $RPM_BUILD_ROOT \( -name '*.cmt' -o -name '*.cmti' \) -a -delete
%files
%license LICENSE
%doc LICENSE
%{_bindir}/ocaml
%{_bindir}/ocamlcmt
%{_bindir}/ocamlcp
%{_bindir}/ocamlbyteinfo
%{_bindir}/ocamldebug
%{_bindir}/ocamlmklib
%{_bindir}/ocamlmktop
%{_bindir}/ocamlprof
#%{_bindir}/ocamlplugininfo
%{_bindir}/ocamlyacc
# symlink to either .byte or .opt version
%{_bindir}/ocamlc
%{_bindir}/ocamlcp
%{_bindir}/ocamldep
%{_bindir}/ocamllex
%{_bindir}/ocamlmklib
%{_bindir}/ocamlmktop
%{_bindir}/ocamlobjinfo
%{_bindir}/ocamloptp
%{_bindir}/ocamlprof
# bytecode versions
%{_bindir}/ocamlc.byte
%{_bindir}/ocamlcp.byte
%{_bindir}/ocamldep.byte
%{_bindir}/ocamllex.byte
%{_bindir}/ocamlmklib.byte
%{_bindir}/ocamlmktop.byte
%{_bindir}/ocamlobjinfo.byte
%{_bindir}/ocamloptp.byte
%{_bindir}/ocamlprof.byte
%if %{native_compiler}
# native code versions
%{_bindir}/ocamlc.opt
%{_bindir}/ocamlcp.opt
%{_bindir}/ocamldep.opt
%{_bindir}/ocamllex.opt
%{_bindir}/ocamlmklib.opt
%{_bindir}/ocamlmktop.opt
%{_bindir}/ocamlobjinfo.opt
%{_bindir}/ocamloptp.opt
%{_bindir}/ocamlprof.opt
%endif
%if %{native_compiler}
%{_bindir}/ocamlnat
%{_bindir}/ocamlopt
%{_bindir}/ocamlopt.byte
%{_bindir}/ocamlopt.opt
%{_bindir}/ocamloptp
%endif
#%{_libdir}/ocaml/addlabels
#%{_libdir}/ocaml/scrapelabels
%{_libdir}/ocaml/camlheader
%{_libdir}/ocaml/camlheader_ur
%{_libdir}/ocaml/expunge
%{_libdir}/ocaml/extract_crc
%{_libdir}/ocaml/ld.conf
%{_libdir}/ocaml/Makefile.config
%{_libdir}/ocaml/*.a
%if %{natdynlink}
%{_libdir}/ocaml/*.cmxs
%endif
%if %{native_compiler}
%{_libdir}/ocaml/*.cmxa
%{_libdir}/ocaml/*.cmx
%{_libdir}/ocaml/*.o
%{_libdir}/ocaml/libasmrun_shared.so
%endif
%{_libdir}/ocaml/*.mli
%{_libdir}/ocaml/sys.ml.in
%{_libdir}/ocaml/{dynlink,runtime_events,str,threads,unix}/*.mli
%{_libdir}/ocaml/libcamlrun_shared.so
%{_libdir}/ocaml/objinfo_helper
%{_libdir}/ocaml/vmthreads/*.mli
%{_libdir}/ocaml/vmthreads/*.a
%if %{native_compiler}
%{_libdir}/ocaml/{dynlink,runtime_events,str,threads,unix}/*.a
%{_libdir}/ocaml/{dynlink,runtime_events,str,threads,unix}/*.cmxa
%{_libdir}/ocaml/{dynlink,profiling,runtime_events,str,threads,unix}/*.cmx
%{_libdir}/ocaml/profiling/*.o
%{_libdir}/ocaml/threads/*.a
%{_libdir}/ocaml/threads/*.cmxa
%{_libdir}/ocaml/threads/*.cmx
%endif
%if %{natdynlink}
%{_libdir}/ocaml/{runtime_events,str,unix}/*.cmxs
%endif
# headers
%{_libdir}/ocaml/caml
%exclude %{_libdir}/ocaml/graphicsX11.mli
%files runtime
%doc README.html Changes
%license LICENSE
%doc README.adoc LICENSE Changes
%{_bindir}/ocamlrun
%{_bindir}/*ocamlrun-a100
%{_bindir}/ocamlrund
%{_bindir}/*ocamlrund-a100
%{_bindir}/ocamlruni
%{_bindir}/*ocamlruni-a100
%dir %{_libdir}/ocaml
%{_libdir}/ocaml/libasmrun*.so
%{_libdir}/ocaml/libcamlrun*.so
%{_libdir}/ocaml/VERSION
%{_libdir}/ocaml/*.cmo
%{_libdir}/ocaml/*.cmi
%{_libdir}/ocaml/*.cma
%{_libdir}/ocaml/ld.conf
%{_libdir}/ocaml/stublibs
%dir %{_libdir}/ocaml/dynlink
%{_libdir}/ocaml/dynlink/META
%{_libdir}/ocaml/dynlink/*.cmi
%{_libdir}/ocaml/dynlink/*.cma
%dir %{_libdir}/ocaml/profiling
%{_libdir}/ocaml/profiling/*.cmo
%{_libdir}/ocaml/profiling/*.cmi
%dir %{_libdir}/ocaml/runtime_events
%{_libdir}/ocaml/runtime_events/META
%{_libdir}/ocaml/runtime_events/*.cmi
%{_libdir}/ocaml/runtime_events/*.cma
%{_libdir}/ocaml/runtime-launch-info
%{_libdir}/ocaml/stdlib
%dir %{_libdir}/ocaml/str
%{_libdir}/ocaml/str/META
%{_libdir}/ocaml/str/*.cmi
%{_libdir}/ocaml/str/*.cma
%dir %{_libdir}/ocaml/vmthreads
%{_libdir}/ocaml/vmthreads/*.cmi
%{_libdir}/ocaml/vmthreads/*.cma
%dir %{_libdir}/ocaml/threads
%{_libdir}/ocaml/threads/META
%{_libdir}/ocaml/threads/*.cmi
%{_libdir}/ocaml/threads/*.cma
%dir %{_libdir}/ocaml/unix
%{_libdir}/ocaml/unix/META
%{_libdir}/ocaml/unix/*.cmi
%{_libdir}/ocaml/unix/*.cma
%{_libdir}/ocaml/fedora-ocaml-release
%exclude %{_libdir}/ocaml/graphicsX11.cmi
%files source
%license LICENSE
%doc LICENSE
%{_libdir}/ocaml/*.ml
%{_libdir}/ocaml/*.cmt*
%{_libdir}/ocaml/*/*.cmt*
%files x11
%doc LICENSE
%{_libdir}/ocaml/graphicsX11.cmi
%{_libdir}/ocaml/graphicsX11.mli
%files ocamldoc
%license LICENSE
%doc LICENSE
%doc ocamldoc/Changes.txt
%{_bindir}/ocamldoc*
%{_libdir}/ocaml/ocamldoc
@ -444,321 +405,36 @@ install -m 0644 %{SOURCE2} $RPM_BUILD_ROOT%{_rpmconfigdir}/redhat
%{_mandir}/man3/*
%ifnarch riscv64
%files emacs
%doc emacs/README
%{_datadir}/emacs/site-lisp/*
%{_bindir}/ocamltags
%endif
%files compiler-libs
%license LICENSE
%{_libdir}/ocaml/compiler-libs
%files rpm-macros
%{rpmmacrodir}/macros.ocaml-rpm
%{_rpmconfigdir}/redhat/ocaml_files.py
%doc LICENSE
%dir %{_libdir}/ocaml/compiler-libs
%{_libdir}/ocaml/compiler-libs/*.cmi
%{_libdir}/ocaml/compiler-libs/*.cmo
%{_libdir}/ocaml/compiler-libs/*.cma
%if %{native_compiler}
%{_libdir}/ocaml/compiler-libs/*.a
%{_libdir}/ocaml/compiler-libs/*.cmxa
%{_libdir}/ocaml/compiler-libs/*.cmx
%{_libdir}/ocaml/compiler-libs/*.o
%endif
%changelog
* Thu Jul 16 2026 Fedora Release Engineering <releng@fedoraproject.org> - 5.5.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild
* Tue Jun 23 2026 Jerry James <loganjerry@gmail.com> - 5.5.0-1
- New upstream version 5.5.0 (RHBZ#2442622)
- Drop upstreamed fix for arm64 frame pointers
- Reenable LTO
- Move ld.conf, libasmrun, and libcamlrun to ocaml-runtime
- Drop hardlink dependency; rpm now does this by default
- Drop unused utilx-linux dependency
* Thu Feb 26 2026 Richard W.M. Jones <rjones@redhat.com> - 5.4.1-4
- Backport fix for arm64 frame pointers
* Fri Feb 20 2026 Richard W.M. Jones <rjones@redhat.com> - 5.4.1-1
- New upstream version 5.4.1 (RHBZ#2440356)
* Fri Jan 16 2026 Fedora Release Engineering <releng@fedoraproject.org> - 5.4.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild
* Mon Oct 13 2025 Richard W.M. Jones <rjones@redhat.com> - 5.4.0-1
- New upstream version 5.4.0 (RHBZ#2368289)
* Thu Jul 24 2025 Fedora Release Engineering <releng@fedoraproject.org> - 5.3.0-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
* Sun Jun 22 2025 Yaakov Selkowitz <yselkowi@redhat.com> - 5.3.0-3
- Fix RPM macros for Python 3.14
* Fri Jan 17 2025 Fedora Release Engineering <releng@fedoraproject.org> - 5.3.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
* Thu Jan 9 2025 Jerry James <loganjerry@gmail.com> - 5.3.0-1
- New upstream version 5.3.0
- Drop upstreamed patches
- BR git-core instead of git
* Thu Jul 18 2024 Fedora Release Engineering <releng@fedoraproject.org> - 5.2.0-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
* Wed Jun 19 2024 Richard W.M. Jones <rjones@redhat.com> - 5.2.0-2
- Add fix for ppc64le code generation issue found after 5.2.0 was released
* Thu May 23 2024 Jerry James <loganjerry@gmail.com> - 5.2.0-1
- New upstream version 5.2.0 (RHBZ#2269805)
- Drop upstreamed frame pointer and s390x patches
* Thu Jan 25 2024 Fedora Release Engineering <releng@fedoraproject.org> - 5.1.1-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Sun Jan 21 2024 Fedora Release Engineering <releng@fedoraproject.org> - 5.1.1-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Mon Dec 18 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.1-2
- Add s390x code generation fix
https://github.com/ocaml/ocaml/issues/12829
* Mon Dec 11 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.1-1
- New upstream version 5.1.1 (RHBZ#2239227)
* Tue Nov 14 2023 Yaakov Selkowitz <yselkowi@redhat.com> - 5.1.0-5
- Drop unused BR parallel
* Fri Oct 06 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.0-4
- Use BR ocaml-srpm-macros to force latest to be built against
* Thu Oct 05 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.0-3
- Rebuild against updated ocaml-srpm-macros
* Thu Oct 5 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.0-2
- Add upstream patch added after 5.1.0
* Wed Oct 4 2023 Jerry James <loganjerry@gmail.com> - 5.1.0-1
- Version 5.1.0
- Add LicenseRef-Fedora-Public-Domain to the runtime License field
- New ocaml-rpm-macros subpackage
- Depend on libzstd-devel for compressed marshaling
- Disable LTO
* Thu Jul 20 2023 Fedora Release Engineering <releng@fedoraproject.org> - 5.0.0-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
* Wed Jul 12 2023 Richard W.M. Jones <rjones@redhat.com> - 5.0.0-3
- Force ocaml-srpm-macros to be the latest version.
* Wed Jun 14 2023 Jerry James <loganjerry@gmail.com> - 5.0.0-2
- Version 5.0.0
- Convert License tag to SPDX
- Ship HTML documentation instead of asciidoc source
- Set ocamlmklib default flags to the Fedora linker flags
- Enable frame pointers on x86_64
* Mon Jan 23 2023 Richard W.M. Jones <rjones@redhat.com> - 4.14.0-5
- Rebuild OCaml packages for F38
* 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
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
* Wed Jul 11 2018 Richard W.M. Jones <rjones@redhat.com> - 4.07.0-1
- OCaml 4.07.0 (RHBZ#1536734).
* Tue Jun 26 2018 Richard W.M. Jones <rjones@redhat.com> - 4.07.0-0.rc1.3
- Enable emacs again on riscv64.
* Tue Jun 19 2018 Richard W.M. Jones <rjones@redhat.com> - 4.07.0-0.rc1.2
- OCaml 4.07.0-rc1 (RHBZ#1536734).
* Tue Jun 5 2018 Richard W.M. Jones <rjones@redhat.com> - 4.07.0-0.beta2.1
- Add RISC-V patch to add debuginfo (DWARF) generation.
* Thu Apr 26 2018 Richard W.M. Jones <rjones@redhat.com> - 4.07.0-0.beta2.0
- OCaml 4.07.0-beta2 (RHBZ#1536734).
* Sun Feb 25 2018 Richard W.M. Jones <rjones@redhat.com> - 4.06.0-5
- Add another couple of RISC-V patches from nojb branch.
* Sat Feb 24 2018 Richard W.M. Jones <rjones@redhat.com> - 4.06.0-4
- Remove mesa* dependencies which are not needed.
* Thu Feb 08 2018 Fedora Release Engineering <releng@fedoraproject.org> - 4.06.0-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
* Wed Jan 10 2018 Richard W.M. Jones <rjones@redhat.com> - 4.06.0-2
* Wed Jan 10 2018 Richard W.M. Jones <rjones@redhat.com> - 4.04.0-11
- Drop non-free documentation (RHBZ#1530647).
* Mon Nov 06 2017 Richard W.M. Jones <rjones@redhat.com> - 4.06.0-1
- New upstream version 4.06.0.
- Enable parallel builds again.
- Rebase patches.
- New binary ocamlcmt.
* Wed Sep 13 2017 Richard W.M. Jones <rjones@redhat.com> - 4.05.0-4
- Add final upstream fix for aarch64/binutils relocation problems.
https://github.com/ocaml/ocaml/pull/1330
* Wed Sep 06 2017 Richard W.M. Jones <rjones@redhat.com> - 4.05.0-3
- Include interim fix for aarch64/binutils relocation problems.
* Sat Aug 05 2017 Richard W.M. Jones <rjones@redhat.com> - 4.05.0-2
- New upstream version 4.05.0.
- Disable parallel builds for now.
- *.mli files are now included in ocaml-compiler-libs.
- Add possible fix for aarch64 with new binutils.
* Sat Aug 05 2017 Richard W.M. Jones <rjones@redhat.com> - 4.04.2-4
- Disable tests on aarch64 (https://caml.inria.fr/mantis/view.php?id=7602)
* Thu Aug 03 2017 Fedora Release Engineering <releng@fedoraproject.org> - 4.04.2-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild
* Thu Jul 27 2017 Fedora Release Engineering <releng@fedoraproject.org> - 4.04.2-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
* Mon Jun 26 2017 Richard W.M. Jones <rjones@redhat.com> - 4.04.2-1
- New upstream version 4.04.2.
* Mon Jun 26 2017 Richard W.M. Jones <rjones@redhat.com> - 4.04.0-10
- Fix: ocaml: Insufficient sanitisation allows privilege escalation for
setuid binaries (CVE-2017-9772) (RHBZ#1464920).
* Wed May 10 2017 Richard W.M. Jones <rjones@redhat.com> - 4.04.1-1
- New upstream version 4.04.1.
* Sat Feb 11 2017 Fedora Release Engineering <releng@fedoraproject.org> - 4.04.0-9
- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild

View file

@ -1,451 +0,0 @@
# 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-5.5.0.tar.gz) = bf13c18cd1fc7b2e5e9623024ea8623710f646ff2fbc0f59dab70e4d4318ed8623bdcc3ec59ce37af07af2b767f520dea23fb474c26297b3e858b6c8e080b4e6
496f99822133bb905171bae8f64b7be4 ocaml-4.04.0.tar.gz

View file

@ -1,10 +0,0 @@
#!/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

View file

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