Compare commits

...

7 commits

18 changed files with 461 additions and 326 deletions

View file

@ -24,7 +24,7 @@ Current Features:
- custom print function - custom print function
- confirmation prompt - confirmation prompt
Depends on `GNU Make`, obviously and `Python >=3.7`. Depends on `GNU Make`, obviously and `Python >=3.7`, and `bash` (or `zsh`).
Wait python?!?!, I'm not `pip` installing some package just to parse my makefile. Wait python?!?!, I'm not `pip` installing some package just to parse my makefile.
I agree, all you need is one file [`.task.mk`](./task.mk). I agree, all you need is one file [`.task.mk`](./task.mk).

View file

@ -9,7 +9,7 @@ all: $(CASTS)
%/demo.cast: %/record.sh %/demo.cast: %/record.sh
asciinema rec --cols $(COLS) --rows $(ROWS) --overwrite -c $< $@ asciinema rec --cols $(COLS) --rows $(ROWS) --overwrite -c $< $@
check/demo.cast: COLS = 45 check/demo.cast: COLS = 48
check/demo.cast: ROWS = 12 check/demo.cast: ROWS = 12
clean: clean:

View file

@ -11,6 +11,6 @@ define USAGE
interactivity w/ task.mk\n interactivity w/ task.mk\n
endef endef
.DEFUALT_GOAL = help .DEFAULT_GOAL = help
include $(shell git rev-parse --show-toplevel)/task.mk include $(shell git rev-parse --show-toplevel)/task.mk

View file

