Compare commits

...

8 commits

9 changed files with 96 additions and 44 deletions

View file

@ -2,8 +2,8 @@ name: GitHub Pages
on: on:
push: push:
branches: tags: ["v*.*.*"]
- main workflow_dispatch:
jobs: jobs:
deploy: deploy:
@ -20,7 +20,7 @@ jobs:
- name: Setup Python - name: Setup Python
uses: actions/setup-python@v3 uses: actions/setup-python@v3
with: with:
python-version: '3.9' python-version: "3.9"
- name: Upgrade pip - name: Upgrade pip
run: | run: |

10
.task.cfg.mk Normal file
View file

@ -0,0 +1,10 @@
define USAGE
{a.style('usage','header')}:\n make <recipe>\n
Turn your {a.style('`Makefile`','b_magenta')} into
the {a.italic}{a.underline}task runner{a.end} you always needed.
See the example output below.\n
endef
EPILOG = \nfor more info: gh.dayl.in/task.mk
PRINT_VARS := VERSION SHELL

View file

@ -1,12 +1,10 @@
VERSION ?= $(shell git describe --tags --always --dirty | sed s'/dirty/dev/') VERSION ?= $(shell git describe --tags --always --dirty=dev)
TEMPLATES := $(shell find src/ -type f) TEMPLATES := $(shell find src/ -type f)
.DEFAULT_GOAL := help .DEFAULT_GOAL := help
msg = $(if $(tprint),$(call tprint,{a.bold}==> {a.magenta}$(1){a.end}),@echo '==> $(1)') msg = $(if $(tprint),$(call tprint,{a.bold}==> {a.magenta}$(1){a.end}),@echo '==> $(1)')
### task.mk development |> -d -ms b_green --align center
### task.mk development | args: -d -ms b_green --align center ## bootstrap | generate local dev environment |> -ms b_magenta -gs b_cyan
## bootstrap | generate local dev environment
.PHONY: bootstrap env hooks .PHONY: bootstrap env hooks
bootstrap: env hooks bootstrap: env hooks
env: env:
@ -17,6 +15,7 @@ hooks:
@git config core.hooksPath .githooks @git config core.hooksPath .githooks
docs-env: docs-env:
@mamba run -p ./env pip install mkdocs-material mkdocs-git-revision-date-localized-plugin @mamba run -p ./env pip install mkdocs-material mkdocs-git-revision-date-localized-plugin
## l, lint | lint the python ## l, lint | lint the python
.PHONY: l lint .PHONY: l lint
l lint: l lint:
@ -29,33 +28,40 @@ l lint:
assets: assets:
@yartsu -o assets/help.svg -t "make help" -- make --no-print-directory help @yartsu -o assets/help.svg -t "make help" -- make --no-print-directory help
define release_sh
./generate.py $(subst v,,$(VERSION)) > task.mk
sed -i 's/task.mk\/.*\/task.mk/task.mk\/$(VERSION)\/task.mk/g' README.md docs/index.md
git add task.mk README.md docs/index.md
git commit -m "release: $(VERSION)" --no-verify
git tag $(VERSION)
endef
## release | release new version of task.mk ## release | release new version of task.mk
.PHONY: release .PHONY: release
release: version-check release: version-check
$(call msg,Release Project) $(call msg,Release Project)
@./generate.py $(VERSION) > task.mk $(call tbash,release_sh)
@sed -i 's/task.mk\/.*\/task.mk/task.mk\/v$(VERSION)\/task.mk/g' README.md
@sed -i 's/task.mk\/.*\/task.mk/task.mk\/v$(VERSION)\/task.mk/g' docs/index.md
@git add task.mk README.md docs/index.md
@git commit -m "release: v$(VERSION)" --no-verify
@git tag v$(VERSION)
## c, clean | remove the generated files ## c, clean | remove the generated files
.PHONY: clean .PHONY: clean
c clean: c clean:
@rm -f task.mk .task.mk @rm -f task.mk .task.mk
define version_check_sh
if [[ "${VERSION}" == *'-'* ]]; then
$(call tprint-sh,{a.red}VERSION INVALID! Uncommited or untagged work{a.end})
exit 1
elif [[ $(shell echo "${VERSION}" | awk -F. '{ print NF }') -lt 3 ]];then\
$(call tprint-sh,{a.red}VERSION INVALID! Expected CalVer string{a.end})
exit 1
fi
endef
.PHONY: version-check .PHONY: version-check
version-check: version-check:
@if [[ "${VERSION}" == *'-'* ]]; then\ @$(call tprint,>> version: {a.green}$(VERSION){a.end})
$(call tprint-sh,{a.red}VERSION INVALID! Uncommited or untagged work{a.end});\ @$(call tbash,version_check_sh)
echo ">> version: $(VERSION)"; exit 1;\ @$(call tprint,>> {a.green}VERSION LOOKS GOOD!{a.end})
elif [[ $(shell echo "${VERSION}" | awk -F. '{ print NF }') -lt 3 ]];then\
$(call tprint-sh,{a.red}VERSION INVALID! Expected CalVer string{a.end});\
echo ">> version: $(VERSION)"; exit 1;\
else \
$(call tprint-sh,{a.green}VERSION LOOKS GOOD!{a.end});\
fi
## info | demonstrate usage of tprint ## info | demonstrate usage of tprint
.PHONY: task .PHONY: task
@ -68,15 +74,6 @@ info:
task.mk: $(TEMPLATES) generate.py task.mk: $(TEMPLATES) generate.py
./generate.py $(VERSION) > task.mk ./generate.py $(VERSION) > task.mk
define USAGE
{a.style('usage','header')}:\n make <recipe>\n
Turn your {a.style('`Makefile`','b_magenta')} into
the {a.italic}{a.underline}task runner{a.end} you always needed.
See the example output below.\n
endef
EPILOG = \nfor more info: gh.dayl.in/task.mk
PRINT_VARS := VERSION SHELL
-include .task.mk -include .task.mk
.task.mk: $(TEMPLATES) generate.py .task.mk: $(TEMPLATES) generate.py
$(call msg,re-jinjaing the local .task.mk) $(call msg,re-jinjaing the local .task.mk)

