Делаю эксперименты с RISC-V, написал мини-ОС на C++, которая работает в эмуляторе TinyEMU в Haiku, выглядит так. Для сборки и запуска написал Makefile
:
CC = clang
CXX = clang++
AS = clang
LD = ld.lld -nostdlib
TARGETFLAGS = -target riscv64-linux -march=rv64imafdc -mcmodel=medium
CXXFLAGS += -fno-exceptions -fno-rtti -Iheaders -Ilibc/headers -I/boot/system/develop/tools/x86/lib/gcc/i586-pc-haiku/8.3.0/include/c++ -I/boot/system/develop/tools/x86/lib/gcc/i586-pc-haiku/8.3.0/include/c++/i586-pc-haiku
ASFLAGS += $(TARGETFLAGS)
Startup.bin: Startup
llvm-objcopy -O binary Startup Startup.bin
Startup: Startup.ld objs/Startup.o objs/Vecs.o objs/Graphics.o objs/Font.o objs/Virtio.o objs/Threads.o objs/Timers.o libc/objs/setjmp.o libc/objs/string.o libc/objs/memcpy.o libc/objs/memset.o libc/objs/malloc.o Startup.ld
$(LD) -T Startup.ld --export-dynamic objs/Startup.o objs/Vecs.o objs/Graphics.o objs/Font.o objs/Virtio.o objs/Threads.o objs/Timers.o libc/objs/setjmp.o libc/objs/string.o libc/objs/memcpy.o libc/objs/memset.o libc/objs/malloc.o -o Startup
objs/%.o: src/%.cpp
$(CXX) $(TARGETFLAGS) $(CXXFLAGS) -MF"deps/$*.d" -MD -c $< -o $@
objs/%.o: src/%.S
$(AS) $(TARGETFLAGS) $(ASFLAGS) -MF"deps/$*.d" -MD -c $< -o $@
libc/objs/%.o: libc/src/%.cpp
$(CXX) $(TARGETFLAGS) $(CXXFLAGS) -MF"libc/deps/$*.d" -MD -c $< -o $@
libc/objs/%.o: libc/src/%.S
$(AS) $(TARGETFLAGS) $(ASFLAGS) -MF"libc/deps/$*.d" -MD -c $< -o $@
run: Startup.bin
temu -rw tinyemu.cfg
-include deps/*.d libc/deps/*.d
clean:
rm -f objs/* deps/* libc/objs/* libc/deps/* Startup Startup.bin
В нём много дублирования кода. Есть способы сокращения дублирования? Autotools не предлагать.