1 # $Id: maintainer.mak 722 2009-07-09 16:10:35Z dhiebert $
3 # Copyright (c) 1996-2009, Darren Hiebert
5 # Development makefile for Exuberant Ctags. Also used to build releases.
12 DSOURCES
:= $(SOURCES
) debug.c
14 VERSION_FILES
:= ctags.h ctags
.1 NEWS
16 LIB_FILES
:= readtags.c readtags.h
18 ENVIRONMENT_MAKEFILES
:= \
19 mk_bc3.mak mk_bc5.mak mk_djg.mak mk_manx.mak mk_mingw.mak \
20 mk_mpw.mak mk_mvc.mak mk_os2.mak mk_qdos.mak mk_sas.mak \
22 COMMON_FILES
:= COPYING EXTENDING.html FAQ INSTALL.oth MAINTAINERS NEWS README \
23 $(ENVIRONMENT_MAKEFILES
) source.mak \
24 $(DSOURCES
) $(HEADERS
) $(LIB_FILES
) \
25 $(ENVIRONMENT_SOURCES
) $(ENVIRONMENT_HEADERS
)
27 UNIX_FILES
:= $(COMMON_FILES
) \
28 .indent.pro INSTALL configure.ac \
29 Makefile.in maintainer.mak \
30 descrip.mms mkinstalldirs magic.diff \
33 REGEX_DIR
:= gnu_regex
35 WIN_FILES
:= $(COMMON_FILES
) $(VERSION_FILES
)
37 SVN_FILES
:= $(UNIX_FILES
)
41 OBJECTS
:= $(patsubst %.c
,%.o
,$(notdir $(SOURCES
)))
42 DOBJECTS
:= $(patsubst %.c
,%.od
,$(notdir $(DSOURCES
)))
43 DEPS
:= $(patsubst %.c
,$(DEP_DIR
)/%.d
,$(notdir $(SOURCES
)))
45 WARNINGS
:= -Wall
-W
-Wpointer-arith
-Wcast-align
-Wwrite-strings \
46 -Wmissing-prototypes
-Wmissing-declarations \
47 -Wnested-externs
-Wcast-qual
-Wshadow
-pedantic \
49 # -Wtraditional -Wconversion -Werror
51 PRODUCER
:= Darren B. Hiebert
52 EMAIL
:= dhiebert@users.sourceforge.net
53 CTAGS_WEBSITE
:= http
://ctags.sourceforge.net
55 RPM_ABS_ROOT
:= $(PWD
)/$(RPM_ROOT
)
57 RELEASE_DIR
:= releases
58 CTAGS_WEBDIR
:= website
59 win_version
= $(subst .
,,$(version
))
60 HOST_ARCH
:= $(shell uname
-p
)
62 ifneq ($(findstring $(HOST_ARCH
),i386 i686
),)
63 COMP_ARCH
:= -march
=i686
68 DEFS
:= -DHAVE_CONFIG_H
69 COMP_FLAGS
:= $(INCLUDE
) $(DEFS
) $(CFLAGS
)
70 PROF_OPT
:= -O3
$(COMP_ARCH
)
71 #OPT := $(PROF_OPT) -fomit-frame-pointer
73 DCFLAGS
:= $(COMP_FLAGS
) -DDEBUG
-DINTERNAL_SORT
76 RPM_FLAGS
:= -O3
$(COMP_ARCH
)
78 AUTO_GEN
:= configure config.h.in
79 CONFIG_GEN
:= config.cache config.log config.status config.run config.h Makefile
81 COV_GEN
:= *.da
*.gcov
83 UNIX2DOS
:= perl
-pe
's/(\r\n|\n|\r)/\r\n/g'
84 MAN2HTML
:= tbl | groff
-Wall
-mtty-char
-mandoc
-Thtml
-c
90 ifeq ($(findstring clean,$(MAKECMDGOALS
)),)
91 ifeq ($(wildcard config.h
),)
92 ctags dctags ctags.prof ctags.cov
:
94 $(MAKE
) $(MAKECMDGOALS
)
96 all: dctags
tags syntax.vim
98 -include $(DEPS
) $(DEP_DIR
)/readtags.d
104 @ echo
"-- Linking $@"
105 @
$(LD
) -o
$@
$(LDFLAGS
) $^
107 dctags
: $(DOBJECTS
) debug.od
108 @ echo
"-- Building $@"
109 $(LD
) -o
$@
$(LDFLAGS
) $^
111 ctags.prof
: $(SOURCES
) $(HEADERS
) Makefile
112 $(CC
) -pg
$(PROF_OPT
) $(COMP_FLAGS
) $(WARNINGS
) $(SOURCES
) -o
$@
114 ctags.cov
: $(SOURCES
) $(HEADERS
) Makefile
115 $(CC
) -fprofile-arcs
-ftest-coverage
$(COMP_FLAGS
) $(WARNINGS
) $(SOURCES
) -o
$@
117 gcov
: $(SOURCES
:.c
=.c.gcov
)
119 readtags
: readtags.
[ch
]
120 $(CC
) -g
$(COMP_FLAGS
) -DDEBUG
-DREADTAGS_MAIN
-o
$@ readtags.c
122 readtags.o
: readtags.c readtags.h
123 $(CC
) $(COMP_FLAGS
) -c readtags.c
125 etyperef
: etyperef.o keyword.o routines.o strlist.o vstring.o
129 $(CC
) -DTYPE_REFERENCE_TOOL
$(OPT
) $(COMP_FLAGS
) -o
$@
-c
$<
139 config.h.in
: configure.ac
143 configure
: configure.ac
146 config.status
: configure
147 .
/config.status
--recheck
149 config.h
: config.h.in config.status
162 clean: depclean profclean gcovclean clean-test
163 rm -f
*.
[ois
] *.o
[dm
] ctags dctags ctags
*.exe readtags etyperef \
164 ctags.man ctags.html ctags.prof ctags.cov
*.bb
*.bbg
tags TAGS syntax.vim
169 maintainer-clean maintclean
: distclean
173 tbl
$< | groff
-Wall
-mtty-char
-mandoc
-Tascii
-c | sed
's/.\b//g' > $@
176 cat
$< |
$(MAN2HTML
) > $@
178 tags: $(DSOURCES
) $(HEADERS
) $(LIB_FILES
) Makefile
*.mak
179 @ echo
"-- Building tag file"
183 # Create a Vim syntax file for all typedefs
186 syntax.vim
: $(DSOURCES
) $(HEADERS
) $(LIB_FILES
)
187 @ echo
"-- Generating syntax file"
188 @ ctags
--c-types
=cgstu
--file-scope
-o-
$^ |\
189 awk
'{print $$1}' |
sort -u | fmt |\
190 awk
'{printf("syntax keyword Typedef\t%s\n", $$0)}' > $@
201 @ echo
"Major targets:"
202 @ echo
"default : Build dctags, with debugging support"
203 @ echo
"ctags : Build optimized binary"
204 @ echo
"help-release: Print help on releasing ctags"
211 @ echo
"1. make release-svn-X.Y"
212 @ echo
"2. make release-source-X.Y"
213 @ echo
"3. move ctags-X.Y.tar.gz to Linux"
214 @ echo
"4. On Linux: Extract tar; make -f maintainer.mak release-rpm-X.Y"
215 @ echo
"5. On Windows: cd $(WINDOWS_DIR)/winXY; nmake -f mk_mvc.mak ctags.exe mostlyclean"
216 @ echo
"6. make version=X.Y win-zip"
217 @ echo
"7. make website-X.Y"
222 RPM_SUBDIRS
:= BUILD SOURCES SPECS SRPMS RPMS
223 RPM_DIRS
:= $(addprefix $(RPM_ROOT
)/,$(RPM_SUBDIRS
))
225 $(RELEASE_DIR
)/ctags-
%-1.
$(RPM_ARCH
).rpm
: \
226 $(RPM_ROOT
)/RPMS
/$(RPM_ARCH
)/ctags-
%-1.
$(RPM_ARCH
).rpm \
231 $(RELEASE_DIR
)/ctags-
%-1.src.rpm
: \
232 $(RPM_ROOT
)/SRPMS
/ctags-
%-1.src.rpm \
237 $(eval
$(RPM_DIRS
) $(RELEASE_DIR
): ; mkdir
-p
$$@
)
239 $(RPM_ROOT
)/SRPMS
/ctags-
%-1.src.rpm \
240 $(RPM_ROOT
)/RPMS
/$(RPM_ARCH
)/ctags-
%-1.
$(RPM_ARCH
).rpm
: \
241 $(RPM_ROOT
)/SOURCES
/ctags-
%.
tar.gz \
242 $(RPM_ROOT
)/SPECS
/ctags-
%.spec \
244 rpmbuild
--define '_topdir $(RPM_ABS_ROOT)' --define 'optflags $(RPM_FLAGS)' --define 'packager $(PRODUCER) $(CTAGS_WEBSITE)' -ba
$(RPM_ROOT
)/SPECS
/ctags-
$*.spec
245 rm -fr
$(RPM_ROOT
)/BUILD
/ctags-
$*
247 $(RPM_ROOT
)/rpmrc
: rpmmacros maintainer.mak
248 echo
"optflags: $(RPM_ARCH) $(RPM_FLAGS)" > $@
249 echo
"macrofiles: $(PWD)/rpmmacros" >> $@
251 $(RPM_ROOT
)/rpmmacros
: maintainer.mak
252 echo
"%_topdir $(RPM_ABS_ROOT)" > $@
253 echo
'%_gpg_name "$(PRODUCER) <$(EMAIL)>"' >> $@
254 echo
"%packager $(PRODUCER) $(CTAGS_WEBSITE)" >> $@
255 echo
"%_i18ndomains %{nil}" >> $@
256 echo
"%debug_package %{nil}" >> $@
258 $(RPM_ROOT
)/SPECS
/ctags-
%.spec
: ctags.spec |
$(RPM_ROOT
)/SPECS
259 sed
-e
"s/@VERSION@/$*/" ctags.spec
> $(RPM_ROOT
)/SPECS
/ctags-
$*.spec
261 $(RPM_ROOT
)/SOURCES
/ctags-
%.
tar.gz
: $(RELEASE_DIR
)/ctags-
%.
tar.gz |
$(RPM_ROOT
)/SOURCES
264 $(RELEASE_DIR
)/ctags-
%.
tar.gz
: $(UNIX_FILES
) |
$(RELEASE_DIR
)
265 @ echo
"---------- Building tar ball"
266 if
[ -d
$(@D
)/dirs
/ctags-
$* ]; then
rm -fr
$(@D
)/dirs
/ctags-
$*; fi
267 mkdir
-p
$(@D
)/dirs
/ctags-
$*
268 cp
-pr
$(UNIX_FILES
) $(REGEX_DIR
) $(@D
)/dirs
/ctags-
$*/
269 sed
-e
's/\(PROGRAM_VERSION\) "\([^ ]*\)"/\1 "$*"/' ctags.h
> $(@D
)/dirs
/ctags-
$*/ctags.h
270 sed
-e
's/"\(Version\) \([^ ]*\)"/"\1 $*"/' ctags
.1 > $(@D
)/dirs
/ctags-
$*/ctags
.1
271 sed
-e
's/\(Current Version:\) [^ ]*/\1 $*/' -e
's/@VERSION@/$*/' -e
"s/@DATE@/`date +'%d %b %Y'`/" NEWS
> $(@D
)/dirs
/ctags-
$*/NEWS
272 (cd
$(@D
)/dirs
/ctags-
$* ;\
274 chmod
755 mkinstalldirs
;\
275 chmod
755 $(REGEX_DIR
) ;\
276 chmod
644 $(REGEX_DIR
)/* ;\
278 chmod
644 config.h.in
;\
280 chmod
755 configure
;\
281 rm -fr autom4te.cache
;\
282 cat ctags
.1 |
$(MAN2HTML
) > ctags.html
;\
284 cd
$(@D
)/dirs
&& tar -zcf ..
/$(@F
) ctags-
$*
290 ifneq ($(findstring win-
,$(MAKECMDGOALS
)),)
292 $(error
$(MAKECMDGOALS
) target requires value for
'version')
297 @ if
[ -z
"$(version)" ]; then echo
"target requires value for 'version'" >&2; exit
1; fi
299 $(WINDOWS_DIR
)/ctags
$(win_version
): \
300 $(RELEASE_DIR
)/ctags-
$(version
).
tar.gz maintainer.mak \
302 @ echo
"---------- Building Win32 release directory"
303 rm -fr
"$(WINDOWS_DIR)/ctags$(win_version)"
304 mkdir
-p
"$(WINDOWS_DIR)/ctags$(win_version)"
305 for file in
$(WIN_FILES
) ctags.html
; do \
306 $(UNIX2DOS
) < "$(RELEASE_DIR)/dirs/ctags-$(version)/$${file}" > $@
/$${file} ;\
308 mkdir
$@
/$(REGEX_DIR
)
309 for file in
$(REGEX_DIR
)/*; do \
310 $(UNIX2DOS
) < "$${file}" > $@
/$(REGEX_DIR
)/`basename $${file}` ;\
313 chmod
755 $@
/$(REGEX_DIR
)
314 chmod
644 $@
/$(REGEX_DIR
)/*
316 $(RELEASE_DIR
)/ctags
%.zip
: \
318 $(WINDOWS_DIR
)/ctags
% \
319 $(WINDOWS_DIR
)/ctags
%/ctags.exe
320 cd
$(WINDOWS_DIR
) && zip
-r ..
/$@ ctags
$*
322 win-source
: $(WINDOWS_DIR
)/ctags
$(win_version
)
324 win-zip
: $(RELEASE_DIR
)/ctags
$(win_version
).zip
327 $(MAKE
) version
="$*" win-source
329 release-tar-
%: $(RELEASE_DIR
)/ctags-
%.
tar.gz
333 $(RELEASE_DIR
)/ctags-
%-1.
$(RPM_ARCH
).rpm \
334 $(RELEASE_DIR
)/ctags-
%-1.src.rpm
337 release-source-
%: $(RELEASE_DIR
)/ctags-
%.
tar.gz
338 $(MAKE
) version
="$*" win-source
340 release-bin-
%: release-rpm-
%
341 $(MAKE
) version
="$*" win-zip
349 website-
%: website-man-
% website-index-
% website-news-
% \
350 $(CTAGS_WEBDIR
)/EXTENDING.html
353 website-man-
%: ctags
.1 Makefile
354 @ echo
"---------- Generating $(CTAGS_WEBDIR)/ctags.html"
356 sed
-e
's/"\(Version\) \([^ ]*\)"/"\1 $*"/' ctags
.1 |\
357 $(MAN2HTML
) > $(CTAGS_WEBDIR
)/ctags.html
359 website-index-
%: index.html Makefile
360 @ echo
"---------- Generating $(CTAGS_WEBDIR)/index.html"
362 sed
-e
"s/@VERSION@/$*/g" \
363 -e
"s/@DOS_VERSION@/`echo $* | sed 's/\.//g'`/g" \
364 -e
"s/@DATE@/`date +'%d %B %Y'`/" \
365 $< > $(CTAGS_WEBDIR
)/index.html
367 website-news-
%: NEWS maintainer.mak
368 @ echo
"---------- Generating $(CTAGS_WEBDIR)/news.html"
370 sed
-e
's/\(Current Version:\) [^ ]*/\1 $*/' \
371 -e
's/@VERSION@/$*/' \
372 -e
"s/@DATE@/`date +'%d %b %Y'`/" \
373 -e
's/</\</g' -e
's/>/\>/g' \
374 -e
's@^Current Version:.*$$@<html><head><title>Exuberant Ctags: Change Notes</title></head><body><h1>Change Notes</h1><pre>@' \
375 -e
's@\(^ctags-.* (.*)\)$$@<b>\1</b>@' \
376 -e
's@^vim:.*$$@</pre><hr><a href="http:index.html">Back to <strong>Exuberant Ctags</strong></a></body></html>@' \
377 $< > $(CTAGS_WEBDIR
)/news.html
379 $(CTAGS_WEBDIR
)/EXTENDING.html
: EXTENDING.html
380 @ echo
"---------- Generating $(CTAGS_WEBDIR)/EXTENDING.html"
381 cp
$< $@
&& chmod
644 $@
386 svn_url
:= https
://ctags.svn.sourceforge.net
/svnroot
/ctags
388 release-svn-
%: svn-tagcheck-
%
389 @ echo
"---------- Tagging release $*"
390 svn copy
-m
'Release of ctags-$*' $(svn_url
)/trunk
$(svn_url
)/tags/ctags-
$*
393 @ echo
"---------- Tagging release $*"
394 svn remove
-m
'Regenerating release of ctags-$*' $(svn_url
)/tags/ctags-
$*
395 svn copy
-m
'Release of ctags-$*' $(svn_url
)/trunk
$(svn_url
)/tags/ctags-
$*
398 if svn list
$(svn_url
)/tags/ | grep
-q
'ctags-$*/$$' >/dev
/null
2>&1 ;then \
399 echo
"ctags-$* already exists; use rerelease-$*" >&2 ;\
407 # Dependency file generation
409 $(DEPS
): %.c maintainer.mak
410 @ if
[ ! -d
$(DEP_DIR
) ] ;then mkdir
-p
$(DEP_DIR
) ;fi
411 @
$(CC
) -M
$(DCFLAGS
) $< | sed
's/\($*\.o\)\([ :]\)/\1 $*.od $(@F)\2/g' > $@
415 -@
$(CC
) -MM
$(DCFLAGS
) $<
420 %.o
%.od
: gnu_regex
/%.c
421 # @ echo "-- Compiling $<"
422 $(CC
) $(CFLAGS
) -D__USE_GNU
-Dbool
=int
-Dfalse
=0 -Dtrue
=1 -I
$(REGEX_DIR
) $(OPT
) -c
$<
425 @ echo
"-- Compiling $<"
426 @
$(CC
) $(COMP_FLAGS
) -DEXTERNAL_SORT
$(OPT
) $(WARNINGS
) -Wuninitialized
-c
$<
429 @ echo
"-- Compiling (debug) $<"
430 @
$(CC
) -g
$(DCFLAGS
) $(WARNINGS
) -o
$*.od
-c
$<
433 $(CC
) $(DCFLAGS
) $(WARNINGS
) -Wuninitialized
-O
-E
$< > $@
436 $(CC
) $(DCFLAGS
) $(WARNINGS
) -Wuninitialized
-O
-E
$< | sed
'/^[ ]*$/d' > $@
439 $(CC
) $(DCFLAGS
) $(WARNINGS
) -S
$< > $@
441 readtags.err
: DCFLAGS
+= -DREADTAGS_MAIN
444 @
$(CC
) $(DCFLAGS
) $(WARNINGS
) -Wuninitialized
-O
-c
$<
451 @ genproto
-s
-m __ARGS
$<
454 @ genproto
-e
-m __ARGS
$<
456 # Print out the value of a variable
457 # From http://www.cmcrossroads.com/ubbthreads/showflat.php?Cat=0&Board=cmbasics&Number=28829
461 # Print out the expanded values of all variables
462 # From http://www.cmcrossroads.com/ubbthreads/showflat.php?Cat=0&Number=29581
465 @
$(foreach V
,$(sort $(.VARIABLES
)), \
466 $(if
$(filter-out environment
% default automatic
, \
467 $(origin $V)),$(warning
$V=$($V))))
469 # Print out the declared values of all variables
470 .PHONY
: print-vars-decl
472 @
$(foreach V
,$(sort $(.VARIABLES
)), \
473 $(if
$(filter-out environment
% default automatic
, \
474 $(origin $V)),$(warning
$V=$(value
$V))))