Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
makefile-library 7.84 KiB
SHELL:=/bin/bash

LTO_PARAM:=
ifeq ($(USE_LTO),1)
LTO_PARAM:=-flto
endif

MARCH_PARAM:=
ifneq ($(USE_MARCH),)
MARCH_PARAM:=-march=$(USE_MARCH)
endif

FULL_LIBRARY:=lib$(LIBRARY).so
define NEW_LINE


endef

export NEW_LINE

CXX_FLAGS := -Wall -pedantic -Wextra -Werror -Wshadow -Wpointer-arith -Wcast-qual -Wdelete-non-virtual-dtor -Wredundant-decls

space := $(eval) $(eval)

TEST_LINK_LIBRARIES+= $(LINK_LIBRARIES) $(LIBRARY)
TEST_SYSTEM_LIBRARIES+= $(SYSTEM_LIBRARIES)


INCLUDE_PATHS:=$(addprefix -I, $(realpath $(addsuffix /src, $(addprefix ../, $(LINK_LIBRARIES) $(LIBRARY)))) $(SYSTEM_INCLUDE_PATHS))
TEST_INCLUDE_PATHS:=$(addprefix -I, $(realpath $(addsuffix /src, $(addprefix ../, $(TEST_LINK_LIBRARIES)))) $(TEST_SYSTEM_INCLUDE_PATHS))


DEBUG_LINK_PATHS:=$(addsuffix /lib-debug, $(addprefix ../, $(LINK_LIBRARIES)))
DEBUG_TEST_LINK_PATHS:=$(addsuffix /lib-debug, $(addprefix ../, $(TEST_LINK_LIBRARIES)))

LDFLAGS_DEBUG:=-rdynamic -shared $(addprefix -L, $(DEBUG_LINK_PATHS)) $(addprefix -l, $(LINK_LIBRARIES) $(SYSTEM_LIBRARIES))
TEST_LDFLAGS_DEBUG:=-Wl,--no-as-needed $(addprefix -L, $(DEBUG_TEST_LINK_PATHS)) -rdynamic $(addprefix -l, $(TEST_LINK_LIBRARIES) $(TEST_SYSTEM_LIBRARIES)) -lcppunit -Wl,-rpath,.


RELEASE_LINK_PATHS:=$(addsuffix /lib-release, $(addprefix ../, $(LINK_LIBRARIES)))
RELEASE_TEST_LINK_PATHS:=$(addsuffix /lib-release, $(addprefix ../, $(TEST_LINK_LIBRARIES)))

LDFLAGS_RELEASE:=-rdynamic -shared $(LTO_PARAM) $(addprefix -L, $(RELEASE_LINK_PATHS)) $(addprefix -l, $(LINK_LIBRARIES) $(SYSTEM_LIBRARIES))
TEST_LDFLAGS_RELEASE:=-Wl,--no-as-needed $(addprefix -L, $(RELEASE_TEST_LINK_PATHS)) -rdynamic $(addprefix -l, $(TEST_LINK_LIBRARIES) $(TEST_SYSTEM_LIBRARIES)) -lcppunit $(LTO_PARAM) -Wl,-rpath,.


OBJECTS_DEBUG:=$(patsubst src/%.cpp,obj-debug/%.o, $(shell find src/ -name *cpp))
TEST_OBJECTS_DEBUG:=$(patsubst test-src/%.cpp,test-obj-debug/%.o, $(shell find test-src/ -name *cpp))

