Removed Ninja

Version:1.4.0

Version:1.4.0
This commit is contained in:
Anthony Scemama 2019-01-21 23:21:20 +01:00
parent 744cbac511
commit fa6d40a857
15 changed files with 127 additions and 251 deletions

View File

@ -1,4 +1,7 @@
#!/bin/bash #!/bin/bash
#
# ezfio shell command with completion
#
EZFIO_ROOT=$( cd $(dirname "${BASH_SOURCE}")/.. ; pwd -P ) EZFIO_ROOT=$( cd $(dirname "${BASH_SOURCE}")/.. ; pwd -P )

View File

@ -1,4 +1,4 @@
GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE
Version 2, June 1991 Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc., Copyright (C) 1989, 1991 Free Software Foundation, Inc.,

View File

@ -38,19 +38,15 @@ clean:
- bash -c "[[ -f Bash/ezfio.sh ]] && rm $$PWD/Bash/*" - bash -c "[[ -f Bash/ezfio.sh ]] && rm $$PWD/Bash/*"
- $(MAKE) -C $$PWD/src veryclean - $(MAKE) -C $$PWD/src veryclean
archive: distclean archive: veryclean
git archive --format=tar HEAD > EZFIO.$(VERSION).tar git archive --format=tar HEAD > EZFIO.$(VERSION).tar
mkdir EZFIO ; cd EZFIO ; tar -xvf ../EZFIO.$(VERSION).tar mkdir EZFIO ; cd EZFIO ; tar -xvf ../EZFIO.$(VERSION).tar
rm EZFIO.$(VERSION).tar rm EZFIO.$(VERSION).tar
tar -zcvf EZFIO.$(VERSION).tar.gz EZFIO tar -zcvf EZFIO.$(VERSION).tar.gz EZFIO
rm -rf EZFIO rm -rf EZFIO
make.config:
./configure.py
veryclean: veryclean:
$(MAKE) -C src veryclean $(MAKE) -C src veryclean
rm -f make.config
rm -f Ocaml/ezfio.ml rm -f Ocaml/ezfio.ml
rm -f Python/ezfio.py rm -f Python/ezfio.py
rm -f lib/{libezfio.a,libezfio_irp.a} rm -f lib/{libezfio.a,libezfio_irp.a}

View File

