learning_go/rbd_exporter/scripts/devp/list-targets.sh
2025-12-23 06:40:56 +03:00

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