summaryrefslogtreecommitdiff
path: root/NG-NEWS
blob: fa5a72abe350570b71fef12b9ebdd32a10bf86cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
This file lists the major changes and differences between mainstream
Automake and Automake-NG.  Be aware that there is likely a plethora
of other minor differences and incompatibilities *not* listed here.


Automatic dependency tracking support
=====================================

* The generated Makefile.in files use "-include", not "include", to
  read the '.Po' files containing automatically computed dependency
  information.

* We unconditionally assume that the "include" and "-include"
  directives can be used in the generated Makefiles.  Accordingly,
  the internal m4 macro 'AM_MAKE_INCLUDE' and AC_SUBST'd variables
  'am__include' and 'am__quote' have been removed.

* The makefile fragments files containing automatically computed
  dependency information are created at make runtime by Makefile
  recipes, not at configure time by config.status.  Accordingly,
  the special config.status argument 'depfiles' is not supported
  anymore.


Silent rules
============

* The silent rules support has been simplified to take advantage
  of more GNU make features.  Among other things, the AC_SUBST'd
  variables '@AM_V@' and'@AM_DEFAULT_V@' have been removed.  Now,
  when defining uses custom silent rules, you should do something
  like:

      # Modern correct way.
      pkg_verbose = $(pkg_verbose/$(V))
      pkg_verbose/0 = @echo PKG-GEN $@;
      pkg_verbose/1 =

  while the old idiom would have been something like:

      # Old obsolete way, won't work anymore.
      pkg_verbose = $(pkg_verbose_@AM_V@)
      pkg_verbose_ = $(pkg_verbose_@AM_DEFAULT_V@)
      pkg_verbose_0 = @echo PKG-GEN $@;


Warnings and diagnostic
=======================

* Automake does not warn anymore about:

  - non-POSIX variable names, like "$(dash-separated)" or "$(stem/base)";

  - nested variable expansions, like "$(foo$(V))";

  - variable definitions with indirections, like "var$(i) = value";

  - calls to make functions, whether built-in ones like "$(wildcard *.c)"
    or user-defined ones like "$(call my-func, arg1, arg2)".

  - pattern rules in GNU make style ("%.o: %.c").

  - variable definitions with ":=", as in "foo := $(immediate-evaluation)".

  - some issues specific to BSD make.

* The 'portability-recursive' warning category is obsolete, and has been
  removed.

* Automake-NG is less smart than mainline Automake in detecting some kind
  of possible typos or suspicious usages at automake runtime.  This is due
  to the fact that more processing and logic takes place in the generated
  Makefiles rather than in the automake script, so that the latter has
  access to less context and information.

* Diagnostic about possible typos in '_SOURCES', '_LIBADD, '_LDFLAGS',
  '_LDADD' and '_DEPENDENCIES' variables is now done at make runtime
  rather than at automake runtime.  In case some (or all) such diagnostic
  is undesired, it can be silenced by adding the affected variables to
  the 'AM_VARTYPOS_WHITELIST' variable, as in:

        bin_PROGRAMS = cp mv
        copy_LDADD = -lselinux -lrt -acl
        cp_LDADD = $(copy_LDADD)
        mv_LDADD = $(copy_LDADD)
        # Without this, the generated Makefile would complain that
        # no program or library has 'copy' as canonical name.
        AM_VARTYPOS_WHITELIST = copy_LDADD


Compilation and Object Files
=============================

* If a source file is placed in a subdirectory, the corresponding compiled
  object will always be put into the subdirectory named after the source
  file, rather than in the current directory.  For instance, 'src/file.c'
  and 'src/file.f90' will be compiled to 'src/file.o', and 'sub/dir/mu.cc'
  will be compiled to 'sub/dir/mu.o'.
  That is, Automake-NG will unconditionally behave as Automake would do if
  its 'subdir-objects' option were active.


Serial testsuite harness (obsolescent)
======================================

* The $(TESTS) and $(XFAIL_TESTS) variables are no longer rewritten for
  $(EXEEXT) appending.  The use of compiled programs in $(TESTS) and
  $(XFAIL_TESTS) still works as before though, even on systems where
  $(EXEEXT) is non-empty.


Parallel testsuite harness
==========================

* Automake no longer automatically generate the definition of 'LOG_COMPILE'
  variables.  These have always been meant for internal use only anyway.

* The $(TESTS) and $(XFAIL_TESTS) variables are no longer rewritten for
  $(EXEEXT) appending.  The use of compiled programs in $(TESTS) still
  works as before though, even on systems where $(EXEEXT) is non-empty,
  thanks to a careful use of pattern rules.

