Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ MAKO_LIVE_TLS=1 cargo run --release -- test examples/testing
```

## Project structure
To help you navigate the codebase, here is an overview of how the repository is organized:

```
src/ Compiler (Rust) — lexer, parser, types, codegen, CLI
Expand Down
22 changes: 9 additions & 13 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ BIN_DIR ?= $(PREFIX)/bin
SHARE_DIR ?= $(PREFIX)/share/mako
RUNTIME_DST ?= $(SHARE_DIR)/runtime
CARGO ?= cargo
TARGET_DIR ?= $(shell $(CARGO) metadata --format-version 1 --no-deps 2>/dev/null | python3 -c 'import json,sys; print(json.load(sys.stdin)["target_directory"])' 2>/dev/null || echo target)
TARGET_DIR ?= $(shell$(CARGO) metadata --format-version 1 --no-deps 2>/dev/null | python3 -c 'import json,sys; print(json.load(sys.stdin)["target_directory"])' 2>/dev/null || echo target)
MAKO_BIN := $(TARGET_DIR)/release/mako
Comment on lines +10 to 11

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

expected="$(cargo metadata --format-version 1 --no-deps 2>/dev/null | python3 -c 'import json,sys; print(json.load(sys.stdin)["target_directory"])')"
actual="$(make -pn 2>/dev/null | awk -F ' = ' '$1 == "TARGET_DIR" { print $2; exit }')"
test "$actual" = "$expected"

Repository: loreste/mako

Length of output: 872


🏁 Script executed:

#!/bin/bash
set -u

echo "== Makefile excerpt =="
sed -n '1,25p' Makefile 2>/dev/null || true

echo
echo "== make DEBUG/prerequisite info for TARGET_DIR/MAKO_BIN (no recipes) =="
make -p -n 2>/dev/null | awk '
  BEGIN { show=0 }
  /(^|\s)TARGET_DIR (?:ORIGIN\s*=|:(?:=|:=|\?=|=)) / { show=1; print; next }
  /(^|\s)MAKO_BIN (?:ORIGIN\s*=|:(?:=|:=|\?=|=)) / { show=1; print; next }
  /^Target Directory:/ { print; exit }
  show && /^[A-Za-z0-9_.%-]+=/ { print }
  show && /^/ { print }
'

echo
echo "== Python shell expression behavior =="
python3 - <<'PY'
expected="$(cargo metadata --format-version 1 --no-deps 2>/dev/null | python3 -c 'import json,sys; print(json.load(sys.stdin)["target_directory"])')"
actual="$(make -p -n 2>/dev/null | awk -F ' = ' '$1 == "TARGET_DIR" { print $2; exit }')"
print("expected=", repr(expected))
print("actual=", repr(actual))
print("equal=", actual == expected)
try:
    print("bash_eval=", repr(eval('$(shell$(CARGO) metadata --format-version 1 --no-deps 2>/dev/null | python3 -c '\''import json,sys; print(json.load(sys.stdin)["target_directory"])'\'') 2>/dev/null || echo target', {'CARGO': 'cargo'})))
except Exception as e:
    print("bash_eval_error=", repr(e))
PY

echo
echo "== local shell expansion probe without Make =="
bash -c 'CARGO=cargo; set -u; echo "$(shell$(CARGO) metadata --format-version 1 --no-deps 2>/dev/null | python3 -c '\''import json,sys; print(json.load(sys.stdin)["target_directory"])'\'')"' || true

echo
echo "== local shell expansion probe with whitespace after shell =="
bash -c 'CARGO=cargo; set -u; echo "$(shell $(CARGO) metadata --format-version 1 --无-deps 2>/dev/null | python3 -c '\''import json,sys; print(json.load(sys.stdin)["target_directory"])'\'')"' || true

Repository: loreste/mako

Length of output: 3134


🏁 Script executed:

#!/bin/bash
set -u

