Re: command line limit in mingw-make

Joe Burmeister <[email protected]> Fri, 25 May 2012 15:57:10 +0100
Newsgroups gmane.comp.gnu.make.windows
Message-ID <[email protected]>
On 25/05/12 15:08, Eli Zaretskii wrote:
>> Date: Fri, 25 May 2012 14:19:59 +0100
>> From: Joe Burmeister<[email protected]>
>>
>> Next time I hit it was an odd one that took me a while to find. The
>> 8192nd character of the argument characters was being deleted when g++
>> was being called by mingw-make.
>> That character was the D part of the a command line define. So
>> "-Dsomething" became "-something" and g++ was erroring out about an
>> invalid option.
>>
>> The call to g++ was from a temporary batch file that mingw-make had made.
>> So I made a custom mingw-make that padded around the 8192nd character,
>> and things built.
>>
>> But this made me uncomfortable. Everything said the limit should be 8191
>> characters. So I dug deeper. There is no limit. You can keep adding
>> characters until when you call the app it doesn't run, causing the error
>> "The system cannot execute the specified program". For console apps that
>> was 32733 arg characters, for gui apps it's 32757, which makes sense as
>> they are different sub-systems in Windows. Every 8k boundary a character
>> was dropped.
> That sounds like some bug somewhere.  Can you take a peek at the
> temporary batch file while it runs, and see if the command line is
> written correctly there?  I'd like to make sure Make isn't where that
> bug is.

Looks like I didn't put one aside.
I'll get one, but it requires me to rebuild qt5, again, which isn't a 
small thing to build.

But the line looks correct, other than being crazy long. Attached is a 
zip with the problem demo'ed outside of make.


>
>> I think better is to change mingw-make so that it doesn't create a
>> temporary batch file but uses CreateProcess to get access to the 64k
>> limit.
> Make already does that, but only if the command line does not include
> characters special for the shell, like redirection, pipes, etc.  Can
> you show the command line, so that we could understand which part(s)
> thereof triggered the use of a batch file?
I've just grabbed a short one as qt5 builds. It's just:

"
@echo off
g++ -c -include tmp\obj\debug_shared\qt_pch.h -fno-keep-inline-dllexport 
-g -Wall -frtti -fexceptions -mthreads -DQT_SHARED -DUNICODE 
-DQT_LARGEFILE_SUPPORT -DQT_BUILD_NETWORK_LIB -DQT_NO_USING_NAMESPACE 
-DQT_MAKEDLL -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS 
-DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -D_USE_MATH_DEFINES -DQT_DLL 
-DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE 
-DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -I"..\..\include\QtCore\5.0.0" 
-I"..\..\include\QtCore\5.0.0\QtCore" -I"..\..\include\QtCore" 
-I"..\..\include" -I"..\..\include\QtNetwork\5.0.0" 
-I"..\..\include\QtNetwork\5.0.0\QtNetwork" -I"..\..\include\QtNetwork" 
-I"..\..\include" -I"tmp\rcc\debug_shared" -I"tmp" -I"..\3rdparty\zlib" 
-I"kernel" -I"tmp\moc\debug_shared" -I"c:\MinGW\include" 
-I"c:\MinGW\msys\1.0\local\include" -I"..\..\mkspecs\win32-g++" -o 
tmp\obj\debug_shared\qnetworkreplyfileimpl.o 
access\qnetworkreplyfileimpl.cpp
"

 From what you just told me, I don't see why this would trigger a 
intermediate batch file like this.

It's the mingw32-make I got from the mingw install.

mingw32-make -v gives:

GNU Make 3.82
Built for i386-pc-mingw32
Copyright (C) 2010  Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
<http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.



Joe

_______________________________________________
Make-w32 mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/make-w32
test.zip (application/zip, 2.4 KB) - not displayed