From hb at biostat.ucsf.edu  Thu Jan  9 03:47:25 2014
From: hb at biostat.ucsf.edu (Henrik Bengtsson)
Date: Wed, 8 Jan 2014 18:47:25 -0800
Subject: [Rd] Building R on Windows: mkdir of Rtools creates directories
 with read-only permissions [WEIRD]
Message-ID: <CAFDcVCQbRXFGJz19M4=7NSU0uYLYDA0Yrn=Endjgn=LtGM35aw@mail.gmail.com>

This is is an issue that bugged me for a while.  I encountered a year
ago (April 2012) when I first tried to build R from source on Windows.
 I never figured out what the solution is or if I'm doing something
wrong myself (but I have found a tedious workaround).  I'm still on
the same Windows 7 Ultimate machine with NTFS, but I now made sure I
started from scratch so I have a completely fresh setup (see details
at the end).

PROBLEM:
At the very first step I do:

C:\R\src\gnuwin32>make all
[... Waiting. No errors until ...]
cp R.dll ../../bin/i386
-------- Building ../../../bin/i386/Rblas.dll --------
gcc -std=gnu99  -shared  -o ../../../bin/i386/Rblas.dll blas.o
cmplxblas.o ../../gnuwin32/dllversion.o Rblas.def -L../../../bin/i386
-lR -lgfortran
c:/rtools/gcc-4.6.3/bin/../lib/gcc/i686-w64-mingw32/4.6.3/../../../../i686-w64-mingw32/bin/ld.exe:
cannot find -lR
collect2: ld returned 1 exit status
make[2]: *** [../../../bin/i386/Rblas.dll] Error 1
make[1]: *** [Rblas] Error 2
make: *** [rbuild] Error 2

However:

C:\R\src\gnuwin32>dir ..\..\bin\i386\
 Volume in drive C is Windows7_OS
 Volume Serial Number is E038-51CC

 Directory of C:\R\bin\i386

01/08/2014  06:18 PM    <DIR>          .
01/08/2014  06:18 PM    <DIR>          ..
01/08/2014  06:18 PM         3,059,712 R.dll
01/08/2014  06:18 PM           348,995 Rgraphapp.dll
01/08/2014  06:18 PM           102,975 Riconv.dll
01/08/2014  06:18 PM           154,917 Rzlib.dll
               4 File(s)      3,666,599 bytes
               2 Dir(s)  22,424,739,840 bytes free

What's weird is that these files have **read permission disabled**:

C:\R\src\gnuwin32>file ..\..\bin\i386\*.dll
..\..\bin\i386\R.dll:         writable, executable, regular file, no
read permission
..\..\bin\i386\Rgraphapp.dll: writable, executable, regular file, no
read permission
..\..\bin\i386\Riconv.dll:    writable, executable, regular file, no
read permission
..\..\bin\i386\Rzlib.dll:     writable, executable, regular file, no
read permission

What is going on?  Have anyone else seen this?  I've also tried
running as Administrator - no difference.



TROUBLESHOOTING / WORKAROUND:
It appears that 'mkdir' (of Rtools) causes this problem, because if I
manually pre-create 'C:\R\src\gnuwin32\bin\i386' using Windows' mkdir
it works, e.g.

C:\R\src\gnuwin32>rm -fR ..\..\bin\
C:\R\src\gnuwin32>cmd /C mkdir ..\..\bin\i386
C:\R\src\gnuwin32>make rbuild
[...]
-------- Building ../../../bin/i386/Rblas.dll --------
gcc -std=gnu99  -shared  -o ../../../bin/i386/Rblas.dll blas.o
cmplxblas.o ../../gnuwin32/dllversion.o Rblas.def -L../../../bin/i386
-lR -lgfortran
make --no-print-directory -C front-ends
mkdir -p ../../../bin/i386
cp Rgui.exe ../../../bin/i386/Rgui.exe
mkdir -p ../../../bin/i386
cp Rterm.exe ../../../bin/i386/Rterm.exe
mkdir -p ../../../bin/i386
cp Rcmd.exe ../../../bin/i386/Rcmd.exe
mkdir -p ../../../bin/i386
cp RSetReg.exe ../../../bin/i386/RSetReg.exe
mkdir -p ../../../bin/i386
cp R.exe ../../../bin/i386/R.exe
mkdir -p ../../../bin/i386
cp Rscript.exe ../../../bin/i386/Rscript.exe
mkdir -p ../../../bin/i386
cp open.exe ../../../bin/i386/open.exe
mkdir -p ../../../bin
cp Rfe.exe ../../../bin/R.exe
mkdir -p ../../../bin
cp Rfe.exe ../../../bin/Rscript.exe
make[1]: `COPYRIGHTS' is up to date.
make --no-print-directory -C ../modules -f Makefile.win \
  CFLAGS='-O3 -Wall -pedantic -mtune=core2' FFLAGS='-O3 -mtune=core2'
gcc -std=gnu99  -shared -s -o ../../../bin/i386/Rlapack.dll dlamch.o
dlapack.o cmplx.o init_win.o Rlapackrc.o -L../../../bin/i386 -lR
-lRblas -lgfortran
cp lapack.dll ../../../modules/i386/lapack.dll

and there is (obviously) read permissions on those files:

C:\R\src\gnuwin32>file ..\..\bin\i386\*.dll
..\..\bin\i386\R.dll:         PE32 executable for MS Windows (DLL)
(GUI) Intel 80386 32-bit
..\..\bin\i386\Rblas.dll:     PE32 executable for MS Windows (DLL)
(console) Intel 80386 32-bit
..\..\bin\i386\Rgraphapp.dll: PE32 executable for MS Windows (DLL)
(GUI) Intel 80386 32-bit
..\..\bin\i386\Riconv.dll:    PE32 executable for MS Windows (DLL)
(console) Intel 80386 32-bit
..\..\bin\i386\Rlapack.dll:   PE32 executable for MS Windows (DLL)
(console) Intel 80386 32-bit
..\..\bin\i386\Rzlib.dll:     PE32 executable for MS Windows (DLL)
(console) Intel 80386 32-bit

Pre-creating the proper directories is tedious and only works up to
the point of 'make distribution', where I haven't found a similar
workaround (without modifying the Makefiles).  Note, I can get to the
point where I have build and check everything (including recommended
packages).


Just to convince you that mkdir is the problem, I can reproduce the
problem from this point, by removing the bin/ directory again and
relying on Rtools mkdir again;

C:\R\src\gnuwin32>rm -fR ..\..\bin
C:\R\src\gnuwin32>make rbuild
make[3]: Nothing to be done for `svnonly'.
installing C headers
make[1]: `libRblas.dll.a' is up to date.
make[4]: Nothing to be done for `svnonly'.
installing C headers
make --no-print-directory -C ../extra/intl CFLAGS='-O3 -Wall -pedantic
-mtune=core2' -f Makefile.win
make --no-print-directory -C ../appl CFLAGS='-O3 -Wall -pedantic
-mtune=core2' FFLAGS='-O3 -mtune=core2' -f Makefile.win
make --no-print-directory -C ../nmath CFLAGS='-O3 -Wall -pedantic
-mtune=core2' FFLAGS='-O3 -mtune=core2' -f Makefile.win
make --no-print-directory -C ../main CFLAGS='-O3 -Wall -pedantic
-mtune=core2' FFLAGS='-O3 -mtune=core2' malloc-DEFS='-DLEA_MALLOC' -f
Makefile.win
make --no-print-directory -C ./getline CFLAGS='-O3 -Wall -pedantic -mtune=core2'

