aboutsummaryrefslogtreecommitdiff
path: root/bash/bashrc.d
diff options
context:
space:
mode:
Diffstat (limited to 'bash/bashrc.d')
-rw-r--r--bash/bashrc.d/make.bash37
1 files changed, 37 insertions, 0 deletions
diff --git a/bash/bashrc.d/make.bash b/bash/bashrc.d/make.bash
new file mode 100644
index 00000000..d6f4eafa
--- /dev/null
+++ b/bash/bashrc.d/make.bash
@@ -0,0 +1,37 @@
+# Bail if no make(1)
+if ! hash make 2>/dev/null ; then
+ return
+fi
+
+# Completion setup for Make, completing targets
+#
+# Note that because of the
+_make() {
+ local word=${COMP_WORDS[COMP_CWORD]}
+
+ # Quietly bail if no legible Makefile
+ if [[ ! -r Makefile ]] ; then
+ return 1
+ fi
+
+ # Build a list of targets by parsing the Makefile
+ local -a targets tokens
+ local target line
+ while read -r line ; do
+ if [[ $line == *:* ]] ; then
+ target=$line
+ target=${target%%:*}
+ target=${target% }
+ if [[ $target != *[^[:alnum:][:space:]_-]* ]] ; then
+ IFS=' ' read -a tokens \
+ < <(printf '%s\n' "$target")
+ targets=("${targets[@]}" "${tokens[@]}")
+ fi
+ fi
+ done < Makefile
+
+ # Complete with matching targets
+ COMPREPLY=( $(compgen -W "${targets[*]}" -- "$word") )
+}
+complete -F _make -o default make
+