echo "== Make output from current Makefile =="
make -p MAKO_BIN TARGET_DIR 2>/dev/null | awk '
  /^TARGET_DIR (ORIGIN\s*=)?[=:]/ || /^MAKO_BIN (ORIGIN\s*=)?[=:]/ || /^.PHONY/ || /^Makefile path/ || /^Make version/ { print }
'

echo
echo "== Local Make-like expansion probe =="
python3 - <<'PY'
from pathlib import Path
text = Path("Makefile").read_text()
lines = text.splitlines()
for i, line in enumerate(lines, 1):
    if "CARGO ?=" in line or "TARGET_DIR ?=" in line or "MAKO_BIN :=" in line:
        print(f"{i}: {line}")
PY

echo
echo "== Bash expansion with missing command for comparison =="
env -i TERM="${TERM:-dumb}" bash -c 'set -u; CARGO=cargo; echo "$(shell$(CARGO) metadata --format-version 1 --no-deps 2>/dev/null | python3 -c '\''import json,sys; print(json.load(sys.stdin)["target_directory"])'\'') 2>/dev/null || echo target"' 2>&1 || true

echo
echo "== Bash expansion with known cargo metadata succeeds =="
env -i TERM="${TERM:-dumb}" bash -c 'set -u; CARGO=cargo; echo "$(CARGO) metadata --format-version 1 --no-deps 2>/dev/null | python3 -c '\''import json,sys; print(json.load(sys.stdin)["target_directory"])'\'')"' 2>&1 || true

Repository: loreste/mako

Length of output: 1555


🏁 Script executed:

#!/bin/bash
set -u

echo "== Local Makefile expansion via GNU make print-variable =="
make -s print-% --print-targets=TARGET_DIR 2>&1 || true
make TARGET_DIR -s --no-print-directory 2>&1 || true
make -s print-MAKO_BIN 2>&1 || true

echo
echo "== Local Shell expansion for malformed $(shell$(CARGO)...) =="
bash -c '
CARGO=cargo
set -u
out="$(shell$(CARGO) metadata --format-version 1 --no-deps 2>/dev/null | python3 -c '\''import json,sys; print(json.load(sys.stdin)["target_directory"])'\'' 2>/dev/null || echo target)"
printf "TARGET_DIR=<%s>:<%s>\n" "${out}"
' 2>&1 || true

Repository: loreste/mako

Length of output: 512


🏁 Script executed:

#!/bin/bash
set -u

echo "== Local Makefile expansion via GNU make print-variable with GNU make from standard environment =="
make -s print-% 2>/dev/null || true
make TARGET_DIR -s --no-print-directory 2>/dev/null || true
make -s print-MAKO_BIN 2>/dev/null || true

echo
echo "== Local Shell expansion for malformed $(shell$(CARGO)...) =="
env -i PATH="$PATH" TERM="${TERM:-dumb}" bash -c '
CARGO=cargo
set -u
out="$(shell$(CARGO) metadata --format-version 1 --no-deps 2>/dev/null | python3 -c '\''import json,sys; print(json.load(sys.stdin)["target_directory"])'\'' 2>/dev/null || echo target)"
printf "TARGET_DIR=<%s>:<%s>\n" "${out}"
' 2>&1 || true

echo
echo "== Local Shell expansion for corrected $(shell $(CARGO)...) =="
env -i PATH="$PATH" TERM="${TERM:-dumb}" bash -c '
CARGO=cargo
set -u
out="$(shell $(CARGO) metadata --format-version 1 --no-deps 2>/dev/null | python3 -c '\''import json,sys; print(json.load(sys.stdin)["target_directory"])'\'' 2>/dev/null || echo target)"
printf "TARGET_DIR=<%s>:<%s>\n" "${out}"
' 2>&1 || true

Repository: loreste/mako

Length of output: 624


🏁 Script executed:

#!/bin/bash
set -u

if ! command -v make >/dev/null 2>&1; then
  printf 'ERROR: make is not available in this environment\n'
  exit 1
fi

echo "== Makefile lines =="
sed -n '8,12p' Makefile

