summaryrefslogtreecommitdiff
path: root/cfg.mk
blob: effda66fe9a02f30fec4b2027aa4e51049c44447 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
## Customize maint.mk                           -*- makefile -*-
## Copyright (C) 2008-2015, 2018-2019 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/>.

# Update version, then recompile so that tests/bison --version be
# up-to-date, then compile our parser again with our up-to-date bison.
.PHONY: regen
regen: _version
	$(MAKE) $(AM_MAKEFLAGS)
	touch $(srcdir)/src/parse-gram.y
	$(MAKE) $(AM_MAKEFLAGS)

# Used in maint.mk's web-manual rule
manual_title = The Yacc-compatible Parser Generator
gendocs_options_ = -I $(abs_top_srcdir)/doc -I $(abs_top_builddir)/doc

# It's useful to run maintainer-check* targets during development, but we
# don't want to wait on a recompile because of an update to $(VERSION).  Thus,
# override the _is-dist-target from GNUmakefile so that maintainer-check*
# targets are filtered out.
_is-dist-target = $(filter-out %clean maintainer-check%, \
  $(filter maintainer-% dist% alpha beta major,$(MAKECMDGOALS)))

url_dir_list = \
  https://$(gnu_rel_host)/gnu/bison

# Tests not to run as part of "make distcheck".
local-checks-to-skip =			\
  sc_immutable_NEWS			\
  sc_prohibit_atoi_atof

# The local directory containing the checked-out copy of gnulib used in
# this release.  Used solely to get a date for the "announcement" target.
gnulib_dir = $(srcdir)/gnulib

bootstrap-tools = autoconf,automake,flex,gettext,gnulib

announcement_Cc_ = \
  bug-bison@gnu.org, help-bison@gnu.org, bison-patches@gnu.org, \
  coordinator@translationproject.org

update-copyright: update-b4-copyright update-package-copyright-year
update-copyright-env = \
  UPDATE_COPYRIGHT_FORCE=1 UPDATE_COPYRIGHT_USE_INTERVALS=1


## -------------------- ##
## More syntax-checks.  ##
## -------------------- ##

# At least for Mac OS X's grep, the order between . and [ in "[^.[]"
# matters:
# $ LC_ALL=fr_FR grep -nE '[^[.]' /dev/null
# $ LC_ALL=C grep -nE '[^[.]' /dev/null
# grep: invalid collating element or class
# $ LC_ALL=fr_FR grep -nE '[^.[]' /dev/null
# $ LC_ALL=C grep -nE '[^.[]' /dev/null
sc_at_parser_check:
	@prohibit='AT_PARSER_CHECK\(\[+[^.[]|AT_CHECK\(\[+\./'		\
	halt='use AT_PARSER_CHECK for and only for generated parsers'	\
	  $(_sc_search_regexp)

# Indent only with spaces.
# Taken from Coreutils.
sc_prohibit_tab_based_indentation:
	@prohibit='^ *	'						\
	halt='TAB in indentation; use only spaces'			\
	  $(_sc_search_regexp)

# Prohibit the use of `...` in tests/.  Use $(...) instead.
# Taken from Coreutils.
# Not ready for Bison yet.
#sc_prohibit_test_backticks:
#	@prohibit='`' in_vc_files='^tests/'		\
#	halt='use $$(...), not `...` in tests/'		\
#	  $(_sc_search_regexp)

# Enforce recommended preprocessor indentation style.
# Taken from Coreutils.
sc_preprocessor_indentation:
	@if cppi --version >/dev/null 2>&1; then			\
	  $(VC_LIST_EXCEPT) | grep '\.[ch]$$' | xargs cppi -a -c	\
	    || { echo '$(ME): incorrect preprocessor indentation' 1>&2;	\
		exit 1; };						\
	else								\
	  echo '$(ME): skipping test $@: cppi not installed' 1>&2;	\
	fi

