Makefile · 2391 bytes Raw Blame History
1 # Makefile for modular fuss
2 FC = gfortran
3 FFLAGS = -O2 -Wall -ffree-line-length-none
4 SRC_DIR = src
5 BUILD_DIR = build
6 BIN_DIR = .
7 VERSION := $(shell cat VERSION 2>/dev/null || echo "unknown")
8
9 # Module files (order matters for dependencies)
10 MODULES = version_module.f90 types_module.f90 cache_module.f90 terminal_module.f90 git_module.f90 tree_module.f90 display_module.f90
11 MODULE_OBJS = $(MODULES:%.f90=$(BUILD_DIR)/%.o)
12
13 # Main program
14 MAIN = fuss_main.f90
15 MAIN_OBJ = $(BUILD_DIR)/fuss_main.o
16
17 # Target executable
18 TARGET = $(BIN_DIR)/fuss
19
20 # Disable parallel builds to ensure proper module compilation order
21 .NOTPARALLEL:
22
23 .PHONY: all clean
24
25 all: $(TARGET)
26
27 $(BUILD_DIR):
28 mkdir -p $(BUILD_DIR)
29
30 # Generate version module before building
31 $(SRC_DIR)/version_module.f90: VERSION
32 @echo "Generating version module..."
33 @echo "module version_module" > $@
34 @echo " implicit none" >> $@
35 @echo " character(len=*), parameter :: VERSION = '$(VERSION)'" >> $@
36 @echo "end module version_module" >> $@
37
38 # Build modules with explicit dependencies
39 $(BUILD_DIR)/version_module.o: $(SRC_DIR)/version_module.f90 | $(BUILD_DIR)
40 $(FC) $(FFLAGS) -J$(BUILD_DIR) -c $< -o $@
41
42 $(BUILD_DIR)/types_module.o: $(SRC_DIR)/types_module.f90 | $(BUILD_DIR)
43 $(FC) $(FFLAGS) -J$(BUILD_DIR) -c $< -o $@
44
45 $(BUILD_DIR)/cache_module.o: $(SRC_DIR)/cache_module.f90 $(BUILD_DIR)/types_module.o | $(BUILD_DIR)
46 $(FC) $(FFLAGS) -J$(BUILD_DIR) -I$(BUILD_DIR) -c $< -o $@
47
48 $(BUILD_DIR)/terminal_module.o: $(SRC_DIR)/terminal_module.f90 | $(BUILD_DIR)
49 $(FC) $(FFLAGS) -J$(BUILD_DIR) -c $< -o $@
50
51 $(BUILD_DIR)/git_module.o: $(SRC_DIR)/git_module.f90 $(BUILD_DIR)/types_module.o $(BUILD_DIR)/cache_module.o | $(BUILD_DIR)
52 $(FC) $(FFLAGS) -J$(BUILD_DIR) -I$(BUILD_DIR) -c $< -o $@
53
54 $(BUILD_DIR)/tree_module.o: $(SRC_DIR)/tree_module.f90 $(BUILD_DIR)/types_module.o | $(BUILD_DIR)
55 $(FC) $(FFLAGS) -J$(BUILD_DIR) -I$(BUILD_DIR) -c $< -o $@
56
57 $(BUILD_DIR)/display_module.o: $(SRC_DIR)/display_module.f90 $(BUILD_DIR)/tree_module.o $(BUILD_DIR)/types_module.o | $(BUILD_DIR)
58 $(FC) $(FFLAGS) -J$(BUILD_DIR) -I$(BUILD_DIR) -c $< -o $@
59
60 # Build main program
61 $(MAIN_OBJ): $(SRC_DIR)/$(MAIN) $(MODULE_OBJS) | $(BUILD_DIR)
62 $(FC) $(FFLAGS) -J$(BUILD_DIR) -I$(BUILD_DIR) -c $< -o $@
63
64 # Link everything
65 $(TARGET): $(MODULE_OBJS) $(MAIN_OBJ)
66 $(FC) $(FFLAGS) -o $@ $^
67
68 clean:
69 rm -rf $(BUILD_DIR) $(TARGET) $(SRC_DIR)/version_module.f90