Makefile
author Tero Marttila <terom@fixme.fi>
Sun, 15 Mar 2009 23:22:57 +0200
branchmodules
changeset 57 ce1accba5fc7
parent 56 942370000450
permissions -rw-r--r--
slight cleanup to move module funcs to a 'struct module_funcs'
# default is test
ifndef MODE
MODE = test
endif

ifeq ($(MODE), debug)
MODE_CFLAGS = -g -DDEBUG_ENABLED
else ifeq ($(MODE), dev)
MODE_CFLAGS = -g
else ifeq ($(MODE), test)
MODE_CFLAGS = -g -DINFO_DISABLED
else ifeq ($(MODE), release)
MODE_CFLAGS = -DINFO_DISABLED -O2
endif

FIXED_CFLAGS = -Wall -Wextra -std=gnu99

# libevent
LIBEVENT_CFLAGS = -I/home/terom/opt/include
LIBEVENT_LDFLAGS = -L/home/terom/opt/lib  -levent_core

# GnuTLS stuff
GNUTLS_NAME = "gnutls"
GNUTLS_CFLAGS = $(shell pkg-config ${GNUTLS_NAME} --cflags)
GNUTLS_LDFLAGS = $(shell pkg-config ${GNUTLS_NAME} --libs)

# evsql stuff
EVSQL_CFLAGS = 
EVSQL_LDFLAGS = -levsql -lpq

BIN_NAMES = nexus test
BIN_PATHS = $(addprefix bin/,$(BIN_NAMES))

# modules
module_objs = $(patsubst src/%.c,obj/%.o,$(wildcard src/$(1)/*.c))

CORE_OBJS = obj/error.o obj/log.o
SOCK_OBJS = obj/sock.o obj/sock_tcp.o
SOCK_TEST_OBJS = obj/sock_test.o
SOCK_GNUTLS_OBJS = obj/sock_gnutls.o
LINEPROTO_OBJS = obj/line_proto.o
IRC_OBJS = obj/irc_line.o obj/irc_conn.o obj/irc_net.o obj/irc_chan.o obj/chain.o obj/irc_cmd.o obj/irc_proto.o obj/irc_client.o
NEXUS_OBJS = obj/signals.o obj/module.o
IRC_LOG_OBJS = obj/irc_log.o

# XXX: not yet there
#CORE_OBJS = obj/lib/log.o obj/lib/signals.o

# first target
all: ${BIN_PATHS} modules/irc_log.so

# binaries
bin/nexus: ${CORE_OBJS} ${SOCK_OBJS} ${SOCK_GNUTLS_OBJS} ${LINEPROTO_OBJS} ${IRC_OBJS} ${IRC_LOG_OBJS} ${NEXUS_OBJS}

bin/test: ${CORE_OBJS} ${SOCK_OBJS} ${SOCK_GNUTLS_OBJS} ${SOCK_TEST_OBJS} ${LINEPROTO_OBJS} ${IRC_OBJS}

modules/irc_log.so: ${CORE_OBJS}

# computed
CFLAGS = ${MODE_CFLAGS} ${FIXED_CFLAGS} ${LIBEVENT_CFLAGS} ${GNUTLS_CFLAGS} ${EVSQL_CFLAGS} -fpic 
LDFLAGS = ${LIBEVENT_LDFLAGS} ${GNUTLS_LDFLAGS} ${EVSQL_LDFLAGS} -Wl,--export-dynamic

# XXX: is this valid?
CPPFLAGS = ${CFLAGS}

# names for src/
SRC_PATHS = $(wildcard src/*.c) $(wildcard src/*/*.c)
SRC_NAMES = $(patsubst src/%,%,$(SRC_PATHS))
SRC_DIRS = $(dir $(SRC_NAMES))

# other targets
clean :
	-rm obj/*.o obj/*/*.o
	-rm bin/* 
	-rm build/deps/*.d build/deps/*/*.d

clean-deps:
	-rm build/deps/*/*.d 
	-rm build/deps/*.d

#obj-dirs: 
#	python build/make_obj_dirs.py $(BIN_PATHS)

build/deps/%.d : src/%.c
	@set -e; rm -f $@; \
	 $(CC) -MM -MT __ $(CPPFLAGS) $< > $@.$$$$; \
	 sed 's,__[ :]*,obj/$*.o $@ : ,g' < $@.$$$$ > $@; \
	 rm -f $@.$$$$

include $(SRC_NAMES:%.c=build/deps/%.d)


# XXX: removed $(CPPFLAGS) 
obj/%.o : src/%.c
	$(CC) -c $(CFLAGS) $< -o $@

bin/% : obj/%.o
	$(CC) $(LDFLAGS) $+ $(LOADLIBES) $(LDLIBS) -o $@

modules/%.so : obj/%.o
	$(CC) -shared -Wl,-soname,$(notdir $@) -o $@ $+ -lc

# documentation
DOXYGEN_PATH = /usr/bin/doxygen
DOXYGEN_CONF_PATH = doc/doxygen.conf
DOXYGEN_OUTPUT_FILE = doc/html/index.html

docs :
	${DOXYGEN_PATH} ${DOXYGEN_CONF_PATH}