
1: # -*-Makefile-*- 2: # This Makefile fragment is shared between the coreutils, 3: # CPPI, Bison, and Autoconf. 4: 5: ## Copyright (C) 2001-2007 Free Software Foundation, Inc. 6: ## 7: ## This program is free software; you can redistribute it and/or modify 8: ## it under the terms of the GNU General Public License as published by 9: ## the Free Software Foundation; either version 2, or (at your option) 10: ## any later version. 11: ## 12: ## This program is distributed in the hope that it will be useful, 13: ## but WITHOUT ANY WARRANTY; without even the implied warranty of 14: ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15: ## GNU General Public License for more details. 16: ## 17: ## You should have received a copy of the GNU General Public License 18: ## along with this program; if not, write to the Free Software 19: ## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 20: ## 02110-1301, USA. 21: 22: # This is reported not to work with make-3.79.1 23: # ME := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) 24: ME := Makefile.maint 25: 26: # Do not save the original name or timestamp in the .tar.gz file. 27: # Use --rsyncable if available. 28: gzip_rsyncable := \ 29: $(shell gzip --help 2>/dev/null|grep rsyncable >/dev/null && echo --rsyncable) 30: GZIP_ENV = '--no-name --best $(gzip_rsyncable)' 31: 32: CVS = cvs 33: GIT = git 34: VC = $(GIT) 35: VC-tag = git-tag -s -m '$(VERSION)' 36: 37: CVS_LIST = build-aux/vc-list-files 38: 39: CVS_LIST_EXCEPT = \ 40: $(CVS_LIST) | if test -f .x-$@; then grep -vEf .x-$@; else grep -v ChangeLog; fi 41: 42: ifeq ($(origin prev_version_file), undefined) 43: prev_version_file = .prev-version 44: endif 45: 46: PREV_VERSION := $(shell cat $(prev_version_file)) 47: VERSION_REGEXP = $(subst .,\.,$(VERSION)) 48: 49: tag-package = $(shell echo "$(PACKAGE)" | tr '[:lower:]' '[:upper:]') 50: tag-this-version = $(subst .,_,$(VERSION)) 51: this-vc-tag = $(tag-package)-$(tag-this-version) 52: my_distdir = $(PACKAGE)-$(VERSION) 53: 54: # Old releases are stored here. 55: # Used for diffs and xdeltas. 56: release_archive_dir ?= ../release 57: 58: # Prevent programs like 'sort' from considering distinct strings to be equal. 59: # Doing it here saves us from having to set LC_ALL elsewhere in this file. 60: export LC_ALL = C 61: 62: 63: 64: ## --------------- ## 65: ## Sanity checks. ## 66: ## --------------- ## 67: 68: # FIXME: add a check to prohibit definition in src/*.c of symbols defined 69: # in system.h. E.g. today I removed from tail.c a useless definition of 70: # ENOSYS. It was useless because system.h ensures it's defined. 71: 72: # Collect the names of rules starting with `sc_'. 73: syntax-check-rules := $(shell sed -n 's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' $(ME)) 74: .PHONY: $(syntax-check-rules) 75: 76: # Checks that don't require cvs. 77: # Run `changelog-check' last, as previous test may reveal problems requiring 78: # new ChangeLog entries. 79: local-checks-available = \ 80: po-check copyright-check m4-check author_mark_check \ 81: changelog-check patch-check strftime-check $(syntax-check-rules) \ 82: makefile_path_separator_check \ 83: makefile-check check-AUTHORS 84: .PHONY: $(local-checks-available) 85: 86: local-check := $(filter-out $(local-checks-to-skip), $(local-checks-available)) 87: 88: syntax-check: $(local-check) 89: # @grep -nE '# *include <(limits|std(def|arg|bool))\.h>' \ 90: # $$(find -type f -name '*.[chly]') && \ 91: # { echo '$(ME): found conditional include' 1>&2; \ 92: # exit 1; } || : 93: 94: # grep -nE '^# *include <(string|stdlib)\.h>' \ 95: # $(srcdir)/{lib,src}/*.[chy] && \ 96: # { echo '$(ME): FIXME' 1>&2; \ 97: # exit 1; } || : 98: # FIXME: don't allow `#include .strings\.h' anywhere 99: 100: sc_cast_of_argument_to_free: 101: @grep -nE '\<free \(\(' $$($(CVS_LIST_EXCEPT)) && \ 102: { echo '$(ME): don'\''t cast free argument' 1>&2; \ 103: exit 1; } || : 104: 105: sc_cast_of_x_alloc_return_value: 106: @grep -nE '\*\) *x(m|c|re)alloc\>' $$($(CVS_LIST_EXCEPT)) && \ 107: { echo '$(ME): don'\''t cast x*alloc return value' 1>&2; \ 108: exit 1; } || : 109: 110: sc_cast_of_alloca_return_value: 111: @grep -nE '\*\) *alloca\>' $$($(CVS_LIST_EXCEPT)) && \ 112: { echo '$(ME): don'\''t cast alloca return value' 1>&2; \ 113: exit 1; } || : 114: 115: sc_space_tab: 116: @grep -n '[ ] ' $$($(CVS_LIST_EXCEPT)) && \ 117: { echo '$(ME): found SPACE-TAB sequence; remove the SPACE' \ 118: 1>&2; exit 1; } || : 119: 120: # Don't use *scanf or the old ato* functions in `real' code. 121: # They provide no error checking mechanism. 122: # Instead, use strto* functions. 123: sc_prohibit_atoi_atof: 124: @grep -nE '\<([fs]?scanf|ato([filq]|ll))\>' $$($(CVS_LIST_EXCEPT)) && \ 125: { echo '$(ME): do not use *scan''f, ato''f, ato''i, ato''l, ato''ll, or ato''q' \ 126: 1>&2; exit 1; } || : 127: 128: # Using EXIT_SUCCESS as the first argument to error is misleading, 129: # since when that parameter is 0, error does not exit. Use `0' instead. 130: sc_error_exit_success: 131: @grep -nF 'error (EXIT_SUCCESS,' \ 132: $$(find -type f -name '*.[chly]') && \ 133: { echo '$(ME): found error (EXIT_SUCCESS' 1>&2; \ 134: exit 1; } || : 135: 136: sc_file_system: 137: @grep -ni 'file''system' $$($(CVS_LIST_EXCEPT)) && \ 138: { echo '$(ME): found use of "file''system";' \ 139: 'rewrite to use "file system"' 1>&2; \ 140: exit 1; } || : 141: 142: sc_no_have_config_h: 143: @grep -n 'HAVE''_CONFIG_H' $$($(CVS_LIST_EXCEPT)) && \ 144: { echo '$(ME): found use of HAVE''_CONFIG_H; remove' \ 145: 1>&2; exit 1; } || : 146: 147: # Nearly all .c files must include <config.h>. 148: sc_require_config_h: 149: @if $(CVS_LIST_EXCEPT) | grep '\.c$$' > /dev/null; then \ 150: grep -L '^# *include <config\.h>' \ 151: $$($(CVS_LIST_EXCEPT) | grep '\.c$$') \ 152: | grep . && \ 153: { echo '$(ME): the above files do not include <config.h>' \ 154: 1>&2; exit 1; } || :; \ 155: else :; \ 156: fi 157: 158: # Prohibit the inclusion of assert.h without an actual use of assert. 159: sc_prohibit_assert_without_use: 160: @if $(CVS_LIST_EXCEPT) | grep '\.c$$' > /dev/null; then \ 161: files=$$(grep -l '# *include <assert\.h>' \ 162: $$($(CVS_LIST_EXCEPT) | grep '\.c$$')) && \ 163: grep -L '\<assert (' $$files \ 164: | grep . && \ 165: { echo "$(ME): the above files include <assert.h> but don't use it" \ 166: 1>&2; exit 1; } || :; \ 167: else :; \ 168: fi 169: 170: sc_obsolete_symbols: 171: @grep -nE '\<(HAVE''_FCNTL_H|O''_NDELAY)\>' \ 172: $$($(CVS_LIST_EXCEPT)) && \ 173: { echo '$(ME): do not use HAVE''_FCNTL_H or O''_NDELAY' \ 174: 1>&2; exit 1; } || : 175: 176: # FIXME: warn about definitions of EXIT_FAILURE, EXIT_SUCCESS, STREQ 177: 178: # Each nonempty line must start with a year number, or a TAB. 179: sc_changelog: 180: @grep -n '^[^12 ]' $$(find . -maxdepth 2 -name ChangeLog) && \ 181: { echo '$(ME): found unexpected prefix in a ChangeLog' 1>&2; \ 182: exit 1; } || : 183: 184: # Ensure that dd's definition of LONGEST_SYMBOL stays in sync 185: # with the strings from the two affected variables. 186: dd_c = $(srcdir)/src/dd.c 187: sc_dd_max_sym_length: 188: ifneq ($(wildcard $(dd_c)),) 189: @len=$$( (sed -n '/conversions\[\] =$$/,/^};/p' $(dd_c);\ 190: sed -n '/flags\[\] =$$/,/^};/p' $(dd_c) ) \ 191: |sed -n '/"/s/^[^"]*"\([^"]*\)".*/\1/p' \ 192: | wc --max-line-length); \ 193: max=$$(sed -n '/^#define LONGEST_SYMBOL /s///p' $(dd_c) \ 194: |tr -d '"' | wc --max-line-length); \ 195: if test "$$len" = "$$max"; then :; else \ 196: echo 'dd.c: LONGEST_SYMBOL is not longest' 1>&2; \ 197: exit 1; \ 198: fi 199: endif 200: 201: # Many m4 macros names once began with `jm_'. 202: # On 2004-04-13, they were all changed to start with gl_ instead. 203: # Make sure that none are inadvertently reintroduced. 204: sc_prohibit_jm_in_m4: 205: @grep -nE 'jm_[A-Z]' \ 206: $$($(CVS_LIST) m4 |grep '\.m4$$'; echo /dev/null) && \ 207: { echo '$(ME): do not use jm_ in m4 macro names' \ 208: 1>&2; exit 1; } || : 209: 210: sc_root_tests: 211: @if test -d tests \ 212: && grep check-root tests/Makefile.am>/dev/null 2>&1; then \ 213: t1=sc-root.expected; t2=sc-root.actual; \ 214: grep -nl '^PRIV_CHECK_ARG=require-root' \ 215: $$($(CVS_LIST) tests) |sed s,tests,., |sort > $$t1; \ 216: sed -n 's, cd \([^ ]*\) .*MAKE..check TESTS=\(.*\),./\1/\2,p' \ 217: $(srcdir)/tests/Makefile.am |sort > $$t2; \ 218: diff -u $$t1 $$t2 || diff=1; \ 219: rm -f $$t1 $$t2; \ 220: test "$$diff" \ 221: && { echo 'tests/Makefile.am: missing check-root action'>&2; \ 222: exit 1; } || :; \ 223: fi 224: 225: headers_with_interesting_macro_defs = \ 226: exit.h \ 227: fcntl_.h \ 228: fnmatch_.h \ 229: intprops.h \ 230: inttypes_.h \ 231: lchown.h \ 232: openat.h \ 233: stat-macros.h \ 234: stdint_.h 235: 236: # Create a list of regular expressions matching the names 237: # of macros that are guaranteed by parts of gnulib to be defined. 238: .re-defmac: 239: @(cd $(srcdir)/lib; \ 240: for f in $(headers_with_interesting_macro_defs); do \ 241: test -f $$f && \ 242: sed -n '/^# *define \([^_ (][^ (]*\)[ (].*/s//\1/p' $$f; \ 243: done; \ 244: ) | sort -u \ 245: | grep -Ev 'ATTRIBUTE_NORETURN|SIZE_MAX' \ 246: | sed 's/^/^# *define /' \ 247: > $@-t 248: @mv $@-t $@ 249: 250: # Don't define macros that we already get from gnulib header files. 251: sc_always_defined_macros: .re-defmac 252: @if test -f $(srcdir)/src/system.h; then \ 253: trap 'rc=$$?; rm -f .re-defmac; exit $$rc' 0 1 2 3 15; \ 254: grep -f .re-defmac $$($(CVS_LIST)) \ 255: && { echo '$(ME): define the above via some gnulib .h file' \ 256: 1>&2; exit 1; } || :; \ 257: fi 258: 259: # Create a list of regular expressions matching the names 260: # of files included from system.h. Exclude a couple. 261: .re-list: 262: @sed -n '/^# *include /s///p' $(srcdir)/src/system.h \ 263: | grep -Ev 'sys/(param|file)\.h' \ 264: | sed 's/ .*//;;s/^["<]/^# *include [<"]/;s/\.h[">]$$/\\.h[">]/' \ 265: > $@-t 266: @mv $@-t $@ 267: 268: # Files in src/ should not include directly any of 269: # the headers already included via system.h. 270: sc_system_h_headers: .re-list 271: @if test -f $(srcdir)/src/system.h; then \ 272: trap 'rc=$$?; rm -f .re-list; exit $$rc' 0 1 2 3 15; \ 273: grep -nE -f .re-list \ 274: $$($(CVS_LIST) src | \ 275: grep -Ev '((copy|system)\.h|parse-gram\.c)$$') \ 276: && { echo '$(ME): the above are already included via system.h'\ 277: 1>&2; exit 1; } || :; \ 278: fi 279: 280: sc_sun_os_names: 281: @grep -nEi \ 282: 'solaris[^[:alnum:]]*2\.(7|8|9|[1-9][0-9])|sunos[^[:alnum:]][6-9]' \ 283: $$($(CVS_LIST_EXCEPT)) && \ 284: { echo '$(ME): found misuse of Sun OS version numbers' 1>&2; \ 285: exit 1; } || : 286: 287: sc_the_the: 288: @grep -ni '\<the ''the\>' $$($(CVS_LIST_EXCEPT)) && \ 289: { echo '$(ME): found use of "the ''the";' 1>&2; \ 290: exit 1; } || : 291: 292: sc_tight_scope: 293: $(MAKE) -C src $@ 294: 295: sc_trailing_blank: 296: @grep -n '[ ]$$' $$($(CVS_LIST_EXCEPT)) && \ 297: { echo '$(ME): found trailing blank(s)' \ 298: 1>&2; exit 1; } || : 299: 300: # Match lines like the following, but where there is only one space 301: # between the options and the description: 302: # -D, --all-repeated[=delimit-method] print all duplicate lines\n 303: longopt_re = --[a-z][0-9A-Za-z-]*(\[?=[0-9A-Za-z-]*\]?)? 304: sc_two_space_separator_in_usage: 305: @grep -nE '^ *(-[A-Za-z],)? $(longopt_re) [^ ].*\\$$' \ 306: $$($(CVS_LIST_EXCEPT)) && \ 307: { echo "$(ME): help2man requires at least two spaces between"; \ 308: echo "$(ME): an option and its description"; \ 309: 1>&2; exit 1; } || : 310: 311: # Look for diagnostics that aren't marked for translation. 312: # This won't find any for which error's format string is on a separate line. 313: sc_unmarked_diagnostics: 314: @grep -nE \ 315: '\<error \([^"]*"[^"]*[a-z]{3}' $$($(CVS_LIST_EXCEPT)) \ 316: | grep -v '_''(' && \ 317: { echo '$(ME): found unmarked diagnostic(s)' 1>&2; \ 318: exit 1; } || : 319: 320: # Avoid useless parentheses like those in this example: 321: # #if defined (SYMBOL) || defined (SYM2) 322: sc_useless_cpp_parens: 323: @grep -n '^# *if .*defined *(' $$($(CVS_LIST_EXCEPT)) && \ 324: { echo '$(ME): found useless parentheses in cpp directive' \ 325: 1>&2; exit 1; } || : 326: 327: # Ensure that the c99-to-c89 patch applies cleanly. 328: patch-check: 329: rm -rf src-c89 $@.1 $@.2 330: cp -a src src-c89 331: (cd src-c89; patch -p2 -V never --fuzz=0) < src/c99-to-c89.diff \ 332: > $@.1 2>&1 333: if test "$${REGEN_PATCH+set}" = set; then \ 334: diff -upr src src-c89 > new-diff || : ; fi 335: grep -v '^patching file ' $@.1 > $@.2 || : 336: msg=ok; test -s $@.2 && msg='fuzzy patch' || : ; \ 337: rm -f src-c89/*.o || msg='rm failed'; \ 338: $(MAKE) -C src-c89 CFLAGS='-Wdeclaration-after-statement -Werror' \ 339: || msg='compile failure with extra options'; \ 340: rm -rf src-c89 $@.1 $@.2; \ 341: test "$$msg" = ok && : || echo "$$msg" 1>&2; \ 342: test "$$msg" = ok 343: 344: # Ensure that date's --help output stays in sync with the info 345: # documentation for GNU strftime. The only exception is %N, 346: # which date accepts but GNU strftime does not. 347: extract_char = sed 's/^[^%][^%]*%\(.\).*/\1/' 348: strftime-check: 349: if test -f $(srcdir)/src/date.c; then \ 350: grep '^ %. ' $(srcdir)/src/date.c | sort \ 351: | $(extract_char) > $@-src; \ 352: { echo N; \ 353: info libc date calendar format | grep '^ `%.'\' \ 354: | $(extract_char); } | sort > $@-info; \ 355: diff -u $@-src $@-info || exit 1; \ 356: rm -f $@-src $@-info; \ 357: fi 358: 359: check-AUTHORS: 360: $(MAKE) -C src $@ 361: 362: # Ensure that we use only the standard $(VAR) notation, 363: # not @...@ in Makefile.am, now that we can rely on automake 364: # to emit a definition for each substituted variable. 365: makefile-check: 366: grep -nE '@[A-Z_0-9]+@' `find . -name Makefile.am` \ 367: && { echo 'Makefile.maint: use $$(...), not @...@' 1>&2; exit 1; } || : 368: 369: news-date-check: NEWS 370: today=`date +%Y-%m-%d`; \ 371: if head NEWS | grep '^\*.* $(VERSION_REGEXP) ('$$today')' \ 372: >/dev/null; then \ 373: :; \ 374: else \ 375: echo "version or today's date is not in NEWS" 1>&2; \ 376: exit 1; \ 377: fi 378: 379: changelog-check: 380: if head ChangeLog | grep 'Version $(VERSION_REGEXP)\.$$' \ 381: >/dev/null; then \ 382: :; \ 383: else \ 384: echo "$(VERSION) not in ChangeLog" 1>&2; \ 385: exit 1; \ 386: fi 387: 388: m4-check: 389: @grep -n 'AC_DEFUN([^[]' m4/*.m4 \ 390: && { echo 'Makefile.maint: quote the first arg to AC_DEFUN' 1>&2; \ 391: exit 1; } || : 392: 393: # Verify that all source files using _() are listed in po/POTFILES.in. 394: # FIXME: don't hard-code file names below; use a more general mechanism. 395: po-check: 396: if test -f po/POTFILES.in; then \ 397: grep -E -v '^(#|$$)' po/POTFILES.in \ 398: | grep -v '^src/false\.c$$' | sort > $@-1; \ 399: files=; \ 400: for file in $$($(CVS_LIST_EXCEPT)) lib/*.[ch]; do \ 401: case $$file in \ 402: djgpp/* | man/*) continue;; \ 403: */c99-to-c89.diff) continue;; \ 404: esac; \ 405: case $$file in \ 406: *.[ch]) \ 407: base=`expr " $$file" : ' \(.*\)\..'`; \ 408: { test -f $$base.l || test -f $$base.y; } && continue;; \ 409: esac; \ 410: files="$$files $$file"; \ 411: done; \ 412: grep -E -l '\b(N?_|gettext *)\([^)"]*("|$$)' $$files \ 413: | sort -u > $@-2; \ 414: diff -u $@-1 $@-2 || exit 1; \ 415: rm -f $@-1 $@-2; \ 416: fi 417: 418: # In a definition of #define AUTHORS "... and ..." where the RHS contains 419: # the English word `and', the string must be marked with `N_ (...)' so that 420: # gettext recognizes it as a string requiring translation. 421: author_mark_check: 422: @grep -n '^# *define AUTHORS "[^"]* and ' src/*.c |grep -v ' N_ (' && \ 423: { echo 'Makefile.maint: enclose the above strings in N_ (...)' 1>&2; \ 424: exit 1; } || : 425: 426: # Sometimes it is useful to change the PATH environment variable 427: # in Makefiles. When doing so, it's better not to use the Unix-centric 428: # path separator of `:', but rather the automake-provided `@PATH_SEPARATOR@'. 429: # It'd be better to use `find -print0 ...|xargs -0 ...', but less portable, 430: # and there probably aren't many projects with so many Makefile.am files 431: # that we'd have to worry about limits on command line length. 432: msg = 'Makefile.maint: Do not use `:'\'' above; use @PATH_SEPARATOR@ instead' 433: makefile_path_separator_check: 434: @grep -n 'PATH=.*:' `find $(srcdir) -name Makefile.am` \ 435: && { echo $(msg) 1>&2; exit 1; } || : 436: 437: # Check that `make alpha' will not fail at the end of the process. 438: writable-files: 439: if test -d $(release_archive_dir); then :; else \ 440: mkdir $(release_archive_dir); \ 441: fi 442: for file in $(distdir).tar.gz $(xd-delta) \ 443: $(release_archive_dir)/$(distdir).tar.gz \ 444: $(release_archive_dir)/$(xd-delta); do \ 445: test -e $$file || continue; \ 446: test -w $$file \ 447: || { echo ERROR: $$file is not writable; fail=1; }; \ 448: done; \ 449: test "$$fail" && exit 1 || : 450: 451: v_etc_file = lib/version-etc.c 452: sample-test = tests/sample-test 453: # Make sure that the copyright date in $(v_etc_file) is up to date. 454: copyright-check: 455: @if test -f $(v_etc_file); then \ 456: grep 'enum { COPYRIGHT_YEAR = '$$(date +%Y)' };' $(v_etc_file) \ 457: >/dev/null \ 458: || { echo 'out of date copyright in $(v_etc_file); update it' 1>&2; \ 459: exit 1; }; \ 460: fi 461: @if test -f $(sample-test); then \ 462: grep '# Copyright (C) '$$(date +%Y)' Free' $(sample-test) \ 463: >/dev/null \ 464: || { echo 'out of date copyright in $(sample-test); update it' 1>&2; \ 465: exit 1; }; \ 466: fi 467: 468: 469: # Sanity checks with the repository. 470: # Abort early if this tag has already been used. 471: vc-tag-check: 472: used=no; \ 473: if $(VC) --help | grep CVS; then \ 474: $(CVS) -n log -h README|grep -e $(this-vc-tag): >/dev/null \ 475: && used=yes; \ 476: else \ 477: $(GIT) tag -l '^$(this-vc-tag)$$' && used=yes; \ 478: fi; \ 479: if test "$$used" = yes; then \ 480: echo "$(this-vc-tag) has already been used; not tagging" 1>&2; \ 481: exit 1; \ 482: fi 483: 484: vc-diff-check: 485: $(VC) diff > vc-diffs || : 486: if test -s vc-diffs; then \ 487: cat vc-diffs; \ 488: echo "Some files are locally modified:" 1>&2; \ 489: exit 1; \ 490: else \ 491: rm vc-diffs; \ 492: fi 493: 494: cvs-check: vc-diff-check vc-tag-check 495: 496: maintainer-distcheck: 497: $(MAKE) distcheck 498: $(MAKE) my-distcheck 499: 500: 501: # Tag before making distribution. Also, don't make a distribution if 502: # checks fail. Also, make sure the NEWS file is up-to-date. 503: # FIXME: use dist-hook/my-dist like distcheck-hook/my-distcheck. 504: vc-dist: $(local-check) cvs-check maintainer-distcheck 505: $(VC-tag) $(this-vc-tag) 506: $(MAKE) dist 507: 508: # Use this to make sure we don't run these programs when building 509: # from a virgin tgz file, below. 510: null_AM_MAKEFLAGS = \ 511: ACLOCAL=false \ 512: AUTOCONF=false \ 513: AUTOMAKE=false \ 514: AUTOHEADER=false \ 515: MAKEINFO=false 516: 517: warn_cflags = -Dlint -O -Werror -Wall -Wformat -Wshadow -Wpointer-arith 518: 519: # Use -Wformat -Werror to detect format-string/arg-list mismatches. 520: # Also, check for shadowing problems with -Wshadow, and for pointer 521: # arithmetic problems with -Wpointer-arith. 522: # These CFLAGS are pretty strict. If you build this target, you probably 523: # have to have a recent version of gcc and glibc headers. 524: TMPDIR ?= /tmp 525: t=$(TMPDIR)/$(PACKAGE)/test 526: my-distcheck: $(local-check) $(release_archive_dir)/$(prev-tgz) 527: -rm -rf $(t) 528: mkdir -p $(t) 529: GZIP=$(GZIP_ENV) $(AMTAR) -C $(t) -zxf $(distdir).tar.gz 530: cd $(t)/$(distdir) \ 531: && ./configure --disable-nls \ 532: && $(MAKE) CFLAGS='$(warn_cflags)' \ 533: AM_MAKEFLAGS='$(null_AM_MAKEFLAGS)' \ 534: && $(MAKE) dvi \ 535: && $(MAKE) check \ 536: && $(MAKE) distclean 537: (cd $(t) && mv $(distdir) $(distdir).old \ 538: && $(AMTAR) -zxf - ) < $(distdir).tar.gz 539: diff -ur $(t)/$(distdir).old $(t)/$(distdir) 540: if test -f $(srcdir)/src/c99-to-c89.diff; then \ 541: cd $(t)/$(distdir) \ 542: && (cd src && patch -V never --fuzz=0 <c99-to-c89.diff) \ 543: && ./configure --disable-largefile \ 544: CFLAGS='-Werror -ansi -pedantic -Wno-long-long' \ 545: && $(MAKE); \ 546: fi 547: -rm -rf $(t) 548: @echo "========================"; \ 549: echo "$(distdir).tar.gz is ready for distribution"; \ 550: echo "========================" 551: 552: WGET = wget 553: WGETFLAGS = -C off 554: 555: rel-check: 556: tarz=/tmp/rel-check-tarz-$$$$; \ 557: md5_tmp=/tmp/rel-check-md5-$$$$; \ 558: set -e; \ 559: trap 'status=$$?; rm -f $$tarz $$md5_tmp; exit $$status' 0 1 2 3 15; \ 560: $(WGET) $(WGETFLAGS) -q --output-document=$$tarz $(url); \ 561: echo "$(md5) -" > $$md5_tmp; \ 562: md5sum -c $$md5_tmp < $$tarz 563: 564: prev-tgz = $(PACKAGE)-$(PREV_VERSION).tar.gz 565: xd-delta = $(PACKAGE)-$(PREV_VERSION)-$(VERSION).xdelta 566: 567: rel-files = $(xd-delta) $(DIST_ARCHIVES) 568: 569: # Approximate the date of last gnulib "update" by the ChangeLog file's 570: # mtime, and provide that date in the announcement. 571: announcement: NEWS ChangeLog $(rel-files) 572: @cl_date=$$(stat --printf @%Y $(gnulib_dir)/ChangeLog); \ 573: utc_date=$$(date -u --date $$cl_date '+%Y-%m-%d %T %z'); \ 574: ./build-aux/announce-gen \ 575: --release-type=$(RELEASE_TYPE) \ 576: --package=$(PACKAGE) \ 577: --prev=$(PREV_VERSION) \ 578: --curr=$(VERSION) \ 579: --gpg-key-id=$(gpg_key_ID) \ 580: --news=NEWS \ 581: --bootstrap-tools=autoconf,automake,bison,gnulib \ 582: --gnulib-snapshot-time-stamp="$$utc_date" \ 583: $(addprefix --url-dir=, $(url_dir_list)) 584: 585: ## ---------------- ## 586: ## Updating files. ## 587: ## ---------------- ## 588: 589: ftp-gnu = ftp://ftp.gnu.org/gnu 590: www-gnu = http://www.gnu.org 591: 592: # Use mv, if you don't have/want move-if-change. 593: move_if_change ?= move-if-change 594: 595: emit_upload_commands: 596: @echo ===================================== 597: @echo ===================================== 598: @echo "$(srcdir)/build-aux/gnupload $(GNUPLOADFLAGS) \\" 599: @echo " --to $(gnu_rel_host):$(PACKAGE) \\" 600: @echo " $(rel-files)" 601: @echo '# send the /tmp/announcement e-mail' 602: @echo ===================================== 603: @echo ===================================== 604: 605: $(xd-delta): $(release_archive_dir)/$(prev-tgz) $(distdir).tar.gz 606: xdelta delta -9 $^ $@ || : 607: 608: .PHONY: alpha beta major 609: alpha beta major: news-date-check changelog-check $(local-check) writable-files 610: test $@ = major \ 611: && { echo $(VERSION) | grep -E '^[0-9]+(\.[0-9]+)+$$' \ 612: || { echo "invalid version string: $(VERSION)" 1>&2; exit 1;};}\ 613: || : 614: $(MAKE) vc-dist 615: $(MAKE) $(xd-delta) 616: $(MAKE) -s announcement RELEASE_TYPE=$@ > /tmp/announce-$(my_distdir) 617: ln $(rel-files) $(release_archive_dir) 618: chmod a-w $(rel-files) 619: $(MAKE) -s emit_upload_commands RELEASE_TYPE=$@ 620: echo $(VERSION) > $(prev_version_file) 621: $(VC) commit -m \ 622: '$(prev_version_file): Record previous version: $(VERSION).' \ 623: $(prev_version_file)