58 lines
1.7 KiB
Bash
Executable File
58 lines
1.7 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -euo pipefail
|
|
|
|
MAKE=$1 # make tool
|
|
MAKEFILE=$2 # root makefile
|
|
ROOT_TARGETS_ONLY=${3:-false} # print root Makefile targets only
|
|
|
|
# Get number of available colors
|
|
COLORS_NUM=$(tput colors)
|
|
# Then check if it's a terminal and we have enough colors
|
|
if [ -t 1 ] && [ -n "$COLORS_NUM" ] && [ "$COLORS_NUM" -ge 4 ]; then
|
|
RESET="$(tput sgr0)"
|
|
RED="$(tput setaf 1)"
|
|
GREEN="$(tput setaf 2)"
|
|
BLUE="$(tput setaf 4)"
|
|
|
|
else
|
|
RESET=
|
|
RED=
|
|
GREEN=
|
|
fi
|
|
|
|
# See https://stackoverflow.com/a/26339924 for different approaches.
|
|
|
|
# Here ":" is a non-existing target, -q doesn't run anything.
|
|
MAKE_DB=$(LC_ALL=C $MAKE \
|
|
--print-data-base \
|
|
--no-builtin-rules \
|
|
--no-builtin-variables \
|
|
-q \
|
|
--makefile="$MAKEFILE" \
|
|
: 2>/dev/null || true)
|
|
|
|
|
|
echo "Detailed platform usage description: ${BLUE}https://git.mws-team.ru/mws/devp/platform-go/-/blob/master/README.md${RESET}"
|
|
|
|
echo "${RED}Makefile targets:${RESET}"
|
|
|
|
# -v RS= splits MAKE_DB into "paragraphs" separated with "\n\n+"
|
|
# -F: splits into ":"-separated fields, we use only the first field $1
|
|
# -v FILTER="$ROOT_TARGETS_ONLY" if 'true' - filters out just root Makefile targets
|
|
# /^[A-Za-z]/ filters out "# Not a target:" and internal targets like .DEFAULT
|
|
# match+substr extracts help string which is a command that is a comment - "@# ...".
|
|
# (Because MAKE_DB doesn't preserve Makefile comments)
|
|
|
|
echo "$MAKE_DB" | awk \
|
|
-v RS= \
|
|
-F: \
|
|
-v GREEN=$GREEN -v RESET=$RESET \
|
|
-v FILTER="$ROOT_TARGETS_ONLY" \
|
|
'/^[A-Za-z]/ {
|
|
if (FILTER == "true" && $0 !~ /from `Makefile/) next;
|
|
match($0, /@#[^\n]*/);
|
|
HELP_STR=substr($0, RSTART+1, RLENGTH-1);
|
|
printf("%s:%s%s%s\n", $1, GREEN, HELP_STR, RESET);
|
|
}' | sort | column -s ':' -t
|