@ -1,130 +1,129 @@
{"version": 2, "width": 45, "height": 12, "timestamp": 1663509712, "env": {"SHELL": "/usr/bin/zsh", "TERM": "xterm-256color"}} {"version": 2, "width": 48, "height": 12, "timestamp": 1663712361, "env": {"SHELL": "/usr/bin/zsh", "TERM": "xterm-256color"}}
[0.007004, "o", "\u001b[H\u001b[2J\u001b[3J"] [0.008114, "o", "\u001b[H\u001b[2J\u001b[3J"]
[0.007499, "o", "bash >> "] [0.00852, "o", "bash >> "]
[0.007695, "o", "m"] [0.008755, "o", "m"]
[0.188475, "o", "a"] [0.189398, "o", "a"]
[0.278605, "o", "k"] [0.279744, "o", "k"]
[0.368932, "o", "e"] [0.369775, "o", "e"]
[0.459055, "o", " -"] [0.459919, "o", " -"]
[0.549199, "o", "f"] [0.549908, "o", "f"]
[0.639392, "o", " "] [0.639982, "o", " "]
[0.729414, "o", "c"] [0.730339, "o", "c"]
[0.81952, "o", "h"] [0.820338, "o", "h"]
[0.909732, "o", "ec"] [0.910414, "o", "ec"]
[1.090009, "o", "k"] [1.090651, "o", "k"]
[1.180084, "o", "/"] [1.18077, "o", "/"]
[1.270256, "o", "c"] [1.271098, "o", "c"]
[1.360329, "o", "h"] [1.361098, "o", "h"]
[1.450517, "o", "ec"] [1.451216, "o", "ec"]
[1.540604, "o", "k"] [1.541276, "o", "k"]
[1.630898, "o", "."] [1.631388, "o", "."]
[1.72087, "o", "m"] [1.721603, "o", "m"]
[1.811036, "o", "k"] [1.811718, "o", "k"]
[1.991393, "o", " h"] [1.992079, "o", " h"]
[2.081431, "o", "e"] [2.082138, "o", "e"]
[2.171549, "o", "l"] [2.172379, "o", "l"]
[2.261684, "o", "p"] [2.262403, "o", "p"]
[2.351833, "o", "\r\n"] [2.352473, "o", "\r\n"]
[3.373753, "o", "\u001b[1;36musage:\u001b[0m\r\n\tmake <recipe>\r\n\t\r\n\tinteractivity w/ task.mk\r\n\r\n\u001b[1;33m check\u001b[0m │ \u001b[2mget user confirmation or exit\u001b[0m\r\n\u001b[1;33m h, help\u001b[0m │ \u001b[2mshow this help\u001b[0m\r\n\r\n"] [3.381969, "o", "\u001b[1;36musage:\u001b[0m\r\n\tmake <recipe>\r\n\t\r\n\tinteractivity w/ task.mk\r\n\r\n\u001b[1;33m check\u001b[0m │ \u001b[2mget user confirmation or exit\u001b[0m\r\n\u001b[1;33m h, help\u001b[0m │ \u001b[2mshow this help\u001b[0m\r\n\r\n"]
[5.378629, "o", "\u001b[H\u001b[2J\u001b[3J"] [5.387545, "o", "\u001b[H\u001b[2J\u001b[3J"]
[5.37884, "o", "bash >> "] [5.387892, "o", "bash >> "]
[5.380877, "o", "m"] [5.390047, "o", "m"]
[5.561187, "o", "a"] [5.570645, "o", "a"]
[5.651259, "o", "k"] [5.660579, "o", "k"]
[5.741367, "o", "e"] [5.750852, "o", "e"]
[5.83161, "o", " -"] [5.841071, "o", " -"]
[5.921765, "o", "f"] [5.931225, "o", "f"]
[6.011971, "o", " "] [6.021286, "o", " "]
[6.102115, "o", "c"] [6.111373, "o", "c"]
[6.192388, "o", "h"] [6.201586, "o", "h"]
[6.282346, "o", "ec"] [6.291778, "o", "ec"]
[6.462683, "o", "k"] [6.472054, "o", "k"]
[6.552812, "o", "/"] [6.562124, "o", "/"]
[6.642847, "o", "c"] [6.652262, "o", "c"]
[6.73297, "o", "h"] [6.74248, "o", "h"]
[6.823099, "o", "ec"] [6.832675, "o", "ec"]
[6.913297, "o", "k"] [6.922668, "o", "k"]
[7.003515, "o", "."] [7.012809, "o", "."]
[7.093594, "o", "m"] [7.102973, "o", "m"]
[7.183719, "o", "k"] [7.193151, "o", "k"]
[7.364474, "o", " c"] [7.373458, "o", " c"]
[7.454638, "o", "h"] [7.463783, "o", "h"]
[7.544856, "o", "e"] [7.553761, "o", "e"]
[7.634908, "o", "c"] [7.643931, "o", "c"]
[7.725037, "o", "k"] [7.734197, "o", "k"]
[7.815191, "o", "\r\n"] [7.824356, "o", "\r\n"]
[8.827899, "o", "Would you like to proceed? \u001b[1;31m[Y/n]\u001b[0m "] [8.857505, "o", "Would you like to proceed? \u001b[1;31m[Y/n]\u001b[0m "]
[9.751154, "o", "y"] [9.54018, "o", "y"]
[9.837618, "o", "\r\n"] [9.595198, "o", "\r\n"]
[9.846779, "o", "you said yes!\r\n"] [9.598684, "o", "you said yes!\r\n"]
[11.850338, "o", "#"] [11.602689, "o", "#"]
[12.030527, "o", " "] [11.783071, "o", " "]
[12.12062, "o", "L"] [11.873235, "o", "L"]
[12.210763, "o", "e"] [11.963465, "o", "e"]
[12.300857, "o", "t'"] [12.053444, "o", "t'"]
[12.391099, "o", "s"] [12.143548, "o", "s"]
[12.481244, "o", " "] [12.233881, "o", " "]
[12.57145, "o", "t"] [12.323915, "o", "t"]
[12.66148, "o", "r"] [12.41414, "o", "r"]
[12.751606, "o", "y "] [12.50428, "o", "y "]
[12.932134, "o", "a"] [12.684471, "o", "a"]
[13.022101, "o", "g"] [12.774773, "o", "g"]
[13.112244, "o", "a"] [12.864864, "o", "a"]
[13.202336, "o", "i"] [12.954989, "o", "i"]
[13.292469, "o", "n "] [13.045011, "o", "n "]
[13.38261, "o", "b"] [13.135204, "o", "b"]
[13.472767, "o", "u"] [13.225451, "o", "u"]
[13.562841, "o", "t"] [13.315649, "o", "t"]
[13.652944, "o", " "] [13.405687, "o", " "]
[13.833164, "o", "in"] [13.585943, "o", "in"]
[13.923274, "o", "s"] [13.676051, "o", "s"]
[14.013422, "o", "t"] [13.766346, "o", "t"]
[14.10364, "o", "e"] [13.856324, "o", "e"]
[14.193783, "o", "a"] [13.946542, "o", "a"]
[14.283859, "o", "d "] [14.036697, "o", "d "]
[14.374022, "o", "s"] [14.126782, "o", "s"]
[14.464304, "o", "a"] [14.216944, "o", "a"]
[14.554416, "o", "y"] [14.307128, "o", "y"]
[14.734528, "o", " "] [14.487468, "o", " "]
[14.824636, "o", "no"] [14.577551, "o", "no"]
[14.914924, "o", " "] [14.667739, "o", " "]
[15.005102, "o", "t"] [14.757899, "o", "t"]
[15.095117, "o", "h"] [14.848007, "o", "h"]
[15.185276, "o", "i"] [14.93806, "o", "i"]
[15.275414, "o", "s "] [15.0283, "o", "s "]
[15.365521, "o", "t"] [15.118379, "o", "t"]
[15.45574, "o", "i"] [15.208471, "o", "i"]
[15.635918, "o", "m"] [15.388757, "o", "m"]
[15.726033, "o", "e"] [15.47897, "o", "e"]
[15.816169, "o", "\r\n"] [15.569031, "o", "\r\n"]
[16.817697, "o", "\u001b[H\u001b[2J\u001b[3J"] [16.571969, "o", "\u001b[H\u001b[2J\u001b[3J"]
[16.817793, "o", "bash >> "] [16.572047, "o", "bash >> "]
[16.818364, "o", "m"] [16.574017, "o", "m"]
[16.999104, "o", "a"] [16.754499, "o", "a"]
[17.089183, "o", "k"] [16.844612, "o", "k"]
[17.179376, "o", "e"] [16.93468, "o", "e"]
[17.269421, "o", " -"] [17.024972, "o", " -"]
[17.359516, "o", "f"] [17.115137, "o", "f"]
[17.449715, "o", " "] [17.205244, "o", " "]
[17.539785, "o", "c"] [17.295415, "o", "c"]
[17.629954, "o", "h"] [17.385554, "o", "h"]
[17.720065, "o", "ec"] [17.475882, "o", "ec"]
[17.900294, "o", "k"] [17.655989, "o", "k"]
[17.990472, "o", "/"] [17.746279, "o", "/"]
[18.080485, "o", "c"] [17.83643, "o", "c"]
[18.170674, "o", "h"] [17.926644, "o", "h"]
[18.260717, "o", "ec"] [18.016673, "o", "ec"]
[18.350924, "o", "k"] [18.106718, "o", "k"]
[18.441115, "o", "."] [18.197045, "o", "."]
[18.531291, "o", "m"] [18.287031, "o", "m"]
[18.621449, "o", "k"] [18.377151, "o", "k"]
[18.801717, "o", " c"] [18.55735, "o", " c"]
[18.891834, "o", "h"] [18.647478, "o", "h"]
[18.982112, "o", "e"] [18.737616, "o", "e"]
[19.07216, "o", "c"] [18.827879, "o", "c"]
[19.162471, "o", "k"] [18.917992, "o", "k"]
[19.252562, "o", "\r\n"] [19.008133, "o", "\r\n"]
[20.265973, "o", "Would you like to proceed? \u001b[1;31m[Y/n]\u001b[0m "] [20.034923, "o", "Would you like to proceed? \u001b[1;31m[Y/n]\u001b[0m "]
[21.947847, "o", "n"] [22.08808, "o", "n"]
[22.001462, "o", "\r\n"] [22.227223, "o", "\r\n"]
[22.00656, "o", "make[1]: *** [check/check.mk:8: check] Error 1\r\n"]

