|
1 | | -#CC := /home/gerben/djgpp/i586-pc-msdosdjgpp/bin/gcc |
2 | | -#CFLAGS := -O2 -march=i386 -fomit-frame-pointer -Wno-attributes -Wpedantic -DAPPVER_EXEDEF=DM19F2 |
3 | 1 | CC := gcc |
4 | | -CFLAGS := -O2 -m32 -fomit-frame-pointer -Wno-attributes -Wpedantic -Wno-unused-result -DAPPVER_EXEDEF=DM19F2 |
5 | | - |
6 | | -DBGFLAGS := -g |
| 2 | +CXX := g++ |
| 3 | +DBGFLAGS := -g -DRANGECHECK -fsanitize=address -fsanitize=undefined |
| 4 | +#EXTRAFLAGS = $(DBGFLAGS) |
| 5 | +EXTRAFLAGS = -O2 -fomit-frame-pointer |
| 6 | +CFLAGS := -m32 -Wno-attributes -Wno-unused-result -DAPPVER_EXEDEF=DM19F2 -fno-pic -no-pie $(EXTRAFLAGS) |
7 | 7 | COBJFLAGS := $(CFLAGS) -c |
8 | 8 | AS := nasm |
9 | 9 |
|
10 | 10 | SRC_DIR := src |
11 | | -BUILD_DIR := build |
| 11 | +DOS_BUILD_DIR := build_dos |
| 12 | +LINUX_BUILD_DIR := build_linux |
| 13 | + |
| 14 | +define get-objects-from-dir |
| 15 | +$(patsubst $(1)/%.c,$(1)/%.o,$(wildcard $(1)/*.c)) \ |
| 16 | +$(patsubst $(1)/%.asm,$(1)/%.o,$(wildcard $(1)/*.asm)) |
| 17 | +endef |
| 18 | + |
| 19 | +define src-to-build |
| 20 | +$(patsubst %,$(1)/%,$(2)) |
| 21 | +endef |
| 22 | + |
| 23 | +define _depend |
| 24 | +#!/bin/sh |
| 25 | +CC=$1 |
| 26 | +DIR=$2 |
| 27 | +shift 2 |
| 28 | +case "$DIR" in |
| 29 | +"" | ".") |
| 30 | +$CC -MM -MG -c "$@" | sed -e 's@^\(.*\).o:@\\1.d \\1.o:@g' |
| 31 | +;; |
| 32 | +*) |
| 33 | +$CC -MM -MG -c "$@" | sed -e "s@^\(.*\).o:@$DIR\/\\1.d $DIR\/\\1.o:@g" |
| 34 | +;; |
| 35 | +esac |
| 36 | +endef |
| 37 | +export depend = $(value _depend) |
| 38 | + |
| 39 | +# Z_ZONE_OBJ = $(SRC_DIR)/z_zone/z_zone_asan.o |
| 40 | +Z_ZONE_OBJ = $(SRC_DIR)/z_zone/z_zone.o |
| 41 | + |
| 42 | +# Find all .o files |
| 43 | +DOOM_OBJS := $(call get-objects-from-dir,$(SRC_DIR)) $(Z_ZONE_OBJ) |
| 44 | +DOS_OBJS := $(call get-objects-from-dir,$(SRC_DIR)/dos) |
| 45 | +LINUX_OBJS := $(call get-objects-from-dir,$(SRC_DIR)/linux) |
12 | 46 |
|
| 47 | +ALL_DOS_OBJS := $(call src-to-build, $(DOS_BUILD_DIR), $(DOOM_OBJS) $(DOS_OBJS)) |
| 48 | +ALL_LINUX_OBJS := $(call src-to-build, $(LINUX_BUILD_DIR), $(DOOM_OBJS) $(LINUX_OBJS)) |
13 | 49 |
|
14 | | -# Find all .c files |
15 | | -ASS_SRC := $(wildcard $(SRC_DIR)/ass/*.c) |
16 | | -ALL_C_FILES := $(wildcard $(SRC_DIR)/*.c) |
17 | | -DOS_SRC := $(SRC_DIR)/i_ibm.c |
18 | | -LINUX_SRC := $(SRC_DIR)/i_linux.c |
19 | | -FILTER_SRC = $(LINUX_SRC) $(DOS_SRC) |
20 | | -SRC := $(filter-out $(FILTER_SRC), $(ALL_C_FILES)) |
| 50 | +.PRECIOUS: $(DOS_BUILD_DIR)/%.d $(LINUX_BUILD_DIR)/%.d %/depend.sh |
21 | 51 |
|
22 | | -OBJ := $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SRC)) $(BUILD_DIR)/planar.o |
23 | | -ASS_OBJ := $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(ASS_SRC)) $(BUILD_DIR)/ass/a_mv_mix.o |
24 | | -DOS_OBJ := $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(DOS_SRC)) |
| 52 | +%/depend.sh: Makefile | %/depend.sh.dir |
| 53 | + @echo "$$depend" > $@ |
| 54 | + @chmod +x $@ |
25 | 55 |
|
26 | | -$(BUILD_DIR)/doom.exe: $(OBJ) $(DOS_OBJ) $(ASS_OBJ) |
27 | | - $(CC) -o $@ $^ $(CFLAGS) |
| 56 | +define make-rules |
| 57 | +$(1)/%.d: %.c $(1)/depend.sh | $(1)/%.dir |
| 58 | + @$(1)/depend.sh $(CC) $$(@D) $(CFLAGS) $$< > $$@ |
28 | 59 |
|
29 | | -$(BUILD_DIR)/linux-doom: $(OBJ) $(LINUX_SRC) |
30 | | - $(CC) -o $@ $^ $(CFLAGS) |
| 60 | +$(1)/%.d: %.asm | $(1)/%.dir |
| 61 | + @touch $$@ |
31 | 62 |
|
32 | | -$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c | $(BUILD_DIR)/%.dir |
33 | | - $(CC) $(COBJFLAGS) -o $@ $< |
| 63 | +$(1)/%.o: %.c $(1)/%.d |
| 64 | + @echo "Compiling $$<" |
| 65 | + @$(CC) $(COBJFLAGS) -o $$@ $$< |
34 | 66 |
|
35 | | -$(BUILD_DIR)/%.s: $(SRC_DIR)/%.c | $(BUILD_DIR)/%.dir |
36 | | - $(CC) $(COBJFLAGS) -S -o $@ $< |
| 67 | +$(1)/%.o: %.cpp | $(1)/%.dir |
| 68 | + @$(CXX) $(COBJFLAGS) -o $$@ $$< |
37 | 69 |
|
38 | | -$(BUILD_DIR)/%.o: $(SRC_DIR)/%.asm | $(BUILD_DIR)/%.dir |
39 | | - $(AS) $< -f coff -o $@ |
| 70 | +$(1)/%.s: %.c $(1)/%.d |
| 71 | + @$(CC) $(COBJFLAGS) -S -o $$@ $$< |
| 72 | + |
| 73 | +$(1)/%.o: %.asm $(1)/%.d | $(1)/%.dir |
| 74 | + @$(AS) $$< $(2) -o $$@ |
| 75 | +endef |
| 76 | + |
| 77 | +$(eval $(call make-rules, $(DOS_BUILD_DIR), -f coff)) |
| 78 | +$(eval $(call make-rules, $(LINUX_BUILD_DIR), -f elf)) |
40 | 79 |
|
41 | 80 | %.dir: |
42 | | - mkdir -p $(dir $@) |
| 81 | + @mkdir -p $(dir $@) |
| 82 | + |
| 83 | +# Doom targets |
| 84 | +$(DOS_BUILD_DIR)/doom.exe: $(ALL_DOS_OBJS) |
| 85 | + $(CXX) -o $@ $^ $(CFLAGS) |
| 86 | + |
| 87 | +$(LINUX_BUILD_DIR)/doom: $(ALL_LINUX_OBJS) |
| 88 | + $(CXX) -o $@ $^ $(CFLAGS) -lX11 |
43 | 89 |
|
44 | | -# phony rules |
45 | | -.PHONY: all |
46 | | -all: $(BUILD_DIR)/doom.exe |
47 | 90 |
|
48 | 91 | .PHONY: debug |
49 | 92 | debug: $(TARGET_DEBUG) |
50 | 93 |
|
51 | 94 | .PHONY: clean |
52 | 95 | clean: |
53 | | - @rm -rf $(BUILD_DIR) |
54 | | - @rm -rf $(DBG_PATH) |
| 96 | + @rm -rf $(DOS_BUILD_DIR) |
| 97 | + @rm -rf $(LINUX_BUILD_DIR) |
| 98 | + |
| 99 | +# Include dependency files |
| 100 | +# This will include the dependency files generated by the depend.sh script |
| 101 | +# and will ensure that any change to headers will force correct rebuilding. |
| 102 | +# The wildcard function will expand to all .d files in the build directories |
| 103 | +# are present, which prevents make from trying to generate .d files that |
| 104 | +# don't exist. |
| 105 | +-include $(wildcard $(ALL_DOS_OBJS:.o=.d) $(ALL_LINUX_OBJS:.o=.d)) |
0 commit comments