File Makefile of Package pvm
#
# $Id: Makefile.aimk,v 1.40 2001/05/11 18:58:10 pvmsrc Exp $
#
# Generic Makefile body to be concatenated to config header.
#
# Imports:
# PVM_ARCH = the official pvm-name of your processor
# ARCHCFLAGS = special cc flags
# ARCHDLIB = special libs needed for daemon
# ARCHDOBJ = special objects needed for daemon
# HASRANLIB = 't' or 'f'
# AMEM = Memory page locks from Convex
# PLOCKFILE = Page Lock in line code from SUN
#
# Compatibility defines (usually in conf/*.def):
# FDSETPATCH if system includes don't have fd_set stuff
# USESTRERROR if sys_errlist, sys_nerr not public, use strerror()
# HASERRORVARS if errno, sys_nerr, sys_errlist already declared
# HASSTDLIB if system has stdlib.h
# NEEDENDIAN to include <endian.h>
# NEEDMENDIAN to include <machine/endian.h>
# NOGETDTBLSIZ if system doesn't have getdtablesize()
# NOREXEC if system doesn't have rexec()
# NOSOCKOPT if system doesn't have setsockopt() / it doesn't work
# NOSTRCASE if system doesn't have strcasecmp, strncasecmp
# NOTMPNAM if system doesn't have tmpnam() or it's hosed
# NOUNIXDOM to disable use of Unix domain sockets
# NOWAIT3 if system doesn't have wait3()
# NOWAITPID if system doesn't have waitpid() either
# RSHCOMMAND= for rsh command other than "/usr/ucb/rsh"
# (can override using PVM_RSH environment variable)
# SHAREDTMP if /tmp is shared between machines (yecch)
# SOCKADHASLEN if struct sockaddr has an sa_len field
# SYSVBFUNC if system uses memcpy() instead of bcopy(), etc.
# SYSVSIGNAL if system has sysV signal handling
# SYSVSTR if system uses strchr() instead of index()
# UDPMAXLEN= for alternate max udp packet size
# NEEDSSELECTH if you need to include select.h to get fd_set (IBMs)
# SOCKLENISUINT if socket parameter is unsigned int (or size_t),
# generally -> recvfrom() accept() getsockname()
# remove flag for AIX 4.1 compiler complaints...
# FDSETNOTSTRUCT if fd_set var declarations do not require "struct"
# CTIMEISTIMET if ctime() takes an arg of type "time_t"
# SYSERRISCONST if char *sys_errlist[] defined as const
#
# Options defines:
# CLUMP_ALLOC allocates several data structures in big chunks
# MCHECKSUM to enable crc checksums on messages
# RSHNPLL= for number of parallel rsh startups (default is 5)
# RSHTIMEOUT= for rsh timeout other than default (60 sec)
# STATISTICS to enable collection of statistics in pvmd
# TIMESTAMPLOG to enable timestamps in pvmd log file
# USE_PVM_ALLOC to enable instrumented malloc functs (for pvm debug)
# USE_GNU_REGEX to enable use of GNU Regex for Mbox Lookup
# -> requires installation of GNU regex, as well as
# modifying the following defines (see below):
# REGEXCONF, REGEXCONFOS2, REGEXOBJS
#
include $(PVM_ROOT)/conf/$(PVM_ARCH).def
SHELL = /bin/sh
PVMDIR = ../..
SDIR = $(PVMDIR)/src
LIBDIR = $(PVMDIR)/lib/$(PVM_ARCH)
CFLOPTS = -O
#CFLOPTS = -g
#OPTIONS = -DCLUMP_ALLOC
#OPTIONS = -DSTATISTICS
#OPTIONS = -p
OPTIONS = -DCLUMP_ALLOC -DSTATISTICS \
-DTIMESTAMPLOG -DSANITY
CFLAGS = $(CFLOPTS) $(OPTIONS) -I$(PVMDIR)/include \
-DARCHCLASS=\"$(PVM_ARCH)\" -DIMA_$(PVM_ARCH) \
$(ARCHCFLAGS)
LIBPREFIX = lib
LIBPVM = $(LIBPREFIX)pvm3
LIBVERSION = 3
SHLIBPVM = -shared -Wl,-soname,$(LIBPVM).so.$(LIBVERSION)
#
# GNU Regular Expression Defines - set if needed
#
REGEXCONF =
#REGEXCONF = regexconfig
REGEXCONFOS2 =
#REGEXCONFOS2 = regexconfig-os2
REGEXOBJS =
#REGEXOBJS = pvmregex.o regex.o
#
# PVM Daemon & Library Objects
#
DOBJ = \
ddpro.o \
host.o \
hoster.o \
imalloc.o \
msgbox.o \
pkt.o \
pmsg.o \
pvmalloc.o \
pvmcruft.o \
pvmd.o \
pvmdpack.o \
pvmdtev.o \
pvmerr.o \
pvmfrag.o \
pvmlog.o \
sdpro.o \
task.o \
tdpro.o \
waitc.o \
global.o \
$(REGEXOBJS)
SOCKDOBJ = \
pvmdabuf.o \
pvmdunix.o
SHMEMDOBJ = \
$(AMEMOBJ) \
nmdclass.o \
pvmdshmem.o \
pvmshmem.o
MPPDOBJ = \
mppchunkhost.o \
mppmsghost.o \
lmsg.o \
pvmdabuf.o \
pvmdmimd.o \
pvmdunix.o
BEODOBJ = \
pvmdmimd.o
OS2DOBJ = \
deathapi.o \
sthoster.o \
stdlog.o \
rexec.o \
ruserpas.o \
os2spawn.o
LOBJ = \
imalloc.o \
tev.o \
lpvmcat.o \
lpvmgen.o \
lpvmpack.o \
lpvmglob.o \
pmsg.o \
pvmalloc.o \
pvmcruft.o \
pvmerr.o \
pvmfrag.o \
waitc.o \
global.o
LPVMSOCK = lpvm.o
SOCKLOBJ = \
pvmdabuf.o
LPVMSHMEM = lpvmshmem.o
SHMEMLOBJ = \
$(AMEMOBJ) \
pvmshmem.o
LPVMMIMD = lpvmmimd.o
MPPLOBJ = \
mppchunknode.o \
mppmsgnode.o \
lmsg.o \
lpvmmpp.o \
pvmdabuf.o
OS2LOBJ = stdlog.o
REGEXSRC = \
$(SDIR)/regex/Makefile.in \
$(SDIR)/regex/configure \
$(SDIR)/regex/configure.in \
$(SDIR)/regex/pvmregex.c \
$(SDIR)/regex/regex.c \
$(SDIR)/regex/regex.h
REGEXDIR = ./regex
REGEXCP = \
$(REGEXDIR)/Makefile.in \
$(REGEXDIR)/configure \
$(REGEXDIR)/configure.in \
$(REGEXDIR)/pvmregex.c \
$(REGEXDIR)/regex.c \
$(REGEXDIR)/regex.h
REGEXOPTS = CC=$(CC) \
CFLAGS="$(CFLOPTS) -DREGEX_MALLOC $(ARCHCFLAGS)"
SHMEMTARGETS = $(LIBDIR)/pvmd3-shm \
$(LIBDIR)/lib-shm $(LIBDIR)/$(LIBPVM)s.a
MPPTARGETS = $(LIBDIR)/pvmd3-mpp \
$(LIBDIR)/$(LIBPVM).a $(LIBDIR)/$(LIBPVM)pe.a
BEOTARGETS = $(LIBDIR)/pvmd3-beo $(LIBDIR)/$(LIBPVM).a
OS2TARGETS = $(LIBDIR)/pvmd3-os2 $(LIBDIR)/lib-os2
all: pvmd3$(EXESFX) $(LIBPVM).a $(LIBPVM).so
all-shm: pvmd3-shm lib-shm $(LIBPVM)s.a
all-mpp: pvmd3-mpp $(LIBPVM).a $(LIBPVM)pe.a
all-beo: pvmd3-beo $(LIBPVM).a
all-os2: pvmd3-os2 lib-os2
install: $(LIBDIR) $(LIBDIR)/pvmd3$(EXESFX) $(LIBDIR)/$(LIBPVM).a $(LIBDIR)/$(LIBPVM).so
install-shm: $(LIBDIR) $(SHMEMTARGETS)
install-mpp: $(LIBDIR) $(MPPTARGETS)
install-beo: $(LIBDIR) $(BEOTARGETS)
install-os2: $(LIBDIR) $(OS2TARGETS)
$(LIBDIR):
- mkdir $(LIBDIR)
# libdir sock pvmd3 & libpvm3.a
$(LIBDIR)/pvmd3$(EXESFX): pvmd3$(EXESFX)
cp pvmd3$(EXESFX) $(LIBDIR)
$(LIBDIR)/$(LIBPVM).a: $(LIBPVM).a
cp $(LIBPVM).a $(LIBDIR)
$(LIBDIR)/$(LIBPVM).so: $(LIBPVM).so
cp $(LIBPVM).so $(LIBDIR)
# libdir shm pvmd3 & libpvm3*.a
$(LIBDIR)/pvmd3-shm: pvmd3-shm
cp pvmd3$(EXESFX) $(LIBDIR)
touch $(LIBDIR)/pvmd3-shm
$(LIBDIR)/lib-shm: lib-shm
cp $(LIBPVM).a $(LIBDIR)
touch $(LIBDIR)/lib-shm
$(LIBDIR)/$(LIBPVM)s.a: $(LIBPVM)s.a
cp $(LIBPVM)s.a $(LIBDIR)/$(LIBPVM)s.a
# libdir mpp pvmd3 & libpvm3*.a
$(LIBDIR)/pvmd3-mpp: pvmd3-mpp
cp pvmd3$(EXESFX) $(LIBDIR)
touch $(LIBDIR)/pvmd3-mpp
$(LIBDIR)/$(LIBPVM)pe.a: $(LIBPVM)pe.a
cp $(LIBPVM)pe.a $(LIBDIR)
# libdir Beowulf pvmd3
$(LIBDIR)/pvmd3-beo: pvmd3-beo
cp pvmd3$(EXESFX) $(LIBDIR)
touch $(LIBDIR)/pvmd3-beo
# libdir os2 pvmd3 & libpvm3*.a
$(LIBDIR)/pvmd3-os2: pvmd3-os2
cp pvmd3$(EXESFX) $(LIBDIR)
touch $(LIBDIR)/pvmd3-os2
$(LIBDIR)/lib-os2: lib-os2
cp $(LIBPVM).a $(LIBDIR)
touch $(LIBDIR)/lib-os2
# sock pvmd3 & libpvm3.a
pvmd3$(EXESFX): $(REGEXCONF) $(DOBJ) $(SOCKDOBJ)
$(CC) $(CFLAGS) -o pvmd3$(EXESFX) $(DOBJ) $(SOCKDOBJ) \
$(LOPT) $(ARCHDLIB)
$(LIBPVM).a: $(REGEXCONF) $(LOBJ) $(LPVMSOCK) $(SOCKLOBJ)
@echo -------------------------------
@echo --- Building static Library ---
@echo -------------------------------
rm -f $(LIBPVM).a $(LOBJ) $(LPVMSOCK) $(SOCKLOBJ) $(REGEXDIR)/pvmregex.o $(REGEXDIR)/regex.o
$(MAKE) CFLOPTS="$(CFLOPTS)" $(LOBJ) $(LPVMSOCK) $(SOCKLOBJ)
$(AR) cr $(LIBPVM).a $(LOBJ) $(LPVMSOCK) $(SOCKLOBJ)
case x$(HASRANLIB) in xt ) echo ranlib; ranlib $(LIBPVM).a ;; esac
$(LIBPVM).so: regexconfig
@echo -------------------------------
@echo --- Building shared Library ---
@echo -------------------------------
rm -f $(LIBPVM).so $(LOBJ) $(LPVMSOCK) $(SOCKLOBJ) $(REGEXDIR)/pvmregex.o $(REGEXDIR)/regex.o
$(MAKE) CFLOPTS="-fPIC $(CFLOPTS)" $(LOBJ) $(LPVMSOCK) $(SOCKLOBJ)
$(CC) $(SHLIBPVM) -o $(LIBPVM).so $(LOBJ) $(LPVMSOCK) $(SOCKLOBJ) -lc
# shm pvmd3 & libpvm3*.a
pvmd3-shm: $(REGEXCONF) $(DOBJ) $(SHMEMDOBJ)
$(CC) $(CFLAGS) -o pvmd3$(EXESFX) $(DOBJ) $(SHMEMDOBJ) $(ARCHDLIB)
touch pvmd3-shm
lib-shm: $(REGEXCONF) $(LOBJ) $(LPVMSHMEM) $(SHMEMLOBJ)
rm -f $(LIBPVM).a
$(AR) cr $(LIBPVM).a $(LOBJ) $(LPVMSHMEM) $(SHMEMLOBJ)
case x$(HASRANLIB) in xt ) echo ranlib; ranlib $(LIBPVM).a ;; esac
touch lib-shm
$(LIBPVM)s.a: $(REGEXCONF) $(LOBJ) $(LPVMSOCK) $(SOCKLOBJ)
rm -f $(LIBPVM)s.a
$(AR) cr $(LIBPVM)s.a $(LOBJ) $(LPVMSOCK) $(SOCKLOBJ)
case x$(HASRANLIB) in xt ) echo ranlib; ranlib $(LIBPVM)s.a ;; esac
# mpp pvmd3 & libpvm3*.a
pvmd3-mpp: $(REGEXCONF) $(DOBJ) $(MPPDOBJ)
$(CC) $(CFLAGS) -o pvmd3$(EXESFX) $(DOBJ) $(MPPDOBJ) \
$(LOPT) $(ARCHDLIB)
touch pvmd3-mpp
$(LIBPVM)pe.a: $(REGEXCONF) $(LOBJ) $(LPVMMIMD) $(MPPLOBJ)
rm -f $(LIBPVM)pe.a
$(AR) cr $(LIBPVM)pe.a $(LOBJ) $(LPVMMIMD) $(MPPLOBJ)
# Beowulf(LINUX) pvmd3 & libpvm3.a
pvmd3-beo: $(REGEXCONF) $(DOBJ) $(BEODOBJ) $(SOCKDOBJ)
$(CC) $(CFLAGS) -o pvmd3$(EXESFX) $(DOBJ) $(BEODOBJ) $(SOCKDOBJ) \
$(LOPT) $(ARCHDLIB)
# os2 pvmd3 & libpvm3.a
pvmd3-os2: $(REGEXCONFOS2) $(OS2DOBJ) $(DOBJ) $(SOCKDOBJ)
$(CC) $(CFLAGS) -o pvmd3$(EXESFX) $(OS2DOBJ) $(DOBJ) $(SOCKDOBJ) \
$(LOPT) $(ARCHDLIB)
touch pvmd3-os2
lib-os2: $(REGEXCONFOS2) $(LOBJ) $(OS2LOBJ) $(LPVMSOCK) $(SOCKLOBJ)
rm -f $(LIBPVM).a
$(AR) cr $(LIBPVM).a $(LOBJ) $(OS2LOBJ) $(LPVMSOCK) $(SOCKLOBJ)
case x$(HASRANLIB) in xt ) echo ranlib; ranlib $(LIBPVM).a ;; esac
touch lib-os2
#
clean: tidy
rm -f pvmd3$(EXESFX) $(LIBPVM).a $(LIBPVM)s.a $(LIBPVM)pe.a
rm -rf $(REGEXDIR)
tidy:
rm -f $(DOBJ) $(SOCKDOBJ) $(SHMEMDOBJ) $(MPPDOBJ) \
$(LOBJ) $(LPVMSOCK) $(SOCKLOBJ) $(LPVMSHMEM) $(SHMEMLOBJ) \
$(LPVMMIMD) $(MPPLOBJ) $(REGEXDIR)/*.o \
pvmd3-shm lib-shm pvmd3-mpp pvmd3-os2 lib-os2 \
regexconfig regexconfig-os2
lint: lintd lintl
lintd:
lint -DARCHCLASS=\"$(PVM_ARCH)\" \
ddpro.c host.c hoster.c imalloc.c pkt.c pmsg.c \
pvmalloc.c pvmcruft.c pvmd.c pvmdtev.c pvmfrag.c pvmlog.c \
task.c tdpro.c waitc.c global.c > Ld
lintl:
lint -I$(PVMDIR)/include \
lpvm.c lpvmshmem.c lpvmmimd.c \
imalloc.c lpvmcat.c lpvmgen.c lpvmpack.c lpvmglob.c \
pvmalloc.c pvmcruft.c pvmerr.c pvmfrag.c tev.c global.c > Ll
amem.o: $(SDIR)/amem.s
$(AS) -o amem.o $(SDIR)/amem.s
ddpro.o: $(SDIR)/ddpro.c
$(CC) $(CFLAGS) -c $(SDIR)/ddpro.c
host.o: $(SDIR)/host.c
$(CC) $(CFLAGS) -c $(SDIR)/host.c
hoster.o: $(SDIR)/hoster.c
$(CC) $(CFLAGS) -c $(SDIR)/hoster.c
imalloc.o: $(SDIR)/imalloc.c
$(CC) $(CFLAGS) -c $(SDIR)/imalloc.c
lmsg.o: $(SDIR)/lmsg.c
$(NODECC) $(CFLAGS) -DIMA_NODE -c $(SDIR)/lmsg.c
lpvm.o: $(SDIR)/lpvm.c
$(CC) $(CFLAGS) -c $(SDIR)/lpvm.c
lpvmshmem.o: $(SDIR)/lpvmshmem.c
$(CC) $(CFLAGS) -c $(SDIR)/lpvmshmem.c $(PLOCKFILE)
lpvmmimd.o: $(SDIR)/lpvm.c
$(CC) $(CFLAGS) -DIMA_MPP -o lpvmmimd.o -c $(SDIR)/lpvm.c
lpvmmpp.o: $(SDIR)/lpvmmpp.c
$(NODECC) $(CFLAGS) -DIMA_MPP -c $(SDIR)/lpvmmpp.c
lpvmcat.o: $(SDIR)/lpvmcat.c
$(CC) $(CFLAGS) -c $(SDIR)/lpvmcat.c
lpvmgen.o: $(SDIR)/lpvmgen.c
$(CC) $(CFLAGS) -c $(SDIR)/lpvmgen.c
lpvmpack.o: $(SDIR)/lpvmpack.c
$(CC) $(CFLAGS) -c $(SDIR)/lpvmpack.c
lpvmglob.o: $(SDIR)/lpvmglob.c
$(CC) $(CFLAGS) -c $(SDIR)/lpvmglob.c
msgbox.o: $(SDIR)/msgbox.c
$(CC) $(CFLAGS) -c $(SDIR)/msgbox.c
mppchunkhost.o: $(SDIR)/mppchunk.c
$(CC) $(CFLAGS) -c -o mppchunkhost.o $(SDIR)/mppchunk.c
mppchunknode.o: $(SDIR)/mppchunk.c
$(NODECC) $(CFLAGS) -DIMA_NODE -c -o mppchunknode.o \
$(SDIR)/mppchunk.c
mppmsghost.o: $(SDIR)/mppmsg.c
$(CC) $(CFLAGS) -c -o mppmsghost.o $(SDIR)/mppmsg.c
mppmsgnode.o: $(SDIR)/mppmsg.c
$(NODECC) $(CFLAGS) -DIMA_NODE -c -o mppmsgnode.o $(SDIR)/mppmsg.c
nmdclass.o: $(SDIR)/nmdclass.c
$(CC) $(CFLAGS) -c $(SDIR)/nmdclass.c
pkt.o: $(SDIR)/pkt.c
$(CC) $(CFLAGS) -c $(SDIR)/pkt.c
pmsg.o: $(SDIR)/pmsg.c
$(CC) $(CFLAGS) -c $(SDIR)/pmsg.c
pvmalloc.o: $(SDIR)/pvmalloc.c
$(CC) $(CFLAGS) -c $(SDIR)/pvmalloc.c
pvmcruft.o: $(SDIR)/pvmcruft.c
$(CC) $(CFLAGS) -c $(SDIR)/pvmcruft.c
pvmd.o: $(SDIR)/pvmd.c
$(CC) $(CFLAGS) -c $(SDIR)/pvmd.c
pvmdabuf.o: $(SDIR)/pvmdabuf.c
$(CC) $(CFLAGS) -c $(SDIR)/pvmdabuf.c
pvmdshmem.o: $(SDIR)/pvmdshmem.c
$(CC) $(CFLAGS) -c $(SDIR)/pvmdshmem.c $(PLOCKFILE)
pvmdmimd.o: pvmdmimd.c
$(CC) $(CFLAGS) -I.. -c pvmdmimd.c
pvmdpack.o: $(SDIR)/pvmdpack.c
$(CC) $(CFLAGS) -c $(SDIR)/pvmdpack.c
pvmdunix.o: $(SDIR)/pvmdunix.c
$(CC) $(CFLAGS) -c $(SDIR)/pvmdunix.c
pvmerr.o: $(SDIR)/pvmerr.c
$(CC) $(CFLAGS) -c $(SDIR)/pvmerr.c
pvmfrag.o: $(SDIR)/pvmfrag.c
$(CC) $(CFLAGS) -c $(SDIR)/pvmfrag.c
pvmlog.o: $(SDIR)/pvmlog.c
$(CC) $(CFLAGS) -c $(SDIR)/pvmlog.c
pvmshmem.o: $(SDIR)/pvmshmem.c
$(CC) $(CFLAGS) -c $(SDIR)/pvmshmem.c $(PLOCKFILE)
pvmmpp.o: $(SDIR)/pvmmpp.c
$(CC) $(CFLAGS) -c $(SDIR)/pvmmpp.c
sdpro.o: $(SDIR)/sdpro.c
$(CC) $(CFLAGS) -c $(SDIR)/sdpro.c
task.o: $(SDIR)/task.c
$(CC) $(CFLAGS) -c $(SDIR)/task.c
tev.o: $(SDIR)/tev.c
$(CC) $(CFLAGS) -c $(SDIR)/tev.c
tdpro.o: $(SDIR)/tdpro.c
$(CC) $(CFLAGS) -c $(SDIR)/tdpro.c
waitc.o: $(SDIR)/waitc.c
$(CC) $(CFLAGS) -c $(SDIR)/waitc.c
pvmdtev.o: $(SDIR)/pvmdtev.c
$(CC) $(CFLAGS) -c $(SDIR)/pvmdtev.c
global.o: $(SDIR)/global.c
$(CC) $(CFLAGS) -c $(SDIR)/global.c
deathapi.o: $(SDIR)/$(PVM_ARCH)/src/deathapi.c
$(CC) $(CFLAGS) -c $(SDIR)/$(PVM_ARCH)/src/deathapi.c
stdlog.o: $(SDIR)/$(PVM_ARCH)/src/stdlog.c
$(CC) $(CFLAGS) -c $(SDIR)/$(PVM_ARCH)/src/stdlog.c
sthoster.o: $(SDIR)/$(PVM_ARCH)/src/sthoster.c
$(CC) $(CFLAGS) -c $(SDIR)/$(PVM_ARCH)/src/sthoster.c
rexec.o: $(SDIR)/$(PVM_ARCH)/src/rexec.c
$(CC) $(CFLAGS) -c $(SDIR)/$(PVM_ARCH)/src/rexec.c
ruserpas.o: $(SDIR)/$(PVM_ARCH)/src/ruserpas.c
$(CC) $(CFLAGS) -c $(SDIR)/$(PVM_ARCH)/src/ruserpas.c
os2spawn.o: $(SDIR)/$(PVM_ARCH)/src/os2spawn.c
$(CC) $(CFLAGS) -c $(SDIR)/$(PVM_ARCH)/src/os2spawn.c
pvmregex.o: $(REGEXDIR)/pvmregex.o
cp $(REGEXDIR)/pvmregex.o .
regex.o: $(REGEXDIR)/regex.o
cp $(REGEXDIR)/regex.o .
$(REGEXDIR)/pvmregex.o: $(REGEXCP)
cd $(REGEXDIR) ; $(MAKE) $(REGEXOPTS) pvmregex.o
$(REGEXDIR)/regex.o: $(REGEXCP)
cd $(REGEXDIR) ; $(MAKE) $(REGEXOPTS) regex.o
regexconfig: $(REGEXDIR) $(REGEXCP) $(REGEXDIR)/Makefile
@ touch regexconfig
regexconfig-os2: $(REGEXDIR) $(REGEXCP)
cp $(SDIR)/$(PVM_ARCH)/Makefile.reg $(REGEXDIR)/Makefile
@ touch regexconfig-os2
$(REGEXDIR)/Makefile:
cd $(REGEXDIR) ; CC=$(CC) ./configure
$(REGEXCP): $(REGEXSRC)
cp $(REGEXSRC) $(REGEXDIR)
$(REGEXDIR):
@- mkdir $(REGEXDIR)
#
# Source File Dependencies
#
include $(PVMDEPPATH)$(SDIR)/pvmdep