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