Skip to content

Instantly share code, notes, and snippets.

@Guiorgy
Created April 15, 2021 14:43
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Guiorgy/d38cb14a2d0b5e3d8d784ac04e6434d9 to your computer and use it in GitHub Desktop.
Save Guiorgy/d38cb14a2d0b5e3d8d784ac04e6434d9 to your computer and use it in GitHub Desktop.
C++ library Makefile template
# Makefile based on https://gist.github.com/rioki/3957339 and https://stackoverflow.com/a/12099167
PACKAGE = my_package
VERSION = 1.0.0
CXX ?= g++ -std=c++0x
CXXFLAGS += -march=native -I include -D VERSION=\"$(VERSION)\" -D MY_PACKAGE_EXPORTS
LDFLAGS +=
ifeq ($(OS),Windows_NT)
UNAME_S = WIN
CXXFLAGS += -D _WINDOWS
EXEEXT = .exe
LIBEXT = .dll
ifeq ($(PROCESSOR_ARCHITEW6432),AMD64)
CXXFLAGS += -D AMD64 -m64
else
ifeq ($(PROCESSOR_ARCHITECTURE),AMD64)
CXXFLAGS += -D AMD64 -m64
endif
ifeq ($(PROCESSOR_ARCHITECTURE),x86)
CXXFLAGS += -D IA32 -m32
endif
ifeq ($(PROCESSOR_ARCHITECTURE),ARM64)
CXXFLAGS += -D ARM -m64
endif
endif
else
UNAME_S := $(shell uname -s)
EXEEXT =
LIBEXT = .so
ifeq ($(UNAME_S),Linux)
CXXFLAGS += -D LINUX
endif
ifeq ($(UNAME_S),Darwin)
CXXFLAGS += -D OSX
endif
UNAME_M := $(shell uname -m)
ifeq ($(UNAME_M),x86_64)
CXXFLAGS += -D AMD64 -m64
endif
ifneq ($(filter %86,$(UNAME_M)),)
CXXFLAGS += -D IA32 -m32
endif
ifneq ($(filter arm%,$(UNAME_M)),)
CXXFLAGS += -D ARM
endif
endif
headers = $(wildcard include/*.h)
lib_hdr = $(wildcard src/*.h)
lib_src = $(wildcard src/*.cpp)
lib_libs =
extra_dist = Makefile
ifneq (,$(wildcard ./README.md))
extra_dist += README.md
endif
ifneq (,$(wildcard ./LICENSE))
extra_dist += LICENSE
endif
dist_files = $(headers) $(lib_hdr) $(lib_src) $(extra_dist)
.PHONY: all clean dist install uninstall
all: bin/lib$(PACKAGE)$(LIBEXT)
bin/lib$(PACKAGE)$(LIBEXT): $(patsubst src/%.cpp, obj/%.o, $(lib_src))
mkdir -p bin
$(CXX) -shared -fPIC -Wall -Wextra -O2 -g $(CXXFLAGS) $(LDFLAGS) $^ $(lib_libs) -Wl,--out-implib=$(patsubst %$(LIBEXT),%.a, $@) -o $@
strip --strip-unneeded $@
clean:
rm -f obj/**/*.o obj/**/*.d bin/lib$(PACKAGE)$(LIBEXT) bin/lib$(PACKAGE).a *.tar.gz
dist:
mkdir -p $(PACKAGE)-$(VERSION)
cp --parents $(dist_files) $(PACKAGE)-$(VERSION)
rm -f $(PACKAGE)-$(VERSION).tar.gz
tar -czvf $(PACKAGE)-$(VERSION).tar.gz $(PACKAGE)-$(VERSION)
rm -rf $(PACKAGE)-$(VERSION)
install: bin/lib$(PACKAGE)$(LIBEXT)
ifeq ($(UNAME_S),Linux)
mkdir -p $(prefix)/include/$(PACKAGE)
cp $(wildcard src/*.h) $(prefix)/include/$(PACKAGE)
mkdir -p $(prefix)/lib
cp bin/lib$(PACKAGE).a $(prefix)/lib
mkdir -p $(prefix)/bin
cp bin/lib$(PACKAGE)$(LIBEXT) $(prefix)/lib
else
@echo Only supported on Linux machines!
endif
uninstall:
ifeq ($(UNAME_S),Linux)
rm -r $(prefix)/include/$(PACKAGE)
rm $(prefix)/lib/lib$(PACKAGE).a
rm $(prefix)/lib/lib$(PACKAGE)$(LIBEXT)
else
@echo Only supported on Linux machines!
endif
obj/%.o : src/%.cpp $(wildcard include/*.h)
mkdir -p obj
$(CXX) $(CXXFLAGS) -fPIC -MD -c $< -o $(patsubst src/%.cpp, obj/%.o, $<)
# ifneq "$(MAKECMDGOALS)" "clean"
# deps = $(patsubst %.cpp, %.d, $(lib_src))
# -include $(deps)
# endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment