commit:     22b59662d21039f8f3246d12a2ac0bbb93d35683
Author:     Michael Haubenwallner <haubi <AT> gentoo <DOT> org>
AuthorDate: Wed Jan 24 16:10:36 2018 +0000
Commit:     Michael Haubenwallner <haubi <AT> gentoo <DOT> org>
CommitDate: Wed Jan 24 16:22:45 2018 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=22b59662

prefix/winnt/profiles.bashrc: improve winnt helpers

With Gentoo Parity wrapping the Visual Studio compiler, build systems
unaware of Windows can create .so import libraries just fine.  But
Windows aware build systems do prefer .lib import libraries, so we do
create .lib -> .so symlinks, resolved by Gentoo Parity later on again.

Additionally, they don't know about the additional .dll to install.  So
we wrap the cp utility to also copy the dll when the library is copied.

 profiles/prefix/windows/winnt/profile.bashrc | 159 +++++++++++++++++++++++++--
 1 file changed, 149 insertions(+), 10 deletions(-)

diff --git a/profiles/prefix/windows/winnt/profile.bashrc 
b/profiles/prefix/windows/winnt/profile.bashrc
index f1c5c365338..7d1251609c0 100644
--- a/profiles/prefix/windows/winnt/profile.bashrc
+++ b/profiles/prefix/windows/winnt/profile.bashrc
@@ -1,4 +1,4 @@
-# Copyright 1999-2009 Gentoo Foundation
+# Copyright 1999-2018 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 
 # On windows, binary files (executables, shared libraries) in use
@@ -13,6 +13,20 @@
 # Need to explicitly set PKG_CONFIG_PATH for cross EPREFIX.
 export PKG_CONFIG_PATH="${EPREFIX}/lib/pkgconfig:${EPREFIX}/usr/lib/pkgconfig"
 
+windows_setup_dllhelper() {
+       case ${CATEGORY}/${PN} in
+       sys-libs/zlib |\
+       '')
+               # When a package build system does not know about Windows at 
all,
+               # still it can be built for Windows using Gentoo Parity.
+               # But as there is another file to install (the real dll),
+               # and installation is done using cp, we override cp to
+               # additionally copy the dll when the library is copied.
+               windows_setup_dllhelper_cp
+               ;;
+       esac
+}
+
 windows_cleanup_removed_files() {
        local removedlist=$1
        rm -f "${removedlist}".new
@@ -78,17 +92,36 @@ windows_prepare_file() {
 
 post_src_install() {
        cd "${ED}"
-       find . -name '*.exe' | while read f; do
-               if file "${f}" | grep "GUI" > /dev/null 2>&1; then
-                       if test ! -f "${f%.exe}"; then
-                               einfo "Windows GUI Executable $f will have no 
symlink."
+       find . -name '*.exe' -o -name '*.dll.a' -o -name '*.so' |
+       while read f
+       do
+               f=${f#./}
+               case ${f} in
+               *.exe)
+                       if file "./${f}" | grep "GUI" > /dev/null 2>&1; then
+                               if test ! -f "./${f%.exe}"; then
+                                       einfo "Windows GUI Executable $f will 
have no symlink."
+                               fi
+                       else
+                               if test ! -f "./${f%.exe}"; then
+                                       ebegin "creating ${f%.exe} -> ${f} for 
console accessibility."
+                                       eend $(ln -sf "$(basename "${f}")" 
"./${f%.exe}" && echo 0 || echo 1)
+                               fi
                        fi
-               else
-                       if test ! -f "${f%.exe}"; then
-                               ebegin "creating ${f%.exe} -> ${f} for console 
accessibility."
-                               eend $(ln -sf "$(basename "${f}")" "${f%.exe}" 
&& echo 0 || echo 1)
+                       ;;
+               *.dll.a)
+                       if test ! -f "./${f%.a}.lib"; then
+                               ebegin "creating ${f%.a}.lib -> ${f##*/} for 
libtool linkability"
+                               eend $(ln -sf "$(basename "${f}")" 
"./${f%.a}.lib" && echo 0 || echo 1)
                        fi
-               fi
+                       ;;
+               *.so)
+                       if test ! -f "${f%.so}.dll.lib"; then
+                               ebegin "creating ${f%.so}.dll.lib -> ${f##*/} 
for libtool linkability"
+                               eend $(ln -sf "$(basename "${f}")" 
"./${f%.so}.dll.lib" && echo 0 || echo 1)
+                       fi
+                       ;;
+               esac
        done
 }
 