View file

@ -54,6 +54,7 @@ See this project's `make info` for an example.
## Configuration ## Configuration
You can quickly customize some of the default behavior of `task.mk` by overriding the below variables prior to the `-include .task.mk`. You can quickly customize some of the default behavior of `task.mk` by overriding the below variables prior to the `-include .task.mk`.
These can also be included in a seperate file `.task.cfg.mk`.
```make ```make
# ---- [config] ---- # # ---- [config] ---- #
@ -87,7 +88,7 @@ may be easier than balancing sub-shells and strung together awk commands.
When `make` expands the function it will take the parameters passed to `py` and expand them. When `make` expands the function it will take the parameters passed to `py` and expand them.
`$(1)` is the variable name and `$(2)` in this case is the implicit pattern from the rule. Pay attention to quotes. `$(1)` is the variable name and `$(2)` in this case is the implicit pattern from the rule. Pay attention to quotes.
If you need to debug your python script, use `DEBUG=1` when you run `make` and it will first print the script that will be piped to `python`. If you need to debug your python script, use `TASKMK_DEBUG=1` when you run `make` and it will first print the script that will be piped to `python`.
```make ```make
define list_files_py define list_files_py

View file

@ -5,7 +5,7 @@ ifeq (help,$(firstword $(MAKECMDGOALS)))
endif endif
## h, help | show this help ## h, help | show this help
h help: h help:
$(call py,help_py) || { echo "exiting early!"; exit 1; } $(call py,help_py)
_help: export SHOW_HIDDEN=true _help: export SHOW_HIDDEN=true
_help: help _help: help
ifdef PRINT_VARS ifdef PRINT_VARS

