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
|
# helper AWK script for GNU make -*- awk -*-
# This AWK script is used by the function `_comp_cmd_make__extract_targets` in
# `completions/make`. This script receives the output of `make -npq' as the
# input file or stdin and outputs the list of targets matching the prefix.
#
# @env prefix Specifies the prefix to match.
# @env prefix_replace Specifies the string that replaces the prefix in the
# output. This is used when we want to omit the directory name in showing
# the list of the completions.
#
BEGIN {
prefix = ENVIRON["prefix"];
prefix_replace = ENVIRON["prefix_replace"];
is_target_block = 0;
target = "";
}
function starts_with(str, prefix) {
return substr(str, 1, length(prefix)) == prefix;
}
# skip any makefile outputs
NR == 1, /^# +Make data base/ { next; }
/^# +Finished Make data base/,/^# +Make data base/ { next; }
# skip until files section
/^# +Variables/, /^# +Files/ { next; }
# skip not-target blocks
/^# +Not a target/, /^$/ { next; }
# The stuff above here describes lines that are not
# explicit targets or not targets other than special ones
# The stuff below here decides whether an explicit target
# should be output.
# only process the targets the user wants.
starts_with($0, prefix) { is_target_block = 1; }
is_target_block == 0 { next; }
/^# +File is an intermediate prerequisite/ { # cancel the block
is_target_block = 0;
target = "";
next;
}
# end of target block
/^$/ {
is_target_block = 0;
if (target != "") {
print target;
target = "";
}
next;
}
# found target block
/^[^#\t:%]+:/ {
# special targets
if (/^\.PHONY:/ ) next;
if (/^\.SUFFIXES:/ ) next;
if (/^\.DEFAULT:/ ) next;
if (/^\.PRECIOUS:/ ) next;
if (/^\.INTERMEDIATE:/ ) next;
if (/^\.SECONDARY:/ ) next;
if (/^\.SECONDEXPANSION:/ ) next;
if (/^\.DELETE_ON_ERROR:/ ) next;
if (/^\.IGNORE:/ ) next;
if (/^\.LOW_RESOLUTION_TIME:/ ) next;
if (/^\.SILENT:/ ) next;
if (/^\.EXPORT_ALL_VARIABLES:/) next;
if (/^\.NOTPARALLEL:/ ) next;
if (/^\.ONESHELL:/ ) next;
if (/^\.POSIX:/ ) next;
if (/^\.NOEXPORT:/ ) next;
if (/^\.MAKE:/ ) next;
# dont complete with hidden targets unless we are doing a partial completion
if (prefix == "" || prefix ~ /\/$/)
if (substr($0, length(prefix) + 1, 1) ~ /[^a-zA-Z0-9]/)
next;
target = $0;
sub(/:.*/, "", target);
if (prefix_replace != prefix)
target = prefix_replace substr(target, 1 + length(prefix));
next;
}
# ex: filetype=awk
|