【问题标题】:Build rocksdb static library inside R package在 R 包中构建 RocksDB 静态库
【发布时间】:2019-09-29 15:20:09
【问题描述】:

我尝试在 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 .

但是我可以直接在rocksdb源码目录下成功运行make

cd src/rocksdb/
make static_lib

如何在 R 包安装期间修复 src/Makevars 以构建 rocksdb

链接:

【问题讨论】:

  • 我没有时间详细研究这个,但粗略的笔画看起来是正确的。几个包的作用是将所需静态库的创建 分配给configure 脚本,然后依赖它。其他包有时也只是从src/Makevars 调用帮助脚本。现在更多的是关于 R 构建系统的争论......

标签: r makefile rcpp rocksdb


【解决方案1】:

不是一个完整的答案,而是一个观察(目前):

我试图在 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

【讨论】:

  • 感谢您的回答。我认为我们可以省略除 -fpic 之外的所有 R 标志。
  • 这个标志定义在/usr/local/lib/R/etc/Makeconf.
  • 还在src/rosckdb/Makefile 中添加了-Werror 标志(第350-352 行)。
  • @ArtemKlevtsov ACK,并且没有标志 rockdb 在 R 包之外构建良好,但从 Makevars 构建时仍然存在错误。正如 Dirk 所暗示的那样,我会在 configure 脚本中构建库(可能在检查它尚未安装之后)。有关示例,请参见 nloptr 包。
【解决方案2】:

为了解决这个问题,我们应该重置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)

【讨论】:

    猜你喜欢
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    相关资源
    最近更新 更多