# 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 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 PREFIX = riscv64-linux-gnu CC = $(PREFIX)-gcc AR = $(PREFIX)-ar STRIP = $(PREFIX)-strip endif $(warning MACHINE: $(MACHINE)) $(warning ARCH: $(ARCH)) $(warning TARGET: $(TARGET)) $(warning CFLAGS: $(CFLAGS)) # Source files SRCS = ntpprint.c ntpset.c set_time_back.c ntpsetfile.c ntp-server-minimal.c ifeq ($(MACHINE),cosmocc) SRCS = ntpprint.c ntpset.c set_time_back.c ntpsetfile.c else ifeq ($(MACHINE),win64) SRCS = ntpprint-win.c else ifeq ($(MACHINE),win32) SRCS = ntpprint-win.c endif endif endif # 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 ifeq ($(MACHINE),win64) $(OUTDIR)/%-$(_TARGET)-$(ARCH): %.c | $(OUTDIR) $(warning Compiling: $(@)) $(CC) $(CFLAGS) -o $@ $< -lws2_32 else ifeq ($(MACHINE),win32) $(OUTDIR)/%-$(_TARGET)-$(ARCH): %.c | $(OUTDIR) $(warning Compiling: $(@)) $(CC) $(CFLAGS) -o $@ $< -lws2_32 else $(OUTDIR)/%-$(_TARGET)-$(ARCH): %.c | $(OUTDIR) $(warning Compiling: $(@)) $(CC) $(CFLAGS) -o $@ $< endif endif ifdef STRIP $(STRIP) $@ endif ifeq ($(MACHINE),cosmocc) $(RM) -fv $@.aarch64.elf $@.com.dbg endif ifeq ($(MACHINE),win32) mv win32/ntpprint-win-windows.exe-win32 win32/ntpprint-win32.exe endif ifeq ($(MACHINE),win64) mv win64/ntpprint-win-windows.exe-win64 win64/ntpprint-win64.exe endif clean: rm -rf $(OUTDIR) .PHONY: all clean