View file

@ -7,4 +7,4 @@ cmd 'make -f check/check.mk check'
msg "# Let's try again but instead say no this time" msg "# Let's try again but instead say no this time"
cmd 'make -f check/check.mk check' cmd 'make -f check/check.mk check'
sleep 1

View file

@ -1,125 +1,126 @@
{"version": 2, "width": 60, "height": 20, "timestamp": 1663509736, "env": {"SHELL": "/usr/bin/zsh", "TERM": "xterm-256color"}} {"version": 2, "width": 60, "height": 20, "timestamp": 1663712193, "env": {"SHELL": "/usr/bin/zsh", "TERM": "xterm-256color"}}
[0.006995, "o", "\u001b[H\u001b[2J\u001b[3J"] [0.008386, "o", "\u001b[H\u001b[2J\u001b[3J"]
[0.007356, "o", "bash >> "] [0.008986, "o", "bash >> "]
[0.007626, "o", "m"] [0.009151, "o", "m"]
[0.188158, "o", "a"] [0.189701, "o", "a"]
[0.27839, "o", "k"] [0.280162, "o", "k"]
[0.368576, "o", "e"] [0.37038, "o", "e"]
[0.458807, "o", " -"] [0.460683, "o", " -"]
[0.548811, "o", "f"] [0.551001, "o", "f"]
[0.63903, "o", " "] [0.641267, "o", " "]
[0.729091, "o", "e"] [0.731609, "o", "e"]
[0.819196, "o", "m"] [0.821777, "o", "m"]
[0.909274, "o", "be"] [0.912103, "o", "be"]
[1.089691, "o", "d"] [1.092658, "o", "d"]
[1.179663, "o", "d"] [1.182705, "o", "d"]
[1.269774, "o", "e"] [1.273152, "o", "e"]
[1.359973, "o", "d"] [1.363457, "o", "d"]
[1.450027, "o", "/e"] [1.453758, "o", "/e"]
[1.540296, "o", "m"] [1.544059, "o", "m"]
[1.630272, "o", "b"] [1.634282, "o", "b"]
[1.720364, "o", "e"] [1.724452, "o", "e"]
[1.8106, "o", "d"] [1.814601, "o", "d"]
[1.990776, "o", "de"] [1.995155, "o", "de"]
[2.080964, "o", "d"] [2.085437, "o", "d"]
[2.17101, "o", "."] [2.175546, "o", "."]
[2.261109, "o", "m"] [2.265856, "o", "m"]
[2.351249, "o", "k"] [2.356192, "o", "k"]
[2.441359, "o", " h"] [2.446468, "o", " h"]
[2.531512, "o", "e"] [2.536781, "o", "e"]
[2.621795, "o", "l"] [2.627101, "o", "l"]
[2.711889, "o", "p"] [2.717423, "o", "p"]
[2.892394, "o", "\r\n"] [2.897934, "o", "\r\n"]
[3.915806, "o", "\u001b[1;36musage:\u001b[0m\r\n\tmake <recipe>\r\n\t\r\n\texamples of embedded scripts in `\u001b[35mMakefile\u001b[0m`\r\n\r\n \u001b[1;31m examples of task.mk features \u001b[0m\r\n\u001b[38m ─────────────────────────────────────────────────────\u001b[0m\r\n\u001b[1;33m list-%\u001b[0m │ \u001b[2muse pathlib.Path to list files\u001b[0m\r\n \u001b[2mname the directory in rule (make list-src)\u001b[0m\r\n\u001b[1;33m embedded-bash\u001b[0m │ \u001b[2mbash script with pipes and make input\u001b[0m\r\n\u001b[1;33m h, help\u001b[0m │ \u001b[2mshow this help\u001b[0m\r\n\r\n"] [3.931131, "o", "\u001b[1;36musage:\u001b[0m\r\n\tmake <recipe>\r\n\t\r\n\texamples of embedded scripts in `\u001b[35mMakefile\u001b[0m`\r\n\r\n \u001b[1;31m examples of task.mk features \u001b[0m\r\n\u001b[38m ─────────────────────────────────────────────────────\u001b[0m\r\n\u001b[1;33m list-%\u001b[0m │ \u001b[2muse pathlib.Path to list files\u001b[0m\r\n \u001b[2mname the directory in rule (make list-src)\u001b[0m\r\n\u001b[1;33m embedded-bash\u001b[0m │ \u001b[2mbash script with pipes and make input\u001b[0m\r\n\u001b[1;33m h, help\u001b[0m │ \u001b[2mshow this help\u001b[0m\r\n\r\n"]
[5.921614, "o", "\u001b[H\u001b[2J\u001b[3J"] [5.936874, "o", "\u001b[H\u001b[2J\u001b[3J"]
[5.921918, "o", "bash >> "] [5.937167, "o", "bash >> "]
[5.923943, "o", "m"] [5.939502, "o", "m"]
[6.104382, "o", "a"] [6.120169, "o", "a"]
[6.194681, "o", "k"] [6.210505, "o", "k"]
[6.284819, "o", "e"] [6.300671, "o", "e"]
[6.375089, "o", " -"] [6.390788, "o", " -"]
[6.465174, "o", "f"] [6.480981, "o", "f"]
[6.555322, "o", " "] [6.571285, "o", " "]
[6.64533, "o", "e"] [6.661457, "o", "e"]
[6.735435, "o", "m"] [6.751758, "o", "m"]
[6.825552, "o", "be"] [6.842048, "o", "be"]
[7.005939, "o", "d"] [7.022576, "o", "d"]
[7.096066, "o", "d"] [7.112852, "o", "d"]
[7.186097, "o", "e"] [7.203064, "o", "e"]
[7.276232, "o", "d"] [7.293421, "o", "d"]
[7.366364, "o", "/e"] [7.383397, "o", "/e"]
[7.456527, "o", "m"] [7.473873, "o", "m"]
[7.546662, "o", "b"] [7.564152, "o", "b"]
[7.636777, "o", "e"] [7.65431, "o", "e"]
[7.726911, "o", "d"] [7.744607, "o", "d"]
[7.907171, "o", "de"] [7.925168, "o", "de"]
[7.99733, "o", "d"] [8.015472, "o", "d"]
[8.087458, "o", "."] [8.105767, "o", "."]
[8.177539, "o", "m"] [8.195936, "o", "m"]
[8.26767, "o", "k"] [8.286184, "o", "k"]
[8.357795, "o", " l"] [8.376537, "o", " l"]
[8.447911, "o", "i"] [8.466624, "o", "i"]
[8.538022, "o", "s"] [8.557058, "o", "s"]
[8.628232, "o", "t"] [8.64739, "o", "t"]
[8.80841, "o", "-"] [8.827942, "o", "-"]
[8.898543, "o", "em"] [8.91803, "o", "em"]
[8.988721, "o", "b"] [9.008446, "o", "b"]
[9.078836, "o", "e"] [9.098742, "o", "e"]
[9.169069, "o", "d"] [9.189059, "o", "d"]
[9.259138, "o", "d"] [9.279328, "o", "d"]
[9.349222, "o", "ed"] [9.36965, "o", "ed"]
[9.439533, "o", "\r\n"] [9.459574, "o", "\r\n"]
[10.45661, "o", "files in embedded\r\n['embedded.mk', 'demo.cast', 'record.sh', 'index.md']\r\n"] [10.492826, "o", "files in embedded\r\n"]
[12.462317, "o", "\u001b[H\u001b[2J\u001b[3J"] [10.492943, "o", "['embedded.mk', 'demo.cast', 'record.sh', 'index.md']\r\n"]
[12.462399, "o", "bash >> "] [12.498865, "o", "\u001b[H\u001b[2J\u001b[3J"]
[12.464413, "o", "m"] [12.498984, "o", "bash >> "]
[12.644851, "o", "a"] [12.501382, "o", "m"]
[12.73513, "o", "k"] [12.681906, "o", "a"]
[12.825178, "o", "e"] [12.7722, "o", "k"]
[12.91541, "o", " -"] [12.862501, "o", "e"]
[13.005446, "o", "f"] [12.952783, "o", " -"]
[13.095515, "o", " "] [13.043086, "o", "f"]
[13.185598, "o", "e"] [13.13339, "o", " "]
[13.275797, "o", "m"] [13.223546, "o", "e"]
[13.365927, "o", "be"] [13.313887, "o", "m"]
[13.54612, "o", "d"] [13.40413, "o", "be"]
[13.636273, "o", "d"] [13.584464, "o", "d"]
[13.726372, "o", "e"] [13.674721, "o", "d"]
[13.81653, "o", "d"] [13.764931, "o", "e"]
[13.906755, "o", "/e"] [13.855143, "o", "d"]
[13.996972, "o", "m"] [13.945476, "o", "/e"]
[14.08711, "o", "b"] [14.035801, "o", "m"]
[14.177238, "o", "e"] [14.126086, "o", "b"]
[14.267423, "o", "d"] [14.216402, "o", "e"]
[14.447699, "o", "de"] [14.306688, "o", "d"]
[14.537782, "o", "d"] [14.487263, "o", "de"]
[14.627908, "o", "."] [14.577566, "o", "d"]
[14.718053, "o", "m"] [14.667572, "o", "."]
[14.808215, "o", "k"] [14.757974, "o", "m"]
[14.898357, "o", " e"] [14.848201, "o", "k"]
[14.988612, "o", "m"] [14.938383, "o", " e"]
[15.078745, "o", "b"] [15.02867, "o", "m"]
[15.168911, "o", "e"] [15.118961, "o", "b"]
[15.349036, "o", "d"] [15.2091, "o", "e"]
[15.439167, "o", "de"] [15.38968, "o", "d"]
[15.529412, "o", "d"] [15.479924, "o", "de"]
[15.619518, "o", "-"] [15.570276, "o", "d"]
[15.709569, "o", "b"] [15.66027, "o", "-"]
[15.79969, "o", "a"] [15.750729, "o", "b"]
[15.889938, "o", "sh"] [15.84091, "o", "a"]
[15.980073, "o", "\r\n"] [15.931277, "o", "sh"]
[16.989864, "o", "Is the process running bash? We can check with ps\r\n"] [16.021429, "o", "\r\n"]
[16.999039, "o", "bash\r\n"] [17.044626, "o", "Is the process running bash? We can check with ps\r\n"]
[16.999517, "o", "What text to figlet? \r\n"] [17.063304, "o", "bash\r\n"]
[19.167405, "o", "t"] [17.063756, "o", "What text to figlet? \r\n"]
[19.201071, "o", "a"] [20.107984, "o", "t"]
[19.292173, "o", "s"] [20.125262, "o", "a"]
[19.436959, "o", "k"] [20.276406, "o", "s"]
[19.588588, "o", "."] [20.454083, "o", "k"]
[19.767086, "o", "m"] [20.705234, "o", "."]
[19.903321, "o", "k"] [20.931947, "o", "m"]
[20.073296, "o", "\r\n"] [21.010096, "o", "k"]
[20.074356, "o", " _ _ _ \r\n| |_ __ _ ___| | __ _ __ ___ | | __\r\n| __/ _` / __| |/ / | '_ ` _ \\| |/ /\r\n| || (_| \\__ \\ < _| | | | | | < \r\n \\__\\__,_|___/_|\\_(_)_| |_| |_|_|\\_\\\r\n \r\n"] [21.288327, "o", "\r\n"]
[20.074497, "o", "the argument below as given in the makefile itself\r\n"] [21.292384, "o", " _ _ _ \r\n| |_ __ _ ___| | __ _ __ ___ | | __\r\n| __/ _` / __| |/ / | '_ ` _ \\| |/ /\r\n| || (_| \\__ \\ < _| | | | | | < \r\n \\__\\__,_|___/_|\\_(_)_| |_| |_|_|\\_\\\r\n \r\n"]
[20.074527, "o", "it's expanded before the script is passed to bash\r\n"] [21.292754, "o", "the argument below as given in the makefile itself\r\n"]
[20.074555, "o", "bash multiline is probably working\r\n"] [21.292898, "o", "it's expanded before the script is passed to bash\r\n"]
[21.292925, "o", "bash multiline is probably working\r\n"]

