[Libvir] 2/8 Add framework for code style- and syntax-checking rules.

Add framework for code style- and syntax-checking rules. Almost all tests are initially disabled via the list in Makefile.cfg. * Makefile.am (EXTRA_DIST): Add .x-sc_avoid_if_before_free. Omit names of files that automake includes automatically. * .x-sc_avoid_if_before_free: New file. * build-aux/vc-list-files: Likewise. * build-aux/find-unnecessary-if-before-free: Likewise. * GNUmakefile, Makefile.cfg, Makefile.maint: New files. Signed-off-by: Jim Meyering <meyering@redhat.com> --- .x-sc_avoid_if_before_free | 4 + GNUmakefile | 58 ++++ Makefile.am | 8 +- Makefile.cfg | 62 ++++ Makefile.maint | 510 +++++++++++++++++++++++++++++ build-aux/find-unnecessary-if-before-free | 41 +++ build-aux/vc-list-files | 50 +++ 7 files changed, 730 insertions(+), 3 deletions(-) create mode 100644 .x-sc_avoid_if_before_free create mode 100644 GNUmakefile create mode 100644 Makefile.cfg create mode 100644 Makefile.maint create mode 100755 build-aux/find-unnecessary-if-before-free create mode 100755 build-aux/vc-list-files diff --git a/.x-sc_avoid_if_before_free b/.x-sc_avoid_if_before_free new file mode 100644 index 0000000..627dcdf --- /dev/null +++ b/.x-sc_avoid_if_before_free @@ -0,0 +1,4 @@ +^gnulib/lib/getaddrinfo\.c$ +^gnulib/lib/printf-parse\.c$ +^gnulib/lib/vasnprintf\.c$ +^build-aux/find-unnecessary-if-before-free$ diff --git a/GNUmakefile b/GNUmakefile new file mode 100644 index 0000000..9eefe40 --- /dev/null +++ b/GNUmakefile @@ -0,0 +1,58 @@ +# Having a separate GNUmakefile lets me `include' the dynamically +# generated rules created via Makefile.maint as well as Makefile.maint itself. +# This makefile is used only if you run GNU Make. +# 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. +# +# 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 +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# Systems where /bin/sh is not the default shell need this. The $(shell) +# command below won't work with e.g. stock DOS/Windows shells. +ifeq ($(wildcard /bin/s[h]),/bin/sh) +SHELL = /bin/sh +else +# will be used only with the next shell-test line, then overwritten +# by a configured-in value +SHELL = sh +endif + +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) + +# Make tar archive easier to reproduce. +export TAR_OPTIONS = --owner=0 --group=0 --numeric-owner + +include Makefile + +include $(srcdir)/Makefile.cfg +include $(srcdir)/Makefile.maint + +else + +all: + @echo There seems to be no Makefile in this directory. 1>&2 + @echo "You must run ./configure before running \`make'." 1>&2 + @exit 1 + +endif + +# Tell version 3.79 and up of GNU make to not build goals in this +# directory in parallel. This is necessary in case someone tries to +# build multiple targets on one command line. +.NOTPARALLEL: diff --git a/Makefile.am b/Makefile.am index 34a1eb5..5154203 100644 --- a/Makefile.am +++ b/Makefile.am @@ -5,9 +5,11 @@ SUBDIRS = gnulib/lib include src qemud proxy docs gnulib/tests \ ACLOCAL_AMFLAGS = -I m4 -I gnulib/m4 -EXTRA_DIST = libvirt.spec.in libvirt.spec COPYING.LIB \ - libvirt.pc.in libvirt.pc TODO AUTHORS ChangeLog \ - NEWS README $(man_MANS) autobuild.sh +EXTRA_DIST = \ + libvirt.spec libvirt.spec.in \ + libvirt.pc libvirt.pc.in \ + $(man_MANS) autobuild.sh \ + .x-sc_avoid_if_before_free man_MANS = virsh.1 diff --git a/Makefile.cfg b/Makefile.cfg new file mode 100644 index 0000000..f1194d1 --- /dev/null +++ b/Makefile.cfg @@ -0,0 +1,62 @@ +# Customize Makefile.maint. -*- makefile -*- +# Copyright (C) 2003-2007 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 +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# Use alpha.gnu.org for alpha and beta releases. +# Use ftp.gnu.org for major releases. +gnu_ftp_host-alpha = alpha.gnu.org +gnu_ftp_host-beta = alpha.gnu.org +gnu_ftp_host-major = ftp.gnu.org +gnu_rel_host = $(gnu_ftp_host-$(RELEASE_TYPE)) + +url_dir_list = \ + ftp://$(gnu_rel_host)/gnu/coreutils + +# Tests not to run as part of "make distcheck". +local-checks-to-skip = \ + po-check \ + makefile_path_separator_check \ + makefile-check \ + sc_no_have_config_h \ + sc_unmarked_diagnostics \ + sc_tight_scope \ + sc_trailing_blank \ + sc_GPL_version \ + sc_always_defined_macros \ + sc_cast_of_alloca_return_value \ + sc_cast_of_argument_to_free \ + sc_cast_of_x_alloc_return_value \ + sc_changelog \ + sc_dd_max_sym_length \ + sc_error_exit_success \ + sc_file_system \ + sc_obsolete_symbols \ + sc_prohibit_assert_without_use \ + sc_prohibit_atoi_atof \ + sc_prohibit_jm_in_m4 \ + sc_prohibit_quote_without_use \ + sc_prohibit_quotearg_without_use \ + sc_prohibit_strcmp \ + sc_require_config_h \ + sc_root_tests \ + sc_space_tab \ + sc_sun_os_names \ + sc_system_h_headers \ + sc_the_the \ + sc_two_space_separator_in_usage \ + sc_useless_cpp_parens \ + patch-check \ + check-AUTHORS \ + changelog-check diff --git a/Makefile.maint b/Makefile.maint new file mode 100644 index 0000000..0336f13 --- /dev/null +++ b/Makefile.maint @@ -0,0 +1,510 @@ +# This is reported not to work with make-3.79.1 +# ME := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) +ME := Makefile.maint + +# Do not save the original name or timestamp in the .tar.gz file. +# Use --rsyncable if available. +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 + +CVS_LIST_EXCEPT = \ +$(CVS_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)) +.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) \ + makefile_path_separator_check \ + makefile-check check-AUTHORS +.PHONY: $(local-checks-available) + +local-check := $(filter-out $(local-checks-to-skip), $(local-checks-available)) + +syntax-check: $(local-check) + +## --------------- ## +## Sanity checks. ## +## --------------- ## + +sc_avoid_if_before_free: + @$(srcdir)/build-aux/find-unnecessary-if-before-free \ + $$($(CVS_LIST_EXCEPT)) && \ + { echo '$(ME): found useless "if" before "free" above' 1>&2; \ + exit 1; } || : + +sc_cast_of_argument_to_free: + @grep -nE '\<free \(\(' $$($(CVS_LIST_EXCEPT)) && \ + { echo '$(ME): don'\''t cast free argument' 1>&2; \ + exit 1; } || : + +sc_cast_of_x_alloc_return_value: + @grep -nE '\*\) *x(m|c|re)alloc\>' $$($(CVS_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)) && \ + { echo '$(ME): don'\''t cast alloca return value' 1>&2; \ + exit 1; } || : + +sc_space_tab: + @grep -n '[ ] ' $$($(CVS_LIST_EXCEPT)) && \ + { echo '$(ME): found SPACE-TAB sequence; remove the SPACE' \ + 1>&2; exit 1; } || : + +# Don't use *scanf or the old ato* functions in `real' code. +# They provide no error checking mechanism. +# Instead, use strto* functions. +sc_prohibit_atoi_atof: + @grep -nE '\<([fs]?scanf|ato([filq]|ll))\>' $$($(CVS_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 \(|\<str''cmp \([^)]+\) *==' \ + $$($(CVS_LIST_EXCEPT)) && \ + { echo '$(ME): use STREQ in place of the above uses of str''cmp' \ + 1>&2; exit 1; } || : + +# Using EXIT_SUCCESS as the first argument to error is misleading, +# since when that parameter is 0, error does not exit. Use `0' instead. +sc_error_exit_success: + @grep -nF 'error (EXIT_SUCCESS,' \ + $$(find -type f -name '*.[chly]') && \ + { echo '$(ME): found error (EXIT_SUCCESS' 1>&2; \ + exit 1; } || : + +sc_file_system: + @grep -ni 'file''system' $$($(CVS_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 'HAVE''_CONFIG_H' $$($(CVS_LIST_EXCEPT)) && \ + { echo '$(ME): found use of HAVE''_CONFIG_H; remove' \ + 1>&2; exit 1; } || : + +# Nearly all .c files must include <config.h>. +sc_require_config_h: + @if $(CVS_LIST_EXCEPT) | grep '\.c$$' > /dev/null; then \ + grep -L '^# *include <config\.h>' \ + $$($(CVS_LIST_EXCEPT) | grep '\.c$$') \ + | grep . && \ + { echo '$(ME): the above files do not include <config.h>' \ + 1>&2; exit 1; } || :; \ + else :; \ + fi + +# 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 <assert\.h>' \ + $$($(CVS_LIST_EXCEPT) | grep '\.c$$')) && \ + grep -L '\<assert (' $$files \ + | grep . && \ + { echo "$(ME): the above files include <assert.h> but don't use it" \ + 1>&2; exit 1; } || :; \ + else :; \ + fi + +# Don't include quotearg.h unless you use one of its functions. +sc_prohibit_quotearg_without_use: + @if $(CVS_LIST_EXCEPT) | grep '\.c$$' > /dev/null; then \ + files=$$(grep -l '# *include "quotearg\.h"' \ + $$($(CVS_LIST_EXCEPT) | grep '\.c$$')) && \ + grep -LE '\<quotearg(_[^ ]+)? \(' $$files \ + | grep . && \ + { echo "$(ME): the above files include "quotearg.h" but don't use it" \ + 1>&2; exit 1; } || :; \ + else :; \ + fi + +# Don't include quote.h unless you use one of its functions. +sc_prohibit_quote_without_use: + @if $(CVS_LIST_EXCEPT) | grep '\.c$$' > /dev/null; then \ + files=$$(grep -l '# *include "quote\.h"' \ + $$($(CVS_LIST_EXCEPT) | grep '\.c$$')) && \ + grep -LE '\<quote(_n)? \(' $$files \ + | grep . && \ + { echo "$(ME): the above files include "quote.h" but don't use it" \ + 1>&2; exit 1; } || :; \ + else :; \ + fi + +sc_obsolete_symbols: + @grep -nE '\<(HAVE''_FCNTL_H|O''_NDELAY)\>' \ + $$($(CVS_LIST_EXCEPT)) && \ + { echo '$(ME): do not use HAVE''_FCNTL_H or O''_NDELAY' \ + 1>&2; exit 1; } || : + +# FIXME: warn about definitions of EXIT_FAILURE, EXIT_SUCCESS, STREQ + +# Each nonempty line must start with a year number, or a TAB. +sc_changelog: + @grep -n '^[^12 ]' $$(find . -maxdepth 2 -name ChangeLog) && \ + { echo '$(ME): found unexpected prefix in a ChangeLog' 1>&2; \ + exit 1; } || : + +# Ensure that dd's definition of LONGEST_SYMBOL stays in sync +# with the strings from the two affected variables. +dd_c = $(srcdir)/src/dd.c +sc_dd_max_sym_length: +ifneq ($(wildcard $(dd_c)),) + @len=$$( (sed -n '/conversions\[\] =$$/,/^};/p' $(dd_c);\ + sed -n '/flags\[\] =$$/,/^};/p' $(dd_c) ) \ + |sed -n '/"/s/^[^"]*"\([^"]*\)".*/\1/p' \ + | wc --max-line-length); \ + max=$$(sed -n '/^#define LONGEST_SYMBOL /s///p' $(dd_c) \ + |tr -d '"' | wc --max-line-length); \ + if test "$$len" = "$$max"; then :; else \ + echo 'dd.c: LONGEST_SYMBOL is not longest' 1>&2; \ + exit 1; \ + fi +endif + +# Many m4 macros names once began with `jm_'. +# On 2004-04-13, they were all changed to start with gl_ instead. +# 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) && \ + { echo '$(ME): do not use jm_ in m4 macro names' \ + 1>&2; exit 1; } || : + +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; \ + sed -n 's, cd \([^ ]*\) .*MAKE..check TESTS=\(.*\),./\1/\2,p' \ + $(srcdir)/tests/Makefile.am |sort > $$t2; \ + diff -u $$t1 $$t2 || diff=1; \ + rm -f $$t1 $$t2; \ + test "$$diff" \ + && { echo 'tests/Makefile.am: missing check-root action'>&2; \ + exit 1; } || :; \ + fi + +headers_with_interesting_macro_defs = \ + exit.h \ + fcntl_.h \ + fnmatch_.h \ + intprops.h \ + inttypes_.h \ + lchown.h \ + openat.h \ + stat-macros.h \ + stdint_.h + +# Create a list of regular expressions matching the names +# of macros that are guaranteed by parts of gnulib to be defined. +.re-defmac: + @(cd $(srcdir)/lib; \ + for f in $(headers_with_interesting_macro_defs); do \ + test -f $$f && \ + sed -n '/^# *define \([^_ (][^ (]*\)[ (].*/s//\1/p' $$f; \ + done; \ + ) | sort -u \ + | grep -Ev 'ATTRIBUTE_NORETURN|SIZE_MAX' \ + | sed 's/^/^# *define /' \ + > $@-t + @mv $@-t $@ + +# Don't define macros that we already get from gnulib header files. +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)) \ + && { echo '$(ME): define the above via some gnulib .h file' \ + 1>&2; exit 1; } || :; \ + fi + +# Create a list of regular expressions matching the names +# of files included from system.h. Exclude a couple. +.re-list: + @sed -n '/^# *include /s///p' $(srcdir)/src/system.h \ + | grep -Ev 'sys/(param|file)\.h' \ + | sed 's/ .*//;;s/^["<]/^# *include [<"]/;s/\.h[">]$$/\\.h[">]/' \ + > $@-t + @mv $@-t $@ + +# Files in src/ should not include directly any of +# the headers already included via system.h. +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 | \ + grep -Ev '((copy|system)\.h|parse-gram\.c)$$') \ + && { echo '$(ME): the above are already included via system.h'\ + 1>&2; exit 1; } || :; \ + fi + +sc_sun_os_names: + @grep -nEi \ + 'solaris[^[:alnum:]]*2\.(7|8|9|[1-9][0-9])|sunos[^[:alnum:]][6-9]' \ + $$($(CVS_LIST_EXCEPT)) && \ + { echo '$(ME): found misuse of Sun OS version numbers' 1>&2; \ + exit 1; } || : + +sc_the_the: + @grep -ni '\<the ''the\>' $$($(CVS_LIST_EXCEPT)) && \ + { echo '$(ME): found use of "the ''the";' 1>&2; \ + exit 1; } || : + +sc_tight_scope: + $(MAKE) -C src $@ + +sc_trailing_blank: + @grep -n '[ ]$$' $$($(CVS_LIST_EXCEPT)) && \ + { echo '$(ME): found trailing blank(s)' \ + 1>&2; exit 1; } || : + +# Match lines like the following, but where there is only one space +# between the options and the description: +# -D, --all-repeated[=delimit-method] print all duplicate lines\n +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)) && \ + { echo "$(ME): help2man requires at least two spaces between"; \ + echo "$(ME): an option and its description"; \ + 1>&2; exit 1; } || : + +# Look for diagnostics that aren't marked for translation. +# This won't find any for which error's format string is on a separate line. +sc_unmarked_diagnostics: + @grep -nE \ + '\<error \([^"]*"[^"]*[a-z]{3}' $$($(CVS_LIST_EXCEPT)) \ + | grep -v '_''(' && \ + { echo '$(ME): found unmarked diagnostic(s)' 1>&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)) && \ + { 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)) && \ + { echo '$(ME): GPL vN, N!=3' 1>&2; exit 1; } || : + +# Ensure that the c99-to-c89 patch applies cleanly. +patch-check: + rm -rf src-c89 $@.1 $@.2 + cp -a src src-c89 + (cd src-c89; patch -p1 -V never --fuzz=0) < src/c99-to-c89.diff \ + > $@.1 2>&1 + if test "$$REGEN_PATCH" = yes; then \ + diff -upr src src-c89 | sed 's,src-c89/,src/,' \ + | grep -v '^Only in' > new-diff || : ; fi + grep -v '^patching file ' $@.1 > $@.2 || : + msg=ok; test -s $@.2 && msg='fuzzy patch' || : ; \ + rm -f src-c89/*.o || msg='rm failed'; \ + $(MAKE) -C src-c89 CFLAGS='-Wdeclaration-after-statement -Werror' \ + || msg='compile failure with extra options'; \ + test "$$msg" = ok && rm -rf src-c89 $@.1 $@.2 || echo "$$msg" 1>&2; \ + test "$$msg" = ok + +# Ensure that date's --help output stays in sync with the info +# documentation for GNU strftime. The only exception is %N, +# which date accepts but GNU strftime does not. +extract_char = sed 's/^[^%][^%]*%\(.\).*/\1/' +strftime-check: + if test -f $(srcdir)/src/date.c; then \ + grep '^ %. ' $(srcdir)/src/date.c | sort \ + | $(extract_char) > $@-src; \ + { echo N; \ + info libc date calendar format | grep '^ `%.'\' \ + | $(extract_char); } | sort > $@-info; \ + diff -u $@-src $@-info || exit 1; \ + rm -f $@-src $@-info; \ + fi + +check-AUTHORS: + $(MAKE) -C src $@ + +# Ensure that we use only the standard $(VAR) notation, +# not @...@ in Makefile.am, now that we can rely on automake +# to emit a definition for each substituted variable. +makefile-check: + grep -nE '@[A-Z_0-9]+@' `find . -name Makefile.am` \ + && { echo 'Makefile.maint: use $$(...), not @...@' 1>&2; exit 1; } || : + +news-date-check: NEWS + today=`date +%Y-%m-%d`; \ + if head NEWS | grep '^\*.* $(VERSION_REGEXP) ('$$today')' \ + >/dev/null; then \ + :; \ + else \ + echo "version or today's date is not in NEWS" 1>&2; \ + exit 1; \ + fi + +changelog-check: + if head ChangeLog | grep 'Version $(VERSION_REGEXP)\.$$' \ + >/dev/null; then \ + :; \ + else \ + echo "$(VERSION) not in ChangeLog" 1>&2; \ + exit 1; \ + fi + +m4-check: + @grep -n 'AC_DEFUN([^[]' m4/*.m4 \ + && { echo 'Makefile.maint: quote the first arg to AC_DEFUN' 1>&2; \ + exit 1; } || : + +# Verify that all source files using _() are listed in po/POTFILES.in. +# FIXME: don't hard-code file names below; use a more general mechanism. +po-check: + if test -f po/POTFILES.in; then \ + grep -E -v '^(#|$$)' po/POTFILES.in \ + | grep -v '^src/false\.c$$' | sort > $@-1; \ + files=; \ + for file in $$($(CVS_LIST_EXCEPT)); do \ + case $$file in \ + *.[ch]) \ + base=`expr " $$file" : ' \(.*\)\..'`; \ + { test -f $$base.l || test -f $$base.y; } && continue;; \ + *) continue;; \ + esac; \ + files="$$files $$file"; \ + done; \ + grep -E -l '\b(N?_|gettext *)\([^)"]*("|$$)' $$files \ + | sort -u > $@-2; \ + diff -u $@-1 $@-2 || exit 1; \ + rm -f $@-1 $@-2; \ + fi + +# In a definition of #define AUTHORS "... and ..." where the RHS contains +# the English word `and', the string must be marked with `N_ (...)' so that +# gettext recognizes it as a string requiring translation. +author_mark_check: + @grep -n '^# *define AUTHORS "[^"]* and ' src/*.c |grep -v ' N_ (' && \ + { echo 'Makefile.maint: enclose the above strings in N_ (...)' 1>&2; \ + exit 1; } || : + +# Sometimes it is useful to change the PATH environment variable +# in Makefiles. When doing so, it's better not to use the Unix-centric +# path separator of `:', but rather the automake-provided `@PATH_SEPARATOR@'. +# It'd be better to use `find -print0 ...|xargs -0 ...', but less portable, +# and there probably aren't many projects with so many Makefile.am files +# that we'd have to worry about limits on command line length. +msg = 'Makefile.maint: Do not use `:'\'' above; use @PATH_SEPARATOR@ instead' +makefile_path_separator_check: + @grep -n 'PATH=.*:' `find $(srcdir) -name Makefile.am` \ + && { echo $(msg) 1>&2; exit 1; } || : + +# 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); \ + 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 +texi = doc/$(PACKAGE).texi +# Make sure that the copyright date in $(v_etc_file) is up to date. +# Do the same for the $(sample-test) and the main doc/.texi file. +copyright-check: + @if test -f $(v_etc_file); then \ + grep 'enum { COPYRIGHT_YEAR = '$$(date +%Y)' };' $(v_etc_file) \ + >/dev/null \ + || { echo 'out of date copyright in $(v_etc_file); update it' 1>&2; \ + exit 1; }; \ + fi + @if test -f $(sample-test); then \ + grep '# Copyright (C) '$$(date +%Y)' Free' $(sample-test) \ + >/dev/null \ + || { echo 'out of date copyright in $(sample-test); update it' 1>&2; \ + exit 1; }; \ + fi + @if test -f $(texi); then \ + grep 'Copyright @copyright{} .*'$$(date +%Y)' Free' $(texi) \ + >/dev/null \ + || { echo 'out of date copyright in $(texi); update it' 1>&2; \ + exit 1; }; \ + fi + +vc-diff-check: + $(VC) diff > vc-diffs || : + if test -s vc-diffs; then \ + cat vc-diffs; \ + echo "Some files are locally modified:" 1>&2; \ + exit 1; \ + else \ + rm vc-diffs; \ + fi + +cvs-check: vc-diff-check + +maintainer-distcheck: + $(MAKE) distcheck + $(MAKE) my-distcheck + +# Use -Wformat -Werror to detect format-string/arg-list mismatches. +# Also, check for shadowing problems with -Wshadow, and for pointer +# arithmetic problems with -Wpointer-arith. +# These CFLAGS are pretty strict. If you build this target, you probably +# have to have a recent version of gcc and glibc headers. +# The for-loop below ensures that there is a bin/ directory full of all +# of the programs under test (except the few that are required for basic +# Makefile rules), all symlinked to the just-built "false" program. +# This is to ensure that if ever a test neglects to make PATH include +# the build srcdir, these always-failing programs will run. +# Otherwise, it is too easy to test the wrong programs. +# Note that "false" itself is a symlink to true, so it too will malfunction. +TMPDIR ?= /tmp +t=$(TMPDIR)/$(PACKAGE)/test +my-distcheck: $(local-check) check + -rm -rf $(t) + mkdir -p $(t) + GZIP=$(GZIP_ENV) $(AMTAR) -C $(t) -zxf $(distdir).tar.gz + cd $(t)/$(distdir) \ + && ./configure --disable-nls \ + && $(MAKE) CFLAGS='$(warn_cflags)' \ + AM_MAKEFLAGS='$(null_AM_MAKEFLAGS)' \ + && $(MAKE) dvi \ + && $(MAKE) distclean + (cd $(t) && mv $(distdir) $(distdir).old \ + && $(AMTAR) -zxf - ) < $(distdir).tar.gz + diff -ur $(t)/$(distdir).old $(t)/$(distdir) + if test -f $(srcdir)/src/c99-to-c89.diff; then \ + cd $(t)/$(distdir) \ + && (cd src && patch -V never --fuzz=0 <c99-to-c89.diff) \ + && ./configure --disable-largefile \ + CFLAGS='-Werror -ansi -Wno-long-long' \ + && $(MAKE); \ + fi + -rm -rf $(t) + @echo "========================"; \ + echo "$(distdir).tar.gz is ready for distribution"; \ + echo "========================" diff --git a/build-aux/find-unnecessary-if-before-free b/build-aux/find-unnecessary-if-before-free new file mode 100755 index 0000000..2b415f9 --- /dev/null +++ b/build-aux/find-unnecessary-if-before-free @@ -0,0 +1,41 @@ +#!/usr/bin/perl +# Detect instances of "if (p) free (p);". +# Likewise for "if (p != NULL) free (p);". +# Exit status is like grep: 0 for no match. 1 for any number. + +# Note: giving line numbers isn't practical, since I've reset the +# input record separator. +use strict; +use warnings; +(my $ME = $0) =~ s|.*/||; + +{ + # Use ';' as the input record separator. + $/ = ';'; + + my $found_match = 0; + foreach my $file (@ARGV) + { + open FH, '<', $file + or die "$ME: can't open `$file' for reading: $!\n"; + while (defined (my $line = <FH>)) + { + if ($line =~ + /\b(if\s*\(\s*(\S+?)(?:\s*!=\s*NULL)?\s*\) + \s+(?:sexpr_)?free\s*\(\s*\2\s*\))/sx) + { + print "$file: $1\n"; + $found_match = 1; + } + } + close FH; + } + exit !$found_match; +} + +my $foo = <<'EOF'; +# The above is to *find* them. +# This adjusts them, removing the unnecessary "if (p)" part. + +perl -0x3b -pi -e 's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*NULL)?\s*\)\s+((?:sexpr_)?free\s*\(\s*\1\s*\))/$2/s' $(git ls-files|grep -v '^gnulib') +EOF diff --git a/build-aux/vc-list-files b/build-aux/vc-list-files new file mode 100755 index 0000000..72a6f54 --- /dev/null +++ b/build-aux/vc-list-files @@ -0,0 +1,50 @@ +#!/bin/sh +# List the specified version-controlled files. + +# Copyright (C) 2006, 2007 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 +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + + +# List the specified version-controlled files. +# With no argument, list them all. +# This script must be run solely from the top of a $srcdir build directory. + +# If there's an argument, it must be a single, "."-relative directory name. +# cvsu is part of the cvsutils package: http://www.red-bean.com/cvsutils/ + +dir= +case $# in + 0) ;; + 1) dir=$1 ;; + *) echo "$0: too many arguments" 1>&2; exit 1 ;; +esac + +test "x$dir" = x && dir=. + +if test -d CVS; then + if test -x build-aux/cvsu; then + build-aux/cvsu --find --types=AFGM "$dir" + else + awk -F/ '{ \ + if (!$1 && $3 !~ /^-/) { \ + f=FILENAME; \ + sub(/CVS\/Entries/, "", f); \ + print f $2; \ + }}' \ + $(find ${*-*} -name Entries -print) /dev/null; + fi +else + git-ls-files "$dir" +fi -- 1.5.4.rc4.15.g215c5

