OBS-URL: https://build.opensuse.org/package/show/devel:languages:ocaml/ocaml-rpm-macros?expand=0&rev=33
382 lines
11 KiB
RPMSpec
382 lines
11 KiB
RPMSpec
#
|
|
# spec file for package ocaml-rpm-macros
|
|
#
|
|
# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
|
|
#
|
|
# All modifications and additions to the file contributed by third parties
|
|
# remain the property of their copyright owners, unless otherwise agreed
|
|
# upon. The license for this file, and modifications and additions to the
|
|
# file, is the same license as for the pristine package itself (unless the
|
|
# license for the pristine package is not an Open Source License, in which
|
|
# case the license is the MIT License). An "Open Source License" is a
|
|
# license that conforms to the Open Source Definition (Version 1.9)
|
|
# published by the Open Source Initiative.
|
|
|
|
# Please submit bugfixes or comments via https://bugs.opensuse.org/
|
|
#
|
|
|
|
Name: ocaml-rpm-macros
|
|
Version: 20191101
|
|
Release: 0
|
|
Summary: RPM macros for building OCaml source packages
|
|
License: GPL-2.0-only
|
|
Group: Development/Languages/OCaml
|
|
Url: https://build.opensuse.org/project/show/devel:languages:ocaml
|
|
Source1: ocaml-findlib.rpm.prov_req.attr.sh
|
|
|
|
%define do_opt 0
|
|
# macros to be set in prjconf:
|
|
#Macros:
|
|
#_with_ocaml_force_enable_ocaml_opt 1
|
|
#_with_ocaml_force_disable_ocaml_opt 1
|
|
#_with_ocaml_make_testsuite 1
|
|
#:Macros
|
|
%bcond_with ocaml_force_enable_ocaml_opt
|
|
%bcond_with ocaml_force_disable_ocaml_opt
|
|
%bcond_with ocaml_make_testsuite
|
|
%if %{with ocaml_force_enable_ocaml_opt}
|
|
%define do_opt 1
|
|
%endif
|
|
%if %{without ocaml_force_enable_ocaml_opt}
|
|
%ifarch %{arm} aarch64 %{ix86} ppc ppc64 ppc64le s390x x86_64
|
|
%define do_opt 1
|
|
%endif
|
|
%endif
|
|
#
|
|
%if %{with ocaml_force_disable_ocaml_opt}
|
|
%define do_opt 0
|
|
%endif
|
|
#
|
|
|
|
%description
|
|
OCaml is a high-level, strongly-typed, functional and object-oriented
|
|
programming language from the ML family of languages.
|
|
|
|
This package contains a set of helper macros to unify common code used
|
|
in ocaml spec files.
|
|
|
|
%prep
|
|
|
|
%build
|
|
|
|
%install
|
|
# map findlib names to rpm Provides/Requires
|
|
tag="ocamlfind"
|
|
mkdir -vp %{buildroot}%{_rpmconfigdir}/fileattrs
|
|
tee %{buildroot}%{_rpmconfigdir}/fileattrs/${tag}.attr <<_EOF_
|
|
%__${tag}_provides %%{_rpmconfigdir}/${tag}.sh -prov
|
|
%__${tag}_requires %%{_rpmconfigdir}/${tag}.sh -req
|
|
%__${tag}_path ^%%{_libdir}/ocaml/.*/META$|^%%{_libdir}/ocaml/META$
|
|
_EOF_
|
|
#
|
|
tee %{buildroot}%{_rpmconfigdir}/${tag}.sh < %{SOURCE1}
|
|
|
|
# install OCaml macros
|
|
mkdir -vp %{buildroot}%{_rpmmacrodir}
|
|
tee %{buildroot}%{_rpmmacrodir}/macros.%{name} <<'_EOF_'
|
|
# get rid of %{_rpmconfigdir}/find-debuginfo.sh
|
|
# strip kills the bytecode part of ELF binaries
|
|
#
|
|
# provide empty _find_debuginfo_dwz_opts
|
|
# the .dwz files contains identical contents, which leads to identical
|
|
# checksums, which leads to file conflicts due to identical symlinks
|
|
%if %{do_opt}
|
|
%%ocaml_preserve_bytecode \
|
|
%%define _lto_cflags %%{nil} \
|
|
%%{nil}
|
|
%%ocaml_native_compiler 1
|
|
%%_find_debuginfo_dwz_opts %%{nil}
|
|
%else
|
|
%%ocaml_preserve_bytecode \
|
|
%%undefine _build_create_debug \
|
|
%%define __arch_install_post export NO_BRP_STRIP_DEBUG=true \
|
|
%%define _lto_cflags %%{nil} \
|
|
%%{nil}
|
|
%%ocaml_native_compiler 0
|
|
%endif
|
|
|
|
# Create file list for base pkg and base-devel pkg
|
|
# Files with known extensions or names are written to 'files' or 'files.devel'
|
|
# Other unknown files are shown on stdout
|
|
%%ocaml_create_file_list \
|
|
> %%{name}.files ;\
|
|
> %%{name}.files.devel ;\
|
|
> %%{name}.files.ldsoconf ;\
|
|
> %%{name}.files.license ;\
|
|
> %%{name}.files.unhandled ;\
|
|
for license in \\\
|
|
COPYING \\\
|
|
COPYING.txt \\\
|
|
COPYRIGHT \\\
|
|
Copyright \\\
|
|
LICENCE \\\
|
|
LICENSE \\\
|
|
LICENSE.md \\\
|
|
LICENSE.txt \\\
|
|
LGPL \\\
|
|
;\
|
|
do\
|
|
%if 0%{?suse_version} > 1315
|
|
license_macro='license' ;\
|
|
%else
|
|
license_macro='doc' ;\
|
|
%endif
|
|
test -f "${license}" && echo "%%%%${license_macro} ${license}" >> '%%{name}.files.license' ;\
|
|
done ;\
|
|
find %%{buildroot}$(ocamlc -where) | sed -ne '\
|
|
s@^%%{buildroot}@@\
|
|
#\
|
|
# for findlib, describing a package\
|
|
/\\/META$/{ b files_devel }\
|
|
# stub ELF library\
|
|
/\\/[^/]\\+\\.so$/{ b files_ldsoconf }\
|
|
# stub ELF library\
|
|
/\\/[^/]\\+\\.so.owner$/{ b files_ldsoconf }\
|
|
# ELF archive with object files\
|
|
/\\/[^/]\\+\\.a$/{ b files_devel }\
|
|
# OCaml legacy source code annotations, produced via -annot\
|
|
/\\/[^/]\\+\\.annot$/{ b files_devel }\
|
|
# OCaml library file with bytecode\
|
|
/\\/[^/]\\+\\.cma$/{ b files_devel }\
|
|
# OCaml compiled header file\
|
|
/\\/[^/]\\+\\.cmi$/{ b files_devel }\
|
|
# OCaml object file with bytecode\
|
|
/\\/[^/]\\+\\.cmo$/{ b files_devel }\
|
|
# OCaml source code annotations, produced via -bin-annot from source files\
|
|
/\\/[^/]\\+\\.cmt$/{ b files_devel }\
|
|
# OCaml source code annotations, produced via -bin-annot from header files\
|
|
/\\/[^/]\\+\\.cmti$/{ b files_devel }\
|
|
# OCaml object file with native code\
|
|
/\\/[^/]\\+\\.cmx$/{ b files_devel }\
|
|
# OCaml library file with native code\
|
|
/\\/[^/]\\+\\.cmxa$/{ b files_devel }\
|
|
# ELF shared library with native code\
|
|
/\\/[^/]\\+\\.cmxs$/{ b files_devel }\
|
|
# Some helper binary\
|
|
/\\/[^/]\\+\\.exe$/{ b files_devel }\
|
|
# C header\
|
|
/\\/[^/]\\+\\.h$/{ b files_devel }\
|
|
#\
|
|
/\\/[^/]\\+\\.js$/{ b files_devel }\
|
|
# OCaml source code, source file\
|
|
/\\/[^/]\\+\\.ml$/{ b files_devel }\
|
|
# OCaml source code, header file\
|
|
/\\/[^/]\\+\\.mli$/{ b files_devel }\
|
|
# ELF object file\
|
|
/\\/[^/]\\+\\.o$/{ b files_devel }\
|
|
#\
|
|
/\\/[^/]\\+\\.sml$/{ b files_devel }\
|
|
#\
|
|
/\\/dune-package$/{ b files_devel }\
|
|
#\
|
|
/\\/opam$/{ b files_devel }\
|
|
#\
|
|
# record unknown paths\
|
|
w %%{name}.files.unhandled\
|
|
d\
|
|
#\
|
|
: files_devel\
|
|
# full path for file\
|
|
w %%{name}.files.devel\
|
|
# tag + dirname\
|
|
s@\\/[^/]\\+$@@\
|
|
: tag_dirname\
|
|
s@^@%%dir @\
|
|
w %%{name}.files.devel\
|
|
# parent directory\
|
|
s@\\/[^/]\\+$@@\
|
|
w %%{name}.files.devel\
|
|
d\
|
|
#\
|
|
: files_ldsoconf\
|
|
# full path for file\
|
|
w %%{name}.files.devel\
|
|
# dirname for ld.so.conf\
|
|
s@\\/[^/]\\+$@@\
|
|
w %%{name}.files.ldsoconf\
|
|
b tag_dirname\
|
|
' ;\
|
|
cat '%%{name}.files.license' >> '%%{name}.files' ; \
|
|
for i in \\\
|
|
%%{name}.files \\\
|
|
%%{name}.files.devel \\\
|
|
%%{name}.files.ldsoconf \\\
|
|
%%{name}.files.unhandled \\\
|
|
;\
|
|
do\
|
|
sort -u $i > $$ ;\
|
|
mv $$ $i ;\
|
|
done ;\
|
|
if test -s %%{name}.files.ldsoconf ;\
|
|
then \
|
|
ldsoconfd='/etc/ld.so.conf.d' ;\
|
|
mkdir -vp "%%{buildroot}${ldsoconfd}" ;\
|
|
tee "%%{buildroot}${ldsoconfd}/%%{name}.conf" < %%{name}.files.ldsoconf ;\
|
|
echo "%config ${ldsoconfd}/%%{name}.conf" >> %%{name}.files ;\
|
|
fi ;\
|
|
head -n 1234 \\\
|
|
%%{name}.files \\\
|
|
%%{name}.files.devel \\\
|
|
%%{name}.files.ldsoconf \\\
|
|
%%{name}.files.unhandled \\\
|
|
;\
|
|
%%{nil}
|
|
|
|
# setup.ml comes from oasis, but this is here for libs oasis depends on
|
|
#
|
|
# html goes into a separate, browsable dir
|
|
# which is also safe regarding wiping due to %%doc macro usage
|
|
%%_oasis_docdir_base %%{_datadir}/doc/ocaml
|
|
%%_oasis_docdir_dvi %%{_oasis_docdir_base}/%%{name}
|
|
%%_oasis_docdir_html %%{_oasis_docdir_base}/%%{name}
|
|
%%_oasis_docdir_pdf %%{_oasis_docdir_base}/%%{name}
|
|
%%_oasis_docdir_ps %%{_oasis_docdir_base}/%%{name}
|
|
%%oasis_docdir %%{_oasis_docdir_base}/%%{name}
|
|
#
|
|
# For now provide a convinience macro which covers also the parent dir
|
|
%%oasis_docdir_dvi %%dir %%{_oasis_docdir_base} \
|
|
%%{_oasis_docdir_dvi}
|
|
%%oasis_docdir_html %%dir %%{_oasis_docdir_base} \
|
|
%%{_oasis_docdir_html}
|
|
%%oasis_docdir_pdf %%dir %%{_oasis_docdir_base} \
|
|
%%{_oasis_docdir_pdf}
|
|
%%oasis_docdir_ps %%dir %%{_oasis_docdir_base} \
|
|
%%{_oasis_docdir_ps}
|
|
#
|
|
# various macros to unify setup/build/install
|
|
%%oasis_setup \
|
|
oasis setup
|
|
%%ocaml_oasis_configure \
|
|
ocaml setup.ml -configure \\\
|
|
--psdir %%{_oasis_docdir_ps} \\\
|
|
--pdfdir %%{_oasis_docdir_pdf} \\\
|
|
--dvidir %%{_oasis_docdir_dvi} \\\
|
|
--htmldir %%{_oasis_docdir_html} \\\
|
|
--docdir %%{oasis_docdir} \\\
|
|
--localedir %%{_datadir}/locale \\\
|
|
--datadir %%{_datadir} \\\
|
|
\\\
|
|
--bindir %%{_bindir} \\\
|
|
--mandir %%{_mandir} \\\
|
|
--destdir %%{buildroot} \\\
|
|
--datarootdir %%{_datadir} \\\
|
|
--infodir %%{_infodir} \\\
|
|
--libdir %%{_libdir} \\\
|
|
--libexecdir %%{_libexecdir} \\\
|
|
--localstatedir %%{_localstatedir} \\\
|
|
--sbindir %%{_sbindir} \\\
|
|
--prefix %%{_prefix} \\\
|
|
--sysconfdir %%{_sysconfdir} \\\
|
|
--exec-prefix %%{_prefix} \\\
|
|
--sharedstatedir %%{_sharedstatedir}
|
|
#
|
|
%%ocaml_oasis_build \
|
|
ocaml setup.ml -build
|
|
%%ocaml_oasis_doc \
|
|
ocaml setup.ml -doc
|
|
%%ocaml_oasis_install \
|
|
ocaml setup.ml -install
|
|
%%ocaml_oasis_findlib_install \
|
|
export OCAMLFIND_DESTDIR=%%{buildroot}`ocamlc -where` ; \
|
|
export OCAMLFIND_LDCONF=/dev/null ; \
|
|
mkdir -p $OCAMLFIND_DESTDIR ; \
|
|
ocaml setup.ml -install
|
|
%%ocaml_oasis_test \
|
|
ocaml setup.ml -test
|
|
#
|
|
%%ocaml_dune_setup \
|
|
%ifarch ppc64 ppc64le
|
|
ulimit -s $((1024 * 64)) ; \
|
|
%endif
|
|
echo '%%{version}' | tee VERSION ; \
|
|
dune_for_release= ; \
|
|
: dune_release_pkgs \
|
|
if test -n "${dune_release_pkgs}" ; \
|
|
then \
|
|
echo "${dune_release_pkgs}" > dune_release_pkgs-%%{name}-%%{version}-%%{release} ; \
|
|
dune_for_release="--for-release-of-packages=${dune_release_pkgs}" ; \
|
|
fi ; \
|
|
dune installed-libraries $OCAML_DUNE_INSTALLED_LIBRARIES_ARGS ; \
|
|
dune external-lib-deps \\\
|
|
${dune_for_release} \\\
|
|
'@install' \\\
|
|
$OCAML_DUNE_EXTERNAL_LIB_DEPS_ARGS ; \
|
|
dune external-lib-deps \\\
|
|
${dune_for_release} \\\
|
|
'@runtest' \\\
|
|
$OCAML_DUNE_EXTERNAL_LIB_DEPS_ARGS ; \
|
|
dune external-lib-deps \\\
|
|
${dune_for_release} \\\
|
|
'@install' '@runtest' \\\
|
|
$OCAML_DUNE_EXTERNAL_LIB_DEPS_ARGS \\\
|
|
| awk '/^-[[:blank:]]/{ printf "BuildRequires: ocamlfind(%%s)\\n", $2}' | sort -u ; \
|
|
%%{nil}
|
|
%%ocaml_dune_build \
|
|
dune build \\\
|
|
--verbose \\\
|
|
${dune_for_release} \\\
|
|
%%{?_smp_mflags} \\\
|
|
'@install' \\\
|
|
$OCAML_DUNE_BUILD_INSTALL_ARGS
|
|
%%ocaml_dune_install \
|
|
%ifarch ppc64 ppc64le
|
|
ulimit -s $((1024 * 64)) ; \
|
|
%endif
|
|
dune_for_release= ; \
|
|
if test -f dune_release_pkgs-%%{name}-%%{version}-%%{release} ; \
|
|
then \
|
|
read dune_release_pkgs < dune_release_pkgs-%%{name}-%%{version}-%%{release} ; \
|
|
dune_for_release="--for-release-of-packages=${dune_release_pkgs}" ; \
|
|
fi ; \
|
|
dune install \\\
|
|
--verbose \\\
|
|
${dune_for_release} \\\
|
|
%%{?_smp_mflags} \\\
|
|
--prefix=%%{_prefix} \\\
|
|
--libdir=$(ocamlc -where) \\\
|
|
--destdir=%%{buildroot} \\\
|
|
${dune_release_pkgs//,/ } \\\
|
|
$OCAML_DUNE_INSTALL_ARGS ; \
|
|
rm -rfv %%{buildroot}%%{_prefix}/doc ; \
|
|
if test -d %%{buildroot}%%{_prefix}/man ; then \
|
|
mkdir -vp %%{buildroot}%%{_datadir} ; \
|
|
mv -vt %%{buildroot}%%{_datadir} %%{buildroot}%%{_prefix}/man ; \
|
|
fi ;
|
|
%%ocaml_dune_test \
|
|
%ifarch ppc64 ppc64le
|
|
ulimit -s $((1024 * 64)) ; \
|
|
%endif
|
|
dune_for_release= ; \
|
|
if test -f dune_release_pkgs-%%{name}-%%{version}-%%{release} ; \
|
|
then \
|
|
read dune_release_pkgs < dune_release_pkgs-%%{name}-%%{version}-%%{release} ; \
|
|
dune_for_release="--for-release-of-packages=${dune_release_pkgs}" ; \
|
|
fi ; \
|
|
if dune runtest \\\
|
|
--verbose \\\
|
|
${dune_for_release} \\\
|
|
$OCAML_DUNE_RUNTEST_ARGS ; \
|
|
then \
|
|
echo "dune runtest succeeded" ; \
|
|
else \
|
|
echo "dune runtest failed" ; \
|
|
if test -n "${dune_test_tolerate_fail}" ; \
|
|
then \
|
|
echo "ignored" ; \
|
|
else \
|
|
echo "aborting" ; \
|
|
exit 1 ; \
|
|
fi ; \
|
|
fi
|
|
|
|
#
|
|
#
|
|
_EOF_
|
|
|
|
%files
|
|
%{_rpmmacrodir}/*
|
|
%{_rpmconfigdir}/fileattrs
|
|
%attr(755,root,root) %{_rpmconfigdir}/*.sh
|
|
|
|
%changelog
|