]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - library-bundler
netradiant: strip 16-bit png to 8-bit, fix #153
[xonotic/netradiant.git] / library-bundler
1 #! /usr/bin/env bash
2
3 Windows::listLibForManifest () {
4         local lib_dir="${1}"
5
6         find "${lib_dir}" \
7                 -maxdepth 1 \
8                 -type f \
9                 -name '*.dll' \
10                 -exec basename {} \; \
11         | xargs -I {} \
12                 printf '  <file name="{}"/>\n'
13 }
14
15 Windows::printManifest () {
16         local lib_dir="${1}"
17
18         cat <<-EOF
19         <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
20           <assemblyIdentity type="win32" name="lib" version="1.0.0.0"/>
21         $(Windows::listLibForManifest "${lib_dir}")
22         </assembly>
23         EOF
24 }
25
26 Windows::bundleLibFromFile () {
27         local exe_file="${1}"
28
29         exe_file="$(cygpath --unix "${exe_file}")"
30
31         ntldd --recursive "${exe_file}" \
32         | egrep -i '\.dll => [A-Z]:\\msys64\\' \
33         | sed -e 's/ (0x[0-9a-f]*)$//;s/^.* => //' \
34         | cygpath --unix --file - \
35         | while read dll_file
36         do
37                 dll_basename="$(basename "${dll_file}")"
38
39                 if [ -f "${bundle_dir}/${dll_basename}" ]
40                 then
41                         continue
42                 fi
43
44                 cp --preserve=timestamps "${dll_file}" "${lib_dir}/${dll_basename}"
45
46                 if [ "${dll_basename}" = 'libgtk-win32-2.0-0.dll' ]
47                 then
48                         mingw="$(which 'libgtk-win32-2.0-0.dll' | cut -f2 -d'/')"
49
50                         for component_dir in \
51                                 'share/themes/MS-Windows' \
52                                 'share/icons/hicolor' \
53                                 'lib/gdk-pixbuf-2.0' \
54                                 'lib/gtk-2.0'
55                         do
56                                 if ! [ -d "${bundle_dir}/${component_dir}" ]
57                                 then
58                                         mkdir --parents "${bundle_dir}/$(dirname "${component_dir}")"
59                                         cp -r --preserve=timestamps "/${mingw}/${component_dir}" \
60                                                 "${bundle_dir}/${component_dir}"
61                                 fi
62                         done
63
64                         find "${bundle_dir}/lib" -type f -name '*.a' -exec rm {} \;
65                         find "${bundle_dir}/lib" -type f -name '*.h' -exec rm {} \;
66                         find "${bundle_dir}/lib" -type d -exec rmdir --ignore-fail-on-non-empty {} \;
67                 fi
68         done
69 }
70
71 system_name="${1}"; shift
72 bundle_dir="${1}"; shift
73 exe_file="${1}"; shift
74
75 registry_dir="${bundle_dir}/registry"
76
77 case "${system_name}" in
78         'register')
79                 mkdir --parents "${registry_dir}"
80                 printf '%s\n' "${exe_file}" > "${registry_dir}/$(uuidgen)"
81                 ;;
82         'windows')
83                 bundle_dir="$(cygpath --unix "${bundle_dir}")"
84                 
85                 lib_dir="${bundle_dir}/lib"
86                 mkdir --parents "${lib_dir}"
87
88                 if [ -d "${registry_dir}" ]
89                 then
90                         for registry_entry in "${registry_dir}"/*
91                         do
92                                 exe_file="$(cat "${registry_entry}")"
93
94                                 Windows::bundleLibFromFile "${exe_file}"
95
96                                 rm "${registry_entry}"
97                                 rmdir --ignore-fail-on-non-empty "${registry_dir}"
98                         done
99                         
100                         manifest_file="${lib_dir}/lib.manifest"
101                         Windows::printManifest "${lib_dir}" > "${manifest_file}"
102                 fi
103                 ;;
104         *)
105                 printf 'ERROR: unsupported system: %s\n' "${system_name}" >&2
106                 exit 1
107                 ;;
108 esac