View file

@ -38,6 +38,6 @@ define USAGE
examples of embedded scripts in `{a.magenta}Makefile{a.end}` examples of embedded scripts in `{a.magenta}Makefile{a.end}`
endef endef
.DEFUALT_GOAL = help .DEFAULT_GOAL = help
include $(shell git rev-parse --show-toplevel)/task.mk include $(shell git rev-parse --show-toplevel)/task.mk

View file

@ -5,3 +5,4 @@ source "$(dirname "${BASH_SOURCE[0]}")/../functions.sh"
cmd 'make -f embedded/embedded.mk help' cmd 'make -f embedded/embedded.mk help'
cmd 'make -f embedded/embedded.mk list-embedded' cmd 'make -f embedded/embedded.mk list-embedded'
cmd 'make -f embedded/embedded.mk embedded-bash' cmd 'make -f embedded/embedded.mk embedded-bash'

View file

@ -20,7 +20,7 @@ Current Features:
- custom print function - custom print function
- confirmation prompt - confirmation prompt
Depends on `GNU Make`, obviously and `Python >=3.7`. Depends on `GNU Make`, obviously and `Python >=3.7`, and `bash` (or `zsh`).
Wait python?!?!, I'm not `pip` installing some package just to parse my makefile. Wait python?!?!, I'm not `pip` installing some package just to parse my makefile.
I agree, all you need is one file [`.task.mk`](https://github.com/daylinmorgan/task.mk/v22.9.19/task.mk). I agree, all you need is one file [`.task.mk`](https://github.com/daylinmorgan/task.mk/v22.9.19/task.mk).

View file

@ -56,23 +56,19 @@ See this project's `make info` for an example.
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`.
```make ```make
# ---- CONFIG ---- # # ---- [config] ---- #
HEADER_STYLE ?= b_cyan HEADER_STYLE ?= b_cyan
PARAMS_STYLE ?= b_magenta
ACCENT_STYLE ?= b_yellow ACCENT_STYLE ?= b_yellow
PARAMS_STYLE ?= $(ACCENT_STYLE)
GOAL_STYLE ?= $(ACCENT_STYLE) GOAL_STYLE ?= $(ACCENT_STYLE)
MSG_STYLE ?= faint MSG_STYLE ?= faint
DIVIDER_STYLE ?= default DIVIDER_STYLE ?= default
DIVIDER ?= ─ DIVIDER ?= ─
HELP_SEP ?= │ HELP_SEP ?= │
# python f-string literals # python f-string literals
EPILOG ?= EPILOG ?=
define USAGE ?= USAGE ?={ansi.$(HEADER_STYLE)}usage{ansi.end}:\n make <recipe>\n
{ansi.$(HEADER_STYLE)}usage{ansi.end}: INHERIT_SHELL ?=
make <recipe>
endef
``` ```
To use a custom color for one of the predefined configuration variables specify only the custom method. To use a custom color for one of the predefined configuration variables specify only the custom method.

View file

@ -2,10 +2,9 @@
import sys import sys
from pathlib import Path from pathlib import Path
import jinja2 import jinja2
py_script_names = ["help", "ansi", "info", "print-ansi", "vars", "confirm"] py_script_names = ["help", "ansi", "info", "print-ansi", "vars", "confirm", "quit_make"]
def get_jinja_env(): def get_jinja_env():

View file

@ -1,4 +1,8 @@
# ---- [buitlin recipes] ---- # # ---- [builtin recipes] ---- #
ifeq (help,$(firstword $(MAKECMDGOALS)))
HELP_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
export HELP_ARGS
endif
## h, help | show this help ## h, help | show this help
.PHONY: help h .PHONY: help h
help h: help h:
@ -27,3 +31,6 @@ _update-task.mk:
$(call tprint,{a.b_cyan}Updating task.mk{a.end}) $(call tprint,{a.b_cyan}Updating task.mk{a.end})
curl https://raw.githubusercontent.com/daylinmorgan/task.mk/main/task.mk -o .task.mk curl https://raw.githubusercontent.com/daylinmorgan/task.mk/main/task.mk -o .task.mk
export MAKEFILE_LIST export MAKEFILE_LIST
ifndef INHERIT_SHELL
SHELL := /bin/bash
endif

View file

@ -10,3 +10,4 @@ HELP_SEP ?= │
# python f-string literals # python f-string literals
EPILOG ?= EPILOG ?=
USAGE ?={ansi.$(HEADER_STYLE)}usage{ansi.end}:\n make <recipe>\n USAGE ?={ansi.$(HEADER_STYLE)}usage{ansi.end}:\n make <recipe>\n
INHERIT_SHELL ?=

View file

@ -5,6 +5,7 @@
import sys import sys
##- '$(ansi_py)' -## ##- '$(ansi_py)' -##
##- '$(quit_make_py)' -##
def confirm(): def confirm():
@ -20,7 +21,7 @@ def confirm():
if confirm(): if confirm():
sys.exit(0) sys.exit()
else: else:
sys.exit(1) quit_make()
#% endblock %# #% endblock %#

View file

@ -7,6 +7,7 @@ import os
import re import re
##- '$(ansi_py)' -## ##- '$(ansi_py)' -##
##- '$(quit_make_py)' -##
MaxLens = namedtuple("MaxLens", "goal msg") MaxLens = namedtuple("MaxLens", "goal msg")
@ -14,6 +15,7 @@ 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>.*?) \| (?P<msg>.*?)(?:\s?\| args: (?P<msgargs>.*?))?$$|^### (?P<rawmsg>.*?)?(?:\s?\| args: (?P<rawargs>.*?))?$$"
) )
goal_pattern = re.compile(r"""^(?!#|\t)(.*):.*\n\t""", re.MULTILINE)
def parseargs(argstring): def parseargs(argstring):
@ -35,18 +37,59 @@ def gen_makefile():
return makefile return makefile
def parse_make(file): def parse_help(file, hidden=False):
for line in file.splitlines(): for line in file.splitlines():
match = pattern.search(line) match = pattern.search(line)
if match: if match:
if not os.getenv("SHOW_HIDDEN") and str( if (
match.groupdict().get("goal") not hidden
).startswith("_"): and not os.getenv("SHOW_HIDDEN")
and str(match.groupdict().get("goal")).startswith("_")
):
pass pass
else: else:
yield {k: v for k, v in match.groupdict().items() if v is not None} yield {k: v for k, v in match.groupdict().items() if v is not None}
def recipe_help_header(goal):
item = [
i
for i in list(parse_help(gen_makefile(), hidden=True))
if "goal" in i and goal == i["goal"]
]
if item:
return fmt_goal(
item[0]["goal"],
item[0]["msg"],
len(item[0]["goal"]),
item[0].get("msgargs", ""),
)
else:
return f" {ansi.style(goal,'$(GOAL_STYLE)')}:"
def parse_goal(file, goal):
goals = goal_pattern.findall(file)
matched_goal = [i for i in goals if goal in i.split()]
output = []
if matched_goal:
output.append(recipe_help_header(matched_goal[0]))
lines = file.splitlines()
loc = [n for n, l in enumerate(lines) if l.startswith(f"{matched_goal[0]}:")][0]
recipe = []
for line in lines[loc + 1 :]:
if not line.startswith("\t"):
break
recipe.append(line)
output.append(divider(max((len(l) for l in recipe)) + 5))
output.append("\n".join(recipe) + "\n")
else:
output.append(f"{ansi.b_red}ERROR{ansi.end} Failed to find goal: {goal}")
return output
def fmt_goal(goal, msg, max_goal_len, argstr): def fmt_goal(goal, msg, max_goal_len, argstr):
args = parseargs(argstr) args = parseargs(argstr)
goal_style = args.goal_style.strip() if args.goal_style else "$(GOAL_STYLE)" goal_style = args.goal_style.strip() if args.goal_style else "$(GOAL_STYLE)"
@ -58,6 +101,10 @@ def fmt_goal(goal, msg, max_goal_len, argstr):
) )
def divider(len):
return ansi.style(f" {'$(DIVIDER)'*len}", "$(DIVIDER_STYLE)")
def fmt_rawmsg(msg, argstr, maxlens): def fmt_rawmsg(msg, argstr, maxlens):
args = parseargs(argstr) args = parseargs(argstr)
lines = [] lines = []
@ -74,12 +121,7 @@ def fmt_rawmsg(msg, argstr, maxlens):
else: else:
lines.append(f" {ansi.style(msg,msg_style)}") lines.append(f" {ansi.style(msg,msg_style)}")
if args.divider: if args.divider:
lines.append( lines.append(divider(len("$(HELP_SEP)") + sum(maxlens) + 2))
ansi.style(
f" {'$(DIVIDER)'*(len('$(HELP_SEP)')+sum(maxlens)+2)}",
"$(DIVIDER_STYLE)",
)
)
if args.whitespace: if args.whitespace:
lines.append("\n") lines.append("\n")
@ -89,7 +131,7 @@ def fmt_rawmsg(msg, argstr, maxlens):
def print_help(): def print_help():
lines = [f"""$(USAGE)"""] lines = [f"""$(USAGE)"""]
items = list(parse_make(gen_makefile())) items = list(parse_help(gen_makefile()))
maxlens = MaxLens( maxlens = MaxLens(
*(max((len(item[x]) for item in items if x in item)) for x in ["goal", "msg"]) *(max((len(item[x]) for item in items if x in item)) for x in ["goal", "msg"])
) )
@ -106,5 +148,21 @@ def print_help():
print("\n".join(lines)) print("\n".join(lines))
def print_arg_help(help_args):
for arg in help_args.split():
print(f"{ansi.style('task.mk recipe help','$(HEADER_STYLE)')}\n")
print("\n".join(parse_goal(gen_makefile(), arg)))
def main():
help_args = os.getenv("HELP_ARGS")
if help_args:
quit_make()
print_arg_help(help_args)
else:
print_help() print_help()
if __name__ == "__main__":
main()
#% endblock %# #% endblock %#

12
src/quit_make.py Normal file
View file

@ -0,0 +1,12 @@
#% extends "py-script.mk" %#
#% block name %#quit_make#% endblock %#
#% block script %#
import os, signal
def quit_make():
os.kill(os.getppid(), signal.SIGQUIT)
#% endblock %#

View file

@ -1,24 +1,24 @@
# ---- [python/bash script runner] ---- # # ---- [python/bash script runner] ---- #
###-- modified from https://unix.stackexchange.com/a/223093 -### ###-- modified from https://unix.stackexchange.com/a/223093 -###
define \n define _newline
endef endef
escape_shellstring = $(subst `,\`,$(subst ",\",$(subst $$,\$$,$(subst \,\\,$1)))) _escape_shellstring = $(subst `,\`,$(subst ",\",$(subst $$,\$$,$(subst \,\\,$1))))
escape_printf = $(subst \,\\,$(subst %,%%,$1)) _escape_printf = $(subst \,\\,$(subst %,%%,$1))
create_string = $(subst $(\n),\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 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
@$(printline) @$(_printline)
@printf "$(call create_string,$(3))" | $(2) @$(2) <(printf "$(call _create_string,$(3))")
endef endef
py = $(call _debug_runner,Python,python3,$($(1))) py = $(call _debug_runner,Python,python3,$($(1)))
tbash = $(call _debug_runner,Bash,bash,$($(1))) tbash = $(call _debug_runner,Bash,bash,$($(1)))
else else
py = @python3 <(printf "$(call create_string,$($(1)))") py = @python3 <(printf "$(call _create_string,$($(1)))")
tbash = @bash <(printf "$(call create_string,$($(1)))") tbash = @bash <(printf "$(call _create_string,$($(1)))")
endif endif
pysh = python3 <(printf "$(call create_string,$($(1)))") pysh = python3 <(printf "$(call _create_string,$($(1)))")

114
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: 22.9.19 # version: v22.9.19-5-g5f593e3-dev
# #
# 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.
@ -18,7 +18,12 @@ HELP_SEP ?= │
# python f-string literals # python f-string literals
EPILOG ?= EPILOG ?=
USAGE ?={ansi.$(HEADER_STYLE)}usage{ansi.end}:\n make <recipe>\n USAGE ?={ansi.$(HEADER_STYLE)}usage{ansi.end}:\n make <recipe>\n
# ---- [buitlin recipes] ---- # INHERIT_SHELL ?=
# ---- [builtin recipes] ---- #
ifeq (help,$(firstword $(MAKECMDGOALS)))
HELP_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
export HELP_ARGS
endif
## h, help | show this help ## h, help | show this help
.PHONY: help h .PHONY: help h
help h: help h:
@ -47,29 +52,32 @@ _update-task.mk:
$(call tprint,{a.b_cyan}Updating task.mk{a.end}) $(call tprint,{a.b_cyan}Updating task.mk{a.end})
curl https://raw.githubusercontent.com/daylinmorgan/task.mk/main/task.mk -o .task.mk curl https://raw.githubusercontent.com/daylinmorgan/task.mk/main/task.mk -o .task.mk
export MAKEFILE_LIST export MAKEFILE_LIST
ifndef INHERIT_SHELL
SHELL := /bin/bash
endif
# ---- [python/bash script runner] ---- # # ---- [python/bash script runner] ---- #
define \n define _newline
endef endef
escape_shellstring = $(subst `,\`,$(subst ",\",$(subst $$,\$$,$(subst \,\\,$1)))) _escape_shellstring = $(subst `,\`,$(subst ",\",$(subst $$,\$$,$(subst \,\\,$1))))
escape_printf = $(subst \,\\,$(subst %,%%,$1)) _escape_printf = $(subst \,\\,$(subst %,%%,$1))
create_string = $(subst $(\n),\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 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
@$(printline) @$(_printline)
@printf "$(call create_string,$(3))" | $(2) @$(2) <(printf "$(call _create_string,$(3))")
endef endef
py = $(call _debug_runner,Python,python3,$($(1))) py = $(call _debug_runner,Python,python3,$($(1)))
tbash = $(call _debug_runner,Bash,bash,$($(1))) tbash = $(call _debug_runner,Bash,bash,$($(1)))
else else
py = @python3 <(printf "$(call create_string,$($(1)))") py = @python3 <(printf "$(call _create_string,$($(1)))")
tbash = @bash <(printf "$(call create_string,$($(1)))") tbash = @bash <(printf "$(call _create_string,$($(1)))")
endif endif
pysh = python3 <(printf "$(call create_string,$($(1)))") pysh = python3 <(printf "$(call _create_string,$($(1)))")
# ---- [python scripts] ---- # # ---- [python scripts] ---- #
define help_py define help_py
import argparse import argparse
@ -77,10 +85,12 @@ from collections import namedtuple
import os import os
import re import re
$(ansi_py) $(ansi_py)
$(quit_make_py)
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>.*?) \| (?P<msg>.*?)(?:\s?\| args: (?P<msgargs>.*?))?$$|^### (?P<rawmsg>.*?)?(?:\s?\| args: (?P<rawargs>.*?))?$$"
) )
goal_pattern = re.compile(r"""^(?!#|\t)(.*):.*\n\t""", re.MULTILINE)
def parseargs(argstring): def parseargs(argstring):
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("--align") parser.add_argument("--align")
@ -96,16 +106,51 @@ def gen_makefile():
with open(file, "r") as f: with open(file, "r") as f:
makefile += f.read() + "\n\n" makefile += f.read() + "\n\n"
return makefile return makefile
def parse_make(file): def parse_help(file, hidden=False):
for line in file.splitlines(): for line in file.splitlines():
match = pattern.search(line) match = pattern.search(line)
if match: if match:
if not os.getenv("SHOW_HIDDEN") and str( if (
match.groupdict().get("goal") not hidden
).startswith("_"): and not os.getenv("SHOW_HIDDEN")
and str(match.groupdict().get("goal")).startswith("_")
):
pass pass
else: else:
yield {k: v for k, v in match.groupdict().items() if v is not None} yield {k: v for k, v in match.groupdict().items() if v is not None}
def recipe_help_header(goal):
item = [
i
for i in list(parse_help(gen_makefile(), hidden=True))
if "goal" in i and goal == i["goal"]
]
if item:
return fmt_goal(
item[0]["goal"],
item[0]["msg"],
len(item[0]["goal"]),
item[0].get("msgargs", ""),
)
else:
return f" {ansi.style(goal,'$(GOAL_STYLE)')}:"
def parse_goal(file, goal):
goals = goal_pattern.findall(file)
matched_goal = [i for i in goals if goal in i.split()]
output = []
if matched_goal:
output.append(recipe_help_header(matched_goal[0]))
lines = file.splitlines()
loc = [n for n, l in enumerate(lines) if l.startswith(f"{matched_goal[0]}:")][0]
recipe = []
for line in lines[loc + 1 :]:
if not line.startswith("\t"):
break
recipe.append(line)
output.append(divider(max((len(l) for l in recipe)) + 5))
output.append("\n".join(recipe) + "\n")
else:
output.append(f"{ansi.b_red}ERROR{ansi.end} Failed to find goal: {goal}")
return output
def fmt_goal(goal, msg, max_goal_len, argstr): def fmt_goal(goal, msg, max_goal_len, argstr):
args = parseargs(argstr) args = parseargs(argstr)
goal_style = args.goal_style.strip() if args.goal_style else "$(GOAL_STYLE)" goal_style = args.goal_style.strip() if args.goal_style else "$(GOAL_STYLE)"
@ -115,6 +160,8 @@ def fmt_goal(goal, msg, max_goal_len, argstr):
+ f" $(HELP_SEP) " + f" $(HELP_SEP) "
+ ansi.style(msg, msg_style) + ansi.style(msg, msg_style)
) )
def divider(len):
return ansi.style(f" {'$(DIVIDER)'*len}", "$(DIVIDER_STYLE)")
def fmt_rawmsg(msg, argstr, maxlens): def fmt_rawmsg(msg, argstr, maxlens):
args = parseargs(argstr) args = parseargs(argstr)
lines = [] lines = []
@ -131,18 +178,13 @@ def fmt_rawmsg(msg, argstr, maxlens):
else: else:
lines.append(f" {ansi.style(msg,msg_style)}") lines.append(f" {ansi.style(msg,msg_style)}")
if args.divider: if args.divider:
lines.append( lines.append(divider(len("$(HELP_SEP)") + sum(maxlens) + 2))
ansi.style(
f" {'$(DIVIDER)'*(len('$(HELP_SEP)')+sum(maxlens)+2)}",
"$(DIVIDER_STYLE)",
)
)
if args.whitespace: if args.whitespace:
lines.append("\n") lines.append("\n")
return lines return lines
def print_help(): def print_help():
lines = [f"""$(USAGE)"""] lines = [f"""$(USAGE)"""]
items = list(parse_make(gen_makefile())) items = list(parse_help(gen_makefile()))
maxlens = MaxLens( maxlens = MaxLens(
*(max((len(item[x]) for item in items if x in item)) for x in ["goal", "msg"]) *(max((len(item[x]) for item in items if x in item)) for x in ["goal", "msg"])
) )
@ -157,7 +199,19 @@ def print_help():
lines.extend(fmt_rawmsg(item["rawmsg"], item.get("rawargs", ""), maxlens)) lines.extend(fmt_rawmsg(item["rawmsg"], item.get("rawargs", ""), maxlens))
lines.append(f"""$(EPILOG)""") lines.append(f"""$(EPILOG)""")
print("\n".join(lines)) print("\n".join(lines))
def print_arg_help(help_args):
for arg in help_args.split():
print(f"{ansi.style('task.mk recipe help','$(HEADER_STYLE)')}\n")
print("\n".join(parse_goal(gen_makefile(), arg)))
def main():
help_args = os.getenv("HELP_ARGS")
if help_args:
quit_make()
print_arg_help(help_args)
else:
print_help() print_help()
if __name__ == "__main__":
main()
endef endef
define ansi_py define ansi_py
import os import os
@ -255,6 +309,7 @@ endef
define confirm_py define confirm_py
import sys import sys
$(ansi_py) $(ansi_py)
$(quit_make_py)
def confirm(): def confirm():
""" """
Ask user to enter Y or N (case-insensitive). Ask user to enter Y or N (case-insensitive).
@ -266,7 +321,12 @@ def confirm():
answer = input(f"""$(2) {a.b_red}[Y/n]{a.end} """).lower() answer = input(f"""$(2) {a.b_red}[Y/n]{a.end} """).lower()
return answer == "y" return answer == "y"
if confirm(): if confirm():
sys.exit(0) sys.exit()
else: else:
sys.exit(1) quit_make()
endef
define quit_make_py
import os, signal
def quit_make():
os.kill(os.getppid(), signal.SIGQUIT)
endef endef