-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
182 lines (147 loc) · 5.3 KB
/
Makefile
File metadata and controls
182 lines (147 loc) · 5.3 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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
# ==============================================================================
# SOS - Simple Operating System
# Makefile - Arquivo de Configuração de Build
# ==============================================================================
# Este arquivo faz parte do Projeto SOS - Simple Operating System.
# ------------------------------------------------------------------------------
# Este software está sob a Licença BSD 3-Clause.
#
# É permitido o uso, a modificação e a distribuição deste software de forma
# livre, desde que os termos da licença BSD 3-Clause sejam respeitados.
#
# Este software é fornecido "COMO ESTÁ", sem garantias de qualquer tipo,
# incluindo, mas não limitado a, garantias implícitas de comercialização ou
# adequação a um propósito específico.
#
# Consulte o arquivo LICENSE para obter mais detalhes.
# ------------------------------------------------------------------------------
# Copyright (c) 2025, Luciano Gonçalez. BSD 3-Clause License.
# ------------------------------------------------------------------------------
# eMail: dev.lucianogoncalez@gmail.com
# Home : http://lucky-labs.blogspot.com.br
# ==============================================================================
## Configurações Gerais ##
# Aqui configuramos os nomes das ferramentas
ASSEMBLER_NAME = nasm
COMPILER_NAME = gcc
LINKER_NAME = ld
EMULATOR_NAME = qemu-system-x86_64
# Aqui configuramos os diretórios
BASE_DIR = $(shell pwd)
TESTS_DIR = $(BASE_DIR)/tests
BUILD_DIR = $(BASE_DIR)/build
BIN_DIR = $(BASE_DIR)/bin
# Aqui configuramos os arquivos
DOS_IMG = $(TESTS_DIR)/dos.img
FLOPPY_EMPTY_IMG = $(BUILD_DIR)/floppy_empty.img
BOOT_TEST_SRC = $(TESTS_DIR)/bootest.asm
BOOT_TEST_BIN = $(BUILD_DIR)/bootest.bin
BOOT_IMG = $(BIN_DIR)/boot.img
# Aqui configuramos as flags do emulador
EMULATOR_FLAGS_DOS = -drive if=floppy,index=0,format=raw,read-only=on,file=$(DOS_IMG)
EMULATOR_FLAGS_BOOT = -drive if=floppy,index=0,format=raw,read-only=on,file=$(BOOT_IMG)
# Opções utilizadas para o emulador
# -drive => utiliza as configurações de drive abaixo
# if=floppy => define o drive como disquete
# index=0 => define o drive como o primeiro drive
# format=raw => define o formato do drive como raw
# read-only=on => define o drive como somente leitura
# file=$(NAME) => define o arquivo de imagem do drive
## Ferramentas ##
# Aqui obtemos os nomes completos das ferramentas
ASSEMBLER = $(shell which $(ASSEMBLER_NAME))
COMPILER = $(shell which $(COMPILER_NAME))
LINKER = $(shell which $(LINKER_NAME))
EMULATOR = $(shell which $(EMULATOR_NAME))
## Checagens das ferramentas ##
# Checagem do Assembler
ifeq ("$(ASSEMBLER)", "")
assembler_error:
@echo >&2
@echo >&2 "Não foi possível encontrar o assembler: $(ASSEMBLER_NAME)"
@echo >&2
@exit 1
endif
# Checagem do Compilador
ifeq ("$(COMPILER)", "")
compiler_error:
@echo >&2
@echo >&2 "Não foi possível encontrar o compilador: $(COMPILER_NAME)"
@echo >&2
@exit 1
endif
# Checagem do Linker
ifeq ("$(LINKER)", "")
linker_error:
@echo >&2
@echo >&2 "Não foi possível encontrar o linker: $(LINKER_NAME)"
@echo >&2
@exit 1
endif
# Checagem do Emulador
ifeq ("$(EMULATOR)", "")
emulator_error:
@echo >&2
@echo >&2 "Não foi possível encontrar o emulador: $(EMULATOR_NAME)"
@echo >&2
@exit 1
endif
## Regras do Makefile ##
# Define as regras como "phony", ou seja, não são arquivos reais
.PHONY: all build run clean dostest bootest
# Regra padrão
# Executa a limpeza e depois o build e run
all: clean run
# Regra para construir a imagem de boot do teste de bootloader
build: $(BOOT_IMG)
# Regra para executar o emulador com a imagem do Boot Test
run: bootest
# Regra para limpar os arquivos de build
clean:
@echo -n "Limpando arquivos de build... "
@rm -rf $(BUILD_DIR) $(BIN_DIR)
@echo "OK"
# Regra para iniciar o emulador com a imagem do MS-DOS
dostest: $(DOS_IMG)
@echo "Iniciando emulador com imagem do MS-DOS..."
@$(EMULATOR) $(EMULATOR_FLAGS_DOS)
@echo "Emulador encerrado."
# Regra para iniciar o emulador com a imagem do Boot Test
bootest: $(BOOT_IMG)
@echo "Iniciando emulador com imagem do Boot Test..."
@$(EMULATOR) $(EMULATOR_FLAGS_BOOT)
@echo "Emulador encerrado."
# Checa se a imagem do MS-DOS existe
$(DOS_IMG):
@echo >&2
@echo >&2 "Não foi possível encontrar o arquivo de imagem: $(DOS_IMG)"
@echo >&2
@echo >&2 "Faça o download de uma imagem do MS-DOS e renomeie para $(DOS_IMG)"
@echo >&2
@exit 1
# Cria diretório de build
$(BUILD_DIR):
@echo -n "Criando diretório de build... "
@mkdir -p $(BUILD_DIR)
@echo "OK"
# Cria diretório de binários
$(BIN_DIR):
@echo -n "Criando diretório de binários... "
@mkdir -p $(BIN_DIR)
@echo "OK"
# Cria imagem de disquete vazio
$(FLOPPY_EMPTY_IMG): $(BUILD_DIR)
@echo -n "Criando imagem de disquete vazio... "
@dd if=/dev/zero of=$(FLOPPY_EMPTY_IMG) bs=512 count=2880 conv=notrunc 2> /dev/null
@echo "OK"
# Compila o bootloader de teste
$(BOOT_TEST_BIN): $(BOOT_TEST_SRC) | $(BUILD_DIR)
@echo -n "Compilando o bootloader de teste... "
@$(ASSEMBLER) -f bin $(BOOT_TEST_SRC) -o $(BOOT_TEST_BIN)
@echo "OK"
# Cria imagem de boot do teste de bootloader
$(BOOT_IMG): $(BOOT_TEST_BIN) | $(FLOPPY_EMPTY_IMG) $(BIN_DIR)
@echo -n "Criando imagem de boot do teste de bootloader... "
@cp $(FLOPPY_EMPTY_IMG) $(BOOT_IMG)
@dd if=$(BOOT_TEST_BIN) of=$(BOOT_IMG) bs=512 conv=notrunc 2> /dev/null
@echo "OK"