View file

@ -1,4 +1,5 @@
# ---- [config] ---- # # ---- [config] ---- #
-include .task.cfg.mk
HEADER_STYLE ?= b_cyan HEADER_STYLE ?= b_cyan
ACCENT_STYLE ?= b_yellow ACCENT_STYLE ?= b_yellow
PARAMS_STYLE ?= $(ACCENT_STYLE) PARAMS_STYLE ?= $(ACCENT_STYLE)

View file

@ -20,8 +20,30 @@ a = ansi = Ansi(target="stdout")
MaxLens = namedtuple("MaxLens", "goal msg") MaxLens = namedtuple("MaxLens", "goal msg")
###- double dollar signs to prevent make escaping them -### ###- double dollar signs to prevent make escaping them -###
###- re.X requires all important whitespace is escaped -###
pattern = re.compile( pattern = re.compile(
r"^## (?P<goal>.*?) \| (?P<msg>.*?)(?:\s?\| args: (?P<msgargs>.*?))?$$|^### (?P<rawmsg>.*?)?(?:\s?\| args: (?P<rawargs>.*?))?$$" r"""
^\#\#\
(?P<goal>.*?)\s?\|\s?(?P<msg>.*?)
\s?
(?:
(?:\|\s?args:\s?|\|>)
\s?
(?P<msgargs>.*?)
)?
$$
|
^\#\#\#\
(?P<rawmsg>.*?)
\s?
(?:
(?:\|\s?args:|\|\>)
\s?
(?P<rawargs>.*?)
)?
$$
""",
re.X,
) )
goal_pattern = re.compile(r"""^(?!#|\t)(.*):.*\n\t""", re.MULTILINE) goal_pattern = re.compile(r"""^(?!#|\t)(.*):.*\n\t""", re.MULTILINE)
@ -185,14 +207,14 @@ def print_help():
def print_arg_help(help_args): def print_arg_help(help_args):
print(f"{ansi.style('task.mk recipe help','header')}\n") print(f"{ansi.style('task.mk recipe help','header')}\n")
for arg in help_args.split(): for arg in help_args.split():
print("\n".join(parse_goal(gen_makefile(), arg))) print("\n".join((*parse_goal(gen_makefile(), arg), "\n")))
print()
def main(): def main():
help_args = os.getenv("HELP_ARGS") help_args = os.getenv("HELP_ARGS")
if help_args: if help_args:
print_arg_help(help_args) print_arg_help(help_args)
print(f"{ansi.faint}exiting task.mk{ansi.end}")
sys.exit(1) sys.exit(1)
else: else:
print_help() print_help()

View file

