diff options
Diffstat (limited to 'prefix-stack-ccwrap')
-rw-r--r-- | prefix-stack-ccwrap | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/prefix-stack-ccwrap b/prefix-stack-ccwrap new file mode 100644 index 0000000..93f7a82 --- /dev/null +++ b/prefix-stack-ccwrap @@ -0,0 +1,94 @@ +#!@GENTOO_PORTAGE_BPREFIX@/bin/bash + +if [ -r /cygdrive/. ]; then + winpath2unix() { cygpath -u "$1"; } + unixpath2win() { cygpath -w "$1"; } +fi + +myself=${0##*/} # basename $0 +link_dirs=() +opts=() +chost="@GENTOO_PORTAGE_CHOST@" +prefix="@GENTOO_PORTAGE_EPREFIX@" +absprefix=${prefix} +if [[ ${chost} == *"-winnt"* ]]; then + # we may get called from windows binary, like pkgdata in dev-libs/icu + # in this case, PATH elements get the "/dev/fs/C/WINDOWS/SUA" prefix + absprefix=$(winpath2unix "$(unixpath2win "${absprefix}")") +fi +[[ ${myself} == *windres* ]] && mode=compile || mode=link +orig_args=("$@") + +for opt in "$@" +do + case "$opt" in + -L) + link_dirs=("${link_dirs[@]}" "-L$1") + shift + ;; + -L*) + link_dirs=("${link_dirs[@]}" "${opt}") + ;; + *) + case "${opt}" in + -v) + # -v done right: only use mode version if -v is the _only_ + # argument on the command line. + [[ ${#orig_args[@]} -gt 1 ]] || mode=version + ;; + --version) mode=version ;; + -c|-E|-S) mode=compile ;; + -print-search-dirs) mode=dirs ;; + esac + opts=("${opts[@]}" "${opt}") + ;; + esac +done + +# remove any path to current prefix, need base prefix only +new_path= +save_ifs=$IFS +IFS=':' +for p in $PATH +do + IFS=$save_ifs + [[ ${p#${absprefix}} != "${p}" ]] && continue + if [[ -z "${new_path}" ]]; then + new_path="${p}" + else + new_path="${new_path}:${p}" + fi +done +IFS=$save_ifs + +PATH=${new_path} + +# binutils-config's ldwrapper understands '-R' for aix and hpux too. +# parity (winnt) understands -rpath only ... +case "${chost}" in +*-winnt*) rpath_opt="-Wl,-rpath," ;; +*) rpath_opt="-Wl,-R," ;; +esac + +pfx_link=("-L${prefix}/usr/lib" "-L${prefix}/lib") +pfx_link_r=("${rpath_opt}${prefix}/lib" "${rpath_opt}${prefix}/usr/lib") +pfx_comp=("-I${prefix}/include" "-I${prefix}/usr/include") + +# ensure we run the right chost program in base prefix +[[ ${myself} == *-*-*-* ]] || myself=${chost}-${myself#${chost}-} + +case "$mode" in +link) exec "${myself}" "${link_dirs[@]}" "${pfx_link[@]}" "${opts[@]}" "${pfx_comp[@]}" "${pfx_link_r[@]}" ;; +compile) exec "${myself}" "${link_dirs[@]}" "${opts[@]}" "${pfx_comp[@]}" ;; +version) exec "${myself}" "${orig_args[@]}" ;; +dirs) + "${myself}" "${orig_args[@]}" | while read line; do + if [[ "${line}" == "libraries: ="* ]]; then + echo "libraries: =${prefix}/usr/lib:${prefix}/lib:${line#"libraries: ="}" + else + echo "${line}" + fi + done + ;; +*) echo "cannot infer ${myself}'s mode from comamnd line arguments"; exit 1 ;; +esac |