-
Notifications
You must be signed in to change notification settings - Fork 1
Filtering predicates
Many of the act
subcommands that range over multiple compilers take two optional arguments, -filter-machines
and -filter-compilers
. These arguments accept S-expressions that tell act
how to choose which machines and compilers to use.
Note: As with most act
things, these languages are under construction and subject to a lot of change.
Internally, the predicates parse as blang expressions. In practice, this means that they can take any of the following forms:
- A primitive predicate (which depends on what we're filtering; see below);
-
true
; -
false
; -
(and <exprs>)
, where<exprs>
is a list of predicates; -
(or <exprs>)
, where<exprs>
is a list of predicates; -
(not <expr>)
, where<expr>
is a predicate; -
(if <cond> <true> <false>)
, where<cond>
,<true>
, and<false>
are all predicates.
These predicates can be used in both machine and compiler filters, using the id <primitive>
form.
All ID predicates are case-insensitive and don't distinguish between tag separators
((is foo.bar.baz)
and (is FOO/BAR/BAZ)
match the same IDs). Any predicate matching part of an ID matches on tag boundaries ((contains foo)
doesn't match bad.food
, but matches bad.foo.d
).
-
(is <string>)
: true if the ID is equal to the ID represented by<string>
; -
(has_prefix <string>)
: true if the ID contains the ID represented by<string>
as a prefix; -
(has_tag <string>)
: true if the ID contains the single tag represented by<string>
.
-
(id <predicate>)
: true if the ID predicate (see above) is true for the machine's ID; -
is_local
: true if the machine is local (e.g. not connected via SSH); -
is_remote
: true if the machine is remote (e.g. connected via SSH).
Note that is_local
differs from (not is_remote)
, and is_remote
from (not is_local)
, if it isn't possible to determine at filter time whether the machine is local or remote. In these cases, the is_XYZ
predicates return false
(and so their not
counterparts return true
).
(id (contains "linux")) ; select all machines with the tag 'linux' somewhere in their IDs
is_local ; enables only machines that are considered 'local'
(not is_remote) ; enables only machines that are not considered 'remote'
; (see above for the distinction between this and is_local)
-
(id <predicate>)
: true if the ID predicate (see above) is true for the compiler's ID; -
(machine <predicate>)
: true if the machine predicate (see above) is true for the compiler's machine.
### Examples
(id (contains "O3")) ; select all compilers with the tag 'O3' somewhere in their IDs
(or (id (contains "O1")) ; select all compilers with either the tag 'O1'...
(id (contains "O2")) ; ...or O2...
(id (contains "O3"))) ; ...or O3 in their IDs
(id (has-prefix "local.gcc")) ; select all compilers whose IDs begin with the tags 'local', 'gcc'
(machine is_local)) ; similar to 'is_local' above, but can be combined with
; other compiler-specific predicates