public inbox for cygwin@cygwin.com
 help / color / mirror / Atom feed
* libtool with mingw hangs building openocd in func_convert_core_msys_to_w32
@ 2021-06-25 14:34 Dietmar May
  2021-06-25 15:27 ` Jonathan Yong
  0 siblings, 1 reply; 12+ messages in thread
From: Dietmar May @ 2021-06-25 14:34 UTC (permalink / raw)
  To: cygwin

SUMMARY

func_convert_core_msys_to_w32 in

/usr/share/libtool/build-aux/ltmain.sh

has an extraneous '/' in the call to

( cmd //c echo "$1" )

causing make to hang indefinitely

when configured with

--build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32


The project builds successfully on msys2 & mingw-w64-x86_64-gcc 
installed, as well as on git-for-windows-sdk (which uses msys2). msys2 
has the same issue ('//c'), but the compiler is in the path, so no 
cross-compilation configuration is needed (and apparently this function 
is not invoked).


DETAILS

func_convert_core_msys_to_w32() in the generated libtool script, when 
configured using --build and --host for mingw, expands to:

cmd //c echo ... | sed

//c is not a valid option to cmd.exe, and causes cmd.exe to hang 
indefinitely. This is reproducible from the command line:

cmd //c echo .libs/ | /usr/bin/sed -e 's/[ ]*$//' -e 
's|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'

ps aux shows cmd.exe, with sed at pid cmd.exe + 1. kill is the only way 
to terminate.

By changing "cmd //c" to "cmd /c", the command completes successfully.


/usr/share/libtool/build-aux/ltmain.sh is the template, which contains 
the code:

# func_convert_core_msys_to_w32 ARG
# Convert file name or path ARG from MSYS format to w32 format. Return
# result in func_convert_core_msys_to_w32_result.
func_convert_core_msys_to_w32 ()
{
   $debug_cmd

   # awkward: cmd appends spaces to result
   func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 
2>/dev/null` |
     $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"`
}
#end: func_convert_core_msys_to_w32

I've been able to get past this problem by editing this file and running 
configure again.

Unfortunately, make aborts at a later point with a different (but 
perhaps related?) error:

func_to_tool_file src/.libs/libopenocd.libcmd

func_convert_file_msys_to_w32 src/.libs/libopenocd.libcmd
func_convert_core_msys_to_w32 src/.libs/libopenocd.libcmd
func_convert_file_check src/.libs/libopenocd.libcmd 
src\\.libs\\libopenocd.libcmd
func_execute_cmds $AR $AR_FLAGS $oldlib$oldobjs~$RANLIB $tool_oldlib exit $?
  exit $?w_eval x86_64-w64-mingw32-ar cru src/.libs/libopenocd.a 
@src\\.libs\\libopenocd.libcmd
func_quote_for_expand x86_64-w64-mingw32-ar cru src/.libs/libopenocd.a 
@src\\.libs\\libopenocd.libcmd
func_notquiet x86_64-w64-mingw32-ar cru src/.libs/libopenocd.a 
@src\\.libs\\libopenocd.libcmd
func_echo x86_64-w64-mingw32-ar cru src/.libs/libopenocd.a 
@src\\.libs\\libopenocd.libcmd


libtool: link: x86_64-w64-mingw32-ar cru src/.libs/libopenocd.a 
@src\\.libs\\libopenocd.libcmd

: No such file or directory\.libs\libopenocd.libcmd
make[2]: *** [Makefile:2811: src/libopenocd.la] Error 1

The file *is* there:

$ ls src/.libs
libopenocd.lax  libopenocd.libcmd

Running the command directly completes with no errors:

$ x86_64-w64-mingw32-ar cru src/.libs/libopenocd.a 
@src\\.libs\\libopenocd.libcmd
$


One thing I don't understand is why libtool is converting paths to 
windows format to run inside of a cygwin shell. The command completes 
successfully *if no path conversion occurs* - so why bother?

$ x86_64-w64-mingw32-ar cru src/.libs/libopenocd.a 
@src/.libs/libopenocd.libcmd

$

Is this a holdover from 13 year old mingw behavior? or related somehow 
to running autotools in a cmd.exe environment (like Microsoft's original 
NT "posix" subsystem, a port of gnu commands to run "natively" under 
cmd.exe)?

Can libtool just ditch all of the back and forth path conversions, and 
simplify all of this?


REPRODUCING