echo
echo "== GNU make variable expansion =="
make -s TARGET_DIR -O --no-print-directory 2>&1 || true
make -s MAKO_BIN -O --no-print-directory 2>&1 || true

echo
echo "== Makefile parser report =="
make -p TARGET_DIR MAKO_BIN --no-print-directory 2>/dev/null | awk '
  /^TARGET_DIR / || /^MAKO_BIN / || /^Makefile path/ || /^Make version/ { print }
'

Repository: loreste/mako

Length of output: 199


🌐 Web query:

GNU make Function invocation syntax $(function arguments) whitespace after function name $(shell command)

💡 Result:

In GNU make, the syntax for a function invocation is $(function arguments) or ${function arguments} [1][2]. Regarding whitespace: 1. Function Name and Arguments: The function name must be separated from the first argument by one or more spaces or tabs [1][3]. This whitespace is considered a separator and is not included as part of the first argument's value [1][2]. 2. Leading Whitespace in Arguments: Leading whitespace in the first argument is not preserved as part of the argument's text [1][3]. However, whitespace contained within subsequent arguments is generally preserved [1][4]. 3. Shell Function: The $(shell command) function follows these same rules [5]. The command string provided to the shell function is the text following the initial separator whitespace [1][5]. Because make uses whitespace to separate the function name from its arguments, extra or unexpected whitespace can sometimes lead to issues if not handled carefully [6]. For example, if you intend to pass a string that begins with spaces as the first argument, you cannot simply write it directly because the leading spaces will be stripped [1][3]. Instead, you must use techniques like defining a variable that contains the required space character (e.g., space:= $(empty) $(empty)) and using it to construct the argument [1][3].

Citations:


Fix the malformed $(shell ...) invocation.

