mingw64-filesystem/mingw64-find-requires.sh
Jan Engelhardt 67e63d9c18 Accepting request 978864 from home:rhabacker:branches:windows:mingw:win64:devruntimedeps
- Update to 20220524
- On finding provides and requirements do not generate temporary 
  files in the global temporary directory (boo#1182356)
- Add optional support to add runtime dependencies for import
  libraries, see macros.mingw64 for details (boo#1194430)
- Fix warning 'file format not recognized' in mingw64-find-requires.sh
  when parsing xxx-config files

OBS-URL: https://build.opensuse.org/request/show/978864
OBS-URL: https://build.opensuse.org/package/show/windows:mingw:win64/mingw64-filesystem?expand=0&rev=133
2022-05-24 08:26:51 +00:00

132 lines
2.8 KiB
Bash

#!/bin/bash
# This script reads filenames from STDIN and outputs any relevant provides
# information that needs to be included in the package.
target="mingw64"
host="x86_64-w64-mingw32"
scan_implibs=
if [ "$1" = "--scan-implibs" ]; then
scan_implibs=1
shift
fi
if [ -n "$1" ]; then
package_name="$1"
fi
[ -z "$OBJDUMP" ] && OBJDUMP="$host-objdump"
# Get the list of files.
filelist=`sed "s/['\"]/\\\&/g"`
libs_to_exclude="
advapi32
cfgmgr32
comctl32
comdlg32
crypt32
d3d8
d3d9
ddraw
dnsapi
dsound
dwmapi
dxva2
evr
gdi32
gdiplus
glu32
glut32
imm32
iphlpapi
kernel32
ksuser
mf
mfplat
mpr
mscms
mscoree
msimg32
msvcr71
msvcr80
msvcr90
msvcrt
mswsock
netapi32
odbc32
ole32
oleacc
oleaut32
opengl32
psapi
rpcrt4
secur32
setupapi
shell32
shlwapi
user32
usp10
version
wininet
winmm
wldap32
ws2_32
wsock32
winhttp
"
exclude_pattern=""
for i in $libs_to_exclude; do
if [ -z "$exclude_pattern" ]; then
exclude_pattern="$i"
else
exclude_pattern="$exclude_pattern|$i"
fi
done
dlls=$(echo "$filelist" | grep -v 'config$' | xargs file | grep executable | sed 's,:.*$,,g')
pcs=$(echo "$filelist" | grep '\.pc$')
configs=$(echo "$filelist" | grep 'config$')
for f in $dlls; do
[ ! -f "$f" ] && continue
"$OBJDUMP" -p "$f" | grep 'DLL Name' | tr "[:upper:]" "[:lower:]" |
grep -Eo '[-._\+[:alnum:]]+\.dll' |
grep -Ev "$exclude_pattern" |
sed 's/\(.*\)/'"$target"'(\1)/'
done | sort -u
if [ -n "$scan_implibs" ]; then
implibs=$(echo "$filelist" | grep '\.dll.a$')
for f in $implibs; do
[ ! -f "$f" ] && continue
"$OBJDUMP" -r "$f" | grep '_iname' | sed 's,^.*lib,lib,g;s,_iname,,g;s,_dll,.dll,g;s,_,-,g' |
tr "[:upper:]" "[:lower:]" |
grep -Ev "$exclude_pattern" |
sed 's/\(.*\)/'"$target"'(\1)/'
done | sort -u
fi
(
for g in $pcs; do
dirname="${g%/*}"
PKG_CONFIG_PATH="$dirname" "$host-pkg-config" --print-errors --print-requires "$g" | awk '{ print "'"$target"'(pkg:"$1")", $2, $3 }'
PKG_CONFIG_PATH="$dirname" "$host-pkg-config" --print-errors --print-requires-private "$g" | grep -Ev "$exclude_pattern" | awk '{ print "'"$target"'(pkg:"$1")", $2, $3 }'
for h in $(PKG_CONFIG_PATH="$dirname" "$host-pkg-config" --libs-only-l "$g" | sed 's#^\-l##g;s# \-l# #g'); do
echo "$target(lib:$h)"
done
done
for k in $configs; do
for j in $(PKG_CONFIG="$host-pkg-config" "$k" --libs); do
case "$j" in
-l*)
echo "$j" | sed 's#\-l##g' | grep -Ev "$exclude_pattern" | awk '{ print "'"$target"'(lib:"$1")" }'
;;
esac
done
done
) | sort -u