summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Haubenwallner <haubi@gentoo.org>2018-01-24 17:10:36 +0100
committerMichael Haubenwallner <haubi@gentoo.org>2018-01-24 17:22:45 +0100
commit22b59662d21039f8f3246d12a2ac0bbb93d35683 (patch)
tree67ee27fdc97fe5b46ab208a361aec515986035d6 /profiles
parentsys-libs/efivar: bump to 32 (diff)
downloadgentoo-22b59662d21039f8f3246d12a2ac0bbb93d35683.tar.gz
gentoo-22b59662d21039f8f3246d12a2ac0bbb93d35683.tar.bz2
gentoo-22b59662d21039f8f3246d12a2ac0bbb93d35683.zip
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.
Diffstat (limited to 'profiles')
-rw-r--r--profiles/prefix/windows/winnt/profile.bashrc159
1 files changed, 149 insertions, 10 deletions
diff --git a/profiles/prefix/windows/winnt/profile.bashrc b/profiles/prefix/windows/winnt/profile.bashrc
index f1c5c365338b..7d1251609c0f 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