在 R 包中构建 rocksdb 静态库
Build rocksdb static library inside R package
我尝试使用 R 包中的 rocksdb。我使用了以下 src/Makevars
:
CXX_STD = CXX11
PKG_CPPFLAGS = -I./rocksdb/include/
PKG_LIBS = rocksdb/librocksdb.a -lbz2 -lz -lzstd -llz4 -lsnappy
$(SHLIB): rocksdb/librocksdb.a
rocksdb/librocksdb.a: rocksdb/Makefile
CFLAGS="$(CFLAGS) $(CPICFLAGS)" AR="$(AR)" RANLIB="$(RANLIB)" LDFLAGS="$(LDFLAGS)" \
$(MAKE) -d --jobs=3 --directory=rocksdb static_lib
clean:
$(MAKE) --directory=rocksdb clean
包安装失败,出现许多错误(请参阅下面的构建日志)。
您可以使用 Docker 容器重现此案例:
必要命令:
docker run --rm -ti rocker/r-ver:latest bash
在容器中执行:
apt-get update
# install system deps
apt-get install -y libgflags-dev libsnappy-dev zlib1g-dev libbz2-dev liblz4-dev libzstd-dev
apt-get install -y git-core
# install R deps
install2.r Rcpp checkmate R6 tinytest
cd /tmp
git clone https://gitlab.com/artemklevtsov/rocksdb
cd rocksdb/
git submodule init
git submodule update
R CMD INSTALL .
但是我可以成功运行 make
直接在rocksdb源码目录下:
cd src/rocksdb/
make static_lib
如何在 R 包安装期间修复 src/Makevars
以构建 rocksdb
?
链接:
不是完整的答案,而是观察(目前):
我试图在 docker 容器中复制它。 R 包构建失败,但在使用与 R 相同的标志但没有并行作业和 make
的调试输出时也是普通构建:
root@e8749c4bca63:/tmp/rocksdb/src# CFLAGS="-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -fpic" AR="ar" RANLIB="ranlib" LDFLAGS="-L/usr/local/lib" \
> make --directory=rocksdb static_lib
[...]
CC util/bloom.o
CC util/build_version.o
util/build_version.cc:5:42: error: macro "__DATE__" might prevent reproducible builds [-Werror=date-time]
const char* rocksdb_build_compile_date = __DATE__;
^~~~~~~~
cc1plus: all warnings being treated as errors
Makefile:2029: recipe for target 'util/build_version.o' failed
make: *** [util/build_version.o] Error 1
make: Leaving directory '/tmp/rocksdb/src/rocksdb'
看起来 -Wdate-time
晋升为 -Werror=date-time
。
要解决这个问题,我们应该重置 MAKEFLAGS
变量。所以正确的做法是:
rocksdb/librocksdb.a: rocksdb/Makefile
CFLAGS="$(CCFLAGS) $(CPICFLAGS)" MAKEFLAGS="" \
$(MAKE) -C rocksdb DISABLE_WARNING_AS_ERROR=1 static_lib
MAKEFLAGS
内容:
MAKEFLAGS= -- OBJECTS=RcppExports.o\ backup.o\ checkpoint.o\ db.o\ del.o\ exists.o\ get.o\ keys.o\ list.o\ options.o\ property.o\ put.o\ size.o\ sst.o\ utils.o\ version.o\ wrap.o SHLIB=rocksdb.so SHLIB_LD=$$(SHLIB_CXX11LD) SHLIB_LDFLAGS=$$(SHLIB_CXX11LDFLAGS) CXXPICFLAGS=$$(CXX11PICFLAGS) CXXFLAGS=$$(CXX11FLAGS) CXX=$$(CXX11)\ $$(CXX11STD)
我尝试使用 R 包中的 rocksdb。我使用了以下 src/Makevars
:
CXX_STD = CXX11
PKG_CPPFLAGS = -I./rocksdb/include/
PKG_LIBS = rocksdb/librocksdb.a -lbz2 -lz -lzstd -llz4 -lsnappy
$(SHLIB): rocksdb/librocksdb.a
rocksdb/librocksdb.a: rocksdb/Makefile
CFLAGS="$(CFLAGS) $(CPICFLAGS)" AR="$(AR)" RANLIB="$(RANLIB)" LDFLAGS="$(LDFLAGS)" \
$(MAKE) -d --jobs=3 --directory=rocksdb static_lib
clean:
$(MAKE) --directory=rocksdb clean
包安装失败,出现许多错误(请参阅下面的构建日志)。
您可以使用 Docker 容器重现此案例:
必要命令:
docker run --rm -ti rocker/r-ver:latest bash
在容器中执行:
apt-get update
# install system deps
apt-get install -y libgflags-dev libsnappy-dev zlib1g-dev libbz2-dev liblz4-dev libzstd-dev
apt-get install -y git-core
# install R deps
install2.r Rcpp checkmate R6 tinytest
cd /tmp
git clone https://gitlab.com/artemklevtsov/rocksdb
cd rocksdb/
git submodule init
git submodule update
R CMD INSTALL .
但是我可以成功运行 make
直接在rocksdb源码目录下:
cd src/rocksdb/
make static_lib
如何在 R 包安装期间修复 src/Makevars
以构建 rocksdb
?
链接:
不是完整的答案,而是观察(目前):
我试图在 docker 容器中复制它。 R 包构建失败,但在使用与 R 相同的标志但没有并行作业和 make
的调试输出时也是普通构建:
root@e8749c4bca63:/tmp/rocksdb/src# CFLAGS="-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -fpic" AR="ar" RANLIB="ranlib" LDFLAGS="-L/usr/local/lib" \
> make --directory=rocksdb static_lib
[...]
CC util/bloom.o
CC util/build_version.o
util/build_version.cc:5:42: error: macro "__DATE__" might prevent reproducible builds [-Werror=date-time]
const char* rocksdb_build_compile_date = __DATE__;
^~~~~~~~
cc1plus: all warnings being treated as errors
Makefile:2029: recipe for target 'util/build_version.o' failed
make: *** [util/build_version.o] Error 1
make: Leaving directory '/tmp/rocksdb/src/rocksdb'
看起来 -Wdate-time
晋升为 -Werror=date-time
。
要解决这个问题,我们应该重置 MAKEFLAGS
变量。所以正确的做法是:
rocksdb/librocksdb.a: rocksdb/Makefile
CFLAGS="$(CCFLAGS) $(CPICFLAGS)" MAKEFLAGS="" \
$(MAKE) -C rocksdb DISABLE_WARNING_AS_ERROR=1 static_lib
MAKEFLAGS
内容:
MAKEFLAGS= -- OBJECTS=RcppExports.o\ backup.o\ checkpoint.o\ db.o\ del.o\ exists.o\ get.o\ keys.o\ list.o\ options.o\ property.o\ put.o\ size.o\ sst.o\ utils.o\ version.o\ wrap.o SHLIB=rocksdb.so SHLIB_LD=$$(SHLIB_CXX11LD) SHLIB_LDFLAGS=$$(SHLIB_CXX11LDFLAGS) CXXPICFLAGS=$$(CXX11PICFLAGS) CXXFLAGS=$$(CXX11FLAGS) CXX=$$(CXX11)\ $$(CXX11STD)