@ -8,7 +8,7 @@ _escape_shellstring = $(subst `,\`,$(subst ",\",$(subst $$,\$$,$(subst \,\\,$1))
_escape_printf = $(subst \,\\,$(subst %,%%,$1)) _escape_printf = $(subst \,\\,$(subst %,%%,$1))
_create_string = $(subst $(_newline),\n,$(call _escape_shellstring,$(call _escape_printf,$1))) _create_string = $(subst $(_newline),\n,$(call _escape_shellstring,$(call _escape_printf,$1)))
_printline = printf -- "<----------------------------------->\n" _printline = printf -- "<----------------------------------->\n"
ifdef DEBUG ifdef TASKMK_DEBUG
define _debug_runner define _debug_runner
@printf "$(1) Script:\n";$(_printline); @printf "$(1) Script:\n";$(_printline);
@printf "$(call _create_string,$(3))\n" | cat -n @printf "$(call _create_string,$(3))\n" | cat -n

33
task.mk
View file

@ -1,7 +1,7 @@
# }> [github.com/daylinmorgan/task.mk] <{ # # }> [github.com/daylinmorgan/task.mk] <{ #
# Copyright (c) 2022 Daylin Morgan # Copyright (c) 2022 Daylin Morgan
# MIT License # MIT License
# version: v22.9.28-3-g76e9ece-dev # version: v22.9.28-8-g4fcab2adev
# #
# task.mk should be included at the bottom of your Makefile with `-include .task.mk` # task.mk should be included at the bottom of your Makefile with `-include .task.mk`
# See below for the standard configuration options that should be set prior to including this file. # See below for the standard configuration options that should be set prior to including this file.
@ -27,7 +27,7 @@ ifeq (help,$(firstword $(MAKECMDGOALS)))
endif endif
## h, help | show this help ## h, help | show this help
h help: h help:
$(call py,help_py) || { echo "exiting early!"; exit 1; } $(call py,help_py)
_help: export SHOW_HIDDEN=true _help: export SHOW_HIDDEN=true
_help: help _help: help
ifdef PRINT_VARS ifdef PRINT_VARS
@ -64,7 +64,7 @@ _escape_shellstring = $(subst `,\`,$(subst ",\",$(subst $$,\$$,$(subst \,\\,$1))
_escape_printf = $(subst \,\\,$(subst %,%%,$1)) _escape_printf = $(subst \,\\,$(subst %,%%,$1))
_create_string = $(subst $(_newline),\n,$(call _escape_shellstring,$(call _escape_printf,$1))) _create_string = $(subst $(_newline),\n,$(call _escape_shellstring,$(call _escape_printf,$1)))
_printline = printf -- "<----------------------------------->\n" _printline = printf -- "<----------------------------------->\n"
ifdef DEBUG ifdef TASKMK_DEBUG
define _debug_runner define _debug_runner
@printf "$(1) Script:\n";$(_printline); @printf "$(1) Script:\n";$(_printline);
@printf "$(call _create_string,$(3))\n" | cat -n @printf "$(call _create_string,$(3))\n" | cat -n
@ -91,7 +91,28 @@ $(utils_py)
a = ansi = Ansi(target="stdout") a = ansi = Ansi(target="stdout")
MaxLens = namedtuple("MaxLens", "goal msg") MaxLens = namedtuple("MaxLens", "goal msg")
pattern = re.compile( pattern = re.compile(
r"^## (?P<goal>.*?) \| (?P<msg>.*?)(?:\s?\| args: (?P<msgargs>.*?))?$$|^### (?P<rawmsg>.*?)?(?:\s?\| args: (?P<rawargs>.*?))?$$" r"""
^\#\#\
(?P<goal>.*?)\s?\|\s?(?P<msg>.*?)
\s?
(?:
(?:\|\s?args:\s?|\|>)
\s?
(?P<msgargs>.*?)
)?
$$
|
^\#\#\#\
(?P<rawmsg>.*?)
\s?
(?:
(?:\|\s?args:|\|\>)
\s?
(?P<rawargs>.*?)
)?
$$
""",
re.X,
) )
goal_pattern = re.compile(r"""^(?!#|\t)(.*):.*\n\t""", re.MULTILINE) goal_pattern = re.compile(r"""^(?!#|\t)(.*):.*\n\t""", re.MULTILINE)
def parseargs(argstring): def parseargs(argstring):
@ -229,12 +250,12 @@ def print_help():
def print_arg_help(help_args): def print_arg_help(help_args):
print(f"{ansi.style('task.mk recipe help','header')}\n") print(f"{ansi.style('task.mk recipe help','header')}\n")
for arg in help_args.split(): for arg in help_args.split():
print("\n".join(parse_goal(gen_makefile(), arg))) print("\n".join((*parse_goal(gen_makefile(), arg), "\n")))
print()
def main(): def main():
help_args = os.getenv("HELP_ARGS") help_args = os.getenv("HELP_ARGS")
if help_args: if help_args:
print_arg_help(help_args) print_arg_help(help_args)
print(f"{ansi.faint}exiting task.mk{ansi.end}")
sys.exit(1) sys.exit(1)
else: else:
print_help() print_help()