Jim Meyering <jim@meyering.net> wrote:
Add framework for code style- and syntax-checking rules.
Almost all tests are initially disabled via the list in Makefile.cfg. * Makefile.am (EXTRA_DIST): Add .x-sc_avoid_if_before_free. Omit names of files that automake includes automatically. * .x-sc_avoid_if_before_free: New file. * build-aux/vc-list-files: Likewise. * build-aux/find-unnecessary-if-before-free: Likewise. * GNUmakefile, Makefile.cfg, Makefile.maint: New files.
Signed-off-by: Jim Meyering <meyering@redhat.com> --- .x-sc_avoid_if_before_free | 4 + GNUmakefile | 58 ++++ Makefile.am | 8 +- Makefile.cfg | 62 ++++ Makefile.maint | 510 +++++++++++++++++++++++++++++
Note that Makefile.maint contains some tests that are not applicable to libvirt. They're disabled, after all. However, I opted to leave the unused rules in Makefile.maint even though they're probably never going to be used here, just so that it's a little easier to keep libvirt's copy of this file synchronized with the one in coreutils. The idea is that if something needs to be changed, it can be changed via Makefile.cfg. Of course tests like the one for marked diagnostics will have to be adapted to deal with libvirt-specific function names.

On Fri, Jan 25, 2008 at 11:17:44PM +0100, Jim Meyering wrote:
Add framework for code style- and syntax-checking rules.
Almost all tests are initially disabled via the list in Makefile.cfg. * Makefile.am (EXTRA_DIST): Add .x-sc_avoid_if_before_free. Omit names of files that automake includes automatically. * .x-sc_avoid_if_before_free: New file. * build-aux/vc-list-files: Likewise. * build-aux/find-unnecessary-if-before-free: Likewise. * GNUmakefile, Makefile.cfg, Makefile.maint: New files.
Signed-off-by: Jim Meyering <meyering@redhat.com> --- .x-sc_avoid_if_before_free | 4 + GNUmakefile | 58 ++++ Makefile.am | 8 +- Makefile.cfg | 62 ++++ Makefile.maint | 510 +++++++++++++++++++++++++++++ build-aux/find-unnecessary-if-before-free | 41 +++ build-aux/vc-list-files | 50 +++
The build-aux directory currently only contains auto-generated files. If its not too much pain, can we put these 2 helpers into scripts/ where I've got a couple of other build/test related helper scripts. Can't really comment on the actaul contents of Makefile.maint - too much scary shell code to review, but if it is working for coreutils I'm happy with it. Particularly since this is not something that needs to be explicitly invoked by developers. Dan. -- |=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=| |=- Perl modules: http://search.cpan.org/~danberr/ -=| |=- Projects: http://freshmeat.net/~danielpb/ -=| |=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|

