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/>.
|