* The new implementation of the parallel-tests harness tries to defer
  as much as possible processing on the $(TESTS), $(XFAIL_TESTS) and
  $(TEST_EXTENSIONS) variable at make runtime, rather than doing it at
  automake time.  This has several positive effects (described below),
  but also entails a minor annoyance: due to implementation reasons, the
  'test-driver' auxiliary script is now always required and distributed,
  even if no test script actually uses it as its LOG_DRIVER script.
  This is not a big deal in practice, since as of today, all the real
  world packages out there actually use 'test-driver' for most (if not
  all) of their tests (the introduction of TAP support in mainstream
  automake being too recent for those packages to have had time to phase
  out their protocol-less tests, assuming they wanted to -- which is
  usually not the case either).

* The parallel testsuite harness realizes whether an entry of $(TESTS)
  start with $(srcdir) (as in "TESTS = $(srcdir)/foo.test"), and manages
  to correctly create the corresponding '.log' and '.trs' files in the
  build directory rather than in the source directory.

* The contents of $(TESTS) are mostly analyzed at make runtime rather
  than at automake runtime, so that it is now possible to use GNU make
  advanced features (like specific builtins or user-defined functions)
  in the definition of $(TESTS); for example, the following should now
  work as expected:

      TESTS = $(wildcard $(srcdir)/t[0-9][0-9]*.sh)

* The contents of $(TEST_EXTENSIONS) are mostly analyzed at make runtime
  rather than at automake runtime, so that it is now possible to use
  Automake conditionals and GNU make advanced features in the definition
  of $(TEST_EXTENSIONS); for example, the following should now work as
  expected:

      TEST_EXTENSIONS = $(sort $(suffix $(TESTS)))
      if SUPPORT_SHELL_TESTS
      TEST_EXTENSIONS += .sh
      endif

* We are more liberal and lenient in accepting TEST_EXTENSIONS entries:
  it's enough that they start with a dot to be considered valid.  However,
  using overly "funny" characters (like '!' or '@') could cause problems,
  so the user is still advised to limit himself to the use of alphanumeric
  characters, plus eventually '.', '-', and '_'.

* Errors about invalid content of $(TEST_EXTENSIONS) are reported at
  make runtime, not auto Automake runtime.

* It is no longer possible to override TEST_LOGS at make runtime as a
  mean to redefine the list of tests to be run.

    # This won't work anymore!
    make check TESTS_LOGS="foo.log bar.log baz.log"

  But it's still possible do so overriding TESTS at make runtime; and
  in this case (as was the case for TEST_LOGS overriding), it is not
  necessary to specify the extensions of the tests to be run:

    # This will work even if complete names of the tests are (say)
    # "foo.test", "bar.test$(EXEEXT)" and "baz$(EXEEXT)".
    make check TESTS="foo bar baz"

* The use of 'RECHECK_LOGS' is no longer supported.  Thus, to lazily
  re-run only the tests whose '.trs' or '.log' files are out-of-date,
  one must now use:

    make check AM_LAZY_CHECK=yes   # New valid API.

  instead of:

    make check RECHECK_LOGS=""     # Old API, won't work anymore.

* Per-suffix dependencies for test cases can be specified through
  variables "<ext>_LOG_DEPENDENCIES" (this being simply "LOG_DEPENDENCIES"
  for suffix-less tests).


Distribution
============

