2026-10-02 14:22:00 +08:00
# Deshab-OS cross-platform build (F3: 疯不应绑 Windows)
#
# Linux/macOS (native or WSL):
2026-10-12 23:57:19 +08:00
# make dev # build kernels+apps+drivers, inject dev config, pack ISO/deshab-dev.img (panic=strict)
# make release # same, release config -> ISO/deshab-release.img (panic=fallback)
# make realtest # real-machine test config, release options + panic=strict
2026-10-02 14:22:00 +08:00
# make both # dev + release
2026-10-12 23:57:19 +08:00
# make all # dev + release + realtest (SYSTEM restored to dev config)
2026-10-02 14:22:00 +08:00
# make kernels apps drivers # compile only
#
# Requirements: clang + ld.lld (LLVM), GNU make, python3 + Pillow (logo),
# sudo/root + mkfs.vfat + mkfs.ext4 (pack step, via CODE/linux/pack_system_image.sh).
#
# Windows: keep using build.bat / build.ps1 (this Makefile's pack step needs POSIX paths).
#
# Overrides:
# make CC=clang-15 LD=ld.lld-15 PYTHON=python3
# make PACK="sudo bash" # pack command prefix (default: sudo bash)
CC ?= clang
LD ?= ld.lld
PYTHON ?= python3
PACK ?= sudo bash
ROOT := $( CURDIR)
SYSTEM := $( ROOT) /SYSTEM
ISO := $( ROOT) /ISO
BTMP := $( ROOT) /.build_tmp
MAKEFLAGS += -j
# ---- sub-builds (each MAKEFILE outputs straight into SYSTEM/) ----
KERNELS := CODE/UTSM CODE/dsk
APPS := CODE/firstInit CODE/login CODE/mouse CODE/netman CODE/shell CODE/desktop CODE/cmd \
$( addprefix CODE/tools/,editor fileman browser curl ping settings)
# ---- DKM drivers: src -> SYSTEM/driver/... ----
DRV_FLAGS := -target x86_64-unknown-none -std= c11 -ffreestanding -fno-builtin \
-fno-stack-protector -fno-pic -fno-pie -mcmodel= kernel -mno-red-zone \
-mno-sse -mno-sse2 -mno-mmx -msoft-float -m64 -Wall -Wextra -O2
DRV_SRCS := CODE/DKM/console_fb/console_fb.c:SYSTEM/driver/console/console_fb.drv \
CODE/DKM/apic/apic.c:SYSTEM/driver/platform/apic.drv \
CODE/DKM/nvme/nvme.c:SYSTEM/driver/block/nvme.drv \
CODE/DKM/ehci/ehci.c:SYSTEM/driver/block/ehci.drv \
CODE/DKM/xhci/xhci.c:SYSTEM/driver/block/xhci.drv \
CODE/DKM/e1000/e1000.c:SYSTEM/driver/net/e1000.drv \
CODE/DKM/virtio_net/virtio_net.c:SYSTEM/driver/net/virtio_net.drv \
CODE/DKM/ath9k/ath9k.c:SYSTEM/driver/net/ath9k.drv
DRV_OUTS := $( foreach s,$( DRV_SRCS) ,$( ROOT) /$( word 2,$( subst :, ,$( s))))
.PHONY : all both dev release realtest kernels apps drivers \
inject -dev inject -release inject -realtest \
iso -dev iso -release iso -realtest clean
2026-10-12 23:57:19 +08:00
# iso-* 共享 SYSTEM/ 注入点,-j 下必须串行打包
all : kernels apps drivers
@$( MAKE) --no-print-directory iso-dev
@$( MAKE) --no-print-directory iso-release
@$( MAKE) --no-print-directory iso-realtest
@$( MAKE) --no-print-directory inject-dev
2026-10-02 14:22:00 +08:00
2026-10-12 23:57:19 +08:00
both : kernels apps drivers
@$( MAKE) --no-print-directory iso-dev
@$( MAKE) --no-print-directory iso-release
@$( MAKE) --no-print-directory inject-dev
2026-10-02 14:22:00 +08:00
kernels :
@for d in $( KERNELS) ; do echo "[build] $$ d" ; $( MAKE) -C $$ d -f MAKEFILE CC = " $( CC) " LD = " $( LD) " || exit 1; done
dsk-logo :
@if [ -f ohMyLogo.png ] ; then \
if [ ohMyLogo.png -nt CODE/UTSM/kernel/panic_logo_data.inc ] || [ ! -f CODE/UTSM/kernel/panic_logo_data.inc ] ; then \
echo "[build] Generating panic_logo_data.inc from ohMyLogo.png..." ; \
$( PYTHON) CODE/UTSM/kernel/gen_panic_logo.py ohMyLogo.png CODE/UTSM/kernel/panic_logo_data.inc || echo "[build] WARN: panic logo gen failed, using existing" ; \
fi ; \
fi
apps :
@for d in $( APPS) ; do \
if [ -f $$ d/MAKEFILE ] ; then echo "[build] $$ d" ; $( MAKE) -C $$ d -f MAKEFILE CC = " $( CC) " LD = " $( LD) " || exit 1; \
else echo "[build] WARN: no MAKEFILE in $$ d, skipped" ; fi ; done
drivers : $( DRV_OUTS )
$(ROOT)/SYSTEM/driver/%.drv : $( ROOT ) /CODE /DKM /%.c
@mkdir -p $( dir $@ ) $( BTMP)
@echo "[build] DKM driver: $< -> $@ "
$( CC) $( DRV_FLAGS) -c $< -o $( BTMP) /$( notdir $<) .o
$( LD) -r -o $@ $( BTMP) /$( notdir $<) .o
utsm :
$( MAKE) -C CODE/UTSM -f MAKEFILE CC = " $( CC) " LD = " $( LD) "
dsk : dsk -logo
$( MAKE) -C CODE/dsk -f MAKEFILE CC = " $( CC) " LD = " $( LD) "
# ---- config injection (mirrors build.ps1 Build-ImageVariant) ----
inject-% :
@if [ -d build/configs/$* ] ; then \
if [ ! -f build/configs/$* /FUCK ] || [ ! -f build/configs/$* /firstInit.txt ] ; then \
echo "Missing FUCK/firstInit.txt template in build/configs/ $* " ; exit 1; fi ; \
cp build/configs/$* /FUCK SYSTEM/system/deshab64/FUCK; \
cp build/configs/$* /firstInit.txt SYSTEM/system/user/use/firstInit.txt; \
echo "[build] Injected config variant= $* (FUCK + firstInit.txt)" ; \
else \
echo "[build] WARN: configs/ $* absent, packaging SYSTEM as-is" ; \
fi
# ---- pack: GPT p1 FAT32 ESP + p2 ext4 (CODE/linux/pack_system_image.sh) ----
iso-% : inject -%
@mkdir -p $( ISO)
$( PACK) $( ROOT) /CODE/linux/pack_system_image.sh $( SYSTEM) $( ISO) /deshab-$* .img
@echo "[build] $* image done: $( ISO) /deshab- $* .img"
dev : kernels apps drivers iso -dev
release : kernels apps drivers iso -release
realtest : kernels apps drivers iso -realtest
clean :
@for d in $( KERNELS) $( APPS) ; do $( MAKE) -C $$ d -f MAKEFILE clean >/dev/null 2>& 1 || true; done
@rm -rf $( BTMP) /*.o
@echo "[build] clean done"