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 -v '/libc\./|/libX|/libxcb|/libGL' \
42 | egrep -v '/libbsd\.|/libICE\.|/libselinux\.|/libSM.\.'
45 egrep -i '\.dll => [A-Z]:\\msys64\\' \
60 case "${system_name}" in
65 ntldd --recursive "${exe_file}"
70 Multi::getGtkThemeName () {
71 case "${system_name}" in
81 Multi::getGtkLibName () {
82 case "${system_name}" in
84 echo 'libgtk-x11-2.0.so.0'
87 echo 'libgtk-win32-2.0-0.dll'
92 Multi::getRootPrefix () {
95 case "${system_name}" in
101 basename "${lib_file}" \
102 | xargs -n1 -P 1 which \
108 Multi::getLibPrefix () {
109 local lib_file="${1}"
111 case "${system_name}" in
113 dirname "${lib_file}" \
122 Multi::bundleGtkDepsFromFile () {
123 local lib_file="${1}"
125 lib_basename="$(basename "${lib_file}")"
127 gtk_lib_name="$(Multi::getGtkLibName)"
128 if [ "${lib_basename}" = "${gtk_lib_name}" ]
130 root_prefix="$(Multi::getRootPrefix "${lib_file}")"
131 lib_prefix="$(Multi::getLibPrefix "${lib_file}")"
132 gtk_theme_name="$(Multi::getGtkThemeName)"
134 for component_dir in \
135 'share/themes/'"${gtk_theme_name}"'/gtk-2.0' \
136 'share/icons/hicolor' \
137 "${lib_prefix}"'/gdk-pixbuf-2.0' \
138 "${lib_prefix}"'/gtk-2.0'
140 if ! [ -d "${bundle_dir}/${component_dir}" ]
142 mkdir --parents "${bundle_dir}/$(dirname "${component_dir}")"
144 cp -r --preserve=timestamps \
145 "/${root_prefix}/${component_dir}" \
146 "${bundle_dir}/${component_dir}"
152 Multi::bundleLibFromFile () {
153 local exe_file="${1}"
155 Multi::printLdd "${exe_file}" \
157 | while read lib_file
159 lib_basename="$(basename "${lib_file}")"
161 if [ -f "${bundle_dir}/${lib_basename}" ]
166 cp --preserve=timestamps \
168 "${lib_dir}/${lib_basename}"
170 Multi::bundleGtkDepsFromFile "${lib_file}"
175 find "${bundle_dir}/lib" \
180 find "${bundle_dir}/lib" \
185 find "${bundle_dir}/lib" \
188 -exec rmdir --ignore-fail-on-non-empty {} \;
192 local exe_file="${1}"
194 patchelf --set-rpath "${rpath_string}" "${exe_file}"
203 -exec patchelf --set-rpath "${rpath_string}" {} \;
206 Windows::listLibForManifest () {
213 -exec basename {} \; \
215 | xargs -0 -n1 -P1 -I{} \
216 printf ' <file name="{}"/>\n'
219 Windows::writeManifest () {
222 cat > "${manifest_file}" <<-EOF
223 <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
224 <assemblyIdentity type="win32" name="lib" version="1.0.0.0"/>
225 $(Windows::listLibForManifest "${lib_dir}")
230 system_name="${1}"; shift
231 bundle_dir="${1}"; shift
232 exe_file="${1}"; shift
234 bundle_dir="$(Common::getPath "${bundle_dir}")"
235 registry_dir="${bundle_dir}/registry"
236 lib_dir="${bundle_dir}/lib"
238 manifest_file="${lib_dir}/lib.manifest"
240 rpath_string='@executable_path:lib'
242 exe_action='Common::noOp'
243 lib_action='Common::noOp'
245 case "${system_name}" in
247 mkdir --parents "${registry_dir}"
248 Common::getPath "${exe_file}" > "${registry_dir}/$(uuidgen)"
252 exe_action='Linux::patchExe'
253 lib_action='Linux::patchLib'
256 lib_action='Windows::writeManifest'
259 printf 'ERROR: unsupported system: %s\n' "${system_name}" >&2
264 mkdir --parents "${lib_dir}"
266 if [ -d "${registry_dir}" ]
268 for registry_entry in "${registry_dir}"/*
270 exe_file="$(cat "${registry_entry}")"
272 Multi::bundleLibFromFile "${exe_file}"
274 "${exe_action}" "${exe_file}"
276 rm "${registry_entry}"
278 "${exe_action}" "${exe_file}"
281 rmdir "${registry_dir}"
284 "${lib_action}" "${lib_dir}"