xtreemfs/Makefile

350 lines
15 KiB
Makefile

ifeq "$(JAVA_HOME)" ""
JAVAC_BIN = /usr/bin/javac
else
JAVAC_BIN = $(JAVA_HOME)/bin/javac
endif
ifeq "$(ANT_HOME)" ""
ANT_BIN = /usr/bin/ant
else
ANT_BIN = $(ANT_HOME)/bin/ant
endif
ifeq "$(CMAKE_HOME)" ""
CMAKE_BIN = cmake
else
CMAKE_BIN = $(CMAKE_HOME)/bin/cmake
endif
SHELL := $(shell which bash)
WHICH_GPP = $(shell which g++)
WHICH_CLANGPP = $(shell which clang++)
ifeq "$(shell uname)" "SunOS"
PROTOBUF_DISABLE_64_BIT_SOLARIS = "--disable-64bit-solaris"
endif
# Paths used during compilation.
XTREEMFS_CLIENT_BUILD_DIR=$(shell pwd)/cpp/build
XTREEMFS_BINARIES_DIR = $(shell pwd)/bin
# Install paths relative to DESTDIR.
XTREEMFS_JAR_DIR=$(DESTDIR)/usr/share/java
XTREEMFS_CONFIG_PARENT_DIR=$(DESTDIR)/etc/xos
XTREEMFS_CONFIG_DIR=$(XTREEMFS_CONFIG_PARENT_DIR)/xtreemfs
XTREEMFS_INIT_DIR=$(DESTDIR)/etc/init.d
XTREEMFS_SHARE_DIR=$(DESTDIR)/usr/share/xtreemfs
BIN_DIR=$(DESTDIR)/usr/bin
SBIN_DIR=$(DESTDIR)/sbin
MAN_DIR=$(DESTDIR)/usr/share/man/man1
DOC_DIR_SERVER=$(DESTDIR)/usr/share/doc/xtreemfs-server
DOC_DIR_CLIENT=$(DESTDIR)/usr/share/doc/xtreemfs-client
DOC_DIR_TOOLS=$(DESTDIR)/usr/share/doc/xtreemfs-tools
PLUGIN_CONFIG_DIR=$(XTREEMFS_CONFIG_DIR)/server-repl-plugin
#Configuration of cpp code thirdparty dependencies.
# If you edit the next five variables, make sure you also change them in cpp/CMakeLists.txt.
CLIENT_GOOGLE_PROTOBUF_CPP = cpp/thirdparty/protobuf-2.5.0
CLIENT_GOOGLE_PROTOBUF_CPP_LIBRARY = $(CLIENT_GOOGLE_PROTOBUF_CPP)/src/.libs/libprotobuf.a
CLIENT_GOOGLE_TEST_CPP = cpp/thirdparty/gtest-1.7.0
CLIENT_GOOGLE_TEST_CPP_LIBRARY = $(CLIENT_GOOGLE_TEST_CPP)/lib/.libs/libgtest.a
CLIENT_GOOGLE_TEST_CPP_MAIN = $(CLIENT_GOOGLE_TEST_CPP)/lib/.libs/libgtest_main.a
# The two required objects libgtest.a and libgtest_main.a both depend
# on the same target building the Google googletest library.
# Therefore, this target is guarded by a checkfile which will be touched once it was executed.
# This prevents the target from getting executed again as long as the checkfile does not change.
CLIENT_GOOGLE_TEST_CHECKFILE = .googletest_library_already_built
TARGETS = client server foundation flease
.PHONY: clean distclean set_version
all: check_server check_client check_test $(TARGETS)
clean: check_server check_client $(patsubst %,%_clean,$(TARGETS))
distclean: check_server check_client $(patsubst %,%_distclean,$(TARGETS))
install: install-client install-server install-tools
install-client:
@if [ ! -f $(XTREEMFS_BINARIES_DIR)/mkfs.xtreemfs ]; then echo "PLEASE RUN 'make client' FIRST!"; exit 1; fi
@mkdir -p $(DOC_DIR_CLIENT)
@cp LICENSE $(DOC_DIR_CLIENT)
@mkdir -p $(BIN_DIR)
@cp -p $(XTREEMFS_BINARIES_DIR)/*.xtreemfs $(XTREEMFS_BINARIES_DIR)/xtfsutil $(BIN_DIR)
# mount -t xtreemfs will be recognized when binaries are present in /sbin/. Only applicable if the Fuse Client was built.
@[ -f $(XTREEMFS_BINARIES_DIR)/mount.xtreemfs ] && mkdir -p $(SBIN_DIR); true
@[ -f $(XTREEMFS_BINARIES_DIR)/mount.xtreemfs ] && ln -s $(BIN_DIR)/mount.xtreemfs $(SBIN_DIR)/mount.xtreemfs; true
@[ -f $(XTREEMFS_BINARIES_DIR)/mount.xtreemfs ] && ln -s $(BIN_DIR)/umount.xtreemfs $(SBIN_DIR)/umount.xtreemfs; true
@mkdir -p $(XTREEMFS_CONFIG_DIR)
@cp etc/xos/xtreemfs/default_dir $(XTREEMFS_CONFIG_DIR)
@mkdir -p $(MAN_DIR)
@cp -R man/man1/*.xtreemfs* $(MAN_DIR)
@cp -R man/man1/xtfsutil.* $(MAN_DIR)
install-server:
@if [ ! -f java/servers/dist/XtreemFS.jar ]; then echo "PLEASE RUN 'make server' FIRST!"; exit 1; fi
@mkdir -p $(DOC_DIR_SERVER)
@cp LICENSE $(DOC_DIR_SERVER)
@mkdir -p $(XTREEMFS_JAR_DIR)
@cp java/servers/dist/XtreemFS.jar $(XTREEMFS_JAR_DIR)
@cp java/foundation/dist/Foundation.jar $(XTREEMFS_JAR_DIR)
@cp java/flease/dist/Flease.jar $(XTREEMFS_JAR_DIR)
@cp java/lib/*.jar $(XTREEMFS_JAR_DIR)
@cp contrib/server-repl-plugin/BabuDB_replication_plugin.jar $(XTREEMFS_JAR_DIR)
@mkdir -p $(XTREEMFS_CONFIG_DIR)
# @cp etc/xos/xtreemfs/*config.properties $(XTREEMFS_CONFIG_DIR)
# delete UUID from config-files
@grep -v '^uuid\W*=\W*\w\+' etc/xos/xtreemfs/dirconfig.properties > $(XTREEMFS_CONFIG_DIR)/dirconfig.properties
@grep -v '^uuid\W*=\W*\w\+' etc/xos/xtreemfs/mrcconfig.properties > $(XTREEMFS_CONFIG_DIR)/mrcconfig.properties
@grep -v '^uuid\W*=\W*\w\+' etc/xos/xtreemfs/osdconfig.properties > $(XTREEMFS_CONFIG_DIR)/osdconfig.properties
@mkdir -p $(PLUGIN_CONFIG_DIR)
@cp contrib/server-repl-plugin/config/dir.properties $(PLUGIN_CONFIG_DIR)
@cp contrib/server-repl-plugin/config/mrc.properties $(PLUGIN_CONFIG_DIR)
@cp packaging/generate_uuid $(XTREEMFS_CONFIG_DIR)
@cp packaging/postinstall_setup.sh $(XTREEMFS_CONFIG_DIR)
@chmod a+x $(XTREEMFS_CONFIG_DIR)/postinstall_setup.sh
# Generating init.d scripts based on template.
@etc/init.d/generate_initd_scripts.sh
@mkdir -p $(XTREEMFS_INIT_DIR)
@cp etc/init.d/xtreemfs-{dir,mrc,osd} $(XTREEMFS_INIT_DIR)
@chmod a+x $(XTREEMFS_INIT_DIR)/xtreemfs-*
@mkdir -p $(XTREEMFS_SHARE_DIR)
@cp contrib/xtreemfs-osd-farm/xtreemfs-osd-farm $(XTREEMFS_SHARE_DIR)
@echo "to complete the server installation, please execute $(XTREEMFS_CONFIG_DIR)/postinstall_setup.sh"
install-tools:
@if [ ! -f java/servers/dist/XtreemFS.jar ]; then echo "PLEASE RUN 'make server' FIRST!"; exit 1; fi
@mkdir -p $(DOC_DIR_TOOLS)
@cp LICENSE $(DOC_DIR_TOOLS)
@mkdir -p $(XTREEMFS_JAR_DIR)
@cp java/servers/dist/XtreemFS.jar $(XTREEMFS_JAR_DIR)
@cp java/foundation/dist/Foundation.jar $(XTREEMFS_JAR_DIR)
@cp java/flease/dist/Flease.jar $(XTREEMFS_JAR_DIR)
@cp java/lib/*.jar $(XTREEMFS_JAR_DIR)
@mkdir -p $(BIN_DIR)
@cp -p `ls $(XTREEMFS_BINARIES_DIR)/xtfs_* | grep -v xtfs_.*mount` $(BIN_DIR)
@mkdir -p $(MAN_DIR)
@cp -R man/man1/xtfs_* $(MAN_DIR)
uninstall:
@rm -rf $(DOC_DIR_SERVER)
@rm -rf $(DOC_DIR_CLIENT)
@rm -rf $(DOC_DIR_TOOLS)
@rm -rf $(BIN_DIR)/xtfs*
@rm -rf $(BIN_DIR)/*.xtreemfs
@rm -f $(SBIN_DIR)/mount.xtreemfs
@rm -f $(SBIN_DIR)/umount.xtreemfs
@rm -f $(XTREEMFS_JAR_DIR)/XtreemFS.jar
@rm -f $(XTREEMFS_JAR_DIR)/Foundation.jar
@rm -f $(XTREEMFS_JAR_DIR)/Flease.jar
@rm -f $(XTREEMFS_JAR_DIR)/BabuDB.jar
@rm -f $(XTREEMFS_JAR_DIR)/commons-codec-1.3.jar
@rm -f $(XTREEMFS_JAR_DIR)/jdmkrt.jar
@rm -f $(XTREEMFS_JAR_DIR)/jdmktk.jar
@rm -f $(XTREEMFS_JAR_DIR)/protobuf-java-2.5.0.jar
@rm -f $(XTREEMFS_JAR_DIR)/BabuDB_replication_plugin.jar
@rm -f $(XTREEMFS_INIT_DIR)/xtreemfs-*
@rm -rf $(MAN_DIR)/xtfs*
@rm -rf $(MAN_DIR)/*.xtreemfs*
@echo "uninstall complete"
purge: uninstall
@rm -rf $(XTREEMFS_CONFIG_DIR)
@echo "purge complete"
check_server:
@if [ ! -e $(JAVAC_BIN) ]; then echo "javac not found! Make sure a JDK is installed and set JAVA_HOME."; exit 1; fi;
@if [ $(shell $(JAVAC_BIN) -version 2>&1 | head -n1 | cut -d" " -f2 | cut -d. -f2) -lt 6 ]; then echo "java version >= 1.6.0 required!"; exit 1; fi;
@echo "java ok"
@if [ ! -e $(ANT_BIN) ]; then echo "ant not found! Make sure ant is installed and set ANT_HOME."; exit 1; fi;
@echo "ant ok"
check_client:
@if [ ! $(WHICH_GPP) -a ! $(WHICH_CLANGPP) ]; then echo "C++ compiler not found";exit 1; fi;
@if [ ! $(CMAKE_BIN) ]; then echo "cmake not found";exit 1; fi;
@echo "C++ ok"
check_test:
@if [[ $(shell python -V 2>&1 | head -n1 | cut -d" " -f2 | cut -d. -f2) -lt 3 && $(shell python -V 2>&1 | head -n1 | cut -d" " -f2 | cut -d. -f1) -lt 3 ]]; then echo "python >= 2.4 required!"; exit 1; fi;
@echo "python ok"
set_version:
# Try to set the SVN revision and branch name as part of the version. We don't care if this may fail.
ifndef SKIP_SET_SVN_VERSION
@./packaging/set_version.sh -s &>/dev/null; exit 0
endif
.PHONY: client client_clean client_distclean client_thirdparty_clean client_package_macosx
# Client section.
CLIENT_THIRDPARTY_REQUIREMENTS = $(CLIENT_GOOGLE_PROTOBUF_CPP_LIBRARY)
ifdef BUILD_CLIENT_TESTS
CLIENT_THIRDPARTY_REQUIREMENTS += $(CLIENT_GOOGLE_TEST_CPP_LIBRARY) $(CLIENT_GOOGLE_TEST_CPP_MAIN)
CMAKE_BUILD_CLIENT_TESTS = -DBUILD_CLIENT_TESTS=true
endif
# Do not use env variables to control the CMake behavior as stated in http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_get_or_set_environment_variables.3F
# Instead define them via -D, so they will be cached.
ifdef BOOST_ROOT
CMAKE_BOOST_ROOT = -DBOOST_ROOT="$(BOOST_ROOT)" -DBoost_NO_SYSTEM_PATHS=ON
endif
# Tell CMake if it should ignore a missing Fuse.
ifdef SKIP_FUSE
CMAKE_SKIP_FUSE = -DSKIP_FUSE=true
endif
# Trigger building the experimental LD_PRELOAD library
ifdef BUILD_PRELOAD
CMAKE_BUILD_PRELOAD = -DBUILD_PRELOAD=true
endif
client_thirdparty: $(CLIENT_THIRDPARTY_REQUIREMENTS)
$(CLIENT_GOOGLE_PROTOBUF_CPP_LIBRARY): $(CLIENT_GOOGLE_PROTOBUF_CPP)/src/**
@echo "client_thirdparty: Configuring and building required Google protobuf library..."
@cd $(CLIENT_GOOGLE_PROTOBUF_CPP) && LIBS=-lpthread ./configure $(PROTOBUF_DISABLE_64_BIT_SOLARIS) >/dev/null
@$(MAKE) -C $(CLIENT_GOOGLE_PROTOBUF_CPP) >/dev/null
@echo "client_thirdparty: ...completed building required Google protobuf library."
@touch $(CLIENT_GOOGLE_PROTOBUF_CPP_LIBRARY)
$(CLIENT_GOOGLE_TEST_CPP_LIBRARY): $(CLIENT_GOOGLE_TEST_CHECKFILE)
@touch $(CLIENT_GOOGLE_TEST_CPP_LIBRARY)
$(CLIENT_GOOGLE_TEST_CPP_MAIN): $(CLIENT_GOOGLE_TEST_CHECKFILE)
@touch $(CLIENT_GOOGLE_TEST_CPP_MAIN)
$(CLIENT_GOOGLE_TEST_CHECKFILE): $(CLIENT_GOOGLE_TEST_CPP)/include/** $(CLIENT_GOOGLE_TEST_CPP)/src/**
@echo "client_thirdparty: Configuring and building required Google googletest library..."
@cd $(CLIENT_GOOGLE_TEST_CPP) && ./configure >/dev/null
@$(MAKE) -C $(CLIENT_GOOGLE_TEST_CPP) >/dev/null
@touch $(CLIENT_GOOGLE_TEST_CPP_LIBRARY)
@echo "client_thirdparty: ...completed building required Google googletest library."
@touch $(CLIENT_GOOGLE_TEST_CHECKFILE)
client_thirdparty_clean:
@if [ -f $(CLIENT_GOOGLE_PROTOBUF_CPP)/Makefile ]; then echo "Cleaning required Google protobuf library sources..."; $(MAKE) -C $(CLIENT_GOOGLE_PROTOBUF_CPP) clean >/dev/null; fi
@if [ -f $(shell pwd)/$(CLIENT_GOOGLE_TEST_CPP)/Makefile ]; then echo "Cleaning required Google googletest library sources..."; $(MAKE) -C $(shell pwd)/$(CLIENT_GOOGLE_TEST_CPP) clean >/dev/null; fi
@if [ -f $(CLIENT_GOOGLE_TEST_CHECKFILE) ]; then rm $(CLIENT_GOOGLE_TEST_CHECKFILE); fi
@echo "...finished cleaning thirdparty sources."
client_thirdparty_distclean:
@echo "client_thirdparty: Dist-Cleaning required Google protobuf library sources..."
@if [ -f $(shell pwd)/$(CLIENT_GOOGLE_PROTOBUF_CPP)/Makefile ]; then $(MAKE) -C $(shell pwd)/$(CLIENT_GOOGLE_PROTOBUF_CPP) distclean >/dev/null; fi
@echo "client_thirdparty: Dist-Cleaning required Google googletest library sources..."
@if [ -f $(shell pwd)/$(CLIENT_GOOGLE_TEST_CPP)/Makefile ]; then $(MAKE) -C $(shell pwd)/$(CLIENT_GOOGLE_TEST_CPP) distclean >/dev/null; fi
@if [ -f $(CLIENT_GOOGLE_TEST_CHECKFILE) ]; then rm $(CLIENT_GOOGLE_TEST_CHECKFILE); fi
@echo "client_thirdparty: ...finished distcleaning thirdparty sources."
client_debug: CLIENT_DEBUG = -DCMAKE_BUILD_TYPE=Debug
client_debug: client
client: check_client client_thirdparty set_version
$(CMAKE_BIN) -Hcpp -B$(XTREEMFS_CLIENT_BUILD_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 $(CLIENT_DEBUG) $(CMAKE_BOOST_ROOT) $(CMAKE_BUILD_CLIENT_TESTS) $(CMAKE_SKIP_FUSE) ${CMAKE_BUILD_PRELOAD}
@$(MAKE) -C $(XTREEMFS_CLIENT_BUILD_DIR)
@cd $(XTREEMFS_CLIENT_BUILD_DIR); for i in *.xtreemfs xtfsutil; do [ -f $(XTREEMFS_BINARIES_DIR)/$$i ] && rm -f $(XTREEMFS_BINARIES_DIR)/$$i; done; true
@cp -p $(XTREEMFS_CLIENT_BUILD_DIR)/*.xtreemfs $(XTREEMFS_BINARIES_DIR)
@cp -p $(XTREEMFS_CLIENT_BUILD_DIR)/xtfsutil $(XTREEMFS_BINARIES_DIR)
client_clean: check_client client_thirdparty_clean
@cd $(XTREEMFS_CLIENT_BUILD_DIR) &>/dev/null && { for i in *.xtreemfs xtfsutil; do [ -f $(XTREEMFS_BINARIES_DIR)/$$i ] && rm -f $(XTREEMFS_BINARIES_DIR)/$$i; done }; true
@rm -rf $(XTREEMFS_CLIENT_BUILD_DIR)
client_distclean: check_client client_thirdparty_distclean
@cd $(XTREEMFS_CLIENT_BUILD_DIR) &>/dev/null && { for i in *.xtreemfs xtfsutil; do [ -f $(XTREEMFS_BINARIES_DIR)/$$i ] && rm -f $(XTREEMFS_BINARIES_DIR)/$$i; done }; true
@rm -rf $(XTREEMFS_CLIENT_BUILD_DIR)
CLIENT_PACKAGE_MACOSX_OUTPUT_DIR = XtreemFS_Client_MacOSX.mpkg
CLIENT_PACKAGE_MACOSX_OUTPUT_FILE = XtreemFS_Client_MacOSX_installer.dmg
client_package_macosx:
ifeq ($(CMAKE_BOOST_ROOT),)
@echo No BOOST_ROOT environment variable is specified. This will probably fail. Please set it first.; exit 1
endif
@./packaging/set_version.sh -i
# Clean everything first to ensure we package a clean client.
@$(MAKE) client_distclean
# We call $(MAKE) instead of specifying the targets as requirements as its not possible to define dependencies between these two and this breaks in case of parallel builds.
@$(MAKE) client SKIP_SET_SVN_VERSION=1
@echo "Running the Apple Packagemaker..."
@/Developer/usr/bin/packagemaker -d packaging/macosx/XtreemFS_MacOSX_Package.pmdoc/ -o $(CLIENT_PACKAGE_MACOSX_OUTPUT_DIR)
@echo "Creating a DMG file..."
@if [ -f "$(CLIENT_PACKAGE_MACOSX_OUTPUT_FILE)" ]; then echo "Removing previous file $(CLIENT_PACKAGE_MACOSX_OUTPUT_FILE)."; rm "$(CLIENT_PACKAGE_MACOSX_OUTPUT_FILE)"; fi
@hdiutil create -fs HFS+ -srcfolder "$(CLIENT_PACKAGE_MACOSX_OUTPUT_DIR)" -volname "XtreemFS Client for MacOSX" "$(CLIENT_PACKAGE_MACOSX_OUTPUT_FILE)"
@if [ -d "$(CLIENT_PACKAGE_MACOSX_OUTPUT_DIR)" ]; then echo "Cleaning up temporary files..."; rm -r "$(CLIENT_PACKAGE_MACOSX_OUTPUT_DIR)"; fi
@echo "Package file created: $(CLIENT_PACKAGE_MACOSX_OUTPUT_FILE)"
.PHONY: flease flease_clean flease_distclean
flease: foundation
$(ANT_BIN) -D"file.encoding=UTF-8" -f java/flease/build-1.6.5.xml jar
flease_clean:
$(ANT_BIN) -D"file.encoding=UTF-8" -f java/flease/build-1.6.5.xml clean || exit 1;
flease_distclean:
$(ANT_BIN) -D"file.encoding=UTF-8" -f java/flease/build-1.6.5.xml clean || exit 1;
.PHONY: foundation foundation_clean foundation_distclean
foundation: set_version
$(ANT_BIN) -D"file.encoding=UTF-8" -f java/foundation/build-1.6.5.xml jar
foundation_clean:
$(ANT_BIN) -D"file.encoding=UTF-8" -f java/foundation/build-1.6.5.xml clean || exit 1;
foundation_distclean:
$(ANT_BIN) -D"file.encoding=UTF-8" -f java/foundation/build-1.6.5.xml clean || exit 1;
.PHONY: server server_clean server_distclean
server: check_server foundation flease
$(ANT_BIN) -D"file.encoding=UTF-8" -f java/servers/build-1.6.5.xml jar
server_clean: check_server
$(ANT_BIN) -D"file.encoding=UTF-8" -f java/servers/build-1.6.5.xml clean || exit 1;
server_distclean: check_server
$(ANT_BIN) -D"file.encoding=UTF-8" -f java/servers/build-1.6.5.xml clean || exit 1;
.PHONY: hadoop-client hadoop-client_clean hadoop-client_distclean
hadoop-client: server foundation
$(ANT_BIN) -D"file.encoding=UTF-8" -f contrib/hadoop/build.xml jar
@echo -e "\n\nHadoop Client was successfully compiled. You can find it here:\n\n\tcontrib/hadoop/dist/XtreemFSHadoopClient.jar\n\nSee the XtreemFS User Guide how to add it in Hadoop.\n"
hadoop-client_clean:
$(ANT_BIN) -D"file.encoding=UTF-8" -f contrib/hadoop/build.xml clean || exit 1
hadoop-client_distclean:
$(ANT_BIN) -D"file.encoding=UTF-8" -f contrib/hadoop/build.xml clean || exit 1
test: check_test client server
python ./tests/xtestenv -c ./tests/test_config.py short
pbrpcgen:
$(ANT_BIN) -D"file.encoding=UTF-8" -f java/pbrpcgen/build.xml
pbrpcgen_clean:
$(ANT_BIN) -D"file.encoding=UTF-8" -f java/pbrpcgen/build.xml clean || exit 1
interfaces: pbrpcgen client_thirdparty
$(MAKE) -C interface