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