From f06ab846e3e297007afe65d9f815afff4638af0d Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Sat, 15 Oct 2022 12:23:23 -0700 Subject: Automatically discover programs and incorporate into the binary --- Makefile | 10 +++++++++- main.cpp | 10 +--------- programs/programs.h | 7 +++++++ scripts/mkprograms | 39 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 10 deletions(-) create mode 100644 programs/programs.h create mode 100755 scripts/mkprograms diff --git a/Makefile b/Makefile index b6a5e0d..18d889f 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ clean: .SECONDARY: .SUFFIXES: -override SOURCES := $(shell find -\( -name build -prune -\) -o -\( -\( -name \*.bin -o -name \*.cpp -o -name \*.pal -\) -print -\)) +override SOURCES := $(shell find -\( -name build -prune -\) -o -\( -\( -name \*.bin -o -name \*.cpp -o -name \*.pal -\) -print -\)) $(BUILD)/programs/programs.cpp override OBJECTS := $(addprefix $(BUILD)/, $(addsuffix .o, $(basename $(SOURCES)))) override DEPENDS := $(addprefix $(BUILD)/, $(addsuffix .d, $(basename $(SOURCES)))) @@ -56,6 +56,14 @@ $(BUILD)/%.o: %.cpp @mkdir -p $(dir $@) $(CXX) $(CXXFLAGS) $(COMPILE_FLAGS) -c -o $@ $< +$(BUILD)/%.o: $(BUILD)/%.cpp + $(CXX) $(CXXFLAGS) $(COMPILE_FLAGS) -c -o $@ $< + +$(BUILD)/programs/programs.cpp: + @mkdir -p $(dir $@) + scripts/mkprograms > $@ +.PHONY: $(BUILD)/programs/programs.cpp + $(BUILD)/minigolf: $(OBJECTS) @mkdir -p $(dir $@) $(CXX) $(CXXFLAGS) -o $@ -Wl,--start-group $+ -Wl,--end-group $(LINK_FLAGS) diff --git a/main.cpp b/main.cpp index 63dcb50..28dcbf7 100644 --- a/main.cpp +++ b/main.cpp @@ -2,19 +2,11 @@ #include #include #include -#include #include #include #include "isa/checker.h" - -extern std::uint8_t _binary_count_bin_start[]; -extern std::uint8_t _binary_fib_bin_start[]; - -static const std::map programs = { - { "count", _binary_count_bin_start }, - { "fib", _binary_fib_bin_start }, -}; +#include "programs/programs.h" int load_program(checker &checker, const std::uint8_t *program) { bool seen_non_leader = false; diff --git a/programs/programs.h b/programs/programs.h new file mode 100644 index 0000000..dbe14e2 --- /dev/null +++ b/programs/programs.h @@ -0,0 +1,7 @@ +#pragma once + +#include +#include +#include + +extern const std::map programs; diff --git a/scripts/mkprograms b/scripts/mkprograms new file mode 100755 index 0000000..0529e63 --- /dev/null +++ b/scripts/mkprograms @@ -0,0 +1,39 @@ +#!/bin/bash + +cd programs + +cat < +#include +#include + +#include "programs/programs.h" + +extern "C" { +END + +for f in *; do + if [[ "$f" == "programs.h" ]]; then + continue + fi + b="${f%.*}" + echo " extern std::uint8_t _binary_${b}_bin_start[];" +done + +cat < programs = { +END + +for f in *; do + if [[ "$f" == "programs.h" ]]; then + continue + fi + b="${f%.*}" + echo " { \"$b\", _binary_${b}_bin_start }," +done + +cat <