Skip to content

Problem with Makefile.win and environment variable

7 messages · cstrato, Brian Ripley

#
Dear all,

When porting my package to WinXP I have the following problem:
I need to create an environment variable "MYVAR=c:\mypath" which I have 
saved in the control panel "System->My Computer" (under the `Advanced' tab).

I have two files which need to access MYVAR: config.win, Makefile.win

While "config.win" does recognize MYVAR correctly, "Makefile.win" is not 
able to recognize MYVAR, when I do:
"R CMD INSTALL mypkg".
I need to add the line "MYVAR=C:\\mypath" to "Makefile.win" for "R CMD 
INSTALL" to work.

Interestingly, when I "cd ./src" and call from the DOS command line:
"NMAKE /f "Makefile.win" CFG="Release"
then "Makefile.win" does recognize MYVAR correctly.

Do you know what I need to do so that "Makefile.win" recognizes MYVAR?

P.S.: If you think that this is the wrong mailing list for these type of 
questions please let me know which mailinglist I should contact.

Best regards
Christian
_._._._._._._._._._._._._._._._
C.h.i.s.t.i.a.n S.t.r.a.t.o.w.a
V.i.e.n.n.a       A.u.s.t.r.i.a
_._._._._._._._._._._._._._._._
#
On Fri, 21 Mar 2008, cstrato wrote:

            
Well, how are you asking it to recognize it?  (We do expect you to provide 
enough details to avoid such questions.)  $(MYVAR) is a make variable, and 
${MYVAR} is an environment variable.  Quite possibly

MYVAR=${MYVAR}

is all you need to add.

BTW, there are dozens of examples in the packages on CRAN -- RGtk2 is one.
And we strongly discourage the use of Makefile.win: Makevars.win suffices 
for all but expert developers.
#
Dear Prof. Ripley

Thank you for your fast reply and sorry for being not specific enough.

My problem is that I need to use MS VC++ for the WinXP port of my 
package (xps at BioC):

Here is my concrete problem and what I did:
- installed MS Visual Studio Express 2008
- installed binary of ROOT framework compiled with VC++ (thus the need 
for VC++)
- set ROOT environment variable: ROOTSYS=C:\root  (the default install dir)
- installed Rtools
- installed binary of R-2.6.2
- created Makefile.win for VC++ which compiles my source code and 
includes ROOT libraries
- created config.win to check for presence of VC++, ROOT, ROOTSYS

Everything works fine, I can install my package on WinXP as long as 
"Makefile.win" contains the line "ROOTSYS=C:\\root"

When I follow your suggestion "ROOTSYS=${ROOTSYS}" (which I tried 
already before) I get the following error:
  running src/Makefile.win ...
Makefile.win:64: *** Recursive variable `ROOTSYS' references itself 
(eventually).  Stop.
make[2]: *** [srcDynlib] Error 2
make[1]: *** [all] Error 2

When I try "ROOTSYSX=${ROOTSYS}" I get the usual error:
  running src/Makefile.win ...
cl /Ic:\root/include /MT /EHsc /Ox /D "MSVC" /D "WIN32" /c TMLMath.cxx
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 
for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.
TMLMath.cxx
TMLMath.cxx(51) : fatal error C1083: Cannot open include file: 
'TMath.h': No such file or
directory
make[3]: *** [TMLMath.obj] Error 2
make[2]: *** [srcDynlib] Error 2
make[1]: *** [all] Error 2

As you see, everything works but this final problem.
I have checked the examples in  a couple of R packages, e.g. ROracle 
which also reqires VC++, but I could not find any solution to this last 
problem.
Do you have some other ideas which I could test?

Thank you.
Best regards
Christian
_._._._._._._._._._._._._._._._
C.h.i.s.t.i.a.n S.t.r.a.t.o.w.a
V.i.e.n.n.a       A.u.s.t.r.i.a
_._._._._._._._._._._._._._._._
Prof Brian Ripley wrote:
#
will AFAIK not work when passed to the shell used (which is ash), and in 
any case will not work for paths with spaces in.

You still haven't shown us the Makefile.win, but probably you need

cl /I"${ROOTSYS}/include" /MT /EHsc /Ox /D MSVC /D WIN32 /c TMLMath.cxx
On Fri, 21 Mar 2008, cstrato wrote:

            

  
    
#
Dear Prof. Ripley

Here is the Makefile.win, which contains already your suggestion for 
spaces (thank you), but contains only 3 of 14 header files:

#------------------------------------------------------------------------------

ROOTSYS       = C:\\root
#ROOTSYS       = ${ROOTSYS}

LDOPT         = -opt:noref
LDFLAGS       = $(LDOPT) $(conlflags) -nologo 
-include:_G__cpp_setupG__Hist \
                -include:_G__cpp_setupG__Graf1 
-include:_G__cpp_setupG__G3D \
                -include:_G__cpp_setupG__GPad 
-include:_G__cpp_setupG__Tree \
                -include:_G__cpp_setupG__Rint 
-include:_G__cpp_setupG__PostScript \
                -include:_G__cpp_setupG__Matrix 
-include:_G__cpp_setupG__Physics
SOFLAGS       = $(dlllflags:-pdb:none=)
ROOTLIBS      = "$(ROOTSYS)/lib/libCore.lib" \
                "$(ROOTSYS)/lib/libCint.lib" "$(ROOTSYS)/lib/libHist.lib" \
                "$(ROOTSYS)/lib/libGraf.lib" 
"$(ROOTSYS)/lib/libGraf3d.lib" \
                "$(ROOTSYS)/lib/libGpad.lib" "$(ROOTSYS)/lib/libTree.lib" \
                "$(ROOTSYS)/lib/libRint.lib" 
"$(ROOTSYS)/lib/libPostscript.lib" \
                "$(ROOTSYS)/lib/libMatrix.lib" 
"$(ROOTSYS)/lib/libPhysics.lib" \
                "$(ROOTSYS)/lib/libNet.lib" "$(ROOTSYS)/lib/libRIO.lib"
LIBS          = $(ROOTLIBS)
GLIBS         = $(LIBS) "$(ROOTSYS)/lib/libGui.lib" 
"$(ROOTSYS)/lib/libGraf.lib" \
                "$(ROOTSYS)/lib/libGpad.lib"
LIBSALL       = $(ROOTLIBS)

#------------------------------------------------------------------------------

MYHDR       = TMLMath.h TStat.h StatUtils.h
MYSRC       = TMLMath.cxx TStat.cxx StatUtils.cxx
MYOBJ       = TMLMath.obj TStat.obj StatUtils.obj xpsDict.obj

xps.dll:  $(MYOBJ)
    link /dll /def:xps.def /out:xps.dll fp10.obj $(SOFLAGS) $(LDFLAGS) 
$(GLIBS) *.obj
   
TMLMath.obj: TMLMath.h TMLMath.cxx
    cl /I"$(ROOTSYS)/include" /MT /EHsc /Ox /D "MSVC" /D "WIN32" /c 
TMLMath.cxx

TStat.obj: TStat.h TStat.cxx
    cl /I"$(ROOTSYS)/include" /MT /EHsc /Ox /D "MSVC" /D "WIN32" /c 
TStat.cxx
   
StatUtils.obj: StatUtils.h StatUtils.cxx
    cl /I"$(ROOTSYS)/include" /MT /EHsc /Ox /D "MSVC" /D "WIN32" /c 
StatUtils.cxx
   
xpsDict.cxx: $(MYHDR) xpsLinkDef.h
    @echo "Generating dictionary $@..."
    @rootcint -f $@ -c $(MYHDR) xpsLinkDef.h
   
xpsDict.obj: xpsDict.cxx xpsDict.h
    cl /I"$(ROOTSYS)/include" /MT /EHsc /Ox /D "MSVC" /D "WIN32" /c 
xpsDict.cxx

clean:
    rm -f $(MYOBJ) *.a *.d *.rc

clobber:
    rm -f $(RLIB) $(MYOBJ) *.a *.d *.rc *.dll
#------------------------------------------------------------------------------

Uncommenting "ROOTSYS = ${ROOTSYS}" results still in the self-reference 
error, but it works definitely with "ROOTSYS = C:\\root".

I forgot to mention that I use the DOS command shell on WinXP to run "R 
CMD INSTALL".
Could this be the problem?

Thank you.
Best regards
Christian
_._._._._._._._._._._._._._._._
C.h.i.s.t.i.a.n S.t.r.a.t.o.w.a
V.i.e.n.n.a       A.u.s.t.r.i.a
_._._._._._._._._._._._._._._._
Prof Brian Ripley wrote:
#
You have $(ROOTSYS), not ${ROOTSYS} as I had.

Also, the output you show is missing the quotes, which is unlikely if this 
was the Makefile.win version used.

To summarize:

1) Use ${ROOTSYS} (with braces).
2) Either use forward slashes and no spaces or ensure the path is quoted 
in the cl call.

The error from the example you showed is the second.

The shell you use to can  Rcmd INSTALL is not relevant: our software 
ensures that a POSIX shell is used for the make.  (This is quite different 
from nmake.)
On Fri, 21 Mar 2008, cstrato wrote:

            

  
    
#
Dear Prof. Ripley
Prof Brian Ripley wrote:
Thank you very much, changing the braces did the trick, now everything 
works!
This is correct, since I did add the quote only after receiving your 
mail suggesting this correction.
Thank you once again and "Happy Eastern"
Best regards
Christian