# Copyright 2023 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

# Native Simulator (NSI) Makefile.
# It builds the simulator runner itself, and produces the final
# Linux executable by linking it to the the embedded cpu library

# By default all the build output is placed under the _build folder, but the user can override it
# setting the NSI_BUILD_PATH
#
# The caller can provide an optional configuration file and point to it with NSI_CONFIG_FILE
# See "Configurable/user overridible variables" below.
#
# By default only the core of the runner will be built, but the caller can set NSI_NATIVE
# to also build the components in native/src/

NSI_CONFIG_FILE?=nsi_config
-include ${NSI_CONFIG_FILE}
#If the file does not exist, we don't use it as a build dependency
NSI_CONFIG_FILE:=$(wildcard ${NSI_CONFIG_FILE})

# Configurable/user overridible variables:
#  Path to the native_simulator (this folder):
NSI_PATH?=./
#  Folder where the build output will be placed
NSI_BUILD_PATH?=$(abspath _build/)
EXE_NAME?=native_simulator.exe
#  Final executable path/file_name which will be produced
NSI_EXE?=${NSI_BUILD_PATH}/${EXE_NAME}
# Number of embedded CPUs/MCUs
NSI_N_CPUS?=1
# Path to all CPUs embedded SW which will be linked with the final executable
NSI_EMBEDDED_CPU_SW?=
#  Host architecture configuration switch
NSI_ARCH?=-m32
#  Coverage switch (GCOV coverage is enabled by default)
NSI_COVERAGE?=--coverage
NSI_LOCALIZE_OPTIONS?=
NSI_BUILD_OPTIONS?=${NSI_ARCH} ${NSI_COVERAGE}
NSI_LINK_OPTIONS?=${NSI_ARCH} ${NSI_COVERAGE}
#  Extra source files to be built in the runner context
NSI_EXTRA_SRCS?=
#  Extra include directories to be used while building in the runner context
NSI_EXTRA_INCLUDES?=
#  Extra libraries to be linked to the final executable
NSI_EXTRA_LIBS?=

SHELL?=bash
#  Compiler
NSI_CC?=gcc
#  Archive program (it is unlikely you'll need to change this)
NSI_AR?=ar
#  Objcopy program (it is unlikely you'll need to change this)
NSI_OBJCOPY?=objcopy

#  Build debug switch (by default enabled)
NSI_DEBUG?=-g
#  Build optimization level (by default disabled to ease debugging)
NSI_OPT?=-O0
#  Warnings switches (for the runner itself)
NSI_WARNINGS?=-Wall -Wpedantic
#  Preprocessor flags
NSI_CPPFLAGS?=-D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED

NO_PIE_CO:=-fno-pie -fno-pic
DEPENDFLAGS:=-MMD -MP
CFLAGS:=${NSI_DEBUG} ${NSI_WARNINGS} ${NSI_OPT} ${NO_PIE_CO} -DNSI_N_CPUS=${NSI_N_CPUS} \
  -ffunction-sections -fdata-sections ${DEPENDFLAGS} -std=c11 ${NSI_BUILD_OPTIONS}
FINALLINK_FLAGS:=${NO_PIE_CO} -no-pie  ${NSI_WARNINGS} \
  -Wl,--gc-sections -ldl -pthread \
  ${NSI_LINK_OPTIONS} -lm

no_default:
	@echo "There is no default rule, please specify what you want to build,\
 or run make help for more info"

RUNNER_LIB:=runner.a