Make function arguments must be delimited from the function name, so add whitespace after shell: $(shell $(CARGO) metadata --format-version 1 --no-deps 2>/dev/null | python3 -c ...). As written, this is not parsed as Make’s shell function and causes MAKO_BIN to expand from the fallback target.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Makefile` around lines 10 - 11, Fix the TARGET_DIR assignment by separating
the Make shell function name from its command with whitespace, while preserving
the existing CARGO metadata pipeline and target fallback so MAKO_BIN resolves
from the actual target directory.


.PHONY: all release build install uninstall test help clean version
.PHONY: all release build install uninstall test help clean version structure

all: release

Expand All @@ -31,18 +31,11 @@ install: release
install -m 644 runtime/third_party/README.md "$(RUNTIME_DST)/third_party/"; \
fi
@if [ -d std ]; then \
rm -rf "$(SHARE_DIR)/std"; mkdir -p "$(SHARE_DIR)/std"; cp -R std/. "$(SHARE_DIR)/std/"; \
fi
@VER=$$("$(BIN_DIR)/mako" version 2>/dev/null || true); \
rm -rf "$(SHARE_DIR)/std"; mkdir -p "$(SHARE_DIR)/std"; cp -R std/. "$(SHARE_DIR)/std/"; \ fi @VER=$$("$(BIN_DIR)/mako" version 2>/dev/null || true); \
HOST=$$(uname -s 2>/dev/null)-$$(uname -m 2>/dev/null); \
TS=$$(date -u +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date); \
printf '%s\n' \
'{' \
' "schema": "mako.install.v1",' \
" \"version\": \"$$VER\"," \
TS=$$(date -u +\%Y-\%m-\%dT\%H:\%M:\%SZ 2>/dev/null \vert{}\vert{} date); \ printf '\%s\n' \ '{' \ ' "schema": "mako.install.v1",' \ " \"version\": \"$$VER\"," \
Comment on lines +34 to +36

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🔴 Critical | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

make -n install | sed -n '/rm -rf.*std/,/install-manifest.json/p' | cat -vet

Repository: loreste/mako

Length of output: 188


🏁 Script executed:

#!/bin/bash
set -u

if ! command -v make >/dev/null 2>&1; then
  echo "make not available"
fi

sed -n '20,45p' Makefile | cat -vet
printf '\n--- parse Makefile recipe continuation check ---\n'
python3 - <<'PY'
from pathlib import Path

p = Path("Makefile")
text = p.read_text()
lines = text.splitlines()
for i, line in enumerate(lines, 1):
    if 'TS=$$(date -u +\\%Y' in line or '`@VER`=$$' in line or 'cp -R std/.' in line:
        before = ''
        if 1 <= i-1 <= len(lines):
            before = repr(lines[i-1])
        print(f"line {i}: {line!r} (ends_backslash={line.endswith(chr(92))}) prev={before}")
PY

Repository: loreste/mako

Length of output: 2388


🏁 Script executed:

#!/bin/bash
set -u

python3 - <<'PY'
from pathlib import Path
p = Path("/tmp/makefile-probe.txt")
# Only preserve the Makefile recipe lines of interest as literal bytes.
p.write_text(bytes([
    ord('\t'), ord('@'), ord('i'), ord('f'), ord(' '), ord('['), ord(' '), ord('d'), ord(' '),
    ord('s'), ord('t'), ord('d'), ord(']'), ord(';'), ord(' '), ord('\\ ')
    ord('d')  # duplicate 'd' from original snippet, but this is intentionally wrong so continuation fails
]) , "utf-8"))
PY

# Show the exact line endings and continuation characters for the affected Makefile lines.
python3 - <<'PY'
from pathlib import Path
p = Path("Makefile")
text = p.read_text()
for index, line in enumerate(text.splitlines(keepends=True), 1):
    if 33 <= index <= 38:
        print(f"--- line {index} ---")
        print(repr(line))
PY

Repository: loreste/mako

Length of output: 935


🌐 Web query:

GNU Make recipe continuation backslash whitespace after backslash behavior

💡 Result:

In GNU Make, a backslash () is used to split a long logical line in a recipe into multiple physical lines. It is critical that the backslash is the very last character on the line, immediately followed by the newline [1][2]. If you place any whitespace—such as spaces or tabs—after the backslash on the same line, GNU Make will not recognize the backslash as a line continuation character [3]. Instead, the backslash and the subsequent whitespace will be treated as part of the command line itself and passed directly to the shell [1][3]. This often results in unexpected behavior, such as a "command not found" error or syntax errors, because the shell receives the trailing backslash as a literal character in the command [3]. Key behavior regarding recipe line splitting: - Preservation: Unlike how backslash/newline pairs are treated elsewhere in a makefile, GNU Make does not remove the backslash and newline characters in a recipe [1][2]. They are preserved and passed to the shell [1][2]. - Shell Interpretation: Because the backslash and newline are passed to the shell, the actual behavior depends on how your chosen shell (e.g., /bin/sh or /bin/bash) interprets them [1][2]. - Recipe Prefix: When a recipe is split, if the first character of the next physical line is the recipe prefix character (a tab by default), GNU Make removes that prefix character before passing the line to the shell [1][2]. No additional whitespace is added by GNU Make during this process [1][2].

Citations:


🌐 Web query:

GNU Make manual recipe continuation whitespace after backslash literal backslash space shell

💡 Result:

In GNU Make, a backslash immediately followed by a newline is used to split a single logical recipe line into multiple physical lines in the makefile [1][2]. Crucially, in the context of recipe lines (the commands executed by the shell), the backslash/newline pair is not removed by make [1][2]. Instead, both the backslash and the newline characters are preserved and passed directly to the shell [1][2]. Consequently, whether whitespace (such as a space) is permitted after the backslash depends entirely on how your shell interprets that sequence [1][2]. If you place a space after the backslash and before the newline: 1. The backslash is no longer immediately followed by the newline. 2. The sequence is not recognized by GNU Make as a line continuation directive for the recipe [1][2]. 3. The shell will receive the space, the backslash, and the newline as part of the command line, which will likely result in a syntax error or unintended behavior depending on the shell [1][2]. For splitting recipe lines, you must place the backslash at the very end of the line, immediately before the newline character [1][2]. If the first character of the next physical line is the recipe prefix character (a tab by default), GNU Make will remove only that tab character; it does not add any whitespace to the recipe [1][2]. If you need to include a newline in a quoted string passed to the shell, it is often safer to store the command in a GNU Make variable, where standard makefile line-continuation rules apply and backslash/newline sequences are stripped [1][2].

Citations:


🌐 Web query:

Make 4.4.1 split-recipes backslash line continuation Makefile lines "The backslash must be the last character"

💡 Result:

In GNU Make (including version 4.4.1), you can split long lines in your Makefile for better readability by using the backslash (\) character [1][2][3][4]. To use this feature correctly, the backslash must be the last character on the physical line before the newline character [1][5][6]. Key points regarding this behavior: - Requirement: The backslash must immediately precede the newline [1][5]. If there are any characters (including spaces or tabs) after the backslash on that same line, it will not act as a line continuation and will instead be treated as part of the line content. - Non-recipe lines: Outside of recipes, GNU Make converts the backslash-newline sequence into a single space character [2][3]. - Recipe lines: Inside recipes, the backslash-newline sequence is preserved and passed to the shell [1][5]. How the shell interprets this sequence depends on the specific shell being used (typically /bin/sh) [1][5]. In most cases, the shell treats the backslash-newline as a line continuation, allowing the command to span multiple lines [5][6]. - Readability: While GNU Make does not impose a limit on the length of a line, using backslashes to break up long commands or complex variable definitions is a standard and widely accepted practice to improve makefile maintainability [2][3][7].

Citations:


🌐 Web query:

site:gnu.org/software/make/manual/html_node/Recipe-In-Preamble.html "\"When you use a backslash-newline\" recipe lines"

💡 Result:

In GNU make, a backslash-newline in a recipe line is not removed; both characters are preserved and passed to the shell. If the next line starts with the recipe prefix (a tab by default), that one character is removed, and no whitespace is added. (gnu.org)

Citations:


Fix the malformed GNU Make continuations before running make install.

Lines 34 and 36 leave whitespace after recipe \ continuations, so the fi/@VER=... and TS=.../printf boundaries are not kept on one Make command line. GNU Make passes the continuation newline and tab literally to the shell, so the manifest command is received with fi, @VER=..., and printf on separate lines and fails before writing install-manifest.json.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Makefile` around lines 34 - 36, The install recipe has malformed GNU Make
line continuations because whitespace follows the trailing backslashes,
separating the shell commands. In the install target around the `fi`, `VER`,
`TS`, and `printf` commands, remove all characters after each continuation
backslash so the backslash is the final character on the line and the complete
manifest command remains one shell invocation.

