I think the fundamental problem you are facing is:
- cmd.exe (and batch files) parse quoting one way.
- where-as programs parse the command line "any-way-they-please", usually (but
not always) using some compiler-language specific run-time-library (RTL).
(Unix shells are very different: the parsing is done by the shell and the
program is provided a pre-parsed argument list).
Erik,
One work-around you might try is "call" every command. Since "call" is a
built-in in cmd.exe, this should start cmd.exe for every command; thereby
running everything (batchfiles and "real" programs) all under a cmd shell.
I.e.
target:
call foo
call prog1.bat
call prog2.EXE
Done this way cmd.exe is consistently used, and you "only" figure out quoting
once.
I'm most(only) familiar with the microsoft's C RTL, it very much parses quoting
differently from cmd.exe batch files.
Using a fairly recent ms-CRTL version (different versions have slightly
different behavior) I get this:
cmd.exe command argv[1] from ms CRTL
--------------- --------------------
foo.exe "a b" a b
foo.exe "a "b" a b
foo.exe "a ""b" a "b
foo.exe "a """b" a "b
foo.exe "a """"b" a "b
foo.exe "a """""b" a ""b
foo.exe "a """"":b" a "":b
foo.exe "a """"""b" a ""b
foo.exe "a """""""b" a ""b
foo.exe "a """"""""b" a """b
foo.exe "a \" b" a " b
Note in the last example above, a batchfile would see TWO arguments (not one).
1st: "a \"
2nd: b"
.dfc.
From: [email protected]
[mailto:[email protected]] On Behalf Of Erik
Carstensen
Sent: 2013-05-03 Friday 08:17
To: [email protected]
Subject: Incorrect quoting of """" """" in master branch, with SHELL=cmd.exe
When passing """" """" to a shell, it is evaluated to a single word " " if
cmd.exe evaluates it, but to an unquoted single space if make short-circuits
the cmd.exe argument.
Test case:
foo.mk<http://foo.mk> contains:
SHELL=cmd.exe
$(info x is $(x))
default:
mkdir $(x)
Makefile contains:
SHELL=cmd.exe
default:
$(MAKE) -f foo.mk<http://foo.mk> x=a"""" """"b
With 3.82 (which lets cmd.exe handle the quotes), this yields:
x is a" "b
With master (which short-circuits it), it yields:
x is a
*** No rule to build target 'b'. Stop.
My actual use case is similar to the 'mkdir' invocation in
foo.mk<http://foo.mk> (a file with spaces needs to be quoted twice in order to
be passed to commands in a recursive make). I have found sufficient workarounds
for my use cases.
_______________________________________________
Make-w32 mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/make-w32