From ripley at stats.ox.ac.uk  Fri Apr 18 19:41:36 2008
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Fri, 18 Apr 2008 18:41:36 +0100 (BST)
Subject: [Rd] problem customizing CXXFLAGS in Windows
In-Reply-To: <16763558.post@talk.nabble.com>
References: <16763558.post@talk.nabble.com>
Message-ID: <alpine.LFD.1.10.0804181821460.17970@gannet.stats.ox.ac.uk>

On Fri, 18 Apr 2008, Ian Fiske wrote:

> Hi all,
>
> I am running R 2.6.2 in Windows XP with Rtools 2.7 and am trying to compile
> a shared library in Windows with customized level of optimization.
> Specifically, I would like to have "-O3 -funroll-loops" as flags when I run
> "R CMD SHLIB ***.cc" to speed the program for my simulations.
>
> I have read through the documentation and have tried adding the line
>
> PKG_CXXFLAGS = -O3 -funroll-loops
>
> in my Makevars in my package's src directory.  However, this places the
> flags before the -O2 flag, thereby overriding it.

I presume you meant the opposite -- 'it' refers to its immediate 
antecdent, 'the -O2 flag', which overrides not is overridden?  That is, 
the flags are processed from left to right and later settings win.

> I have also tried creating a config.site file in R_HOME/etc, but that 
> seems to be ignored.

What gave you the idea that would be relevant?  I don't see it in any of 
the manuals.

> I found a possible solution at
> http://tolstoy.newcastle.edu.au/R/e2/devel/07/03/2520.html.  However, when I
> use this suggestion, I get errors that R.h cannot be found.
>
> Please note that I do not plan to submit this package to CRAN or to other
> users with the modified flags, but I just need to set them on my machine to
> speed up simulations for testing, etc.

>From the R-admin manual:

'Package-specific compilation flags can be overridden or added to using 
the personal file $HOME/.R/Makevars.win, or if that does not exist, 
$HOME/.R/Makevars. (See the rw-FAQ for the meaning of $HOME.) For the 
record, the order of precedence is (last wins)

     * MakeDll and MkRules
     * src/Makevars.win if it exists, otherwise src/Makevars
     * $HOME/.R/Makevars.win if it exists, otherwise $HOME/.R/Makevars.
     * src/Makefile.win if present causes all but the last of the above to
       be ignored.
'


So you can set CXXFLAGS in src/Makevars.win and that will override the 
system's values.  Or you could change the system setting to -O3 in
MakeDll -- it is -O3 for C and Fortran, but -O2 for C++ (which R itself 
does not use) because -O3 for C++ used to be problematic (with gcc 3.4.5, 
not the current version).

I think the URL you give is too old -- it probably preceeds the corrected 
separation of CPPFLAGS and C[XX]FLAGS.  The rule is (from MkRules)

.cc.o:
         $(CXX) $(CPPFLAGS) $($*-CPPFLAGS) $(CXXFLAGS) $($*-CXXFLAGS) -c $< 
-o $@

and so CPPFLAGS should contain include paths, and CXXFLAGS optimization 
levels.

I've just taken a C++-using package and added

CXXFLAGS=-O3 -funroll-loops

to its Makevars.  All the headers were found, and that was the 
optimization level used.


> I appreciate any suggestions,
> Ian

-- 
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 customizing CXXFLAGS in Windows
Prof Brian Ripley