make[3]: `gl.a' is up to date.
make -f Makefile.win makeMakedeps
make -f Makefile.win libpcre.a
make[4]: `libpcre.a' is up to date.
make[3]: Nothing to be done for `all'.
make -f Makefile.win makeMakedeps
make -f Makefile.win libtre.a
make[4]: `libtre.a' is up to date.
make[3]: Nothing to be done for `all'.
make[4]: `stamp' is up to date.
make[4]: `liblzma.a' is up to date.
make[2]: `R.dll' is up to date.
cp R.dll ../../bin/i386
-------- Building ../../../bin/i386/Rblas.dll --------
gcc -std=gnu99  -shared  -o ../../../bin/i386/Rblas.dll blas.o
cmplxblas.o ../../gnuwin32/dllversion.o Rblas.def -L../../../bin/i386
-lR -lgfortran
c:/rtools/gcc-4.6.3/bin/../lib/gcc/i686-w64-mingw32/4.6.3/../../../../i686-w64-mingw32/bin/ld.exe:
cannot find -lR
collect2: ld returned 1 exit status
make[2]: *** [../../../bin/i386/Rblas.dll] Error 1
make[1]: *** [Rblas] Error 2
make: *** [rbuild] Error 2


MORE TROUBLESHOOTING:
The MD5 checksum when it fails (reproducible):
C:\R\src\gnuwin32>md5sum ../../bin/i386/*.dll
75b2e64d3847e768631681922df5a81d *../../bin/i386/R.dll
12a35b63a28ad0e0fee8cae04f76e907 *../../bin/i386/Rgraphapp.dll
e2c40ae15d13dc17af33c1367f78817d *../../bin/i386/Riconv.dll
c5ea5a5cd2b7d3c07970f5314ce7296a *../../bin/i386/Rzlib.dll

The MD5 checksum when it works (reproducible):
C:\R\src\gnuwin32>md5sum ../../bin/i386/*.dll
75b2e64d3847e768631681922df5a81d *../../bin/i386/R.dll
12a35b63a28ad0e0fee8cae04f76e907 *../../bin/i386/Rgraphapp.dll
e2c40ae15d13dc17af33c1367f78817d *../../bin/i386/Riconv.dll
c5ea5a5cd2b7d3c07970f5314ce7296a *../../bin/i386/Rzlib.dll
+
c81b3399027ec9c24ca80ba92199327c *../../bin/i386/Rblas.dll
20d32cee2e561d1826af1a538844472b *../../bin/i386/Rlapack.dll


Thanks for any help,

Henrik


SETUP:
1. Downloaded/svn checkout the R source to C:\R\.
2. Installed most recent Rtools to C:\Rtools (completely removed previously)
(3. Modifying the MkRules.* files has no impact for reproducing this
problem.  Same with 'make rsync-recommended')

C:\R\src\gnuwin32>path
PATH=;C:\Rtools\bin;C:\Rtools\gcc-4.6.3\bin;C:\Windows;C:\Windows\system32

C:\R\src\gnuwin32>cat C:\Rtools\VERSION.txt
Rtools version 3.1.0.1939

C:\R\src\gnuwin32>ls ../..
COPYING      Makefile.fw  VERSION       configure.ac  po     tmp
ChangeLog    Makefile.in  VERSION-NICK  doc           share  tools
INSTALL      README       config.site   etc           src
Makeconf.in  Tcl          configure     m4            tests



[Rd] Building R on Windows: mkdir of Rtools creates directories with read-only permissions [WEIRD]
Henrik Bengtsson