-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
134 lines (111 loc) · 5.2 KB
/
Copy pathMakefile
File metadata and controls
134 lines (111 loc) · 5.2 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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# X68000 Modern C++ Sample Project
# This Makefile is intended for use with msys/cygwin Unix-compatible environments.
# Requires xdev68k: https://github.com/yosshin4004/xdev68k
# Check that required environment variables are defined
ifndef XDEV68K_DIR
$(error ERROR : XDEV68K_DIR is not defined. Please set it to your xdev68k installation path.)
endif
# Clear default suffixes
.SUFFIXES:
# Target CPU (68000, 68010, 68020, 68030, 68040)
CPU = 68000
# Tool shortcuts
ATOMIC = perl ${XDEV68K_DIR}/util/atomic.pl
CXX = ${XDEV68K_DIR}/m68k-toolchain/bin/m68k-elf-g++
CC = ${XDEV68K_DIR}/m68k-toolchain/bin/m68k-elf-gcc
GAS2HAS = perl ${XDEV68K_DIR}/util/x68k_gas2has.pl -cpu $(CPU) -inc doscall.inc -inc iocscall.inc
RUN68 = $(ATOMIC) ${XDEV68K_DIR}/run68/run68
HAS = $(RUN68) ${XDEV68K_DIR}/x68k_bin/g2as.x
HLK = $(RUN68) ${XDEV68K_DIR}/x68k_bin/g2lk.x
# Output executable
EXECUTABLE = MAIN.X
TARGET_FILES = $(EXECUTABLE)
# Include paths
INCLUDE_FLAGS = -I${XDEV68K_DIR}/include/xc -I${XDEV68K_DIR}/include/xdev68k -I./src
# Include paths without XC (for pure C++ STL files)
INCLUDE_FLAGS_NO_XC = -I./src
# Compiler flags
COMMON_FLAGS = -m$(CPU) -Os $(INCLUDE_FLAGS)
CFLAGS = $(COMMON_FLAGS) -Wno-builtin-declaration-mismatch -fcall-used-d2 -fcall-used-a2 \
-finput-charset=utf-8 -fexec-charset=cp932 -fverbose-asm
CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++20
# C++ flags without XC headers (for STL-heavy files)
COMMON_FLAGS_NO_XC = -m$(CPU) -Os $(INCLUDE_FLAGS_NO_XC)
CXXFLAGS_NO_XC = $(COMMON_FLAGS_NO_XC) -Wno-builtin-declaration-mismatch -fcall-used-d2 -fcall-used-a2 \
-finput-charset=utf-8 -fexec-charset=cp932 -fverbose-asm -fno-rtti -fno-exceptions -std=gnu++20
# Source files
C_SRCS =
CPP_SRCS = src/main.cpp src/test_constexpr.cpp src/test_vector.cpp src/test_cpp20.cpp
# C++ sources that use pure STL (no XC headers)
CPP_SRCS_NO_XC = src/test_stl.cpp
ASM_SRCS =
# Libraries to link
LIBS = \
${XDEV68K_DIR}/lib/xc/BASLIB.L \
${XDEV68K_DIR}/lib/xc/CLIB.L \
${XDEV68K_DIR}/lib/xc/DOSLIB.L \
${XDEV68K_DIR}/lib/xc/IOCSLIB.L \
${XDEV68K_DIR}/lib/xc/FLOATFNC.L \
${XDEV68K_DIR}/lib/m68k_elf/m$(CPU)/libgcc.a \
${XDEV68K_DIR}/lib/m68k_elf/m$(CPU)/libstdc++.a
# Intermediate file directory
INTERMEDIATE_DIR = _build/m$(CPU)
# Object files
OBJS = $(addprefix $(INTERMEDIATE_DIR)/,$(patsubst %.c,%.o,$(C_SRCS))) \
$(addprefix $(INTERMEDIATE_DIR)/,$(patsubst %.cpp,%.o,$(CPP_SRCS))) \
$(addprefix $(INTERMEDIATE_DIR)/,$(patsubst %.cpp,%.o,$(CPP_SRCS_NO_XC))) \
$(addprefix $(INTERMEDIATE_DIR)/,$(patsubst %.s,%.o,$(ASM_SRCS)))
# Dependency files
DEPS = $(addprefix $(INTERMEDIATE_DIR)/,$(patsubst %.c,%.d,$(C_SRCS))) \
$(addprefix $(INTERMEDIATE_DIR)/,$(patsubst %.cpp,%.d,$(CPP_SRCS))) \
$(addprefix $(INTERMEDIATE_DIR)/,$(patsubst %.cpp,%.d,$(CPP_SRCS_NO_XC)))
# Link list file for HLK
HLK_LINK_LIST = $(INTERMEDIATE_DIR)/_lk_list.tmp
# Default target
all : $(TARGET_FILES)
# Include dependency files
-include $(DEPS)
# Clean intermediate files
clean :
rm -f $(TARGET_FILES)
rm -rf $(INTERMEDIATE_DIR)
# Build executable
$(EXECUTABLE) : $(OBJS) $(LIBS)
mkdir -p $(INTERMEDIATE_DIR)
rm -f $(HLK_LINK_LIST)
@for FILENAME in $(OBJS); do \
echo $$FILENAME >> $(HLK_LINK_LIST); \
done
@for FILENAME in $(LIBS); do \
cp $$FILENAME $(INTERMEDIATE_DIR)/`basename $$FILENAME`; \
echo $(INTERMEDIATE_DIR)/`basename $$FILENAME` >> $(HLK_LINK_LIST); \
done
$(HLK) -i $(HLK_LINK_LIST) -o $(EXECUTABLE)
# Compile *.c sources
$(INTERMEDIATE_DIR)/%.o : %.c Makefile
mkdir -p $(dir $(INTERMEDIATE_DIR)/$*.o)
$(CC) -S $(CFLAGS) -o $(INTERMEDIATE_DIR)/$*.m68k-gas.s -MT $(INTERMEDIATE_DIR)/$*.o -MD -MP -MF $(INTERMEDIATE_DIR)/$*.d $<
$(GAS2HAS) -i $(INTERMEDIATE_DIR)/$*.m68k-gas.s -o $(INTERMEDIATE_DIR)/$*.s
rm -f $(INTERMEDIATE_DIR)/$*.m68k-gas.s
$(HAS) -e -u -w0 $(INCLUDE_FLAGS) $(INTERMEDIATE_DIR)/$*.s -o $(INTERMEDIATE_DIR)/$*.o
# Compile *.cpp sources
$(INTERMEDIATE_DIR)/%.o : %.cpp Makefile
mkdir -p $(dir $(INTERMEDIATE_DIR)/$*.o)
$(CXX) -S $(CXXFLAGS) -o $(INTERMEDIATE_DIR)/$*.m68k-gas.s -MT $(INTERMEDIATE_DIR)/$*.o -MD -MP -MF $(INTERMEDIATE_DIR)/$*.d $<
$(GAS2HAS) -i $(INTERMEDIATE_DIR)/$*.m68k-gas.s -o $(INTERMEDIATE_DIR)/$*.s
rm -f $(INTERMEDIATE_DIR)/$*.m68k-gas.s
$(HAS) -e -u -w0 $(INCLUDE_FLAGS) $(INTERMEDIATE_DIR)/$*.s -o $(INTERMEDIATE_DIR)/$*.o
# Compile test_stl.cpp without XC headers (specific rule takes precedence)
# Note: C++ compilation uses NO_XC flags to avoid header conflicts,
# but HAS assembler still needs xdev68k paths for .inc files
$(INTERMEDIATE_DIR)/src/test_stl.o : src/test_stl.cpp Makefile
mkdir -p $(dir $(INTERMEDIATE_DIR)/src/test_stl.o)
$(CXX) -S $(CXXFLAGS_NO_XC) -o $(INTERMEDIATE_DIR)/src/test_stl.m68k-gas.s -MT $(INTERMEDIATE_DIR)/src/test_stl.o -MD -MP -MF $(INTERMEDIATE_DIR)/src/test_stl.d $<
$(GAS2HAS) -i $(INTERMEDIATE_DIR)/src/test_stl.m68k-gas.s -o $(INTERMEDIATE_DIR)/src/test_stl.s
rm -f $(INTERMEDIATE_DIR)/src/test_stl.m68k-gas.s
$(HAS) -e -u -w0 $(INCLUDE_FLAGS) $(INTERMEDIATE_DIR)/src/test_stl.s -o $(INTERMEDIATE_DIR)/src/test_stl.o
# Assemble *.s sources
$(INTERMEDIATE_DIR)/%.o : %.s Makefile
mkdir -p $(dir $(INTERMEDIATE_DIR)/$*.o)
$(HAS) -e -u -w0 $(INCLUDE_FLAGS) $*.s -o $(INTERMEDIATE_DIR)/$*.o
.PHONY: all clean