@@ -149,3 +182,109 @@ pre_pkg_postrm() {
        local removedlist="${EROOT}var/lib/portage/files2bremoved"
        windows_cleanup_removed_files $removedlist
 }
+
+windows_setup_dllhelper_cp() {
+       if ! [[ $(type -P cp) -ef ${T}/dllhelper/cp ]]
+       then
+               mkdir -p "${T}/dllhelper"
+               cat > "${T}/dllhelper/cp" <<'EOCP'
+#!/usr/bin/env bash
+
+mysrcs=()
+myopts=()
+mydest=
+force_dest_file_opt=
+
+nextargs=( "$@" )
+
+while [[ $# > 0 ]]
+do
+       arg=${1}
+       shift
+       case ${arg} in
+       --)
+               mysrcs+=( "${@}" )
+               break
+               ;;
+       -S)
+               myopts+=( "${arg}" ${1+"$1"} )
+               ${1:+shift}
+               ;;
+       -t)
+               mydest="${1-}"
+               ${1:+shift}
+               ;;
+       -T)
+               force_dest_file_opt=${arg}
+               ;;
+       -*)
+               myopts+=( "${arg}" )
+               ;;
+       *)
+               mysrcs+=( "${arg}" )
+               ;;
+       esac
+done
+
+me=${0##*/}
+nextPATH=
+oIFS=$IFS
+IFS=:
+for p in ${PATH}
+do
+       [[ ${p}/${me} -ef ${0} ]] && continue
+       nextPATH+=${nextPATH:+:}${p}
+done
+IFS=${oIFS}
+
+PATH=${nextPATH}
+
+${me} "${nextargs[@]}"
+ret=$?
+[[ ${ret} == 0 ]] || exit ${ret}
+
+if [[ -z ${mydest} ]]
+then
+       [[ ${#mysrcs[@]} < 2 ]] && exit 0
+       : "${mysrcs[@]}" "${#mysrcs[@]}"
+       mydest=${mysrcs[${#mysrcs[@]}-1]}
+       unset mysrcs[${#mysrcs[@]}-1]
+elif [[ ${#mysrcs[@]} == 0 ]]
+then
+       exit 0
+fi
+
+for src in ${mysrcs[@]}
+do
+       ret=0
+       [[ ${src##*/} != lib*.so* ]] && continue
+       for ext in dll pdb
+       do
+               [[ ${src##*/} == *.${ext} ]] && continue
+               [[ -f ${src} && -f ${src}.${ext} ]] || continue
+               if [[ -d ${mydest} && ! -n ${force_dest_file_opt} ]]
+               then
+                       # When copying to directory we keep the basename.
+                       ${me} -T "${myopts[@]}" "${src}.${ext}" 
"${mydest}/${src##*/}.${ext}"
+                       ret=$?
+               elif [[ ${mydest##*/} == ${src##*/} ]]
+               then
+                       # Copy the dll only when we keep the basename.
+                       ${me} -T "${myopts[@]}" "${src}.${ext}" 
"${mydest}.${ext}"
+                       ret=$?
+               fi
+               [[ ${ret} == 0 ]] || exit ${ret}
+       done
+done
+
+exit 0
+EOCP
+               chmod +x "${T}/dllhelper/cp"
+               PATH="${T}/dllhelper:${PATH}"
+       fi
+}
+
+if [[ ${EBUILD_PHASE} == 'setup' ]]
+then
+       windows_setup_dllhelper
+fi

Reply via email to