* "Bare" wildcards are no longer usable in $(EXTRA_DIST):

     EXTRA_DIST = $(srcdir)/doc/*.txt  # This won't work anymore.

   You'll have to use the $(wildcard) GNU make builtin instead, as in:

     EXTRA_DIST = $(wildcard $(srcdir)/doc/*.txt)  # Good.

   or even (for a better support of VPATH builds):

     EXTRA_DIST = $(wildcard doc/*.txt $(srcdir)/doc/*.txt)  # Better.

* The make variables $(DISTFILES), $(DIST_COMMON), $(DIST_SOURCES) and
  $(DIST_ARCHIVES) had never been documented in mainline Automake, and
  were always intended to be internal variables.  But that was not clear
  from their names.  So we have renamed rename like this:

    DISTFILES      =>  am.dist.all-files
    DIST_COMMON    =>  am.dist.common-files
    DIST_SOURCES   =>  am.dist.sources
    DIST_ARCHIVES  =>  am.dist.default-archives

  Do not use any of these variables in your Makefiles!

* Support for distribution archived in the '.shar.gz' and '.tar.Z' formats
  have been removed; and with them the targets 'dist-shar' and 'dist-tarZ'.

* The API to specify the formats of distribution tarballs has been changed
  completely.

  Instead of using the various 'dist-*' automake options, the developer is
  now expected to specify the default formats of its distribution tarballs
  with the special variable AM_DIST_FORMATS; for example, where once would
  have been:

      AM_INIT_AUTOMAKE([dist-bzip2 dist-zip])

  now it must be:

      AM_DIST_FORMATS = gzip bzip2 zip

  and similarly, where once would have been:

      AUTOMAKE_OPTIONS = no-dist-gzip dist-bzip2 dist-xz

  now is it simply:

      AM_DIST_FORMATS = bzip2 xz

* The various 'dist-*' targets (dist-gzip, dist-xz, dist-lzip, dist-bzip2
  and dist-gz) has been removed.  If the user wants to generate tarballs
  for formats not specified by the default AM_DIST_FORMATS, he can simply
  override that variable dynamically:

      # Will generate a '.zip' archive and a '.tar.xz' archive, and not
      # further ones.
      make dist AM_DIST_FORMATS='zip xz'

* The DIST_TARGETS variable has been removed (as a side-effect of the
  previous change).


Texinfo
=======

* Extension-less info files are no longer supported (mainline Automake
  has been warning against them since version 1.13.2, albeit it continues
  to support them for backward-compatibility).

* The only accepted suffix for input Texinfo files is now '.texi'; the
  once-accepted values '.txi' and '.texinfo' are no longer handled, and
  their use will trigger an error (mainline Automake has been warning
  against these suffixes since version 1.13.2, albeit it continues to
  support them for backward-compatibility).

* Disabling distribution of generated '.info' files be re-defining the
  'dist-info' target, as in:

      dist-info:
          @:

  (which has always been an undocumented hack in Automake) no longer
  works.  We are still considering whether to make an equivalent
  capability available with a new, cleaner and documented API.


Obsolete Features Removed
=========================

* If the sources for a target library like 'libfoo.a' or 'libbar.la' are
  not explicitly specified, mainline Automake looks also (respectively)
  for the files 'libfoo_a.c' or 'libbar_la.c' as possible default sources.
  Such a behaviour is deprecated though, and is present only for the sake
  of backward-compatibility.  Automake-NG has thus dropped the behaviour,
  and will only look for (respectively) 'libfoo.c' and 'libbar.c' as
  possible default sources.

* Automake-NG has removed automatic handling and distribution of the
  obsolescent 'acconfig.h', 'config.h.top' and 'config.h.bot' files.
  One should instead use the modern macros 'AH_VERBATIM' and 'AH_TEMPLATE',
  as recommended in the Autoconf manual (as of Autoconf 2.69, chapter
  "Obsolete Constructs", section "acconfig.h").

* The 'mkinstalldirs' script is no longer installed, distributed, nor
  provided; its same effects can be obtained by "install-sh -d" instead.
  Similarly, the $(mkinstallscripts) make variable is no longer defined;
  one should use $(MKDIR_P) instead.

* The Automake-defined internal make variable '$(ACLOCAL_M4)' has been
  renamed to '$(am.remake.aclocal-m4)', and should be considered an
  internal detail.

* The variables $(target_triplet), $(host_triplet) and $(build_triplet),
  which were redundant because aliases respectively for the variables
  $(target), $(host) and $(build), have been removed.  Simply use this
  latter variables.

* Threaded automake execution (as triggered by $AUTOMAKE_JOBS) has been
  removed altogether.  Exporting AUTOMAKE_JOBS to in the environment of
  Automake will now have no effect.

* Support for "maintainer mode" has been removed, and rules to remake
  maintainer-specific files are now always active.  The 'missing' script
  should till take care of warning users which find themselves in the
  situation of having to rebuild some maintainer-specific files but
  missing the relevant maintainer-specific tools (or having too old
  versions thereof).

* The $(RECURSIVE_CLEAN_TARGETS) variable (never documented, and
  always intended to be an internal detail) has been removed, its
  content merged into the $(RECURSIVE_TARGETS) variable.


Source Files with Unknown Extensions
====================================

* Automake-NG used a much simpler and dumber algorithm that mainline
  Automake to determine how to build an object associated to a source
  whose extension in not one of those handled internally by automake.

  The new algorithm goes like this.  For any file listed in a '_SOURCES'
  variable whose suffix is not recognized internally by automake (in
  contrast to known suffixes like '.c' or '.f90'), automake will obtain
  the expected target object file by stripping the suffix from the source
  file, and appending either '.$(OBJEXT)' or '.lo' to it (which one depends
  on whether the object is built as part of a program, a static library, or
  a libtool library).  It will then be assumed that the user has defined a
  rule (either explicit or defined from a pattern rule) which can turn that
  source file into this corresponding object file.  For example, on an
  input like:

      bin_PROGRAMS = foo
      foo_SOURCES = mu.ext1 fu.ext1 zu.ext1

  automake will expect that the three objects mu.$(OBJEXT), fu.$(OBJEXT)
  and zu.$(OBJEXT) are to be used in the linking of the 'foo' program, and
  that the user has provided proper recipes for all those objects to be
  built at make time, as well as a link command for linking 'foo'.  Here
  is an example of how those declarations could look like:

      %.$(OBJEXT): %.ext1
              my-compiler -c -o $@ $<
      foo_LINK = $(CC) -o $@

  In this particular case, the idiom above is basically the same one that
  would be required in mainline automake (apart for the fact that, there,
  old-fashioned suffix rules should be used instead of pattern rules).  To
  see what is truly changed with the new algorithm, we have to look at a
  more indirect usage.

  Mainline Automake follows the chain of user-defined pattern rules to
  determine how to build the object file deriving from a source file with
  a custom user extension; for example, upon reading:

       .zoo.cc:
               $(preprocess) $< > $@
       bin_PROGRAMS = foo
       foo_SOURCES = bar.zoo

  *mainline* Automake knows that it has to bring in the C++ support
  (compilation rules, requirement for AC_PROG_CXX in configure.ac, etc),
  and use the C++ linker to link the 'foo' executable.

  But Automake-NG will *no longer follow those implicit chains* of
  pattern rules; so that the idiom above will have to be re-worked
  like follows to preserve its intent and behaviour:

       %.cc: %.zoo:
               $(preprocess) $< > $@
       bin_PROGRAMS = foo
       # The use of '.cc' is required to let Automake know to bring in
       # stuff for the handling of C++ compilation, and to use the C++
       # linker to build 'foo'.
       nodist_foo_SOURCES = bar.cc
       EXTRA_DIST = foo.zoo

  And there is another major consequence of this change of semantics: now
  one can no longer use "header files" with extensions unrecognized to
  Automake; for example, an usage like this will cause errors at make
  runtime:

      # Won't work anymore.
      %.h: %.my-hdr
            $(preprocess-header) $< >$@
      foo_SOURCES = foo.c bar.my-hdr
      BUILT_SOURCES = bar.h

  errors that might look like:

      make[1]: *** No rule to make target 'bar.o', needed by 'zardoz'.  Stop.

  The simple workaround is to place the "non-standard" headers in EXTRA_DIST
  rather than in a _SOURCES variable:

      # This will work.
      %.h: %.my-hdr
            $(preprocess-header) $< >$@
      foo_SOURCES = foo.c foo.h
      EXTRA_DIST = foo.my-hdr
      BUILT_SOURCES = foo.h


Miscellaneous
=============

* Since GNU make is smart enough to correctly pass the values of macros
  redefined on the command line to sub-make invocations, the "special"
  variable $(AM_MAKEFLAGS) has been removed, and its content is no more
  passed to recursive make invocations.

* The make variable 'CONFIG_HEADER' had never been documented in mainline
  Automake, and since when the support for user setting of it has been
  removed (in favour of the use of the 'AC_CONFIG_HEADERS' autoconf macro
  in configure.ac), it has been intended as an internal variable only.
  So we've renamed it to 'AM_CONFIG_HEADERS'.  Do not override its value
  in your Makefiles!

* The Automake-generated make variable 'DEFAULT_INCLUDES', used internally
  in compilation rules and basically never documented in mainline Automake,
  has been renamed to AM_DEFAULT_INCLUDES, to avoid impinging on the user's
  namespace.  Do not override this variable in your Makefiles!

* The Automake-generated clean targets no longer exit successfully if an
  error occurs while removing a file or directory.

* The semantic of $(BUILT_SOURCES) support has been slightly altered; now,
  the files listed in $(BUILT_SOURCES) will be built not only before the
  "all", "check" or "install" targets, but before *any* target.

-----

Copyright (C) 2012-2015 Free Software Foundation, Inc.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.