Change policy about how we handle generated files
[amule.git] / src / utils / scripts / denoiser.rules
blobb71b3983c62a04cb30f33fc25f7335396305f92c
1 # This file is part of the aMule project.
3 # Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org )
4 # Copyright (c) 2006-2011 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.
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.
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 /^#/ d
88 # delete empty lines
89 /^[     ]*$/ d
92 # take precedence over automake's silent rules feature
93 #if levels 2,3,4
94 /^AM_V_[A-Za-z]\+[      ]*=/ d
95 /^am__v_[A-Za-z]\+_0\?[         ]*=/ d
96 /^AM_DEFAULT_VERBOSITY[         ]*=/ d
97 #endif
100 # rewrite compiler flags
101 #if level 4
102 /=/ {
103         /^[^=]*[^R]CFLAGS/ b 8
104         /^[^=]*CPPFLAGS/ b 8
105         /^[^=]*CXXFLAGS/ b 8
106         b 9
107         :8
108         # save -Wl, -Wa, and -Wp, flags, they're for linker, assember and preprocessor respectively
109         s/ -Wl,/ -%l,/g
110         s/ -Wa,/ -%a,/g
111         s/ -Wp,/ -%p,/g
113         # delete all -W flags
114         / -W/ s/ -W[^ ]*//g
116         # restore -Wl, -Wa, and -Wp, flags
117         s/ -%l,/ -Wl,/g
118         s/ -%a,/ -Wa,/g
119         s/ -%p,/ -Wp,/g
121         # insert -w flag into MULECFLAGS and MULECXXFLAGS if it isn't already in
122         /^MULEC\(XX\)\?FLAGS/! b 9
123         / -w/! s/=/= -w/
124         :9
126 #endif
129 # rewrite rules
130 #if levels 2,3,4
131 # all rules contain ':' and start at the very beginning of the line
132 /^[^    ].*:/ {
133         # no rules contain '=', so just skip these lines
134         /=/ b
136         # save rule target in secondary buffer
137         h
138         s/\([^:][^:]*\):.*/\1/
139         x
141         # skip continuation lines
142         :1
143         /\\$/ {
144                 n
145                 b 1
146         }
148         # process rule commands
149         :2
150         n
151         :3
153         # delete comments inside rules
154         /^#/ {
155                 s/.*//
156                 N
157                 s/\n//g
158                 b 3
159         }
161         # if the current line is empty or not anymore a command, parse as usual
162         /^$/ b 0
163         /^[^    ]/ b 0
165         # get rid of the last pieces of automake's silent rules feature
166         s/^     $(AM_V_[A-Za-z]\+)/     /
168         x
169         /^\n/ b 5
171         # skipping install-strip target, since it will trigger the echo-denoiser,
172         # and would silence the whole installation, which is absolutely not wanted
173         /^install-strip$/ {
174                 s/.*//
175                 x
176                 b 0
177         }
179         # skip the check target, otherwise test results would be stripped
180         /^check-TESTS$/ {
181                 s/.*//
182                 x
183                 b 0
184         }
186         # do some output based on rule target
187         /\.o$/ {
188                 i\
189         echo "Compiling $(<F)"
190                 b 4
191         }
192         /\.obj$/ {
193                 i\
194         echo "Compiling $(<F)"
195                 b 4
196         }
197         /\.a$/ {
198                 i\
199         echo "Building $(@F)"
200                 b 4
201         }
202         /$(EXEEXT)$/ {
203                 i\
204         echo "Linking $(@F)"
205                 b 4
206         }
207         /^\.po\.g\?mo$/ {
208                 i\
209         echo "Generating translations for $(<F:.po=)"
210                 b 4
211         }
212         /\.cpp$/ {
213                 i\
214         echo "Generating $(@F)"
215                 b 4
216         }
217         /\.moc$/ {
218                 i\
219         echo "Compiling meta objects $(@)"
220                 b 4
221         }
222         /\.$(OBJEXT)$/ {
223                 i\
224         echo "Compiling $(<F)"
225                 b 4
226         }
227         /^$(DOMAIN)\.pot-update$/ {
228                 i\
229         echo "Updating translation catalog template"
230                 b 4
231         }
232         /^$(POFILES)$/ {
233                 i\
234         echo "Updating translation catalog for $(@F:.po=)"
235                 b 4
236         }
237         /^\.nop\.po-update$/ {
238                 i\
239         echo "Updating translation catalog for $(<F:.nop=)"
240                 b 4
241         }
242         :4
243         # indicate that we already did the echo thingie
244         #
245         # s/^/\n/ works with newer sed versions like 4.1.2,
246         # but unfortunately msys uses sed 3.02, which does not
247         # translate \n to a newline in the replacement string.
248         #s/^/\n/
249         #
250         # Compatible method: include a newline literally
251         s/^/\
253         :5
255         # If --enable-maintainer-mode, Makefiles may be automatically regenerated.
256         # Denoise new Makefile aswell.
257         /Makefile$/ {
258                 x
259                 /echo/! {
260                         /config\.status[         ][     ]*[^    ][^     ]*/ s/\(config\.status[          ][     ]*[^    ][^     ]*[^;\&\|]*\)\(.*\)/\1 denoiser\2/
261                 }
262                 x
263         }
265         x
267 #if levels 3,4
268         # Denoise echo commands (assuming that no echo command contains the ';' character)
269         #
270         # Denoising works by redirecting output to /dev/null, which is slower, though safer
271         # than removing the command.
272         /^[     ]*@*echo/ {
273                 x
274                 /maintainer-clean-generic/ b 6a
275                 /uninstall/ b 6c
276                 # Install targets may contain echo commands that must not be redirected,
277                 # so skip this echo unless it contains installation code
278                 /install/ {
279                         x
280                         /$(INSTALL/ b 6d
281                         /installing/ b 6d
282                         b 6
283                         :6d
284                         x
285                 }
286                 :6c
287 #if level 3
288                 /maintainer/ b 6a
289                 /$(RECURSIVE_TARGETS)/ b 6a
290                 /recursive/ b 6a
291 #endif
292                 b 6b
293                 :6a
294                 x
295                 b 6
296                 :6b
297                 x
298                 G
299                 h
300                 s/\(echo[^;][^;]*\).*/\1/
301                 # do not redirect if it's already redirected
302                 />/ {
303                         g
304                         s/[^\n]*//
305                         x
306                         s/\n.*//
307                         b 6
308                 }
309                 g
310                 s/[^\n]*//
311                 x
312                 s/\n.*//
313                 s/\(.*echo[^;][^;]*\)\(.*\)/\1>\/dev\/null\2/
314                 :6
315         }
316 #endif (levels 3,4)
317         
318         # mkinstalldirs will also echo its job, sink its output too
319         /$(mkinstalldirs)/ {
320                 G
321                 h
322                 s/\($(mkinstalldirs)[^;][^;]*\).*/\1/
323                 # do not redirect if it's already redirected
324                 />/ {
325                         g
326                         s/[^\n]*//
327                         x
328                         s/\n.*//
329                         b 7
330                 }
331                 g
332                 s/[^\n]*//
333                 x
334                 s/\n.*//
335                 s/\(.*$(mkinstalldirs)[^;][^;]*\)\(.*\)/\1>\/dev\/null\2/
336                 :7
337         }
339 #if level 4
340         # the above applies to msgfmt, but here it's enough to remove the '--statistics' flag
341         /$(GMSGFMT)/ s/--statistics//
343         # msgmerge needs a --silent flag
344         s/$(MSGMERGE)/\0 --silent/
345         s/$(MSGMERGE_UPDATE)/\0 --silent/
346 #endif
348         # the following two ruleset must be the last two in this block and in this order!
350 #if levels 3,4
351         # uninstallation
352         /^[     ]*rm -f[^;]*$(DESTDIR)/ {
353                 x
354                 /uninstall/ {
355                         H
356                         g
357                         s/.*rm -f[^;]*$(DESTDIR)\([^;" ][^;" ]*\).*/    echo "Uninstalling \1"; \\/
358                         P
359                         g
360                         s/[^\n]*//
361                         x
362                         s/\n.*//
363                         # skip checking for install: 1) trivially false 2) uninstall would match /install/
364                         b 2
365                 }
366                 x
367         }
369         # installation
370         /^[     ]*$([^)]*INSTALL/ {
371                 x
372                 /install/ {
373                         H
374                         g
375                         s/.*$(DESTDIR)\([^;" ][^;" ]*\).*/      echo "Installing \1"; \\/
376                         s/$(modulesdir)$$dir/$(modulesdir)/
377                         P
378                         g
379                         s/[^\n]*//
380                         x
381                         s/\n.*//
382                         b 2
383                 }
384                 x
385         }
386 #endif (levels 3,4)
388         b 2
390 #endif (levels 2,3,4)
393 # ---- the preprocessor ----
395 ## default processing mode is 'true'
396 #1 {
397 #       x
398 #       s/.*/1/
399 #       x
402 ## delete empty lines
403 #/^[    ]*$/ d;
405 ## look for "#if "
406 #/^#if / {
407 #       /level.*$level/ {
408 #               x
409 #               s/^/1/
410 #               x
411 #               b0
412 #       }
413 #       x
414 #       s/^/0/
415 #       x
416 #       :0
417 #       d
420 ## process "#else"
421 #/^#else/ {
422 #       x
423 #       /^1/ {
424 #               s/1/0/
425 #               b1
426 #       }
427 #       s/0/1/
428 #       :1
429 #       x
430 #       d
433 ## check for "#endif"
434 #/^#endif/ {
435 #       x
436 #       s/.//
437 #       x
438 #       d
441 ## delete comments
442 #/^[    ]*#/ d
444 ## process code lines according to #if/#else/#endif
446 #/^1/ {
447 #       x
448 #       b