2 # This Makefile fragment is shared between the coreutils,
3 # CPPI, Bison, and Autoconf.
5 # Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2008 Free Software
8 # This program is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
21 # This is reported not to work with make-3.79.1
22 # ME := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
23 ME
:= $(srcdir)/maint.mk
25 # Do not save the original name or timestamp in the .tar.gz file.
26 # Use --rsyncable if available.
28 $(shell gzip
--help
2>/dev
/null|grep rsyncable
>/dev
/null
&& echo
--rsyncable
)
29 GZIP_ENV
= '--no-name --best $(gzip_rsyncable)'
33 # cvsu is part of the cvsutils package: http://www.red-bean.com/cvsutils/
34 CVS_LIST
= build-aux
/vc-list-files
37 $(CVS_LIST
) | if
test -f .x-
$@
; then grep
-vEf .x-
$@
; else grep
-v ChangeLog
; fi
39 ifeq ($(origin prev_version_file
), undefined
)
40 prev_version_file
= .prev-version
43 PREV_VERSION
:= $(shell cat
$(prev_version_file
))
44 VERSION_REGEXP
= $(subst .
,\.
,$(VERSION
))
46 tag-package
= $(shell echo
"$(PACKAGE)" | tr
'[:lower:]' '[:upper:]')
47 tag-this-version
= $(subst .
,_
,$(VERSION
))
48 this-cvs-tag
= $(tag-package
)-$(tag-this-version
)
49 my_distdir
= $(PACKAGE
)-$(VERSION
)
51 # Old releases are stored here.
52 # Used for diffs and xdeltas.
53 release_archive_dir ?
= ..
/release
55 # Prevent programs like 'sort' from considering distinct strings to be equal.
56 # Doing it here saves us from having to set LC_ALL elsewhere in this file.
65 # FIXME: add a check to prohibit definition in src/*.c of symbols defined
66 # in system.h. E.g. today I removed from tail.c a useless definition of
67 # ENOSYS. It was useless because system.h ensures it's defined.
69 # Checks that don't require cvs.
70 # Run `changelog-check' last, as previous test may reveal problems requiring
71 # new ChangeLog entries.
72 local-checks-available
= \
73 po-check copyright-check writable-files m4-check author_mark_check \
74 changelog-check patch-check strftime-check
$(syntax-check-rules
) \
75 makefile_path_separator_check \
76 makefile-check check-AUTHORS
77 .PHONY
: $(local-checks-available
)
79 local-check
= $(filter-out $(local-checks-to-skip
), $(local-checks-available
))
81 # Collect the names of rules starting with `sc_'.
82 syntax-check-rules
:= $(shell sed
-n
's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' $(ME
))
83 .PHONY
: $(syntax-check-rules
)
85 syntax-check
: $(syntax-check-rules
)
86 # @shopt -s nullglob; \
87 # grep -nE '# *include <(limits|std(def|arg|bool))\.h>' \
88 # $$(find -type f -name '*.[chly]') /dev/null && \
89 # { echo '$(ME): found conditional include' 1>&2; \
92 # grep -nE '^# *include <(string|stdlib)\.h>' \
93 # $(srcdir)/{lib,src}/*.[chly] /dev/null && \
94 # { echo '$(ME): FIXME' 1>&2; \
96 # FIXME: don't allow `#include .strings\.h' anywhere
98 sc_cast_of_argument_to_free
:
100 grep
-nE
'\<free \(\(' \
101 $(srcdir)/{lib
,src
}/*.
[chly
] /dev
/null
&& \
102 { echo
'$(ME): don'\''t cast free argument' 1>&2; \
105 sc_cast_of_x_alloc_return_value
:
106 @shopt
-s nullglob
; \
107 grep
-nE
--exclude
=$(srcdir)/lib
/regex.c \
108 '\*\) *x(m|c|re)alloc\>' \
109 $(srcdir)/{lib
,src
}/*.
[chly
] /dev
/null
&& \
110 { echo
'$(ME): don'\''t cast x*alloc return value' 1>&2; \
113 sc_cast_of_alloca_return_value
:
114 @shopt
-s nullglob
; \
115 grep
-nE
'\*\) *alloca\>' \
116 $(srcdir)/src
/*.
[chly
] /dev
/null
&& \
117 { echo
'$(ME): don'\''t cast alloca return value' 1>&2; \
121 @grep
-n
'[ ] ' $$($(CVS_LIST_EXCEPT
)) && \
122 { echo
'$(ME): found SPACE-TAB sequence; remove the SPACE' \
125 # Don't use the old ato* functions in `real' code.
126 # They provide no error checking mechanism.
127 # Instead, use strto* functions.
128 sc_prohibit_atoi_atof
:
129 @grep
-nE
'\<ato([filq]|ll)\>' $$($(CVS_LIST_EXCEPT
)) && \
130 { echo
'$(ME): do not use ato''f, ato''i, ato''l, ato''ll, or ato''q' \
133 # Using EXIT_SUCCESS as the first argument to error is misleading,
134 # since when that parameter is 0, error does not exit. Use `0' instead.
135 sc_error_exit_success
:
136 @grep
-nF
'error (EXIT_SUCCESS,' \
137 $$(find
-type f
-name
'*.[chly]') /dev
/null
&& \
138 { echo
'$(ME): found error (EXIT_SUCCESS' 1>&2; \
142 @grep
-ni
'file''system' $$($(CVS_LIST_EXCEPT
)) && \
143 { echo
'$(ME): found use of "file''system";' \
144 'rewrite to use "file system"' 1>&2; \
147 sc_no_if_have_config_h
:
148 @grep
-n
'^# *if HAVE_CONFIG_H' $$($(CVS_LIST_EXCEPT
)) && \
149 { echo
'$(ME): found use of #if HAVE_CONFIG_H; use #ifdef' \
152 # Nearly all .c files must include <config.h>.
154 @grep
-L
'^# *include <config\.h>' /dev
/null \
155 $$($(CVS_LIST_EXCEPT
) | grep
'\.c$$') \
156 | grep
-v
/dev
/null
&& \
157 { echo
'$(ME): the above files do not include <config.h>' \
160 # Prohibit the inclusion of assert.h without an actual use of assert.
161 sc_prohibit_assert_without_use
:
162 @files
=$$(grep
-l
'# *include <assert\.h>' /dev
/null \
163 $$($(CVS_LIST_EXCEPT
) | grep
'\.c$$')) && \
164 grep
-L
'\<assert (' $$files /dev
/null \
165 | grep
-v
/dev
/null
&& \
166 { echo
"$(ME): the above files include <assert.h> but don't use it" \
170 @grep
-nE
'\<(HAVE''_FCNTL_H|O''_NDELAY)\>' \
171 $$($(CVS_LIST_EXCEPT
)) && \
172 { echo
'$(ME): do not use HAVE''_FCNTL_H or O''_NDELAY' \
175 # FIXME: warn about definitions of EXIT_FAILURE, EXIT_SUCCESS, STREQ
177 # Each nonempty line must start with a year number, or a TAB.
179 @grep
-n
'^[^12 ]' $$(find .
-maxdepth
2 -name ChangeLog
) && \
180 { echo
'$(ME): found unexpected prefix in a ChangeLog' 1>&2; \
183 # Ensure that dd's definition of LONGEST_SYMBOL stays in sync
184 # with the strings from the two affected variables.
185 dd_c
= $(srcdir)/src
/dd.c
186 sc_dd_max_sym_length
:
187 ifneq ($(wildcard $(dd_c
)),)
188 @len
=$$( (sed
-n
'/conversions\[\] =$$/,/^};/p' $(dd_c
);\
189 sed
-n
'/flags\[\] =$$/,/^};/p' $(dd_c
) ) \
190 |sed
-n
'/"/s/^[^"]*"\([^"]*\)".*/\1/p' \
191 | wc
--max-line-length
); \
192 max
=$$(sed
-n
'/^#define LONGEST_SYMBOL /s///p' $(dd_c
) \
193 |tr
-d
'"' | wc
--max-line-length
); \
194 if
test "$$len" = "$$max"; then
:; else \
195 echo
'dd.c: LONGEST_SYMBOL is not longest' 1>&2; \
200 # Many m4 macros names once began with `jm_'.
201 # On 2004-04-13, they were all changed to start with gl_ instead.
202 # Make sure that none are inadvertently reintroduced.
203 sc_prohibit_jm_in_m4
:
204 @grep
-nE
'jm_[A-Z]' \
205 $$($(CVS_LIST
) $(srcdir)/m4 |grep
'\.m4$$') && \
206 { echo
'$(ME): do not use jm_ in m4 macro names' \
210 @t1
=sc-root.expected
; t2
=sc-root.actual
; \
211 grep
-nl
'^PRIV_CHECK_ARG=require-root' \
212 $$($(CVS_LIST
) tests
) |sed s
/tests
/.
/ |
sort > $$t1; \
213 sed
-n
's, cd \([^ ]*\) .*MAKE..check TESTS=\(.*\),./\1/\2,p' \
214 $(srcdir)/tests
/Makefile.am |
sort > $$t2; \
215 diff
-u
$$t1 $$t2 || diff
=1; \
218 && { echo
'tests/Makefile.am: missing check-root action'>&2; \
221 # Files in src/ should not include directly any of
222 # the headers already included via system.h.
224 @if
test -f
$(srcdir)/src
/system.h
; then \
226 sed
-n
'/^# *include /s///p' $(srcdir)/src
/system.h
/dev
/null \
227 | grep
-Ev
'sys/(param|file)\.h' \
228 | sed
's/ .*//;;s/^["<]/^# *include [<"]/;s/\.h[">]$$/\\.h[">]/' \
231 $$($(CVS_LIST
) src | \
232 grep
-Ev
'((copy|system)\.h|parse-gram\.c)$$') \
233 && { echo
'$(ME): the above are already included via system.h'\
234 1>&2; exit
1; } ||
:; \
239 'solaris[^[:alnum:]]*2\.(7|8|9|[1-9][0-9])|sunos[^[:alnum:]][6-9]' \
240 $$($(CVS_LIST_EXCEPT
)) && \
241 { echo
'$(ME): found misuse of Sun OS version numbers' 1>&2; \
245 @grep
-ni
'\<the ''the\>' $$($(CVS_LIST_EXCEPT
)) && \
246 { echo
'$(ME): found use of "the ''the";' 1>&2; \
250 test ! -d src ||
$(MAKE
) -C src
$@
253 @grep
-n
'[ ]$$' $$($(CVS_LIST_EXCEPT
)) && \
254 { echo
'$(ME): found trailing blank(s)' \
257 # Match lines like the following, but where there is only one space
258 # between the options and the description:
259 # -D, --all-repeated[=delimit-method] print all duplicate lines\n
260 longopt_re
= --[a-z
][0-9A-Za-z-
]*(\
[=[0-9A-Za-z-
]*\
])?
261 sc_two_space_separator_in_usage
:
262 @grep
-nE
'^ *(-[A-Za-z],)? $(longopt_re) [^ ].*\\$$' \
263 $$($(CVS_LIST_EXCEPT
)) && \
264 { echo
"$(ME): help2man requires at least two spaces between"; \
265 echo
"$(ME): an option and its description"; \
268 # Look for diagnostics that aren't marked for translation.
269 # This won't find any for which error's format string is on a separate line.
270 sc_unmarked_diagnostics
:
272 '\<error \([^"]*"[^"]*[a-z]{3}' $$($(CVS_LIST_EXCEPT
)) \
273 | grep
-v
'_''(' && \
274 { echo
'$(ME): found unmarked diagnostic(s)' 1>&2; \
277 # Avoid useless parentheses like those in this example:
278 # #if defined (SYMBOL) || defined (SYM2)
279 sc_useless_cpp_parens
:
280 @grep
-n
'^# *if .*defined *(' $$($(CVS_LIST_EXCEPT
)) && \
281 { echo
'$(ME): found useless parentheses in cpp directive' \
284 # Ensure that the c99-to-c89 patch applies cleanly.
286 if
test -f src
/c99-to-c89.diff
; then \
287 rm -rf src-c89
$@
.1 $@
.2 && \
288 cp
-a src src-c89
&& \
289 (cd src-c89
; patch
-V never
--fuzz
=0) < src
/c99-to-c89.diff \
291 { grep
-v
'^patching file ' $@
.1 > $@
.2 ||
:; } && \
293 rm -rf src-c89
$@
.1 $@
.2; \
296 # Ensure that date's --help output stays in sync with the info
297 # documentation for GNU strftime. The only exception is %N,
298 # which date accepts but GNU strftime does not.
299 extract_char
= sed
's/^[^%][^%]*%\(.\).*/\1/'
301 if
test -f
$(srcdir)/src
/date.c
; then \
302 grep
'^ %. ' $(srcdir)/src
/date.c |
sort \
303 |
$(extract_char
) > $@
-src
; \
305 info libc date calendar format | grep
'^ `%.'\' \
306 |
$(extract_char
); } |
sort > $@
-info; \
307 diff
-u
$@
-src
$@
-info || exit
1; \
308 rm -f
$@
-src
$@
-info; \
312 test ! -d src ||
$(MAKE
) -C src
$@
314 # Ensure that we use only the standard $(VAR) notation,
315 # not @...@ in Makefile.am, now that we can rely on automake
316 # to emit a definition for each substituted variable.
318 grep
-nE
'@[A-Z_0-9]+@' `find . -name Makefile.am` \
319 && { echo
'$(ME): use $$(...), not @...@' 1>&2; exit
1; } ||
:
321 news-date-check
: NEWS
322 today
=`date +%Y-%m-%d`; \
323 if head NEWS | grep
'^\*.* $(VERSION_REGEXP) ('$$today')' \
327 echo
"version or today's date is not in NEWS" 1>&2; \
332 if head ChangeLog | grep
'Version $(VERSION_REGEXP)\.$$' \
336 echo
"$(VERSION) not in ChangeLog" 1>&2; \
341 @shopt
-s nullglob
; \
342 grep
'AC_DEFUN([^[]' m4
/*.m4
/dev
/null \
343 && { echo
'$(ME): quote the first arg to AC_DEFUN' 1>&2; \
346 # Verify that all source files using _() are listed in po/POTFILES.in.
347 # FIXME: don't hard-code file names below; use a more general mechanism.
349 if
test -f po
/POTFILES.in
; then \
350 grep
-E
-v
'^(#|$$)' po
/POTFILES.in \
351 | grep
-v
'^src/false\.c$$' |
sort > $@
-1; \
353 for file in
$$($(CVS_LIST_EXCEPT
)) lib
/*.
[ch
]; do \
355 djgpp
/* | man
/*) continue
;; \
359 base
=`expr " $$file" : ' \(.*\)\..'`; \
360 { test -f
$$base.l ||
test -f
$$base.y
; } && continue
;; \
362 files
="$$files $$file"; \
364 grep
-E
-l
'\bN?_\([^)"]*("|$$)' $$files |
sort -u
> $@
-2; \
365 diff
-u
$@
-1 $@
-2 || exit
1; \
369 # In a definition of #define AUTHORS "... and ..." where the RHS contains
370 # the English word `and', the string must be marked with `N_ (...)' so that
371 # gettext recognizes it as a string requiring translation.
373 @grep
-n
'^# *define AUTHORS "[^"]* and ' src
/*.c |grep
-v
' N_ (' && \
374 { echo
'$(ME): enclose the above strings in N_ (...)' 1>&2; \
377 # Sometimes it is useful to change the PATH environment variable
378 # in Makefiles. When doing so, it's better not to use the Unix-centric
379 # path separator of `:', but rather the automake-provided `@PATH_SEPARATOR@'.
380 # It'd be better to use `find -print0 ...|xargs -0 ...', but less portable,
381 # and there probably aren't many projects with so many Makefile.am files
382 # that we'd have to worry about limits on command line length.
383 msg
= '$(ME): Do not use `:'\'' above; use @PATH_SEPARATOR@ instead'
384 makefile_path_separator_check
:
385 @grep
-n
'PATH=.*:' `find $(srcdir) -name Makefile.am` \
386 && { echo
$(msg
) 1>&2; exit
1; } ||
:
388 # Check that `make alpha' will not fail at the end of the process.
390 if
test -d
$(release_archive_dir
); then
:; else \
391 mkdir
$(release_archive_dir
); \
393 for file in
$(distdir
).
tar.gz
$(xd-delta
) \
394 $(release_archive_dir
)/$(distdir
).
tar.gz \
395 $(release_archive_dir
)/$(xd-delta
); do \
396 test -e
$$file || continue
; \
398 ||
{ echo ERROR
: $$file is not writable
; fail
=1; }; \
400 test "$$fail" && exit
1 ||
:
402 v_etc_file
= lib
/version-etc.c
403 # Make sure that the copyright date in $(v_etc_file) is up to date.
405 @if
test -f
$(v_etc_file
); then \
406 grep
'enum { COPYRIGHT_YEAR = '$$(date
+%Y
)' };' $(v_etc_file
) \
408 ||
{ echo
'out of date copyright in $(v_etc_file); update it' 1>&2; \
413 # Sanity checks with the CVS repository.
415 echo
$(this-cvs-tag
); \
416 if
$(CVS
) -n log
-h README | grep
-e
$(this-cvs-tag
): >/dev
/null
; then \
417 echo
"$(this-cvs-tag) as already been used; not tagging" 1>&2; \
422 if
$(CVS
) diff
>cvs-diffs
; then \
425 echo
"Some files are locally modified:" 1>&2; \
430 cvs-check
: cvs-diff-check cvs-tag-check
432 maintainer-distcheck
:
437 # Tag before making distribution. Also, don't make a distribution if
438 # checks fail. Also, make sure the NEWS file is up-to-date.
439 # FIXME: use dist-hook/my-dist like distcheck-hook/my-distcheck.
440 cvs-dist
: $(local-check
) cvs-check maintainer-distcheck
442 $(CVS
) tag
-c
$(this-cvs-tag
)
445 # Use this to make sure we don't run these programs when building
446 # from a virgin tgz file, below.
447 null_AM_MAKEFLAGS
= \
454 # Detect format-string/arg-list mismatches that would normally be obscured
455 # by the use of _(). The --disable-nls effectively defines away that macro,
456 # and building with CFLAGS='-Wformat -Werror' causes any format warning to be
457 # treated as a failure. Also, check for shadowing problems with -Wshadow,
458 # and for pointer arithmetic problems with -Wpointer-arith.
459 # These CFLAGS are pretty strict. If you build this target, you probably
460 # have to have a recent version of gcc and glibc headers.
462 t
=$(TMPDIR
)/$(PACKAGE
)/test
463 my-distcheck
: $(local-check
) $(release_archive_dir
)/$(prev-tgz
)
466 GZIP
=$(GZIP_ENV
) $(AMTAR
) -C
$(t
) -zxf
$(distdir
).
tar.gz
468 && .
/configure
--disable-nls \
469 && $(MAKE
) CFLAGS
='-Werror -Wall -Wformat -Wshadow -Wpointer-arith' \
470 AM_MAKEFLAGS
='$(null_AM_MAKEFLAGS)' \
474 (cd
$(t
) && mv
$(distdir
) $(distdir
).old \
475 && $(AMTAR
) -zxf
- ) < $(distdir
).
tar.gz
476 diff
-ur
$(t
)/$(distdir
).old
$(t
)/$(distdir
)
478 @echo
"========================"; \
479 echo
"$(distdir).tar.gz is ready for distribution"; \
480 echo
"========================"
482 prev-tgz
= $(PACKAGE
)-$(PREV_VERSION
).
tar.gz
483 xd-delta
= $(PACKAGE
)-$(PREV_VERSION
)-$(VERSION
).xdelta
485 rel-files
= $(xd-delta
) $(DIST_ARCHIVES
)
486 announcement
: NEWS ChangeLog
$(rel-files
)
488 --release-type
=$(RELEASE_TYPE
) \
489 --package
=$(PACKAGE
) \
490 --prev
=$(PREV_VERSION
) \
492 --release-archive-directory
=$(release_archive_dir
) \
493 --gpg-key-id
=$(gpg_key_ID
) \
495 $(addprefix --url-dir
=, $(url_dir_list
)) \
498 ## ---------------- ##
499 ## Updating files. ##
500 ## ---------------- ##
502 ftp-gnu
= ftp
://ftp.gnu.org
/gnu
503 www-gnu
= http
://www.gnu.org
505 # Use mv-if-change if you prefer it.
509 # --------------------- #
510 # Updating everything. #
511 # --------------------- #
514 local_updates ?
= cvs-update
515 update
: $(local_updates
)
518 # -------------------------- #
519 # Updating GNU build tools. #
520 # -------------------------- #
523 $(srcdir)/build-aux
/depcomp \
524 $(srcdir)/build-aux
/install-sh \
525 $(srcdir)/build-aux
/missing
526 gnulib_repo
=:pserver
:anonymous@cvs.savannah.gnu.org
:/sources
/gnulib
528 wget-update
: $(get-targets
)
533 for f in
$(cvs_files
) dummy
; do \
534 test $$f = dummy
&& continue
; \
535 test -f
$$f ||
{ echo
"*** skipping $$f" 1>&2; continue
; }; \
536 cvs diff
$$f > /dev
/null \
537 ||
{ echo
"*** $$f is locally modified; skipping it" 1>&2; \
538 fail
=yes
; continue
; }; \
539 file
=$$(expr
"X$$f" : 'X$(srcdir)/\(.*\)'); \
540 echo checking out
$$file...
; \
541 $(CVS
) -d
$(gnulib_repo
) co -p gnulib
/$$file >$$f.t \
542 && $(move_if_change
) $$f.t
$$f; \
544 test "$$fail" && exit
1
546 emit_upload_commands
:
547 @echo
=====================================
548 @echo
=====================================
549 @echo
"$(srcdir)/build-aux/gnupload $(GNUPLOADFLAGS) \\"
550 @echo
" --to $(gnu_rel_host):coreutils \\"
551 @echo
" $(rel-files)"
552 @echo
'# send the /tmp/announcement e-mail'
553 @echo
=====================================
554 @echo
=====================================
556 $(xd-delta
): $(release_archive_dir
)/$(prev-tgz
) $(distdir
).
tar.gz
557 xdelta delta
-9 $^
$@ ||
:
559 .PHONY
: alpha beta major
560 alpha beta major
: news-date-check changelog-check
$(local-check
)
562 && { echo
$(VERSION
) | grep
-E
'^[0-9]+(\.[0-9]+)+$$' \
563 ||
{ echo
"invalid version string: $(VERSION)" 1>&2; exit
1;};}\
567 $(MAKE
) -s announcement RELEASE_TYPE
=$@
> /tmp
/announce-
$(my_distdir
)
568 ln
$(rel-files
) $(release_archive_dir
)
569 chmod a-w
$(rel-files
)
570 $(MAKE
) -s emit_upload_commands RELEASE_TYPE
=$@
571 echo
$(VERSION
) > $(prev_version_file
)
572 $(CVS
) ci
-m.
$(prev_version_file
)