From ripley at stats.ox.ac.uk  Fri Mar 21 18:55:15 2008
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Fri, 21 Mar 2008 17:55:15 +0000 (GMT)
Subject: [Rd] Problem with Makefile.win and environment variable
In-Reply-To: <47E3F337.4030105@aon.at>
References: <47E3BC66.5070906@aon.at>
	<alpine.LFD.1.00.0803211412350.14566@gannet.stats.ox.ac.uk>
	<47E3DE3F.7040307@aon.at>
	<alpine.LFD.1.00.0803211615130.32302@gannet.stats.ox.ac.uk>
	<47E3F337.4030105@aon.at>
Message-ID: <alpine.LFD.1.00.0803211743400.10761@gannet.stats.ox.ac.uk>

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
>
> 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:
>>> cl /Ic:\root/include /MT /EHsc /Ox /D "MSVC" /D "WIN32" /c TMLMath.cxx
>> 
>> 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
>>> 
>>> 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:
>>>> On Fri, 21 Mar 2008, cstrato wrote:
>>>> 
>>>>> 
>>>>> 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?
>>>> 
>>>> 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.
>>>> 
>>>> 
>>> 
>> 
>

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



[Rd] Problem with Makefile.win and environment variable
Prof Brian Ripley