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