From 8a823a5bbc93efb7f5c44f1b43c79681af7cc422 Mon Sep 17 00:00:00 2001 From: Giovanni Bussi <giovanni.bussi@gmail.com> Date: Wed, 12 Dec 2012 19:26:26 +0100 Subject: [PATCH] Install procedure It is now possible to install plumed with "make install". Installation is done just copying most files (e.g. obj needed for patching) and fixing hardcoded paths. The advantage is that it is possible to fix a location with environment variables PLUMED_PREFIX (e.g. /opt/local/) and a suffix with PLUMED_LIBPREFIX (e.g. 2.0.0). This will help in installing multiple plumed versions in the same path. Moreover, also include files are copied to e.g. /opt/local/include/plumed, so that it is possible to use the plumed tools library as a normal system library --- Makefile | 6 +++ configure.sh | 7 ++- src/Makefile | 8 +++- src/config/.gitignore | 2 + src/config/Makefile | 16 ++++++- src/lib/Makefile | 75 ++++++++++++++++++++++++------ src/maketools/update-plumedroot.sh | 25 ++++++++++ 7 files changed, 123 insertions(+), 16 deletions(-) create mode 100755 src/maketools/update-plumedroot.sh diff --git a/Makefile b/Makefile index 135774a10..1e968b1dd 100644 --- a/Makefile +++ b/Makefile @@ -18,6 +18,12 @@ all: lib: $(MAKE) -C src +install: + $(MAKE) -C src install + +uninstall: + $(MAKE) -C src uninstall + $(SRCDIRS): $(MAKE) -C $@ diff --git a/configure.sh b/configure.sh index c6eb99293..f25214fe9 100755 --- a/configure.sh +++ b/configure.sh @@ -34,7 +34,7 @@ case "$conf" in SOEXT=so esac -echo 'export PATH="$PATH:'"$PWD"'/src/lib/"' >> sourceme.sh +echo 'export PATH="'"$PWD"'/src/lib/:$PATH"' >> sourceme.sh # this is just for mac: echo 'export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:'"$PWD"'/src/lib/"' >> sourceme.sh @@ -42,3 +42,8 @@ cat << EOF >> sourceme.sh export PLUMED_KERNEL="$PWD/src/lib/libplumedKernel.$SOEXT" EOF +echo "PLUMED will be installed using prefix $HOME/opt" +echo "If you wish to change this, set PLUMED_PREFIX environment variable before compiling" +echo "Executable will be named 'plumed'" +echo "To add a suffix to this name, set PLUMED_LIBSUFFIX environment variable before compiling" + diff --git a/src/Makefile b/src/Makefile index 1aab074ef..ef179b10d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,5 +1,5 @@ -.PHONY: all clean lib +.PHONY: all clean lib install uninstall # by default we compile the lib directory, which in turn requests all the needeed modules all: lib @@ -7,6 +7,12 @@ all: lib lib: $(MAKE) -C lib +install: + $(MAKE) -C lib install + +uninstall: + $(MAKE) -C lib uninstall + # list of all the contained directories which can be cleaned SUBDIRS =$(subst /Makefile,,$(wildcard */Makefile)) SUBDIRSCLEAN=$(addsuffix .clean,$(SUBDIRS)) diff --git a/src/config/.gitignore b/src/config/.gitignore index 7a4048d2c..d50842693 100644 --- a/src/config/.gitignore +++ b/src/config/.gitignore @@ -1,2 +1,4 @@ /compile_options.sh /Config.cpp +/ConfigInstall.cpp +/install* diff --git a/src/config/Makefile b/src/config/Makefile index 63cb869d1..adf2019ff 100644 --- a/src/config/Makefile +++ b/src/config/Makefile @@ -4,7 +4,19 @@ # default target .PHONY: all -all: Config.o compile_options.sh +all: + @echo "Updating ConfigInstall.cpp" + @sed "s/@SOEXT@/$(SOEXT)/g" Config.cpp.in | \ + ../maketools/update-plumedroot.sh ConfigInstall.cpp + $(MAKE) do-all + +do-all: Config.o ConfigInstall.o compile_options.sh + make ConfigInstall.o + +ConfigInstall.cpp: + @echo "Updating ConfigInstall.cpp" + @sed "s/@SOEXT@/$(SOEXT)/g" Config.cpp.in | \ + ../maketools/update-plumedroot.sh ConfigInstall.cpp # file to import compilation options inside c++ Config.cpp: Config.cpp.in Config.h @@ -17,6 +29,7 @@ links: Config.o: Config.cpp Makefile.conf.xxd +ConfigInstall.o: ConfigInstall.cpp Makefile.conf.xxd Makefile.conf.xxd: ../../Makefile.conf cat ../../Makefile.conf | xxd -i > Makefile.conf.xxd @@ -32,6 +45,7 @@ compile_options.sh: clean: rm -f Config.cpp compile_options.sh Makefile_conf rm -fr deps + rm -f Config.cpp ConfigInstall.cpp compile_options.sh install.conf rm -f $(CLEANLIST) # generic makefile rules diff --git a/src/lib/Makefile b/src/lib/Makefile index 1be92a2f0..1f4f238fa 100644 --- a/src/lib/Makefile +++ b/src/lib/Makefile @@ -8,6 +8,9 @@ DIRS=$(sort ../config ../wrapper ../main $(KERNEL_MODULES)) # include the machine dependent configuration -include ../../Makefile.conf +# include installation info +-include ../config/install.conf + # if machine dependent configuration has been found: ifdef GCCDEP @@ -23,7 +26,7 @@ SRC_MAIN=../main/main.cpp # source for plumed kernel # everything else -SRC_KERNEL=$(shell for dir in $(KERNEL_MODULES) ; do ls $$dir/*.cpp 2>/dev/null ; ls $$dir/*.c 2>/dev/null ; done) ../config/Config.o +SRC_KERNEL=$(shell for dir in $(KERNEL_MODULES) ; do ls $$dir/*.cpp 2>/dev/null ; ls $$dir/*.c 2>/dev/null ; done) ../config/Config$(PLUMED_INSTALL).o # corresponding objects: OBJ_WRAPPER=../wrapper/PlumedStatic.o @@ -34,15 +37,16 @@ OBJ_KERNEL=$(XXX:.c=.o) ALL_OBJ=$(OBJ_KERNEL) $(OBJ_WRAPPER) $(OBJ_DYNAMIC_WRAPPER) $(OBJ_MAIN) # plumed kernel -PLUMED_KERNEL=libplumedKernel.$(SOEXT) +PLUMED_KERNEL=$(PLUMED_LIBDIR)libplumedKernel.$(SOEXT) # plumed library (kernel + wrapper) -PLUMED_SHARED_OBJ=libplumed.$(SOEXT) +PLUMED_SHARED_OBJ=$(PLUMED_LIBDIR)libplumed.$(SOEXT) # plumed main exec -PLUMED_MAIN_STATIC=plumed -PLUMED_MAIN_SHARED=plumed-shared -PLUMED_MAIN_RUNTIME=plumed-runtime +PLUMED_MAIN_STATIC=$(PLUMED_LIBDIR)plumed +PLUMED_MAIN_SHARED=$(PLUMED_LIBDIR)plumed-shared +PLUMED_MAIN_RUNTIME=$(PLUMED_LIBDIR)plumed-runtime +PLUMED_MAIN_PATCH=$(PLUMED_LIBDIR)plumed-patch .PHONY: all dirs $(DIRS) all-static ifdef SOEXT @@ -58,6 +62,51 @@ all-static: $(MAKE) lib-static +install: + cd ../config ; $(MAKE) +# two steps to be sure that ../config/install.conf is up to date + $(MAKE) install-do + +install-do: + $(MAKE) uninstall + mkdir -p $(PLUMED_INSTALL_PREFIX)/bin + mkdir -p $(PLUMED_INSTALL_ROOT)/src/lib + mkdir -p $(PLUMED_INSTALL_PREFIX)/include/plumed$(PLUMED_INSTALL_LIBSUFFIX) +# rebuild libraries and main using new target dir + $(MAKE) PLUMED_LIBDIR=$(PLUMED_INSTALL_ROOT)/src/lib/ PLUMED_INSTALL=Install all +# copy .h, .cpp .o compile_options.sh and documentation: + cd ../../ ; tar cf - patches scripts src/*/*.h src/*/*.cpp src/*/*.o src/config/compile_options.sh *-doc | tar xf - -C $(PLUMED_INSTALL_ROOT)/ +# also copy .h files into include/ dir + cd ../../src ; tar cf - */*.h $$(find . -type l) | tar xf - -C $(PLUMED_INSTALL_PREFIX)/include/plumed$(PLUMED_INSTALL_LIBSUFFIX)/ +# copy inc files changing the path + for file in Plumed.inc* Plumed.cmake* ; do sed "s| $(realpath ../../)| $(PLUMED_INSTALL_ROOT)/|g" $$file > $(PLUMED_INSTALL_ROOT)/src/lib/$$file ; done +# install links + ln -s $(PLUMED_INSTALL_ROOT)/src/lib/plumed $(PLUMED_INSTALL_PREFIX)/bin/plumed$(PLUMED_INSTALL_LIBSUFFIX) + ln -s $(PLUMED_INSTALL_ROOT)/src/lib/plumed-patch $(PLUMED_INSTALL_PREFIX)/bin/plumed$(PLUMED_INSTALL_LIBSUFFIX)-patch +ifdef SOEXT + ln -s $(PLUMED_INSTALL_ROOT)/src/lib/libplumed.$(SOEXT) $(PLUMED_INSTALL_PREFIX)/lib/libplumed$(PLUMED_INSTALL_LIBSUFFIX).$(SOEXT) + ln -s $(PLUMED_INSTALL_ROOT)/src/lib/libplumedKernel.$(SOEXT) $(PLUMED_INSTALL_PREFIX)/lib/libplumed$(PLUMED_INSTALL_LIBSUFFIX)Kernel.$(SOEXT) +endif + @echo "To uninstall, remove the following files and directories:" + @echo $(PLUMED_INSTALL_ROOT) + @echo $(PLUMED_INSTALL_PREFIX)/include/plumed$(PLUMED_INSTALL_LIBSUFFIX) + @echo $(PLUMED_INSTALL_PREFIX)/bin/plumed$(PLUMED_INSTALL_LIBSUFFIX) + @echo $(PLUMED_INSTALL_PREFIX)/bin/plumed$(PLUMED_INSTALL_LIBSUFFIX)-patch +ifdef SOEXT + @echo $(PLUMED_INSTALL_PREFIX)/lib/libplumed$(PLUMED_INSTALL_LIBSUFFIX).$(SOEXT) + @echo $(PLUMED_INSTALL_PREFIX)/lib/libplumed$(PLUMED_INSTALL_LIBSUFFIX)Kernel.$(SOEXT) +endif + +uninstall: + rm -fr $(PLUMED_INSTALL_ROOT) + rm -fr $(PLUMED_INSTALL_PREFIX)/include/plumed$(PLUMED_INSTALL_LIBSUFFIX) + rm -f $(PLUMED_INSTALL_PREFIX)/bin/plumed$(PLUMED_INSTALL_LIBSUFFIX) + rm -f $(PLUMED_INSTALL_PREFIX)/bin/plumed$(PLUMED_INSTALL_LIBSUFFIX)-patch +ifdef SOEXT + rm -f $(PLUMED_INSTALL_PREFIX)/lib/libplumed$(PLUMED_INSTALL_LIBSUFFIX).$(SOEXT) + rm -f $(PLUMED_INSTALL_PREFIX)/lib/libplumed$(PLUMED_INSTALL_LIBSUFFIX)Kernel.$(SOEXT) +endif + dirs: $(DIRS) $(DIRS): @@ -69,18 +118,18 @@ $(DIRS): lib: lib-static lib-shared -lib-static: $(PLUMED_MAIN_STATIC) $(OBJ_WRAPPER) Plumed.inc.static Plumed.cmake.static plumed-patch +lib-static: $(PLUMED_MAIN_STATIC) $(OBJ_WRAPPER) Plumed.inc.static Plumed.cmake.static $(PLUMED_MAIN_PATCH) lib-shared: $(PLUMED_KERNEL) $(PLUMED_SHARED_OBJ) $(PLUMED_MAIN_SHARED) $(PLUMED_MAIN_RUNTIME) \ Plumed.inc Plumed.inc.runtime Plumed.inc.shared \ Plumed.cmake Plumed.cmake.runtime Plumed.cmake.shared -plumed-patch: - @echo "#! /bin/bash" > plumed-patch - @echo "echo 'NOTE: shell only version of path, useful for cross compiling'" >> plumed-patch - @echo "export PLUMED_ROOT=\"$(realpath ../../)\"" >> plumed-patch - @echo "source \"$(realpath ../../scripts/patch.sh)\"" >> plumed-patch - chmod a+x plumed-patch +$(PLUMED_MAIN_PATCH): + @echo "#! /bin/bash" > $(PLUMED_MAIN_PATCH) + @echo "echo 'NOTE: shell only version of path, useful for cross compiling'" >> $(PLUMED_MAIN_PATCH) + @echo "export PLUMED_ROOT=\"$(realpath $(PLUMED_LIBDIR)../../)\"" >> $(PLUMED_MAIN_PATCH) + @echo "source \"\$$PLUMED_ROOT\"/scripts/patch.sh" >> $(PLUMED_MAIN_PATCH) + chmod a+x $(PLUMED_MAIN_PATCH) $(PLUMED_KERNEL):$(OBJ_KERNEL) $(LDSO) -o $@ $^ $(DYNAMIC_LIBS) diff --git a/src/maketools/update-plumedroot.sh b/src/maketools/update-plumedroot.sh new file mode 100755 index 000000000..ee28d12b4 --- /dev/null +++ b/src/maketools/update-plumedroot.sh @@ -0,0 +1,25 @@ +#! /bin/bash + +test -n "$1" || { + echo "Usage: $0 outfile" + exit 1 +} + +PLUMED_PREFIX="${PLUMED_PREFIX:=$HOME/opt}" +PLUMED_LIBSUFFIX="${PLUMED_LIBSUFFIX:=}" +test -n "$PLUMED_LIBSUFFIX" && PLUMED_LIBSUFFIX="-${PLUMED_LIBSUFFIX}" +PLUMED_ROOT="${PLUMED_PREFIX}/lib/plumed${PLUMED_LIBSUFFIX}/" + +{ +echo "PLUMED_INSTALL_ROOT=${PLUMED_ROOT}" +echo "PLUMED_INSTALL_PREFIX=${PLUMED_PREFIX}" +echo "PLUMED_INSTALL_LIBSUFFIX=${PLUMED_LIBSUFFIX}" +} > install.conf + +sed "s|@PLUMED_ROOT@|${PLUMED_ROOT}|g" > $1~ + +cmp -s $1~ $1 || cp $1~ $1 +rm $1~ + + + -- GitLab