-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
149 lines (123 loc) · 4.57 KB
/
Makefile
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# Make rosco_m68k example programs
#
# Copyright (c) 2020 Xark
# MIT LICENSE
ifndef ROSCO_M68K_DIR
$(info NOTE: ROSCO_M68K_DIR not set, using libs: ../../../code/software/libs)
ROSCO_M68K_DIR=../../..
else
$(info NOTE: Using ROSCO_M68K_DIR libs in: $(ROSCO_M68K_DIR))
endif
-include $(ROSCO_M68K_DIR)/user.mk
CPU?=68010
ARCH?=$(CPU)
TUNE?=$(CPU)
EXTRA_CFLAGS?=-g -O1 -fomit-frame-pointer
EXTRA_LIBS=
#EXTRA_VASMFLAGS?=-showopt
SYSINCDIR?=$(ROSCO_M68K_DIR)/code/software/libs/build/include
SYSLIBDIR?=$(ROSCO_M68K_DIR)/code/software/libs/build/lib
DEFINES=-DROSCO_M68K # -DERROR_REPORTING
CFLAGS=-std=c11 -ffreestanding -ffunction-sections -fdata-sections \
-Wall -Wextra -Werror -Wno-unused-function -pedantic -I$(SYSINCDIR) \
-mcpu=$(CPU) -march=$(ARCH) -mtune=$(TUNE) $(DEFINES)
CXXFLAGS=-std=c++20 -fno-exceptions -fno-rtti $(FLAGS)
GCC_LIBS=$(shell $(CC) --print-search-dirs \
| grep libraries:\ = \
| sed 's/libraries: =/-L/g' \
| sed 's/:/m68000\/ -L/g')m68000/
LIBS=$(EXTRA_LIBS) -lrosco_m68k -lgcc
ASFLAGS=-mcpu=$(CPU) -march=$(ARCH)
ifneq ($(ROSCO_M68K_HUGEROM),false)
LDSCRIPT?=$(SYSLIBDIR)/ld/serial/hugerom_rosco_m68k_program.ld
else
LDSCRIPT?=$(SYSLIBDIR)/ld/serial/rosco_m68k_program.ld
endif
LDFLAGS=-T $(LDSCRIPT) -L $(SYSLIBDIR) -Map=$(MAP) --gc-sections --oformat=elf32-m68k
VASMFLAGS=-Felf -m68010 -quiet -Lnf $(DEFINES)
CC=m68k-elf-gcc
CXX=m68k-elf-g++
AS=m68k-elf-as
LD=m68k-elf-ld
NM=m68k-elf-nm
LD=m68k-elf-ld
OBJDUMP=m68k-elf-objdump
OBJCOPY=m68k-elf-objcopy
SIZE=m68k-elf-size
VASM=vasmm68k_mot
RM=rm -f
KERMIT=kermit
SERIAL?=/dev/modem
BAUD?=9600
# Output config (assume name of directory)
PROGRAM_BASENAME=$(shell basename $(CURDIR))
# Set other output files using output basname
ELF=$(PROGRAM_BASENAME).elf
BINARY=$(PROGRAM_BASENAME).bin
DISASM=$(PROGRAM_BASENAME).dis
MAP=$(PROGRAM_BASENAME).map
SYM=$(PROGRAM_BASENAME).sym
# Assume source files in Makefile directory are source files for project
CSOURCES=$(wildcard *.c)
CXXSOURCES=$(wildcard *.cpp)
CINCLUDES=$(wildcard *.h)
SSOURCES=$(wildcard *.S)
ASMSOURCES=$(wildcard *.asm)
SOURCES=$(CSOURCES) $(CXXSOURCES) $(SSOURCES) $(ASMSOURCES)
# Assume each source files makes an object file
OBJECTS=$(addsuffix .o,$(basename $(SOURCES)))
all: $(BINARY) $(DISASM)
$(ELF) : $(OBJECTS)
$(LD) $(LDFLAGS) $(GCC_LIBS) $^ -o $@ $(LIBS)
$(NM) --numeric-sort $@ >$(SYM)
$(SIZE) $@
-chmod a-x $@
$(BINARY) : $(ELF)
$(OBJCOPY) -O binary $(ELF) $(BINARY)
$(DISASM) : $(ELF)
$(OBJDUMP) --disassemble -S $(ELF) >$(DISASM)
$(OBJECTS): Makefile
%.o : %.c $(CINCLUDES)
$(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) -o $@ $<
%.o : %.cpp $(CINCLUDES)
$(CXX) -c $(CXXFLAGS) $(EXTRA_CXXFLAGS) -o $@ $<
%.o : %.asm
$(VASM) $(VASMFLAGS) $(EXTRA_VASMFLAGS) -L $(basename $@).lst -o $@ $<
# remove targets that can be generated by this Makefile
clean:
$(RM) $(OBJECTS) $(ELF) $(BINARY) $(MAP) $(SYM) $(DISASM) $(addsuffix .lst,$(basename $(SSOURCES) $(ASMSOURCES)))
disasm: $(DISASM)
# hexdump of program binary
dump: $(BINARY)
hexdump -C $(BINARY)
# upload binary to rosco (if ready and kermit present)
load: $(BINARY)
$(KERMIT) -i -l $(SERIAL) -b $(BAUD) -s $(BINARY)
# Linux (gnome): Upload binary with kermit, connect with "screen" terminal
# (NOTE: kills existing "screen", opens new screen serial in new shell window/tab)
linuxtest: $(BINARY) $(DISASM)
-killall screen && sleep 1
$(KERMIT) -i -l $(SERIAL) -b $(BAUD) -s $(BINARY)
gnome-terminal --geometry=80x25 --title="rosco_m68k $(SERIAL)" -- screen $(SERIAL) $(BAUD)
# Linux (gnome): Connect with "screen" terminal
linuxterm:
-killall screen && sleep 1
gnome-terminal --geometry=80x25 --title="rosco_m68k $(SERIAL)" -- screen $(SERIAL) $(BAUD)
# macOS: Upload binary with kermit, connect with "screen" terminal
# (NOTE: kills existing "screen", opens new screen serial in new shell window/tab)
mactest: $(BINARY) $(DISASM)
-killall screen && sleep 1
$(KERMIT) -i -l $(SERIAL) -b $(BAUD) -s $(BINARY)
echo "#! /bin/sh" > $(TMPDIR)/rosco_screen.sh
echo "/usr/bin/screen $(SERIAL) $(BAUD)" >> $(TMPDIR)/rosco_screen.sh
-chmod +x $(TMPDIR)/rosco_screen.sh
sleep 1
open -b com.apple.terminal $(TMPDIR)/rosco_screen.sh
macterm:
echo "#! /bin/sh" > $(TMPDIR)/rosco_screen.sh
echo "/usr/bin/screen $(SERIAL) $(BAUD)" >> $(TMPDIR)/rosco_screen.sh
-chmod +x $(TMPDIR)/rosco_screen.sh
sleep 1
open -b com.apple.terminal $(TMPDIR)/rosco_screen.sh
# Makefile magic (for "phony" targets that are not real files)
.PHONY: all clean disasm dump load linuxtest linuxterm mactest macterm