# 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 -lpthread -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
