diff --git a/.gitignore b/.gitignore index 1efc3f0..0660316 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ microzig-deploy/ .gdbinit .lldbinit .direnv/ +__pycache__/ \ No newline at end of file diff --git a/examples/raspberrypi-rp2040/build.zig b/examples/raspberrypi-rp2040/build.zig index a093405..73fe7a2 100644 --- a/examples/raspberrypi-rp2040/build.zig +++ b/examples/raspberrypi-rp2040/build.zig @@ -27,7 +27,6 @@ const available_examples = [_]Example{ pub fn build(b: *std.Build) void { const microzig = MicroZig.createBuildEnvironment(b, .{}); - const optimize = b.standardOptimizeOption(.{}); const show_targets_step = b.step("show-targets", "Shows all available MicroZig targets"); diff --git a/examples/stmicro-stm32/build.zig b/examples/stmicro-stm32/build.zig index 471a727..653f834 100644 --- a/examples/stmicro-stm32/build.zig +++ b/examples/stmicro-stm32/build.zig @@ -1,22 +1,27 @@ const std = @import("std"); -const stm32 = @import("stm32"); +const MicroZig = @import("microzig-build"); const available_examples = [_]Example{ - .{ .name = "stm32f103x8", .target = stm32.chips.stm32f103x8, .file = "src/blinky.zig" }, - // TODO: .{ .name = "stm32f303vc", .target = stm32.chips.stm32f303vc, .file = "src/blinky.zig" }, - // TODO: .{ .name = "stm32f407vg", .target = stm32.chips.stm32f407vg, .file = "src/blinky.zig" }, - // TODO: .{ .name = "stm32f429zit6u", .target = stm32.chips.stm32f429zit6u, .file = "src/blinky.zig" }, - // TODO: .{ .name = "stm32f3discovery", .target = stm32.boards.stm32f3discovery, .file = "src/blinky.zig" }, - // TODO: .{ .name = "stm32f4discovery", .target = stm32.boards.stm32f4discovery, .file = "src/blinky.zig" }, - // TODO: .{ .name = "stm3240geval", .target = stm32.boards.stm3240geval, .file = "src/blinky.zig" }, - // TODO: .{ .name = "stm32f429idiscovery", .target = stm32.boards.stm32f429idiscovery, .file = "src/blinky.zig" }, + .{ .target = "chip:stm32f103x8",.name = "stm32f103x8", .file = "src/blinky.zig" }, + // TODO: .{ .target = "chip:stm32f303vc", .name = "stm32f303vc", .file = "src/blinky.zig" }, + // TODO: .{ .target = "chip:stm32f407vg", .name = "stm32f407vg", .file = "src/blinky.zig" }, + // TODO: .{ .target = "chip:stm32f429zit6u", .name = "stm32f429zit6u", .file = "src/blinky.zig" }, + // TODO: .{ .target = "board:stm32f3discovery", .name = "stm32f3discovery", .file = "src/blinky.zig" }, + // TODO: .{ .target = "board:stm32f4discovery", .name = "stm32f4discovery", .file = "src/blinky.zig" }, + // TODO: .{ .target = "board:stm3240geval", .name = "stm3240geval", .file = "src/blinky.zig" }, + // TODO: .{ .target = "board:stm32f429idiscovery", .name = "stm32f429idiscovery", .file = "src/blinky.zig" }, }; pub fn build(b: *std.Build) void { - const microzig = @import("microzig").init(b, "microzig"); - const optimize = .ReleaseSmall; // The others are not really an option on AVR + const microzig = MicroZig.createBuildEnvironment(b, .{}); + const optimize = b.standardOptimizeOption(.{}); + + const show_targets_step = b.step("show-targets", "Shows all available MicroZig targets"); + show_targets_step.dependOn(microzig.getShowTargetsStep()); for (available_examples) |example| { + const target = microzig.findTarget(example.target).?; + // `addFirmware` basically works like addExecutable, but takes a // `microzig.Target` for target instead of a `std.zig.CrossTarget`. // @@ -24,7 +29,7 @@ pub fn build(b: *std.Build) void { // cpu and potentially the board as well. const firmware = microzig.addFirmware(b, .{ .name = example.name, - .target = example.target, + .target = target, .optimize = optimize, .source_file = .{ .path = example.file }, }); @@ -41,7 +46,7 @@ pub fn build(b: *std.Build) void { } const Example = struct { - target: @import("microzig").Target, + target: []const u8, name: []const u8, file: []const u8, -}; +}; \ No newline at end of file diff --git a/examples/stmicro-stm32/build.zig.zon b/examples/stmicro-stm32/build.zig.zon deleted file mode 100644 index b6063ea..0000000 --- a/examples/stmicro-stm32/build.zig.zon +++ /dev/null @@ -1,14 +0,0 @@ -.{ - .name = "microzig-stmicro-stm32-examples", - .version = "0.1.0", - .dependencies = .{ - .microzig = .{ - .url = "https://github.com/ZigEmbeddedGroup/microzig/archive/c6c9ec4516f57638e751141085c9d76120990312.tar.gz", - .hash = "1220af58bdaa721b8189f3a7adfda660517dd354463463388e96d69fe4ceccf80b92", - }, - .stm32 = .{ - .url = "https://github.com/ZigEmbeddedGroup/stmicro-stm32/archive/237890d49ee795110a63df2c45bdd6f6a0029a72.tar.gz", - .hash = "1220960897777f9713fa1055ffdf1fbad1518b2f62bd2f2ae39b887821dbf0781df0", - }, - }, -} diff --git a/examples/stmicro-stm32/microzig-package.json b/examples/stmicro-stm32/microzig-package.json new file mode 100644 index 0000000..674b76e --- /dev/null +++ b/examples/stmicro-stm32/microzig-package.json @@ -0,0 +1,7 @@ +{ + "package_name": "stmicro/stm32", + "package_type": "example", + "inner_dependencies": [ + "stmicro/stm32" + ] +} \ No newline at end of file diff --git a/tools/bundle.py b/tools/bundle.py index 4878ccb..4e0e215 100755 --- a/tools/bundle.py +++ b/tools/bundle.py @@ -7,7 +7,7 @@ # -import sys, os, subprocess,datetime, re, shutil, json, hashlib +import sys, os, datetime, re, shutil, json, hashlib from pathlib import Path, PurePosixPath from dataclasses import dataclass, field from dataclasses_json import dataclass_json, config as dcj_config, Exclude as JsonExclude @@ -18,9 +18,14 @@ import pathspec import stat import tarfile + + from marshmallow import fields as mm_fields from typing import Optional, Any +from lib.common import execute_raw, execute, slurp, check_zig_version, check_required_tools +import lib.common as common + LEGAL_PACKAGE_NAME = re.compile("^[A-Za-z]$") VERBOSE = False @@ -36,7 +41,7 @@ REPO_ROOT = Path(__file__).parent.parent assert REPO_ROOT.is_dir() - +common.VERBOSE = VERBOSE class PackageType(StrEnum): build = "build" @@ -138,34 +143,8 @@ FILE_STAT_MAP = { def file_type(path: Path) -> str: return FILE_STAT_MAP[stat.S_IFMT( path.stat().st_mode)] -def execute_raw(*args,hide_stderr = False,**kwargs): - args = [ str(f) for f in args] - if VERBOSE: - print(*args) - res = subprocess.run(args, **kwargs, check=False) - if res.stderr is not None and (not hide_stderr or res.returncode != 0): - sys.stderr.buffer.write(res.stderr) - if res.returncode != 0: - sys.stderr.write(f"command {' '.join(args)} failed with exit code {res.returncode}") - sys.exit(res.returncode) - return res - -def execute(*args,**kwargs): - execute_raw(*args, **kwargs, capture_output=False) - -def slurp(*args, **kwargs): - res = execute_raw(*args, **kwargs, capture_output=True) - return res.stdout - -def check_required_tools(): - for tool in REQUIRED_TOOLS: - slurp("which", tool) -def check_zig_version(expected): - actual = slurp("zig", "version") - if actual.strip() != expected.encode(): - raise RuntimeError(f"Unexpected zig version! Expected {expected}, but found {actual.strip()}!") def build_zig_tools(): # ensure we have our tools available: @@ -251,7 +230,7 @@ def get_batch_timestamp(): def main(): - check_required_tools() + check_required_tools(REQUIRED_TOOLS) check_zig_version("0.11.0") diff --git a/tools/lib/common.py b/tools/lib/common.py new file mode 100644 index 0000000..4d72ca9 --- /dev/null +++ b/tools/lib/common.py @@ -0,0 +1,32 @@ + +import subprocess, sys + +VERBOSE = False + +def execute_raw(*args,hide_stderr = False,**kwargs): + args = [ str(f) for f in args] + if VERBOSE: + print(*args) + res = subprocess.run(args, **kwargs, check=False) + if res.stderr is not None and (not hide_stderr or res.returncode != 0): + sys.stderr.buffer.write(res.stderr) + if res.returncode != 0: + sys.stderr.write(f"command {' '.join(args)} failed with exit code {res.returncode}") + sys.exit(res.returncode) + return res + +def execute(*args,**kwargs): + execute_raw(*args, **kwargs, capture_output=False) + +def slurp(*args, **kwargs): + res = execute_raw(*args, **kwargs, capture_output=True) + return res.stdout + +def check_zig_version(expected): + actual = slurp("zig", "version") + if actual.strip() != expected.encode(): + raise RuntimeError(f"Unexpected zig version! Expected {expected}, but found {actual.strip()}!") + +def check_required_tools(tools): + for tool in tools: + slurp("which", tool) \ No newline at end of file diff --git a/tools/validate-all-examples.sh b/tools/validate-all-examples.sh new file mode 100755 index 0000000..494efb8 --- /dev/null +++ b/tools/validate-all-examples.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +root="$(dirname "$(realpath "$0")")" +tmpdir="/tmp/microzig-test" + +mkdir -p "${tmpdir}" + +"${root}/validate-example.py" --build-root "${tmpdir}" --example raspberrypi/rp2040 +"${root}/validate-example.py" --build-root "${tmpdir}" --example stmicro/stm32 diff --git a/tools/validate-example.py b/tools/validate-example.py new file mode 100755 index 0000000..12dac7b --- /dev/null +++ b/tools/validate-example.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 + + +from lib.common import execute_raw, execute, slurp, check_zig_version, check_required_tools +from pathlib import Path, PurePosixPath +import argparse +import sys +import shutil + +REQUIRED_TOOLS = ["zig", "curl", "tar", "gunzip"] + + +def main(): + + check_required_tools(REQUIRED_TOOLS) + + check_zig_version("0.11.0") + + parser = argparse.ArgumentParser() + + parser.add_argument("--example", type=PurePosixPath, required=True) + parser.add_argument("--build-root", type=Path, required=True) + args = parser.parse_args() + + example_id: PurePosixPath = args.example + build_root: Path = args.build_root + + if len(example_id.parents) != 2 or str(example_id.parents[1]) != ".": + print(f"example must be /", file=sys.stderr) + exit(1) + + + example_group: str = example_id.parent.name + example_name: str = example_id.name + + if not build_root.is_dir(): + print(f"{build_root} is not a directory", file=sys.stderr) + exit(1) + + execute( + "curl", + "-o", + f"{example_name}.tar.gz", + f"https://public.devspace.random-projects.net/examples/{example_group}/{example_name}.tar.gz", + cwd=build_root, + ) + + any_path = slurp( + "tar", + "-tf", + f"{example_name}.tar.gz", + cwd=build_root, + ).splitlines()[0].decode() + + root_folder_name = any_path.split(sep='/')[0] + + example_build_root = build_root / root_folder_name + + if example_build_root.exists(): + shutil.rmtree(example_build_root) + + execute( + "tar", + "-xf", + f"{example_name}.tar.gz", + cwd=build_root, + ) + + # print(list(example_build_root.glob("*"))) + + execute( + "zig", + "build", + cwd = example_build_root, + ) + + out_dir = example_build_root / "zig-out" + + print("all files:") + for path in out_dir.rglob("*"): + if path.is_file(): + print(f"- {path}") + +if __name__ == "__main__": + main()