aboutsummaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile28
1 files changed, 19 insertions, 9 deletions
diff --git a/Makefile b/Makefile
index 25c0c94..f6ce2bb 100644
--- a/Makefile
+++ b/Makefile
@@ -1,19 +1,29 @@
.DEFAULT_GOAL := bin/game
-bin:
- @mkdir -p $@
-
-bin/tilemap.o: src/tilemap.scm | bin
- csc -c -J src/tilemap.scm -unit tilemap -o $@
+# Get all .scm modules (excluding game.scm)
+MODULE_FILES := $(wildcard src/*.scm)
+MODULE_FILES := $(filter-out src/game.scm, $(MODULE_FILES))
+MODULE_NAMES := $(patsubst src/%.scm,%,$(MODULE_FILES))
+OBJECT_FILES := $(patsubst %,bin/%.o,$(MODULE_NAMES))
-bin/game.o: src/game.scm | bin
- csc -c src/game.scm -uses tilemap -o $@
+# Main target - compile game.o with -uses flags, then link all .o files
+bin/game: bin/game.o $(OBJECT_FILES)
+ csc bin/game.o $(OBJECT_FILES) -o bin/game
-bin/game: bin/tilemap.o bin/game.o | bin
- csc -o bin/game bin/tilemap.o bin/game.o
+# Compile game.scm to game.o (declare that it uses the modules)
+bin/game.o: src/game.scm $(OBJECT_FILES) | bin
+ csc -c src/game.scm -o bin/game.o -I bin $(patsubst %,-uses %,$(MODULE_NAMES))
+bin:
+ @mkdir -p $@
+# Pattern rule: compile each module as a library unit (unique C toplevel name)
+# so linking multiple .o files doesn't cause "multiple definition of C_toplevel".
+bin/%.o bin/%.import.scm: src/%.scm | bin
+ csc -c -J -unit $* src/$*.scm -o bin/$*.o
+ mv $*.import.scm bin/
.PHONY: clean
clean:
rm -rf bin
rm -f *.import.scm game
+ rm -f *.so