#! /usr/bin/env bash Windows::listLibForManifest () { local lib_dir="${1}" find "${lib_dir}" \ -maxdepth 1 \ -type f \ -name '*.dll' \ -exec basename {} \; \ | xargs -I {} \ printf ' \n' } Windows::printManifest () { local lib_dir="${1}" cat <<-EOF $(Windows::listLibForManifest "${lib_dir}") EOF } Windows::bundleLibFromFile () { local exe_file="${1}" exe_file="$(cygpath --unix "${exe_file}")" ntldd --recursive "${exe_file}" \ | egrep -i '\.dll => [A-Z]:\\msys64\\' \ | sed -e 's/ (0x[0-9a-f]*)$//;s/^.* => //' \ | cygpath --unix --file - \ | while read dll_file do dll_basename="$(basename "${dll_file}")" if [ -f "${bundle_dir}/${dll_basename}" ] then continue fi cp --preserve=timestamps "${dll_file}" "${lib_dir}/${dll_basename}" if [ "${dll_basename}" = 'libgtk-win32-2.0-0.dll' ] then mingw="$(which 'libgtk-win32-2.0-0.dll' | cut -f2 -d'/')" for component_dir in \ 'share/themes/MS-Windows' \ 'share/icons/hicolor' \ 'lib/gdk-pixbuf-2.0' \ 'lib/gtk-2.0' do if ! [ -d "${bundle_dir}/${component_dir}" ] then mkdir --parents "${bundle_dir}/$(dirname "${component_dir}")" cp -r --preserve=timestamps "/${mingw}/${component_dir}" \ "${bundle_dir}/${component_dir}" fi done find "${bundle_dir}/lib" -type f -name '*.a' -exec rm {} \; find "${bundle_dir}/lib" -type f -name '*.h' -exec rm {} \; find "${bundle_dir}/lib" -type d -exec rmdir --ignore-fail-on-non-empty {} \; fi done } system_name="${1}"; shift bundle_dir="${1}"; shift exe_file="${1}"; shift registry_dir="${bundle_dir}/registry" case "${system_name}" in 'register') mkdir --parents "${registry_dir}" printf '%s\n' "${exe_file}" > "${registry_dir}/$(uuidgen)" ;; 'windows') bundle_dir="$(cygpath --unix "${bundle_dir}")" lib_dir="${bundle_dir}/lib" mkdir --parents "${lib_dir}" if [ -d "${registry_dir}" ] then for registry_entry in "${registry_dir}"/* do exe_file="$(cat "${registry_entry}")" Windows::bundleLibFromFile "${exe_file}" rm "${registry_entry}" rmdir --ignore-fail-on-non-empty "${registry_dir}" done manifest_file="${lib_dir}/lib.manifest" Windows::printManifest "${lib_dir}" > "${manifest_file}" fi ;; *) printf 'ERROR: unsupported system: %s\n' "${system_name}" >&2 exit 1 ;; esac