abinit/config/scripts/make-build-examples

139 lines
3.7 KiB
Python
Executable File

#!/usr/bin/env python
#
# Copyright (C) 2009-2025 ABINIT Group (Yann Pouillon)
#
# This file is part of the ABINIT software package. For license information,
# please see the COPYING file in the top-level directory of the ABINIT source
# distribution.
#
from __future__ import print_function, division, absolute_import #, unicode_literals
try:
from ConfigParser import ConfigParser
except ImportError:
from configparser import ConfigParser
from time import gmtime,strftime
import os
import re
import sys
class MyConfigParser(ConfigParser):
def optionxform(self,option):
return str(option)
def key_is_ok(key):
# Init keys to ignore
cnf_ignore = ["status"]
if ( key in cnf_ignore ):
return False
else:
return True
# ---------------------------------------------------------------------------- #
#
# Main program
#
# Initial setup
my_name = "make-build-examples"
my_configs = ["config/specs/testfarm.conf"]
my_template = "doc/build/config-template.ac9"
my_outdir = "doc/build/config-examples"
my_fbck = "config/specs/fbversion.conf"
# Check if we are in the top of the ABINIT source tree
if ( not os.path.exists("configure.ac") or
not os.path.exists("src/98_main/abinit.F90") ):
print("%s: You must be in the top of an ABINIT source tree." % my_name)
print("%s: Aborting now." % my_name)
sys.exit(1)
# Check if we have a config file
for my_config in my_configs:
if ( not os.path.exists(my_config) ):
print("%s: Could not find config file (%s)." % (my_name,my_config))
print("%s: Aborting now." % my_name)
sys.exit(2)
# Check if we have a template
if ( os.path.exists(my_template) ):
inp_data = open(my_template,"rt").readlines()
else:
print("%s: Could not find template file (%s)." % (my_name,my_template))
print("%s: Aborting now." % my_name)
sys.exit(3)
# Check if we have a fallback config file
if ( os.path.exists(my_fbck) ):
fcnf = MyConfigParser()
fcnf.read(my_fbck)
if len(fcnf.sections()) != 0:
fbversion = '_'+fcnf.sections()[0]
else:
fbversion = ''
else:
print("%s: Could not find fbversion file (%s)." % (my_name,my_fbck))
print("%s: Aborting now." % my_name)
sys.exit(4)
# What time is it?
now = strftime("%Y/%m/%d %H:%M:%S +0000",gmtime())
# Prepare the storage space
if ( not os.path.exists(my_outdir) ):
os.makedirs(my_outdir)
for old_ex in os.listdir(my_outdir):
item = os.path.join(my_outdir, old_ex)
#print("Removing item:", item)
if os.path.isdir(item):
if os.listdir(item) != 0:
raise RuntimeError("Cannot remove non-empty directory:", item)
os.rmdir(item)
else:
os.remove(item)
# Process config files and write examples
for my_config in my_configs:
cnf = MyConfigParser()
cnf.read(my_config)
for sec in cnf.sections():
cnf_vars = dict(cnf.items(sec))
cnf_keys = list(cnf_vars.keys())
cnf_keys.sort()
out_data = ""
# Uncomment variables in template data
for line in inp_data:
do_print = True
for key in cnf_keys:
if ( re.match("#%s=" % (key),line) or \
(re.match("#fcflags_opt_",line) and re.match("fcflags_opt_",key)) ):
if ( key_is_ok(key) ):
out_data += "%s=\"%s\"\n" % (key,cnf_vars[key])
do_print = False
if ( do_print ):
out_data += line
# Inject fbversion in out_data
out_data=out_data.replace("_FB_",fbversion)
# Write data
out_path = os.path.join(my_outdir, sec+".ac9")
open(out_path, "wt").write(out_data)
# FIXME: Create symbolic link until the test farm gets updated
old_path = os.path.join(my_outdir, sec+".ac")
if ( os.path.exists(old_path) or os.path.islink(old_path) ):
os.remove(old_path)
os.symlink(sec+".ac9", old_path)