#!/usr/bin/env python
#
# Copyright (c) 2005-2006 The ABINIT Group (Yann Pouillon)
# All rights reserved.
#
# 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 time import gmtime,strftime
import commands
import os
import re
import sys
# ---------------------------------------------------------------------------- #
#
# Subroutines
#
# Makefile header
def makefile_header(name,stamp):
return """#
# Makefile for ABINIT -*- Automake -*-
#
# Generated by %s on %s
#
# IMPORTANT NOTE
#
# Any manual change to this file will systematically be overwritten.
# Please modify the %s script or its config file instead.
#
#
# If you want to execute a range of tests instead of a whole series, you
# may use the keywords "start", "stop" and "dirname" along with make, e.g.:
#
# make v1 start=100 stop=104 dirname=root_name_for_the_test_directory
#
# To execute only one test, just omit either start or stop.
# By default, the dirname is the hostname
#
# Default host name for test output directories
dirname = `hostname`
# Main test scripts
run_basic_tests = $(PERL) \\
$(top_srcdir)/tests/Scripts/run-basic-tests.pl
run_standard_tests = $(PERL) \\
$(top_srcdir)/tests/Scripts/run-standard-tests.pl
run_parallel_tests = $(BOURNE_SHELL) \\
$(top_srcdir)/tests/Scripts/wrap-parallel-tests.sh
# External libraries
run_netcdf_tests = $(BOURNE_SHELL) \\
$(top_srcdir)/tests/Scripts/run-netcdf-tests.sh
run_xmlf90_tests = $(PERL) \\
$(top_srcdir)/tests/Scripts/run-basic-tests.pl xmlf90 6
# Display help by default
all_targets all help:
@cat $(top_srcdir)/doc/help_make/help_make_tests
""" % (name,stamp,name)
# File lists
def file_list(name,dir):
list = "%s =\n" % (name)
list += commands.getoutput("cd tests && find %s -type d -o -path '%s/,,*' -o -path '%s/*.arch-ids*' -o -path '%s/.arch-*' -o -path '%s/test.cnf' -prune -o -print 2> /dev/null" % (dir,dir,dir,dir,dir))
list = re.sub("\n"," \\\n\t",list)+"\n\n"
return """# Files from "%s"\n%s""" % (dir,list)
# Built-in tests
def built_in_tests():
return """# Built-in tests (1 to 5)
tests_in tests: $(psps_for_tests) $(tests_in_inps)
@if test ! -e built-in; then mkdir -p built-in; fi
@for bit in 1 2 3 4 5; do \
echo "Running built-in test $${bit}"; \
$(run_basic_tests) built-in $${bit} $(abinit_srcdir); \
done
"""
# External library tests
def external_tests(lib,test_alias):
return """# External library tests: %s
if DO_ENABLE_%s
tests_%s %s: $(psps_for_tests) $(tests_%s_inps)
@if test ! -e %s; then mkdir -p %s; fi
@$(run_%s_tests)
endif
""" % (lib,lib.upper(),lib,test_alias,lib,lib,lib,lib)
# Test targets
def tests_target(dir,test_alias):
return """# The "%s" series
tests_%s %s: $(tests_%s_inps) $(psps_for_tests)
@if test ! -e %s; then mkdir -p %s; fi
$(run_standard_tests) $(dirname) $(abinit_builddir)/src/main $(abinit_srcdir)/tests %s $(start) $(stop)
""" % (dir,dir,test_alias,dir,dir,dir,dir)
# Parallel tests
def parallel_tests(test_alias):
return """tests_paral %s: $(psps_for_tests) $(tests_paral_inps)
@if test ! -e paral; then mkdir -p paral; fi
$(run_parallel_tests) $(paral_host) $(paral_mode) $(start) $(stop)
""" % (test_alias)
# ---------------------------------------------------------------------------- #
#
# Main program
#
# Initial setup
my_name = "make-makefiles-tests"
my_configs = ["config/specs/tests.cf"]
my_output = "tests/Makefile.am"
# 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/main/abinit.F90") ):
print "%s: You must be in the top of the ABINIT source tree." % my_name
print "%s: Aborting now." % my_name
sys.exit(1)
# Read config file(s)
for cnf in my_configs:
if ( os.path.exists(cnf) ):
execfile(cnf)
else:
print "%s: Could not find config file (%s)." % (my_name,cnf)
print "%s: Aborting now." % my_name
sys.exit(2)
# What time is it?
now = strftime("%Y/%m/%d %H:%M:%S +0000",gmtime())
# Start to write tests/Makefile.am
mf = file(my_output,"w")
mf.write(makefile_header(my_name,now))
# Prepare EXTRA_DIST target
ext = "EXTRA_DIST = \\\n\t$(tests_scripts)" + \
" \\\n\t$(psps_for_tests) \\\n\t$(tests_in_inps)"
# Prepare clean-local target
cln = "clean-local:\n\trm -rf built-in/,,*\n"
# Write file lists and targets
mf.write(file_list("tests_scripts","Scripts"))
mf.write(file_list("psps_for_tests","Psps_for_tests"))
mf.write(file_list("tests_in_inps","built-in"))
mf.write(built_in_tests())
for dir in abinit_tests:
ext += " \\\n\t$(tests_%s_inps)" % (dir)
cln += "\trm -rf %s/,,*\n" % (dir)
if ( dir in abitests_specs ):
specs = abitests_specs[dir]
else:
specs = ABI_TST_NIL
mf.write(file_list("tests_%s_inps" % (dir),dir))
if ( (specs & ABI_TST_MPI) == 0 ):
if ( (specs & ABI_TST_EXT) == 0 ):
mf.write(tests_target(dir,abinit_tests[dir]))
else:
mf.write(external_tests(dir,abinit_tests[dir]))
else:
mf.write(parallel_tests(abinit_tests[dir]))
# Write EXTRA_DIST and clean-local
ext += "\n\n"
cln += "\n"
mf.write(ext+cln)
add = "config/makefiles/tests.am"
if ( os.path.exists(add) ):
mf.write(file(add,"r").read())
mf.close()
syntax highlighted by Code2HTML, v. 0.9.1