# Part of the A-A-P recipe executive: Testing of scopes
# 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
import sys, os, stat, shutil, string
def runaap(args):
res = os.system("%s ..%sMain.py %s" % (sys.argv[1], os.sep, args))
if res:
print "Aap exited with error value %d" % res
return res
os.chdir("rectest")
# Create a recipe to test whether the recipe scope is passed to build commands
# and reading a local variable before it is written results in a warning.
rec1 = "rectest1.aap"
rec2 = "rectest2.aap"
rec3 = "rectest3.aap"
rec4 = "rectest4.aap"
rec5 = "rectest5.aap"
rec6 = "rectest6.aap"
rec7 = "rectest7.aap"
aapout = "rectest.aap.out"
def cleanup():
for n in [ rec1, rec2, rec3, rec4, rec5, rec6, rec7, aapout ]:
try:
os.remove(n)
except:
pass
cleanup()
f = open(rec1, "w")
f.write("""
var1 = toplevel
var2 = toplevel2
:include %s
:child %s
:print from grandchild: $var6
:child {nopass} %s
:print toplevel TOP: $TOP
CFLAGS = nonsense
:execute %s
:execute {pass} %s
all:
var2 = all
:print no scope: $var1 $var2 $var3 $var4 $var5
:print _no scope: $_no.var1 $_no.var2
:print _recipe scope: $_recipe.var1 $_recipe.var2
:print _up scope: $_up.var1 $_up.var2
var1 = get no error here
var2 = nothing
:print after the error: $var1 $var2
TOP += all # check appending
:print TOP local: $TOP recipe: $_recipe.TOP
TOP ?= nothing # won't do anything
BUILD ?= buildd # set $BUILD
_recipe.TOP += build
:print build TOP local: $TOP recipe: $_recipe.TOP BUILD: `BUILD`
""" % (rec2, rec3, rec4, rec6, rec7))
f.close()
# Included recipe, will be at the toplevel.
f = open(rec2, "w")
f.write("""
var3 = toplevel3
var4 = toplevel4
TOP = toplevel
""")
f.close()
# Normal child recipe, will see the parent recipe variables.
f = open(rec3, "w")
f.write("""
var2 = child2
_top.var3 = child3 # set var3 in parent/toplevel recipe
:print child: $var1 $var2 $var3 $var4
_parent.var4 = child4
# Check default variable $OBJSUF
@if _no.OBJSUF == _parent.OBJSUF:
:print OBJSUF OK
TOP += child # append to local var
:print TOP child: $TOP _up: $_up.TOP
:child %s # nested child
:print from grandchild: $var6
""" % rec5)
f.close()
# {nopass} child recipe, will not see the parent recipe variables.
f = open(rec4, "w")
f.write("""
var2 = child22
_top.var3 = child33 # Check toplevel is this recipe, _parent.var3 unchanged
@try:
:print this should generate an error: $var1
@except:
:print child: error generated correctly for var1
:print child: $var2 $var3 $_parent.var4
# Check we can set a variable in the parent recipe.
_parent.var5 = child5
# Check default variable $OBJSUF
@if _no.OBJSUF == _parent.OBJSUF:
:print OBJSUF OK
# Check ":progsearch" with a scope name.
:progsearch _recipe.SHELL sh csh command cmd
@if not SHELL:
:print Could not find a shell!?
""")
f.close()
# Nested child recipe.
f = open(rec5, "w")
f.write("""
var6 = grandchild-local
_parent.var6 = grandchild-parent
_top.var6 = grandchild-top
:print grandchild: $var1 $var2 $var4 $var6
""")
f.close()
# Executed recipe. Will have a new toplevel.
f = open(rec6, "w")
f.write("""
var3 = executed
@if CFLAGS == "nonsense":
:print CFLAGS wasn't set to default value!
all:
var4 = all
@try:
:print this should generate an error: $var1
@except:
:print executed: error generated correctly for var1
:print executed: $_parent.var2 $_recipe.var3 $var4
""")
f.close()
# Executed recipe with passed toplevel.
f = open(rec7, "w")
f.write("""
var3 = executed
@if _no.CFLAGS != "nonsense":
:print CFLAGS was set to default value!
all:
:print executed: $_parent.var2 $_recipe.var3 $var4
""")
f.close()
def check_contents(fname, expected):
f = open(fname)
actual = f.read()
f.close()
if actual != expected:
print ('File contents wrong for "%s":\n%s\n--- instead of ---\n%s\n---'
% (fname, actual, expected))
return 1
return 0
# The first time running should result in two files being copied.
res = runaap("-f %s > %s" % (rec1, aapout))
failed = res + check_contents(aapout,
"""child: toplevel child2 child3 toplevel4
OBJSUF OK
TOP child: toplevel child _up: toplevel
grandchild: toplevel child2 child4 grandchild-local
from grandchild: grandchild-parent
from grandchild: grandchild-top
child: error generated correctly for var1
child: child22 child33 child4
OBJSUF OK
toplevel TOP: toplevel
executed: error generated correctly for var1
executed: toplevel2 executed all
executed: toplevel2 executed child4
no scope: toplevel all child3 child4 child5
_no scope: toplevel all
_recipe scope: toplevel toplevel2
_up scope: toplevel toplevel2
after the error: get no error here nothing
TOP local: toplevel all recipe: toplevel
build TOP local: toplevel all recipe: toplevel build BUILD: buildd
""")
cleanup()
sys.exit(failed)
# vim: set sw=4 et sts=4 tw=79 fo+=l:
|