Viewing: Makefile
📄 Makefile (Read Only) ⬅ To go back
# ulibc — Minimal C library for AdrOS userspace
CC  ?= i686-elf-gcc
AS  ?= i686-elf-as
AR  ?= i686-elf-ar
LD  ?= i686-elf-ld

# Out-of-tree build directory (override from root Makefile)
BUILDDIR ?= .

# Source-relative include path (works from any BUILDDIR)
SRCDIR := $(dir $(lastword $(MAKEFILE_LIST)))src
INCDIR := $(dir $(lastword $(MAKEFILE_LIST)))include

CFLAGS := -m32 -ffreestanding -fno-pie -no-pie -nostdlib -O2 -Wall -Wextra -Werror -I$(INCDIR)
CFLAGS_PIC := -m32 -ffreestanding -nostdlib -O2 -Wall -Wextra -Werror -I$(INCDIR) -fPIC -fno-plt
ASFLAGS := --32

SRC_C := $(wildcard $(SRCDIR)/*.c)
SRC_S := $(wildcard $(SRCDIR)/*.S)
OBJ := $(patsubst $(SRCDIR)/%.c,$(BUILDDIR)/%.o,$(SRC_C)) $(patsubst $(SRCDIR)/%.S,$(BUILDDIR)/%.o,$(SRC_S))

# PIC objects for shared library (exclude crt0 — it's linked separately)
PIC_C := $(filter-out $(SRCDIR)/crt0.S,$(SRC_C))
PIC_OBJ := $(patsubst $(SRCDIR)/%.c,$(BUILDDIR)/%.pic.o,$(PIC_C))

all: $(BUILDDIR)/libulibc.a

$(BUILDDIR)/libulibc.a: $(OBJ)
	@$(AR) rcs $@ $^
	@echo "  AR      $@"

$(BUILDDIR)/libc.so: $(PIC_OBJ)
	@$(LD) -m elf_i386 -shared -soname libc.so -o $@ $^
	@echo "  LD      $@ (shared)"

$(BUILDDIR)/%.o: $(SRCDIR)/%.c
	@mkdir -p $(BUILDDIR)
	@$(CC) $(CFLAGS) -c $< -o $@
	@echo "  CC      $<"

$(BUILDDIR)/%.pic.o: $(SRCDIR)/%.c
	@mkdir -p $(BUILDDIR)
	@$(CC) $(CFLAGS_PIC) -c $< -o $@
	@echo "  CC [PIC] $<"

$(BUILDDIR)/%.o: $(SRCDIR)/%.S
	@mkdir -p $(BUILDDIR)
	@$(AS) $(ASFLAGS) $< -o $@
	@echo "  AS      $<"

clean:
	rm -f $(OBJ) $(PIC_OBJ) $(BUILDDIR)/libulibc.a $(BUILDDIR)/libc.so
	rm -f src/*.o src/*.pic.o libulibc.a libc.so

.PHONY: all clean