Subject: bug#11578: closed (Re: bug#11578: 24.1.50; Can't 'make install' on Windows)

From: [email-masked] (GNU bug Tracking System)
Date: Tue, 29 May 2012 16:00:03 +0000

Your bug report

#11578: 24.1.50; Can't 'make install' on Windows

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
11578: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=11578
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#11578: 24.1.50; Can't 'make install' on Windows
From: Eli Zaretskii <[email-masked]>
To: Kazuhiro Ito <[email-masked]>
Cc: [email-masked]
Date: Tue, 29 May 2012 18:57:29 +0300
List-Id: <debbugs-submit.debbugs.gnu.org>

> Date: Tue, 29 May 2012 23:03:37 +0900
> From: Kazuhiro Ito <[email-masked]>
> 
> When I run configure.bat with --prefix option, 'make install' with
> MinGW fails.
> 
> > make: Circular D:/bin/emacs_trunk <- D:/bin/emacs_trunk dependency dropped.
> > make   -C ../lib-src install
> > [Please ignore a syntax error on the next line - it is intentional]
> > /bin/sh: -c: line 0: unexpected EOF while looking for matching `"'
> > /bin/sh: -c: line 1: syntax error: unexpected end of file
> > make[1]: Entering directory `/f/build/emacs-trunk/lib-src'
> > mkdir "D:/bin/emacs_trunk /bin"
> > mkdir: cannot create directory `D:/bin/emacs_trunk /bin': No such file or directory
> > make[1]: [install] Error 1 (ignored)
> > cp -f oo-spd/i386/etags.exe D:/bin/emacs_trunk /bin
> > cp: omitting directory `D:/bin/emacs_trunk'
> > make[1]: *** [install] Error 1
> > make[1]: Leaving directory `/f/build/emacs-trunk/lib-src'
> > make: *** [install-other-dirs-gmake] Error 2

This was reported to me yesterday off-list, and I fixed it on the
emacs-24 branch in revision 108019.  The patch is below, if you cannot
wait for the next merge from emacs-24 to the trunk.

> In the above, 'D:/bin/emacs_trunk' is argument of --prefix option.  It
> seems that makefile.w32-in does not assume INSTALL_DIR has trailing
> space.

No, the problem is a subtlety of the cmd.exe "echo" command.  If you
say

  echo foo=bar >>file

the blank between "bar" and the redirection symbol winds up in the
file.  The fix for that, which doesn't re-introduce a different, but
related bug fixed in r108005, is somewhat tricky, as you see below.

A workaround is not to use --prefix at configure time and instead set
INSTALL_DIR at "make install" time, like this:

  make install INSTALL_DIR=d:/bin/emacs_trunk

(If you are installing in the source tree, you need neither --prefix
nor INSTALL_DIR= at "make install" time, since that's the default
INSTALL_DIR anyway.)

=== modified file 'nt/ChangeLog'
--- nt/ChangeLog	2012-05-18 08:21:19 +0000
+++ nt/ChangeLog	2012-05-28 16:17:35 +0000
@@ -1,3 +1,12 @@
+2012-05-28  Eli Zaretskii  <[email-masked]>
+
+	* configure.bat (genmakefiles): Move the redirection away from the
+	end of the command, to avoid excess whitespace at the end of Make
+	variables created at configure time, and also avoid things like
+	"FOO1>>config.settings", where "1" gets interpreted as the file
+	descriptor and eaten up.  This fixes breakage introduced by the
+	last change, without reintroducing the bug fixed by that change.
+
 2012-05-18  Eli Zaretskii  <[email-masked]>
 
 	* configure.bat: Ensure a space between %var% expansion and

=== modified file 'nt/configure.bat'
--- nt/configure.bat	2012-05-18 08:21:19 +0000
+++ nt/configure.bat	2012-05-28 16:17:35 +0000
@@ -721,29 +721,36 @@ if %COMPILER% == gcc set MAKECMD=gmake
 if %COMPILER% == cl set MAKECMD=nmake
 
 rem   Pass on chosen settings to makefiles.
-rem   NB. Be very careful to not have a space before redirection symbols
-rem   except when there is a preceding digit, when a space is required.
 rem
+rem   The weird place we put the redirection is to make sure no extra
+rem   whitespace winds up at the end of the Make variables, since some
+rem   variables, e.g. INSTALL_DIR, cannot stand that.  Yes, echo will
+rem   write the blanks between the end of command arguments and the
+rem   redirection symbol to the file.  OTOH, we cannot put the
+rem   redirection immediately after the last character of the command,
+rem   because environment variable expansion can yield a digit there,
+rem   which will then be misinterpreted as the file descriptor to
+rem   redirect...
 echo # Start of settings from configure.bat >config.settings
-echo COMPILER=%COMPILER% >>config.settings
-if not "(%mf%)" == "()" echo MCPU_FLAG=%mf% >>config.settings
-if not "(%dbginfo%)" == "()" echo DEBUG_INFO=%dbginfo% >>config.settings
-if (%nodebug%) == (Y) echo NODEBUG=1 >>config.settings
-if (%noopt%) == (Y) echo NOOPT=1 >>config.settings
-if (%enablechecking%) == (Y) echo ENABLECHECKS=1 >>config.settings
-if (%profile%) == (Y) echo PROFILE=1 >>config.settings
-if (%nocygwin%) == (Y) echo NOCYGWIN=1 >>config.settings
-if not "(%prefix%)" == "()" echo INSTALL_DIR=%prefix% >>config.settings
-if not "(%distfiles%)" == "()" echo DIST_FILES=%distfiles% >>config.settings
+>>config.settings echo COMPILER=%COMPILER%
+if not "(%mf%)" == "()" >>config.settings echo MCPU_FLAG=%mf%
+if not "(%dbginfo%)" == "()" >>config.settings echo DEBUG_INFO=%dbginfo%
+if (%nodebug%) == (Y) >>config.settings echo NODEBUG=1
+if (%noopt%) == (Y) >>config.settings echo NOOPT=1
+if (%enablechecking%) == (Y) >>config.settings echo ENABLECHECKS=1
+if (%profile%) == (Y) >>config.settings echo PROFILE=1
+if (%nocygwin%) == (Y) >>config.settings echo NOCYGWIN=1
+if not "(%prefix%)" == "()" >>config.settings echo INSTALL_DIR=%prefix%
+if not "(%distfiles%)" == "()" >>config.settings echo DIST_FILES=%distfiles%
 rem We go thru docflags because usercflags could be "-DFOO=bar" -something
 rem and the if command cannot cope with this
 for %%v in (%usercflags%) do if not (%%v)==() set docflags=Y
-if (%docflags%)==(Y) echo USER_CFLAGS=%usercflags% >>config.settings
-if (%docflags%)==(Y) echo ESC_USER_CFLAGS=%escusercflags% >>config.settings
+if (%docflags%)==(Y) >>config.settings echo USER_CFLAGS=%usercflags%
+if (%docflags%)==(Y) >>config.settings echo ESC_USER_CFLAGS=%escusercflags%
 for %%v in (%userldflags%) do if not (%%v)==() set doldflags=Y
-if (%doldflags%)==(Y) echo USER_LDFLAGS=%userldflags% >>config.settings
+if (%doldflags%)==(Y) >>config.settings echo USER_LDFLAGS=%userldflags%
 for %%v in (%extrauserlibs%) do if not (%%v)==() set doextralibs=Y
-if (%doextralibs%)==(Y) echo USER_LIBS=%extrauserlibs% >>config.settings
+if (%doextralibs%)==(Y) >>config.settings echo USER_LIBS=%extrauserlibs%
 echo # End of settings from configure.bat>>config.settings
 echo. >>config.settings

Subject: 24.1.50; Can't 'make install' on Windows
From: Kazuhiro Ito <[email-masked]>
To: [email-masked]
Date: Tue, 29 May 2012 23:03:37 +0900
List-Id: <debbugs-submit.debbugs.gnu.org>

When I run configure.bat with --prefix option, 'make install' with
MinGW fails.

> make: Circular D:/bin/emacs_trunk <- D:/bin/emacs_trunk dependency dropped.
> make   -C ../lib-src install
> [Please ignore a syntax error on the next line - it is intentional]
> /bin/sh: -c: line 0: unexpected EOF while looking for matching `"'
> /bin/sh: -c: line 1: syntax error: unexpected end of file
> make[1]: Entering directory `/f/build/emacs-trunk/lib-src'
> mkdir "D:/bin/emacs_trunk /bin"
> mkdir: cannot create directory `D:/bin/emacs_trunk /bin': No such file or directory
> make[1]: [install] Error 1 (ignored)
> cp -f oo-spd/i386/etags.exe D:/bin/emacs_trunk /bin
> cp: omitting directory `D:/bin/emacs_trunk'
> make[1]: *** [install] Error 1
> make[1]: Leaving directory `/f/build/emacs-trunk/lib-src'
> make: *** [install-other-dirs-gmake] Error 2

In the above, 'D:/bin/emacs_trunk' is argument of --prefix option.  It
seems that makefile.w32-in does not assume INSTALL_DIR has trailing
space.

-- 
Kazuhiro Ito