# Default target and architecture TARGET = linux ARCH = $(shell uname -m) PREFIX = CC = gcc AR = STRIP = CFLAGS = -static -Wall -Wextra -O2 # Override for MACHINE if set ifeq ($(MACHINE),arm6) ARCH = arm6 PREFIX = arm-linux-gnueabi CC = $(PREFIX)-gcc AR = $(PREFIX)-ar STRIP = $(PREFIX)-strip endif ifeq ($(MACHINE),arm7) ARCH = arm7 PREFIX = arm-linux-gnueabihf CC = $(PREFIX)-gcc AR = $(PREFIX)-ar STRIP = $(PREFIX)-strip endif ifeq ($(MACHINE),win64) ARCH = win64 TARGET = windows.exe PREFIX = x86_64-w64-mingw32 CC = $(PREFIX)-gcc AR = $(PREFIX)-ar STRIP = $(PREFIX)-strip CFLAGS += -D_WINDOWS_ endif ifeq ($(MACHINE),win32) ARCH = win32 TARGET = windows.exe PREFIX = i686-w64-mingw32 CC = $(PREFIX)-gcc AR = $(PREFIX)-ar STRIP = $(PREFIX)-strip CFLAGS += -D_WINDOWS_ endif ifeq ($(MACHINE),cosmocc) ARCH = multi TARGET = cosmocc PREFIX = cosmo CC = $(COSMOCCDIR)/bin/$(PREFIX)cc AR = $(COSMOCCDIR)/bin/$(PREFIX)ar endif ifeq ($(MACHINE),aarch64) ARCH = aarch64 TARGET = aarch64 PREFIX = aarch64-none-linux-gnu CC = $(AARCH64DIR)/bin/$(PREFIX)-gcc AR = $(AARCH64DIR)/bin/$(PREFIX)-ar STRIP = $(AARCH64DIR)/bin/$(PREFIX)-strip endif ifeq ($(MACHINE),riscv64) ARCH = riscv64 TARGET = riscv64 PREFIX = riscv64-linux-gnu CC = $(PREFIX)-gcc AR = $(PREFIX)-ar STRIP = $(PREFIX)-strip endif # Source files SRCS = ntpprint.c ntpset.c set_time_back.c # Output directory based on ARCH OUTDIR = $(ARCH) # Create binary names with architecture and target suffix BINARIES = $(patsubst %.c,$(OUTDIR)/%-$(_TARGET)-$(ARCH),$(SRCS)) # Handle special case for TARGET variable inside pattern (since TARGET changes only in some ifeqs) # So we assign a helper variable _TARGET to ensure TARGET is properly used in pattern substitution _TARGET = $(TARGET) all: $(BINARIES) # Ensure output directory exists before building $(OUTDIR): mkdir -p $(OUTDIR) # Pattern rule: compile each source file to output directory with naming scheme $(OUTDIR)/%-$(_TARGET)-$(ARCH): %.c | $(OUTDIR) $(CC) $(CFLAGS) -o $@ $< ifdef STRIP $(STRIP) $@ endif ifeq ($(MACHINE),cosmocc) $(RM) -fv $@.aarch64.elf $@.com.dbg endif clean: rm -rf arm6 arm7 win64 win32 multi aarch64 riscv64 x86_64 .PHONY: all clean