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
|
# Build configuration
VERSION := $(shell cat VERSION 2>/dev/null || echo "unknown")
BUILD_DIR ?= build
INC_DIR := include
TARGET_AMD64 ?= mini-init-amd64
TARGET_ARM64 ?= mini-init-arm64
AMD64_SRC_DIR := src/amd64
ARM64_SRC_DIR := src/arm64
NASM := nasm
LD := ld
DEBUG ?= 1
NASMFLAGS := -f elf64 -I$(INC_DIR)/
LDFLAGS := -nostdlib -z noexecstack -z relro -z now --build-id=sha1
ARM64_AS ?= $(shell command -v aarch64-linux-gnu-as 2>/dev/null || echo as)
ARM64_LD ?= $(shell command -v aarch64-linux-gnu-ld 2>/dev/null || echo ld)
ARM64_ASFLAGS ?= -I$(INC_DIR)
ARM64_LDFLAGS ?= -nostdlib -z noexecstack -z relro -z now --build-id=sha1
ifeq ($(DEBUG),1)
NASMFLAGS += -g -F dwarf
ARM64_ASFLAGS += -g
endif
# Generate version include files for both architectures
$(INC_DIR)/version_amd64.inc: VERSION
@echo '; Auto-generated version file' > $@
@echo 'version_msg_str: db "mini-init-amd64 $(VERSION)", 10, 0' >> $@
@echo 'version_msg_len_val: equ $$ - version_msg_str - 1' >> $@
$(INC_DIR)/version_arm64.inc: VERSION
@echo '// Auto-generated version file' > $@
@echo 'version_msg_arm64: .asciz "mini-init-arm64 $(VERSION)\n"' >> $@
@echo '.equ version_msg_arm64_len, . - version_msg_arm64 - 1' >> $@
AMD64_BUILD_DIR := $(BUILD_DIR)/amd64
ARM64_BUILD_DIR := $(BUILD_DIR)/arm64
AMD64_SRCS := main.asm signals.asm spawn.asm forward.asm wait.asm epoll.asm timer.asm log.asm time.asm
AMD64_OBJS := $(addprefix $(AMD64_BUILD_DIR)/,$(AMD64_SRCS:.asm=.o))
ARM64_SRCS := main.S signals.S spawn.S forward.S wait.S epoll.S timer.S log.S time.S util.S
ARM64_OBJS := $(addprefix $(ARM64_BUILD_DIR)/,$(ARM64_SRCS:.S=.o))
.PHONY: helper-arm64
ARM64_HELPERS_SRCS := helpers/exit42.S helpers/sleeper.S
ARM64_HELPERS_OBJS := $(addprefix $(ARM64_BUILD_DIR)/,$(ARM64_HELPERS_SRCS:.S=.o))
ARM64_HELPERS_BINS := $(ARM64_BUILD_DIR)/helper-exit42 $(ARM64_BUILD_DIR)/helper-sleeper
.PHONY: all all-amd64 build-arm64 clean test test-amd64 test-arm64 test-all
all: all-amd64
all-amd64: $(BUILD_DIR)/$(TARGET_AMD64)
build-arm64: $(BUILD_DIR)/$(TARGET_ARM64) $(ARM64_HELPERS_BINS)
build-amd64: $(BUILD_DIR)/$(TARGET_AMD64)
test: test-amd64
test-amd64: $(BUILD_DIR)/$(TARGET_AMD64)
bash scripts/test_harness.sh $(BUILD_DIR)/$(TARGET_AMD64)
test-arm64: $(BUILD_DIR)/$(TARGET_ARM64)
bash scripts/test_harness_arm64.sh $(BUILD_DIR)/$(TARGET_ARM64)
test-all: test-amd64
bash scripts/test_ep_signals.sh $(BUILD_DIR)/$(TARGET_AMD64)
bash scripts/test_edge_cases.sh $(BUILD_DIR)/$(TARGET_AMD64)
bash scripts/test_exit_code_mapping.sh $(BUILD_DIR)/$(TARGET_AMD64)
bash scripts/test_restart.sh $(BUILD_DIR)/$(TARGET_AMD64)
bash scripts/test_diagnostics.sh $(BUILD_DIR)/$(TARGET_AMD64)
$(AMD64_BUILD_DIR):
mkdir -p $@
$(ARM64_BUILD_DIR):
mkdir -p $@
$(AMD64_BUILD_DIR)/%.o: $(AMD64_SRC_DIR)/%.asm $(INC_DIR)/*.inc $(INC_DIR)/version_amd64.inc | $(AMD64_BUILD_DIR)
$(NASM) $(NASMFLAGS) $< -o $@
$(ARM64_BUILD_DIR)/%.o: $(ARM64_SRC_DIR)/%.S $(INC_DIR)/*.inc $(INC_DIR)/version_arm64.inc | $(ARM64_BUILD_DIR)
$(ARM64_AS) $(ARM64_ASFLAGS) $< -o $@
# Helper objects
$(ARM64_BUILD_DIR)/helpers/%.o: $(ARM64_SRC_DIR)/helpers/%.S $(INC_DIR)/*.inc | $(ARM64_BUILD_DIR)
mkdir -p $(ARM64_BUILD_DIR)/helpers
$(ARM64_AS) $(ARM64_ASFLAGS) -I$(INC_DIR) $< -o $@
$(BUILD_DIR)/$(TARGET_AMD64): $(AMD64_OBJS)
$(LD) $(LDFLAGS) -o $@ $(AMD64_OBJS)
$(BUILD_DIR)/$(TARGET_ARM64): $(ARM64_OBJS)
$(ARM64_LD) $(ARM64_LDFLAGS) -o $@ $(ARM64_OBJS)
# Helper binaries (linked standalone)
$(ARM64_BUILD_DIR)/helper-exit42: $(ARM64_BUILD_DIR)/helpers/exit42.o
$(ARM64_LD) $(ARM64_LDFLAGS) -o $@ $<
$(ARM64_BUILD_DIR)/helper-sleeper: $(ARM64_BUILD_DIR)/helpers/sleeper.o
$(ARM64_LD) $(ARM64_LDFLAGS) -o $@ $<
clean:
rm -rf $(BUILD_DIR)
|