@ -4,13 +4,13 @@ EZFIO
EZFIO is the Easy Fortran I/O library generator. It generates EZFIO is the Easy Fortran I/O library generator. It generates
automatically an I/O library from a simple configuration file. The automatically an I/O library from a simple configuration file. The
produced library contains Fortran subroutines to read/write the data produced library contains Fortran subroutines to read/write the data
from/to disk, and to check if the data exists. from/to disk, and to check if the data exists. A Python and an Ocaml API
A Python and an Ocaml API are also provided. are also provided.
With EZFIO, the data is organized in a file system inside a main With EZFIO, the data is organized in a file system inside a main
directory. This main directory contains subdirectories, which contain directory. This main directory contains subdirectories, which contain
files. Each file corresponds to a data. For atomic data the file is a 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. plain text file, and for array data the file is a gzipped text file.
Download Download
======== ========
@ -19,7 +19,8 @@ The following packages are needed:
* `IRPF90 <http://irpf90.ups-tlse.fr>`_ * `IRPF90 <http://irpf90.ups-tlse.fr>`_
* `Python <http://www.python.org>`_ * `Python <http://www.python.org>`_
* `GNU make <http://www.python.org>`_ or `Ninja <http://github.com/martine/ninja>`_ * `GNU make <https://www.gnu.org/software/make>`_
* `Zlib <https://www.zlib.net>`_
Tutorial Tutorial
@ -32,7 +33,8 @@ the 3D space.
Preparation of the library Preparation of the library
-------------------------- --------------------------
Create an empty directory for your project and unpack the ``EZFIO.tar.gz`` file in this directory. This directory now contains: Create an empty directory for your project and unpack the
``EZFIO.tar.gz`` file in this directory. This directory now contains:
.. code-block:: bash .. code-block:: bash
@ -40,9 +42,8 @@ Create an empty directory for your project and unpack the ``EZFIO.tar.gz`` file
EZFIO/ EZFIO/
Get into the ``EZFIO`` directory and configure the library to produce the Get into the ``EZFIO`` directory and configure the library to produce the
desired suboutines. Get into the ``config`` directory and create a new file desired suboutines. Get into the ``config`` directory and create a new
``test.config`` file ``test.config`` containing::
containing::
molecule molecule
num_atoms integer num_atoms integer
@ -56,14 +57,13 @@ containing::
In this example, ``molecule`` and ``properties`` are containers of data. In this example, ``molecule`` and ``properties`` are containers of data.
Those are defined in the config file by their name at the beginning of a Those are defined in the config file by their name at the beginning of a
new line. new line. Each data contained inside a container is characterized by a
Each data contained inside a container is characterized by a triplet triplet (name,type,dimension), preceded by at least one white space at
(name,type,dimension), preceded by at least one white space at the the beginning of the line.
beginning of the line.
If the dimension of an array is a data, the name of the data can be used If the dimension of an array is a data, the name of the data can be
as ``<container>_<data>`` in the definition of the dimension. For used as ``<container>_<data>`` in the definition of the dimension.
example, the dimension (``molecule_num_atoms``) uses the data For example, the dimension (``molecule_num_atoms``) uses the data
``num_atoms`` of container ``molecule``. ``num_atoms`` of container ``molecule``.
Data can also be the result of a simple operation. In that case, the Data can also be the result of a simple operation. In that case, the
@ -83,16 +83,10 @@ Now, go back to the EZFIO root directory. To build with GNU make, run:
$ make $ make
Or you can use Ninja to build the library: The ``lib`` directory now contains the static library ``libezfio.a``,
and a static library for use under the IRPF90 environment
.. code-block:: bash (``libezfio_irp.a``). The ``Python``, ``Ocaml`` and ``Bash`` directories
contain the binding for these languages.
$ ninja
The ``lib`` directory now contains the static library ``libezfio.a``, and a static
library for use under the IRPF90 environment (``libezfio_irp.a``).
The ``Python``, ``Ocaml`` and ``Bash`` directories contain the binding for these languages.
Using the produced library Using the produced library
@ -232,7 +226,8 @@ Execute the script:
$ python2 create_input.py $ python2 create_input.py
18.0 18.0
The printed mass is correct, and a new directory (``Water``) was created with our data: The printed mass is correct, and a new directory (``Water``) was created
with our data:
.. code-block:: bash .. code-block:: bash
@ -309,12 +304,12 @@ the EZFIO file.
end end
Compile the fortran program and link it the ``libezfio.a`` library, and run the Compile the fortran program and link it the ``libezfio.a`` library and
executable. ``zlib``, and run the executable.
.. code-block:: bash .. code-block:: bash
$ gfortran test.f90 EZFIO/lib/libezfio.a -o test.x $ gfortran test.f90 EZFIO/lib/libezfio.a -lz -o test.x
$ ./test.x $ ./test.x
Data in the EZFIO file: Data in the EZFIO file:
16.0000000 0.00000000 0.222396001 0.00000000 16.0000000 0.00000000 0.222396001 0.00000000
@ -362,7 +357,8 @@ The usage of the ``ezfio`` bash command is::
ezfio unset_verbose ezfio unset_verbose
Here is the same script as the Python script, but using Bash (``create_input.sh``): Here is the same script as the Python script, but using Bash
(``create_input.sh``):
.. code-block:: bash .. code-block:: bash

View File

@ -1,31 +0,0 @@
include version
rule build_generated_ninja
command = python2 configure.py
description = Creating generated.ninja
rule run_ninja
command = bash -c 'source .make.config.sh ; $$NINJA -f $in'
description = Building Fortran library
pool = console
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 clean_all
command = bash -c 'source .make.config.sh ; bash -c "$$NINJA -f $in -t clean ; $$NINJA -t clean" ; rm -rf src/IRPF90_{temp,man} src/*.pyc'
description = Cleaning directory
build make.config .make.config.sh generated.ninja impossible_target: build_generated_ninja
build all: run_ninja generated.ninja
default all
build EZFIO.${VERSION}.tar.gz: build_archive
build archive: phony EZFIO.${VERSION}.tar.gz
build clean: clean_all generated.ninja

View File

