# SPDX-License-Identifier: GPL-2.0+ OR MIT

ifneq ($(shell $(CC) --version 2>&1 | head -n 1 | grep clang),)
CLANG_FLAGS += -no-integrated-as
endif

top_srcdir = ../../../..
include $(top_srcdir)/scripts/subarch.include
ARCH ?= $(SUBARCH)
LINUX_TOOL_ARCH_INCLUDE = $(top_srcdir)/tools/arch/$(ARCH)/include

CFLAGS += -O2 -Wall -g -I./ $(KHDR_INCLUDES) -L$(OUTPUT) -Wl,-rpath=./ \
	  $(CLANG_FLAGS) -I$(top_srcdir)/tools/include \
	  -I$(LINUX_TOOL_ARCH_INCLUDE)
LDLIBS += -lpthread -ldl

# Own dependencies because we only want to build against 1st prerequisite, but
# still track changes to header files and depend on shared object.
OVERRIDE_TARGETS = 1

comma := ,
RSEQ_ARCH_SUPPORTED = $(shell printf '\043if defined(__x86_64__) || defined(__i386__) || \
	defined(__ARMEL__) || defined(__AARCH64EL__) || \
	defined(__PPC__) || defined(__mips__) || defined(__s390__) || \
	defined(__or1k__) || (defined(__riscv) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)\n1\n\043endif\n' | \
	$(filter-out -fuse-ld=%,$(CC)) $(filter-out -L% -Wl$(comma)%,$(CFLAGS) $(USERCFLAGS)) \
	-E -P -x c - || echo 1)

TEST_GEN_PROGS = $(if $(filter 1,$(RSEQ_ARCH_SUPPORTED)),$(RSEQ_TEST_GEN_PROGS))
TEST_GEN_PROGS_EXTENDED = $(if $(filter 1,$(RSEQ_ARCH_SUPPORTED)),$(RSEQ_TEST_GEN_PROGS_EXTENDED))
TEST_PROGS = $(if $(filter 1,$(RSEQ_ARCH_SUPPORTED)),$(RSEQ_TEST_PROGS))

RSEQ_TEST_GEN_PROGS = basic_test basic_percpu_ops_test basic_percpu_ops_mm_cid_test \
		 param_test_benchmark param_test_mm_cid_benchmark

RSEQ_TEST_GEN_PROGS_EXTENDED = librseq.so \
	param_test \
	param_test_compare_twice \
	param_test_mm_cid \
	param_test_mm_cid_compare_twice \
	syscall_errors_test \
	legacy_check \
	slice_test \
	check_optimized

RSEQ_TEST_PROGS = run_param_test.sh run_syscall_errors_test.sh run_legacy_check.sh run_timeslice_test.sh

TEST_FILES := settings

include ../lib.mk

$(OUTPUT)/librseq.so: rseq.c rseq.h rseq-*.h
	$(CC) $(CFLAGS) -shared -fPIC $< $(LDLIBS) -o $@

$(OUTPUT)/%: %.c $(OUTPUT)/librseq.so rseq.h rseq-*.h
	$(CC) $(CFLAGS) $< $(LDLIBS) -lrseq -o $@

$(OUTPUT)/basic_percpu_ops_mm_cid_test: basic_percpu_ops_test.c $(OUTPUT)/librseq.so rseq.h rseq-*.h
	$(CC) $(CFLAGS) -DBUILDOPT_RSEQ_PERCPU_MM_CID $< $(LDLIBS) -lrseq -o $@

$(OUTPUT)/param_test_benchmark: param_test.c $(OUTPUT)/librseq.so \
					rseq.h rseq-*.h
	$(CC) $(CFLAGS) -DBENCHMARK $< $(LDLIBS) -lrseq -o $@

$(OUTPUT)/param_test_compare_twice: param_test.c $(OUTPUT)/librseq.so \
					rseq.h rseq-*.h
	$(CC) $(CFLAGS) -DRSEQ_COMPARE_TWICE $< $(LDLIBS) -lrseq -o $@

$(OUTPUT)/param_test_mm_cid: param_test.c $(OUTPUT)/librseq.so \
					rseq.h rseq-*.h
	$(CC) $(CFLAGS) -DBUILDOPT_RSEQ_PERCPU_MM_CID $< $(LDLIBS) -lrseq -o $@

$(OUTPUT)/param_test_mm_cid_benchmark: param_test.c $(OUTPUT)/librseq.so \
					rseq.h rseq-*.h
	$(CC) $(CFLAGS) -DBUILDOPT_RSEQ_PERCPU_MM_CID -DBENCHMARK $< $(LDLIBS) -lrseq -o $@

$(OUTPUT)/param_test_mm_cid_compare_twice: param_test.c $(OUTPUT)/librseq.so \
					rseq.h rseq-*.h
	$(CC) $(CFLAGS) -DBUILDOPT_RSEQ_PERCPU_MM_CID -DRSEQ_COMPARE_TWICE $< $(LDLIBS) -lrseq -o $@

$(OUTPUT)/syscall_errors_test: syscall_errors_test.c $(OUTPUT)/librseq.so \
					rseq.h rseq-*.h
	$(CC) $(CFLAGS) $< $(LDLIBS) -lrseq -o $@

$(OUTPUT)/slice_test: slice_test.c $(OUTPUT)/librseq.so rseq.h rseq-*.h
	$(CC) $(CFLAGS) $< $(LDLIBS) -lrseq -o $@

$(OUTPUT)/check_optimized: check_optimized.c $(OUTPUT)/librseq.so rseq.h rseq-*.h
	$(CC) $(CFLAGS) $< $(LDLIBS) -lrseq -o $@
