-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
105 lines (84 loc) · 3.58 KB
/
Makefile
File metadata and controls
105 lines (84 loc) · 3.58 KB
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# Root directory structure
SRC_DIR := src
BIN_DIR := bin
LOG_DIR := log
TESTS_DIR := test
CC := clang-15
# CXX := clang++-15 # Not used currently
CFLAGS := -g3 -gdwarf-4 -pthread -Wall -Werror -Wno-gnu -O0 --std=gnu2x -fPIC
# CXXFLAGS := -g3 -gdwarf-4 -pthread -Wall -Werror -Wno-gnu -O0 --std=gnu++2b -fPIC # Not used currently
# Include paths for all source directories
CPPFLAGS := -I$(SRC_DIR) -I$(SRC_DIR)/fs -I$(SRC_DIR)/os -I$(SRC_DIR)/shell
.PHONY: all clean info
# --- Source Files ---
# Find all .c files in subdirectories
FS_SRC := $(wildcard $(SRC_DIR)/fs/*.c)
OS_SRC := $(wildcard $(SRC_DIR)/os/*.c)
SHELL_SRC := $(wildcard $(SRC_DIR)/shell/*.c)
# --- Object Files ---
# Generate corresponding .o file paths
FS_OBJS := $(FS_SRC:.c=.o)
OS_OBJS := $(OS_SRC:.c=.o)
SHELL_OBJS := $(SHELL_SRC:.c=.o)
# --- Executable Definitions ---
PENNOS_BIN := $(BIN_DIR)/pennos
PENNFAT_BIN := $(BIN_DIR)/pennfat # Target name for the standalone tool
# --- Object Lists for Each Executable ---
# Objects needed for pennos (OS Simulator)
# Includes: OS code, FS code (k_* and s_*), pennsh shell code (pennsh, builtin, parser, init, stress), p_errno
PENNOS_MAIN_SRC := $(SRC_DIR)/shell/pennos.c
PENNOS_MAIN_OBJ := $(PENNOS_MAIN_SRC:.c=.o)
# Exclude objects specific to the standalone pennfat tool
PENNOS_SHELL_OBJS := $(filter-out $(SRC_DIR)/shell/pennfat_shell.o $(SRC_DIR)/shell/command.o, $(SHELL_OBJS))
PENNOS_OBJS := $(PENNOS_MAIN_OBJ) $(OS_OBJS) $(FS_OBJS) $(PENNOS_SHELL_OBJS) $(SRC_DIR)/os/Vec.o
# Objects needed for pennfat (Standalone Tool)
# Includes: Standalone shell main, command implementations, FS kernel code (k_*), FS utils, p_errno
PENNFAT_MAIN_SRC := $(SRC_DIR)/shell/pennfat_shell.c
PENNFAT_MAIN_OBJ := $(PENNFAT_MAIN_SRC:.c=.o)
PENNFAT_CMD_OBJS := $(SRC_DIR)/shell/command.o
PENNFAT_FS_CORE_OBJS := $(SRC_DIR)/fs/pennfat.o $(SRC_DIR)/fs/fat_util.o $(SRC_DIR)/fs/fs_state.o $(SRC_DIR)/fs/fd_table.o
PENNFAT_ERR_OBJ := $(SRC_DIR)/os/p_errno.o # p_errno might be used by command.c
PENNFAT_OBJS := $(PENNFAT_MAIN_OBJ) $(PENNFAT_CMD_OBJS) $(PENNFAT_FS_CORE_OBJS) $(PENNFAT_ERR_OBJ) $(SRC_DIR)/fs/fssyscalls.o $(SRC_DIR)/os/scheduler.o $(SRC_DIR)/os/Vec.o $(SRC_DIR)/os/spthread.o $(SRC_DIR)/os/kernel.o $(SRC_DIR)/os/panic.o $(SRC_DIR)/os/scheduler_wrapper.o $(SRC_DIR)/os/syscalls.o $(SRC_DIR)/os/pcb.o $(SRC_DIR)/os/pcb_table.o $(SRC_DIR)/os/logger.o $(SRC_DIR)/os/job.o
# --- Build Rules ---
# Default target: build both executables
all: $(BIN_DIR) $(LOG_DIR) $(PENNOS_BIN) $(PENNFAT_BIN)
# Create output directories
$(BIN_DIR):
mkdir -p $@
$(LOG_DIR):
mkdir -p $@
# Link pennos executable
$(PENNOS_BIN): $(PENNOS_OBJS)
@echo "Linking $@..."
$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $(filter %.o,$^) -lm # Link PENNOS_OBJS
# Link pennfat standalone executable
$(PENNFAT_BIN): $(PENNFAT_OBJS)
@echo "Linking $@..."
$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $(filter %.o,$^) -lm # Link PENNFAT_OBJS
# Generic rule to compile .c files into .o files
# Places object files alongside source files
%.o: %.c
@echo "Compiling $<..."
$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
# --- Utility Rules ---
info:
@echo "--- Source Files ---"
@echo "FS_SRC: $(FS_SRC)"
@echo "OS_SRC: $(OS_SRC)"
@echo "SHELL_SRC: $(SHELL_SRC)"
@echo ""
@echo "--- Object Files ---"
@echo "FS_OBJS: $(FS_OBJS)"
@echo "OS_OBJS: $(OS_OBJS)"
@echo "SHELL_OBJS: $(SHELL_OBJS)"
@echo ""
@echo "--- $(PENNOS_BIN) Objects ---"
@echo "$(PENNOS_OBJS)"
@echo ""
@echo "--- $(PENNFAT_BIN) Objects ---"
@echo "$(PENNFAT_OBJS)"
clean:
@echo "Cleaning project..."
rm -rf $(BIN_DIR) $(LOG_DIR)
# Remove object files from all source directories
find $(SRC_DIR) -name '*.o' -delete