" \"prefix\": \"$(PREFIX)\"," \
" \"host\": \"$$HOST\"," \
" \"installedAt\": \"$$TS\"," \
" \"host\": \"$$HOST\"," \ " \"installedAt\": \"$$TS\"," \
" \"runtime\": \"$(RUNTIME_DST)\"," \
" \"std\": \"$(SHARE_DIR)/std\"" \
'}' > "$(SHARE_DIR)/install-manifest.json"
Comment on lines +36 to 41

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

tmp="$(mktemp)"
printf '\%s\n' '{' '  "schema": "mako.install.v1",' '}' > "$tmp"
python3 -m json.tool "$tmp"

Repository: loreste/mako

Length of output: 192


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '--- Makefile relevant section ---\n'
sed -n '30,50p' Makefile | cat -n

printf '\n--- behavioral probes ---\n'
tmp="$(mktemp)"
printf '%s\n' '{' '{"a":1}' > "$tmp"
printf -- 'single printf output:\n'
sed -n '1,5p' "$tmp"

printf '\nprintf \"\\%%s\\n\":\n'
printf '\%s\n' '{' '  "schema": "mako.install.v1",' '}' > "$tmp"
sed -n '1,5p' "$tmp"
python3 -m json.tool "$tmp" || true

printf '\nprintf \"%%%%s\\n\":\n'
printf '%s\n' '{' '  "schema": "mako.install.v1",' '}' > "$tmp"
sed -n '1,5p' "$tmp"

