#
# file makefile 2018.04.07
#
# Все файлы проекта в нескольких директориях
# Все файлы в каждой директории - файлы проекта
#
#
#-------------------------------------------------------
# Compiler name
#
CC := g++
#-------------------------------------------------------
# Result
#
PNAME := boostintdll.so
#-------------------------------------------------------
# Модули c интерфейсными функциями dll
#
#DLLINTERFACE := dllmod1 dllmod2
DLLINTERFACE := boostintmod
#-------------------------------------------------------
# mkf name - сделаем сборку зависимой от изменения
# и .mkf-файла тоже
#
MN := makefile
#-------------------------------------------------------
# директории для поиска файлов
#
source_dir1 := .
source_dir2 := ../gen
source_dir2p := ../gen/
source_dir3 := ../boost
source_dir3p := ../boost/
source_dirs := $(source_dir1) $(source_dir2) $(source_dir3)
# поиск хеадеров (сначала в своей директории):
search_h1 := $(source_dir1) $(source_dir2) $(source_dir3)
search_h2 := $(source_dir2)
search_h3 := $(source_dir3) $(source_dir2)
#
search_sources := $(addsuffix /*.cpp,$(source_dirs))
search_dir1 := $(addsuffix /*.cpp,$(source_dir1))
search_dir2 := $(addsuffix /*.cpp,$(source_dir2))
search_dir3 := $(addsuffix /*.cpp,$(source_dir3))
#-------------------------------------------------------
# LIBs
#
LIBS := -lpthread -lrt -nostdlib
LIBPRJ := libut.a
LIBG := $(addsuffix /libg.a,$(source_dir2))
LIBI := $(addsuffix /libb.a,$(source_dir3))
#-------------------------------------------------------
# Опции компилера
#
CFLAGS := -Wall -W -Werror -pipe -O2 -fexceptions --static -c -MMD -fPIC
#-------------------------------------------------------
# Опции линкера
#
LFLAGS := -Wall -pipe -L/usr/lib -L/usr/lib/nptl -D_REENTRANT -s -shared
#-------------------------------------------------------
# общая цель - состоит в данном случае из 3-х целей
# 1. статическая библиотека $(LIBG)
# 2. статическая библиотека $(LIBI)
# 3. программа $(PNAME) с использованием этих библиотек
#
.PHONY : all
all: $(LIBG) $(LIBI) $(PNAME)
#-------------------------------------------------------
# библиотеку $(LIBG) сделаем из файлов в директории
# $(source_dir2)
#
$(LIBG): $(MN)
$(LIBG): $(patsubst %.cpp,%.o,$(wildcard $(search_dir2)))
VPATH := $(source_dir2)
$(addprefix $(source_dir2p),%.o): $(addprefix $(source_dir2p),%.cpp) $(MN)
$(CC) $(CFLAGS) $(addprefix -I ,$(search_h2)) $< -o $@
ar cr $(LIBG) $@
#-------------------------------------------------------
include $(wildcard $(addprefix $(source_dir2p),*.d))
#-------------------------------------------------------
# библиотеку $(LIBI) сделаем из файлов в директории
# $(source_dir3)
#
$(LIBI): $(MN)
$(LIBI): $(patsubst %.cpp,%.o,$(wildcard $(search_dir3)))
VPATH := $(source_dir3)
$(addprefix $(source_dir3p),%.o): $(addprefix $(source_dir3p),%.cpp) $(MN)
$(CC) $(CFLAGS) $(addprefix -I ,$(search_h3)) $< -o $@
ar cr $(LIBI) $@
#-------------------------------------------------------
include $(wildcard $(addprefix $(source_dir3p),*.d))
#-------------------------------------------------------
#-------------------------------------------------------
# $< - 1 param, $^ - all params, $@ - target
# запуск линкера - собираем результат из библиотек и .o файлов
#
$(PNAME): $(LIBG)
$(PNAME): $(LIBI)
$(PNAME): $(LIBPRJ)
$(PNAME): $(MN)
$(PNAME): $(notdir $(patsubst %.cpp,%.o,$(wildcard $(search_sources))))
$(CC) $(LFLAGS) $(addsuffix .o,$(DLLINTERFACE)) $(LIBPRJ) $(LIBI) $(LIBG) $(LIBS) -o $@
#-------------------------------------------------------
# установим путь для поиска файлов
#
VPATH := $(source_dir1) : $(source_dir2) : $(source_dir3)
%.o: %.cpp $(MN)
$(CC) $(CFLAGS) $(addprefix -I ,$(source_dirs)) $<
#.......................................................
# укажем зависимости, сгенерированне компилером
#
include $(wildcard *.d)
#.......................................................
# внесём все .o файлы директории $(source_dir1) в библиотеку проекта $(LIBPRJ)
#
$(LIBPRJ): $(notdir $(patsubst %.cpp,%.o,$(wildcard $(search_dir1))))
ar cr $@ *.o
#-------------------------------------------------------
#
.PHONY : clean
clean:
rm -f *.o *.d
#-------------------------------------------------------