我正在尝试调试我正在开发的包。 我使用 makefile 来构建、检查和安装软件包。 这些软件包是一个 Rcpp 软件包,因此其中已经有一个 makevars 和 makevars.win 文件。 我正在寻找的是仅针对特定的 make 规则更改 CXXFLAGS 。 然后
make debug
将与 R CMD INSTALL
一起运行 CXXFLAGS= -Wall -pedantic -g -O0"
,但常规 make install
将与 CXXFLAGS=-O3
一起运行,没有任何调试信息。 有没有一种好方法可以动态更改此设置,而无需修改我的包、个人或系统 makevars 文件?
我不这么认为,因为只有一个
CXXFLAGS
可以走动。 但是您可以在不同的“make”与“make debug”目标部分中再次重新分配。
您可以只保留两个版本
~/.R/Makevars.normal
amd ~/R/Makevars.debug
并使用脚本来翻转它们之间的链接...
物有所值。我只是编辑
~/.R/Makevars
并注释/取消注释不同的行。
编辑:基于您发布的
Makefile
,这样的事情怎么样:
install: $(PKG_NAME)_$(PKG_VERSION).tar.gz
CXXFLAGS+="-O3" R CMD INSTALL $(PKG_NAME)_$(PKG_VERSION).tar.gz
debuginstall: $(PKG_NAME)_$(PKG_VERSION).tar.gz
CXXFLAGS+="-Wall -g -O0" R CMD INSTALL $(PKG_NAME)_$(PKG_VERSION).tar.gz
编辑2:我刚刚玩过这个,它有效:
PKG_NAME=digest
PKG_VERSION=0.5.1
install: $(PKG_NAME)_$(PKG_VERSION).tar.gz
PKG_CFLAGS="-O6" R CMD INSTALL $(PKG_NAME)_$(PKG_VERSION).tar.gz
debuginstall: $(PKG_NAME)_$(PKG_VERSION).tar.gz
PKG_CFLAGS="-Wall -g -O0" R CMD INSTALL $(PKG_NAME)_$(PKG_VERSION).tar.gz
它still随后读取我的
~/.R/Makevars
,因此无法在此处设置某些变量。 但是您可以在 MYDEBUG=...
中设置 Makefile
,然后在 ~/.R/Makevars
中的定义中使用它。
包的
-O
文件中的任何 Makevars
标志都将被 R 的 -O2
文件中的 Makeconf
覆盖,因为 GCC 只会尊重编译命令中的最后一个 -O
标志。如果软件包分发到其他平台,Dirk 设置 ~/.R/Makevars
文件的答案将不起作用,除非您可以告诉每个使用您的软件包的人创建或修改他们的 ~/.R/Makevars
。
因为
-O3
是 -O2
+ 一些其他标志,所以你可以将你的包的 Makevars
写成如下:
PKG_CXXFLAGS += -fgcse-after-reload \
-fipa-cp-clone \
-floop-interchange \
-floop-unroll-and-jam \
-fpeel-loops \
-fpredictive-commoning \
-fsplit-loops \
-fsplit-paths \
-ftree-loop-distribution \
-ftree-partial-pre \
-funswitch-loops \
-fvect-cost-model=dynamic \
-fversion-loops-for-strides
即使背面有 -O2
,这些标志(请参阅 GCC 手册
https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html)也会受到尊重。
根据我多年来在不同平台上的科学计算中使用这些标志的经验,由于积极的优化产生了更大的二进制文件,
-O3
几乎从未优于-O2
。然而,以下几乎总是生成最快的代码:
PKG_CXXFLAGS += -march=native -ffast-math
请注意,
-ffast-math
(https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-ffast-math)应谨慎使用。