126 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
| include premake.make
 | |
| 
 | |
| LIBNAME := $(shell basename $$(pwd))
 | |
| UNAME_S := $(shell uname -s)
 | |
| 
 | |
| ifeq ($(UNAME_S),Darwin)
 | |
| 	LINKERNAME := $(LIBNAME).dylib
 | |
| 	SONAME := $(LIBNAME).$(MAJOR).dylib
 | |
| 	REALNAME := $(LINKERNAME)
 | |
| endif
 | |
| ifeq ($(UNAME_S),OpenBSD)
 | |
| 	REALNAME := $(LIBNAME).so.$(MAJOR).$(MINOR)
 | |
| endif
 | |
| ifeq ($(UNAME_S),Linux)
 | |
| 	LINKERNAME := $(LIBNAME).so
 | |
| 	SONAME := $(LINKERNAME).$(MAJOR)
 | |
| 	REALNAME := $(SONAME).$(MINOR).$(PATCH)
 | |
| endif
 | |
| STATICLIB := $(LIBNAME).a
 | |
| 
 | |
| BUILDDIR := build/intermediates/
 | |
| PREFIX ?= /usr/local
 | |
| BINDIR ?= $(PREFIX)/bin
 | |
| MANDIR ?= $(PREFIX)/man
 | |
| CONFIGDIR ?= $(PREFIX)/etc
 | |
| INCLUDEDIR ?= $(PREFIX)/include
 | |
| LIBDIR ?= $(PREFIX)/lib
 | |
| DATADIR ?= $(PREFIX)/share
 | |
| DOCDIR ?= $(DATADIR)/$(LIBNAME)/doc
 | |
| 
 | |
| SRCS := $(notdir $(wildcard src/*.cpp))
 | |
| OBJS := $(SRCS:.cpp=.o)
 | |
| DEPS := $(SRCS:.cpp=.dep)
 | |
| HDRS ?= $(wildcard src/*.hpp)
 | |
| 
 | |
| CXX ?= g++
 | |
| 
 | |
| CXXFLAGS += -Wshadow -Wall -Wpedantic -Wextra -Wno-unused-parameter
 | |
| CXXFLAGS += -g3 -std=c++20 -fPIC
 | |
| ifeq ($(DEBUG),1)
 | |
| 	CXXFLAGS += -D DEBUG -O0
 | |
| 	CONFIG := debug
 | |
| else
 | |
| 	CXXFLAGS += -D NDEBUG -O3
 | |
| 	CONFIG := release
 | |
| endif
 | |
| OUTDIR := build/$(CONFIG)/
 | |
| 
 | |
| RM := /bin/rm -rf
 | |
| INSTALL := /usr/bin/install -c
 | |
| 
 | |
| vpath %.cpp src
 | |
| vpath %.dep $(BUILDDIR)
 | |
| vpath %.o $(BUILDDIR)
 | |
| 
 | |
| .PHONY: all clean install prebuild test
 | |
| 
 | |
| all: prebuild $(OUTDIR)$(REALNAME) $(OUTDIR)$(STATICLIB)
 | |
| 
 | |
| prebuild:
 | |
| 	@mkdir -p $(BUILDDIR) $(OUTDIR)
 | |
| 
 | |
| $(OUTDIR)$(REALNAME): $(OBJS)
 | |
| ifeq ($(UNAME_S),Darwin)
 | |
| 	$(CXX) -dynamiclib -o $(OUTDIR)$(REALNAME) -current_version $(MAJOR) -compatibility_version $(MINOR) $(LDFLAGS) $(LDLIBS) $(addprefix $(BUILDDIR),$(OBJS))
 | |
| endif
 | |
| ifeq ($(UNAME_S),OpenBSD)
 | |
| 	$(CXX) -g -shared -Wl,-soname,$(REALNAME) -o $(OUTDIR)$(REALNAME) $(LDFLAGS) $(LDLIBS) $(addprefix $(BUILDDIR),$(OBJS))
 | |
| endif
 | |
| ifeq ($(UNAME_S),Linux)
 | |
| 	$(CXX) -g -shared -Wl,-soname,$(SONAME) -o $(OUTDIR)$(REALNAME) $(LDFLAGS) $(LDLIBS) $(addprefix $(BUILDDIR),$(OBJS))
 | |
| endif
 | |
| 
 | |
| %.o %.dep: %.cpp
 | |
| 	$(CXX) $(CXXFLAGS) -MMD -MP -MT $@ -MF $*.dep -c $<
 | |
| 	@mv $@ $*.dep $(BUILDDIR)
 | |
| 
 | |
| -include $(addprefix $(BUILDDIR), $(DEPS))
 | |
| 
 | |
| $(OUTDIR)$(STATICLIB): $(OBJS)
 | |
| 	ar r $(OUTDIR)$(STATICLIB) $(addprefix $(BUILDDIR),$(OBJS))
 | |
| 
 | |
| ifeq ($(GENERATELIBHEADER),1)
 | |
| $(LIBNAME).hpp: $(HDRS)
 | |
| 	@echo updating build/$(LIBNAME).hpp
 | |
| 	@cp /dev/null build/$(LIBNAME).hpp
 | |
| 	@for h in $(HDRS); \
 | |
| 	do \
 | |
| 		sed '/@exclude/d' $$h >> build/$(LIBNAME).hpp; \
 | |
| 	done
 | |
| HEADERSRCDIR := build
 | |
| else
 | |
| HEADERSRCDIR := src
 | |
| INCLUDEDIR := $(INCLUDEDIR)/$(LIBNAME)
 | |
| endif
 | |
| 
 | |
| test:
 | |
| 	$(MAKE) -C tests && tests/tests
 | |
| 
 | |
| clean:
 | |
| 	$(RM) build
 | |
| 	$(MAKE) -C tests clean
 | |
| 
 | |
| ifeq ($(GENERATELIBHEADER),1)
 | |
| install: $(LIBNAME).hpp
 | |
| else
 | |
| install:
 | |
| endif
 | |
| 	$(INSTALL) -d $(LIBDIR)
 | |
| 	$(INSTALL) -m 644 $(OUTDIR)$(REALNAME) $(LIBDIR)
 | |
| 	$(INSTALL) -m 644 $(OUTDIR)$(STATICLIB) $(LIBDIR)
 | |
| 	$(INSTALL) -d $(INCLUDEDIR)
 | |
| 	$(INSTALL) -m 644 $(HEADERSRCDIR)/$(LIBNAME).hpp $(INCLUDEDIR)
 | |
| ifeq ($(UNAME_S),Darwin)
 | |
| 	cd $(LIBDIR) && ln -sf $(REALNAME) $(SONAME)
 | |
| endif
 | |
| ifeq ($(UNAME_S),Linux)
 | |
| 	ldconfig
 | |
| 	cd $(LIBDIR) && ln -sf $(SONAME) $(LINKERNAME)
 | |
| endif
 | |
| ifeq ($(UNAME_S),OpenBSD)
 | |
| 	ldconfig -R
 | |
| endif
 | |
| 
 | |
| -include postmake.make
 |