ntp-tools / Makefile /
a78b58f 2 months ago
1 contributor
142 lines | 3.062kb
# 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