И это всё МОЁ

Пишу реализацию HashMap. Makefile писал вручную.

SHELL		:= /bin/bash
PROJ_ROOT = $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
MAKEFILE = Makefile
DEL_FILE = rm -f
SRC_DIR = $(PROJ_ROOT)src
CITYHASH_SRC_DIR = $(SRC_DIR)/cityhash
TESTS_SRC_DIR = $(PROJ_ROOT)test
BUILD_DIR = $(PROJ_ROOT)build
LIB_BUILD_DIR = $(BUILD_DIR)/lib
TESTS_BUILD_DIR = $(PROJ_ROOT)build/test

LIB_SOURCES = $(wildcard $(SRC_DIR)/*.cpp)
LIB_OBJS = $(patsubst $(SRC_DIR)/%.cpp, $(LIB_BUILD_DIR)/.cpp.o%, $(LIB_SOURCES))
LIB = $(LIB_BUILD_DIR)/libhashmap.so

TEST_SOURCES = $(wildcard $(TESTS_SRC_DIR)/*.cpp)
TESTS_OBJS = $(patsubst $(TESTS_SRC_DIR)/%.cpp, $(TESTS_BUILD_DIR)/.cpp.o%, $(TEST_SOURCES))
TESTS = $(patsubst $(TESTS_SRC_DIR)/%.cpp, $(TESTS_BUILD_DIR)/%, $(TEST_SOURCES))

CITYHASH_OBJ = $(TESTS_BUILD_DIR)/city.cc.o

CXX = g++
INCLUDE_DIRS = $(SRC_DIR)
CXX_FLAGS = -std=c++14 -I$(INCLUDE_DIRS) -Wall -g -O3
CXX_LFLAGS = -std=c++14 -Wall -g -O3 -L$(LIB_BUILD_DIR)

lib: $(LIB)

tests: tests_clean $(CITYHASH_OBJ) lib $(TESTS)

#$(CITYHASH_OBJ):
$(TESTS_BUILD_DIR)/city.cc.o: $(CITYHASH_SRC_DIR)/city.cc
$(CXX) -c $(CXX_FLAGS) -o $@ $<

#$(LIB):
$(LIB_BUILD_DIR)/libhashmap.so: $(LIB_BUILD_DIR)/%.cpp.o $(TESTS_BUILD_DIR)/city.cc.o
$(CXX) -shared $(CXX_LFLAGS) -o $@ $^

#$(LIB_OBJS): - Не может найти эту цель.
$(LIB_BUILD_DIR)/%.cpp.o: $(SRC_DIR)/%.cpp
$(CXX) -c $(CXX_FLAGS) -o $@ $<

#$(TESTS_OBJS):
$(TESTS_BUILD_DIR)/%.cpp.o: $(TESTS_SRC_DIR)/%.cpp
$(CXX) -c $(CXX_FLAGS) -o $@ $<

#$(TESTS):
$(TESTS_BUILD_DIR)/%: $(TESTS_BUILD_DIR)/%.cpp.o $(TESTS_BUILD_DIR)/city.cc.o
$(CXX) $(CXX_FLAGS) -o $@ $^
@echo 'run a test: ' $@
@$@
@if [[ $$? == 0 ]]; then \
echo "Test: '`basename $@`' Completed Succesfully!"; \
else \
echo "Test: '`basename $@`' Failed!"; \
fi

tests_clean:
$(DEL_FILE) $(TESTS_BUILD_DIR)/*

clean: tests_clean
$(DEL_FILE) $(LIB_BUILD_DIR)/*

watch:
$(foreach v, $(.VARIABLES), $(info $(v) = $($(v))))

При попытке выполнить .make tests make выводит ошибку:

make: *** Нет правила для сборки цели «/home/r2d2/proj/cpp_c/hashmap/cpp_hashmap/build/lib/%.cpp.o», 
требуемой для «/home/r2d2/proj/cpp_c/hashmap/cpp_hashmap/build/lib/libhashmap.so». Останов.

Хотя цель задана:

$(LIB_BUILD_DIR)/%.cpp.o: $(SRC_DIR)/%.cpp
$(CXX) -c $(CXX_FLAGS) -o $@ $<

Куда копать и что делать?

Есть репозиторий на github
. Только перед сборкой создайте директории в корне - mkdir -p build/{test,lib}








 , ,