OBJECTS_RELEASE:=$(patsubst src/%.cpp,obj-release/%.o, $(filter-out $(wildcard src/debug/*), $(shell find src/ -name *cpp)))
TEST_OBJECTS_RELEASE:=$(patsubst test-src/%.cpp,test-obj-release/%.o, $(shell find test-src/ -name *cpp))

.PHONY: all debug release clean build-debug build-release clean-debug clean-release doc

all:
	@echo "What to do master?"

FORCE:

# -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# make subdir makefile

%/makefile: ../makefile-library ../build.conf makefile makefile.conf
	if [ ! -w $(dir $@) ] && [ $(USE_RAMDISK) -eq 1 ]; then\
		ln -s /tmp/`date +'%s%N'`-$(dir $@) $(subst /,, $(dir $@)) 2>/dev/null;\
	fi;\
	if [ -L $(subst /,, $(dir $@)) ]; then\
		mkdir -p `readlink $(subst /,, $(dir $@))`;\
	else\
		mkdir -p $(dir $@);\
	fi
	cp ../makefile-rec $@

# -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# final lib/bin construction

lib-debug/$(FULL_LIBRARY): $(OBJECTS_DEBUG) obj-debug/
	if [ ! -w $(dir $@) ] && [ $(USE_RAMDISK) -eq 1 ]; then\
		ln -s /tmp/`date +'%s%N'`-$(dir $@) $(subst /,, $(dir $@)) 2>/dev/null;\
	fi;\
	if [ -L $(subst /,, $(dir $@)) ]; then\
		mkdir -p `readlink $(subst /,, $(dir $@))`;\
	else\
		mkdir -p $(dir $@);\
	fi
	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)

lib-release/$(FULL_LIBRARY): $(OBJECTS_RELEASE) obj-release/
	if [ ! -w $(dir $@) ] && [ $(USE_RAMDISK) -eq 1 ]; then\
		ln -s /tmp/`date +'%s%N'`-$(dir $@) $(subst /,, $(dir $@)) 2>/dev/null;\
	fi;\
	if [ -L $(subst /,, $(dir $@)) ]; then\
		mkdir -p `readlink $(subst /,, $(dir $@))`;\
	else\
		mkdir -p $(dir $@);\
	fi
	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)

test-bin-debug/$(TESTBIN): $(TEST_OBJECTS_DEBUG) test-obj-debug/
	if [ ! -w $(dir $@) ] && [ $(USE_RAMDISK) -eq 1 ]; then\
		ln -s /tmp/`date +'%s%N'`-$(dir $@) $(subst /,, $(dir $@)) 2>/dev/null;\
	fi;\
	if [ -L $(subst /,, $(dir $@)) ]; then\
		mkdir -p `readlink $(subst /,, $(dir $@))`;\
	else\
		mkdir -p $(dir $@);\
	fi
	$(CXX) $(TEST_OBJECTS_DEBUG) -o $@ $(TEST_LDFLAGS_DEBUG)

test-bin-release/$(TESTBIN): $(TEST_OBJECTS_RELEASE) test-obj-release/
	if [ ! -w $(dir $@) ] && [ $(USE_RAMDISK) -eq 1 ]; then\
		ln -s /tmp/`date +'%s%N'`-$(dir $@) $(subst /,, $(dir $@)) 2>/dev/null;\
	fi;\
	if [ -L $(subst /,, $(dir $@)) ]; then\
		mkdir -p `readlink $(subst /,, $(dir $@))`;\
	else\
		mkdir -p $(dir $@);\
	fi
	$(CXX) $(TEST_OBJECTS_RELEASE) -o $@ $(TEST_LDFLAGS_RELEASE)

# -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# subdir make calls

obj-debug/: FORCE obj-debug/makefile
	$(MAKE) -C $@ OBJECTS_BASE_DIR=$(realpath obj-debug) SOURCES_BASE_DIR=$(realpath src) CXX_OTHER_FLAGS="-g -Og -DDEBUG $(CXX_FLAGS) $(INCLUDE_PATHS)"

obj-release/: FORCE obj-release/makefile
	$(MAKE) -C $@ OBJECTS_BASE_DIR=$(realpath obj-release) SOURCES_BASE_DIR=$(realpath src) CXX_OTHER_FLAGS="-O3 -DNDEBUG -DRELEASE $(LTO_PARAM) $(MARCH_PARAM) $(CXX_FLAGS) $(INCLUDE_PATHS)"

test-obj-debug/: FORCE test-obj-debug/makefile
	$(MAKE) -C $@ OBJECTS_BASE_DIR=$(realpath test-obj-debug) SOURCES_BASE_DIR=$(realpath test-src) CXX_OTHER_FLAGS="-g -Og -DDEBUG $(CXX_FLAGS) $(INCLUDE_PATHS) $(TEST_INCLUDE_PATHS)"

test-obj-release/: FORCE test-obj-release/makefile
	$(MAKE) -C $@ OBJECTS_BASE_DIR=$(realpath test-obj-release) SOURCES_BASE_DIR=$(realpath test-src) CXX_OTHER_FLAGS="-O3 -DNDEBUG -DRELEASE $(LTO_PARAM) $(MARCH_PARAM) $(CXX_FLAGS) $(INCLUDE_PATHS) $(TEST_INCLUDE_PATHS)"

# -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# objects dependencies

$(OBJECTS_DEBUG): obj-debug/
$(OBJECTS_RELEASE): obj-release/

$(TEST_OBJECTS_DEBUG): test-obj-debug/

$(TEST_OBJECTS_RELEASE): test-obj-release/

# -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# standalone main targets

test-unit-debug:
	LD_LIBRARY_PATH="$(subst $(space),:,$(DEBUG_TEST_LINK_PATHS))" test-bin-debug/$(TESTBIN)

test-unit-release:
	LD_LIBRARY_PATH="$(subst $(space),:,$(RELEASE_TEST_LINK_PATHS))" test-bin-release/$(TESTBIN)

build-test-debug: test-bin-debug/$(TESTBIN)

build-test-release: test-bin-release/$(TESTBIN)

build-code-debug: lib-debug/$(FULL_LIBRARY)

build-code-release: lib-release/$(FULL_LIBRARY)

# -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# do all main targets

debug:
	$(MAKE) build-code-debug
	$(MAKE) build-test-debug
	$(MAKE) test-unit-debug

release:
	$(MAKE) build-code-release
	$(MAKE) build-test-release
	$(MAKE) test-unit-release

clean: clean-debug clean-release
	$(RM) -r doc

clean-debug:
	if [ -L obj-debug ]; then\
		$(RM) -r `readlink obj-debug`;\
	fi
	if [ -L lib-debug ]; then\
		$(RM) -r `readlink lib-debug`;\
	fi
	if [ -L test-obj-debug ]; then\
		$(RM) -r `readlink test-obj-debug`;\
	fi
	if [ -L test-bin-debug ]; then\
		$(RM) -r `readlink test-bin-debug`;\
	fi
	$(RM) -r *.o *.d lib-debug obj-debug test-bin-debug test-obj-debug CppUnitTestResults.xml

clean-release:
	if [ -L obj-release ]; then\
		$(RM) -r `readlink obj-release`;\
	fi
	if [ -L lib-release ]; then\
		$(RM) -r `readlink lib-release`;\
	fi
	if [ -L test-obj-release ]; then\
		$(RM) -r `readlink test-obj-release`;\
	fi
	if [ -L test-bin-release ]; then\
		$(RM) -r `readlink test-bin-release`;\
	fi
	$(RM) -r *.o *.d lib-release obj-release test-bin-release test-obj-release CppUnitTestResults.xml

doc:
	doxygen