diff --git a/ChangeLog b/ChangeLog index a1ed1bb17c..f7a8d11a22 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ Mon Mar 24 11:16:58 CET 2008 Jim Meyering + Sync Makefile rules from coreutils. + * Makefile.maint: Merge. + * GNUmakefile: Update from coreutils. + Add new testing framework and the first test to use it. * tests/Makefile.am (test_scripts): Add vcpupin. (EXTRA_DIST): Add test-lib.sh. diff --git a/GNUmakefile b/GNUmakefile index 9eefe40883..157f432b48 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -4,7 +4,7 @@ # It is necessary if you want to build targets usually of interest # only to the maintainer. -# Copyright (C) 2001, 2003, 2006-2007 Free Software Foundation, Inc. +# Copyright (C) 2001, 2003, 2006-2008 Free Software Foundation, Inc. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -29,11 +29,11 @@ else SHELL = sh endif -have-Makefile := $(shell test -f Makefile && echo yes) +_have-Makefile := $(shell test -f Makefile && echo yes) # If the user runs GNU make but has not yet run ./configure, # give them a diagnostic. -ifeq ($(have-Makefile),yes) +ifeq ($(_have-Makefile),yes) # Make tar archive easier to reproduce. export TAR_OPTIONS = --owner=0 --group=0 --numeric-owner @@ -50,6 +50,8 @@ all: @echo "You must run ./configure before running \`make'." 1>&2 @exit 1 +check dist distcheck install: all + endif # Tell version 3.79 and up of GNU make to not build goals in this diff --git a/Makefile.maint b/Makefile.maint index 92cdf2973b..3a838c5f01 100644 --- a/Makefile.maint +++ b/Makefile.maint @@ -8,25 +8,23 @@ gzip_rsyncable := \ $(shell gzip --help 2>/dev/null|grep rsyncable >/dev/null && echo --rsyncable) GZIP_ENV = '--no-name --best $(gzip_rsyncable)' -CVS_LIST = build-aux/vc-list-files +VC_LIST = build-aux/vc-list-files -CVS_LIST_EXCEPT = \ -$(CVS_LIST) | if test -f .x-$@; then grep -vEf .x-$@; else grep -v ChangeLog; fi +VC_LIST_EXCEPT = \ + $(VC_LIST) | if test -f .x-$@; then grep -vEf .x-$@; else grep -v ChangeLog; fi # Prevent programs like 'sort' from considering distinct strings to be equal. # Doing it here saves us from having to set LC_ALL elsewhere in this file. export LC_ALL = C # Collect the names of rules starting with `sc_'. -syntax-check-rules := $(shell sed -n 's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' $(ME)) +syntax-check-rules := $(shell sed -n 's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' \ + $(srcdir)/$(ME)) .PHONY: $(syntax-check-rules) -# Checks that don't require cvs. -# Run `changelog-check' last, as previous test may reveal problems requiring -# new ChangeLog entries. local-checks-available = \ po-check copyright-check m4-check author_mark_check \ - changelog-check patch-check strftime-check $(syntax-check-rules) \ + patch-check strftime-check $(syntax-check-rules) \ makefile_path_separator_check \ makefile-check check-AUTHORS .PHONY: $(local-checks-available) @@ -34,23 +32,29 @@ local-checks-available = \ local-check := $(filter-out $(local-checks-to-skip), $(local-checks-available)) syntax-check: $(local-check) +# @grep -nE '# *include <(limits|std(def|arg|bool))\.h>' \ +# $$(find -type f -name '*.[chly]') && \ +# { echo '$(ME): found conditional include' 1>&2; \ +# exit 1; } || : -## --------------- ## -## Sanity checks. ## -## --------------- ## +# grep -nE '^# *include <(string|stdlib)\.h>' \ +# $(srcdir)/{lib,src}/*.[chy] && \ +# { echo '$(ME): FIXME' 1>&2; \ +# exit 1; } || : +# FIXME: don't allow `#include .strings\.h' anywhere sc_avoid_if_before_free: @$(srcdir)/build-aux/useless-if-before-free \ $(useless_free_options) \ - $$($(CVS_LIST_EXCEPT)) && \ + $$($(VC_LIST_EXCEPT)) && \ { echo '$(ME): found useless "if" before "free" above' 1>&2; \ exit 1; } || : # Avoid uses of write(2). Either switch to streams (fwrite), or use # the safewrite wrapper. sc_avoid_write: - @if $(CVS_LIST_EXCEPT) | grep '\.c$$' > /dev/null; then \ - grep '\ /dev/null; then \ + grep '\&2; exit 1; } || :; \ @@ -58,22 +62,22 @@ sc_avoid_write: fi sc_cast_of_argument_to_free: - @grep -nE '\&2; \ exit 1; } || : sc_cast_of_x_alloc_return_value: - @grep -nE '\*\) *x(m|c|re)alloc\>' $$($(CVS_LIST_EXCEPT)) && \ + @grep -nE '\*\) *x(m|c|re)alloc\>' $$($(VC_LIST_EXCEPT)) && \ { echo '$(ME): don'\''t cast x*alloc return value' 1>&2; \ exit 1; } || : sc_cast_of_alloca_return_value: - @grep -nE '\*\) *alloca\>' $$($(CVS_LIST_EXCEPT)) && \ + @grep -nE '\*\) *alloca\>' $$($(VC_LIST_EXCEPT)) && \ { echo '$(ME): don'\''t cast alloca return value' 1>&2; \ exit 1; } || : sc_space_tab: - @grep -n '[ ] ' $$($(CVS_LIST_EXCEPT)) && \ + @grep -n '[ ] ' $$($(VC_LIST_EXCEPT)) && \ { echo '$(ME): found SPACE-TAB sequence; remove the SPACE' \ 1>&2; exit 1; } || : @@ -81,14 +85,14 @@ sc_space_tab: # They provide no error checking mechanism. # Instead, use strto* functions. sc_prohibit_atoi_atof: - @grep -nE '\<([fs]?scanf|ato([filq]|ll))\>' $$($(CVS_LIST_EXCEPT)) && \ + @grep -nE '\<([fs]?scanf|ato([filq]|ll))\>' $$($(VC_LIST_EXCEPT)) && \ { echo '$(ME): do not use *scan''f, ato''f, ato''i, ato''l, ato''ll, ato''q, or ss''canf' \ 1>&2; exit 1; } || : # Use STREQ rather than comparing strcmp == 0, or != 0. sc_prohibit_strcmp: - @grep -nE '! *str''cmp \(|\&2; exit 1; } || : @@ -101,66 +105,61 @@ sc_error_exit_success: exit 1; } || : sc_file_system: - @grep -ni 'file''system' $$($(CVS_LIST_EXCEPT)) && \ + @grep -ni 'file''system' $$($(VC_LIST_EXCEPT)) && \ { echo '$(ME): found use of "file''system";' \ 'rewrite to use "file system"' 1>&2; \ exit 1; } || : sc_no_have_config_h: - @grep -n '^# *if.*HAVE''_CONFIG_H' $$($(CVS_LIST_EXCEPT)) && \ + @grep -n '^# *if.*HAVE''_CONFIG_H' $$($(VC_LIST_EXCEPT)) && \ { echo '$(ME): found use of HAVE''_CONFIG_H; remove' \ 1>&2; exit 1; } || : # Nearly all .c files must include . sc_require_config_h: - @if $(CVS_LIST_EXCEPT) | grep '\.c$$' > /dev/null; then \ + @if $(VC_LIST_EXCEPT) | grep '\.c$$' > /dev/null; then \ grep -L '^# *include ' \ - $$($(CVS_LIST_EXCEPT) | grep '\.c$$') \ + $$($(VC_LIST_EXCEPT) | grep '\.c$$') \ | grep . && \ { echo '$(ME): the above files do not include ' \ 1>&2; exit 1; } || :; \ else :; \ fi +# To use this "command" macro, you must first define two shell variables: +# h: the header, enclosed in <> or "" +# re: a regular expression that matches IFF something provided by $h is used. +define _header_without_use + h_esc=`echo "$$h"|sed 's/\./\\./'`; \ + if $(VC_LIST_EXCEPT) | grep '\.c$$' > /dev/null; then \ + files=$$(grep -l '^# *include '"$$h_esc" \ + $$($(VC_LIST_EXCEPT) | grep '\.c$$')) && \ + grep -LE "$$re" $$files | grep . && \ + { echo "$(ME): the above files include $$h but don't use it" \ + 1>&2; exit 1; } || :; \ + else :; \ + fi +endef + # Prohibit the inclusion of assert.h without an actual use of assert. sc_prohibit_assert_without_use: - @if $(CVS_LIST_EXCEPT) | grep '\.c$$' > /dev/null; then \ - files=$$(grep -l '# *include ' \ - $$($(CVS_LIST_EXCEPT) | grep '\.c$$')) && \ - grep -L '\ but don't use it" \ - 1>&2; exit 1; } || :; \ - else :; \ - fi + @h='' re='\ /dev/null; then \ - files=$$(grep -l '# *include "quotearg\.h"' \ - $$($(CVS_LIST_EXCEPT) | grep '\.c$$')) && \ - grep -LE '\&2; exit 1; } || :; \ - else :; \ - fi + @h='"quotearg.h"' re='\ /dev/null; then \ - files=$$(grep -l '# *include "quote\.h"' \ - $$($(CVS_LIST_EXCEPT) | grep '\.c$$')) && \ - grep -LE '\&2; exit 1; } || :; \ - else :; \ - fi + @h='"quote.h"' re='\' \ - $$($(CVS_LIST_EXCEPT)) && \ + $$($(VC_LIST_EXCEPT)) && \ { echo '$(ME): do not use HAVE''_FCNTL_H or O''_NDELAY' \ 1>&2; exit 1; } || : @@ -194,7 +193,7 @@ endif # Make sure that none are inadvertently reintroduced. sc_prohibit_jm_in_m4: @grep -nE 'jm_[A-Z]' \ - $$($(CVS_LIST) m4 |grep '\.m4$$'; echo /dev/null) && \ + $$($(VC_LIST) m4 |grep '\.m4$$'; echo /dev/null) && \ { echo '$(ME): do not use jm_ in m4 macro names' \ 1>&2; exit 1; } || : @@ -202,8 +201,8 @@ sc_root_tests: @if test -d tests \ && grep check-root tests/Makefile.am>/dev/null 2>&1; then \ t1=sc-root.expected; t2=sc-root.actual; \ - grep -nl '^PRIV_CHECK_ARG=require-root' \ - $$($(CVS_LIST) tests) |sed s,tests,., |sort > $$t1; \ + grep -nl '^require_root_$$' \ + $$($(VC_LIST) tests) |sed s,tests,., |sort > $$t1; \ sed -n 's, cd \([^ ]*\) .*MAKE..check TESTS=\(.*\),./\1/\2,p' \ $(srcdir)/tests/Makefile.am |sort > $$t2; \ diff -u $$t1 $$t2 || diff=1; \ @@ -242,7 +241,7 @@ headers_with_interesting_macro_defs = \ sc_always_defined_macros: .re-defmac @if test -f $(srcdir)/src/system.h; then \ trap 'rc=$$?; rm -f .re-defmac; exit $$rc' 0 1 2 3 15; \ - grep -f .re-defmac $$($(CVS_LIST)) \ + grep -f .re-defmac $$($(VC_LIST)) \ && { echo '$(ME): define the above via some gnulib .h file' \ 1>&2; exit 1; } || :; \ fi @@ -262,7 +261,7 @@ sc_system_h_headers: .re-list @if test -f $(srcdir)/src/system.h; then \ trap 'rc=$$?; rm -f .re-list; exit $$rc' 0 1 2 3 15; \ grep -nE -f .re-list \ - $$($(CVS_LIST) src | \ + $$($(VC_LIST) src | \ grep -Ev '((copy|system)\.h|parse-gram\.c)$$') \ && { echo '$(ME): the above are already included via system.h'\ 1>&2; exit 1; } || :; \ @@ -271,12 +270,12 @@ sc_system_h_headers: .re-list sc_sun_os_names: @grep -nEi \ 'solaris[^[:alnum:]]*2\.(7|8|9|[1-9][0-9])|sunos[^[:alnum:]][6-9]' \ - $$($(CVS_LIST_EXCEPT)) && \ + $$($(VC_LIST_EXCEPT)) && \ { echo '$(ME): found misuse of Sun OS version numbers' 1>&2; \ exit 1; } || : sc_the_the: - @grep -ni '\' $$($(CVS_LIST_EXCEPT)) && \ + @grep -ni '\' $$($(VC_LIST_EXCEPT)) && \ { echo '$(ME): found use of "the ''the";' 1>&2; \ exit 1; } || : @@ -284,7 +283,7 @@ sc_tight_scope: $(MAKE) -C src $@ sc_trailing_blank: - @grep -n '[ ]$$' $$($(CVS_LIST_EXCEPT)) && \ + @grep -n '[ ]$$' $$($(VC_LIST_EXCEPT)) && \ { echo '$(ME): found trailing blank(s)' \ 1>&2; exit 1; } || : @@ -294,7 +293,7 @@ sc_trailing_blank: longopt_re = --[a-z][0-9A-Za-z-]*(\[?=[0-9A-Za-z-]*\]?)? sc_two_space_separator_in_usage: @grep -nE '^ *(-[A-Za-z],)? $(longopt_re) [^ ].*\\$$' \ - $$($(CVS_LIST_EXCEPT)) && \ + $$($(VC_LIST_EXCEPT)) && \ { echo "$(ME): help2man requires at least two spaces between"; \ echo "$(ME): an option and its description"; \ 1>&2; exit 1; } || : @@ -309,32 +308,32 @@ err_func_re = \ # "%s", _("no storage vol w..." sc_unmarked_diagnostics: @grep -nE \ - '\<(vshError|error) \([^"]*"[^"]*[a-z]{3}' $$($(CVS_LIST_EXCEPT)) \ + '\<(vshError|error) \([^"]*"[^"]*[a-z]{3}' $$($(VC_LIST_EXCEPT)) \ | grep -v '_''(' && \ { echo '$(ME): found unmarked diagnostic(s)' 1>&2; \ exit 1; } || : - @{ grep -nE '\<$(err_func_re) *\(.*;$$' $$($(CVS_LIST_EXCEPT)); \ - grep -A1 -nE '\<$(err_func_re) *\(.*,$$' $$($(CVS_LIST_EXCEPT)); } \ + @{ grep -nE '\<$(err_func_re) *\(.*;$$' $$($(VC_LIST_EXCEPT)); \ + grep -A1 -nE '\<$(err_func_re) *\(.*,$$' $$($(VC_LIST_EXCEPT)); } \ | sed 's/_("[^"][^"]*"//;s/[ ]"%s"//' \ | grep '[ ]"' && \ { echo '$(ME): found unmarked diagnostic(s)' 1>&2; \ exit 1; } || : sc_prohibit_virBufferAdd_with_string_literal: - @grep -nE '\&2; exit 1; } || : # Avoid useless parentheses like those in this example: # #if defined (SYMBOL) || defined (SYM2) sc_useless_cpp_parens: - @grep -n '^# *if .*defined *(' $$($(CVS_LIST_EXCEPT)) && \ + @grep -n '^# *if .*defined *(' $$($(VC_LIST_EXCEPT)) && \ { echo '$(ME): found useless parentheses in cpp directive' \ 1>&2; exit 1; } || : # Require the latest GPL. sc_GPL_version: - @grep -n 'either ''version [^3]' $$($(CVS_LIST_EXCEPT)) && \ + @grep -n 'either ''version [^3]' $$($(VC_LIST_EXCEPT)) && \ { echo '$(ME): GPL vN, N!=3' 1>&2; exit 1; } || : # Ensure that the c99-to-c89 patch applies cleanly. @@ -410,12 +409,16 @@ po-check: grep -E -v '^(#|$$)' po/POTFILES.in \ | grep -v '^src/false\.c$$' | sort > $@-1; \ files=; \ - for file in $$($(CVS_LIST_EXCEPT)); do \ + for file in $$($(VC_LIST_EXCEPT)); do \ + case $$file in \ + djgpp/* | man/*) continue;; \ + */c99-to-c89.diff) continue;; \ + esac; \ case $$file in \ *.[ch]) \ base=`expr " $$file" : ' \(.*\)\..'`; \ { test -f $$base.l || test -f $$base.y; } && continue;; \ - *) continue;; \ + *) continue;; \ esac; \ files="$$files $$file"; \ done; \ @@ -447,16 +450,14 @@ makefile_path_separator_check: # Check that `make alpha' will not fail at the end of the process. writable-files: if test -d $(release_archive_dir); then :; else \ - mkdir $(release_archive_dir); \ + for file in $(distdir).tar.gz \ + $(release_archive_dir)/$(distdir).tar.gz; do \ + test -e $$file || continue; \ + test -w $$file \ + || { echo ERROR: $$file is not writable; fail=1; }; \ + done; \ + test "$$fail" && exit 1 || : fi - for file in $(distdir).tar.gz $(xd-delta) \ - $(release_archive_dir)/$(distdir).tar.gz \ - $(release_archive_dir)/$(xd-delta); do \ - test -e $$file || continue; \ - test -w $$file \ - || { echo ERROR: $$file is not writable; fail=1; }; \ - done; \ - test "$$fail" && exit 1 || : v_etc_file = lib/version-etc.c sample-test = tests/sample-test