#? stdtmpl(subsChar='?') | standard
#proc generateMakefile(c: ConfigData): string =
#  result = "# Generated from niminst\n" &
#           "# Template is in tools/niminst/makefile.nimf\n" &
#           "# To regenerate run ``niminst csource`` or ``koch csource``\n"

CC ??= gcc
CFLAGS += -Ic_code ?{c.ccompiler.flags}
LDFLAGS += ?{c.linker.flags}
binDir = ?{firstBinPath(c).toUnix}

koch := $(shell sh -c 'test -s ../koch.nim && echo "yes"')
ifeq ($(koch),yes)
  binDir = ../bin
endif

target := ?{"$(binDir)/" & toLowerAscii(c.name)}


ucpu := $(shell sh -c 'uname -m | tr "[:upper:]" "[:lower:]"')
ifeq ($(OS),Windows_NT)
  uos := windows
else
  uos := $(shell sh -c 'uname | tr "[:upper:]" "[:lower:]"')
endif

ifeq ($(uos),linux)
  myos = linux
  ## add -lrt to avoid "undefined reference to `clock_gettime'" with glibc<2.17
  LDFLAGS += -ldl -lm -lrt
endif
ifeq ($(uos),dragonfly)
  myos = freebsd
  LDFLAGS += -lm
endif
ifeq ($(uos),freebsd)
  myos= freebsd
  CC = clang
  LDFLAGS += -lm
endif
ifeq ($(uos),openbsd)
  myos = openbsd
  LDFLAGS += -lm
endif
ifeq ($(uos),netbsd)
  myos = netbsd
  LDFLAGS += -lm
  ucpu = $(shell sh -c 'uname -p')
endif
ifeq ($(uos),darwin)
  myos = macosx
  CC = clang
  LDFLAGS += -ldl -lm
  ifeq ($(HOSTTYPE),x86_64)
    ucpu = amd64
  endif
endif
ifeq ($(uos),aix)
  myos = aix
  LDFLAGS += -dl -lm
endif
ifeq ($(uos),solaris)
  myos = solaris
  LDFLAGS += -ldl -lm -lsocket -lnsl
endif
ifeq ($(uos),sun)
  myos = solaris
  LDFLAGS += -ldl -lm -lsocket -lnsl
endif
ifeq ($(uos),haiku)
  myos = haiku
endif
ifeq ($(uos),windows)
  myos = windows
  target := $(target).exe
endif
ifndef myos
  $(error unknown operating system: $(uos))
endif

ifeq ($(ucpu),i386)
  mycpu = i386
endif
ifeq ($(ucpu),i486)
  mycpu = i386
endif
ifeq ($(ucpu),i586)
  mycpu = i386
endif
ifeq ($(ucpu),i686)
  mycpu = i386
endif
ifeq ($(ucpu),bepc)
  mycpu = i386
endif
ifeq ($(ucpu),i86pc)
  mycpu = i386
endif
ifeq ($(ucpu),amd64)
  mycpu = amd64
endif
ifeq ($(ucpu),x86-64)
  mycpu = amd64
endif
ifeq ($(ucpu),x86_64)
  mycpu = amd64
endif
ifeq ($(ucpu),parisc64)
  mycpu = hppa
endif
ifeq ($(ucpu),s390x)
  mycpu = s390x
endif
ifeq ($(ucpu),sparc)
  mycpu = sparc
endif
ifeq ($(ucpu),sparc64)
  mycpu = sparc64
endif
ifeq ($(ucpu),sun)
  mycpu = sparc
endif
ifeq ($(ucpu),ppc64le)
  mycpu = powerpc64el
endif
ifeq ($(ucpu),ppc64)
  mycpu = powerpc64
  ifeq ($(myos),linux)
    CFLAGS += -m64
    LDFLAGS += -m64
  endif
endif
ifeq ($(ucpu),powerpc)
  mycpu = powerpc
  ifeq ($(myos),freebsd)
    mycpu = $(shell sh -c 'uname -p | tr "[:upper:]" "[:lower:]"')
    CFLAGS += -m64
    LDFLAGS += -m64
    ifeq ($(mycpu),powerpc64le)
      mycpu = powerpc64el
    endif
  endif
endif
ifeq ($(ucpu),ppc)
   mycpu = powerpc
endif
ifneq (,$(filter $(ucpu), mips mips64))
  mycpu = $(shell /bin/sh -c '"$(CC)" -dumpmachine | sed "s/-.*//"')
  ifeq (,$(filter $(mycpu), mips mipsel mips64 mips64el))
    $(error unknown MIPS target: $(mycpu))
  endif
endif
ifeq ($(ucpu),arm)
  mycpu = arm
endif
ifeq ($(ucpu),armeb)
  mycpu = arm
endif
ifeq ($(ucpu),armel)
  mycpu = arm
endif
ifeq ($(ucpu),armv6l)
  mycpu = arm
endif
ifeq ($(ucpu),armv7l)
  mycpu = arm
endif
ifeq ($(ucpu),armv7hl)
  mycpu = arm
endif
ifeq ($(ucpu),armv8l)
  mycpu = arm
endif
ifeq ($(ucpu),aarch64)
  mycpu = arm64
endif
ifeq ($(ucpu),arm64)
  mycpu = arm64
endif
ifeq ($(ucpu),riscv64)
  mycpu = riscv64
endif
ifeq ($(ucpu),e2k)
  mycpu = e2k
endif
ifeq ($(ucpu),loongarch64)
  mycpu = loongarch64
endif
ifndef mycpu
  $(error unknown CPU architecture: $(ucpu) See makefile.nimf)
endif

# for osA in 1..c.oses.len:
ifeq ($(myos),?{c.oses[osA-1]})
#   for cpuA in 1..c.cpus.len:
  ifeq ($(mycpu),?{c.cpus[cpuA-1]})
#     var oFiles = ""
#     for ff in c.cfiles[osA][cpuA].items:
#       oFiles.add(" " & changeFileExt(ff.toUnix, "o"))
#     end for
    oFiles =?oFiles
  endif
#   end for
endif
# end for

ifeq ($(strip $(oFiles)),)
  $(error no C code generated for: [$(myos): $(mycpu)])
endif

$(target): $(oFiles)
	@mkdir -p $(binDir)
	$(CC) -o $@ $^ $(LDFLAGS)
	@echo "SUCCESS"

.PHONY: clean

clean:
	rm -f $(oFiles) ?{"$(binDir)/" & toLowerAscii(c.name)}
