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
161 lines
4.2 KiB
Bash
161 lines
4.2 KiB
Bash
#!/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
|