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