DynamoRIO / dynamorio

Dynamic Instrumentation Tool Platform
Other
2.61k stars 554 forks source link

build: nmake adds space before 1st / in 1st arg to a command invoked with quotes #84

Open derekbruening opened 9 years ago

derekbruening commented 9 years ago

From derek.br...@gmail.com on March 09, 2009 14:27:25

when invoked through nmake with a path to cmake that is quoted, if the 1st parameter to cmake is -Dvar=val and val contains a /, all chars from the / onward are deleted from val: tracked it down to an nmake bug. workaround is to have 1st parameter not contain any forward slashes, or, alternatively, to put a space after -D.

for me, from clean slate if I invoke as e:/PROGRA~2/CMAKE2~1.6/bin/cmake.exe then 1st build.make runs fine b/c no quotes around cmake.exe command: % grep -r proj_src api/ api/docs/CMakeFiles/htmldocs.dir/build.make:
e:\PROGRA~2\CMAKE2~1.6\bin\cmake.exe -Dsrcdir=D:/derek/opensource/dynamorio/api/docs -Doutfile=D:/derek/opensource/bb/api/docs/Doxyfile -Dproj_srcdir=D:/derek/opensource/dynamorio -Dversion_number=1.3.2 -Dheader_dir=D:/derek/opensource/bb/include -DDOXYGEN_EXECUTABLE=E:/cygwin/bin/doxygen.exe -P D:/derek/opensource/dynamorio/api/docs/CMake_doxyfile.cmake

but if I touch a cmake file and it re-gens on "nmake" it now uses: api/docs/CMakeFiles/htmldocs.dir/build.make: "E:\Program Files (x86)\CMake 2.6\bin\cmake.exe" -Dsrcdir=D:/derek/opensource/dynamorio/api/docs -Doutfile=D:/derek/opensource/bb/api/docs/Doxyfile -Dproj_srcdir=D:/derek/opensource/dynamorio -Dversion_number=1.3.2 -Dheader_dir=D:/derek/opensource/bb/include -DDOXYGEN_EXECUTABLE=E:/cygwin/bin/doxygen.exe -P D:/derek/opensource/dynamorio/api/docs/CMake_doxyfile.cmake => we get error on 1st arg: [ 80%] Generating Doxyfile CMake Error at D:/derek/opensource/dynamorio/api/docs/CMake_doxyfile.cmake:41 (file): file Internal CMake error when trying to open file: D:/API.doxy for reading.

if I invoke from clean slate w/ backslashes then get error right away. cd D:\derek\opensource\bb\api\docs "E:\Program Files (x86)\CMake 2.6\bin\cmake.exe" -Dsrcdir=D:/derek/opens

have script print out args: srcdir="D:" outfile="D:/derek/opensource/bb/api/docs/Doxyfile" proj_srcdir="D:/d but if I directly invoke in same way, from cmd, works fine: D:\derek\opensource\bb\api\docs>"E:\Program Files (x86)\CMake 2.6\bin\cmake.exe" -Dsrcdir=D:/derek/opensource/dynamorio/api/docs -Doutfile=D:/derek/opensource/bb/api/docs/Doxyfile -Dproj_srcdir=D:/derek/opensource/dynamorio -Dversion_number=1.3.2 -Dheader_dir=D:/derek/opensource/bb/include -DDOXYGEN_EXECUTABLE=E:/cygwin/bin/doxygen.exe -P D:/derek/opensource/dynamorio/api/docs/CMake_doxyfile.cmake srcdir="D:/derek/opensource/dynamorio/api/docs" outfile="D:/derek/opensource/bb/api/docs/Doxyfile" proj_srcdir="D:/derek/opensource/dynamorio"

add bogus 1st arg => 2nd arg is fine: "E:\Program Files (x86)\CMake 2.6\bin\cmake.exe" -Dfoo=x -Dsrcdir=D:/derek/opensource/dynamorio/api/docs -Doutfile=D:/derek/opensource/bb/api/docs/Doxyfile -Dproj_srcdir=D:/derek/opensource/dynamorio -Dversion_number=1.3.2 -Dheader_dir=D:/derek/opensource/bb/include -DDOXYGEN_EXECUTABLE=E:/cygwin/bin/doxygen.exe -P D:/derek/opensource/dynamorio/api/docs/CMake_doxyfile.cmake

tweak 1st arg => it's deleting everything after the 1st forward slash backward slash works fine: only forward slash add :PATH => no difference if put space after -D => works fine

have cmake pause (ran "cat") and attach to debugger so I can see real cmdline (here I had replaced 1st / with \ on srcdir): % ~/trees/64bit/tools/DRview.exe -cmdline -pid 3496 PID 3496, Process cmake.exe, running native Cmdline: e:\PROGRA~2\CMAKE2~1.6\bin\cmake.exe -Dsrcdir=D:\derek /opensource/dynamorio/api/docs -Doutfile=D:/derek/opensource/bb/api/docs/Doxyfile -Dproj_srcdir=D:/derek/opensource/dynamorio -Dversion_number=1.3.2 -Dheader_dir=D:/derek/opensource/bb/include -DDOXYGEN_EXECUTABLE=E:/cygwin/bin/doxygen.exe -P D:/derek/opensource/dynamorio/api/docs/CMake_doxyfile.cmake => it's an nmake bug

Original issue: http://code.google.com/p/dynamorio/issues/detail?id=84

derekbruening commented 9 years ago

From derek.br...@gmail.com on March 09, 2009 11:44:50

I fixed in r81 with -Dfoo => -D foo for 1st arg.

but what about these:

./core/CMakeLists.txt:      ARGS ${CMAKE_CURRENT_SOURCE_DIR}/lib/genapi.pl
./CMakeLists.txt:    ARGS ${PROJECT_SOURCE_DIR}/core/lib/genapi.pl
./make/CMake_events.cmake:  ARGS ${PROJECT_SOURCE_DIR}/core/gen_event_strings.pl

will hit the issue if someone uses perl installed on path with a space in it, since cmake will then use quotes

Labels: -Priority-Critical Priority-Medium

derekbruening commented 9 years ago

From derek.br...@gmail.com on March 09, 2009 12:33:08

Summary: build: nmake adds space before 1st / in 1st arg to a command invoked with quotes

derekbruening commented 9 years ago

From derek.br...@gmail.com on March 09, 2009 12:43:42

here is a simple Makefile that shows the bug (you may have to update for your cygwin installation):

Test case for issue #84 # This is a bug in nmake.exe where nmake adds space before 1st / in

1st arg to a command, if that command is invoked with quotes.

Observe: (this is with nmake.exe 8.00.50727.762)

% nmake /nologo noquotes

back\forward/slash second/arg

% nmake /nologo quotes

back\forward /slash second/arg

.PHONY : noquotes quotes noquotes: @e:\cygwin\bin\echo back\forward/slash second/arg quotes: @"e:\cygwin\bin\echo" back\forward/slash second/arg

derekbruening commented 9 years ago

From derek.br...@gmail.com on March 09, 2009 17:58:00

bug is present in older versions of nmake as well:

Microsoft (R) Program Maintenance Utility Version 7.10.3077 Copyright (C) Microsoft Corporation. All rights reserved. back\forward /slash second/arg

Microsoft (R) Program Maintenance Utility Version 6.00.8168.0 Copyright (C) Microsoft Corp 1988-1998. All rights reserved. back\forward /slash second/arg

derekbruening commented 9 years ago

From derek.br...@gmail.com on March 12, 2009 09:42:02

filed CMake request to not use quotes: http://www.cmake.org/Bug/view.php?id=8727