printf '\nmanifold printf behavior check:\n'
for line in 'printf '\''\%s\n'\'' '\''{'\''' 'printf '\''%s\n'\'' '\''{'\'''; do
  tmp="$(mktemp)"
  (eval "$line" 'a' 'b') > "$tmp"
  printf '%s ->' "$line"
  sed -n '1p' "$tmp" | od -c | tr '\n' ' '
  printf '\n'
done

Repository: loreste/mako

Length of output: 241


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- Makefile relevant section ---'
sed -n '30,50p' Makefile | cat -n

printf '%s\n' ''
printf '%s\n' '--- behavioral probes ---'
tmp="$(mktemp)"
printf '%s\n' '{' '{"a":1}' > "$tmp"
printf 'single printf output:\n'
sed -n '1,5p' "$tmp"

printf '%s\n' ''
printf 'printf with literal backslash format:\n'
printf '\%s\n' '{' '  "schema": "mako.install.v1",' '}' > "$tmp"
sed -n '1,5p' "$tmp"
python3 -m json.tool "$tmp" || true

printf '%s\n' ''
printf 'printf with escaped backslash format:\n'
printf '%s\n' '{' '  "schema": "mako.install.v1",' '}' > "$tmp"
sed -n '1,5p' "$tmp"

printf '%s\n' ''
printf 'printf with escaped backslash format plus newline, if supported:\n'
printf '%s\n' '{' '  "schema": "mako.install.v1",' '}' > "$tmp"
sed -n '1,5p' "$tmp"

Repository: loreste/mako

Length of output: 1731


Emit the manifest with printf '%s\n'.

The literal \%s\n is passed to printf, which emits each JSON line with a leading \, producing invalid JSON.

Proposed fix
-	printf '\%s\n' \
+	printf '%s\n' \
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
TS=$$(date -u +\%Y-\%m-\%dT\%H:\%M:\%SZ 2>/dev/null \vert{}\vert{} date); \ printf '\%s\n' \ '{' \ ' "schema": "mako.install.v1",' \ " \"version\": \"$$VER\"," \
" \"prefix\": \"$(PREFIX)\"," \
" \"host\": \"$$HOST\"," \
" \"installedAt\": \"$$TS\"," \
" \"host\": \"$$HOST\"," \ " \"installedAt\": \"$$TS\"," \
" \"runtime\": \"$(RUNTIME_DST)\"," \
" \"std\": \"$(SHARE_DIR)/std\"" \
'}' > "$(SHARE_DIR)/install-manifest.json"
TS=$$(date -u +\%Y-\%m-\%dT\%H:\%M:\%SZ 2>/dev/null \vert{}\vert{} date); \
printf '%s\n' \
'{' \
' "schema": "mako.install.v1",' \
" \"version\": \"$$VER\"," \
" \"prefix\": \"$(PREFIX)\"," \
" \"host\": \"$$HOST\"," \
" \"installedAt\": \"$$TS\"," \
" \"runtime\": \"$(RUNTIME_DST)\"," \
" \"std\": \"$(SHARE_DIR)/std\"" \
'}' > "$(SHARE_DIR)/install-manifest.json"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Makefile` around lines 36 - 41, Update the manifest-generation printf
invocation in the Makefile to pass the format string as `%s\n` rather than
`\%s\n`, preserving the existing JSON arguments and output path so each manifest
line is emitted without a leading backslash.

Expand All @@ -63,8 +56,11 @@ version:
$(CARGO) run --quiet --release -- --version

help:
@echo "Targets: release install uninstall test version help"
@echo "Targets: release install uninstall test version help structure"
@echo "PREFIX=$(PREFIX) RUNTIME_DST=$(RUNTIME_DST)"

clean:
$(CARGO) clean

structure:
@bash scripts/update_structure.sh
Loading