1.PHONY: doc pkgdoc initdir install install-testsiteconfig \
2	install-testsiteconfig-1 install-testmodulerc install-testmodulerc-1 \
3	install-testinitrc install-testetcrc install-testmodspath \
4	install-testmodspath-empty uninstall-testconfig uninstall dist dist-tar \
5	dist-gzip dist-bzip2 dist-win srpm rpm clean distclean test-deps test \
6	testinstall testsyntax
7
8# download command and its options
9WGET := wget --retry-connrefused --waitretry=20 --timeout=20 --tries=3
10
11# definitions for code coverage
12NAGELFAR_DLSRC1 := http://downloads.sourceforge.net/nagelfar/
13NAGELFAR_RELEASE := nagelfar131
14NAGELFAR_DIST := $(NAGELFAR_RELEASE).tar.gz
15NAGELFAR_DISTSUM := fbf79ab1a1d85349600f2502a3353bf4
16NAGELFAR := $(NAGELFAR_RELEASE)/nagelfar.tcl
17
18# definition for old Tcl interpreter for coverage testing
19TCL_DLSRC := http://downloads.sourceforge.net/tcl/
20TCL_RELEASE83 := tcl8.3.5
21TCL_DIST83 := $(TCL_RELEASE83)-src.tar.gz
22TCL_DISTSUM83 := 5cb79f8b90cf1322cb1286b9fe67f7a2
23TCLSH83 := $(TCL_RELEASE83)/unix/tclsh
24
25# specific modulecmd script for test
26MODULECMDTEST := modulecmd-test.tcl
27
28# definitions for enhanced diff tool (to review test results)
29ICDIFF_DLSRC := https://raw.githubusercontent.com/jeffkaufman/icdiff/release-1.9.5/
30ICDIFF_CHECKSUM := fd5825ede4c2853ba1747a8931b077c1
31
32# compatibility version-related files
33COMPAT_DIR := compat
34
35# source definitions shared across the Makefiles of this project
36ifneq ($(wildcard Makefile.inc),Makefile.inc)
37  $(error Makefile.inc is missing, please run './configure')
38endif
39include Makefile.inc
40
41INSTALL_PREREQ := modulecmd.tcl ChangeLog README script/add.modules \
42	script/createmodule.py script/modulecmd
43TEST_PREREQ := $(MODULECMDTEST)
44
45ifeq ($(compatversion),y)
46INSTALL_PREREQ += $(COMPAT_DIR)/modulecmd$(EXEEXT) $(COMPAT_DIR)/ChangeLog
47ifeq ($(wildcard $(COMPAT_DIR)),$(COMPAT_DIR))
48TEST_PREREQ += $(COMPAT_DIR)/modulecmd
49endif
50endif
51
52ifeq ($(libtclenvmodules),y)
53INSTALL_PREREQ += lib/libtclenvmodules$(SHLIB_SUFFIX)
54TEST_PREREQ += lib/libtclenvmodules$(SHLIB_SUFFIX)
55ifeq ($(COVERAGE),y)
56TEST_PREREQ += lib/libtestutil-closedir$(SHLIB_SUFFIX) \
57	lib/libtestutil-getpwuid$(SHLIB_SUFFIX) \
58	lib/libtestutil-getgroups$(SHLIB_SUFFIX) \
59	lib/libtestutil-0getgroups$(SHLIB_SUFFIX) \
60	lib/libtestutil-dupgetgroups$(SHLIB_SUFFIX) \
61	lib/libtestutil-getgrgid$(SHLIB_SUFFIX)
62endif
63endif
64
65ifeq ($(COVERAGE),y)
66TEST_PREREQ += $(NAGELFAR)
67endif
68
69# install old Tcl interpreters to test coverage
70ifeq ($(COVERAGE_OLDTCL),y)
71TEST_PREREQ += tclsh83
72endif
73
74# define rule prereq when target need to be rebuilt when git repository change
75ifeq ($(wildcard .git),.git)
76GIT_REFRESH_PREREQ := .git/index
77else
78GIT_REFRESH_PREREQ :=
79endif
80
81all: initdir $(INSTALL_PREREQ)
82
83# skip doc build if no sphinx-build
84ifneq ($(builddoc),n)
85all: pkgdoc
86endif
87
88initdir: version.inc
89	$(MAKE) -C init all
90
91pkgdoc: version.inc
92	$(MAKE) -C doc man txt
93
94doc: version.inc
95	$(MAKE) -C doc all
96
97# build version.inc shared definitions from git repository info
98ifeq ($(wildcard .git) $(wildcard version.inc.in),.git version.inc.in)
99GIT_CURRENT_TAG := $(shell git describe --tags --abbrev=0)
100GIT_CURRENT_DESC := $(shell git describe --tags)
101GIT_CURRENT_BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
102
103MODULES_RELEASE := $(subst v,,$(GIT_CURRENT_TAG))
104MODULES_BUILD_DATE := $(shell git log -1 --format=%cd --date=short)
105ifeq ($(GIT_CURRENT_TAG),$(GIT_CURRENT_DESC))
106MODULES_BUILD :=
107else ifeq ($(GIT_CURRENT_BRANCH),master)
108MODULES_BUILD := +$(subst $(GIT_CURRENT_TAG)-,,$(GIT_CURRENT_DESC))
109else
110MODULES_BUILD := +$(GIT_CURRENT_BRANCH)$(subst $(GIT_CURRENT_TAG),,$(GIT_CURRENT_DESC))
111endif
112
113else
114# load raw version information
115include version.inc.in
116
117# build short date from full date found in raw data
118ifeq ($(MODULES_BUILD_FDATE),$$Format:%ci$$)
119MODULES_BUILD_DATE := $(shell date '+%Y-%m-%d')
120else
121MODULES_BUILD_DATE := $(firstword $(MODULES_BUILD_FDATE))
122endif
123
124# set a recognizable build number if one found in version.inc.in is raw data
125ifeq ($(MODULES_BUILD_HASH),$$Format:%h$$)
126MODULES_BUILD := +XX-gffffffff
127# or compute it from these information as if working from git repository
128else
129comma := ,
130MODULES_BUILD_REFS := $(subst $(comma),,$(MODULES_BUILD_REFS))
131
132ifeq ($(filter v$(MODULES_RELEASE),$(MODULES_BUILD_REFS)),v$(MODULES_RELEASE))
133MODULES_BUILD :=
134else ifeq ($(filter master,$(MODULES_BUILD_REFS)),master)
135MODULES_BUILD := +XX-g$(MODULES_BUILD_HASH)
136else ifeq ($(MODULES_BUILD_REFS),%D)
137MODULES_BUILD := +XX-g$(MODULES_BUILD_HASH)
138else
139MODULES_BUILD := +$(lastword $(MODULES_BUILD_REFS))-XX-g$(MODULES_BUILD_HASH)
140endif
141endif
142endif
143
144# determine RPM release
145# use last release if we currently sat on tag, append build number to it elsewhere
146MODULES_LAST_RPM_VERSREL := $(shell sed -n '/^%changelog/ {n;s/^\*.* - //p;q;}' \
147	contrib/rpm/environment-modules.spec.in)
148MODULES_LAST_RPM_RELEASE := $(lastword $(subst -, ,$(MODULES_LAST_RPM_VERSREL)))
149MODULES_RPM_RELEASE := $(MODULES_LAST_RPM_RELEASE)$(subst +,.,$(subst -,.,$(MODULES_BUILD)))
150
151# define init configs location
152ifeq ($(initconfin),etcdir)
153  modulespath := $(etcdir)/modulespath
154  initrc := $(etcdir)/initrc
155else
156  modulespath := $(initdir)/.modulespath
157  initrc := $(initdir)/modulerc
158endif
159
160# comment entries if feature not enabled
161ifeq ($(versioning),y)
162  setversioning :=
163  setnotversioning := \#
164else
165  setversioning := \#
166  setnotversioning :=
167endif
168
169ifeq ($(silentshdbgsupport),y)
170  setsilentshdbgsupport :=
171else
172  setsilentshdbgsupport := \#
173endif
174
175ifeq ($(quarantinesupport),y)
176  setquarantinesupport :=
177  setnotquarantinesupport := \#
178else
179  setquarantinesupport := \#
180  setnotquarantinesupport :=
181endif
182
183ifeq ($(libtclenvmodules),y)
184  setlibtclenvmodules :=
185else
186  setlibtclenvmodules := \#
187endif
188
189ifeq ($(multilibsupport),y)
190  setmultilibsupport :=
191  setnotmultilibsupport := \#
192  sedexprlibdir := -e 's|@libdir64@|$(libdir64)|g' -e 's|@libdir32@|$(libdir32)|g'
193else
194  setmultilibsupport := \#
195  setnotmultilibsupport :=
196  sedexprlibdir := -e 's|@libdir@|$(libdir)|g'
197endif
198
199ifneq ($(pageropts),)
200  pagercmd := $(pager) $(pageropts)
201else
202  pagercmd := $(pager)
203endif
204
205ifeq ($(color),y)
206  setcolor := auto
207else
208  setcolor := never
209endif
210
211ifeq ($(autohandling),y)
212  setautohandling := 1
213else
214  setautohandling := 0
215endif
216
217ifeq ($(availindepth),y)
218  setavailindepth := 1
219else
220  setavailindepth := 0
221endif
222
223ifeq ($(implicitdefault),y)
224  setimplicitdefault := 1
225else
226  setimplicitdefault := 0
227endif
228
229ifeq ($(extendeddefault),y)
230  setextendeddefault := 1
231else
232  setextendeddefault := 0
233endif
234
235ifeq ($(advversspec),y)
236  setadvversspec := 1
237else
238  setadvversspec := 0
239endif
240
241ifeq ($(ml),y)
242  setml := 1
243else
244  setml := 0
245endif
246
247ifeq ($(setshellstartup),y)
248  setsetshellstartup := 1
249else
250  setsetshellstartup := 0
251endif
252
253ifeq ($(wa277),y)
254  setwa277 := 1
255else
256  setwa277 := 0
257endif
258
259define translate-in-script
260sed -e 's|@prefix@|$(prefix)|g' \
261	-e 's|@baseprefix@|$(baseprefix)|g' \
262	$(sedexprlibdir) \
263	-e 's|@libexecdir@|$(libexecdir)|g' \
264	-e 's|@initdir@|$(initdir)|g' \
265	-e 's|@etcdir@|$(etcdir)|g' \
266	-e 's|@modulefilesdir@|$(modulefilesdir)|g' \
267	-e 's|@moduleshome@|$(moduleshome)|g' \
268	-e 's|@VERSION@|$(VERSION)|g' \
269	-e 's|@TCLSHDIR@/tclsh|$(TCLSH)|g' \
270	-e 's|@TCLSH@|$(TCLSH)|g' \
271	-e 's|@PYTHON@|$(PYTHON)|g' \
272	-e 's|@pagercmd@|$(pagercmd)|g' \
273	-e 's|@verbosity@|$(verbosity)|g' \
274	-e 's|@color@|$(setcolor)|g' \
275	-e 's|@darkbgcolors@|$(darkbgcolors)|g' \
276	-e 's|@lightbgcolors@|$(lightbgcolors)|g' \
277	-e 's|@termbg@|$(termbg)|g' \
278	-e 's|@lockedconfigs@|$(lockedconfigs)|g' \
279	-e 's|@unloadmatchorder@|$(unloadmatchorder)|g' \
280	-e 's|@implicitdefault@|$(setimplicitdefault)|g' \
281	-e 's|@extendeddefault@|$(setextendeddefault)|g' \
282	-e 's|@advversspec@|$(setadvversspec)|g' \
283	-e 's|@searchmatch@|$(searchmatch)|g' \
284	-e 's|@wa277@|$(setwa277)|g' \
285	-e 's|@icase@|$(icase)|g' \
286	-e 's|@nearlyforbiddendays@|$(nearlyforbiddendays)|g' \
287	-e 's|@autohandling@|$(setautohandling)|g' \
288	-e 's|@availindepth@|$(setavailindepth)|g' \
289	-e 's|@silentshdbgsupport@|$(setsilentshdbgsupport)|g' \
290	-e 's|@ml@|$(setml)|g' \
291	-e 's|@setshellstartup@|$(setsetshellstartup)|g' \
292	-e 's|@quarantinesupport@|$(setquarantinesupport)|g' \
293	-e 's|@notquarantinesupport@|$(setnotquarantinesupport)|g' \
294	-e 's|@libtclenvmodules@|$(setlibtclenvmodules)|g' \
295	-e 's|@SHLIB_SUFFIX@|$(SHLIB_SUFFIX)|g' \
296	-e 's|@multilibsupport@|$(setmultilibsupport)|g' \
297	-e 's|@notmultilibsupport@|$(setnotmultilibsupport)|g' \
298	-e 's|@VERSIONING@|$(setversioning)|g' \
299	-e 's|@NOTVERSIONING@|$(setnotversioning)|g' \
300	-e 's|@MODULES_RELEASE@|$(MODULES_RELEASE)|g' \
301	-e 's|@MODULES_BUILD@|$(MODULES_BUILD)|g' \
302	-e 's|@MODULES_RPM_RELEASE@|$(MODULES_RPM_RELEASE)|g' \
303	-e 's|@MODULES_BUILD_DATE@|$(MODULES_BUILD_DATE)|g' $< > $@
304endef
305
306DIST_PREFIX := modules-$(MODULES_RELEASE)$(MODULES_BUILD)
307DIST_WIN_PREFIX := $(DIST_PREFIX)-win
308
309# avoid shared definitions to be rebuilt by make
310Makefile.inc: ;
311
312version.inc: version.inc.in $(GIT_REFRESH_PREREQ)
313	$(translate-in-script)
314
315# source version definitions shared across the Makefiles of this project
316include version.inc
317
318contrib/rpm/environment-modules.spec: contrib/rpm/environment-modules.spec.in $(GIT_REFRESH_PREREQ)
319	$(translate-in-script)
320
321modulecmd.tcl: modulecmd.tcl.in version.inc
322	$(translate-in-script)
323	chmod +x $@
324
325# generate an empty changelog file if not working from git repository
326ifeq ($(wildcard .git),.git)
327ChangeLog: script/gitlog2changelog.py
328	script/gitlog2changelog.py
329else
330ChangeLog:
331	echo "Please refer to the NEWS document to learn about main changes" >$@
332endif
333
334README:
335	sed -e '1,9d' $@.md > $@
336
337script/add.modules: script/add.modules.in
338	$(translate-in-script)
339	chmod +x $@
340
341script/createmodule.py: script/createmodule.py.in
342	$(translate-in-script)
343	chmod +x $@
344
345script/gitlog2changelog.py: script/gitlog2changelog.py.in
346	$(translate-in-script)
347	chmod +x $@
348
349script/modulecmd: script/modulecmd.in
350	$(translate-in-script)
351	chmod +x $@
352
353# compatibility version-related rules
354$(COMPAT_DIR)/modulecmd$(EXEEXT) $(COMPAT_DIR)/ChangeLog:
355	$(MAKE) -C $(COMPAT_DIR) $(@F)
356
357# Tcl extension library-related rules
358lib/libtclenvmodules$(SHLIB_SUFFIX):
359	$(MAKE) -C lib $(@F)
360
361lib/libtestutil-closedir$(SHLIB_SUFFIX):
362	$(MAKE) -C lib $(@F)
363
364lib/libtestutil-getpwuid$(SHLIB_SUFFIX):
365	$(MAKE) -C lib $(@F)
366
367lib/libtestutil-getgroups$(SHLIB_SUFFIX):
368	$(MAKE) -C lib $(@F)
369
370lib/libtestutil-0getgroups$(SHLIB_SUFFIX):
371	$(MAKE) -C lib $(@F)
372
373lib/libtestutil-dupgetgroups$(SHLIB_SUFFIX):
374	$(MAKE) -C lib $(@F)
375
376lib/libtestutil-getgrgid$(SHLIB_SUFFIX):
377	$(MAKE) -C lib $(@F)
378
379# example configs for test rules
380testsuite/example/.modulespath: testsuite/example/.modulespath.in
381	$(translate-in-script)
382
383testsuite/example/modulerc: testsuite/example/modulerc.in
384	$(translate-in-script)
385
386testsuite/example/modulerc-1: testsuite/example/modulerc-1.in
387	$(translate-in-script)
388
389testsuite/example/initrc: testsuite/example/initrc.in
390	$(translate-in-script)
391
392install-testsiteconfig: testsuite/example/siteconfig.tcl
393	$(MAKE) -C init install-testconfig DESTDIR=$(DESTDIR)
394	cp $^ $(DESTDIR)$(etcdir)/
395
396install-testsiteconfig-1: testsuite/example/siteconfig.tcl-1
397	$(MAKE) -C init install-testconfig DESTDIR=$(DESTDIR)
398	cp $^ $(DESTDIR)$(etcdir)/siteconfig.tcl
399
400install-testmodulerc: testsuite/example/modulerc
401	$(MAKE) -C init install-testconfig DESTDIR=$(DESTDIR)
402	cp $^ $(DESTDIR)$(initrc)
403
404install-testmodulerc-1: testsuite/example/modulerc-1
405	$(MAKE) -C init install-testconfig DESTDIR=$(DESTDIR)
406	cp $^ $(DESTDIR)$(initrc)
407
408install-testinitrc: testsuite/example/initrc
409	$(MAKE) -C init install-testconfig DESTDIR=$(DESTDIR)
410	cp $^ $(DESTDIR)$(initrc)
411
412install-testetcrc: testsuite/etc/empty
413	$(MAKE) -C init install-testconfig DESTDIR=$(DESTDIR)
414	cp $^ $(DESTDIR)$(etcdir)/rc
415
416install-testmodspath: testsuite/example/.modulespath
417	$(MAKE) -C init install-testconfig DESTDIR=$(DESTDIR)
418	cp $^ $(DESTDIR)$(modulespath)
419
420install-testmodspath-empty: testsuite/example/.modulespath-empty
421	$(MAKE) -C init install-testconfig DESTDIR=$(DESTDIR)
422	cp $^ $(DESTDIR)$(modulespath)
423
424uninstall-testconfig:
425	rm -f $(DESTDIR)$(etcdir)/rc
426	rm -f $(DESTDIR)$(etcdir)/siteconfig.tcl
427	rm -f $(DESTDIR)$(initrc)
428	rm -f $(DESTDIR)$(modulespath)
429	$(MAKE) -C init uninstall-testconfig DESTDIR=$(DESTDIR)
430
431install: $(INSTALL_PREREQ)
432	mkdir -p $(DESTDIR)$(libexecdir)
433	mkdir -p $(DESTDIR)$(bindir)
434	mkdir -p $(DESTDIR)$(etcdir)
435	cp modulecmd.tcl $(DESTDIR)$(libexecdir)/
436	chmod +x $(DESTDIR)$(libexecdir)/modulecmd.tcl
437ifeq ($(compatversion),y)
438	cp $(COMPAT_DIR)/modulecmd$(EXEEXT) $(DESTDIR)$(libexecdir)/modulecmd-compat$(EXEEXT)
439	chmod +x $(DESTDIR)$(libexecdir)/modulecmd-compat$(EXEEXT)
440endif
441ifeq ($(libtclenvmodules),y)
442	mkdir -p $(DESTDIR)$(libdir)
443	cp lib/libtclenvmodules$(SHLIB_SUFFIX) $(DESTDIR)$(libdir)/libtclenvmodules$(SHLIB_SUFFIX)
444	chmod +x $(DESTDIR)$(libdir)/libtclenvmodules$(SHLIB_SUFFIX)
445endif
446	cp script/envml $(DESTDIR)$(bindir)/
447	chmod +x $(DESTDIR)$(bindir)/envml
448	cp script/add.modules $(DESTDIR)$(bindir)/
449	chmod +x $(DESTDIR)$(bindir)/add.modules
450	cp script/createmodule.py $(DESTDIR)$(bindir)/
451	chmod +x $(DESTDIR)$(bindir)/createmodule.py
452	cp script/modulecmd $(DESTDIR)$(bindir)/
453	chmod +x $(DESTDIR)$(bindir)/modulecmd
454	cp script/mkroot $(DESTDIR)$(bindir)/
455	chmod +x $(DESTDIR)$(bindir)/mkroot
456ifeq ($(windowssupport),y)
457	cp script/module.cmd $(DESTDIR)$(bindir)/
458	chmod +x $(DESTDIR)$(bindir)/module.cmd
459	cp script/ml.cmd $(DESTDIR)$(bindir)/
460	chmod +x $(DESTDIR)$(bindir)/ml.cmd
461	cp script/envml.cmd $(DESTDIR)$(bindir)/
462	chmod +x $(DESTDIR)$(bindir)/envml.cmd
463endif
464ifneq ($(wildcard $(DESTDIR)$(etcdir)/siteconfig.tcl),$(DESTDIR)$(etcdir)/siteconfig.tcl)
465	cp siteconfig.tcl $(DESTDIR)$(etcdir)/siteconfig.tcl
466endif
467ifeq ($(docinstall),y)
468	mkdir -p $(DESTDIR)$(docdir)
469	cp COPYING.GPLv2 $(DESTDIR)$(docdir)/
470	cp ChangeLog $(DESTDIR)$(docdir)/
471	cp README $(DESTDIR)$(docdir)/
472ifeq ($(compatversion),y)
473	cp $(COMPAT_DIR)/ChangeLog $(DESTDIR)$(docdir)/ChangeLog-compat
474	cp $(COMPAT_DIR)/NEWS $(DESTDIR)$(docdir)/NEWS-compat
475endif
476endif
477ifeq ($(vimaddons),y)
478	mkdir -p $(DESTDIR)$(vimdatadir)/ftdetect
479	mkdir -p $(DESTDIR)$(vimdatadir)/ftplugin
480	mkdir -p $(DESTDIR)$(vimdatadir)/syntax
481	cp  contrib/vim/ftdetect/modulefile.vim  $(DESTDIR)$(vimdatadir)/ftdetect
482	cp  contrib/vim/ftplugin/modulefile.vim  $(DESTDIR)$(vimdatadir)/ftplugin
483	cp  contrib/vim/syntax/modulefile.vim    $(DESTDIR)$(vimdatadir)/syntax
484endif
485	$(MAKE) -C init install DESTDIR=$(DESTDIR)
486ifneq ($(builddoc),n)
487	$(MAKE) -C doc install DESTDIR=$(DESTDIR)
488else
489	@echo
490	@echo "WARNING: Documentation not built nor installed" >&2
491endif
492	@echo
493	@echo "NOTICE: Modules installation is complete." >&2
494	@echo "        Please read the 'Configuration' section in INSTALL guide to learn" >&2
495	@echo "        how to adapt your installation and make it fit your needs." >&2
496	@echo
497
498uninstall:
499	rm -f $(DESTDIR)$(libexecdir)/modulecmd.tcl
500ifeq ($(compatversion),y)
501	rm -f $(DESTDIR)$(libexecdir)/modulecmd-compat$(EXEEXT)
502endif
503ifeq ($(libtclenvmodules),y)
504	rm -f $(DESTDIR)$(libdir)/libtclenvmodules$(SHLIB_SUFFIX)
505endif
506	rm -f $(DESTDIR)$(bindir)/envml
507	rm -f $(DESTDIR)$(bindir)/add.modules
508	rm -f $(DESTDIR)$(bindir)/createmodule.py
509	rm -f $(DESTDIR)$(bindir)/modulecmd
510	rm -f $(DESTDIR)$(bindir)/mkroot
511ifeq ($(windowssupport),y)
512	rm -f $(DESTDIR)$(bindir)/module.cmd
513	rm -f $(DESTDIR)$(bindir)/ml.cmd
514	rm -f $(DESTDIR)$(bindir)/envml.cmd
515endif
516ifeq ($(vimaddons),y)
517	rm -f $(DESTDIR)$(vimdatadir)/ftdetect/modulefile.vim
518	rm -f $(DESTDIR)$(vimdatadir)/ftplugin/modulefile.vim
519	rm -f $(DESTDIR)$(vimdatadir)/syntax/modulefile.vim
520	-rmdir $(DESTDIR)$(vimdatadir)/ftdetect
521	-rmdir $(DESTDIR)$(vimdatadir)/ftplugin
522	-rmdir $(DESTDIR)$(vimdatadir)/syntax
523	-rmdir -p $(DESTDIR)$(vimdatadir)
524endif
525ifeq ($(docinstall),y)
526	rm -f $(addprefix $(DESTDIR)$(docdir)/,ChangeLog README COPYING.GPLv2)
527ifeq ($(compatversion),y)
528	rm -f $(addprefix $(DESTDIR)$(docdir)/,ChangeLog-compat NEWS-compat)
529endif
530ifeq ($(builddoc),n)
531	rmdir $(DESTDIR)$(docdir)
532endif
533endif
534	$(MAKE) -C init uninstall DESTDIR=$(DESTDIR)
535ifneq ($(builddoc),n)
536	$(MAKE) -C doc uninstall DESTDIR=$(DESTDIR)
537endif
538	rmdir $(DESTDIR)$(libexecdir)
539ifeq ($(libtclenvmodules),y)
540	rmdir $(DESTDIR)$(libdir)
541endif
542	rmdir $(DESTDIR)$(bindir)
543	rmdir $(DESTDIR)$(datarootdir)
544	$(RMDIR_IGN_NON_EMPTY) $(DESTDIR)$(prefix) || true
545
546# include pre-generated documents not to require documentation build
547# tools when installing from dist tarball
548dist-tar: ChangeLog contrib/rpm/environment-modules.spec pkgdoc
549	git archive --prefix=$(DIST_PREFIX)/ --worktree-attributes \
550		-o $(DIST_PREFIX).tar HEAD
551	tar -rf $(DIST_PREFIX).tar --transform 's,^,$(DIST_PREFIX)/,' \
552		lib/configure lib/config.h.in ChangeLog doc/build/MIGRATING.txt \
553		doc/build/diff_v3_v4.txt doc/build/INSTALL.txt doc/build/INSTALL-win.txt \
554		doc/build/NEWS.txt doc/build/CONTRIBUTING.txt doc/build/module.1.in \
555		doc/build/ml.1 doc/build/modulefile.4 contrib/rpm/environment-modules.spec
556ifeq ($(compatversion) $(wildcard $(COMPAT_DIR)),y $(COMPAT_DIR))
557	$(MAKE) -C $(COMPAT_DIR) distdir
558	mv $(COMPAT_DIR)/modules-* compatdist
559	tar -cf compatdist.tar --transform 's,^compatdist,$(DIST_PREFIX)/compat,' compatdist
560	tar --concatenate -f $(DIST_PREFIX).tar compatdist.tar
561	rm -rf compatdist
562	rm compatdist.tar
563endif
564
565dist-gzip: dist-tar
566	gzip -f -9 $(DIST_PREFIX).tar
567
568dist-bzip2: dist-tar
569	bzip2 -f $(DIST_PREFIX).tar
570
571dist: dist-gzip
572
573# dist zip ball for Windows platform with all pre-generated relevant files
574dist-win: modulecmd.tcl ChangeLog README pkgdoc
575	mkdir $(DIST_WIN_PREFIX)
576	mkdir $(DIST_WIN_PREFIX)/libexec
577	cp modulecmd.tcl $(DIST_WIN_PREFIX)/libexec/
578	mkdir $(DIST_WIN_PREFIX)/bin
579	cp script/module.cmd $(DIST_WIN_PREFIX)/bin/
580	cp script/ml.cmd $(DIST_WIN_PREFIX)/bin/
581	cp script/envml.cmd $(DIST_WIN_PREFIX)/bin/
582	mkdir $(DIST_WIN_PREFIX)/doc
583	cp COPYING.GPLv2 $(DIST_WIN_PREFIX)/doc/
584	cp ChangeLog $(DIST_WIN_PREFIX)/doc/
585	cp README $(DIST_WIN_PREFIX)/doc/
586	cp doc/build/MIGRATING.txt $(DIST_WIN_PREFIX)/doc/
587	cp doc/build/INSTALL-win.txt $(DIST_WIN_PREFIX)/doc/
588	cp doc/build/NEWS.txt $(DIST_WIN_PREFIX)/doc/
589	cp doc/build/CONTRIBUTING.txt $(DIST_WIN_PREFIX)/doc/
590	cp doc/build/module.txt $(DIST_WIN_PREFIX)/doc/
591	cp doc/build/modulefile.txt $(DIST_WIN_PREFIX)/doc/
592	$(MAKE) -C init dist-win DIST_WIN_PREFIX=../$(DIST_WIN_PREFIX)
593	cp script/INSTALL.bat $(DIST_WIN_PREFIX)/
594	cp script/UNINSTALL.bat $(DIST_WIN_PREFIX)/
595	cp script/TESTINSTALL.bat $(DIST_WIN_PREFIX)/
596	zip -r $(DIST_WIN_PREFIX).zip $(DIST_WIN_PREFIX)
597	rm -rf $(DIST_WIN_PREFIX)
598
599# srpm and rpm can only be built with compat sources included
600srpm: dist-bzip2
601ifeq ($(compatversion),n)
602	$(error Compatibility version sources are missing, please run './configure\
603		--enable-compat-version')
604endif
605	rpmbuild -ts $(DIST_PREFIX).tar.bz2
606
607rpm: dist-bzip2
608ifeq ($(compatversion),n)
609	$(error Compatibility version sources are missing, please run './configure\
610		--enable-compat-version')
611endif
612	rpmbuild -tb $(DIST_PREFIX).tar.bz2
613
614clean:
615	rm -f *.log *.sum
616	rm -f $(MODULECMDTEST)_i $(MODULECMDTEST)_log $(MODULECMDTEST)_m
617	rm -rf coverage
618# do not clean generated docs if not in git repository
619ifeq ($(wildcard .git),.git)
620	rm -f ChangeLog
621endif
622	rm -f README
623	rm -f modulecmd.tcl
624	rm -f $(MODULECMDTEST)
625	rm -f script/add.modules
626	rm -f script/createmodule.py
627	rm -f script/gitlog2changelog.py
628	rm -f script/modulecmd
629	rm -f testsuite/example/.modulespath testsuite/example/modulerc testsuite/example/modulerc-1 testsuite/example/initrc
630	rm -f modules-*.tar modules-*.tar.gz modules-*.tar.bz2
631	rm -rf modules-*-win/
632	rm -f modules-*-win.zip
633	rm -f environment-modules-*.srpm environment-modules-*.rpm
634	$(MAKE) -C init clean
635ifneq ($(builddoc),n)
636	$(MAKE) -C doc clean
637endif
638	rm -f version.inc
639	rm -f contrib/rpm/environment-modules.spec
640ifneq ($(wildcard $(COMPAT_DIR)/Makefile),)
641	$(MAKE) -C $(COMPAT_DIR) clean
642endif
643ifneq ($(wildcard lib/Makefile),)
644	$(MAKE) -C lib clean
645endif
646
647distclean: clean
648	rm -f Makefile.inc
649	rm -f site.exp
650	rm -f icdiff .noicdiff
651	rm -rf $(NAGELFAR_RELEASE)
652	rm -rf $(TCL_RELEASE83)
653	rm -f tclsh83
654ifeq ($(wildcard .git) $(wildcard $(COMPAT_DIR)),.git $(COMPAT_DIR))
655	rm -rf $(COMPAT_DIR)
656ifeq ($(gitworktree),y)
657	git worktree prune
658endif
659endif
660ifneq ($(wildcard lib/Makefile),)
661	$(MAKE) -C lib distclean
662endif
663
664# prepare for code coverage run
665ifeq ($(COVERAGE),y)
666$(MODULECMDTEST): $(NAGELFAR)
667endif
668
669# make specific modulecmd script for test to check built extension lib
670# if coverage asked, instrument script and clear previous coverage log
671$(MODULECMDTEST): modulecmd.tcl
672ifeq ($(multilibsupport),y)
673	sed -e 's|$(libdir64)|lib|' -e 's|$(libdir32)|lib|' $< > $@
674else
675	sed -e 's|$(libdir)|lib|' $< > $@
676endif
677ifeq ($(COVERAGE),y)
678	rm -f $(MODULECMDTEST)_log
679	$(NAGELFAR) -instrument $@
680endif
681
682# if coverage enabled, run tests on instrumented file to create coverage log
683ifeq ($(COVERAGE),y)
684export MODULECMD = $(MODULECMDTEST)_i
685endif
686
687# specific target to build test dependencies
688test-deps: $(TEST_PREREQ)
689
690# if coverage enabled create markup file for better read coverage result
691test: $(TEST_PREREQ)
692ifeq ($(compatversion) $(wildcard $(COMPAT_DIR)),y $(COMPAT_DIR))
693	$(MAKE) -C $(COMPAT_DIR) test
694endif
695	TCLSH=$(TCLSH); export TCLSH; \
696	OBJDIR=`pwd -P`; export OBJDIR; \
697	TESTSUITEDIR=`cd testsuite;pwd -P`; export TESTSUITEDIR; \
698	runtest --srcdir $$TESTSUITEDIR --objdir $$OBJDIR $(RUNTESTFLAGS) --tool modules $(RUNTESTFILES)
699ifeq ($(COVERAGE),y)
700	$(NAGELFAR) -markup $(MODULECMDTEST)
701endif
702
703testinstall:
704	OBJDIR=`pwd -P`; export OBJDIR; \
705	TESTSUITEDIR=`cd testsuite;pwd -P`; export TESTSUITEDIR; \
706	runtest --srcdir $$TESTSUITEDIR --objdir $$OBJDIR $(RUNTESTFLAGS) --tool install $(RUNTESTFILES)
707
708
709# install enhanced diff tool (to review test results)
710icdiff:
711	$(WGET) $(ICDIFF_DLSRC)$@ || true
712	echo "$(ICDIFF_CHECKSUM)  $@" | md5sum --status -c - || \
713		md5 -c $(ICDIFF_CHECKSUM) $@
714	chmod +x $@
715
716# install old Tcl interpreter (for code coverage purpose)
717tclsh83:
718	$(WGET) $(TCL_DLSRC)$(TCL_DIST83) || true
719	echo "$(TCL_DISTSUM83)  $(TCL_DIST83)" | md5sum --status -c - || \
720		md5 -c $(TCL_DISTSUM83) $@ || (rm -f $(TCL_DIST83) && false)
721	tar xzf $(TCL_DIST83)
722	cd $(TCL_RELEASE83)/unix && bash configure --disable-shared && make
723	echo '#!/bin/bash' >$@
724	echo 'exec $(TCLSH83) $${@}' >>$@
725	chmod +x $@
726	rm $(TCL_DIST83)
727
728# install code coverage tool
729# download from alt. source if correct tarball not retrieved from primary location
730$(NAGELFAR):
731	$(WGET) $(NAGELFAR_DLSRC1)$(NAGELFAR_DIST) || true
732	echo "$(NAGELFAR_DISTSUM)  $(NAGELFAR_DIST)" | md5sum --status -c - || \
733		(rm -f $(NAGELFAR_DIST) && false)
734	tar xzf $(NAGELFAR_DIST)
735	rm $(NAGELFAR_DIST)
736
737testsyntax: $(MODULECMDTEST) $(NAGELFAR)
738	$(NAGELFAR) -len 78 $<
739