@ -1,146 +0,0 @@
#!/usr/bin/env python2
import os,sys
def write_if_different(filename,s):
try:
with open(filename, "r") as f:
ref = f.read()
except:
ref = ""
if ref == s:
return
else:
with open(filename, "w") as f:
f.write(s)
with open("version",'r') as f:
version = f.read().strip().rsplit('=')[1]
d_default = {
"VERSION" : version,
"IRPF90" : 'irpf90',
"FC" : 'gfortran -g -ffree-line-length-none -fPIC -fopenmp',
"FCFLAGS" : '-O2',
"RANLIB" : 'ranlib',
"AR" : 'ar',
"BUILD_SYSTEM" : 'make',
"NINJA" : 'ninja',
}
CONFIG_FILES=' '.join([ os.path.join("config",x) for x in os.listdir('config') if x != '.empty'])
def create_make_config():
try:
d = read_make_config()
except:
d = {}
fmt = { "make.config" :'{0}={1}\n' ,
".make.config.sh": 'export {0}="{1}"\n' }
for var,default in d_default.iteritems():
if var not in d:
try:
cur = os.environ[var]
except KeyError:
cur = default
d[var]=cur
for filename in fmt:
out = ""
for var,default in d_default.iteritems():
cur = d[var]
out += fmt[filename].format(var,cur)
write_if_different(filename,out)
return d
def read_make_config():
result = {}
with open("make.config",'r') as f:
for line in f.readlines():
try:
key, value = line.strip().split('=',1)
except:
print "Error in make.config:"
print line
sys.exit(1)
result[key] = value
return result
def create_build_ninja():
d=create_make_config()
d["irpf90_files"] = [ "src/{0}".format(x) for x in
"""
IRPF90_temp/build.ninja irpf90.make irpf90_entities
tags libezfio_groups-gen.py libezfio_util-gen.py
""".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.irp.f ezfio-head.py
libezfio_util.irp.f ezfio-tail.py read_config.py
f_types.py test.py groups.py
""".split() ] + [ "make.config" ]
d["irpf90_files"] = ' '.join(d["irpf90_files"])
d["irpf90_sources"] = ' '.join(d["irpf90_sources"])
template = """
rule compile_irpf90
command = bash -c 'source .make.config.sh ; cd src ; {IRPF90} --ninja'
description = Compiling IRPF90
rule build_irpf90_a
command = {NINJA} -C src/IRPF90_temp && touch $out
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 > /dev/null ; {RANLIB} lib/libezfio_irp.a
description = Building libezfio_irp.a
rule build_python
command = cd src ; python2 create_python.py
description = Building Python module
rule build_ocaml
command = cd src ; python2 create_ocaml.py
description = Building Ocaml module
build {irpf90_files}: compile_irpf90 | {irpf90_sources} {CONFIG_FILES}
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
build Python/ezfio.py: build_python | lib/libezfio.a
build Ocaml/ezfio.ml: build_ocaml | lib/libezfio.a
"""
d["CONFIG_FILES"] = CONFIG_FILES
write_if_different('generated.ninja',template.format(**d))
if __name__ == '__main__':
create_build_ninja()

View File

@ -5,6 +5,6 @@ cd ../.git/hooks/
for i in commit-msg post-commit for i in commit-msg post-commit
do do
rm $i rm --force -- $i
ln -s $OLD_DIR/$i $PWD/$i ln -s $OLD_DIR/$i $PWD/$i
done done

9
make.config Normal file
View File

@ -0,0 +1,9 @@
VERSION ?= 1.4.0
RANLIB ?= ranlib
IRPF90 ?= irpf90
CC ?= gcc
FC ?= gfortran -g -ffree-line-length-none -fPIC # -fopenmp
FCFLAGS ?= -fPIC
AR ?= ar
RANLIB ?= ranlib
PYTHON ?= python2

View File

@ -29,7 +29,7 @@ export
include irpf90.make include irpf90.make
irpf90.make: $(wildcard *.irp.f) ../config/* system.c irpf90.make: $(wildcard *.irp.f) ../config/* IRPF90_temp/system.o IRPF90_temp/system_f.o
$(IRPF90) $(IRPF90)
include ../version include ../version
@ -40,28 +40,30 @@ all: static ../Python/ezfio.py ../Ocaml/ezfio.ml
static: ../lib/libezfio.a ../lib/libezfio_irp.a static: ../lib/libezfio.a ../lib/libezfio_irp.a
system_c.o: system_c.c IRPF90_temp/system.o: system.c
$(CC) -c system_c -o system_c.o mkdir -p IRPF90_temp/
$(CC) -c system.c -o IRPF90_temp/system.o
system_f.o: system_f.f90 IRPF90_temp/system_f.o: system_f.f90
$(FC) -c system_f.f90 -o system_f.o mkdir -p IRPF90_temp/
$(FC) -c system_f.f90 -o IRPF90_temp/system_f.o && cp system.mod IRPF90_temp/
../lib/libezfio.a: IRPF90_temp/irpf90.a ../lib/libezfio.a: IRPF90_temp/irpf90.a
rm -f ../lib/libezfio.a rm -f ../lib/libezfio.a
$(AR) cru ../lib/libezfio.a system_c.o system_f.o $(OBJ1) $(AR) cru ../lib/libezfio.a IRPF90_temp/system_f.o IRPF90_temp/system.o $(OBJ1)
$(RANLIB) ../lib/libezfio.a $(RANLIB) ../lib/libezfio.a
../lib/libezfio_irp.a: ../lib/libezfio.a ../lib/libezfio_irp.a: ../lib/libezfio.a
rm -f ../lib/libezfio_irp.a rm -f ../lib/libezfio_irp.a
cp ../lib/libezfio.a ../lib/libezfio_irp.a cp ../lib/libezfio.a ../lib/libezfio_irp.a
$(AR) dv ../lib/libezfio_irp.a irp_stack.irp.o system_c.o system_f.o $(AR) dv ../lib/libezfio_irp.a irp_stack.irp.o
$(RANLIB) ../lib/libezfio_irp.a $(RANLIB) ../lib/libezfio_irp.a
../Python/ezfio.py: ../lib/libezfio.a ../Python/ezfio.py: ../lib/libezfio.a
python2 create_python.py $(PYTHON) create_python.py
../Ocaml/ezfio.ml: ../lib/libezfio.a ../Ocaml/ezfio.ml: ../lib/libezfio.a
python2 create_ocaml.py $(PYTHON) create_ocaml.py

View File

@ -148,7 +148,7 @@ subroutine ezfio_set_file(filename_in)
character*(*) :: filename_in character*(*) :: filename_in
character(8) :: date character(8) :: date
character(10) :: time character(73) :: time
character(32) :: user character(32) :: user
if (filename_in == '') then if (filename_in == '') then
@ -163,13 +163,13 @@ subroutine ezfio_set_file(filename_in)
! using keyword arguments ! using keyword arguments
call date_and_time(DATE=date,TIME=time) call date_and_time(DATE=date,TIME=time)
open (unit=10, file=trim(libezfio_filename)//'/ezfio/creation', ACTION='WRITE', STATUS='UNKNOWN') open (unit=73, file=trim(libezfio_filename)//'/ezfio/creation', ACTION='WRITE', STATUS='UNKNOWN')
write(10,*), time, ' ', date write(73,*) time, ' ', date
close(10) close(73)
open (unit=10, file=trim(libezfio_filename)//'/ezfio/user', ACTION='WRITE', STATUS='UNKNOWN') open (unit=73, file=trim(libezfio_filename)//'/ezfio/user', ACTION='WRITE', STATUS='UNKNOWN')
call getenv('USER',user) call getenv('USER',user)
write(10,*) user write(73,*) user
close(10) close(73)
endif endif
TOUCH libezfio_filename TOUCH libezfio_filename

View File

@ -22,6 +22,7 @@
! 31062 Toulouse Cedex 4 ! 31062 Toulouse Cedex 4
! scemama@irsamc.ups-tlse.fr ! scemama@irsamc.ups-tlse.fr
BEGIN_PROVIDER [ integer, PID ] BEGIN_PROVIDER [ integer, PID ]
&BEGIN_PROVIDER [ character*(256), PID_str ] &BEGIN_PROVIDER [ character*(256), PID_str ]
implicit none implicit none
@ -64,7 +65,7 @@ subroutine ezfio_mkdir(path)
call ezfio_error(irp_here,'Read-only file.') call ezfio_error(irp_here,'Read-only file.')
endif endif
if (.not.ezfio_exists(path)) then if (.not.ezfio_exists(path)) then
call mkdir(trim(path)) call mkdir(trim(path)//char(0))
open(unit=libezfio_iunit,file=trim(path)//'/.version') open(unit=libezfio_iunit,file=trim(path)//'/.version')
write(libezfio_iunit,'(A)') libezfio_version write(libezfio_iunit,'(A)') libezfio_version
close(libezfio_iunit) close(libezfio_iunit)
@ -73,6 +74,7 @@ end subroutine
subroutine libezfio_openz(filename,mode,err) subroutine libezfio_openz(filename,mode,err)
use system
implicit none implicit none
BEGIN_DOC BEGIN_DOC
! Opens a compressed file ! Opens a compressed file
@ -84,7 +86,7 @@ subroutine libezfio_openz(filename,mode,err)
err=1 err=1
if (mode(1:1) == 'r') then if (mode(1:1) == 'r') then
call system('zcat '//trim(filename)//' > '//trim(fifo)) call zcat(trim(filename)//char(0), trim(fifo)//char(0))
open(unit=libezfio_iunit,file=trim(fifo),form='FORMATTED',action='READ') open(unit=libezfio_iunit,file=trim(fifo),form='FORMATTED',action='READ')
err=0 err=0
else if (mode(1:1) == 'w') then else if (mode(1:1) == 'w') then
@ -118,6 +120,7 @@ subroutine libezfio_reopenz_unformatted(filename,mode,err)
end end
subroutine libezfio_closez(filename,mode) subroutine libezfio_closez(filename,mode)
use system
implicit none implicit none
BEGIN_DOC BEGIN_DOC
! Closes a compressed file ! Closes a compressed file
@ -127,7 +130,7 @@ subroutine libezfio_closez(filename,mode)
fifo = trim(filename)//'.'//trim(PID_str) fifo = trim(filename)//'.'//trim(PID_str)
if (mode(1:1) == 'w') then if (mode(1:1) == 'w') then
close(unit=libezfio_iunit) close(unit=libezfio_iunit)
call system('gzip -c < '//trim(fifo)//' > '//trim(filename)) call gzip(trim(fifo)//char(0), trim(filename)//char(0))
open(unit=libezfio_iunit,file=trim(fifo),form='FORMATTED',action='WRITE') open(unit=libezfio_iunit,file=trim(fifo),form='FORMATTED',action='WRITE')
endif endif
close(unit=libezfio_iunit,status='DELETE') close(unit=libezfio_iunit,status='DELETE')

45
src/system.c Normal file
View File

@ -0,0 +1,45 @@
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "zlib.h"
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
void fortran_mkdir(char* filename) {
if (mkdir (filename, S_IRWXU)) {
perror (strerror (errno));
}
}
#define BUFSIZE 16384
void gzip(char* filename, char* output) {
FILE* in = fopen(filename,"r");
gzFile out = gzopen(output,"w");
char buffer[BUFSIZE];
unsigned int size;
while (!feof(in)) {
size = (unsigned int) fread (buffer, sizeof(char), BUFSIZE, in);
gzwrite(out, buffer, size);
}
fclose(in);
gzclose(out);
}
void zcat(char* filename, char* output) {
gzFile in = gzopen(filename,"r");
FILE* out = fopen(output,"w");
char buffer[BUFSIZE];
int size;
while (!gzeof(in)) {
size = gzread (in, buffer, BUFSIZE);
fwrite(buffer, sizeof(char), (size_t) size, out);
}
gzclose(in);
fclose(out);
}

View File

@ -1,13 +0,0 @@
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <string.h>
void ezfio_mkdir(char* filename) {
errno = 0;
if (mkdir (filename, S_IRWXU)) {
perror (strerror (errno));
}
}

View File

@ -1,5 +1,4 @@
MODULE system module system
USE iso_c_binding USE iso_c_binding
INTERFACE INTERFACE
@ -7,6 +6,19 @@ MODULE system
USE iso_c_binding USE iso_c_binding
CHARACTER(kind=C_CHAR),INTENT(in) :: filename(*) CHARACTER(kind=C_CHAR),INTENT(in) :: filename(*)
END SUBROUTINE END SUBROUTINE
END INTERFACE
END MODULE SUBROUTINE gzip(filename,output) BIND(C,name="gzip")
USE iso_c_binding
CHARACTER(kind=C_CHAR),INTENT(in) :: filename(*)
CHARACTER(kind=C_CHAR),INTENT(in) :: output(*)
END SUBROUTINE
SUBROUTINE zcat(filename,output) BIND(C,name="zcat")
USE iso_c_binding
CHARACTER(kind=C_CHAR),INTENT(in) :: filename(*)
CHARACTER(kind=C_CHAR),INTENT(in) :: output(*)
END SUBROUTINE
END INTERFACE
end module

View File

@ -1 +1 @@
VERSION=1.3.5 VERSION=1.4.0