mirror of
https://github.com/envmodules/modules.git
synced 2026-06-14 00:42:43 +08:00
Add the --with-fishcompletiondir option to the configure installation script to define a particular installation directory for the fish completion script. If option is not defined, fish completion script is installed by default in initdir and it is sourced in fish init script. If option is set, completion script is installed in designated directory and fish init script does not source it.
365 lines
13 KiB
Makefile
365 lines
13 KiB
Makefile
.PHONY: dist-win install install-testconfig uninstall-testconfig uninstall \
|
|
clean
|
|
|
|
# use bash shell to correctly expand the $'' syntax used in translate-in-script
|
|
SHELL = /usr/bin/env bash
|
|
|
|
SH_LIKE = sh ksh bash zsh profile.sh
|
|
CSH_LIKE = csh tcsh tcsh_completion profile.csh
|
|
OTHER = perl.pm python.py ruby.rb lisp tcl fish cmake r.R
|
|
|
|
# example modulefiles to install
|
|
EXAMPLE_MODFILES_SRCDIR := ../contrib/modulefiles
|
|
EXAMPLE_MODFILES = dot module-git module-info modules null use.own
|
|
EXAMPLE_WIN_MODFILES = module-git module-info null
|
|
EXAMPLE_TESTCONFIG_MODFILES = null
|
|
|
|
# source definitions shared across the Makefiles of this project
|
|
ifneq ($(wildcard ../Makefile.inc),../Makefile.inc)
|
|
$(error ../Makefile.inc is missing, please run '../configure')
|
|
endif
|
|
include ../Makefile.inc
|
|
|
|
# generate 'module use' commands to put in initrc from modulepath unless
|
|
# if the modulespath config file should be deployed
|
|
ifeq ($(setmodulespath),n)
|
|
modulerc := \\\n\# enable default modulepaths
|
|
modulerc := $(modulerc)$(addprefix \\\nmodule use --append {,$(subst :,} ,$(modulepath)}))
|
|
endif
|
|
# generate 'module load' commands to put in initrc from loadedmodules
|
|
ifneq ($(loadedmodules),)
|
|
modulerc := $(modulerc)$(addprefix \\\nmodule load ,\
|
|
$(subst :, ,$(loadedmodules)))
|
|
endif
|
|
ifneq ($(modulerc),)
|
|
modulerc := $(modulerc)\\\n
|
|
endif
|
|
|
|
# setup summary echo rules unless silent mode set
|
|
ECHO_DIR_PREFIX = init/
|
|
ifneq ($(findstring s,$(MAKEFLAGS)),s)
|
|
ECHO_GEN = @echo ' ' GEN $(ECHO_DIR_PREFIX)$@;
|
|
endif
|
|
|
|
ALL_SHELLS = $(SH_LIKE) $(CSH_LIKE) $(OTHER)
|
|
|
|
all: $(ALL_SHELLS) initrc bash_completion zsh-functions/_module $(EXAMPLE_MODFILES_SRCDIR)/modules
|
|
ifeq ($(versioning),y)
|
|
all: $(EXAMPLE_MODFILES_SRCDIR)/version
|
|
endif
|
|
ifeq ($(setmodulespath),y)
|
|
# both configuration files will be installed and in this case default init
|
|
# scripts will use both files, modulespath evaluated prior initrc. In this
|
|
# case the modulespaths sets are only generated in modulespath config file.
|
|
all: modulespath
|
|
endif
|
|
|
|
../version.inc:
|
|
$(MAKE) --no-print-directory -C .. version.inc
|
|
|
|
# source version definitions shared across the Makefiles of this project
|
|
ifeq ($(findstring clean,$(MAKECMDGOALS)),)
|
|
-include ../version.inc
|
|
endif
|
|
|
|
# define init configs location
|
|
ifeq ($(initconfin),etcdir)
|
|
modulespath := $(etcdir)/modulespath
|
|
initrc := $(etcdir)/initrc
|
|
else
|
|
modulespath := $(initdir)/.modulespath
|
|
initrc := $(initdir)/modulerc
|
|
endif
|
|
|
|
# define shell completion location
|
|
ifeq ($(bashcompletiondir),)
|
|
bashcompletiondir := $(initdir)
|
|
makebashcompdir := n
|
|
sourcebashcompre := s|@sourcebashcomp@||g
|
|
else
|
|
makebashcompdir := y
|
|
sourcebashcompre := /@sourcebashcomp@/d
|
|
endif
|
|
ifeq ($(fishcompletiondir),)
|
|
fishcompletiondir := $(initdir)
|
|
makefishcompdir := n
|
|
sourcefishcompre := s|@sourcefishcomp@||g
|
|
else
|
|
makefishcompdir := y
|
|
sourcefishcompre := /@sourcefishcomp@/d
|
|
endif
|
|
ifeq ($(zshcompletiondir),)
|
|
zshcompletiondir := $(initdir)/zsh-functions
|
|
setzshfpathre := s|@setzshfpath@||g
|
|
else
|
|
setzshfpathre := /@setzshfpath@/d
|
|
endif
|
|
|
|
# if enabled translate to keep text after markup elsewhere remove the
|
|
# entire line
|
|
ifeq ($(setmanpath),y)
|
|
setmanpathre := s|@setmanpath@||g
|
|
else
|
|
setmanpathre := /@setmanpath@/d
|
|
endif
|
|
ifeq ($(appendmanpath),y)
|
|
appendmanpathre := s|@appendmanpath@||g
|
|
prependmanpathre := /@prependmanpath@/d
|
|
else
|
|
appendmanpathre := /@appendmanpath@/d
|
|
prependmanpathre := s|@prependmanpath@||g
|
|
endif
|
|
ifeq ($(setbinpath),y)
|
|
setbinpathre := s|@setbinpath@||g
|
|
else
|
|
setbinpathre := /@setbinpath@/d
|
|
endif
|
|
ifeq ($(appendbinpath),y)
|
|
appendbinpathre := s|@appendbinpath@||g
|
|
prependbinpathre := /@prependbinpath@/d
|
|
else
|
|
appendbinpathre := /@appendbinpath@/d
|
|
prependbinpathre := s|@prependbinpath@||g
|
|
endif
|
|
ifeq ($(usemanpath),y)
|
|
usemanpathre := s|@usemanpath@||g
|
|
notusemanpathre := /@notusemanpath@/d
|
|
else
|
|
usemanpathre := /@usemanpath@/d
|
|
notusemanpathre := s|@notusemanpath@||g
|
|
endif
|
|
|
|
# comment entries if feature not enabled
|
|
ifeq ($(versioning),y)
|
|
versdir := $(baseprefix)/versions
|
|
setversioning :=
|
|
else
|
|
setversioning := \#
|
|
endif
|
|
|
|
# define translation rules for quarantine mechanism
|
|
ifeq ($(quarantinevars),)
|
|
setquarvarsre := /@setquarvars@/d
|
|
notsetquarvarsre := s|@notsetquarvars@||g
|
|
else
|
|
setquarvarsre := s|@setquarvars@||g
|
|
notsetquarvarsre := /@notsetquarvars@/d
|
|
define runenvvarre
|
|
$(if $(filter-out ${1},${2}),s|\(@\(.*\)RUNENV_VAR\(.*\)RUNENV_VAL\(.*\)@\)|\2MODULES_RUNENV_${1}\3${2}\4\n\1|g;)
|
|
endef
|
|
quarvarsre = -e 's|@RUN_QUARANTINE@|$(foreach vv,$(quarantinevars),$(firstword\
|
|
$(subst =, ,$(vv))))|g;
|
|
quarvarsre += $(foreach vv,$(quarantinevars),$(call runenvvarre,$(firstword\
|
|
$(subst =, ,$(vv))),$(subst $(firstword $(subst =, ,$(vv)))=,,$(vv))))
|
|
quarvarsre += s/@.*RUNENV_VAR.*@//;'
|
|
endif
|
|
|
|
# define variables for shell completion
|
|
comp_cmds := add apropos aliases avail append-path clear config del display edit help initadd initclear initlist initprepend initrm is-loaded is-saved is-used is-avail info-loaded keyword list load path paths purge prepend-path refresh reload restore rm remove remove-path save savelist saveshow saverm search show sh-to-mod source state swap switch test try-add try-load unload unuse use whatis
|
|
comp_opts := -D -h -s -T -v -V -w --debug --help --silent --trace --verbose --version --paginate --no-pager --color --color= --width --width=
|
|
comp_load_opts := --auto --no-auto --force -f --icase -i
|
|
comp_list_opts := -a -j -l -o -t --all --json --long --output --output= --terse
|
|
comp_clear_opts := --force -f
|
|
comp_avail_opts := -a -C -d -i -j -L -l -o -S -t --all --contains --default --icase --json --latest --long --output --output= --starts-with --terse --indepth --no-indepth
|
|
comp_mfile_opts := -i --icase
|
|
comp_whatis_opts := -a -i -j --all --icase --json
|
|
comp_search_opts := -a -j --all --json
|
|
comp_aliases_opts := -a --all
|
|
comp_isavail_opts := -a -i --all --icase
|
|
comp_path_opts := -d --delim --duplicates
|
|
comp_rm_path_opts := -d --delim --index
|
|
comp_config_opts := --dump-state --reset advanced_version_spec auto_handling avail_indepth avail_output avail_terse_output collection_pin_version collection_target color colors contact editor extended_default extra_siteconfig home icase implicit_default implicit_requirement list_output list_terse_output locked_configs mcookie_version_check ml nearly_forbidden_days pager quarantine_support rcfile redirect_output run_quarantine search_match set_shell_startup shells_with_ksh_fpath silent_shell_debug tag_abbrev tag_color_name term_background term_width unload_match_order variant_shortcut verbosity wa_277
|
|
|
|
define translate-in-script
|
|
$(ECHO_GEN)
|
|
sed -e 's|@prefix@|$(prefix)|g' \
|
|
-e 's|@baseprefix@|$(baseprefix)|g' \
|
|
-e 's|@libexecdir@|$(libexecdir)|g' \
|
|
-e 's|@initdir@|$(initdir)|g' \
|
|
-e 's|@etcdir@|$(etcdir)|g' \
|
|
-e 's|@modulefilesdir@|$(modulefilesdir)|g' \
|
|
-e 's|@bindir@|$(bindir)|g' \
|
|
-e 's|@mandir@|$(mandir)|g' \
|
|
-e 's|@comp_cmds@|$(comp_cmds)|g' \
|
|
-e 's|@comp_opts@|$(comp_opts)|g' \
|
|
-e 's|@comp_load_opts@|$(comp_load_opts)|g' \
|
|
-e 's|@comp_list_opts@|$(comp_list_opts)|g' \
|
|
-e 's|@comp_clear_opts@|$(comp_clear_opts)|g' \
|
|
-e 's|@comp_avail_opts@|$(comp_avail_opts)|g' \
|
|
-e 's|@comp_mfile_opts@|$(comp_mfile_opts)|g' \
|
|
-e 's|@comp_whatis_opts@|$(comp_whatis_opts)|g' \
|
|
-e 's|@comp_search_opts@|$(comp_search_opts)|g' \
|
|
-e 's|@comp_aliases_opts@|$(comp_aliases_opts)|g' \
|
|
-e 's|@comp_isavail_opts@|$(comp_isavail_opts)|g' \
|
|
-e 's|@comp_path_opts@|$(comp_path_opts)|g' \
|
|
-e 's|@comp_rm_path_opts@|$(comp_rm_path_opts)|g' \
|
|
-e 's|@comp_config_opts@|$(comp_config_opts)|g' \
|
|
-e '$(setmanpathre)' \
|
|
-e '$(appendmanpathre)' \
|
|
-e '$(prependmanpathre)' \
|
|
-e '$(setbinpathre)' \
|
|
-e '$(appendbinpathre)' \
|
|
-e '$(prependbinpathre)' \
|
|
-e '$(usemanpathre)' \
|
|
-e '$(notusemanpathre)' \
|
|
-e '$(setzshfpathre)' \
|
|
-e '$(sourcebashcompre)' \
|
|
-e '$(sourcefishcompre)' \
|
|
-e $$'s|@modulerc@|$(modulerc)|g' \
|
|
-e 's|@modulepath@|$(modulepath)|g' \
|
|
-e '$(setquarvarsre)' $(quarvarsre) \
|
|
-e '$(notsetquarvarsre)' \
|
|
-e 's|@SHELLNAME@|$@|g' \
|
|
-e 's|@VERSIONING@|$(setversioning)|g' \
|
|
-e 's|@VERSION@|$(VERSION)|g' \
|
|
-e 's|@SED_ERE@|$(SED_ERE)|g' \
|
|
-e 's|@PS@|$(PS)|g' \
|
|
-e 's|@BASENAME@|$(BASENAME)|g' \
|
|
-e 's|@TCLSH@|$(TCLSH)|g' $< > $@
|
|
endef
|
|
|
|
# avoid shared definitions to be rebuilt by make
|
|
../Makefile.inc: ;
|
|
|
|
%: %.in
|
|
$(translate-in-script)
|
|
|
|
# workaround '\\\n' issue on Linux with Make 3.81
|
|
initrc: initrc.in
|
|
$(translate-in-script)
|
|
mv $@ ${@}.tmp
|
|
sed -e 's|\\$$||' ${@}.tmp > $@
|
|
rm -f ${@}.tmp
|
|
|
|
# tcsh is derivated from csh init script
|
|
tcsh: csh.in
|
|
$(translate-in-script)
|
|
|
|
# this rule is needed for profile.sh to get matched
|
|
profile.sh: profile.sh.in
|
|
$(translate-in-script)
|
|
|
|
$(EXAMPLE_MODFILES_SRCDIR)/modules: $(EXAMPLE_MODFILES_SRCDIR)/modules.in ../version.inc
|
|
$(translate-in-script)
|
|
|
|
$(EXAMPLE_MODFILES_SRCDIR)/version: $(EXAMPLE_MODFILES_SRCDIR)/version.in ../version.inc
|
|
$(translate-in-script)
|
|
|
|
dist-win:
|
|
mkdir $(DIST_WIN_PREFIX)/init
|
|
cp cmd.cmd $(DIST_WIN_PREFIX)/init/
|
|
mkdir $(DIST_WIN_PREFIX)/modulefiles
|
|
cp $(addprefix $(EXAMPLE_MODFILES_SRCDIR)/,$(EXAMPLE_WIN_MODFILES)) $(DIST_WIN_PREFIX)/modulefiles/
|
|
|
|
# example configs for test rules
|
|
install-testconfig:
|
|
mkdir -p $(DESTDIR)$(initdir)
|
|
mkdir -p $(DESTDIR)$(etcdir)
|
|
mkdir -p $(DESTDIR)$(prefix)/etc
|
|
mkdir -p $(DESTDIR)$(modulefilesdir)
|
|
mkdir -p $(DESTDIR)$(prefix)/test/modulefiles $(DESTDIR)$(prefix)/test/etc
|
|
cp $(addprefix $(EXAMPLE_MODFILES_SRCDIR)/,$(EXAMPLE_TESTCONFIG_MODFILES)) $(DESTDIR)$(modulefilesdir)/
|
|
|
|
uninstall-testconfig:
|
|
rmdir $(DESTDIR)$(prefix)/test/modulefiles $(DESTDIR)$(prefix)/test/etc $(DESTDIR)$(prefix)/test
|
|
rm -f $(addprefix $(DESTDIR)$(modulefilesdir)/,$(EXAMPLE_TESTCONFIG_MODFILES))
|
|
$(RMDIR_IGN_NON_EMPTY) $(DESTDIR)$(modulefilesdir) || true
|
|
$(RMDIR_IGN_NON_EMPTY) $(DESTDIR)$(etcdir) || true
|
|
$(RMDIR_IGN_NON_EMPTY) $(DESTDIR)$(initdir) || true
|
|
|
|
install: all
|
|
mkdir -p $(DESTDIR)$(initdir)
|
|
mkdir -p $(DESTDIR)$(initdir)/ksh-functions
|
|
ifeq ($(makebashcompdir),y)
|
|
mkdir -p $(DESTDIR)$(bashcompletiondir)
|
|
endif
|
|
ifeq ($(makefishcompdir),y)
|
|
mkdir -p $(DESTDIR)$(fishcompletiondir)
|
|
endif
|
|
mkdir -p $(DESTDIR)$(zshcompletiondir)
|
|
mkdir -p $(DESTDIR)$(modulefilesdir)
|
|
cp $(ALL_SHELLS) $(DESTDIR)$(initdir)/
|
|
ifeq ($(windowssupport),y)
|
|
cp cmd.cmd $(DESTDIR)$(initdir)/
|
|
endif
|
|
ifeq ($(makefishcompdir),y)
|
|
cp fish_completion $(DESTDIR)$(fishcompletiondir)/module.fish
|
|
else
|
|
cp fish_completion $(DESTDIR)$(fishcompletiondir)/
|
|
endif
|
|
ifeq ($(makebashcompdir),y)
|
|
cp bash_completion $(DESTDIR)$(bashcompletiondir)/module
|
|
ln -s module $(DESTDIR)$(bashcompletiondir)/ml
|
|
else
|
|
cp bash_completion $(DESTDIR)$(bashcompletiondir)/
|
|
endif
|
|
cp zsh-functions/_module $(DESTDIR)$(zshcompletiondir)/
|
|
cp ksh $(DESTDIR)$(initdir)/ksh-functions/module
|
|
cp ksh $(DESTDIR)$(initdir)/ksh-functions/ml
|
|
rm -f $(DESTDIR)$(modulespath) $(DESTDIR)$(initrc)
|
|
cp -R -P initrc $(DESTDIR)$(initrc)
|
|
ifeq ($(setmodulespath),y)
|
|
cp -R -P modulespath $(DESTDIR)$(modulespath)
|
|
endif
|
|
ifeq ($(examplemodulefiles),y)
|
|
cp $(addprefix $(EXAMPLE_MODFILES_SRCDIR)/,$(EXAMPLE_MODFILES)) $(DESTDIR)$(modulefilesdir)/
|
|
endif
|
|
ifeq ($(versioning),y)
|
|
mkdir -p $(DESTDIR)$(versdir)
|
|
cp $(EXAMPLE_MODFILES_SRCDIR)/version $(DESTDIR)$(versdir)/$(VERSION)
|
|
endif
|
|
|
|
uninstall:
|
|
rm -f $(addprefix $(DESTDIR)$(initdir)/,$(ALL_SHELLS))
|
|
ifeq ($(windowssupport),y)
|
|
rm -f $(DESTDIR)$(initdir)/cmd.cmd
|
|
endif
|
|
rm -f $(DESTDIR)$(initdir)/ksh-functions/module
|
|
rm -f $(DESTDIR)$(initdir)/ksh-functions/ml
|
|
ifeq ($(makebashcompdir),y)
|
|
rm -f $(DESTDIR)$(bashcompletiondir)/ml
|
|
rm -f $(DESTDIR)$(bashcompletiondir)/module
|
|
else
|
|
rm -f $(DESTDIR)$(bashcompletiondir)/bash_completion
|
|
endif
|
|
ifeq ($(makefishcompdir),y)
|
|
rm -f $(DESTDIR)$(fishcompletiondir)/module.fish
|
|
else
|
|
rm -f $(DESTDIR)$(fishcompletiondir)/fish_completion
|
|
endif
|
|
rm -f $(DESTDIR)$(zshcompletiondir)/_module
|
|
rm -f $(DESTDIR)$(modulespath) $(DESTDIR)$(initrc)
|
|
$(RMDIR_IGN_NON_EMPTY) $(DESTDIR)$(modulefilesdir) || true
|
|
@if [ -d $(DESTDIR)$(modulefilesdir) ]; then echo; echo "WARNING: $(DESTDIR)$(modulefilesdir) is not empty so skip removal" >&2; echo; fi
|
|
rmdir $(DESTDIR)$(initdir)/ksh-functions
|
|
ifeq ($(makebashcompdir),y)
|
|
$(RMDIR_IGN_NON_EMPTY) $(DESTDIR)$(bashcompletiondir) || true
|
|
endif
|
|
ifeq ($(makefishcompdir),y)
|
|
$(RMDIR_IGN_NON_EMPTY) $(DESTDIR)$(fishcompletiondir) || true
|
|
endif
|
|
$(RMDIR_IGN_NON_EMPTY) $(DESTDIR)$(zshcompletiondir) || true
|
|
$(RMDIR_IGN_NON_EMPTY) $(DESTDIR)$(initdir) || true
|
|
@if [ -d $(DESTDIR)$(initdir) ]; then echo; echo "WARNING: $(DESTDIR)$(initdir) is not empty so skip removal" >&2; echo; fi
|
|
ifeq ($(versioning),y)
|
|
rm -f $(DESTDIR)$(versdir)/$(VERSION)
|
|
$(RMDIR_IGN_NON_EMPTY) $(DESTDIR)$(versdir) || true
|
|
@if [ -d $(DESTDIR)$(versdir) ]; then echo; echo "WARNING: $(DESTDIR)$(versdir) is not empty so skip removal" >&2; echo; fi
|
|
endif
|
|
|
|
clean:
|
|
rm -f $(ALL_SHELLS) initrc bash_completion zsh-functions/_module modulespath $(EXAMPLE_MODFILES_SRCDIR)/modules
|
|
ifeq ($(versioning),y)
|
|
rm -f $(EXAMPLE_MODFILES_SRCDIR)/version
|
|
endif
|
|
|
|
# quiet all commands unless verbose mode set
|
|
ifeq ($(VERBOSE),1)
|
|
V = 1
|
|
endif
|
|
# let verbose by default the install/clean/test and other specific non-build targets
|
|
$(V).SILENT: ../version.inc sh ksh bash zsh csh tcsh fish perl.pm python.py ruby.rb \
|
|
lisp tcl cmake r.R bash_completion tcsh_completion zsh-functions/_module \
|
|
profile.sh profile.csh modulespath initrc $(EXAMPLE_MODFILES_SRCDIR)/modules \
|
|
$(EXAMPLE_MODFILES_SRCDIR)/version
|