# Copyright (c) 2020, NVIDIA CORPORATION.  All rights reserved.
#
# NVIDIA CORPORATION and its licensors retain all intellectual property
# and proprietary rights in and to this software, related documentation
# and any modifications thereto.  Any use, reproduction, disclosure or
# distribution of this software and related documentation without an express
# license agreement from NVIDIA CORPORATION is strictly prohibited.

include ../../../../make/nvdefs.mk

# Build all drivers in the ./cameramodule directory
DRIVER_NAMES = $(notdir $(shell find cameramodule/MAX96712cameramodule/* -maxdepth 0 -type d))
DRIVER_LIBS = $(foreach DRIVER, $(DRIVER_NAMES), cameramodule/MAX96712cameramodule/$(DRIVER)/libnvsipl_devblk_drv_$(DRIVER).so)
DEVICES_NAMES = $(notdir $(shell find devices/* -maxdepth 0 -type d))

CFLAGS   := $(NV_PLATFORM_OPT) $(NV_PLATFORM_CFLAGS)
CFLAGS   += -D_FILE_OFFSET_BITS=64 -fPIC
CFLAGS   += $(NV_PLATFORM_SDK_INC) -I. -I../ -I../../utils $(foreach DEVICE, $(DEVICES_NAMES), -Idevices/$(DEVICE))
CFLAGS   += -I./common/utils

CXXFLAGS += $(NV_PLATFORM_SDK_INC) $(NV_PLATFORM_CPPFLAGS)
CXXFLAGS += -I. -I./common -I./common/include -I./common/utils -I./common/core -I./common/trace  -I./cameramodule
CXXFLAGS += -I../query/src -I./devices $(foreach DEVICE, $(DEVICES_NAMES), -Idevices/$(DEVICE))
CXXFLAGS += -std=c++14 -fexceptions -frtti -fPIC


LDFLAGS  := -L$(NV_PLATFORM_SDK_LIB_DIR) -Wl,--no-undefined

LDLIBS  += -lnvmedia
LDLIBS  += -lnvsipl_devblk_cdi
LDLIBS  += -ltacp

ifeq ($(NV_PLATFORM_OS), Linux)
  LDLIBS  += -lstdc++ -ldl -lpthread
endif

ifeq ($(NV_PLATFORM_OS), QNX)
  LDLIBS   += -lc++
  CFLAGS   += -DNVMEDIA_QNX
  CXXFLAGS += -DNVMEDIA_QNX
endif

.PHONY: default
default: $(DRIVER_LIBS)

CNvMPlatform.o: ../query/src/platform/CNvMPlatform.cpp
	$(CXX) $(CXXFLAGS) -o $@ -c $^

# Intantiate a rule to build each driver
DRIVER_COMMON_OBJS := \
	CNvMPlatform.o \
	$(patsubst %.cpp, %.o, common/utils/CNvMI2CAddrMgr.cpp) \
	$(patsubst %.cpp, %.o, $(wildcard cameramodule/MAX96712cameramodule/*.cpp)) \
	$(patsubst %.cpp, %.o, $(shell find common/core common/trace devices -name '*.cpp')) \
	$(patsubst %.c, %.o, $(shell find common/core common/trace devices -name '*.c')) \
	common/trace/cdi_debug_log.o \
	../../utils/log_utils.o \
	../../utils/thread_utils.o

define DRIVER_RULE
OBJS_$(1) = $(patsubst %.cpp, %.o, $(wildcard cameramodule/MAX96712cameramodule/$(1)/*.cpp)) $(patsubst %.c, %.o, $(wildcard cameramodule/MAX96712cameramodule/$(1)/*.c))
OBJS_$(1) += $(DRIVER_COMMON_OBJS)
cameramodule/MAX96712cameramodule/$(1)/libnvsipl_devblk_drv_$(1).so: $$(OBJS_$(1))
	$(CXX) -shared $(LDFLAGS) -o $$@ $$^ $(LDLIBS) $(LDFLAGS)

endef
$(foreach DRIVER, $(DRIVER_NAMES), $(eval $(call DRIVER_RULE,$(DRIVER))))

clean clobber:
	find . -name '*.so' -exec echo rm {} + -exec rm {} +
	find . -name '*.o' -exec echo rm {} + -exec rm {} +
