1####### Platform specifics 2 3# cut is necessary for Cygwin 4PLATFORM_OS := $(shell uname | cut -d_ -f1) 5 6####### Makefile Conventions - Directory variables 7 8srcdir = . 9prefix = /usr/local 10 11exec_prefix = $(prefix) 12sysconfdir = $(prefix)/etc 13includedir = $(prefix)/include 14datarootdir = $(prefix)/share 15localstatedir = $(prefix)/var 16 17bindir = $(exec_prefix)/bin 18libdir = $(exec_prefix)/lib 19libexecdir = $(exec_prefix)/libexec 20sbindir = $(exec_prefix)/sbin 21 22datadir = $(datarootdir) 23docdir = $(datarootdir)/doc/pev 24infodir = $(datarootdir)/info 25localedir = $(datarootdir)/locale 26 27mandir = $(datarootdir)/man 28manext = .1 29man1dir = $(mandir)/man1 30man1ext = .1 31 32####### Makefile Conventions - Utilities 33 34CC ?= gcc 35LINK = $(CC) 36CHK_DIR_EXISTS = test -d 37CHK_FILE_EXISTS = test -f 38INSTALL = install 39INSTALL_DATA = ${INSTALL} -m 644 40INSTALL_PROGRAM = $(INSTALL) 41SYMLINK = ln -sf 42MKDIR = mkdir -p 43RM = rm -f 44RM_DIR = rm -rf 45ifeq ($(PLATFORM_OS), Darwin) 46 STRIP = strip -x 47else 48 STRIP = strip --strip-unneeded 49endif 50 51####### Compiler options 52 53override CFLAGS += -W -Wall -Wextra -pedantic -std=c99 -c 54ifneq ($(PLATFORM_OS), CYGWIN) 55 override CFLAGS += -fPIC 56endif 57 58VERSION = 1.0 59LIBNAME = libpe 60 61libpe_BUILDDIR = $(CURDIR)/build 62libpe_SRCS_FILTER = $(wildcard ${dir}/*.c) 63libpe_SRCS = $(foreach dir, ${srcdir}, ${libpe_SRCS_FILTER}) 64libpe_OBJS = $(addprefix ${libpe_BUILDDIR}/, $(addsuffix .o, $(basename ${libpe_SRCS}))) 65 66####### Build rules 67 68.PHONY : libpe install strip-binaries install-strip uninstall clean 69 70all: libpe 71 72libpe: CPPFLAGS += -D_GNU_SOURCE 73ifeq ($(PLATFORM_OS), CYGWIN) 74libpe: CPPFLAGS += -D_XOPEN_SOURCE=500 75endif 76libpe: $(libpe_OBJS) 77ifeq ($(PLATFORM_OS), Linux) 78 $(LINK) -shared -Wl,-soname,$(LIBNAME).so.1 $(LDFLAGS) -o $(LIBNAME).so $^ 79else ifeq ($(PLATFORM_OS), NetBSD) 80 $(LINK) -shared -Wl,-soname,$(LIBNAME).so.1 $(LDFLAGS) -o $(LIBNAME).so $^ 81else ifeq ($(PLATFORM_OS), DragonFly) 82 $(LINK) -shared -Wl,-soname,$(LIBNAME).so.1 $(LDFLAGS) -o $(LIBNAME).so $^ 83else ifeq ($(PLATFORM_OS), Darwin) 84 $(LINK) -headerpad_max_install_names -dynamiclib \ 85 -flat_namespace -install_name $(LIBNAME).$(VERSION).dylib \ 86 -current_version $(VERSION) -compatibility_version $(VERSION) \ 87 $(LDFLAGS) -o $(LIBNAME).dylib $^ 88else ifeq ($(PLATFORM_OS), CYGWIN) 89 $(LINK) -shared $(LDFLAGS) -o $(LIBNAME).dll $^ 90endif 91 92$(libpe_BUILDDIR)/%.o: %.c 93 @$(CHK_DIR_EXISTS) $(dir $@) || $(MKDIR) $(dir $@) 94 $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $< 95 96install: installdirs 97ifeq ($(PLATFORM_OS), Linux) 98 $(INSTALL_DATA) $(LIBNAME).so $(DESTDIR)$(libdir)/$(LIBNAME).so.$(VERSION) 99 cd $(DESTDIR)$(libdir); $(SYMLINK) $(LIBNAME).so.$(VERSION) $(LIBNAME).so 100 cd $(DESTDIR)$(libdir); $(SYMLINK) $(LIBNAME).so.$(VERSION) $(LIBNAME).so.1 101else ifeq ($(PLATFORM_OS), NetBSD) 102 $(INSTALL_DATA) $(LIBNAME).so $(DESTDIR)$(libdir)/$(LIBNAME).so.$(VERSION) 103 cd $(DESTDIR)$(libdir); $(SYMLINK) $(LIBNAME).so.$(VERSION) $(LIBNAME).so 104 cd $(DESTDIR)$(libdir); $(SYMLINK) $(LIBNAME).so.$(VERSION) $(LIBNAME).so.1 105else ifeq ($(PLATFORM_OS), DragonFly) 106 $(INSTALL_DATA) $(LIBNAME).so $(DESTDIR)$(libdir)/$(LIBNAME).so.$(VERSION) 107 cd $(DESTDIR)$(libdir); $(SYMLINK) $(LIBNAME).so.$(VERSION) $(LIBNAME).so 108 cd $(DESTDIR)$(libdir); $(SYMLINK) $(LIBNAME).so.$(VERSION) $(LIBNAME).so.1 109else ifeq ($(PLATFORM_OS), Darwin) 110 $(INSTALL_DATA) $(LIBNAME).dylib $(DESTDIR)$(libdir)/$(LIBNAME).$(VERSION).dylib 111 cd $(DESTDIR)$(libdir); $(SYMLINK) $(LIBNAME).$(VERSION).dylib $(LIBNAME).dylib 112 cd $(DESTDIR)$(libdir); $(SYMLINK) $(LIBNAME).$(VERSION).dylib $(LIBNAME).1.dylib 113else ifeq ($(PLATFORM_OS), CYGWIN) 114 # TODO 115endif 116 117installdirs: 118 @$(CHK_DIR_EXISTS) $(DESTDIR) || $(MKDIR) $(DESTDIR) 119 @$(CHK_DIR_EXISTS) $(DESTDIR)$(libdir) || $(MKDIR) $(DESTDIR)$(libdir) 120 121strip-binaries: 122ifeq ($(PLATFORM_OS), Linux) 123 $(STRIP) $(LIBNAME).so 124else ifeq ($(PLATFORM_OS), NetBSD) 125 $(STRIP) $(LIBNAME).so 126else ifeq ($(PLATFORM_OS), DragonFly) 127 $(STRIP) $(LIBNAME).so 128else ifeq ($(PLATFORM_OS), Darwin) 129 $(STRIP) $(LIBNAME).dylib 130else ifeq ($(PLATFORM_OS), CYGWIN) 131 $(STRIP) $(LIBNAME).dll 132endif 133 134install-strip: strip-binaries install 135 136uninstall: 137 $(RM) $(DESTDIR)$(libdir)/$(LIBNAME).so* \ 138 $(DESTDIR)$(libdir)/$(LIBNAME)*.dylib 139 140clean: 141 $(RM_DIR) $(libpe_BUILDDIR) 142 $(RM) $(LIBNAME)*.o \ 143 $(LIBNAME)*.so \ 144 $(LIBNAME)*.dylib \ 145 $(LIBNAME)*.dll 146