###########################################################
# Taken from Coreutils.
_p0 = \([^"'/]\|"\([^\"]\|[\].\)*"\|'\([^\']\|[\].\)*'
_pre = $(_p0)\|[/][^"'/*]\|[/]"\([^\"]\|[\].\)*"\|[/]'\([^\']\|[\].\)*'\)*
_pre_anchored = ^\($(_pre)\)
_comment_and_close = [^*]\|[*][^/*]\)*[*][*]*/
# help font-lock mode: '

# A sed expression that removes ANSI C and ISO C99 comments.
# Derived from the one in GNU gettext's 'moopp' preprocessor.
_sed_remove_comments =					\
/[/][/*]/{						\
  ta;							\
  :a;							\
  s,$(_pre_anchored)//.*,\1,;				\
  te;							\
  s,$(_pre_anchored)/[*]\($(_comment_and_close),\1 ,;	\
  ta;							\
  /^$(_pre)[/][*]/{					\
    s,$(_pre_anchored)/[*].*,\1 ,;			\
    tu;							\
    :u;							\
    n;							\
    s,^\($(_comment_and_close),,;			\
    tv;							\
    s,^.*$$,,;						\
    bu;							\
    :v;							\
  };							\
  :e;							\
}
# Quote all single quotes.
_sed_rm_comments_q = $(subst ','\'',$(_sed_remove_comments))
# help font-lock mode: '

_space_before_paren_exempt =? \\n\\$$
_space_before_paren_exempt = \
  (^ *\#|(LA)?LR\([01]\)|percent_(code|define)|b4_syncline|m4_(define|init)|symbol)
# Ensure that there is a space before each open parenthesis in C code.
sc_space_before_open_paren:
	@if $(VC_LIST_EXCEPT) | grep -l '\.[ch]$$' > /dev/null; then	\
	  fail=0;							\
	  for c in $$($(VC_LIST_EXCEPT) | grep '\.[ch]$$'); do		\
	    sed '$(_sed_rm_comments_q)' $$c 2>/dev/null			\
	      | grep -i '[[:alnum:]]('					\
	      | grep -vE '$(_space_before_paren_exempt)'		\
	      | grep . && { fail=1; echo "*** $$c"; };			\
	  done;								\
	  test $$fail = 1 &&						\
	    { echo '$(ME): the above files lack a space-before-open-paren' \
		1>&2; exit 1; } || :;					\
	else :;								\
	fi

## -------------------------- ##
## syntax-checks exceptions.  ##
## -------------------------- ##

exclude = \
  $(foreach a,$(1),$(eval $(subst $$,$$$$,exclude_file_name_regexp--sc_$(a))))
$(call exclude,                                                                 \
  bindtextdomain=^lib/main.c$$                                                  \
  cast_of_argument_to_free=^src/muscle-tab.c$$                                  \
  preprocessor_indentation=^data/|^lib/|^src/parse-gram.[ch]$$                  \
  program_name=^lib/main.c$$                                                    \
  prohibit_always-defined_macros=^data/skeletons/yacc.c$$                       \
  prohibit_always-defined_macros+=?|^src/(parse-gram.c|system.h)$$              \
  prohibit_always-defined_macros+=?|^tests/regression.at$$                      \
  prohibit_doubled_word=^tests/named-refs.at$$                                  \
  prohibit_magic_number_exit=^doc/bison.texi$$                                  \
  prohibit_magic_number_exit+=?|^tests/(conflicts|regression).at$$              \
  prohibit_strcmp=^doc/bison\.texi|tests/local\.at$$                            \
  prohibit_tab_based_indentation=install-icc.sh|\.(am|mk)$$|^\.git|Makefile$$   \
  require_config_h=^(lib/yyerror|data/skeletons/(glr|yacc))\.c$$                \
  require_config_h_first=^(lib/yyerror|data/skeletons/(glr|yacc))\.c$$          \
  space_before_open_paren=^data/skeletons/                                      \
  two_space_separator_in_usage=^(bootstrap|build-aux/install-icc.sh)            \
  unmarked_diagnostics=^(doc/bison.texi$$|tests/c\+\+\.at$$)                    \
)