Compare commits

..

45 commits

Author SHA1 Message Date
Fedora Release Engineering
cba5f7abbe Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild 2026-07-16 09:52:03 +00:00
Jerry James
b015f12145 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
2026-07-09 08:36:23 -06:00
Richard W.M. Jones
5a8dd543c6 Backport fix for arm64 frame pointers 2026-02-26 12:59:34 +00:00
Richard W.M. Jones
2e0cb1fe44 Fix version in changelog - current version is 5.4.1, not 5.4.0
Fixes: commit e3af15bd11
2026-02-26 12:57:23 +00:00
Richard W.M. Jones
e3af15bd11 New upstream version 5.4.0 (RHBZ#2440356) 2026-02-20 11:20:03 +00:00
Richard W.M. Jones
360b98ce78 Enable frame pointers on aarch64
Suggested-by: Jerry James
2026-02-18 17:53:18 +00:00
Richard W.M. Jones
ee9df08052 Replace x86_64 with %{x86_64}
On Rawhide this macro expands to:

  x86_64 x86_64_v2 x86_64_v3 x86_64_v4 amd64 em64t

Suggested-by: Jerry James
2026-02-18 17:52:32 +00:00
Richard W.M. Jones
c129230259 Move bundle to the -runtime subpackage
Suggested-by: Jerry James
2026-02-18 17:51:10 +00:00
Fedora Release Engineering
aa50731ee3 Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild 2026-01-16 22:24:41 +00:00
Richard W.M. Jones
ebbc5125da Fix branch name in comment 2025-10-13 11:17:54 +01:00
Richard W.M. Jones
bc284a4d37 New upstream version 5.4.0 (RHBZ#2368289) 2025-10-13 11:02:33 +01:00
Fedora Release Engineering
b9c837a453 Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild 2025-07-24 23:06:40 +00:00
Yaakov Selkowitz
5b0d3a3f5d Fix RPM macros for Python 3.14
A change to argparse in 3.14 is leading it to misinterpret the '%' in
'%files' as an operator.  Escaping it makes it compatible with both 3.14
and earlier versions.
2025-06-22 15:52:34 -04:00
Fedora Release Engineering
9d17af02a5 Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild 2025-01-17 20:40:47 +00:00
Jerry James
5018fa7019 New upstream version 5.3.0
- Drop upstreamed patches
- BR git-core instead of git
2025-01-09 08:24:42 -07:00
Fedora Release Engineering
a7c6be2f53 Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild 2024-07-18 19:59:15 +00:00
Jerry James
0e1aab5f28 Fix the VCS field 2024-07-17 11:25:19 -06:00
Richard W.M. Jones
561453cd2d Add RHEL 10 gating tests 2024-06-19 08:25:18 +01:00
Richard W.M. Jones
13ff7d0244 Add fix for ppc64le code generation issue found after 5.2.0 was released 2024-06-19 08:05:08 +01:00
Richard W.M. Jones
7f5edb92c0 New upstream version 5.2.0 (RHBZ#2269805) 2024-05-29 11:26:00 +01:00
Jerry James
f299c84c6d Version 5.2.0
- Drop upstreamed frame pointer and s390x patches
2024-05-23 09:00:25 -06:00
Fedora Release Engineering
a3771460e1 Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild 2024-01-25 09:45:15 +00:00
Fedora Release Engineering
2883f28bbd Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild 2024-01-21 10:09:11 +00:00
Richard W.M. Jones
4f34985ad8 Add s390x code generation fix
https://github.com/ocaml/ocaml/issues/12829
2023-12-18 11:07:28 +00:00
Richard W.M. Jones
b40114b0c9 New upstream version 5.1.1 (RHBZ#2239227) 2023-12-11 22:34:35 +00:00
Yaakov Selkowitz
48b6d0088d Drop unused BR parallel
GNU parallel is only used by make parallel in the testsuite directory;
the toplevel make tests calls make all in testsuite.
2023-11-13 22:14:14 -05:00
Jerry James
ebbf4c122f Configure with --enable-ocamltest on test_arches 2023-10-13 08:38:51 -06:00
Richard W.M. Jones
2ec55e949b Use BR ocaml-srpm-macros to force latest to be built against 2023-10-06 12:40:21 +01:00
Richard W.M. Jones
a8e366538a Rebuild against updated ocaml-srpm-macros
I managed to build it against the old ocaml-srpm-macros, thus native
compilation was disabled still on s390x.  Hopefully bump and rebuild
after adding ocaml-srpm-macros to the side tag will fix this.
2023-10-05 10:53:13 +01:00
Richard W.M. Jones
c37874e266 Add upstream patch added after 5.1.0 2023-10-05 09:58:44 +01:00
Jerry James
a433439c10 Version 5.1.0
Other changes:
- Add LicenseRef-Fedora-Public-Domain to the runtime License field
- New ocaml-rpm-macros subpackage
- Depend on libzstd-devel for compressed marshaling
- Disable LTO
2023-10-04 20:56:33 -06:00
Fedora Release Engineering
4a09b96d7b Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2023-07-20 17:09:37 +00:00
Richard W.M. Jones
64f662b9c5 Force ocaml-srpm-macros to be the latest version. 2023-07-12 11:28:00 +01:00
Richard W.M. Jones
5ebc943f98 Add all further differences with jjames's OCaml 5 package 2023-07-11 17:49:54 +01:00
Richard W.M. Jones
772b17b666 Drop downstream 0017-configure-Only-use-OC_-for-building-executables.patch
This is no longer needed now we found another way to work around build
notes breakage.
2023-07-11 17:46:39 +01:00
Richard W.M. Jones
be2dfe04db Fix compilation on bytecode-only arches
File not found: /builddir/build/BUILDROOT/ocaml-5.0.0-1.fc39.ppc64le/usr/lib64/ocaml/{dynlink,runtime_events,str,threads,unix}/*.a
2023-07-11 08:31:48 +01:00
Richard W.M. Jones
cec11e3cd8 --enable-frame-pointers only works on x86-64 2023-07-10 22:43:58 +01:00
Richard W.M. Jones
68671b2fe6 OCaml 5.0 2023-07-10 22:08:39 +01:00
Richard W.M. Jones
c5a44d336b Rebuild OCaml packages for F38 2023-01-23 21:44:47 +00:00
Fedora Release Engineering
c4c11c263c Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2023-01-19 22:00:44 +00:00
Richard W.M. Jones
6fbb4db452 Include more upstream patches from 4.14 branch
Don't use %configure macro because that breaks on riscv64.
https://bugzilla.redhat.com/2124272
2022-09-06 13:34:55 +01:00
Fedora Release Engineering
38e7f9a43c Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2022-07-22 01:04:51 +00:00
Richard W.M. Jones
73c8e3d782 New upstream version 4.14.0 2022-06-18 12:29:36 +01:00
Richard W.M. Jones
4bb2864cc2 Upload renamed sources file 2022-06-09 22:37:55 +01:00
Jerry James
3eca5f5ac7 Fix the Source0 URL
- chrpath is no longer needed
- Use the %license macro
- Build the test binaries so the tests will run
2022-06-09 14:42:27 -06:00
11 changed files with 876 additions and 235 deletions

View file

@ -1,27 +1,25 @@
From 23f2e84d360208759c7d82b7ff795770ce6cf0b2 Mon Sep 17 00:00:00 2001
From 04e523e937625bf30d775681c11e00f6dc6fc00a Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 24 Jun 2014 10:00:15 +0100
Subject: [PATCH 1/4] Don't add rpaths to libraries.
Subject: [PATCH 1/2] Don't add rpaths to libraries.
---
utils/config.mlp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
configure.ac | 2 --
1 file changed, 2 deletions(-)
diff --git a/utils/config.mlp b/utils/config.mlp
index bbb3c5694..57d509cd0 100644
--- a/utils/config.mlp
+++ b/utils/config.mlp
@@ -55,8 +55,8 @@ let native_c_compiler =
let native_c_libraries = "%%NATIVECCLIBS%%"
let native_pack_linker = "%%PACKLD%%"
let ranlib = "%%RANLIBCMD%%"
-let default_rpath = "%%RPATH%%"
-let mksharedlibrpath = "%%MKSHAREDLIBRPATH%%"
+let default_rpath = ""
+let mksharedlibrpath = ""
let ar = "%%ARCMD%%"
let supports_shared_libraries = %%SUPPORTS_SHARED_LIBRARIES%%
let mkdll, mkexe, mkmaindll =
diff --git a/configure.ac b/configure.ac
index 3754ad8a39..fb60c7c14c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1422,8 +1422,6 @@ AS_IF([test x"$enable_shared" != "xno"],
[[*-*-openbsd7.[3-9]|*-*-openbsd[89].*]],
[mkdll_flags="${mkdll_flags} -Wl,--no-execute-only"])
oc_ldflags="$oc_ldflags -Wl,-E"
- rpath="-Wl,-rpath,"
- mksharedlibrpath="-Wl,-rpath,"
natdynlinkopts="-Wl,-E"
supports_shared_libraries=true],
[mkdll='shared-libs-not-available'])
--
2.32.0
2.52.0

View file

@ -1,27 +1,25 @@
From 9966786a7389dc6621f2bc2dce7c690c5a38b67d Mon Sep 17 00:00:00 2001
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/4] configure: Allow user defined C compiler flags.
Subject: [PATCH 2/2] configure: Allow user defined C compiler flags.
---
configure.ac | 4 ++++
1 file changed, 4 insertions(+)
configure.ac | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/configure.ac b/configure.ac
index 3698c7cbf..e2a3cbea0 100644
index fb60c7c14c..f6a493ccf5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -669,6 +669,10 @@ AS_CASE([$host],
internal_cflags="$cc_warnings"],
[common_cflags="-O"])])
+# Allow CFLAGS and LDFLAGS to be added.
+common_cflags="$common_cflags $CFLAGS"
+cclibs="$cclibs $LDFLAGS"
+
internal_cppflags="-DCAML_NAME_SPACE $internal_cppflags"
# Enable SSE2 on x86 mingw to avoid using 80-bit registers.
@@ -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.32.0
2.52.0

View file

@ -1,67 +0,0 @@
From 5eff09224929f8fa1a2e19f9a15befd3a4a395ea Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Fri, 26 Apr 2019 16:16:29 +0100
Subject: [PATCH 3/4] configure: Remove incorrect assumption about
cross-compiling.
See https://github.com/ocaml/ocaml/issues/8647#issuecomment-487094390
The error seen without this patch is:
sh: line 1: x86_64-pc-linux-gnu-as: command not found
---
configure.ac | 31 ++++++++++++++++---------------
1 file changed, 16 insertions(+), 15 deletions(-)
diff --git a/configure.ac b/configure.ac
index e2a3cbea0..07c005f09 100644
--- a/configure.ac
+++ b/configure.ac
@@ -560,10 +560,11 @@ AS_IF(
# Are we building a cross-compiler
-AS_IF(
- [test x"$host" = x"$target"],
- [cross_compiler=false],
- [cross_compiler=true])
+#AS_IF(
+# [test x"$host" = x"$target"],
+# [cross_compiler=false],
+# [cross_compiler=true])
+cross_compiler=false
# Checks for programs
@@ -1186,17 +1187,17 @@ AS_CASE([$arch],
# Assembler
-AS_IF([test -n "$target_alias"],
- [toolpref="${target_alias}-"
- as_target="$target"
- as_cpu="$target_cpu"],
- [AS_IF([test -n "$host_alias"],
- [toolpref="${host_alias}-"
- as_target="$host"
- as_cpu="$host_cpu"],
- [toolpref=""
- as_target="$build"
- as_cpu="$build_cpu"])])
+dnl AS_IF([test -n "$target_alias"],
+dnl [toolpref="${target_alias}-"
+dnl as_target="$target"
+dnl as_cpu="$target_cpu"],
+dnl [AS_IF([test -n "$host_alias"],
+dnl [toolpref="${host_alias}-"
+dnl as_target="$host"
+dnl as_cpu="$host_cpu"],
+dnl [toolpref=""
+dnl as_target="$build"
+dnl as_cpu="$build_cpu"])])
# Finding the assembler
# The OCaml build system distinguishes two different assemblers:
--
2.32.0

View file

@ -1,31 +0,0 @@
From acb5dbaa8f8ece825a48814024404a1a6c5ba7b2 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 26 Jan 2022 15:47:02 +0000
Subject: [PATCH 4/4] configure: Only use OC_* for building executables
Fedora >= 36 fills LD_FLAGS with lots of cruft, particularly stuff for
"package notes" which contains build paths.
In any case it seems pointless having both the OC_* variables and also
including the regular CFLAGS/LDFLAGS. Give me full control over what
ocamlopt uses.
---
configure.ac | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/configure.ac b/configure.ac
index 07c005f09..19fe3fd1b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -43,7 +43,7 @@ libraries_man_section=3
# at the moment they are not taken into account on Windows, because
# flexlink, which is used to build executables on this platform, can
# not handle them.
-mkexe="\$(CC) \$(OC_CFLAGS) \$(CFLAGS) \$(OC_LDFLAGS) \$(LDFLAGS)"
+mkexe="\$(CC) \$(OC_CFLAGS) \$(OC_LDFLAGS)"
# Flags for building executable files with debugging symbols
mkexedebugflag="-g"
--
2.32.0

6
gating.yaml Executable file
View file

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

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

@ -18,9 +18,14 @@
%global natdynlink 0
%endif
%global giturl https://github.com/ocaml/ocaml
# i686 support was dropped in OCaml 5 / Fedora 39.
ExcludeArch: %{ix86}
# These are all the architectures that the tests run on. The tests
# take a long time to run, so don't run them on slow machines.
%global test_arches aarch64 %{power64} riscv64 x86_64
%global test_arches %{arm64} %{power64} %{riscv64} s390x %{x86_64}
# These are the architectures for which the tests must pass otherwise
# the build will fail.
#global test_arches_required aarch64 ppc64le x86_64
@ -33,16 +38,19 @@
%global rcver %{nil}
Name: ocaml
Version: 4.13.1
Release: 4%{?dist}
Version: 5.5.0
Release: 2%{?dist}
Summary: OCaml compiler and programming environment
License: QPL and (LGPLv2+ with exceptions)
License: LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception
URL: http://www.ocaml.org
URL: https://www.ocaml.org
VCS: git:%{giturl}.git
Source0: https://github.com/ocaml/ocaml/archive/%%{version}.tar.gz
Source0: %{giturl}/archive/%{version}%{rcver}/%{name}-%{version}%{rcver}.tar.gz
Source1: macros.ocaml-rpm
Source2: ocaml_files.py
# IMPORTANT NOTE:
#
@ -53,49 +61,55 @@ Source0: https://github.com/ocaml/ocaml/archive/%%{version}.tar.gz
#
# https://pagure.io/fedora-ocaml
#
# Current branch: fedora-36-4.13.1
# Current branch: fedora-45-5.4.1
#
# ALTERNATIVELY add a patch to the end of the list (leaving the
# existing patches unchanged) adding a comment to note that it should
# be incorporated into the git repo at a later time.
Patch0001: 0001-Don-t-add-rpaths-to-libraries.patch
Patch0002: 0002-configure-Allow-user-defined-C-compiler-flags.patch
Patch0003: 0003-configure-Remove-incorrect-assumption-about-cross-co.patch
Patch0004: 0004-configure-Only-use-OC_-for-building-executables.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
BuildRequires: git-core
BuildRequires: gcc
BuildRequires: autoconf
BuildRequires: binutils-devel
BuildRequires: ncurses-devel
BuildRequires: gdbm-devel
BuildRequires: gawk
BuildRequires: perl-interpreter
BuildRequires: util-linux
BuildRequires: /usr/bin/annocheck
BuildRequires: chrpath
BuildRequires: annobin-annocheck
BuildRequires: pkgconfig(libzstd)
# Documentation requirements
BuildRequires: asciidoc
# ocamlopt runs gcc to link binaries. Because Fedora includes
# hardening flags automatically, redhat-rpm-config is also required.
# Compressed marshaling requires libzstd-devel.
Requires: gcc
Requires: redhat-rpm-config
Requires: libzstd-devel%{?_isa}
# Because we pass -c flag to ocaml-find-requires (to avoid circular
# dependencies) we also have to explicitly depend on the right version
# of ocaml-runtime.
Requires: ocaml-runtime = %{version}-%{release}
Requires: ocaml-runtime%{?_isa} = %{version}-%{release}
# Bundles an MD5 implementation in byterun/md5.{c,h}
Provides: bundled(md5-plumb)
# Force ocaml-srpm-macros to be at the latest version, both for builds
# and installs, since OCaml 5.2 has a different set of native code
# generators than previous versions.
BuildRequires: ocaml-srpm-macros >= 10
Requires: ocaml-srpm-macros >= 10
Provides: ocaml(compiler) = %{version}
%global __ocaml_requires_opts -c -f '%{buildroot}%{_bindir}/ocamlrun %{buildroot}%{_bindir}/ocamlobjinfo.byte'
%if %{native_compiler}
%global __ocaml_requires_opts -c -f '%{buildroot}%{_bindir}/ocamlrun %{buildroot}%{_bindir}/ocamlobjinfo.byte' -i Dynlink_cmo_format -i Dynlink_cmxs_format
%else
%global __ocaml_requires_opts -c -f '%{buildroot}%{_bindir}/ocamlrun %{buildroot}%{_bindir}/ocamlobjinfo.byte' -i Backend_intf -i Inlining_decision_intf -i Simplify_boxed_integer_ops_intf
%endif
%global __ocaml_provides_opts -f '%{buildroot}%{_bindir}/ocamlrun %{buildroot}%{_bindir}/ocamlobjinfo.byte'
%description
OCaml is a high-level, strongly-typed, functional and object-oriented
programming language from the ML family of languages.
@ -107,10 +121,16 @@ and a comprehensive library.
%package runtime
# LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception: the project as a whole
# LicenseRef-Fedora-Public-Domain: the MD5 implementation in runtime/caml/md5.h
# and runtime/md5.c
License: LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception AND LicenseRef-Fedora-Public-Domain
Summary: OCaml runtime environment
Requires: util-linux
Provides: ocaml(runtime) = %{version}
# Bundles an MD5 implementation in runtime/caml/md5.h and runtime/md5.c
Provides: bundled(md5-plumb)
%description runtime
OCaml is a high-level, strongly-typed, functional and object-oriented
programming language from the ML family of languages.
@ -121,16 +141,19 @@ bytecode.
%package source
Summary: Source code for OCaml libraries
Requires: ocaml = %{version}-%{release}
Requires: ocaml%{?_isa} = %{version}-%{release}
%description source
Source code for OCaml libraries.
%package ocamldoc
# LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception: the project as a whole
# LicenseRef-Fedora-Public-Domain: ocamldoc/ocamldoc.sty
License: LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception AND LicenseRef-Fedora-Public-Domain
Summary: Documentation generator for OCaml
Requires: ocaml = %{version}-%{release}
Provides: ocamldoc
Requires: ocaml%{?_isa} = %{version}-%{release}
Provides: ocamldoc = %{version}
%description ocamldoc
Documentation generator for OCaml.
@ -138,6 +161,7 @@ Documentation generator for OCaml.
%package docs
Summary: Documentation for OCaml
BuildArch: noarch
Requires: ocaml = %{version}-%{release}
@ -150,7 +174,7 @@ This package contains man pages.
%package compiler-libs
Summary: Compiler libraries for OCaml
Requires: ocaml = %{version}-%{release}
Requires: ocaml%{?_isa} = %{version}-%{release}
%description compiler-libs
@ -163,6 +187,20 @@ Note that this exposes internal details of the OCaml compiler which
may not be portable between versions.
%package rpm-macros
# LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception: the project as a whole
# BSD-3-Clause: ocaml_files.py
License: LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception AND BSD-3-Clause
Summary: RPM macros for building OCaml packages
BuildArch: noarch
Requires: ocaml = %{version}-%{release}
Requires: python3
%description rpm-macros
This package contains macros that are useful for building OCaml RPMs.
%prep
%autosetup -S git -n %{name}-%{version}%{rcver}
# Patches touch configure.ac, so rebuild it:
@ -177,28 +215,65 @@ 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.
#
# Force --host because of:
# https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/2O4HBOK6PTQZAFAVIRDVMZGG2PYB2QHM/
# (see also https://github.com/ocaml/ocaml/issues/8647)
#
# 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 \
OC_CFLAGS="$CFLAGS" \
OC_LDFLAGS="$LDFLAGS" \
./configure \
--prefix=%{_prefix} \
--sysconfdir=%{_sysconfdir} \
--mandir=%{_mandir} \
--libdir=%{_libdir}/ocaml \
--host=`./build-aux/config.guess`
--enable-flambda \
%if %{native_compiler}
--enable-native-compiler \
--enable-native-toplevel \
%else
--disable-native-compiler \
--disable-native-toplevel \
%endif
%ifarch %{x86_64} %{arm64}
%if 0%{?_include_frame_pointers}
--enable-frame-pointers \
%endif
%endif
%ifarch %{test_arches}
--enable-ocamltest \
%else
--disable-ocamltest \
%endif
OC_CFLAGS='%{build_cflags}' \
OC_LDFLAGS='%{build_ldflags}' \
%{nil}
$make world
%if %{native_compiler}
$make opt
$make opt.opt
%endif
# Build the README and fix up references to other doc files
asciidoc -d book README.adoc
for fil in CONTRIBUTING.md HACKING.adoc INSTALL.adoc README.win32.adoc; do
sed -e "s,\"$fil\",\"https://github.com/ocaml/ocaml/blob/trunk/$fil\"," \
-i README.html
done
%check
%ifarch %{ocaml_native_compiler}
@ -211,141 +286,154 @@ annocheck -v hello ||:
%endif
%ifarch %{test_arches}
cd testsuite
%ifarch %{test_arches_required}
make -j1 all
make -j1 tests
%else
make -j1 all ||:
make -j1 tests ||:
%endif
%endif
%install
%make_install
perl -pi -e "s|^$RPM_BUILD_ROOT||" $RPM_BUILD_ROOT%{_libdir}/ocaml/ld.conf
# OCaml 5.5.0 uses relative paths in ld.conf by default to support relocatable
# OCaml, which we don't need. Overwrite ld.conf with the absolute path.
echo %{_libdir}/ocaml/stublibs > $RPM_BUILD_ROOT%{_libdir}/ocaml/ld.conf
echo %{version} > $RPM_BUILD_ROOT%{_libdir}/ocaml/fedora-ocaml-release
# Remove rpaths from stublibs .so files.
chrpath --delete $RPM_BUILD_ROOT%{_libdir}/ocaml/stublibs/*.so
# Remove the installed documentation. We will install it using %%doc
rm -rf $RPM_BUILD_ROOT%{_docdir}/ocaml
find $RPM_BUILD_ROOT -name .ignore -delete
mkdir -p $RPM_BUILD_ROOT%{rpmmacrodir}
install -m 0644 %{SOURCE1} $RPM_BUILD_ROOT%{rpmmacrodir}/macros.ocaml-rpm
# Remove this file. It's only created in certain situations and it's
# unclear why it is created at all.
rm -f $RPM_BUILD_ROOT%{_libdir}/ocaml/eventlog_metadata
mkdir -p $RPM_BUILD_ROOT%{_rpmconfigdir}/redhat
install -m 0644 %{SOURCE2} $RPM_BUILD_ROOT%{_rpmconfigdir}/redhat
%files
%doc LICENSE
%license LICENSE
%{_bindir}/ocaml
%{_bindir}/ocamlcmt
%{_bindir}/ocamlcp
%{_bindir}/ocamldebug
#{_bindir}/ocaml-instr-graph
#{_bindir}/ocaml-instr-report
%{_bindir}/ocamlmklib
%{_bindir}/ocamlmktop
%{_bindir}/ocamlprof
%{_bindir}/ocamlyacc
# symlink to either .byte or .opt version
%{_bindir}/ocamlc
%{_bindir}/ocamlcp
%{_bindir}/ocamldep
%{_bindir}/ocamllex
%{_bindir}/ocamlmklib
%{_bindir}/ocamlmktop
%{_bindir}/ocamlobjinfo
%{_bindir}/ocamloptp
%{_bindir}/ocamlprof
# bytecode versions
%{_bindir}/ocamlc.byte
%{_bindir}/ocamlcp.byte
%{_bindir}/ocamldep.byte
%{_bindir}/ocamllex.byte
%{_bindir}/ocamlmklib.byte
%{_bindir}/ocamlmktop.byte
%{_bindir}/ocamlobjinfo.byte
%{_bindir}/ocamloptp.byte
%{_bindir}/ocamlprof.byte
%if %{native_compiler}
# native code versions
%{_bindir}/ocamlc.opt
%{_bindir}/ocamlcp.opt
%{_bindir}/ocamldep.opt
%{_bindir}/ocamllex.opt
%{_bindir}/ocamlmklib.opt
%{_bindir}/ocamlmktop.opt
%{_bindir}/ocamlobjinfo.opt
%{_bindir}/ocamloptp.opt
%{_bindir}/ocamlprof.opt
%endif
%if %{native_compiler}
%{_bindir}/ocamlnat
%{_bindir}/ocamlopt
%{_bindir}/ocamlopt.byte
%{_bindir}/ocamlopt.opt
%{_bindir}/ocamloptp
%endif
#%%{_libdir}/ocaml/addlabels
#%%{_libdir}/ocaml/scrapelabels
%{_libdir}/ocaml/camlheader
%{_libdir}/ocaml/camlheader_ur
%{_libdir}/ocaml/expunge
%{_libdir}/ocaml/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/libcamlrun_shared.so
#%%{_libdir}/ocaml/objinfo_helper
%{_libdir}/ocaml/threads/*.mli
%{_libdir}/ocaml/sys.ml.in
%{_libdir}/ocaml/{dynlink,runtime_events,str,threads,unix}/*.mli
%if %{native_compiler}
%{_libdir}/ocaml/threads/*.a
%{_libdir}/ocaml/threads/*.cmxa
%{_libdir}/ocaml/threads/*.cmx
%{_libdir}/ocaml/{dynlink,runtime_events,str,threads,unix}/*.a
%{_libdir}/ocaml/{dynlink,runtime_events,str,threads,unix}/*.cmxa
%{_libdir}/ocaml/{dynlink,profiling,runtime_events,str,threads,unix}/*.cmx
%{_libdir}/ocaml/profiling/*.o
%endif
%if %{natdynlink}
%{_libdir}/ocaml/{runtime_events,str,unix}/*.cmxs
%endif
# headers
%{_libdir}/ocaml/caml
%files runtime
%doc README.adoc LICENSE Changes
%doc README.html Changes
%license LICENSE
%{_bindir}/ocamlrun
%{_bindir}/*ocamlrun-a100
%{_bindir}/ocamlrund
%{_bindir}/*ocamlrund-a100
%{_bindir}/ocamlruni
%{_bindir}/*ocamlruni-a100
%dir %{_libdir}/ocaml
#%%{_libdir}/ocaml/VERSION
%{_libdir}/ocaml/libasmrun*.so
%{_libdir}/ocaml/libcamlrun*.so
%{_libdir}/ocaml/*.cmo
%{_libdir}/ocaml/*.cmi
%{_libdir}/ocaml/*.cma
%{_libdir}/ocaml/camlheaderd
%{_libdir}/ocaml/camlheaderi
%{_libdir}/ocaml/ld.conf
%{_libdir}/ocaml/stublibs
%dir %{_libdir}/ocaml/dynlink
%{_libdir}/ocaml/dynlink/META
%{_libdir}/ocaml/dynlink/*.cmi
%{_libdir}/ocaml/dynlink/*.cma
%dir %{_libdir}/ocaml/profiling
%{_libdir}/ocaml/profiling/*.cmo
%{_libdir}/ocaml/profiling/*.cmi
%dir %{_libdir}/ocaml/runtime_events
%{_libdir}/ocaml/runtime_events/META
%{_libdir}/ocaml/runtime_events/*.cmi
%{_libdir}/ocaml/runtime_events/*.cma
%{_libdir}/ocaml/runtime-launch-info
%{_libdir}/ocaml/stdlib
%dir %{_libdir}/ocaml/str
%{_libdir}/ocaml/str/META
%{_libdir}/ocaml/str/*.cmi
%{_libdir}/ocaml/str/*.cma
%dir %{_libdir}/ocaml/threads
%{_libdir}/ocaml/threads/META
%{_libdir}/ocaml/threads/*.cmi
%{_libdir}/ocaml/threads/*.cma
%dir %{_libdir}/ocaml/unix
%{_libdir}/ocaml/unix/META
%{_libdir}/ocaml/unix/*.cmi
%{_libdir}/ocaml/unix/*.cma
%{_libdir}/ocaml/fedora-ocaml-release
%files source
%doc LICENSE
%license LICENSE
%{_libdir}/ocaml/*.ml
%{_libdir}/ocaml/*.cmt*
%{_libdir}/ocaml/*/*.cmt*
%files ocamldoc
%doc LICENSE
%license LICENSE
%doc ocamldoc/Changes.txt
%{_bindir}/ocamldoc*
%{_libdir}/ocaml/ocamldoc
@ -357,21 +445,129 @@ rm -f $RPM_BUILD_ROOT%{_libdir}/ocaml/eventlog_metadata
%files compiler-libs
%doc LICENSE
%dir %{_libdir}/ocaml/compiler-libs
%{_libdir}/ocaml/compiler-libs/*.mli
%{_libdir}/ocaml/compiler-libs/*.cmi
%{_libdir}/ocaml/compiler-libs/*.cmo
%{_libdir}/ocaml/compiler-libs/*.cma
%if %{native_compiler}
%{_libdir}/ocaml/compiler-libs/*.a
%{_libdir}/ocaml/compiler-libs/*.cmxa
%{_libdir}/ocaml/compiler-libs/*.cmx
%{_libdir}/ocaml/compiler-libs/*.o
%endif
%license LICENSE
%{_libdir}/ocaml/compiler-libs
%files rpm-macros
%{rpmmacrodir}/macros.ocaml-rpm
%{_rpmconfigdir}/redhat/ocaml_files.py
%changelog
* Thu Jul 16 2026 Fedora Release Engineering <releng@fedoraproject.org> - 5.5.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild
* Tue Jun 23 2026 Jerry James <loganjerry@gmail.com> - 5.5.0-1
- New upstream version 5.5.0 (RHBZ#2442622)
- Drop upstreamed fix for arm64 frame pointers
- Reenable LTO
- Move ld.conf, libasmrun, and libcamlrun to ocaml-runtime
- Drop hardlink dependency; rpm now does this by default
- Drop unused utilx-linux dependency
* Thu Feb 26 2026 Richard W.M. Jones <rjones@redhat.com> - 5.4.1-4
- Backport fix for arm64 frame pointers
* Fri Feb 20 2026 Richard W.M. Jones <rjones@redhat.com> - 5.4.1-1
- New upstream version 5.4.1 (RHBZ#2440356)
* Fri Jan 16 2026 Fedora Release Engineering <releng@fedoraproject.org> - 5.4.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild
* Mon Oct 13 2025 Richard W.M. Jones <rjones@redhat.com> - 5.4.0-1
- New upstream version 5.4.0 (RHBZ#2368289)
* Thu Jul 24 2025 Fedora Release Engineering <releng@fedoraproject.org> - 5.3.0-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
* Sun Jun 22 2025 Yaakov Selkowitz <yselkowi@redhat.com> - 5.3.0-3
- Fix RPM macros for Python 3.14
* Fri Jan 17 2025 Fedora Release Engineering <releng@fedoraproject.org> - 5.3.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
* Thu Jan 9 2025 Jerry James <loganjerry@gmail.com> - 5.3.0-1
- New upstream version 5.3.0
- Drop upstreamed patches
- BR git-core instead of git
* Thu Jul 18 2024 Fedora Release Engineering <releng@fedoraproject.org> - 5.2.0-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
* Wed Jun 19 2024 Richard W.M. Jones <rjones@redhat.com> - 5.2.0-2
- Add fix for ppc64le code generation issue found after 5.2.0 was released
* Thu May 23 2024 Jerry James <loganjerry@gmail.com> - 5.2.0-1
- New upstream version 5.2.0 (RHBZ#2269805)
- Drop upstreamed frame pointer and s390x patches
* Thu Jan 25 2024 Fedora Release Engineering <releng@fedoraproject.org> - 5.1.1-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Sun Jan 21 2024 Fedora Release Engineering <releng@fedoraproject.org> - 5.1.1-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Mon Dec 18 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.1-2
- Add s390x code generation fix
https://github.com/ocaml/ocaml/issues/12829
* Mon Dec 11 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.1-1
- New upstream version 5.1.1 (RHBZ#2239227)
* Tue Nov 14 2023 Yaakov Selkowitz <yselkowi@redhat.com> - 5.1.0-5
- Drop unused BR parallel
* Fri Oct 06 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.0-4
- Use BR ocaml-srpm-macros to force latest to be built against
* Thu Oct 05 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.0-3
- Rebuild against updated ocaml-srpm-macros
* Thu Oct 5 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.0-2
- Add upstream patch added after 5.1.0
* Wed Oct 4 2023 Jerry James <loganjerry@gmail.com> - 5.1.0-1
- Version 5.1.0
- Add LicenseRef-Fedora-Public-Domain to the runtime License field
- New ocaml-rpm-macros subpackage
- Depend on libzstd-devel for compressed marshaling
- Disable LTO
* Thu Jul 20 2023 Fedora Release Engineering <releng@fedoraproject.org> - 5.0.0-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
* Wed Jul 12 2023 Richard W.M. Jones <rjones@redhat.com> - 5.0.0-3
- Force ocaml-srpm-macros to be the latest version.
* Wed Jun 14 2023 Jerry James <loganjerry@gmail.com> - 5.0.0-2
- Version 5.0.0
- Convert License tag to SPDX
- Ship HTML documentation instead of asciidoc source
- Set ocamlmklib default flags to the Fedora linker flags
- Enable frame pointers on x86_64
* Mon Jan 23 2023 Richard W.M. Jones <rjones@redhat.com> - 4.14.0-5
- Rebuild OCaml packages for F38
* 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

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 (4.13.1.tar.gz) = da3434177438c852da53c0fda7bc2519adcda6384d97d45e44137ed0fd384ffb3da61958a7b51296edb3f88f5a5310ca71b6862f6d756aaa4012d1f54e5955f6
SHA512 (ocaml-5.5.0.tar.gz) = bf13c18cd1fc7b2e5e9623024ea8623710f646ff2fbc0f59dab70e4d4318ed8623bdcc3ec59ce37af07af2b767f520dea23fb474c26297b3e858b6c8e080b4e6

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