# Part of the A-A-P recipe executive: Testing of automatic dependencies # Copyright (C) 2002-2003 Stichting NLnet Labs # Permission to copy and use this file is specified in the file COPYING. # If this file is missing you can find it here: http://www.a-a-p.org/COPYING # # This test checks that the following works properly: # - A C file is used as a source, it needs to be scanned for included files. # - One of the included files is a target in a dependency. # - If the dependency changes the included file to include other files than # before the list of dependencies must be redone. # - The source file is in a subdirectory, it should find included headers # there. # import sys, os, shutil, glob, string def runaap(args): return os.system("%s ..%sMain.py %s" % (sys.argv[1], os.sep, args)) os.chdir("rectest") # Create a recipe with a different filetype for the target, so that a different # build action will be used. # Check that the right action is used. rec = "rectest.aap" out = "rectest.out" tdir = "rectestdir" inp = "%s/rectest.c" % tdir incl1 = "incl1.h" incl2 = "incl2.h" incl3 = "incl3.h" incl1path = "%s/%s" % (tdir, incl1) incl2path = "%s/%s" % (tdir, incl2) incl3path = "%s/%s" % (tdir, incl3) def cleanup(): for file in [ rec, out, inp, incl1path, incl2path, incl3path ]: try: os.remove(file) except: pass try: shutil.rmtree(tdir) except: pass try: for dir in glob.glob('build-*'): shutil.rmtree(dir) except: pass cleanup() os.mkdir(tdir) inptext = """ HASGCC = no # disable using gcc for dependency check MESSAGE = # be silent all: %s f = $BDIR/$(source).aap :print (((`file2string(f)`))) %s : :print $(#)include "%s" >! $target """ % (inp, incl1path, incl2) incl3_line = """ :print $(#)include "%s" >> $target """ % incl3 # Create the source file that includes "incl1" f = open(inp, "w") f.write(""" #include #include "%s" int main() { printf("Hello World!\\n"); return 0;} """ % incl1) f.close() # Generate the header files. "incl1" will be changed later. for n in [incl1path, incl2path, incl3path]: f = open(n, "w") f.write(""" /* nothing */ """) f.close() def updatecheck(round, actual, name): expected = '- updating target "%s"' % name if string.find(actual, expected) < 0: print '(%d) Did not find remark in log file: "%s"' % (round, expected) return 1 return 0 def doit(): res = 0 for round, add_incl3, updated, scanned in [ # should find correct dependencies. (1, 0, [incl1path, incl2path], 1), # should find the same without dependency check (2, 0, [incl1path, incl2path], 0), # should find third include file (3, 1, [incl1path, incl2path, incl3path], 1), # should not find third include file (4, 0, [incl1path, incl2path], 1), ]: # Create the recipe. f = open(rec, "w") f.write(inptext) if add_incl3: f.write(incl3_line) # Also include "incl3". f.close() if runaap("-f %s >%s" % (rec, out)): res = 1 f = open("AAPDIR/log") logtext = f.read() f.close() # Avoid seeing differences in forward slashes and backslashes. logtext = string.replace(logtext, "\\", "/") for n in updated: res = res + updatecheck(round, logtext, n) # Check if correct dependencies were found. f = open(out) outtext = f.read() f.close() depline = outtext[string.find(outtext, "(((") + 3 : string.find(outtext, ")))")] deps = string.split(depline) # All expected dependencies must be in output. for n in updated: if n not in deps: print ('(%d) Did not find dependency in Aap output: "%s"' % (round, n)) print 'Actual dependencies: %s' % str(deps) res = 1 # All dependencies in output must be expected. for n in deps: if n and n != ":" and n not in updated + [inp]: print ('(%d) Found extra dependency in Aap output: "%s"' % (round, n)) print 'Actual dependencies: %s' % str(deps) res = 1 idx = string.find(logtext, "Scanning") if scanned: if idx < 0: print '(%d) Did not scan file' % round res = 1 else: if idx >= 0: print '(%d) Scanned file again unneccesarily' % round res = 1 return res res = doit() cleanup() sys.exit(res) # vim: set sw=4 et sts=4 tw=79 fo+=l: