2015-05-18 10:09:45 +02:00
|
|
|
#!/usr/bin/env python
|
|
|
|
# -*- coding: utf-8 -*-
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
2015-06-04 16:40:00 +02:00
|
|
|
Usage: qp_create_ninja.py (--development | --production) CONFIG_FILE
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
2015-05-18 10:09:45 +02:00
|
|
|
|
|
|
|
import os
|
2015-05-26 16:08:52 +02:00
|
|
|
import sys
|
2015-05-27 11:02:13 +02:00
|
|
|
import glob
|
2015-05-18 10:09:45 +02:00
|
|
|
from os.path import join
|
2015-05-25 16:07:32 +02:00
|
|
|
from collections import namedtuple
|
2015-06-03 17:52:41 +02:00
|
|
|
from collections import defaultdict
|
2015-05-25 16:07:32 +02:00
|
|
|
|
|
|
|
try:
|
2015-06-04 16:40:00 +02:00
|
|
|
from module_handler import ModuleHandler
|
2015-05-26 16:08:52 +02:00
|
|
|
from read_compilation_cfg import get_compilation_option
|
2015-06-02 15:46:01 +02:00
|
|
|
from docopt import docopt
|
2015-05-25 16:07:32 +02:00
|
|
|
except ImportError:
|
|
|
|
print "source .quantum_package.rc"
|
2015-05-26 16:08:52 +02:00
|
|
|
sys.exit(1)
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
# __
|
|
|
|
# /__ | _ |_ _. | _. ._ o _. |_ | _ _
|
|
|
|
# \_| | (_) |_) (_| | \/ (_| | | (_| |_) | (/_ _>
|
|
|
|
#
|
|
|
|
|
2015-06-08 14:49:10 +02:00
|
|
|
QP_ROOT = os.environ['QP_ROOT']
|
|
|
|
QP_ROOT_SRC = join(QP_ROOT, 'src')
|
|
|
|
QP_ROOT_EZFIO = join(QP_ROOT, 'install', 'EZFIO')
|
2015-06-02 15:46:01 +02:00
|
|
|
|
2015-06-08 14:49:10 +02:00
|
|
|
EZFIO_LIB = join(QP_ROOT, "lib", "libezfio.a")
|
2015-06-02 15:46:01 +02:00
|
|
|
|
|
|
|
#
|
|
|
|
# |\ | _. ._ _ _ _| _|_ ._ | _
|
|
|
|
# | \| (_| | | | (/_ (_| |_ |_| |_) | (/_
|
|
|
|
# |
|
|
|
|
Path = namedtuple('Path', ['abs', 'rel'])
|
|
|
|
EZ_config_path = namedtuple('EZ_config', ['path_in_module', 'path_in_ezfio'])
|
2015-06-02 18:40:24 +02:00
|
|
|
EZ_handler = namedtuple('EZ_handler', ['ez_module', 'ez_cfg', 'ez_interface',
|
|
|
|
'ez_config'])
|
2015-06-02 15:46:01 +02:00
|
|
|
Sym_link = namedtuple('Sym_link', ['source', 'destination'])
|
|
|
|
|
|
|
|
|
2015-05-28 12:03:14 +02:00
|
|
|
# _
|
|
|
|
# |_ ._ _. ._ o _. |_ | _ _
|
|
|
|
# |_ | | \/ \/ (_| | | (_| |_) | (/_ _>
|
|
|
|
def ninja_create_env_variable(pwd_config_file):
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
|
|
|
Return some ninja varible with the env variable expanded
|
|
|
|
FC, FCFLAGS, IRPF90, IRPF90_FLAGS
|
|
|
|
The env variable is usefull for the generation of EZFIO, and IRPF90
|
|
|
|
"""
|
2015-05-28 12:03:14 +02:00
|
|
|
l_string = []
|
|
|
|
for flag in ["FC", "FCFLAGS", "IRPF90", "IRPF90_FLAGS"]:
|
2015-06-02 18:40:24 +02:00
|
|
|
str_ = "{0} = {1}".format(flag, get_compilation_option(pwd_config_file,
|
|
|
|
flag))
|
2015-05-28 12:03:14 +02:00
|
|
|
l_string.append(str_)
|
|
|
|
|
|
|
|
lib_lapack = get_compilation_option(pwd_config_file, "LAPACK_LIB")
|
2015-06-08 12:35:40 +02:00
|
|
|
l_string.append("{0} = {1} {2}".format("LIB", lib_lapack, EZFIO_LIB))
|
2015-05-28 12:03:14 +02:00
|
|
|
|
|
|
|
l_string.append("")
|
|
|
|
|
|
|
|
return l_string
|
|
|
|
|
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
# __
|
|
|
|
# /__ _ ._ _ _. | _ _
|
|
|
|
# \_| (/_ | | (/_ (_| | (_) (_| \/
|
|
|
|
# _| /
|
|
|
|
def dict_module_genelogy_path(d_module_genelogy):
|
|
|
|
"""
|
|
|
|
Just a dict with relative, and absolue path for the
|
|
|
|
d_module_genelogy
|
|
|
|
"""
|
|
|
|
d = dict()
|
|
|
|
for module_rel, l_children_rel in d_module_genelogy.iteritems():
|
2015-06-08 14:49:10 +02:00
|
|
|
module_abs = join(QP_ROOT_SRC, module_rel)
|
2015-06-02 18:40:24 +02:00
|
|
|
|
|
|
|
p = Path(module_abs, module_rel)
|
2015-06-02 15:46:01 +02:00
|
|
|
try:
|
2015-06-08 14:49:10 +02:00
|
|
|
d[p] = Path(join(QP_ROOT_SRC, l_children_rel),
|
2015-06-02 18:40:24 +02:00
|
|
|
l_children_rel)
|
2015-06-02 15:46:01 +02:00
|
|
|
except:
|
2015-06-08 14:49:10 +02:00
|
|
|
d[p] = [Path(join(QP_ROOT_SRC, children), children)
|
2015-06-02 18:40:24 +02:00
|
|
|
for children in l_children_rel]
|
2015-06-02 15:46:01 +02:00
|
|
|
|
|
|
|
return d
|
|
|
|
|
2015-05-18 10:09:45 +02:00
|
|
|
# _ __ _ ___ _ _
|
|
|
|
# |_ / |_ | / \ _ _|_ _
|
|
|
|
# |_ /_ | _|_ \_/ o (_ | (_|
|
|
|
|
# _|
|
2015-05-28 12:03:14 +02:00
|
|
|
|
2015-06-02 18:40:24 +02:00
|
|
|
|
2015-05-25 16:07:32 +02:00
|
|
|
def get_l_module_with_ezfio_cfg():
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
|
|
|
Return all the module who have a EZFIO.cfg
|
|
|
|
"""
|
2015-05-21 11:30:15 +02:00
|
|
|
from os import listdir
|
|
|
|
from os.path import isfile, join
|
2015-06-08 14:49:10 +02:00
|
|
|
qp_src = QP_ROOT_SRC
|
2015-05-21 11:30:15 +02:00
|
|
|
|
2015-06-02 18:40:24 +02:00
|
|
|
return [join(qp_src, m) for m in listdir(qp_src)
|
|
|
|
if isfile(join(qp_src, m, "EZFIO.cfg"))]
|
2015-05-21 11:30:15 +02:00
|
|
|
|
|
|
|
|
2015-05-28 12:03:14 +02:00
|
|
|
def get_l_ezfio_config():
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
|
|
|
Return a namedtuple('EZ_config', ['path_in_module', 'path_in_ezfio'])
|
|
|
|
"""
|
2015-05-21 11:30:15 +02:00
|
|
|
|
2015-05-25 16:07:32 +02:00
|
|
|
l = []
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-06-08 14:49:10 +02:00
|
|
|
cmd = "{0}/*/*.ezfio_config".format(QP_ROOT_SRC)
|
2015-05-25 16:07:32 +02:00
|
|
|
for path_in_module in glob.glob(cmd):
|
|
|
|
name_lower = os.path.split(path_in_module)[1].lower()
|
2015-06-08 14:49:10 +02:00
|
|
|
path_in_ezfio = join(QP_ROOT_EZFIO, "config", name_lower)
|
2015-05-25 16:07:32 +02:00
|
|
|
l.append(EZ_config_path(path_in_module, path_in_ezfio))
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-05-25 16:07:32 +02:00
|
|
|
return l
|
2015-05-18 10:09:45 +02:00
|
|
|
|
|
|
|
|
|
|
|
def ninja_ezfio_cfg_rule():
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
|
|
|
Return the ezfio_interface rule who will create
|
|
|
|
the _ezfio_interface.irp.f the _ezfio_config from the EZFIO.cfg
|
|
|
|
"""
|
|
|
|
|
|
|
|
l_string = ["rule build_ezfio_interface",
|
2015-06-02 18:40:24 +02:00
|
|
|
" command = ei_handler.py --path_module $sub_module", ""]
|
2015-05-20 16:01:41 +02:00
|
|
|
|
2015-05-21 11:30:15 +02:00
|
|
|
return l_string
|
|
|
|
|
|
|
|
|
|
|
|
def ninja_ezfio_config_rule():
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
|
|
|
If a ezfio_config existe you just need to move it
|
|
|
|
"""
|
2015-06-02 18:40:24 +02:00
|
|
|
l_string = ["rule build_ezfio_config", " command = cp $in $out", ""]
|
2015-05-21 11:30:15 +02:00
|
|
|
|
|
|
|
return l_string
|
2015-05-20 16:01:41 +02:00
|
|
|
|
|
|
|
|
2015-05-25 16:07:32 +02:00
|
|
|
def get_children_of_ezfio_cfg(l_module_with_ezfio_cfg):
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
|
|
|
From a module list of ezfio_cfg return all the stuff create by him
|
|
|
|
"""
|
2015-06-08 14:49:10 +02:00
|
|
|
config_folder = join(QP_ROOT_EZFIO, "config")
|
2015-05-25 16:07:32 +02:00
|
|
|
|
|
|
|
l_util = dict()
|
2015-05-21 11:30:15 +02:00
|
|
|
|
|
|
|
for m in l_module_with_ezfio_cfg:
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-05-25 16:07:32 +02:00
|
|
|
name_module = os.path.split(m)[1]
|
|
|
|
name_module_lower = name_module.lower()
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-05-25 16:07:32 +02:00
|
|
|
rel = name_module
|
|
|
|
abs_ = m
|
|
|
|
ez_module = Path(abs_, rel)
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-05-25 16:07:32 +02:00
|
|
|
rel = "EZFIO.cfg"
|
|
|
|
abs_ = join(m, "EZFIO.cfg")
|
|
|
|
ez_cfg = Path(abs_, rel)
|
|
|
|
|
|
|
|
rel = "ezfio_interface.irp.f"
|
|
|
|
abs_ = join(m, rel)
|
|
|
|
ez_interface = Path(abs_, rel)
|
|
|
|
|
|
|
|
rel = "{0}.ezfio_interface_config".format(name_module_lower)
|
|
|
|
abs_ = join(config_folder, rel)
|
|
|
|
ez_config = Path(abs_, rel)
|
|
|
|
|
2015-06-02 18:40:24 +02:00
|
|
|
l_util[ez_module.rel] = EZ_handler(ez_module, ez_cfg, ez_interface,
|
2015-06-02 15:46:01 +02:00
|
|
|
ez_config)
|
2015-05-25 16:07:32 +02:00
|
|
|
|
|
|
|
return l_util
|
|
|
|
|
|
|
|
|
|
|
|
def ninja_ezfio_cfg_build(l_util):
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
|
|
|
Return the children created by EZFIO.cfg
|
|
|
|
For us is only ez_interface.irp.f and ez_config
|
|
|
|
"""
|
2015-05-21 11:30:15 +02:00
|
|
|
l_string = []
|
|
|
|
|
2015-05-25 16:07:32 +02:00
|
|
|
for m in l_util.itervalues():
|
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
str_ = "build {1} {2}: build_ezfio_interface {0}"
|
2015-06-02 18:40:24 +02:00
|
|
|
l_string += [str_.format(m.ez_cfg.abs, m.ez_interface.abs,
|
2015-06-02 15:46:01 +02:00
|
|
|
m.ez_config.abs)]
|
|
|
|
|
|
|
|
l_string += [" sub_module = {0}".format(m.ez_module.abs)]
|
|
|
|
l_string += [""]
|
2015-05-21 11:30:15 +02:00
|
|
|
|
2015-05-25 16:07:32 +02:00
|
|
|
return l_string
|
2015-05-21 11:30:15 +02:00
|
|
|
|
2015-05-25 16:07:32 +02:00
|
|
|
|
|
|
|
def ninja_ezfio_config_build(l_ezfio_config):
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
|
|
|
For the ezfio_config present in module move then
|
|
|
|
"""
|
2015-05-25 16:07:32 +02:00
|
|
|
l_string = []
|
2015-05-21 11:30:15 +02:00
|
|
|
|
|
|
|
for m in l_ezfio_config:
|
2015-05-25 16:07:32 +02:00
|
|
|
file_source = m.path_in_module
|
|
|
|
file_create = m.path_in_ezfio
|
2015-05-21 11:30:15 +02:00
|
|
|
|
2015-06-02 18:40:24 +02:00
|
|
|
l_string += ["build {0}: build_ezfio_config {1}".format(file_create,
|
|
|
|
file_source)]
|
2015-05-21 11:30:15 +02:00
|
|
|
l_string += [""]
|
|
|
|
|
2015-05-25 16:07:32 +02:00
|
|
|
return l_string
|
2015-05-21 11:30:15 +02:00
|
|
|
|
|
|
|
|
2015-05-28 12:03:14 +02:00
|
|
|
def ninja_ezfio_rule():
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
|
|
|
Retun the rule for creation the ezfio
|
|
|
|
Set some variable
|
|
|
|
and run ninja
|
|
|
|
"""
|
2015-06-02 18:40:24 +02:00
|
|
|
l_flag = ["export {0}='${0}'".format(flag)
|
|
|
|
for flag in ["FC", "FCFLAGS", "IRPF90"]]
|
2015-05-26 16:08:52 +02:00
|
|
|
|
2015-06-08 14:49:10 +02:00
|
|
|
l_cmd = ["cd {0}".format(QP_ROOT_EZFIO)
|
2015-06-08 20:46:36 +02:00
|
|
|
] + l_flag + ["ninja && ln -f {0} {1}".format(join(QP_ROOT, 'install', 'EZFIO',"lib","libezfio.a"),
|
2015-06-08 14:49:10 +02:00
|
|
|
EZFIO_LIB)]
|
2015-05-21 11:30:15 +02:00
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
l_string = ["rule build_ezfio",
|
|
|
|
" command = {0}".format(" ; ".join(l_cmd)),
|
|
|
|
" description = Create $out"
|
|
|
|
""]
|
2015-05-28 12:03:14 +02:00
|
|
|
|
2015-05-21 11:30:15 +02:00
|
|
|
return l_string
|
|
|
|
|
|
|
|
|
2015-05-25 16:07:32 +02:00
|
|
|
def ninja_ezfio_build(l_ezfio_config, l_util):
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
|
|
|
Rule for create the ezfio
|
|
|
|
we depend of the ezfio_config set by the user or created bu EZFIO.cfg
|
|
|
|
"""
|
2015-05-25 16:07:32 +02:00
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
l_ezfio_config = [i.path_in_ezfio for i in l_ezfio_config]
|
|
|
|
l_ezfio_from_cfg = [i.ez_config.abs for i in l_util.itervalues()]
|
2015-05-25 16:07:32 +02:00
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
str_ = " ".join(l_ezfio_config + l_ezfio_from_cfg)
|
2015-05-21 11:30:15 +02:00
|
|
|
|
2015-06-08 14:49:10 +02:00
|
|
|
ezfio_make_config = join(QP_ROOT_EZFIO, "make.config")
|
2015-06-03 15:32:43 +02:00
|
|
|
l_string = ["build {0} {1}: build_ezfio {2}".format(EZFIO_LIB,
|
|
|
|
ezfio_make_config,
|
|
|
|
str_), ""]
|
2015-05-21 11:30:15 +02:00
|
|
|
|
|
|
|
return l_string
|
|
|
|
|
|
|
|
|
2015-05-18 10:09:45 +02:00
|
|
|
# __
|
|
|
|
# (_ ._ _ | o ._ |
|
|
|
|
# __) \/ | | | | | | | |<
|
|
|
|
# /
|
2015-06-02 15:46:01 +02:00
|
|
|
def get_source_destination(path_module, l_needed_molule):
|
|
|
|
"""
|
|
|
|
Return a list of Sym_link = namedtuple('Sym_link', ['source', 'destination'])
|
|
|
|
for a module
|
|
|
|
"""
|
2015-06-08 14:49:10 +02:00
|
|
|
return [Sym_link(m.abs, join(QP_ROOT_SRC, path_module.rel, m.rel))
|
2015-06-02 18:40:24 +02:00
|
|
|
for m in l_needed_molule]
|
2015-05-18 10:09:45 +02:00
|
|
|
|
|
|
|
|
|
|
|
def ninja_symlink_rule():
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
|
|
|
Return the command to create for the symlink
|
|
|
|
"""
|
2015-06-02 18:40:24 +02:00
|
|
|
return ["rule build_symlink", " command = ln -sf $in $out", ""]
|
2015-05-18 10:09:45 +02:00
|
|
|
|
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
def ninja_symlink_build(path_module, l_symlink):
|
|
|
|
"""
|
|
|
|
Create the symlink
|
|
|
|
and the l_symlink who are all the symlink list
|
|
|
|
"""
|
2015-05-26 09:10:44 +02:00
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
if not l_symlink:
|
2015-05-26 09:10:44 +02:00
|
|
|
return []
|
|
|
|
|
2015-06-02 18:40:24 +02:00
|
|
|
l_string = ["build l_symlink_{0} : phony {1}".format(
|
|
|
|
path_module.rel, " ".join([s.destination for s in l_symlink])), ""]
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
for symlink in l_symlink:
|
2015-06-02 18:40:24 +02:00
|
|
|
l_string += ["build {0}: build_symlink {1}".format(symlink.destination,
|
|
|
|
symlink.source), ""]
|
2015-05-25 16:07:32 +02:00
|
|
|
|
2015-05-18 10:09:45 +02:00
|
|
|
return l_string
|
|
|
|
|
|
|
|
|
|
|
|
# _ _ _
|
|
|
|
# o ._ ._ _|_ (_| / \ ._ _ _. | _
|
|
|
|
# | | |_) | | \_/ o | | | (_| |< (/_
|
|
|
|
# |
|
2015-06-05 22:33:19 +02:00
|
|
|
def get_l_file_for_module(path_module):
|
2015-06-02 15:46:01 +02:00
|
|
|
'''
|
|
|
|
return the list of irp.f in a module
|
|
|
|
'''
|
2015-06-06 10:44:04 +02:00
|
|
|
l_depend = []
|
2015-06-03 17:52:41 +02:00
|
|
|
l_src = []
|
|
|
|
l_obj = []
|
|
|
|
|
|
|
|
l_template = []
|
2015-06-03 10:19:02 +02:00
|
|
|
|
2015-06-05 22:33:19 +02:00
|
|
|
for f in os.listdir(path_module.abs):
|
2015-06-04 16:40:00 +02:00
|
|
|
if f.lower().endswith(tuple([".template.f", ".include.f"])):
|
2015-06-05 22:33:19 +02:00
|
|
|
l_template.append(join(path_module.abs, f))
|
2015-06-03 17:52:41 +02:00
|
|
|
elif f.endswith(".irp.f"):
|
2015-06-06 10:44:04 +02:00
|
|
|
l_depend.append(join(path_module.abs, f))
|
2015-06-04 16:40:00 +02:00
|
|
|
elif f.lower().endswith(tuple([".f", ".f90", ".c", ".cpp", ".cxx"])):
|
2015-06-06 10:44:04 +02:00
|
|
|
l_depend.append(join(path_module.abs,f))
|
2015-06-08 12:35:40 +02:00
|
|
|
l_src.append(f)
|
2015-06-03 17:52:41 +02:00
|
|
|
obj = '{0}.o'.format(os.path.splitext(f)[0])
|
2015-06-05 22:33:19 +02:00
|
|
|
l_obj.append(obj)
|
2015-06-03 17:52:41 +02:00
|
|
|
elif f == "EZFIO.cfg":
|
2015-06-06 10:44:04 +02:00
|
|
|
l_depend.append(join(path_module.abs, "ezfio_interface.irp.f"))
|
2015-06-03 17:52:41 +02:00
|
|
|
|
2015-06-06 10:44:04 +02:00
|
|
|
d = {"l_depend": l_depend,
|
2015-06-04 16:40:00 +02:00
|
|
|
"l_src": l_src,
|
|
|
|
"l_obj": l_obj,
|
|
|
|
"l_template": l_template}
|
2015-06-03 17:52:41 +02:00
|
|
|
|
|
|
|
return d
|
2015-05-25 16:07:32 +02:00
|
|
|
|
|
|
|
|
2015-06-03 17:52:41 +02:00
|
|
|
def get_file_dependency(d_info_module):
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
|
|
|
For a module return all the irp.f90 file who depend
|
|
|
|
"""
|
2015-06-03 17:52:41 +02:00
|
|
|
d_irp = defaultdict(dict)
|
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
for module, l_children in d_info_module.iteritems():
|
2015-05-25 16:07:32 +02:00
|
|
|
|
2015-06-05 22:33:19 +02:00
|
|
|
for key, values in get_l_file_for_module(module).iteritems():
|
|
|
|
if key in ["l_src"]:
|
2015-06-08 12:35:40 +02:00
|
|
|
values = [join(module.abs,o) for o in values]
|
|
|
|
if key in ["l_obj"]:
|
|
|
|
values = [join(module.abs,"IRPF90_temp",o) for o in values]
|
|
|
|
|
2015-06-03 17:52:41 +02:00
|
|
|
d_irp[module][key] = values
|
2015-06-08 12:35:40 +02:00
|
|
|
|
2015-06-03 17:52:41 +02:00
|
|
|
for children in l_children:
|
2015-06-05 22:33:19 +02:00
|
|
|
for key, values in get_l_file_for_module(children).iteritems():
|
2015-06-08 12:35:40 +02:00
|
|
|
if key in ["l_src"]:
|
|
|
|
values = [join(module.abs,children.rel,o) for o in values]
|
|
|
|
if key in ["l_obj"]:
|
|
|
|
values = [join(module.abs,"IRPF90_temp",children.rel,o) for o in values]
|
|
|
|
|
|
|
|
d_irp[module][key].extend(values)
|
2015-05-25 16:07:32 +02:00
|
|
|
|
|
|
|
return d_irp
|
|
|
|
|
|
|
|
|
2015-05-28 12:03:14 +02:00
|
|
|
def ninja_irpf90_make_rule():
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
|
|
|
The rule for creating the irpf90.make
|
|
|
|
Export the flag and compile
|
|
|
|
Only secontial make a possible
|
|
|
|
"""
|
2015-06-02 18:40:24 +02:00
|
|
|
|
|
|
|
# ~#~#~#~#~ #
|
|
|
|
# F l a g s #
|
|
|
|
# ~#~#~#~#~ #
|
2015-05-28 12:03:14 +02:00
|
|
|
l_flag = []
|
|
|
|
for flag in ["FC", "FCFLAGS", "LIB", "SRC", "OBJ"]:
|
|
|
|
str_ = "export {0}='${0}'".format(flag)
|
|
|
|
l_flag.append(str_)
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-06-02 18:40:24 +02:00
|
|
|
# ~#~#~ #
|
|
|
|
# c m d #
|
|
|
|
# ~#~#~ #
|
|
|
|
|
2015-05-28 12:03:14 +02:00
|
|
|
l_cmd = ["cd $module"] + l_flag + ["irpf90 $include_dir $IRPF90_FLAGS"]
|
2015-05-25 16:07:32 +02:00
|
|
|
|
2015-06-02 18:40:24 +02:00
|
|
|
# ~#~#~#~#~#~ #
|
|
|
|
# s t r i n g #
|
|
|
|
# ~#~#~#~#~#~ #
|
|
|
|
|
|
|
|
l_string = ["pool irp_pool", " depth = 1", "", "rule build_irpf90.ninja",
|
2015-06-02 15:46:01 +02:00
|
|
|
" command = {0}".format(" ; ".join(l_cmd)),
|
2015-06-05 09:56:05 +02:00
|
|
|
" pool = irp_pool",
|
2015-06-02 18:40:24 +02:00
|
|
|
" description = Create the IRP_Tree for $module", ""]
|
2015-05-25 16:07:32 +02:00
|
|
|
|
|
|
|
return l_string
|
|
|
|
|
|
|
|
|
2015-06-02 18:40:24 +02:00
|
|
|
def ninja_irpf90_make_build(path_module, l_needed_molule, d_irp):
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
2015-06-02 18:17:59 +02:00
|
|
|
Creatre the dependency for a irpf90.make
|
2015-06-02 15:46:01 +02:00
|
|
|
We need all the symklink and all the irp.f
|
|
|
|
"""
|
|
|
|
# ~#~#~#~#~#~ #
|
|
|
|
# O u t p u t #
|
|
|
|
# ~#~#~#~#~#~ #
|
|
|
|
|
2015-06-02 18:40:24 +02:00
|
|
|
l_creation = [join(path_module.abs, i)
|
|
|
|
for i in ["irpf90.make", "irpf90_entities", "tags",
|
2015-06-08 20:46:36 +02:00
|
|
|
"build.ninja"]]
|
2015-05-27 17:49:31 +02:00
|
|
|
str_creation = " ".join(l_creation)
|
2015-05-25 16:07:32 +02:00
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
# ~#~#~#~#~#~#~#~#~#~ #
|
|
|
|
# D e p e n d a n c y #
|
|
|
|
# ~#~#~#~#~#~#~#~#~#~ #
|
2015-05-26 09:10:44 +02:00
|
|
|
|
2015-06-06 10:44:04 +02:00
|
|
|
l_depend = d_irp[path_module]["l_depend"]
|
2015-06-03 17:52:41 +02:00
|
|
|
l_src = d_irp[path_module]["l_src"]
|
|
|
|
l_obj = d_irp[path_module]["l_obj"]
|
|
|
|
l_template = d_irp[path_module]["l_template"]
|
2015-05-28 12:03:14 +02:00
|
|
|
|
2015-06-02 18:40:24 +02:00
|
|
|
if l_needed_molule:
|
2015-06-06 10:44:04 +02:00
|
|
|
l_symlink = ["l_symlink_{0}".format(path_module.rel)]
|
2015-06-02 18:40:24 +02:00
|
|
|
else:
|
2015-06-06 10:44:04 +02:00
|
|
|
l_symlink = []
|
2015-06-02 18:40:24 +02:00
|
|
|
|
2015-06-06 10:44:04 +02:00
|
|
|
str_depend = " ".join(l_depend + l_symlink + l_template)
|
2015-05-27 11:02:13 +02:00
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
# ~#~#~#~#~#~#~#~#~#~#~ #
|
|
|
|
# N i n j a _ b u i l d #
|
|
|
|
# ~#~#~#~#~#~#~#~#~#~#~ #
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
l_include_dir = ["-I {0}".format(m.rel) for m in l_needed_molule]
|
2015-05-27 11:02:13 +02:00
|
|
|
|
2015-06-02 18:40:24 +02:00
|
|
|
l_string = [
|
|
|
|
"build {0}: build_irpf90.ninja {1}".format(str_creation, str_depend),
|
|
|
|
" module = {0}".format(path_module.abs),
|
|
|
|
" SRC = {0}".format(" ".join(l_src)),
|
|
|
|
" OBJ = {0}".format(" ".join(l_obj)),
|
|
|
|
" include_dir = {0}".format(" ".join(l_include_dir)), ""
|
|
|
|
]
|
2015-05-18 10:09:45 +02:00
|
|
|
|
|
|
|
return l_string
|
|
|
|
|
|
|
|
|
2015-05-26 17:40:39 +02:00
|
|
|
def ninja_readme_rule():
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
|
|
|
Rule for creation the readme.
|
|
|
|
For not dealted the readme when ninja -t clean and the generator option
|
|
|
|
"""
|
|
|
|
l_string = ["rule build_readme",
|
|
|
|
" command = cd $module ; update_README.py",
|
2015-06-02 18:40:24 +02:00
|
|
|
" generator = 1", ""]
|
2015-05-26 17:40:39 +02:00
|
|
|
|
|
|
|
return l_string
|
|
|
|
|
|
|
|
|
|
|
|
def ninja_readme_build(path_module):
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
|
|
|
Rule for creation the readme
|
|
|
|
"""
|
2015-06-02 18:17:59 +02:00
|
|
|
path_irp_man = join(path_module.abs, "irpf90.make")
|
2015-05-26 17:40:39 +02:00
|
|
|
path_readme = join(path_module.abs, "README.rst")
|
|
|
|
|
|
|
|
l_string = ["build {0}: build_readme {1}".format(path_readme,
|
2015-06-02 18:40:24 +02:00
|
|
|
path_irp_man),
|
|
|
|
" module = {0}".format(path_module.abs), ""]
|
2015-05-26 17:40:39 +02:00
|
|
|
|
|
|
|
return l_string
|
|
|
|
|
|
|
|
|
2015-05-18 10:09:45 +02:00
|
|
|
# _
|
|
|
|
# |_) o ._ _. ._
|
|
|
|
# |_) | | | (_| | \/
|
|
|
|
# /
|
2015-06-04 16:40:00 +02:00
|
|
|
def get_binaries(path_module):
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
2015-06-02 18:17:59 +02:00
|
|
|
Return the list of binaries (Path= namedtuple('Path', ['abs', 'rel']) for a module
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
2015-05-18 10:09:45 +02:00
|
|
|
import subprocess
|
|
|
|
|
|
|
|
try:
|
|
|
|
cmd = 'grep -l "program" {0}/*.irp.f'.format(path_module.abs)
|
2015-06-02 18:40:24 +02:00
|
|
|
process = subprocess.Popen([cmd],
|
|
|
|
shell=True,
|
|
|
|
stdout=subprocess.PIPE,
|
|
|
|
stderr=subprocess.PIPE)
|
2015-05-26 11:39:39 +02:00
|
|
|
stdout, stderr = process.communicate()
|
|
|
|
except OSError:
|
2015-05-18 10:09:45 +02:00
|
|
|
return []
|
|
|
|
else:
|
2015-06-02 15:46:01 +02:00
|
|
|
if not stdout:
|
|
|
|
return []
|
|
|
|
elif "No such file or directory" not in stdout:
|
|
|
|
l_bin = [i.replace(".irp.f", "", 1) for i in stdout.split()]
|
|
|
|
return [Path(bin_, os.path.basename(bin_)) for bin_ in l_bin]
|
2015-05-26 11:39:39 +02:00
|
|
|
else:
|
|
|
|
return []
|
2015-05-18 10:09:45 +02:00
|
|
|
|
|
|
|
|
2015-06-04 16:40:00 +02:00
|
|
|
def get_dict_binaries(l_module, mode="production"):
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
2015-06-02 18:17:59 +02:00
|
|
|
Return a dict [module] = list_binaries
|
2015-06-04 12:09:28 +02:00
|
|
|
If a the production mode is enable only header module
|
|
|
|
who will produce all binaries
|
2015-05-27 11:02:13 +02:00
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
Example : The module Full_CI can produce the binary SCF
|
2015-06-04 12:09:28 +02:00
|
|
|
so you dont need to compile at all the module Hartree-Fock
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
2015-06-02 18:17:59 +02:00
|
|
|
d_binaries = defaultdict(list)
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-06-02 18:17:59 +02:00
|
|
|
# Create d_binaries
|
|
|
|
# Ake module => binaries generated
|
2015-06-04 16:40:00 +02:00
|
|
|
for module in l_module:
|
|
|
|
l_binaries = get_binaries(module)
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-06-02 18:17:59 +02:00
|
|
|
if l_binaries:
|
|
|
|
d_binaries[module] += l_binaries
|
2015-05-27 11:02:13 +02:00
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
if mode == "production":
|
2015-05-26 09:10:44 +02:00
|
|
|
|
2015-06-04 16:40:00 +02:00
|
|
|
dict_root = ModuleHandler.dict_root
|
|
|
|
dict_root_path = dict_module_genelogy_path(dict_root)
|
2015-05-25 16:07:32 +02:00
|
|
|
|
2015-06-02 18:17:59 +02:00
|
|
|
d_binaries_condensed = defaultdict(list)
|
|
|
|
for module in d_binaries:
|
2015-06-04 16:40:00 +02:00
|
|
|
d_binaries_condensed[dict_root_path[module]] += d_binaries[module]
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-06-02 18:17:59 +02:00
|
|
|
d_binaries = d_binaries_condensed
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-06-02 18:17:59 +02:00
|
|
|
return d_binaries
|
2015-05-18 10:09:45 +02:00
|
|
|
|
|
|
|
|
2015-06-02 18:17:59 +02:00
|
|
|
def ninja_binaries_rule():
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
2015-06-02 18:17:59 +02:00
|
|
|
Rule for creating the binaries
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-06-02 18:40:24 +02:00
|
|
|
# ~#~#~ #
|
|
|
|
# c m d #
|
|
|
|
# ~#~#~ #
|
|
|
|
|
2015-06-08 20:46:36 +02:00
|
|
|
l_cmd = ["cd $module", "ninja"]
|
2015-05-20 16:01:41 +02:00
|
|
|
|
2015-06-02 18:40:24 +02:00
|
|
|
# ~#~#~#~#~#~ #
|
|
|
|
# s t r i n g #
|
|
|
|
# ~#~#~#~#~#~ #
|
|
|
|
|
2015-06-02 18:17:59 +02:00
|
|
|
l_string = ["rule build_binaries",
|
2015-06-02 15:46:01 +02:00
|
|
|
" command = {0}".format(" ; ".join(l_cmd)),
|
2015-06-02 18:40:24 +02:00
|
|
|
" description = Create all the binaries from $module", ""]
|
2015-05-20 16:01:41 +02:00
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
return l_string
|
2015-05-26 09:10:44 +02:00
|
|
|
|
|
|
|
|
2015-06-02 18:17:59 +02:00
|
|
|
def ninja_binaries_build(path_module, l_children, d_binaries):
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
2015-06-02 18:17:59 +02:00
|
|
|
The binaries need the EZFIO_LIB, and the irpf90.make (aka build.ninja)
|
2015-06-02 15:46:01 +02:00
|
|
|
"""
|
|
|
|
|
2015-06-02 18:40:24 +02:00
|
|
|
# ~#~#~ #
|
|
|
|
# c m d #
|
|
|
|
# ~#~#~ #
|
|
|
|
|
2015-06-08 20:46:36 +02:00
|
|
|
ninja_module_path = join(path_module.abs, "build.ninja")
|
2015-06-02 18:17:59 +02:00
|
|
|
l_abs_bin = [binary.abs for binary in d_binaries[path_module]]
|
2015-06-02 15:46:01 +02:00
|
|
|
|
2015-06-02 18:40:24 +02:00
|
|
|
# ~#~#~#~#~#~ #
|
|
|
|
# s t r i n g #
|
|
|
|
# ~#~#~#~#~#~ #
|
|
|
|
|
2015-06-02 18:17:59 +02:00
|
|
|
l_string = ["build {0}: build_binaries {1} {2}".format(" ".join(l_abs_bin),
|
|
|
|
EZFIO_LIB,
|
|
|
|
ninja_module_path),
|
2015-06-02 18:40:24 +02:00
|
|
|
" module = {0}".format(path_module.abs), ""]
|
2015-05-20 16:01:41 +02:00
|
|
|
|
|
|
|
return l_string
|
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
|
2015-06-02 18:17:59 +02:00
|
|
|
# ___
|
|
|
|
# | ._ _ _ _| _ ._ _ ._ _| _ ._ _ o _ _
|
|
|
|
# | | (/_ (/_ (_| (/_ |_) (/_ | | (_| (/_ | | (_ | (/_ _>
|
|
|
|
# |
|
|
|
|
def ninja_dot_tree_rule():
|
|
|
|
"""
|
|
|
|
Rule for creating the binaries
|
|
|
|
"""
|
2015-06-02 18:40:24 +02:00
|
|
|
# ~#~#~ #
|
|
|
|
# c m d #
|
|
|
|
# ~#~#~ #
|
|
|
|
|
2015-06-02 18:17:59 +02:00
|
|
|
l_cmd = ["cd $module", "module_handler.py create_png"]
|
|
|
|
|
|
|
|
l_string = ["rule build_dot_tree",
|
|
|
|
" command = {0}".format(" ; ".join(l_cmd)),
|
2015-06-05 09:56:05 +02:00
|
|
|
" generator = 1",
|
|
|
|
" description = Generate Png representtion of the Tree Dependancies of $module",
|
2015-06-02 18:17:59 +02:00
|
|
|
""]
|
|
|
|
|
|
|
|
return l_string
|
|
|
|
|
|
|
|
|
|
|
|
def ninja_dot_tree_build(path_module):
|
|
|
|
|
2015-06-02 18:40:24 +02:00
|
|
|
path_tree = join(path_module.abs, "tree_dependency.png")
|
|
|
|
l_string = ["build {0}: build_dot_tree".format(path_tree),
|
|
|
|
" module = {0}".format(path_module.abs), ""]
|
2015-06-02 18:17:59 +02:00
|
|
|
|
|
|
|
return l_string
|
|
|
|
|
|
|
|
#
|
|
|
|
# |\/| _. o ._
|
|
|
|
# | | (_| | | |
|
|
|
|
#
|
2015-05-18 10:09:45 +02:00
|
|
|
if __name__ == "__main__":
|
2015-05-27 11:02:13 +02:00
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
arguments = docopt(__doc__)
|
|
|
|
pwd_config_file = arguments["CONFIG_FILE"]
|
|
|
|
|
2015-05-28 12:03:14 +02:00
|
|
|
# _
|
|
|
|
# |_ ._ _. ._ o _. |_ | _ _
|
|
|
|
# |_ | | \/ \/ (_| | | (_| |_) | (/_ _>
|
|
|
|
#
|
|
|
|
|
|
|
|
l_string = ninja_create_env_variable(pwd_config_file)
|
2015-05-27 11:02:13 +02:00
|
|
|
|
2015-05-25 16:07:32 +02:00
|
|
|
# _
|
|
|
|
# |_) | _
|
|
|
|
# | \ |_| | (/_
|
|
|
|
#
|
2015-05-28 12:03:14 +02:00
|
|
|
l_string += ninja_ezfio_cfg_rule()
|
2015-05-25 16:07:32 +02:00
|
|
|
|
2015-05-18 10:09:45 +02:00
|
|
|
l_string += ninja_symlink_rule()
|
2015-05-25 16:07:32 +02:00
|
|
|
|
2015-05-28 12:03:14 +02:00
|
|
|
l_string += ninja_irpf90_make_rule()
|
2015-05-26 17:40:39 +02:00
|
|
|
l_string += ninja_readme_rule()
|
2015-05-25 16:07:32 +02:00
|
|
|
|
2015-06-02 18:17:59 +02:00
|
|
|
l_string += ninja_binaries_rule()
|
2015-05-25 16:07:32 +02:00
|
|
|
|
2015-05-21 11:30:15 +02:00
|
|
|
l_string += ninja_ezfio_config_rule()
|
2015-05-28 12:03:14 +02:00
|
|
|
l_string += ninja_ezfio_rule()
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-06-02 18:17:59 +02:00
|
|
|
l_string += ninja_dot_tree_rule()
|
|
|
|
|
2015-05-25 16:07:32 +02:00
|
|
|
# _
|
|
|
|
# |_) o | _| _ _ ._ _ ._ _. |
|
|
|
|
# |_) |_| | | (_| (_| (/_ | | (/_ | (_| |
|
|
|
|
# _|
|
|
|
|
l_module_with_ezfio_cfg = get_l_module_with_ezfio_cfg()
|
|
|
|
l_util = get_children_of_ezfio_cfg(l_module_with_ezfio_cfg)
|
2015-05-28 12:03:14 +02:00
|
|
|
l_ezfio_config = get_l_ezfio_config()
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-05-25 16:07:32 +02:00
|
|
|
l_string += ninja_ezfio_cfg_build(l_util)
|
|
|
|
l_string += ninja_ezfio_config_build(l_ezfio_config)
|
|
|
|
l_string += ninja_ezfio_build(l_ezfio_config, l_util)
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-05-25 16:07:32 +02:00
|
|
|
# _ _
|
|
|
|
# |_) o | _| _|_ _ ._ ._ _ _ _| | _
|
|
|
|
# |_) |_| | | (_| | (_) | | | | (_) (_| |_| | (/_
|
|
|
|
#
|
|
|
|
#
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
# ~#~#~#~#~#~#~#~#~#~#~#~#~#~ #
|
|
|
|
# G e n e a l o g y _ d i c t #
|
|
|
|
# ~#~#~#~#~#~#~#~#~#~#~#~#~#~ #
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-06-04 16:40:00 +02:00
|
|
|
d_genealogy = ModuleHandler.dict_descendant
|
2015-06-02 15:46:01 +02:00
|
|
|
d_genealogy_path = dict_module_genelogy_path(d_genealogy)
|
2015-06-03 17:52:41 +02:00
|
|
|
d_irp = get_file_dependency(d_genealogy_path)
|
2015-05-20 16:01:41 +02:00
|
|
|
|
2015-06-04 16:40:00 +02:00
|
|
|
l_module = d_genealogy_path.keys()
|
|
|
|
|
|
|
|
d_binaries_production = get_dict_binaries(l_module,
|
|
|
|
mode="production")
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
# ~#~#~#~#~#~#~#~#~#~#~#~#~ #
|
|
|
|
# M o d u l e _ t o _ i r p #
|
|
|
|
# ~#~#~#~#~#~#~#~#~#~#~#~#~ #
|
2015-05-18 10:09:45 +02:00
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
if arguments["--production"]:
|
2015-06-02 18:17:59 +02:00
|
|
|
l_module_to_irp = d_binaries_production.keys()
|
2015-05-21 11:30:15 +02:00
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
elif arguments["--development"]:
|
2015-06-04 12:09:28 +02:00
|
|
|
l_module_to_irp = d_genealogy_path.keys()
|
2015-06-04 11:10:32 +02:00
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
for module_to_compile in l_module_to_irp:
|
|
|
|
|
|
|
|
# ~#~#~#~#~#~#~#~ #
|
|
|
|
# S y m l i n k #
|
|
|
|
# ~#~#~#~#~#~#~#~ #
|
|
|
|
l_children = d_genealogy_path[module_to_compile]
|
|
|
|
l_symlink = get_source_destination(module_to_compile, l_children)
|
|
|
|
|
|
|
|
l_string += ninja_symlink_build(module_to_compile, l_symlink)
|
|
|
|
|
|
|
|
# ~#~#~#~#~#~#~#~ #
|
|
|
|
# i r p . f 9 0 #
|
|
|
|
# ~#~#~#~#~#~#~#~ #
|
2015-06-02 18:40:24 +02:00
|
|
|
l_string += ninja_irpf90_make_build(module_to_compile, l_children,
|
|
|
|
d_irp)
|
2015-06-02 15:46:01 +02:00
|
|
|
|
2015-06-04 12:15:54 +02:00
|
|
|
# ~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~ #
|
|
|
|
# d o t _ t r e e & r e a d m e #
|
|
|
|
# ~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~ #
|
2015-06-04 12:09:28 +02:00
|
|
|
l_string += ninja_dot_tree_build(module_to_compile)
|
2015-06-04 12:15:54 +02:00
|
|
|
l_string += ninja_readme_build(module_to_compile)
|
2015-06-04 12:09:28 +02:00
|
|
|
|
2015-06-02 15:46:01 +02:00
|
|
|
# ~#~#~#~#~#~#~ #
|
|
|
|
# b i n a r y #
|
|
|
|
# ~#~#~#~#~#~#~ #
|
2015-06-02 18:17:59 +02:00
|
|
|
for module_to_compile in d_binaries_production.keys():
|
2015-06-02 15:46:01 +02:00
|
|
|
|
2015-06-02 18:40:24 +02:00
|
|
|
l_string += ninja_binaries_build(module_to_compile, l_children,
|
|
|
|
d_binaries_production)
|
2015-05-21 11:30:15 +02:00
|
|
|
|
2015-06-08 14:49:10 +02:00
|
|
|
with open(join(QP_ROOT, "build.ninja"), "w+") as f:
|
2015-06-03 17:52:41 +02:00
|
|
|
f.write("\n".join(l_string))
|