【问题标题】:RocksDB make installRocksDB 进行安装
【发布时间】:2014-08-19 21:09:01
【问题描述】:

来自(稍微)过时的documentation on 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`

installation instructions for RocksDB 似乎没有提到任何类型的install 目标!

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


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

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

【问题讨论】:

    标签: makefile rocksdb


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      当前 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 打包是必不可少的。

      【讨论】:

        【解决方案3】:

        我使用的是 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
        

        希望这会有所帮助。 肯珀

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多