(linenum→info "unix/slp.c:2238")

coreutils/6.9/Makefile.maint

    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)
1
Syntax (Markdown)