# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
include $(top_builddir)/src/Makefile.global

MOCK_DIR=$(top_builddir)/src/test/unit/mock
CMOCKERY_DIR=$(top_builddir)/src/test/unit/cmockery
CMOCKERY_OBJS=$(CMOCKERY_DIR)/cmockery.o
override CFLAGS+= -w $(PTHREAD_CFLAGS)
override CPPFLAGS+= -I$(top_srcdir)/src/backend/libpq \
					-I$(top_srcdir)/src/backend/gp_libpq_fe \
					-I$(top_srcdir)/src/backend/postmaster \
					-I. -I$(top_builddir)/src/port -I$(CMOCKERY_DIR) \
					-DDLSUFFIX=$(DLSUFFIX) \
					-I$(top_srcdir)/src/include/resourcemanager \
					-I$(top_srcdir)/src/backend/resourcemanager

# TODO: add ldl for quick hack; we need to figure out why
# postgres in src/backend/Makefile doesn't need this and -pthread.

THRIFTLIB = -lthrift
LIBS := $(LIBS) $(THRIFTLIB)

#CPLUSPLUSLIB = -lstdc++
#LIBS := $(LIBS) $(CPLUSPLUSLIB)

#GLIBLIB = -lgobject-2.0 -lglib-2.0
#LIBS := $(LIBS) $(GLIBLIB)


MOCK_LIBS := -ldl -lesmtp $(filter-out -lpgport -lesmtp -ledit, $(LIBS))
 

# We are unable to mock them up at the moment.  Real objects should contain them.
EXCL_OBJS=src/backend/bootstrap/bootparse.o \
			src/backend/catalog/caql/gram.o \
			src/backend/parser/gram.o \
			src/backend/regex/regcomp.o \
			src/backend/regex/regexec.o \
			src/backend/utils/adt/like.o \
			src/backend/utils/misc/guc.o \
			src/backend/access/parquet/metadatautil_c++/Metadatainterface.o \
			src/backend/access/parquet/metadatautil_c++/MetadataUtil.o \
			src/backend/access/parquet/metadatautil_c++/parquet_constants.o \
			src/backend/access/parquet/metadatautil_c++/parquet_types.o \
			src/backend/access/parquet/metadatautil_c++/thrift-util.o \
			src/timezone/%.o \
            src/backend/main/%.o \
			src/backend/gpopt/%.o \
			src/backend/gpopt/config/%.o \
			src/backend/gpopt/relcache/%.o \
			src/backend/gpopt/translate/%.o \
			src/backend/gpopt/utils/%.o

OBJFILES=$(top_srcdir)/src/backend/objfiles.txt
ALL_OBJS=$(addprefix $(top_srcdir)/, \
			$(filter-out $(EXCL_OBJS), \
				$(shell test -f $(OBJFILES) && cat $(OBJFILES))))

SUT_OBJ=$(top_srcdir)/$(subdir)/$(1).o
# A function that generates TARGET_OBJS = test case, mock objects, real objects,
# and cmockery.o. $(OBJFILES) contains %/objfiles.txt, because
# src/backend/Makefile will create it with rule=objfiles.txt, which is not
# expected in postgres rule.  It actually uses expand_subsys to obtain the .o
# file list.  But here we don't include common.mk so just clear out
# objfiles.txt from the list for $(TARGET_OBJS)
TARGET_OBJS=$(shell echo $(1)_test.o $(CMOCKERY_OBJS) $($(1)_REAL_OBJS) \
		$(patsubst $(top_srcdir)/src/%.o,$(MOCK_DIR)/%_mock.o,\
			$(filter-out $(SUT_OBJ) $($(1)_REAL_OBJS) %/objfiles.txt, \
				$(ALL_OBJS))))


$(abs_top_srcdir)/src/%.c:

# In order to avoid symlink issue, we should explicitly specify
# absolute path for both --out-dir and --src-dir.
$(MOCK_DIR)/%_mock.c: $(abs_top_srcdir)/src/%.c
	@echo mocking $<
	@(cd $(MOCK_DIR) && PYTHONPATH=$(python_libdir) $(PYTHON) mocker.py \
		--out-dir=$(abs_top_srcdir)/src/test/unit/mock \
		--src-dir=$(abs_top_srcdir)/src $<)

# For some reason, mock.o files are intermediate files sometimes.
# Mark them as secondary in order not to be deleted automatically.
.SECONDARY:
$(MOCK_DIR)/%_mock.o: $(MOCK_DIR)/%_mock.c

all: $(patsubst %,%.t,$(TARGETS))

# The test target depends on $(OBJFILES) which would update files including mocks.
%.t: $(OBJFILES) $(CMOCKERY_OBJS) %_test.o mockup-phony
	$(CC) $(CFLAGS) $(LDFLAGS) $(call TARGET_OBJS,$*) $(MOCK_LIBS) -o $@

# We'd like to call only src/backend, but it seems we should build src/port and
# src/timezone before src/backend.  This is not the case when main build has finished,
# but this makes sure a simple make works fine in this directory any time.
# With PARTIAL_LINKING it will generate objfiles.txt
$(OBJFILES): $(ALL_OBJS)
	$(MAKE) -C $(top_srcdir)/src
	$(MAKE) PARTIAL_LINKING= -C $(top_srcdir)/src/backend objfiles.txt

# Need to separate make, as it's using the output of another make.
mockup-phony: $(OBJFILES)
	$(MAKE) mockup

.PHONY:
mockup: $(patsubst $(top_srcdir)/src/%.o,$(MOCK_DIR)/%_mock.o,$(ALL_OBJS))


.PHONY:
check: $(patsubst %,%-check,$(TARGETS))

.PHONY:
%-check: %.t
	./$*.t

.PHONY:
clean: $(patsubst %,%-clean,$(TARGETS))

.PHONY:
%-clean:
	rm -f $*.t $*_test.o

.PHONY:
clean-mock: $(patsubst %,%-clean-mock,$(TARGETS))

.PHONY:
%-clean-mock:
	rm -rf $(MOCK_DIR)/backend
