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 _._._._._._._._._._._._._._._._
Problem with Makefile.win and environment variable
7 messages · cstrato, Brian Ripley
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
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.
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
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.
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
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.