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