Skip to content

Commit

Permalink
Simplify Makefile help target
Browse files Browse the repository at this point in the history
An in-line Python script, while flexible, is arguably
more complex and less stable than the long-lived `grep`,
`awk`, and `printf`.  Make use of these simple tools
to display a column-aligned table of target and description
help output.

Also, the first target that appears in a Makefile is considered
the default (when no target is specified on the command-line).
However, despite it's name, the `default` target was not listed
first.  Fix this, and redefine "default" target to "all" as
intended, instead of "help".

Lastly, add a small workaround for a vim syntax-hilighting bug.

Signed-off-by: Chris Evich <[email protected]>
  • Loading branch information
cevich committed Apr 12, 2021
1 parent 5a703bb commit 0e83851
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 30 deletions.
43 changes: 18 additions & 25 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -118,38 +118,29 @@ CROSS_BUILD_TARGETS := \
bin/podman.cross.linux.mips64 \
bin/podman.cross.linux.mips64le

.PHONY: default
default: all

.PHONY: all
all: binaries docs

.PHONY: default
default: help

define PRINT_HELP_PYSCRIPT
import re, sys

print("Usage: make <target>")
cmds = {}
for line in sys.stdin:
match = re.match(r'^([a-zA-Z_-]+):.*?## (.*)$$', line)
if match:
target, help = match.groups()
cmds.update({target: help})
for cmd in sorted(cmds):
print(" * '%s' - %s" % (cmd, cmds[cmd]))
endef
export PRINT_HELP_PYSCRIPT

# Dereference variable $(1), return value if non-empty, otherwise raise an error.
err_if_empty = $(if $(strip $($(1))),$(strip $($(1))),$(error Required variable $(1) value is undefined, whitespace, or empty))

# Extract text following double-# for targets, as their description for
# the `help` target. Otherwise These simple-substitutions are resolved
# at reference-time (due to `=` and not `=:`).
_HLP_TGTS_RX = '^[[:print:]]+:.*?\#\# .*$$'
_HLP_TGTS_CMD = grep -E $(_HLP_TGTS_RX) $(MAKEFILE_LIST)
_HLP_TGTS_LEN = $(shell $(_HLP_TGTS_CMD) | cut -d : -f 1 | wc -L)
_HLPFMT = "%-$(_HLP_TGTS_LEN)s %s\n"
.PHONY: help
ifneq (, ${PYTHON})
help:
@$(PYTHON) -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST)
else
help:
$(error python required for 'make help', executable not found)
endif
help: ## (Default) Print listing of key targets with their descriptions
@printf $(_HLPFMT) "Target:" "Description:"
@printf $(_HLPFMT) "--------------" "--------------------"
@$(_HLP_TGTS_CMD) | sort | \
awk 'BEGIN {FS = ":(.*)?## "}; \
{printf $(_HLPFMT), $$1, $$2}'

.gopathok:
ifeq ("$(wildcard $(GOPKGDIR))","")
Expand Down Expand Up @@ -469,6 +460,8 @@ changelog: ## Generate changelog
$(shell cat $(TMPFILE) >> changelog.txt)
$(shell rm $(TMPFILE))

# Workaround vim syntax highlighting bug: "

.PHONY: install
install: .gopathok install.bin install.remote install.man install.cni install.systemd ## Install binaries to system locations

Expand Down
18 changes: 13 additions & 5 deletions hack/get_release_info.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,20 @@ valid_args() {
cut -d '*' -f 1
}

# `git describe` does not reliably produce a useful version number.
# `git describe` will never produce a useful version number under all
# branches. This is because the podman release process (see `RELEASE_PROCESS.md`)
# tags release versions only on release-branches (i.e. never on master).
# Scraping the version number directly from the source, is the only way
# to reliably obtain the number from all the various contexts supported by
# the `Makefile`.
scrape_version() {
local versionfile='version/version.go'
local version_line=$(grep -m 1 'var Version =' $versionfile)
local version_string=$(cut -d '"' -f 2 <<<"$version_line")
echo "$version_string" | tr -d '[:space:]'
local v
# extract the value of 'var Version'
v=$(sed -ne 's/^var\s\+Version\s\+=\s.*("\(.*\)").*/\1/p' <version/version.go)
# If it's empty, something has changed in version.go, that would be bad!
test -n "$v"
# Value consumed literally, must not have any embedded newlines
echo -n "$v"
}

unset OUTPUT
Expand Down

0 comments on commit 0e83851

Please sign in to comment.