1####### Platform specifics
2
3# cut is necessary for Cygwin
4export PLATFORM_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 = $(prefix)/man
28manext = .1
29man1dir = $(mandir)/man1
30man1ext = .1
31
32export pluginsdir = $(DESTDIR)$(libdir)/pev/plugins
33
34####### Makefile Conventions - Utilities
35
36export CC ?= gcc
37export LINK = $(CC)
38export CHK_DIR_EXISTS = test -d
39export CHK_FILE_EXISTS = test -f
40export INSTALL = install
41export INSTALL_DATA = ${INSTALL} -m 644
42export INSTALL_PROGRAM = ${INSTALL}
43export SYMLINK = ln -sf
44export MKDIR = mkdir -p
45export RM = rm -f
46export RM_DIR = rm -rf
47ifeq ($(PLATFORM_OS), Darwin)
48	export STRIP = strip -x
49else
50	export STRIP = strip --strip-unneeded
51endif
52
53####### Compiler options
54
55override LDFLAGS += -L$(LIBPE) -lpe
56override CFLAGS += -I$(LIBPE) -I"../include" -W -Wall -Wextra -std=c99 -pedantic
57override CPPFLAGS += -D_GNU_SOURCE -DSHAREDIR="\"$(SHAREDIR)"\"
58
59ifeq ($(PLATFORM_OS), Darwin)
60	# We disable warnings for deprecated declarations since Apple deprecated OpenSSL in Mac OS X 10.7
61	override CFLAGS += -Wno-deprecated-declarations
62endif
63
64ifeq ($(PLATFORM_OS), CYGWIN)
65	override CPPFLAGS += -D_XOPEN_SOURCE=600
66endif
67
68SRC_DIRS = $(srcdir) $(srcdir)/compat $(srcdir)/../lib/libfuzzy
69
70PROGS = readpe rva2ofs ofs2rva pehash pesec pescan pepack pestr pedis peres
71PLUGINS_DIR = $(srcdir)/plugins
72SHAREDIR = $(datadir)/pev
73export LIBPE = $(realpath $(srcdir)/../lib/libpe)
74LIBUDIS86 = $(srcdir)/../lib/libudis86
75LIBFUZZY = $(srcdir)/../lib/libfuzzy
76MANDIR = $(srcdir)/../doc/manpages
77
78export pev_BUILDDIR = ./build
79pev_SRCS_FILTER = $(wildcard ${dir}/*.c)
80pev_SRCS = $(foreach dir, ${SRC_DIRS}, ${pev_SRCS_FILTER})
81pev_OBJS = $(addprefix ${pev_BUILDDIR}/, $(addsuffix .o, $(basename ${pev_SRCS})))
82
83pev_COMMON_DEPS = \
84	$(pev_BUILDDIR)/compat/strlcat.o \
85	$(pev_BUILDDIR)/config.o \
86	$(pev_BUILDDIR)/dylib.o \
87	$(pev_BUILDDIR)/malloc_s.o \
88	$(pev_BUILDDIR)/utils.o \
89	$(pev_BUILDDIR)/plugins.o \
90	$(pev_BUILDDIR)/output_plugin.o \
91	$(pev_BUILDDIR)/output.o \
92	$(pev_BUILDDIR)/pev_api.o
93
94####### Build rules
95
96.PHONY: plugins install installdirs uninstall clean
97
98all: $(PROGS) plugins
99
100plugins:
101	cd $(PLUGINS_DIR) && $(MAKE) $@
102
103ofs2rva: $(pev_BUILDDIR)/ofs2rva.o $(pev_OBJS)
104	$(CC) $< -o $(pev_BUILDDIR)/$@ $(pev_COMMON_DEPS) $(LDFLAGS)
105
106pedis: CPPFLAGS += -DHAVE_STRING_H
107pedis: CFLAGS += -I$(LIBUDIS86)
108pedis: $(pev_BUILDDIR)/pedis.o $(pev_OBJS)
109	$(CC) $< -o $(pev_BUILDDIR)/$@ $(pev_COMMON_DEPS) $(LDFLAGS) $(CFLAGS) $(CPPFLAGS) $(LIBUDIS86)/libudis86/*.c
110
111pehash: LDFLAGS += -lssl -lcrypto
112pehash: CFLAGS += -I$(LIBFUZZY)
113pehash: $(pev_BUILDDIR)/pehash.o $(pev_OBJS)
114	$(CC) $< -o $(pev_BUILDDIR)/$@ $(pev_COMMON_DEPS) $(LDFLAGS) $(CFLAGS) $(CPPFLAGS) $(LIBFUZZY)/*.c
115
116pepack: $(pev_BUILDDIR)/pepack.o $(pev_OBJS)
117	$(CC) $< -o $(pev_BUILDDIR)/$@ $(pev_COMMON_DEPS) $(LDFLAGS) $(CFLAGS) $(CPPFLAGS)
118
119peres: $(pev_BUILDDIR)/peres.o $(pev_OBJS)
120	$(CC) $< -o $(pev_BUILDDIR)/$@ $(pev_COMMON_DEPS) $(LDFLAGS) $(CFLAGS) $(CPPFLAGS)
121
122pescan: LDFLAGS += -lm
123pescan: $(pev_BUILDDIR)/pescan.o $(pev_OBJS)
124	$(CC) $< -o $(pev_BUILDDIR)/$@ $(pev_COMMON_DEPS) $(LDFLAGS) $(CFLAGS) $(CPPFLAGS)
125
126pesec: LDFLAGS += -lcrypto
127pesec: $(pev_BUILDDIR)/pesec.o $(pev_OBJS)
128	$(CC) $< -o $(pev_BUILDDIR)/$@ $(pev_COMMON_DEPS) $(LDFLAGS) $(CFLAGS) $(CPPFLAGS)
129
130pestr: $(pev_BUILDDIR)/pestr.o $(pev_OBJS)
131	$(CC) $< -o $(pev_BUILDDIR)/$@ $(pev_COMMON_DEPS) $(LDFLAGS) $(CFLAGS) $(CPPFLAGS)
132
133readpe: $(pev_BUILDDIR)/readpe.o $(pev_OBJS)
134	$(CC) $< -o $(pev_BUILDDIR)/$@ $(pev_COMMON_DEPS) $(LDFLAGS) $(CFLAGS) $(CPPFLAGS)
135
136rva2ofs: $(pev_BUILDDIR)/rva2ofs.o $(pev_OBJS)
137	$(CC) $< -o $(pev_BUILDDIR)/$@ $(pev_COMMON_DEPS) $(LDFLAGS) $(CFLAGS) $(CPPFLAGS)
138
139# Generic rule matching sources
140
141$(pev_BUILDDIR)/%.o: %.c
142	@$(CHK_DIR_EXISTS) $(dir $@) || $(MKDIR) $(dir $@)
143	$(CC) -c -o $@ $< $(CFLAGS) $(CPPFLAGS) $(INCPATH)
144
145install: installdirs
146	for prog in $(PROGS); do \
147		$(INSTALL_PROGRAM) $(pev_BUILDDIR)/$$prog $(DESTDIR)$(bindir); \
148		$(CHK_FILE_EXISTS) $(MANDIR)/$$prog$(man1ext) && \
149			gzip -c -9 $(MANDIR)/$$prog$(man1ext) > $(DESTDIR)$(man1dir)/$$prog$(man1ext).gz || \
150			echo -n; \
151	done
152
153	$(INSTALL_DATA) $(srcdir)/userdb.txt $(DESTDIR)$(SHAREDIR)
154	cd $(PLUGINS_DIR) && $(MAKE) $@
155
156install-strip: installdirs
157	for prog in $(PROGS); do \
158		$(INSTALL_PROGRAM) -s $(pev_BUILDDIR)/$$prog $(DESTDIR)$(bindir); \
159		$(CHK_FILE_EXISTS) $(MANDIR)/$$prog$(man1ext) && \
160			gzip -c -9 $(MANDIR)/$$prog$(man1ext) > $(DESTDIR)$(man1dir)/$$prog$(man1ext).gz || \
161			echo -n; \
162	done
163
164	$(INSTALL_DATA) $(srcdir)/userdb.txt $(DESTDIR)$(SHAREDIR)
165	cd $(PLUGINS_DIR) && $(MAKE) $@
166
167installdirs:
168	@$(CHK_DIR_EXISTS) $(DESTDIR) || $(MKDIR) $(DESTDIR)
169	@$(CHK_DIR_EXISTS) $(DESTDIR)$(bindir) || $(MKDIR) $(DESTDIR)$(bindir)
170	@$(CHK_DIR_EXISTS) $(DESTDIR)$(man1dir) || $(MKDIR) $(DESTDIR)$(man1dir)
171	@$(CHK_DIR_EXISTS) $(DESTDIR)$(SHAREDIR) || $(MKDIR) $(DESTDIR)$(SHAREDIR)
172
173uninstall:
174	for prog in $(PROGS); do \
175		$(RM) $(DESTDIR)$(bindir)/$$prog; \
176		$(RM) $(DESTDIR)$(man1dir)/$$prog$(man1ext).gz; \
177	done
178	$(RM_DIR) $(DESTDIR)$(SHAREDIR)
179	cd $(PLUGINS_DIR) && $(MAKE) $@
180
181clean:
182	$(RM_DIR) $(pev_BUILDDIR)
183	$(RM) $(PROGS)
184	cd $(PLUGINS_DIR) && $(MAKE) $@
185