SRCS:=$(shell ls ${NSI_PATH}common/src/*.c)
ifdef NSI_NATIVE
  SRCS+=$(shell ls ${NSI_PATH}native/src/*.c)
endif

INCLUDES:=-I${NSI_PATH}common/src/include/ \
 -I${NSI_PATH}common/src \
 ${NSI_EXTRA_INCLUDES}

ifdef NSI_NATIVE
  INCLUDES+=-I${NSI_PATH}native/src/include/
endif

EXTRA_OBJS:=$(abspath $(addprefix $(NSI_BUILD_PATH)/,$(sort ${NSI_EXTRA_SRCS:%.c=%.o})))
OBJS:=$(abspath $(addprefix $(NSI_BUILD_PATH)/,${SRCS:${NSI_PATH}%.c=%.o})) ${EXTRA_OBJS}

DEPENDFILES:=$(addsuffix .d,$(basename ${OBJS}))

-include ${DEPENDFILES}

LOCALIZED_EMBSW:=$(abspath $(addprefix $(NSI_BUILD_PATH)/,$(addsuffix .loc_cpusw.o,${NSI_EMBEDDED_CPU_SW})))

${NSI_BUILD_PATH}:
	@if [ ! -d ${NSI_BUILD_PATH} ]; then mkdir -p ${NSI_BUILD_PATH}; fi

#Extra sources build:
${NSI_BUILD_PATH}/%.o: /%.c ${NSI_PATH}Makefile ${NSI_CONFIG_FILE}
	@if [ ! -d $(dir $@) ]; then mkdir -p $(dir $@); fi
	${NSI_CC} ${NSI_CPPFLAGS} ${INCLUDES} ${CFLAGS} -c $< -o $@

${NSI_BUILD_PATH}/%.o: ${NSI_PATH}/%.c ${NSI_PATH}Makefile ${NSI_CONFIG_FILE}
	@if [ ! -d $(dir $@) ]; then mkdir -p $(dir $@); fi
	${NSI_CC} ${NSI_CPPFLAGS} ${INCLUDES} ${CFLAGS} -c $< -o $@

${NSI_BUILD_PATH}/linker_script.ld : ${NSI_PATH}/common/other/linker_script.pre.ld | ${NSI_BUILD_PATH}
	${NSI_CC} -x c -E -P $< -o $@  ${DEPENDFLAGS}

${NSI_BUILD_PATH}/${RUNNER_LIB}: ${OBJS}
	if [ -f $@ ]; then rm $@ ; fi
	${NSI_AR} -cr $@ ${OBJS}

${NSI_BUILD_PATH}/%.loc_cpusw.o: /% ${NSI_CONFIG_FILE}
	@if [ -z $< ] || [ ! -f $< ]; then \
	  echo "Error: Input embedded CPU SW ($<) not found \
(NSI_EMBEDDED_CPU_SW=${NSI_EMBEDDED_CPU_SW} )"; \
	  false; \
	fi
	@if [ ! -d $(dir $@) ]; then mkdir -p $(dir $@); fi
	${NSI_OBJCOPY} --localize-hidden $< $@ -w --localize-symbol=_* ${NSI_LOCALIZE_OPTIONS}

${NSI_EXE}: ${NSI_BUILD_PATH}/${RUNNER_LIB} ${LOCALIZED_EMBSW} ${NSI_EXTRA_LIBS} \
 ${NSI_BUILD_PATH}/linker_script.ld
	${NSI_CC} -Wl,--whole-archive ${LOCALIZED_EMBSW} ${NSI_BUILD_PATH}/${RUNNER_LIB} \
	  ${NSI_EXTRA_LIBS} -Wl,--no-whole-archive \
	  -o $@ ${FINALLINK_FLAGS} -T ${NSI_BUILD_PATH}/linker_script.ld

Makefile: ;

link_with_esw: ${NSI_EXE};

runner_lib: ${NSI_BUILD_PATH}/${RUNNER_LIB}

all: link_with_esw

clean:
	@echo "Deleting intermediate compilation results + libraries + executables (*.d .o .a .exe)"
	find $(NSI_BUILD_PATH) -name "*.o" -or -name "*.exe" -or -name "*.a" -or -name "*.d" | xargs rm -f

clean_coverage:
	find $(NSI_BUILD_PATH) -name "*.gcda" -or -name "*.gcno" | xargs rm -f ; true

clean_all: clean clean_coverage ;

.PHONY: clean clean_coverage clean_all link_with_esw runner_lib no_default all ${DEPENDFILES}

ifndef NSI_BUILD_VERBOSE
.SILENT:
endif

help:
	@echo "*******************************"
	@echo "* Native Simulator makefile *"
	@echo "*******************************"
	@echo "Provided rules:"
	@echo " clean           : clean all build output"
	@echo " clean_coverage  : clean all coverage files"
	@echo " clean_all       : clean + clean_coverage"
	@echo " link_with_esw   : Link the runner with the CPU embedded sw"
	@echo " runner_lib      : Build the runner itself (pending the embedded SW)"
	@echo " all             : link_with_esw"
	@echo "Note that you can use TAB to autocomplete rules in the command line in modern OSs"