Install mingw64-x86_64-gcc-g++, autoconf, autoconf2.1, autoconf2.5, 
automake and pkg-config in cygwin.

I believe that will pull in all required dependencies.


git clone https://git.code.sf.net/p/openocd/code

cd openocd

./bootstrap

./configure --disable-werror --disable-doxygen-pdf --enable-ftdi 
--enable-jlink --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32

make # or make -j8



^ permalink raw reply	[flat|nested] 12+ messages in thread
[parent not found: <355a97ed-2076-6756-8a5f-227e44537136@outlook.com>]
* Re: libtool with mingw hangs building openocd in func_convert_core_msys_to_w32
@ 2021-06-28 13:56 Dietmar May
  2021-06-28 14:49 ` René Berber
  0 siblings, 1 reply; 12+ messages in thread
From: Dietmar May @ 2021-06-28 13:56 UTC (permalink / raw)
  To: cygwin

Thanks for submitting the bug report.

> I can now see what may be a duplicate report under:
>
> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=10949
>
> responding that //c is deliberate so MSYS does not convert a posix path,
> so in the Cygwin Mingw build case, the response may be "Don't Do That"! 

I just re-installed msys2 and tried a few things, with interesting result.

First, "ls /usr//bin" as well as "ls /usr/////bin" complete successfully 
under both cygwin and msys2, demonstrating slash compaction.

However, "ls //usr/bin" hangs, as both apparently evaluate the leading 
// as a server path.

For testing libtool's construct, I tried:

$ cmd //c echo hello
hello

which works, and this, which doesn't:

$ cmd /c echo hello

Microsoft Windows [Version 10.0.blah]
(c) Microsoft Corporation. All rights reserved.

C:\msys64\home\myname>

Interestingly,

ls //c

hangs under msys2 (as well as cygwin),

whereas

cmd //c

does not; so it almost seems like msys2 has a hack to recognize that 
cmd.exe is being invoked ...

However, both of the following also complete successfully under msys2, 
WITHOUT the double-slash hack:

$ cmd /c "echo hello"
hello

$ cmd "/c" "echo hello"
hello

Both seem preferable to bad syntax.

Of course, there's always the question of why libtool is using cmd.exe 
instead of /bin/echo, which seems to work just fine ...

$ /bin/echo "hello world"
hello world

> On 2021-06-27 14:23, Brian Inglis wrote:
>>> Which you don't need to change if you configure properly, as JonY 
>>> replied on the list to your earlier post:
>>
>>>> On 2021-06-25 09:27, Jonathan Yong via Cygwin wrote:
>>>>> Don't set --build, you are building on Cygwin, not MSYS.
>>
>>> Jonathan Yong is correct - removing --build allows make to complete 
>>> without error using the unmodified ltmain.sh > There's still the 
>>> issue of generating a call to cmd.exe with an
>>> invalid switch (//c), which will cause it to hang indefinitely if
>>> ever invoked.
>>  > The risk of breaking anything by fixing this seems like nil.
>>
>> The issue exists in the package libtool upstream:
>>
>> https://git.savannah.gnu.org/cgit/libtool.git/tree/build-aux/ltmain.in#n963 
>>
>>
>> I submitted a bug report with link to this thread and patch to the 
>> upstream package maintainers; I will post any responses received.
>

^ permalink raw reply	[flat|nested] 12+ messages in thread
[parent not found: <1f91bcfb-374f-7985-5b4e-c6e323de3cd8@outlook.com>]

end of thread, other threads:[~2023-07-25 16:19 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-25 14:34 libtool with mingw hangs building openocd in func_convert_core_msys_to_w32 Dietmar May
2021-06-25 15:27 ` Jonathan Yong
     [not found] <355a97ed-2076-6756-8a5f-227e44537136@outlook.com>
2021-06-25 20:46 ` Dietmar May
2021-06-26 19:17   ` Brian Inglis
2021-06-27  2:38     ` Dietmar May
2021-06-27 20:23       ` Brian Inglis
2021-06-27 22:00         ` Brian Inglis
2021-06-28 13:56 Dietmar May
2021-06-28 14:49 ` René Berber
     [not found] <1f91bcfb-374f-7985-5b4e-c6e323de3cd8@outlook.com>
2021-06-28 16:29 ` Dietmar May
2021-06-28 17:06   ` Jonathan Yong
2023-07-25 16:19   ` Evgeny Grin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).