From 62e78049c210ddf916fa372c3d3cb5cdf87110ed Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 2 Jun 2015 01:48:43 +0200 Subject: [PATCH] Bash/ezfio.sh --- .gitignore | 18 +++ Bash/.empty | 0 Bash/ezfio.sh | 270 ++++++++++++++++++++++++++++++++++++++++++++- Makefile | 8 +- README | 86 --------------- build.ninja | 22 ++++ configure.py | 130 +++++++++++++++++++--- src/create_bash.py | 4 +- 8 files changed, 429 insertions(+), 109 deletions(-) create mode 100644 Bash/.empty delete mode 100644 README create mode 100644 build.ninja diff --git a/.gitignore b/.gitignore index ee0d897..a0f2136 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,19 @@ update.sh +Python/ezfio.py +Ocaml/ezfio.ml +Bash/ezfio.sh +.ninja_deps +.ninja_log +generated.ninja +lib/libezfio.a +lib/libezfio_irp.a +make.config +src/IRPF90_man/ +src/IRPF90_temp/ +src/irpf90.make +src/irpf90_entities +src/libezfio_groups-gen.py +src/libezfio_util-gen.py +src/*.pyc +src/run +src/tags diff --git a/Bash/.empty b/Bash/.empty new file mode 100644 index 0000000..e69de29 diff --git a/Bash/ezfio.sh b/Bash/ezfio.sh index c901bc3..e43c9e4 100644 --- a/Bash/ezfio.sh +++ b/Bash/ezfio.sh @@ -1,4 +1,272 @@ #!/bin/bash -# TODO +function _ezfio_usage() +{ + echo " +Usage: + ezfio set_file EZFIO_DIRECTORY + ezfio unset_file + ezfio has DIRECTORY ITEM + ezfio get DIRECTORY ITEM + ezfio set DIRECTORY ITEM VALUE : Scalar values + ezfio set DIRECTORY ITEM : Array values read from stdin + + ezfio set_verbose + ezfio unset_verbose +" +} + +function _require_ezfio_file() +{ + if [[ -z ${EZFIO_FILE} ]] + then + echo "EZFIO directory not set: try 'ezfio set_file'" + return 1 + fi + + if [[ ! -d ${EZFIO_FILE} ]] + then + echo "EZFIO directory not accessible: try 'ezfio set_file'" + return 1 + fi +} + +function _require_first_argument() +{ + if [[ -z $1 ]] + then + _ezfio_usage + echo "Error: First argument not set" + return 1 + else + return 0 + fi +} + +function _require_second_argument() +{ + if [[ -z $2 ]] + then + _ezfio_usage + echo "Error: Second argument not set" + return 1 + fi +} + +function _ezfio_set_verbose() +{ + function _ezfio_info() + { + echo "$1" + } + return 0 +} + +function _ezfio_unset_verbose() +{ + function _ezfio_info() + { + : + } + return 0 +} + +function _ezfio_set_file() +{ + _require_first_argument $@ || return 1 + + if [[ ! -d $1 ]] + then + echo "No such directory: $1" + return 1 + fi + export EZFIO_FILE=$1 + _ezfio_info "Set file ${EZFIO_FILE}" + return 0 +} + +function _ezfio_unset_file() +{ + _require_ezfio_file || return 1 + _ezfio_info "Unset file ${EZFIO_FILE}" + unset EZFIO_FILE + return 0 +} + +function _ezfio_has() +{ + _require_ezfio_file || return 1 + _require_first_argument $@ || return 1 + + if [[ ! -d ${EZFIO_FILE}/${1,,} ]] + then + return 1 + fi + + if [[ -z $2 ]] + then + return 0 + fi + + if [[ -f ${EZFIO_FILE}/${1,,}/${2,,} ]] + then + _ezfio_info "EZFIO has $1 / $2" + return 0 + elif [[ -f ${EZFIO_FILE}/${1,,}/${2,,}.gz ]] + then + _ezfio_info "EZFIO has $1 / $2" + return 0 + else + _ezfio_info "EZFIO doesn't have $1 / $2" + return 1 + fi +} + +function _ezfio_get() +{ + _require_ezfio_file || return 1 + + if [[ -z $1 ]] + then + ls ${EZFIO_FILE} + return 0 + fi + + _ezfio_has $@ || return 1 + + if [[ -z $2 ]] + then + ls ${EZFIO_FILE}/${1,,} + return 0 + fi + + if [[ -f ${EZFIO_FILE}/${1,,}/${2,,} ]] + then + cat ${EZFIO_FILE}/${1,,}/${2,,} + elif [[ -f ${EZFIO_FILE}/${1,,}/${2,,}.gz ]] + then + zcat ${EZFIO_FILE}/${1,,}/${2,,}.gz + else + _ezfio_info "EZFIO doesn't have $1 / $2" + return 1 + fi + return 0 +} + +function _ezfio_set() +{ + _require_ezfio_file || return 1 + _require_first_argument $@ || return 1 + _require_second_argument $@ || return 2 + + if [[ ! -d ${EZFIO_FILE}/${1,,} ]] + then + mkdir -p ${EZFIO_FILE}/${1,,} + fi + if [[ ! -z "$3" ]] + then + echo "$3" > ${EZFIO_FILE}/${1,,}/${2,,} + else + zcat > ${EZFIO_FILE}/${1,,}/${2,,}.gz + fi + return 0 +} + +#--- + +function ezfio() +{ + case $1 in + "has") + shift + _ezfio_has $@ + ;; + + "set") + shift + _ezfio_set $@ + ;; + + "get") + shift + _ezfio_get $@ + ;; + + "set_file") + shift + _ezfio_set_file $@ + ;; + + "unset_file") + shift + _ezfio_unset_file + ;; + + "set_verbose") + _ezfio_set_verbose + ;; + + "unset_verbose") + _ezfio_unset_verbose + ;; + + *) + _ezfio_usage + ;; + esac + +} + + +_ezfio_unset_verbose + + +# Completion + + +_Complete() +{ + local cur + + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}" + prev2="${COMP_WORDS[COMP_CWORD-2]}" + + case "${prev2}" in + set|has|get) + COMPREPLY=( $(compgen -W "$(cd ${EZFIO_FILE}/${prev} ; ls | sed 's/\.gz//' )" -- $cur ) ) + return 0 + ;; + esac + + case "${prev}" in + unset_file|set_verbose|unset_verbose) + COMPREPLY=() + return 0 + ;; + set_file) + COMPREPLY=( $(compgen -W "$(\ls -d */ | sed 's|/||g')" -- ${cur} ) ) + return 0 + ;; + set|has|get) + COMPREPLY=( $(compgen -W "$(cd ${EZFIO_FILE} ; \ls -d */ | sed 's|/||g')" -- $cur ) ) + return 0 + ;; + *) + if [[ -z ${EZFIO_FILE} ]] + then + COMPREPLY=( $(compgen -W 'set_file \ + set_verbose unset_verbose -h' -- $cur ) ) + else + COMPREPLY=( $(compgen -W 'has get set unset_file \ + set_verbose unset_verbose -h' -- $cur ) ) + fi + return 0 + ;; + esac + +} + +complete -F _Complete ezfio diff --git a/Makefile b/Makefile index e290321..b49b241 100644 --- a/Makefile +++ b/Makefile @@ -31,10 +31,10 @@ default: make.config $(MAKE) -C $$PWD/src clean: - - bash -c "[[ -e lib/libezfio.a ]] && rm $$PWD/lib/*" - - bash -c "[[ -e Python/ezfio.py ]] && rm $$PWD/Python/*" - - bash -c "[[ -e Ocaml/ezfio.ml ]] && rm $$PWD/Ocaml/*" - - bash -c "[[ -e Bash/ezfio.sh ]] && rm $$PWD/Bash/*" + - bash -c "[[ -f lib/libezfio.a ]] && rm $$PWD/lib/*" + - bash -c "[[ -f Python/ezfio.py ]] && rm $$PWD/Python/*" + - bash -c "[[ -f Ocaml/ezfio.ml ]] && rm $$PWD/Ocaml/*" + - bash -c "[[ -f Bash/ezfio.sh ]] && rm $$PWD/Bash/*" - $(MAKE) -C $$PWD/src veryclean archive: distclean diff --git a/README b/README deleted file mode 100644 index 930e644..0000000 --- a/README +++ /dev/null @@ -1,86 +0,0 @@ -====================================================================== - EZFIO -====================================================================== - -Author: A. Scemama, LCPQ-IRSAMC, CNRS-Universite Paul Sabatier -scemama@irsamc.ups-tlse.fr - -== About EZFIO == - - EZFIO is the Easy Fortran I/O library. With EZFIO, your data is organized -in a file system inside a main directory. This main directory contains -subdirectories, which contain files. Each file corresponds to a data. For -atomic data the file is a plain text file, and for array data the file is a -gzipped text file. - - -== Building a library == - -Your EZFIO library is built according to the definitions given in the -files of the 'config' directory. A configuration file can be, for example: ---- - -system - title character*(128) - num_elec integer = system_num_alpha + system_num_beta - num_alpha integer - num_beta integer - -geometry - num_atom integer - nuc_energy double precision - label character*(32) (geometry_num_atom) - atomic_number integer (geometry_num_atom) - charge double precision (geometry_num_atom) - coord double precision (3,geometry_num_atom) - ---- - - A subdirectory is defined by its name at the beginning of a new line. The -data contained in this subdirectory is defined by the triplet -(name,type,dimension), leaving at least one white space at the beginning of the -line. - If the dimension of an array is a data defined in the file, its name can be -used as _. For example, the -dimension '(geometry_num_atom)' uses the data 'num_atom' of subdirectory -'geometry'. - A data can also be the result of a simple operation. In that case, the -simple operation is written after an '=' symbol (as for 'num_elec'). In -that case, the data is read_only. - -Once your configuration file is ready, run 'make' and your library will be -built. - -== Using the library == - - In the following, we will call 'EZFIO file' the main directory containing the -EZFIO data. - -Only one EZFIO file can be manipulated at a time. To select a file, use: - character*(64) :: filename - call ezfio_set_file(filename) -To get the name of the current used EZFIO file, use - character*(64) :: filename - call ezfio_get_filename(filename) - -For each data, 3 subroutines are created. - is the name of the subdirectory which contains the data and - is the name of the data. - -* subroutine ezfio_has__ (result) -sets result to .True. if the data exists in the EZFIO file, .False. otherwise. - -* subroutine ezfio_set__ (source) -writes the source data to the EZFIO file. - -* subroutine ezfio_get__ (destination) -reads the data from the EZFIO file to the destination. - -For safety, a read-only attribute can be set to the file by - call ezfio_set_read_only(.True.) -or inquired by - logical :: is_read_only - call ezfio_is_read_only(is_read_only) - - - diff --git a/build.ninja b/build.ninja new file mode 100644 index 0000000..dcd17ad --- /dev/null +++ b/build.ninja @@ -0,0 +1,22 @@ +include version + +rule build_generated_ninja + command = python configure.py + description = Creating generated.ninja + generator = 1 + +rule run_ninja + command = ninja -f $in + +rule build_archive + command = git archive --format=tar HEAD > EZFIO.${version}.tar && mkdir -p EZFIO && cd EZFIO && tar -xvf ../EZFIO.${version}.tar && cd .. && rm EZFIO.${version}.tar && tar -zcvf EZFIO.${version}.tar.gz EZFIO && rm -rf EZFIO + description = Building archive + +build make.config generated.ninja: build_generated_ninja | configure.py + +build all: run_ninja generated.ninja +default all + +build EZFIO.${VERSION}.tar.gz: build_archive + +build archive: phony EZFIO.${VERSION}.tar.gz diff --git a/configure.py b/configure.py index 161a246..d6d11cb 100755 --- a/configure.py +++ b/configure.py @@ -2,21 +2,119 @@ import os -if __name__ == '__main__': - - d_default = { - "IRPF90" : 'irpf90', - "FC" : 'gfortran -g -ffree-line-length-none -fPIC', - "FCFLAGS" : '-O2', - "RANLIB" : 'ranlib', - "AR" : 'ar', - "NINJA" : 'ninja' - } +with open("version",'r') as f: + version = f.read().strip().rsplit('=')[1] - with open("make.config",'w') as out: - for var,default in d_default.iteritems(): +d_default = { + "VERSION" : version, + "IRPF90" : 'irpf90', + "FC" : 'gfortran -g -ffree-line-length-none -fPIC', + "FCFLAGS" : '-O2', + "RANLIB" : 'ranlib', + "AR" : 'ar', + "NINJA" : 'ninja', + "CONFIG_FILES" : + ' '.join([ x for x in os.listdir('config') if x != '.empty']) +} + +def create_make_config(): + + with open("make.config",'w') as out: + for var,default in d_default.iteritems(): + try: + cur = os.environ[var] + except KeyError: + cur = default + out.write('{0}={1}\n'.format(var,cur)) + + +def read_make_config(): + result = {} + with open("make.config",'r') as f: + for line in f.readlines(): try: - cur = os.environ[var] - except KeyError: - cur = default - out.write("{0} = {1}\n".format(var,cur)) + key, value = line.strip().split('=') + except: + print "Error in make.config:" + print line + sys.exit(1) + result[key] = value + return result + + +def create_build_ninja(): + + if "make.config" not in os.listdir(os.getcwd()): + create_make_config() + + d = read_make_config() + + d["irpf90_files"] = [ "src/{0}".format(x) for x in + """ + IRPF90_temp/build.ninja irpf90.make irpf90_entities + tags + """.split() ] + \ + """ + Python/ezfio.py Ocaml/ezfio.ml Bash/ezfio.sh + """.split() + + d["irpf90_sources"] = [ "src/{0}".format(x) for x in + """ + libezfio_error.irp.f create_ocaml.py groups_templates.py + libezfio_file.irp.f create_python.py libezfio_groups-gen.py + libezfio_groups.irp.f ezfio-head.py libezfio_util-gen.py + libezfio_util.irp.f ezfio-tail.py read_config.py run.irp.f + f_types.py test.py create_bash.py groups.py + """.split() ] + [ "make.config" ] + + d["irpf90_files"] = ' '.join(d["irpf90_files"]) + d["irpf90_sources"] = ' '.join(d["irpf90_sources"]) + + + template = """ +rule build_archive + command = git archive --format=tar HEAD > EZFIO.{VERSION}.tar && mkdir -p EZFIO && cd EZFIO && tar -xvf ../EZFIO.{VERSION}.tar && cd .. && rm EZFIO.{VERSION}.tar && tar -zcvf EZFIO.{VERSION}.tar.gz EZFIO && rm -rf EZFIO + description = Building archive + +rule build_make_config + command = python configure.py + description = Creating make.config + +rule compile_irpf90 + command = cd src ; {IRPF90} --ninja + description = Compiling IRPF90 + +rule build_irpf90_a + command = {NINJA} -C src/IRPF90_temp + description = Compiling Fortran files + +rule build_libezfio_a + command = cp src/IRPF90_temp/irpf90.a lib/libezfio.a ; {RANLIB} lib/libezfio.a + description = Building libezfio.a + +rule build_libezfio_irp_a + command = cp lib/libezfio.a lib/libezfio_irp.a ; {AR} dv lib/libezfio_irp.a irp_stack.irp.o ; {RANLIB} lib/libezfio_irp.a + description = Building libezfio_irp.a + + + +build make.config: build_make_config | configure.py + +build {irpf90_files}: compile_irpf90 | {irpf90_sources} + +build src/IRPF90_temp/irpf90.a: build_irpf90_a | {irpf90_files} + +build lib/libezfio.a: build_libezfio_a | src/IRPF90_temp/irpf90.a + +build lib/libezfio_irp.a: build_libezfio_irp_a | lib/libezfio.a + + +""" + + with open('generated.ninja','w') as f: + f.write(template.format(**d)) + + +if __name__ == '__main__': + + create_build_ninja() diff --git a/src/create_bash.py b/src/create_bash.py index 21099c7..036d2a0 100755 --- a/src/create_bash.py +++ b/src/create_bash.py @@ -77,13 +77,13 @@ def run(): 'let has_%(group)s_%(var)s () = has_array "%(group)s" "%(var)s" ;;' %(d) ] - file = open('ezfio.ml','r') + file = open('ezfio.sh','r') template = file.read() file.close() template = template.replace("(*$HEAD*)",'\n'.join(head)) template = template.replace("(*$TAIL*)",'\n'.join(tail)) - file = open('../Ocaml/ezfio.ml','w') + file = open('../Bash/ezfio-gen.sh','w') file.write(template) file.close()