- Moved ocaml-findlib.rpm.prov_req.attr.sh from ocaml to provide

ocamlfind() in ocaml itself
- Handle license separately because sed w truncates output
- Document individual file extensions
- Move cmxs and so files to devel packages because they are not
  used at runtime
- Set VERSION unconditionally for each patch, sometimes dune picks it up
- Pass --for-release-of-packages to dune via dune_release_pkgs=
- Print potential BuildRequires during build
- Package sml for camlp5

OBS-URL: https://build.opensuse.org/package/show/devel:languages:ocaml/ocaml-rpm-macros?expand=0&rev=27
This commit is contained in:
Olaf Hering 2019-11-01 22:56:29 +00:00 committed by Git OBS Bridge
parent 6245187703
commit 8fc5a9e55c
3 changed files with 326 additions and 48 deletions

View File

@ -0,0 +1,160 @@
#!/bin/bash
set -e
prov_req_name="ocamlfind"
td=`mktemp --directory`
test -n "${td}"
_x() {
rm -rf "${td}"
}
trap _x EXIT
cmd=
test "$1" = "-prov" && cmd=prov
test "$1" = "-req" && cmd=req
do_work() {
local f=$1
local pkg_name
local pkg_prov_req
local pkg_prov
local pkg_req
local elem req
pkg_name="${f##*/}"
if test "${pkg_name}" = "META"
then
pkg_name="${f%/*}"
pkg_name="${pkg_name##*/}"
else
pkg_name="${pkg_name#META.}"
fi
pkg_prov_req="`
env \
pkg_name="${pkg_name}" \
cmd="${cmd}" \
awk '
BEGIN {
dbg=1;
count=1;
depth=0;
pkg_name=ENVIRON["pkg_name"];
cmd=ENVIRON["cmd"];
if(dbg) printf "bEGIN \\"%s\\" cmd: %s\n", pkg_name, cmd > "/dev/stderr" ;
reqs[pkg_name]=""
pkg_names[depth]=pkg_name
}
{
if(dbg) printf "line: %s\n", $0 > "/dev/stderr"
}
/^[[:blank:]]*directory[[:blank:]]*=/ {
if(dbg) printf "GOT: %s\n", $0 > "/dev/stderr" ;
if (depth == 0) {
x = split($0, a, "\\"");
if ( a[2] ) {
candidate = a[2];
if(dbg) printf "dir: %s %s\n", x, candidate > "/dev/stderr" ;
if (candidate ~ /^\^/) {
next
}
if (candidate ~ /^\+/) {
candidate = substr(candidate, 2);
}
if (candidate ~ /^\//) {
x = split(candidate, a, "/");
if ( x )
candidate = a[x];
}
if (candidate ~ /^\.\.\//) {
x = split(candidate, a, "/");
if ( x )
candidate = a[x];
}
if(dbg) printf "dir: %s %s\n", x, candidate > "/dev/stderr" ;
if (candidate != pkg_name) {
reqs[candidate] = reqs[pkg_name];
delete reqs[pkg_name];
pkg_name = candidate;
if(dbg) printf "new pkg_name %s %s\n", x, pkg_name > "/dev/stderr" ;
pkg_names[depth]=pkg_name
} else {
if(dbg) printf "pkg_name remains %s\n", pkg_name > "/dev/stderr" ;
}
}
}
next
}
/^[[:blank:]]*requires.*[[:blank:]]*=/ {
if(dbg) printf "GOT: %s\n", $0 > "/dev/stderr" ;
x = split($0, a, "\\"");
if ( a[2] ) {
if(dbg) printf "req2 %s %s\n", x, a[2] > "/dev/stderr" ;
x = gsub("[[:blank:]]+", ",", a[2]);
if(dbg) printf "req2 %s %s\n", x, a[2] > "/dev/stderr" ;
reqs[pkg_name] = a[2];
}
next
}
/^[[:blank:]]*package[[:blank:]]/ {
if(dbg) printf "GOT: %s\n", $0 > "/dev/stderr" ;
depth = depth + 1;
if(dbg) printf "depth %s\n", depth > "/dev/stderr" ;
x = split($0, a, "\\"");
if ( a[2] ) {
if(dbg) printf "req2 %s %s\n", x, a[2] > "/dev/stderr" ;
pkg_name = pkg_name"."a[2];
reqs[pkg_name]=""
pkg_names[depth]=pkg_name
if(dbg) printf "new pkg_name %s %s\n", x, pkg_name > "/dev/stderr" ;
}
next
}
/^[[:blank:]]*)/ {
if(dbg) printf "GOT: %s\n", $0 > "/dev/stderr" ;
depth = depth -1;
if(dbg) printf "depth %s\n", depth > "/dev/stderr" ;
pkg_name=pkg_names[depth]
if(dbg) printf "old pkg_name %s %s\n", x, pkg_name > "/dev/stderr" ;
next
}
END {
if(dbg) printf "eND \\"%s\\"\n", pkg_name > "/dev/stderr" ;
for (req in reqs) {
if(dbg)printf "eNd \\"%s\\"\n", req > "/dev/stderr";
# format: provides:requires
printf "%s:%s\n", req, reqs[req];
}
if(dbg) printf "ENd \\"%s\\"\n", pkg_name > "/dev/stderr" ;
}
' \"${f}\"
`"
for elem in ${pkg_prov_req}
do
pkg_prov="${elem%%:*}"
pkg_req="${elem#*:}"
pkg_req="${pkg_req//,/ }"
if test -n "${pkg_prov}" && test "${cmd}" = "prov"
then
echo "${prov_req_name}($pkg_prov)"
fi
if test "${cmd}" = "req"
then
for i in ${pkg_req}
do
echo "${prov_req_name}(${i})"
done
fi
done
}
while read filename
do
case "${filename}" in
*/META*) do_work "${filename}" ;;
*) ;;
esac
done

View File

@ -1,3 +1,17 @@
-------------------------------------------------------------------
Fri Nov 1 12:34:56 UTC 2019 - ohering@suse.de
- Moved ocaml-findlib.rpm.prov_req.attr.sh from ocaml to provide
ocamlfind() in ocaml itself
- Handle license separately because sed w truncates output
- Document individual file extensions
- Move cmxs and so files to devel packages because they are not
used at runtime
- Set VERSION unconditionally for each patch, sometimes dune picks it up
- Pass --for-release-of-packages to dune via dune_release_pkgs=
- Print potential BuildRequires during build
- Package sml for camlp5
-------------------------------------------------------------------
Wed Oct 9 05:48:16 UTC 2019 - ohering@suse.de

View File

@ -12,18 +12,18 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via http://bugs.opensuse.org/
# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
Name: ocaml-rpm-macros
Version: 20191009
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
#
# keep the following macros in sync with ocaml.spec:
Source1: ocaml-findlib.rpm.prov_req.attr.sh
%define do_opt 0
# macros to be set in prjconf:
#Macros:
@ -60,6 +60,17 @@ in ocaml spec files.
%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_'
@ -91,8 +102,9 @@ tee %{buildroot}%{_rpmmacrodir}/macros.%{name} <<'_EOF_'
> %%{name}.files ;\
> %%{name}.files.devel ;\
> %%{name}.files.ldsoconf ;\
> %%{name}.files.license ;\
> %%{name}.files.unhandled ;\
for i in \\\
for license in \\\
COPYING \\\
COPYING.txt \\\
COPYRIGHT \\\
@ -103,50 +115,82 @@ tee %{buildroot}%{_rpmmacrodir}/macros.%{name} <<'_EOF_'
LICENSE.txt \\\
;\
do\
test -f "$i" && echo "%%%%license $i" >> %%{name}.files ;\
test -f "${license}" && echo "%%%%license ${license}" >> '%%{name}.files.license' ;\
done ;\
find %%{buildroot}$(ocamlc -where) | sed -ne '\
s@^%%{buildroot}@@\
/\\/\\(META\\|dune-package\\|opam\\)$/{\
w %%{name}.files.devel\
s@\\/[^/]\\+$@@\
s@^@%%dir @\
w %%{name}.files.devel\
s@\\/[^/]\\+$@@\
w %%{name}.files.devel\
d\
}\
/\\/[^/]\\+\\.\\(a\\|annot\\|cmx\\|cmxa\\|cma\\|cmi\\|cmo\\|cmt\\|cmti\\|exe\\|h\\|js\\|ml\\|mli\\|o\\)$/{\
w %%{name}.files.devel\
s@\\/[^/]\\+$@@\
s@^@%%dir @\
w %%{name}.files.devel\
s@\\/[^/]\\+$@@\
w %%{name}.files.devel\
d\
}\
/\\/[^/]\\+\\.\\(so\\|so.owner\\)$/{\
w %%{name}.files\
s@\\/[^/]\\+$@@\
w %%{name}.files.ldsoconf\
s@^@%%dir @\
w %%{name}.files\
s@\\/[^/]\\+$@@\
w %%{name}.files\
d\
}\
/\\/[^/]\\+\\.\\(cmxs\\)$/{\
w %%{name}.files\
s@\\/[^/]\\+$@@\
s@^@%%dir @\
w %%{name}.files\
s@\\/[^/]\\+$@@\
w %%{name}.files\
d\
}\
#\
# 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 \\\
@ -238,17 +282,53 @@ ocaml setup.ml -configure \\\
%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 @install $OCAML_DUNE_EXTERNAL_LIB_DEPS_ARGS ; \
dune external-lib-deps @runtest $OCAML_DUNE_EXTERNAL_LIB_DEPS_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 @install $OCAML_DUNE_BUILD_INSTALL_ARGS
dune build \\\
--verbose \\\
${dune_for_release} \\\
'@install' \\\
$OCAML_DUNE_BUILD_INSTALL_ARGS
%%ocaml_dune_install \
%ifarch ppc64 ppc64le
ulimit -s $((1024 * 64)) ; \
%endif
dune install --verbose --destdir=%%{buildroot} $OCAML_DUNE_INSTALL_ARGS ; \
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} \\\
--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} ; \
@ -258,12 +338,36 @@ ocaml setup.ml -configure \\\
%ifarch ppc64 ppc64le
ulimit -s $((1024 * 64)) ; \
%endif
dune runtest --verbose $OCAML_DUNE_RUNTEST_ARGS
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