"Daniel P. Berrange" <berrange@redhat.com> wrote: ...
build-aux/find-unnecessary-if-before-free | 41 +++ build-aux/vc-list-files | 50 +++
The build-aux directory currently only contains auto-generated files. If its not too much pain, can we put these 2 helpers into scripts/ where I've got a couple of other build/test related helper scripts.
Can't really comment on the actaul contents of Makefile.maint - too much scary shell code to review, but if it is working for coreutils I'm happy with it. Particularly since this is not something that needs to be explicitly invoked by developers.
I added them there, because I'm going to add them to gnulib. So before long they will be pulled in just like the others. Ok?

On Tue, Jan 29, 2008 at 04:41:30PM +0100, Jim Meyering wrote:
"Daniel P. Berrange" <berrange@redhat.com> wrote: ...
build-aux/find-unnecessary-if-before-free | 41 +++ build-aux/vc-list-files | 50 +++
The build-aux directory currently only contains auto-generated files. If its not too much pain, can we put these 2 helpers into scripts/ where I've got a couple of other build/test related helper scripts.
Can't really comment on the actaul contents of Makefile.maint - too much scary shell code to review, but if it is working for coreutils I'm happy with it. Particularly since this is not something that needs to be explicitly invoked by developers.
I added them there, because I'm going to add them to gnulib. So before long they will be pulled in just like the others.
Ok, no problem. Dan, -- |=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=| |=- Perl modules: http://search.cpan.org/~danberr/ -=| |=- Projects: http://freshmeat.net/~danielpb/ -=| |=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|

Jim Meyering wrote:
"Daniel P. Berrange" <berrange@redhat.com> wrote: ...
build-aux/find-unnecessary-if-before-free | 41 +++ build-aux/vc-list-files | 50 +++ The build-aux directory currently only contains auto-generated files. If its not too much pain, can we put these 2 helpers into scripts/ where I've got a couple of other build/test related helper scripts.
Can't really comment on the actaul contents of Makefile.maint - too much scary shell code to review, but if it is working for coreutils I'm happy with it. Particularly since this is not something that needs to be explicitly invoked by developers.
I added them there, because I'm going to add them to gnulib. So before long they will be pulled in just like the others. Ok?
Looks good. Rich. -- Emerging Technologies, Red Hat - http://et.redhat.com/~rjones/ Registered Address: Red Hat UK Ltd, Amberley Place, 107-111 Peascod Street, Windsor, Berkshire, SL4 1TE, United Kingdom. Registered in England and Wales under Company Registration No. 03798903
participants (3)
-
Daniel P. Berrange
-
Jim Meyering
-
Richard W.M. Jones