R Makevars文件覆盖R CMD的默认g ++选项?

时间:2014-05-01 18:51:36

标签: c++ r makefile g++

我有这个独立的C ++代码 我正试图用R包裹 包。

我的问题是我绝对 希望它用。编译  -O3标志。

所以在src/Makevars文件中 我说:

PKG_CPPFLAGS = -I../inst/include
PKG_CXXFLAGS = -O3  
CXX_STD = CXX11

仍然在我安装我的包裹时 机器,我明白了:

g++ -std=c++0x -I/usr/share/R/include -DNDEBUG -I../inst/include -O3  -fpic  -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -D_FORTIFY_SOURCE=2 -g -c mycppfunctions.cpp -o mycppfunctions.o
g++ -std=c++0x -shared -Wl,-Bsymbolic-functions -Wl,-z,relro -o mycppfunctions.so mycppfunctions.o -L/usr/lib/R/lib -lR

(可怕的-O2标志显示在右侧

所以我的问题是:如何覆盖 g++调用R CMD时使用的cpp标志?

编辑:

最近,在另一个包中,我找到了一种方法 类似于F77代码的东西(也在R包中)。 基本上,将其添加到Makevars

PKG_FFLAGS = $(FPICFLAGS) $(SHLIB_FFLAGS) 
all: $(SHLIB)
otherf77foo.o: otherf77foo.f
    $(F77) $(PGK_FFLAGS) -O3 -pipe -g -c -o otherf77foo.o otherf77foo.f

但我不知道如何为cpp代码做同样的事情......

EDIT2:

所以,这样做是完全可能的。 Dirk Eddelbuettel在下面的回答中提问'b)' 引导我到解决方案。所以,我所要做的就是 将其放在src/Makevars文件中:

mycppfoo.o: mycppfoo.cpp
    g++ -std=c++0x -I/usr/share/R/include -DNDEBUG -I../inst/include -fpic  -g -O3 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -D_FORTIFY_SOURCE=2 -g -c mycppfoo.cpp -o mycppfoo.o
    g++ -std=c++0x -shared -Wl,-Bsymbolic-functions -Wl,-z,relro -o mycppfoo.so mycppfoo.o -L/usr/lib/R/lib -lR

我的问题解决了!

2 个答案:

答案 0 :(得分:17)

你不能(根据Simon Urbanek关于r-devel的评论一段时间)。

但是,AFAIK最重要的价值胜出并不重要。并且R将其值放在左侧,并允许您添加您的值(例如,通过CXX_FLAGS,例如~/.R/MakevarsPKG_CXXFLAGS从您的包中的src/Makevars到正确的。

所以只需覆盖-O3即可-O3

对于它的价值,我在~/.R/Makevars中的当前值是:

CFLAGS +=              -O3 -Wall -pipe -pedantic -std=gnu99
CXXFLAGS +=            -O3 -Wall -pipe -Wno-unused -pedantic

你当然可以输入-mnative或你的特定CPU标识符。

最后,如果你真的想要你可以编辑/etc/R/Makeconf,但你必须这样做 每次升级R包后。正如我在这里所说的那样,你不需要,因为这里建议的方案应该有用。

编辑:回复您的修改:

a)关于r-devel的明确建议(请检查档案)是你应该避免使用Makefile逻辑。 IIRC在Writing R Extension手册中得到了回应。

b)您声明了从.o(源)文件构建.f(对象)文件的规则。您是否尝试使用cpp而不是f?

最后,如果您的文件是使用-O2而不是-O3构建的,那么您还没有准确解释为什么世界即将结束。您应该理解,作为源的作者,您无法完全控制人们将构建您的包的哪些编译器选项(更不用说编译器版本)。

答案 1 :(得分:4)

newedit:好吧,我是个傻瓜。它解决了Rcpp(我不在乎)的问题,但它对我关心的github.com/ohdsi/cyclops.git包不起作用。那个仍然被-O2卡在最右边。这是荒唐的。对命令行参数的控制可能是整个操作中最重要的一部分。 R需要一个更好的构建系统。

编辑:当然,经过几天的麻烦,我发布后就知道了。我的问题是我使用的是CXX_STD = CXX11标志。显然,使用此标记您需要使用CXX11FLAGS += ...。因此,如果您的Makevars文件包含CXX11FLAGS += -O0 -Wall,如果您正在使用C ++ 11,它将正确地将其放在-O2标记的右侧。

无论我做什么,我都不能让-O0出现在右边。我的~/.R/Makevars

中有以下内容
CFLAGS +=       -O0 -Wall
CXXFLAGS +=     -O0 -Wall
CPPFLAGS +=     -O0 -Wall

PKG_CFLAGS +=       -O0 -Wall
PKG_CXXFLAGS +=     -O0 -Wall
PKG_CPPFLAGS +=     -O0 -Wall

我已经从源代码安装Rcpp(作为测试...我对它没有直接感兴趣)

install.packages(getwd(), repos = NULL, type = "source")

并且确实正确使用了-O0

使用我当前的配置,我最终得到三个不同的-O0'在左边,最后-O2在右边。还有其他人遇到过这个问题吗?

我安装的软件位于github.com/ohdsi/cyclops.git,但我不确定哪些重要。