From cstrato at aon.at  Fri Mar 21 19:14:32 2008
From: cstrato at aon.at (cstrato)
Date: Fri, 21 Mar 2008 19:14:32 +0100
Subject: [Rd] Problem with Makefile.win and environment variable
In-Reply-To: <alpine.LFD.1.00.0803211743400.10761@gannet.stats.ox.ac.uk>
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>
	<alpine.LFD.1.00.0803211743400.10761@gannet.stats.ox.ac.uk>
Message-ID: <47E3FB08.2040106@aon.at>

Dear Prof. Ripley

Prof Brian Ripley wrote:
> You have $(ROOTSYS), not ${ROOTSYS} as I had.
Thank you very much, changing the braces did the trick, now everything 
works!
>
> Also, the output you show is missing the quotes, which is unlikely if 
> this was the Makefile.win version used.
This is correct, since I did add the quote only after receiving your 
mail suggesting this correction.
>
> 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.)
>
>
Thank you once again and "Happy Eastern"
Best regards
Christian
>
> 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.
>>>>>
>>>>>
>>>>
>>>
>>
>



[Rd] Problem with Makefile.win and environment variable
cstrato