blob: 23a3caa72066e3f62a823aa5046eeb81363eb7aa (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
# Compiler and flags
CC = gcc
CFLAGS = -Wall -O2
# Directories
SRC_DIR = src
BIN_DIR = bin
# Installation directory
PREFIX ?= /usr/local
BINDIR ?= $(PREFIX)/bin
# Source and target names
TARGET = chproc
SRC = $(SRC_DIR)/$(TARGET).c
PRE = $(BIN_DIR)/$(TARGET).i
ASM = $(BIN_DIR)/$(TARGET).s
OBJ = $(BIN_DIR)/$(TARGET).o
BIN = $(BIN_DIR)/$(TARGET)
# Example argument for test
ARG = --list init
# Default: build executable
all: $(BIN)
# Ensure bin directory exists
$(BIN_DIR):
mkdir -p $(BIN_DIR)
# Stage 1: Preprocess
$(PRE): $(SRC) | $(BIN_DIR)
$(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
$(BIN): $(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; \
./$(BIN) $(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
# Install
install: $(BIN)
@echo "Installing $(TARGET) to $(BINDIR)"
mkdir -p $(BINDIR)
cp -v $(BIN) $(BINDIR)/
# Uninstall
uninstall:
@echo "Removing $(TARGET) from $(BINDIR)"
rm -v -f $(BINDIR)/$(TARGET)
# Test
test: $(BIN)
$(call run_test,$(TARGET),no args)
$(call run_test,$(TARGET),$(ARG))
# Clean all generated files
clean:
rm -v -f $(BIN_DIR)/$(TARGET).* $(BIN)
|