3

从pyrocksdb 上的(稍微)过时的文档中,它说:

“如果您不想调用make install导出以下环境变量:”

$ export CPLUS_INCLUDE_PATH=${CPLUS_INCLUDE_PATH}:`pwd`/include
$ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:`pwd`
$ export LIBRARY_PATH=${LIBRARY_PATH}:`pwd`

但是RocksDB 的安装说明似乎没有提到任何类型的install目标!

从源代码安装 RocksDB 是否有可接受的程序?


我的想法是将include目录的内容从rocksdb目录复制到类似的地方,/usr/local/include然后将librocksdb.solibrocksdb.a文件复制到/usr/local/lib. 这是可接受的方法吗?

注意:导出环境变量的方法对我来说不太可取,因为我在我的主文件夹内的目录中构建了rocksdb——我希望有一个更干净的解决方案(解释你想要的方式)。

4

3 回答 3

3

当前 Makefile中没有install目标。

这打破了编写 Makefile (或几乎所有其他构建系统......)的长期惯例;它应该被认为是一个缺陷。

如果不花很多时间分析我不能确定,但​​安装目标应该是这样的:

prefix=/usr/local
bindir=$(prefix)/bin
# Normally you'd write a macro for this; 'lib' for 32-bit, 'lib64' for 64...
libdir=$(prefix)/lib64
includedir=$(prefix)/include

# Define this to be the directory(s) the headers are installed into.
# This should not include the 'include' element:
#    include/rocksdb/stuff -> rocksdb/stuff
HEADER_DIRS=...

# Define this so all paths are relative to both the $CWD/include directory...
# so include/rocksdb/foo.h -> HEADER_FILES=rocksdb/foo.h
HEADER_FILES=...

.PHONY: install
install: $(TOOLS) $(LIBRARY) $(SHARED) $(MAKEFILES)
     mkdir -p $(DESTDIR)$(bindir)
     mkdir -p $(DESTDIR)$(libdir)
     mkdir -p $(DESTDIR)$(includedir)
     for tool in $(TOOLS); do \
         install -m 755 $$tool $(DESTDIR)$(bindir); \
     done
     # No, libraries should NOT be executable on Linux.
     install -m 644 $(LIBRARY) $(DESTDIR)$(libdir)
     install -m 644 $(SHARED3) $(DESTDIR)$(libdir)
     ln -s $(SHARED3) $(DESTDIR)$(libdir)/$(SHARED2)
     ln -s $(SHARED2) $(DESTDIR)$(libdir)/$(SHARED1)
     for header_dir in $(HEADER_DIRS); do \
         mkdir -p $(DESTDIR)$(includedir)/$$header_dir; \
     done
     for header in $(HEADER_FILES); do \
         install -m 644 include/$$header $(DESTDIR)$(includedir)/$$header; \
     done

这将允许您将文件安装到/usr/local中,只需执行以下操作:

make install

但是,它如此大量参数化的原因是您可以更改目标文件夹,而无需修改 Makefile。例如,要将目标更改为/usr,您只需执行以下操作:

make prefix=/usr install

或者,如果您想测试安装过程,而不弄乱您的文件系统,您可以这样做:

make DESTDIR=/tmp/rocksdb_install_test prefix=/usr install

这会将文件放入/tmp/rocksdb_install_test/usr其中,然后您可以检查它们是否在您想要的位置...当您满意时,您可以rm -Rf /tmp/rocksdb_install_test进行清理。

我使用的变量对于使用 RPM 或 DEB 打包是必不可少的。

于 2014-08-20T18:24:30.757 回答
3

RocksDB 最近有make install。如果你使用最新版本,你应该可以make install在 RocksDB 中做。

于 2014-09-15T22:39:47.643 回答
0

我使用 ubuntu 16.04

DEBUG_LEVEL=0 make shared_lib install-shared

这样,安装就已经在生产模式下生成了。

如果你想节省时间,你可以通过传递 -j[n] 来指定进程中使用的处理器数量,在我的例子中是 -j4

DEBUG_LEVEL=0 make -j4 shared_lib install-shared

在 ubuntu 的情况下,这就足够了,但在 ubuntu for docker 的情况下,您应该指定 lib 的安装位置。

export LD_LIBRARY_PATH=/usr/local/lib

希望这可以帮助。肯珀

于 2017-12-21T16:06:10.897 回答