Python commands can be used where A-A-P commands are not sufficient. This includes conditionally executing of commands, repeating commands for a list of items and much more.
PYTHON EXPRESSION:
Python expressions can be embedded in many places. They are specified in
backticks.
The result should be a string or a list of strings. A list is automatically
converted to a white-separated string of all list items.
A Python expression cannot be used for the variable name in an assignment.
This doesn't work:
`varname` = value
Use this instead:
@eval(varname + ' = "value"')
When using a function from a module, it must be imported first. Example:
@from glob import glob
SOURCE = `glob('*.c')`
However, for your convenience these things are imported for you already:
from glob import glob
A backtick in the Python expression has to be doubled to avoid it being
recognized as the end of the expression:
CMD = `my_func("``grep -l foo *.c``")`
contains the Python expression:
my_func("`grep -l foo *.c`")
Note that a following attribute is only attached to the last item resulting
from the Python expression.
SOURCE = `glob('*.c')` {check = md5}
Can be equivalent to:
SOURCE = foo.c bar.c {check = md5}
To apply it to all items, use parenthesis
SOURCE = (`glob('*.c')`) {check = md5}
Can be equivalent to:
SOURCE = (foo.c bar.c) {check = md5}
or:
SOURCE = foo.c {check = md5} bar.c {check = md5}
Backtick expressions and $VAR can be used inside a string:
DIR = /home/foo /home/bar
:print "`DIR + "/fi le"`"
results in:
"/home/foo /home/bar/fi le"
Compare this to:
:print "$*DIR/fi le"
which results in:
In the result of the Python expression a $ is changed to $$, so that it's not
used for a variable name. The $$ is reduced to $ again when evaluating the
whole expression.
USEFUL PYTHON ITEMS:
VAR = `os.environ.get('VAR', 'default')`
Obtain environment variable $VAR. If it is not set use "default".
@os.environ["PATH"] = mypath
Set an environment variable.
files = `glob("*.ext")`
Obtain a list of files matching "*.ext". A-A-P will take care of turning the
list that glob() returns into a string, using quotes where needed.
choice = `raw_input("Enter the value: ")`
Prompt the user to enter a value.
tempfile = `tempfname()`
Get a file name to use for temporary files. The file will not exist. If you
create it you need to make sure it is deleted afterwards.
AAP PYTHON FUNCTIONS:
These functions can be used in Python code:
aap_sufreplace(from, to, expr)
Returns "expr" with all occurences of the suffix
"from" changed to "to".
When "from" is empty any suffix is changed to "to".
"expr" can be a list of file names.
Example:
OBJECT = `aap_sufreplace("", OBJSUF, SOURCE)`
aap_abspath(expr) Returns "expr" with all file names turned into
absolute paths. Prepends the current directory to
each item in "expr" which isn't an absolute path name.
Example:
:print `aap_abspath("foo bar")`
results in:
/home/mool/test/foo /home/mool/test/bar
string = src2obj(source)
Transform a string, which is a list of source files,
into the corresponding list of object files. Each
item in "source" is change by prepending $BDIR and
changing or appending the suffix to $OBJSUF.
get_attr(name) Returns a dictionary with the attributes of "name".
If "name" is unknown or has no attributes, an empty
dictionary is returned. Example:
:attr {logical = yes} foobar
@print "foobar attributes: ", get_attr("foobar")
program_path(name)
Returns the path for program "name". This uses the
$PATH environment variable or os.defpath if it isn't
set.
On MS-Windows and OS/2 also checks with these
extensions added: ".exe", ".com", ".bat", ".cmd".
When "name" includes a suffix (a dot in the last
component) adding extensions is not done.
Returns the first program found.
Returns None when "name" could not be found.
Optional arguments:
path search path to use instead of $PATH;
when a string items are separated with
os.pathsep
pathext extensions to try; when a string
items are separated with os.pathsep
skip name of directory to skip searching
Example, search for program "foo.py" and "foo.sh":
p = `program_path("foo", pathext = [ '.py', '.sh' ])`
redir_system(cmd [, use_tee])
Execute shell commands "cmd" and return two items: a
number indicating success and the stdout.
By default "tee" is used to display the
output as well as redirecting it. When no output is
desired set "use_tee" to zero. Example:
ok, text = redir_system("ls", 0)
if ok:
print "ls output: %s" % text
else:
print "ls failed"
list = sort_list(list)
sorts a list and returns the list. Example:
INP = `sort_list(glob("*.inp"))`
list = var2list(var) Turns a variable with a string value into a list of
items. Attributes are ignored. Example:
source = file1 file2 file3
@for fname in var2list(source):
:sys prog $fname
list = var2dictlist(var)
Turns a variable with a string value into a list of
dictionaries. Each dictionary has a "name" entry for
item itself and other entries are attributes.
Example:
source = file1 {force} file2 file3
@for item in var2dictlist(source):
@ if item.get("force"):
:print forced item: `item["name"]`
string = file2string(fname [, dict])
Reads the file "fname" and concatenates the lines into
one string. Lines starting with a '#' are ignored.
One space is inserted in between joined lines, other
white space at the start and end of a line is removed.
When "fname" doesn't exist or can't be read an error
message is given and an empty string is returned.
"dict" is used to obtain the value for $MESSAGE.
The default is None.
has_target(target)
Returns:
0 no dependency for "target"
1 dependency for "target" exists
2 dependency for "target" exists and has
build commands
Example:
@if not has_target("fetch"):
tempfname() Returns the name of a file which does not exist and
can be used temporarily.
PYTHON BLOCK:
A block of Python commands is started with a ":python" command. Optionally
a terminator string may be specified. This cannot contain white space. A
comment may follow. If no terminator string is specified the python code ends
where the indent is equal to or less than the ":python" command. Otherwise
the Python block continues until the terminator string is found in a line by
itself. It may be preceded and followed by white space and a comment may
follow.
SOURCE = foo.c bar.c
:python
for i in items:
SOURCE = SOURCE + " " + i
...
:python EOF
INCLUDE = glob("include/*.c")
EOF
|