10 if command -v cygpath >/dev/null
12 if [ "${file_path}" = '-' ]
15 | xargs -0 -n1 -P1 -I{} \
18 cygpath --unix "${file_path}"
21 if [ "${file_path}" = '-' ]
25 printf '%s\n' "${file_path}"
35 sed -e 's/ (0x[0-9a-f]*)$//;s/^.* => //'
38 Multi::excludeLdd () {
39 case "${system_name}" in
41 egrep -i '\.dll => [A-Z]:\\msys64\\' \
56 case "${system_name}" in
58 ntldd --recursive "${exe_file}"
63 Multi::getGtkThemeName () {
64 case "${system_name}" in
71 Multi::getGtkLibName () {
72 case "${system_name}" in
74 echo 'libgtk-win32-2.0-0.dll'
79 Multi::getRootPrefix () {
82 case "${system_name}" in
84 basename "${lib_file}" \
85 | xargs -n1 -P 1 which \
91 Multi::getLibPrefix () {
94 case "${system_name}" in
101 Multi::bundleGtkDepsFromFile () {
102 local lib_file="${1}"
104 lib_basename="$(basename "${lib_file}")"
106 gtk_lib_name="$(Multi::getGtkLibName)"
107 if [ "${lib_basename}" = "${gtk_lib_name}" ]
109 root_prefix="$(Multi::getRootPrefix "${lib_file}")"
110 lib_prefix="$(Multi::getLibPrefix "${lib_file}")"
111 gtk_theme_name="$(Multi::getGtkThemeName)"
113 for component_dir in \
114 'share/themes/'"${gtk_theme_name}"'/gtk-2.0' \
115 'share/icons/hicolor' \
116 "${lib_prefix}"'/gdk-pixbuf-2.0' \
117 "${lib_prefix}"'/gtk-2.0'
119 if ! [ -d "${bundle_dir}/${component_dir}" ]
121 mkdir --parents "${bundle_dir}/$(dirname "${component_dir}")"
123 cp -r --preserve=timestamps \
124 "/${root_prefix}/${component_dir}" \
125 "${bundle_dir}/${component_dir}"
131 Multi::bundleLibFromFile () {
132 local exe_file="${1}"
134 Multi::printLdd "${exe_file}" \
136 | while read lib_file
138 lib_basename="$(basename "${lib_file}")"
140 if [ -f "${bundle_dir}/${lib_basename}" ]
145 cp --preserve=timestamps \
147 "${lib_dir}/${lib_basename}"
149 Multi::bundleGtkDepsFromFile "${lib_file}"
154 find "${bundle_dir}/lib" \
159 find "${bundle_dir}/lib" \
164 find "${bundle_dir}/lib" \
167 -exec rmdir --ignore-fail-on-non-empty {} \;
170 Windows::listLibForManifest () {
177 -exec basename {} \; \
179 | xargs -0 -n1 -P1 -I{} \
180 printf ' <file name="{}"/>\n'
183 Windows::writeManifest () {
186 cat > "${manifest_file}" <<-EOF
187 <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
188 <assemblyIdentity type="win32" name="lib" version="1.0.0.0"/>
189 $(Windows::listLibForManifest "${lib_dir}")
194 system_name="${1}"; shift
195 bundle_dir="${1}"; shift
196 exe_file="${1}"; shift
198 bundle_dir="$(Common::getPath "${bundle_dir}")"
199 registry_dir="${bundle_dir}/registry"
200 lib_dir="${bundle_dir}/lib"
202 rpath_string='@executable_path:lib'
204 lib_action='Common::noOp'
206 case "${system_name}" in
208 mkdir --parents "${registry_dir}"
209 Common::getPath "${exe_file}" > "${registry_dir}/$(uuidgen)"
213 lib_action='Windows::writeManifest'
216 printf 'ERROR: unsupported system: %s\n' "${system_name}" >&2
221 mkdir --parents "${lib_dir}"
223 if [ -d "${registry_dir}" ]
225 for registry_entry in "${registry_dir}"/*
227 exe_file="$(cat "${registry_entry}")"
229 Multi::bundleLibFromFile "${exe_file}"
231 "${exe_action}" "${exe_file}"
233 rm "${registry_entry}"
236 rmdir "${registry_dir}"
239 "${lib_action}" "${lib_dir}"