diff options
Diffstat (limited to 'nixpkgs/pkgs/stdenv/cygwin/wrap-exes-to-find-dlls.sh')
-rw-r--r-- | nixpkgs/pkgs/stdenv/cygwin/wrap-exes-to-find-dlls.sh | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/stdenv/cygwin/wrap-exes-to-find-dlls.sh b/nixpkgs/pkgs/stdenv/cygwin/wrap-exes-to-find-dlls.sh new file mode 100644 index 000000000000..d0da8c1b65c2 --- /dev/null +++ b/nixpkgs/pkgs/stdenv/cygwin/wrap-exes-to-find-dlls.sh @@ -0,0 +1,74 @@ +postFixupHooks+=(_cygwinWrapExesToFindDlls) + +_cygwinWrapExesToFindDlls() { + find $out -type l | while read LINK; do + TARGET="$(readlink "${LINK}")" + + # fix all non .exe links that link explicitly to a .exe + if [[ ${TARGET} == *.exe ]] && [[ ${LINK} != *.exe ]]; then + mv "${LINK}" "${LINK}.exe" + LINK="${LINK}.exe" + fi + + # generate complementary filenames + if [[ ${LINK} == *.exe ]]; then + _LINK="${LINK%.exe}" + _TARGET="${TARGET%.exe}" + else + _LINK="${LINK}.exe" + _TARGET="${TARGET}.exe" + fi + + # check if sould create complementary link + DOLINK=1 + if [[ ${_TARGET} == *.exe ]]; then + # the canonical target has to be a .exe + CTARGET="$(readlink -f "${LINK}")" + if [[ ${CTARGET} != *.exe ]]; then + CTARGET="${CTARGET}.exe" + fi + + if [ ! -e "${CTARGET}" ]; then + unset DOLINK + fi + fi + + if [ -e "${_LINK}" ]; then + # complementary link seems to exist + # but could be cygwin smoke and mirrors + INO=$(stat -c%i "${LINK}") + _INO=$(stat -c%i "${_LINK}") + if [ "${INO}" -ne "${_INO}" ]; then + unset DOLINK + fi + fi + + # create complementary link + if [ -n "${DOLINK}" ]; then + ln -s "${_TARGET}" "${_LINK}.tmp" + mv "${_LINK}.tmp" "${_LINK}" + fi + done + + find $out -type f -name "*.exe" | while read EXE; do + WRAPPER="${EXE%.exe}" + if [ -e "${WRAPPER}" ]; then + # check if really exists or cygwin smoke and mirrors + INO=$(stat -c%i "${EXE}") + _INO=$(stat -c%i "${WRAPPER}") + if [ "${INO}" -ne "${_INO}" ]; then + continue + fi + fi + + mv "${EXE}" "${EXE}.tmp" + + cat >"${WRAPPER}" <<EOF +#!/bin/sh +export PATH=$_PATH${_PATH:+:}\${PATH} +exec "\$0.exe" "\$@" +EOF + chmod +x "${WRAPPER}" + mv "${EXE}.tmp" "${EXE}" + done +} |