#!/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()