summaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile58
1 files changed, 58 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..4dcc90a
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,58 @@
+# Compiler and flags
+CC = gcc
+CFLAGS = -Wall -O2
+
+# Source and target names
+TARGET = chproc
+SRC = $(TARGET).c
+PRE = $(TARGET).i
+ASM = $(TARGET).s
+OBJ = $(TARGET).o
+
+# Example argument for test
+ARG = --list init
+
+# Default: build executable
+all: $(TARGET)
+
+# Stage 1: Preprocess
+$(PRE): $(SRC)
+ $(CC) -E $(CFLAGS) $< -o $@
+
+# Stage 2: Compile to assembly
+$(ASM): $(PRE)
+ $(CC) -S $(CFLAGS) $< -o $@
+
+# Stage 3: Assemble to object file
+$(OBJ): $(ASM)
+ $(CC) -c $(CFLAGS) $< -o $@
+
+# Stage 4: Link object to executable
+$(TARGET): $(OBJ)
+ $(CC) $(CFLAGS) $< -o $@
+
+# Run tests
+define run_test
+ @name="$(1) $(2)"; \
+ width=40; \
+ printf "%s" "$$name"; \
+ dots=$$((width - $${#name})); \
+ for i in $$(seq 1 $$dots); do printf "."; done; \
+ ./$(TARGET) $(2) >/dev/null 2>&1; \
+ ec=$$?; \
+ if [ $$ec -eq 0 ] || [ $$ec -eq 2 ]; then \
+ echo " OK"; \
+ else \
+ echo " FAILED (exit $$ec)"; \
+ exit 1; \
+ fi
+endef
+
+test: $(TARGET)
+ $(call run_test,$(TARGET) no args,)
+ $(call run_test,$(TARGET),$(ARG),)
+
+# Clean all generated files
+clean:
+ rm -v -f $(PRE) $(ASM) $(OBJ) $(TARGET)
+