Charles Wilson wrote:
[mingw] Add cross-compile support to cwrapper
* libltdl/config/ltmain.m4sh (func_to_host_path):
If present, use winepath to convert from $build to $host
if $host is mingw and $build is neither mingw (msys) nor
cygwin. Also update comments.
(func_to_host_pathlist): Ditto.
---
This is a follow-on to the recent patch dealing with the cwrapper
for mingw and cygwin. This patch adds the ability for cross-compile
setups (where $host=mingw and $build=<not mingw/msys, not cygwin,
but some *nix with wine>) to generate "correct" binary wrappers.
winepath, if found, is used to convert $build (unix) paths to
the appropriate "windows-style" paths /inside/ the wine environment.
If winepath is not found, then the $build path will be used by
the cwrapper (which is the current behavior for cross-compile to
mingw $host). Obviously, the $build path is not correct, so the
cwrapper won't work -- but the build will continue successfully
after printing a warning, so no harm.
However, I can't test this patch directly. The concepts work in
my stripped-down wine-on-linux install, but I don't have a full
mingw environment to test the whole thing in. I *did* verify that
this patch causes no regressions for native cygwin, and native mingw.
Also, I think that, even in the best of cases and everything works
as I expect, you'll either have have the linux binfmt extension
working to actually run the test suite in a cross-compile setup,
because I don't know how you'd convince the testsuite machinery
to prefix every program invocation with '/path/to/wine ...'
Anyway; please /test/.
Chuck
libltdl/config/ltmain.m4sh | 97 +++++++++++++++++++++++++++++--------------
1 files changed, 65 insertions(+), 32 deletions(-)
diff --git a/libltdl/config/ltmain.m4sh b/libltdl/config/ltmain.m4sh
index 0bfae76..197920c 100644
--- a/libltdl/config/ltmain.m4sh
+++ b/libltdl/config/ltmain.m4sh
@@ -2515,12 +2515,19 @@ func_emit_wrapper ()
#
# Convert paths to build format when used with build tools.
# Intended for use with "native" mingw (where libtool itself
-# is running under the msys shell). Ordinarily, the (msys) shell
-# automatically converts such things for non-msys applications
-# it launches, but that isn't available from inside the cwrapper.
-# Similar accommodations are necessary for $host mingw and $build
-# cygwin. Calling this function does no harm on other $build or
-# for other $host.
+# is running under the msys shell), or in the following cross-
+# build environments:
+# $build $host
+# mingw (msys) mingw [e.g. native]
+# cygwin mingw
+# *nix + wine mingw
+# where wine is equipped with the `winepath' executable.
+# In the native mingw case, the (msys) shell automatically
+# converts paths for any non-msys applications it launches,
+# but that facility isn't available from inside the cwrapper.
+# Similar accommodations are necessary for $host mingw and
+# $build cygwin. Calling this function does no harm for other
+# $host/$build combinations not listed above.
#
# ARG is the path (on $build) that should be converted to
# the proper representation for $host. The result is stored
@@ -2546,6 +2553,13 @@ func_to_host_path ()
func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
$SED -e "$lt_sed_naive_backslashify"`
;;
+ * )
+ if winepath -h >/dev/null 2>&1 ; then
+ func_to_host_path_tmp1=`winepath -w "$1"`
+ func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+ $SED -e "$lt_sed_naive_backslashify"`
+ fi
+ ;;
esac
if test -z "$func_to_host_path_result" ; then
func_error "Could not determine host path corresponding to"
@@ -2561,12 +2575,18 @@ func_to_host_path ()
# func_to_host_pathlist arg
#
# Convert pathlists to build format when used with build tools.
-# See func_to_host_path(), above.
+# See func_to_host_path(), above. This function supports the
+# following $build/$host combinations (but does no harm for
+# combinations not listed here):
+# $build $host
+# mingw (msys) mingw [e.g. native]
+# cygwin mingw
+# *nix + wine mingw
#
-# Path separators are also converted from ':' to ';', and if
-# $1 begins or ends with a ':' it is preserved (as ';') on
-# output. This description applies only when $build is mingw
-# (msys) or cygwin, and $host is mingw.
+# Path separators are also converted from $build format to
+# $host format. If ARG begins or ends with a path separator
+# character, it is preserved (but converted to $host format)
+# on output.
#
# ARG is a pathlist (on $build) that should be converted to
# the proper representation on $host. The result is stored
@@ -2578,16 +2598,12 @@ func_to_host_pathlist ()
case $host in
*mingw* )
lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
- case $build in
- *mingw* | *cygwin* )
- # Remove leading and trailing ':' from $1. The behavior of
- # msys is inconsistent here, and cygpath turns them into
- # into '.;' and ';.'
- func_to_host_pathlist_tmp2="$1"
- func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\
- $SED -e 's|^:*||' -e 's|:*$||'`
- ;;
- esac
+ # Remove leading and trailing path separator characters from
+ # ARG. msys behavior is inconsistent here, cygpath turns them
+ # into '.;' and ';.', and winepath ignores them completely.
+ func_to_host_pathlist_tmp2="$1"
+ func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\
+ $SED -e 's|^:*||' -e 's|:*$||'`
case $build in
*mingw* ) # Actually, msys.
# Awkward: cmd appends spaces to result.
@@ -2602,23 +2618,40 @@ func_to_host_pathlist ()
func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
$SED -e "$lt_sed_naive_backslashify"`
;;
+ * )
+ # unfortunately, winepath doesn't convert pathlists
+ func_to_host_pathlist_result=""
+ func_to_host_pathlist_oldIFS=$IFS
+ IFS=:
+ for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
+ IFS=$func_to_host_pathlist_oldIFS
+ if test -n "$func_to_host_pathlist_f" ; then
+ func_to_host_path "$func_to_host_pathlist_f"
+ if test -n "$func_to_host_path_result" ; then
+ if test -z "$func_to_host_pathlist_result" ; then
+ func_to_host_pathlist_result="$func_to_host_path_result"
+ else
+
func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result"
+ fi
+ fi
+ fi
+ IFS=:
+ done
+ IFS=$func_to_host_pathlist_oldIFS
+ ;;
esac
if test -z "$func_to_host_pathlist_result" ; then
func_error "Could not determine the host path(s) corresponding to"
func_error " '$1'"
func_error "Continuing, but uninstalled executables may not work."
fi
- case $build in
- *mingw* | *cygwin* )
- # Now, add the leading and trailing ':' back
- case "$1" in
- :* )
func_to_host_pathlist_result=";$func_to_host_pathlist_result"
- ;;
- esac
- case "$1" in
- *: )
func_to_host_pathlist_result="$func_to_host_pathlist_result;"
- ;;
- esac
+ # Now, add the leading and trailing path separators back
+ case "$1" in
+ :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
+ ;;
+ esac
+ case "$1" in
+ *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;"
;;
esac
;;
May be the patch can be more simple. In a previous post I confirm that
for the wine emulator is enough items in path list, where every item is
absolute path from build system, to be separated by DOS path-separator
only. This is enough and at run-time wine(wineloader?) will translate
internally from "build system absolute path" to the "path from emulated
environment".
Also the mapping can be changed after build of package (creation of
cwrapper). So that translated paths (in cwrapper) may point to non
existing more locations in emulated environment.
Please, let me know if you need more info (strace output, dos device
mapping, etc). The test case that I use was posted to the list. In brief:
- library foo1 in ./lib1
- library libfoo2 in ./lib2
- executable foo.exe in ./appl that call functions from foo1 and foo2
libraries.
Roumen
P.S.:
Also winepath exit with zero(!?!?!?) even if path cannot be translated:
==============================
$ winepath -w `pwd`; echo $?
Warning: could not find DOS drive for current working directory
'/...../lt-HEAD-mingw-mlib', starting in the Windows directory.
0
==============================
Above command was run top build-dir with removed mapping to the some
paths in build host.