# SPDX-License-Identifier: GPL-2.0+ OR MIT
# Copyright (c) 2026 Frank Secilia

obj-m += curves_mouse_acceleration.o

# find relative c++ compiler
ifeq ($(CXX),)
    CXX := $(patsubst %cc,%g++,$(patsubst %gcc,%g++,$(patsubst %clang,%clang++,$(CC))))
endif

# filter c flags for conflicts with c++
filtered_c_flags := -std=gnu% \
                    -Wdesignated-init \
                    -Werror=designated-init \
                    -Werror=implicit-function-declaration \
                    -Werror=implicit-int \
                    -Werror=incompatible-pointer-types \
                    -Werror=strict-prototypes \
                    -Wimplicit- \
                    -Wimplicit-function-declaration \
                    -Wimplicit-int \
                    -Wincompatible-pointer-types \
                    -Wmissing-prototypes \
                    -Wno-override-init \
                    -Wno-pointer-sign \
                    -Wno-unterminated-string-initialization \
                    -Wno-unused-const-variable \
                    -Wstrict-prototypes
common_flags = $(filter-out $(filtered_c_flags), $(KBUILD_CFLAGS))

# combine c++ flags
cxx_flags = $(common_flags) -Wall -Werror -Wextra -Wstrict-aliasing=2 -Wswitch-enum -fstrict-aliasing -ffreestanding -std=c++23 -fsized-deallocation -fno-builtin -fno-exceptions -fno-rtti -fno-threadsafe-statics -fno-use-cxa-atexit -nostdinc++ -nostdlib

# add standard c++ compile rule
quiet_cmd_cxx_o_cpp = CXX [M]  $@
cmd_cxx_o_cpp = $(CXX) $(cxx_flags) -c -o $@ $<

# add standard c++ pattern rule
$(obj)/%.o: $(src)/%.cpp FORCE
	$(call if_changed,cxx_o_cpp)

# configure floating point sources
objs_float := math.o
$(foreach obj,$(objs_float),$(eval CFLAGS_REMOVE_$(obj) += $(CC_FLAGS_NO_FPU)))
$(foreach obj,$(objs_float),$(eval CFLAGS_$(obj)        += $(CC_FLAGS_FPU)))

curves_mouse_acceleration-y := entry_point.o fpu_guard.o $(objs_float)

ccflags-y += -I$(src) -DCRV_DRIVER_VERSION="0.0.1-standalone"
