1#============================================================================
2# Helper rules
3#============================================================================
4
5CP ?= "cp" ;
6MV ?= "mv" ;
7
8##  Wildcard [ dir : ] patterns
9##    Create a list of files in a directory which match the pattern. You can
10##    optionally specify a subdirectory. The files will be returned with
11##    stripped pathnames. The difference from GLOB is that this rule respects
12##    subdirectories which may have been entered with the SubDir rule.
13rule Wildcard
14{
15  local files dir sdir wildcards ;
16
17  # Is a directory given?
18  if $(>) {
19    dir = $(<)/ ;
20    sdir = $(<) ;
21    wildcards = $(>) ;
22  } else {
23    dir = "" ;
24    sdir = "" ;
25    wildcards = $(<) ;
26  }
27
28  files = [ GLOB [ ConcatDirs $(SUBDIR) $(dir) ] : $(wildcards) ] ;
29
30  return $(files:BSR=$(sdir)) ;
31}
32
33##  Prefix list : prefix
34##    Adds a prefix to a all elements in list.
35rule Prefix
36{
37  return $(>)$(<) ;
38}
39
40if $(JAMVERSION) >= 2.5
41{
42
43##  IsElem element : list
44##    Returns "true" if the elemnt is in the list. Otherwise nothing is
45##    returned.
46rule IsElem
47{
48  local i ;
49
50  for i in $(>)
51  {
52    if $(i) = $(<)
53    {
54      return "true" ;
55    }
56  }
57
58  return ;
59}
60
61}
62else
63{
64
65# jam<2.4's return statement doesn't exit the function
66rule IsElem
67{
68  local i result ;
69
70  for i in $(>)
71  {
72    if $(i) = $(<)
73    {
74      result = "true" ;
75      $(>) = ;
76    }
77  }
78
79  return $(result) ;
80}
81
82}
83
84##  Filter list : filter
85##    Returns the list without the words contained in filter.
86rule Filter
87{
88  local i result ;
89
90  for i in $(<)
91  {
92    if ! [ IsElem $(i) : $(>) ]
93    {
94      result += $(i) ;
95    }
96  }
97
98  return $(result) ;
99}
100
101##  RemoveDups list
102##    Removes duplicates in the list (this function tries to preserve the list
103##    order)
104rule RemoveDups
105{
106  local i result ;
107
108  for i in $(<)
109  {
110    if ! [ IsElem $(i) : $(result) ]
111    {
112      result += $(i) ;
113    }
114  }
115
116  return $(result) ;
117}
118
119rule Reverse
120{
121  local result ;
122
123  for i in $(<)
124  {
125    result = $(i) $(result) ;
126  }
127  return $(result) ;
128}
129
130##  GetVar argument
131##    Simply returns the value of the variable with name argument.
132##    This is useful to query on target variables:
133##       bla = [ on TARGET GetVar CFlags ] ;
134rule GetVar
135{
136  return $($(<)) ;
137}
138
139##  ConcatDirs dirs
140##    Concatenates a set of directories. This is a substitute for FDirName in
141##    Jambase. It works also correctly for several rooted paths, where FDirName
142##    fails.
143##    The advantage over $(dir1)/$(dir2) is that this also works correctly if
144##    $(dir1) or $(dir2) is not set.
145rule ConcatDirs
146{
147  local i ;
148  local result = $(<[1]) ;
149  if ! $(result) { $result = "" ; }
150  local dir1 dir2 ;
151
152  for i in $(<[2-])
153  {
154    # eleminate multiple slashes because jam is somewhat buggy here
155    dir1 = [ MATCH (.*[^/]?) : $(result) ] ;
156    dir2 = [ MATCH ([^/].*) : $(i) ] ;
157    if ! $(dir1) { dir1 = "" ; }
158    if $(dir1) != "" { dir1 = $(dir1)/ ; }
159    if ! $(dir2) { dir2 = "" ; }
160    result = $(dir1)$(dir2) ;
161  }
162
163  return $(result) ;
164}
165
166##  Copy target : source
167##    Copy source file to target.
168actions Copy
169{
170  $(CP) "$(>)" "$(<)"
171}
172
173actions ignore Move
174{
175  $(MV) $(>) $(<)
176}
177
178