Upstream tarball 20080721
[amule.git] / src / utils / scripts / denoiser.rules
bloba554d73ba063e210c5518f0ce5ce2dc5128455d3
1 # This file is part of the aMule project.
3 # Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org )
4 # Copyright (c) 2006-2008 Dévai Tamás ( gonosztopi@amule.org )
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License
8 # as published by the Free Software Foundation; either
9 # version 2 of the License, or (at your option) any later version.
10
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
15
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
21 # The sed script is tested with GNU sed versions 3.02, 4.1.2
22 # The generated Makefiles are tested with GNU make versions 3.79.1, 3.80
25 # Denoising levels:
27 #       0 - do nothing, handled outside the scope of this script.
29 #       1 - only strip Makefiles from comments and empty lines, this should
30 #       theoretically speed up 'make', although not as much that you could
31 #       notice it.
33 #       2 - leave directory change messages from make, but silence normal
34 #       command printing. No echo denoising at this level.
36 #       3 - silence all messages from make, and partial echo denoising.
38 #       4 - full denoising:
39 #               * silence all messages from make
40 #               * full echo denoising
41 #               * compiler warning suppression
44 # Syntax of this file:
46 #       This file gets preprocessed, all comments and empty lines removed. The
47 #       preprocessor understands '#if ', '#else' and '#endif' commands, as long
48 #       as they start on the first character on the line. No whitespace is
49 #       allowed before the commands. Note that the space character after #if is
50 #       part of the command, if it is replaced by a tab then it won't make a
51 #       command anymore!
53 # #if truth testing:
55 #       #if currently understands only one keyword: 'level', followed by a number
56 #       - the current denoising level. There may be any arbitrary characters
57 #       between the keyword and the value - i.e. 'levels 2,3' will also match
58 #       when 'level 3' matches.
60 # #if preprocessor commands may be nested for at least 4000 levels deep :-)
62 # The preprocessor script can be found at the end of this file.
65 # ----- now the code -----
67 # suppress messages from make
69 #if levels 3,4
70 1 i\
71 MAKEFLAGS=-s --no-print-directory
72 #endif
74 #if level 2
75 1 i\
76 MAKEFLAGS=-w -s
77 #endif
80 #if levels 2,3,4
82 #endif
85 # delete comments
86 /^#/ {
87         d
90 # delete empty lines
91 /^[     ]*$/ {
92         d
96 # rewrite compiler flags
97 #if level 4
98 /=/ {
99         /^[^=]*[^R]CFLAGS/ b 8
100         /^[^=]*CPPFLAGS/ b 8
101         /^[^=]*CXXFLAGS/ b 8
102         b 9
103         :8
104         # save -Wl, -Wa, and -Wp, flags, they're for linker, assember and preprocessor respectively
105         s/ -Wl,/ -%l,/g
106         s/ -Wa,/ -%a,/g
107         s/ -Wp,/ -%p,/g
109         # delete all -W flags
110         / -W/ s/ -W[^ ]*//g
112         # restore -Wl, -Wa, and -Wp, flags
113         s/ -%l,/ -Wl,/g
114         s/ -%a,/ -Wa,/g
115         s/ -%p,/ -Wp,/g
117         # insert -w flag into MULECFLAGS and MULECXXFLAGS if it isn't already in
118         /^MULEC\(XX\)\?FLAGS/! b 9
119         / -w/! s/=/= -w/
120         :9
122 #endif
125 # rewrite rules
126 #if levels 2,3,4
127 # all rules contain ':' and start at the very beginning of the line
128 /^[^    ].*:/ {
129         # no rules contain '=', so just skip these lines
130         /=/ b
132         # save rule target in secondary buffer
133         h
134         s/\([^:][^:]*\):.*/\1/
135         x
137         # skip continuation lines
138         :1
139         /\\$/ {
140                 n
141                 b 1
142         }
144         # process rule commands
145         :2
146         n
147         :3
149         # delete comments inside rules
150         /^#/ {
151                 s/.*//
152                 N
153                 s/\n//g
154                 b 3
155         }
157         # if the current line is empty or not anymore a command, parse as usual
158         /^$/ b 0
159         /^[^    ]/ b 0
161         x
162         /^\n/ b 5
164         # skipping install-strip target, since it will trigger the echo-denoiser,
165         # and would silence the whole installation, which is abolutely not wanted
166         /^install-strip$/ {
167                 s/.*//
168                 x
169                 b 0
170         }
172         # do some output based on rule target
173         /\.o$/ {
174                 i\
175         echo "Compiling $(<F)"
176                 b 4
177         }
178         /\.obj$/ {
179                 i\
180         echo "Compiling $(<F)"
181                 b 4
182         }
183         /\.a$/ {
184                 i\
185         echo "Building $(@F)"
186                 b 4
187         }
188         /$(EXEEXT)$/ {
189                 i\
190         echo "Linking $(@F)"
191                 b 4
192         }
193         /^\.po\.g\?mo$/ {
194                 i\
195         echo "Generating translations for $(<F:.po=)"
196                 b 4
197         }
198         /\.cpp$/ {
199                 i\
200         echo "Generating $(@F)"
201                 b 4
202         }
203         /\.$(OBJEXT)$/ {
204                 i\
205         echo "Compiling $(<F)"
206                 b 4
207         }
208         /^$(DOMAIN)\.pot-update$/ {
209                 i\
210         echo "Updating translation catalog template"
211                 b 4
212         }
213         /^$(POFILES)$/ {
214                 i\
215         echo "Updating translation catalog for $(@F:.po=)"
216                 b 4
217         }
218         /^\.nop\.po-update$/ {
219                 i\
220         echo "Updating translation catalog for $(<F:.nop=)"
221                 b 4
222         }
223         :4
224         # indicate that we already did the echo thingie
225         #
226         # s/^/\n/ works with newer sed versions like 4.1.2,
227         # but unfortunately msys uses sed 3.02, which does not
228         # translate \n to a newline in the replacement string.
229         #s/^/\n/
230         #
231         # Compatible method: include a newline literally
232         s/^/\
234         :5
236         # If --enable-maintainer-mode, Makefiles may be automatically regenerated.
237         # Denoise new Makefile aswell.
238         /Makefile$/ {
239                 x
240                 /echo/! {
241                         /config\.status[         ][     ]*[^    ][^     ]*/ s/\(config\.status[          ][     ]*[^    ][^     ]*[^;\&\|]*\)\(.*\)/\1 denoiser\2/
242                 }
243                 x
244         }
246         x
248 #if levels 3,4
249         # Denoise echo commands (assuming that no echo command contains the ';' character)
250         #
251         # Denoising works by redirecting output to /dev/null, which is slower, though safer
252         # than removing the command.
253         /^[     ]*@*echo/ {
254                 x
255                 /maintainer-clean-generic/ b 6a
256 #if level 3
257                 /maintainer/ b 6a
258                 /$(RECURSIVE_TARGETS)/ b 6a
259                 /recursive/ b 6a
260 #endif
261                 b 6b
262                 :6a
263                 x
264                 b 6
265                 :6b
266                 x
267                 G
268                 h
269                 s/\(echo[^;][^;]*\).*/\1/
270                 # do not redirect if it's already redirected
271                 />/ {
272                         g
273                         s/[^\n]*//
274                         x
275                         s/\n.*//
276                         b 6
277                 }
278                 g
279                 s/[^\n]*//
280                 x
281                 s/\n.*//
282                 s/\(.*echo[^;][^;]*\)\(.*\)/\1>\/dev\/null\2/
283                 :6
284         }
285 #endif (levels 3,4)
286         
287         # mkinstalldirs will also echo its job, sink its output too
288         /$(mkinstalldirs)/ {
289                 G
290                 h
291                 s/\($(mkinstalldirs)[^;][^;]*\).*/\1/
292                 # do not redirect if it's already redirected
293                 />/ {
294                         g
295                         s/[^\n]*//
296                         x
297                         s/\n.*//
298                         b 7
299                 }
300                 g
301                 s/[^\n]*//
302                 x
303                 s/\n.*//
304                 s/\(.*$(mkinstalldirs)[^;][^;]*\)\(.*\)/\1>\/dev\/null\2/
305                 :7
306         }
308 #if level 4
309         # the above applies to msgfmt, but here it's enough to remove the '--statistics' flag
310         /$(GMSGFMT)/ s/--statistics//
312         # msgmerge needs a --silent flag
313         s/$(MSGMERGE)/\0 --silent/
314         s/$(MSGMERGE_UPDATE)/\0 --silent/
315 #endif
317         # the following two ruleset must be the last two in this block and in this order!
319 #if levels 3,4
320         # uninstallation
321         /^[     ]*rm -f[^;]*$(DESTDIR)/ {
322                 x
323                 /uninstall/ {
324                         H
325                         g
326                         s/.*rm -f[^;]*$(DESTDIR)\([^;" ][^;" ]*\).*/    echo "Uninstalling \1"; \\/
327                         P
328                         g
329                         s/[^\n]*//
330                         x
331                         s/\n.*//
332                         # skip checking for install: 1) trivially false 2) uninstall would match /install/
333                         b 2
334                 }
335                 x
336         }
338         # installation
339         /^[     ]*$([^)]*INSTALL/ {
340                 x
341                 /install/ {
342                         H
343                         g
344                         s/.*$(DESTDIR)\([^;" ][^;" ]*\).*/      echo "Installing \1"; \\/
345                         P
346                         g
347                         s/[^\n]*//
348                         x
349                         s/\n.*//
350                         b 2
351                 }
352                 x
353         }
354 #endif (levels 3,4)
356         b 2
358 #endif (levels 2,3,4)
361 # ---- the preprocessor ----
363 ## default processing mode is 'true'
364 #1 {
365 #       x
366 #       s/.*/1/
367 #       x
370 ## delete empty lines
371 #/^[    ]*$/ d;
373 ## look for "#if "
374 #/^#if / {
375 #       /level.*$level/ {
376 #               x
377 #               s/^/1/
378 #               x
379 #               b0
380 #       }
381 #       x
382 #       s/^/0/
383 #       x
384 #       :0
385 #       d
388 ## process "#else"
389 #/^#else/ {
390 #       x
391 #       /^1/ {
392 #               s/1/0/
393 #               b1
394 #       }
395 #       s/0/1/
396 #       :1
397 #       x
398 #       d
401 ## check for "#endif"
402 #/^#endif/ {
403 #       x
404 #       s/.//
405 #       x
406 #       d
409 ## delete comments
410 #/^[    ]*#/ d
412 ## process code lines according to #if/#else/#endif
414 #/^1/ {
415 #       x
416 #       b