make: Ensure main object file is first

Per the SDCC manual, the object that declares main must be passed first
to the linker. The resulting binary is identical, and this has not
caused a problem yet, so I'm unsure how "required" this is.

Ref: Section 3.2.3 Projects with Multiple Source Files
Signed-off-by: Tim Crawford <tcrawford@system76.com>
This commit is contained in:
Tim Crawford
2023-01-11 09:21:57 -07:00
committed by Tim Crawford
parent 7ebec4f7b1
commit f46360fb45

View File

@ -5,6 +5,11 @@ CC = sdcc -mmcs51 --model-large --code-size $(CODE_SIZE) --xram-size $(SRAM_SIZE
AS = sdas8051
ASFLAGS = -plosgff
# XXX: SDCC "requires" main() to be in the first item passed to the linker.
# Ref: SDCC Manual 4.2.8; Section 3.2.3 Projects with Multiple Source Files
MAIN_SRC = $(filter %/main.c, $(SRC))
MAIN_OBJ = $(sort $(patsubst src/%.c, $(BUILD)/%.rel, $(MAIN_SRC)))
# NOTE: sdas *must* be used for assembly files as sdcc cannot compile them
# itself. They must use an extension of `.asm` so they can be filtered here.
@ -14,7 +19,7 @@ ASM_OBJ = $(sort $(patsubst src/%.asm, $(BUILD)/%.rel, $(ASM_SRC)))
C_SRC = $(filter %.c, $(SRC))
C_OBJ = $(sort $(patsubst src/%.c, $(BUILD)/%.rel, $(C_SRC)))
OBJ = $(sort $(ASM_OBJ) $(C_OBJ))
OBJ = $(MAIN_OBJ) $(sort $(ASM_OBJ) $(C_OBJ))
# Run EC rom in simulator
sim: $(BUILD)/ec.rom