diff --git a/Makefile b/Makefile index 4f58eb9a..3086d370 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ BLUE= BLACK=(B -.PHONY: doc src curl m4 ocaml irpf90 emsl +.PHONY: doc src curl m4 ocaml irpf90 emsl build binary default: @echo ----------------------------------------------- @@ -16,6 +16,9 @@ default: @echo @echo To compile everything, run @echo make build + @echo + @echo To compile a binary distribution for export, run + @echo make binary @echo ----------------------------------------------- ifndef QPACKAGE_ROOT @@ -29,8 +32,8 @@ build: @echo ----------------------------------------------- else build: - $(MAKE) -C src - $(MAKE) -C ocaml + $(MAKE) -C src + $(MAKE) -C ocaml endif curl: bin/curl @@ -38,6 +41,9 @@ m4: bin/m4 irpf90: bin/irpf90 emsl: EMSL_Basis +binary: + $(QPACKAGE_ROOT)/scripts/make_binary.sh + EZFIO: bin/irpf90 $(info $(BLUE)===== Fetching EZFIO from the web ===== $(BLACK)) @sleep 1 diff --git a/ocaml/qp_create_ezfio_from_xyz.ml b/ocaml/qp_create_ezfio_from_xyz.ml index 84763c0f..f3cebe32 100644 --- a/ocaml/qp_create_ezfio_from_xyz.ml +++ b/ocaml/qp_create_ezfio_from_xyz.ml @@ -49,6 +49,9 @@ let run ?o b c m xyz_file = end in + let temp_filename = + Filename.temp_file "qp_create_" ".basis" + in let rec build_basis = function | [] -> () | elem_and_basis_name :: rest -> @@ -66,7 +69,8 @@ let run ?o b c m xyz_file = apply new_accu rest in let accu = - Qpackage.root ^ "/scripts/get_basis.sh \"" ^ basis ^"\"" + Qpackage.root ^ "/scripts/get_basis.sh \"" ^ temp_filename + ^ "\" " ^ basis in List.map nuclei ~f:(fun x -> x.Atom.element) |> apply accu @@ -97,8 +101,8 @@ let run ?o b c m xyz_file = let key = Element.to_string elem in let command = - Qpackage.root ^ "/scripts/get_basis.sh \"" ^ basis ^ "\"" - ^ " " ^ key + Qpackage.root ^ "/scripts/get_basis.sh \"" ^ temp_filename ^ + "\" " ^ basis ^ " " ^ key in begin let filename = diff --git a/scripts/get_basis.sh b/scripts/get_basis.sh index 9e5c0420..0a21a2bf 100755 --- a/scripts/get_basis.sh +++ b/scripts/get_basis.sh @@ -1,6 +1,6 @@ #!/bin/bash # -# get_basis.sh +# get_basis.sh ... # # Uses the EMSL_api.py to get the basis set: # https://github.com/TApplencourt/EMSL_Basis_Set_Exchange_Local @@ -11,6 +11,8 @@ export EMSL_API_ROOT="${QPACKAGE_ROOT}"/EMSL_Basis/ export PYTHONPATH="${EMSL_API_ROOT}":${PYTHONPATH} +tmpfile="$1" +shift basis="$1" shift atoms="" @@ -20,7 +22,6 @@ do atoms+="--atom ${atom} " done -tmpfile=$(tempfile) if [[ $? -ne 0 ]] then echo "==================================================" 1>& 2 diff --git a/scripts/make_binary.sh b/scripts/make_binary.sh new file mode 100755 index 00000000..ffbcd28c --- /dev/null +++ b/scripts/make_binary.sh @@ -0,0 +1,184 @@ +#!/bin/bash +# +# Creates a self-contained binary distribution in the form of a tar.gz file +# +# Tue Jan 13 14:06:25 CET 2015 +# + + +# Check the QPACKAGE_ROOT directory +if [[ -z ${QPACKAGE_ROOT} ]] +then + echo "The QPACKAGE_ROOT environment variable is not set." + echo "Please reload the quantum_package.rc file." + exit 1 +fi + +cd ${QPACKAGE_ROOT} +if [[ -f quantum_package.rc \ + && -f README.md \ + && -d src \ + && -d bin \ + && -d ocaml \ + && -d scripts ]] +then + head -1 README.md | grep "Quantum package" > /dev/null + if [[ $? -ne 0 ]] + then + echo "This doesn't look like a quantum_package directory (README.md)" + exit 1 + fi +else + echo "This doesn't look like a quantum_package directory" + exit 1 +fi + + +# Build all sources +for dir in ${QPACKAGE_ROOT}/{src,ocaml} +do + make -C ${dir} + if [[ $? -ne 0 ]] + then + echo "Error building ${dir}" + fi +done + + +# Copy the files in the static directory +QPACKAGE_STATIC=${QPACKAGE_ROOT}/quantum_package_static + +function find_libs () +{ + for i in $@ + do + ldd $i + done | sort | grep '/' | cut -d ' ' -f 3 | uniq +} + +function find_exec () +{ + find ${QPACKAGE_ROOT}/$1 -perm /u+x -type f +} + + + +# +echo "Creating root of static directory" +# --------------------------------- + +rm -rf -- ${QPACKAGE_STATIC} +mkdir -p -- ${QPACKAGE_STATIC}/{bin,lib,data} +if [[ $? -ne 0 ]] ; +then + echo "Error creating ${QPACKAGE_STATIC}/{bin,lib,data,scripts}" + exit 1 +fi + + +# +echo "Copying binary files" +# -------------------- + +FORTRAN_EXEC=$(find_exec src) +if [[ -z $FORTRAN_EXEC ]] ; +then + echo 'Error : No Fortran binaries found.' + exit 1 +fi + +OCAML_EXEC=$(find_exec ocaml | grep .native ) +if [[ -z $OCAML_EXEC ]] ; +then + echo 'Error : No ocaml binaries found.' + exit 1 +fi + +cp -- ${FORTRAN_EXEC} ${OCAML_EXEC} ${QPACKAGE_STATIC}/bin +if [[ $? -ne 0 ]] ; +then + echo 'cp -- ${FORTRAN_EXEC} ${OCAML_EXEC} ${QPACKAGE_STATIC}/bin' + exit 1 +fi + +cd ${QPACKAGE_STATIC}/bin + for i in *.native + do + mv "$i" $(basename "$i" .native) + done +cd - + +for i in ${FORTRAN_EXEC} +do + i=$(basename $i) + echo $i \$QPACKAGE_ROOT/bin/$i +done >> ${QPACKAGE_STATIC}/data/executables + +# +echo "Copying dynamic libraries" +# -------------------------- + +MKL_LIBS=$(find_libs ${FORTRAN_EXEC} | grep libmkl | head -1) +MKL_LIBS=$(dirname ${MKL_LIBS}) +MKL_LIBS=$(ls ${MKL_LIBS}/libmkl_{def,avx,avx2}.so) +ALL_LIBS=$(find_libs ${OCAML_EXEC} ${FORTRAN_EXEC}) +cp -- ${ALL_LIBS} ${MKL_LIBS} ${QPACKAGE_STATIC}/lib +if [[ $? -ne 0 ]] ; +then + echo 'cp -- ${ALL_LIBS} ${MKL_LIBS} ${QPACKAGE_STATIC}/lib' + exit 1 +fi + + +# +echo "Copying EMSL_Basis directory" +# ---------------------------- + +cp -r -- ${QPACKAGE_ROOT}/EMSL_Basis ${QPACKAGE_STATIC}/ +if [[ $? -ne 0 ]] ; +then + echo 'cp -r -- ${QPACKAGE_ROOT}/EMSL_Basis ${QPACKAGE_STATIC}/' + exit 1 +fi + + +# +echo "Copying scripts directory" +# ------------------------- + +cp -r -- ${QPACKAGE_ROOT}/scripts ${QPACKAGE_STATIC}/ +if [[ $? -ne 0 ]] ; +then + echo 'cp -r -- ${QPACKAGE_ROOT}/scripts ${QPACKAGE_STATIC}/' + exit 1 +fi + + +# +echo "Creating quantum_package.rc" +# --------------------------- + +cat << EOF > ${QPACKAGE_STATIC}/quantum_package.rc +export QPACKAGE_ROOT=\$( cd \$(dirname "\${BASH_SOURCE}") ; pwd -P ) +export LD_LIBRARY_PATH="\${QPACKAGE_ROOT}"/lib:\${LD_LIBRARY_PATH} +export LIBRARY_PATH="\${QPACKAGE_ROOT}"/lib:\${LIBRARY_PATH} +export PYTHONPATH="\${QPACKAGE_ROOT}"/scripts:\${PYTHONPATH} +export PATH="\${QPACKAGE_ROOT}"/scripts:\${PATH} +export PATH="\${QPACKAGE_ROOT}"/bin:\${PATH} +export PATH="\${QPACKAGE_ROOT}"/ocaml:\${PATH} +EOF + +#exit 0 +# +echo "Creating the archive" +# -------------------- + +tar -zcf "${QPACKAGE_STATIC}".tar.gz quantum_package_static && rm -rf -- "${QPACKAGE_STATIC}" +if [[ $? -ne 0 ]] ; +then + echo 'tar -zcf "${QPACKAGE_STATIC}".tar.gz "${QPACKAGE_STATIC}" && rm -rf -- "${QPACKAGE_STATIC}"' + exit 1 +fi + +echo "Done : ${QPACKAGE_STATIC}.tar.gz" + diff --git a/setup_environment.sh b/setup_environment.sh index 06a4959c..4fbcf977 100755 --- a/setup_environment.sh +++ b/setup_environment.sh @@ -8,13 +8,14 @@ BLUE="" RED="" BLACK="(B" -QPACKAGE_ROOT=${PWD} +QPACKAGE_ROOT="$( cd "$(dirname "$BASH_SOURCE")" ; pwd -P )" -if [[ -z ${IRPF90} ]] ; + +if [[ -z "${IRPF90}" ]] ; then make irpf90 - IRPF90=${QPACKAGE_ROOT}/bin/irpf90 - if [[ ! -x ${IRPF90} ]] + IRPF90="${QPACKAGE_ROOT}"/bin/irpf90 + if [[ ! -x "${IRPF90}" ]] then echo $RED "Error in IRPF90 installation" $BLACK exit 1 @@ -28,18 +29,17 @@ then fi cat << EOF > quantum_package.rc -export IRPF90=${IRPF90} -export OCAMLBREW_BASE=${OCAMLBREW_BASE} -export QPACKAGE_ROOT=${QPACKAGE_ROOT} -export LD_LIBRARY_PATH="\${QPACKAGE_ROOT}/lib":\${LD_LIBRARY_PATH} -export LIBRARY_PATH="\${QPACKAGE_ROOT}/lib":\${LIBRARY_PATH} -export C_INCLUDE_PATH=\${QPACKAGE_ROOT}/include:\${C_INCLUDE_PATH} -export PYTHONPATH=\${PYTHONPATH}:\${QPACKAGE_ROOT}/scripts -export PATH=\${PATH}:\${QPACKAGE_ROOT}/scripts -export PATH=\${PATH}:\${QPACKAGE_ROOT}/bin -export PATH=\${PATH}:\${QPACKAGE_ROOT}/ocaml -export QPACKAGE_CACHE_URL="http://qmcchem.ups-tlse.fr/files/scemama/quantum_package/cache" -source "\${QPACKAGE_ROOT}/bin/irpman" &> /dev/null +export IRPF90="${IRPF90}" +export OCAMLBREW_BASE="${OCAMLBREW_BASE}" +export QPACKAGE_ROOT=\$( cd \$(dirname "\${BASH_SOURCE}") ; pwd -P ) +export LD_LIBRARY_PATH="\${QPACKAGE_ROOT}"/lib:\${LD_LIBRARY_PATH} +export LIBRARY_PATH="\${QPACKAGE_ROOT}"/lib:\${LIBRARY_PATH} +export C_INCLUDE_PATH="\${QPACKAGE_ROOT}"/include:\${C_INCLUDE_PATH} +export PYTHONPATH=\${PYTHONPATH}:"\${QPACKAGE_ROOT}"/scripts +export PATH=\${PATH}:"\${QPACKAGE_ROOT}"/scripts +export PATH=\${PATH}:"\${QPACKAGE_ROOT}"/bin +export PATH=\${PATH}:"\${QPACKAGE_ROOT}"/ocaml +source "\${QPACKAGE_ROOT}"/bin/irpman" &> /dev/null source "\${OCAMLBREW_BASE}"/ocaml-4*/etc/ocamlbrew.bashrc &> /dev/null EOF