Accepting request 745385 from devel:languages:ocaml
- 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. Also, cmxs dependencies in main pkg are not covered by ocaml-find-requires.sh (bsc#1154874) - 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 - SLE_12 has still no license macro, package as doc instead - Use _smp_mflags instead of nproc for parallel build OBS-URL: https://build.opensuse.org/request/show/745385 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/ocaml-rpm-macros?expand=0&rev=3
This commit is contained in:
commit
fe4ad8af80
160
ocaml-findlib.rpm.prov_req.attr.sh
Normal file
160
ocaml-findlib.rpm.prov_req.attr.sh
Normal 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
|
@ -1,3 +1,20 @@
|
||||
-------------------------------------------------------------------
|
||||
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. Also, cmxs dependencies in main pkg are
|
||||
not covered by ocaml-find-requires.sh (bsc#1154874)
|
||||
- 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
|
||||
- SLE_12 has still no license macro, package as doc instead
|
||||
- Use _smp_mflags instead of nproc for parallel build
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Oct 9 05:48:16 UTC 2019 - ohering@suse.de
|
||||
|
||||
|
@ -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,87 @@ tee %{buildroot}%{_rpmmacrodir}/macros.%{name} <<'_EOF_'
|
||||
LICENSE.txt \\\
|
||||
;\
|
||||
do\
|
||||
test -f "$i" && echo "%%%%license $i" >> %%{name}.files ;\
|
||||
%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}@@\
|
||||
/\\/\\(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 +287,55 @@ 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} \\\
|
||||
%%{?_smp_mflags} \\\
|
||||
'@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} \\\
|
||||
%%{?_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} ; \
|
||||
@ -258,12 +345,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
|
||||
|
Loading…
Reference in New Issue
Block a user