|
@@ -7,26 +7,43 @@ SHELL := /bin/bash
|
|
|
CC = gcc
|
|
|
AR = ar
|
|
|
|
|
|
+# Global switches.
|
|
|
+# Compile with debug symbols. Libraries are suffixed with _dbg and can coexist
|
|
|
+# with non-debug libraries.
|
|
|
+DEBUG ?= 0
|
|
|
+
|
|
|
+# Install in a user-owned directory provided as LOCAL_PREFIX or a default
|
|
|
+# (~/.local), instead of a system directory.
|
|
|
+LOCAL ?= 0
|
|
|
|
|
|
## Paths.
|
|
|
|
|
|
+LOCAL_PREFIX ?= $(HOME)/.local
|
|
|
+ifneq ($(LOCAL), 0)
|
|
|
+PREFIX ?= $(LOCAL_PREFIX)
|
|
|
+else
|
|
|
PREFIX ?= /usr/local
|
|
|
+endif
|
|
|
+
|
|
|
bindir := $(PREFIX)/bin
|
|
|
libdir := $(PREFIX)/lib
|
|
|
-INCLUDEDIR = $(PREFIX)/include
|
|
|
-BUILDDIR = ./build
|
|
|
-OUTDIR = ./bin
|
|
|
-VALGRIND_DUMP = /tmp/lsup_valgrind.log
|
|
|
-CALLGRIND_DUMP = /tmp/lsup_callgrind.out
|
|
|
-MASSIF_DUMP = /tmp/lsup_massif.out
|
|
|
+INCLUDEDIR := $(PREFIX)/include
|
|
|
+BUILDDIR := ./build
|
|
|
+OUTDIR := ./bin
|
|
|
+TMPDIR ?= /tmp
|
|
|
+VALGRIND_DUMP := $(TMPDIR)/lsup_valgrind.log
|
|
|
+CALLGRIND_DUMP := $(TMPDIR)/lsup_callgrind.out
|
|
|
+MASSIF_DUMP := $(TMPDIR)/lsup_massif.out
|
|
|
|
|
|
INCLUDE_BASE := . -Iinclude -Iext/tpl/src -Iext/hashmap -Iext/log/src
|
|
|
INCLUDE := -I$(INCLUDE_BASE)
|
|
|
-_CFLAGS := -std=gnu11 -Wall -fPIC $(INCLUDE)
|
|
|
-DBG_CFLAGS := $(_CFLAGS) -Itest -O0 -ggdb -DDEBUG
|
|
|
-CFLAGS := $(_CFLAGS) -O3
|
|
|
-#$(info CFLAGS: $(CFLAGS))
|
|
|
-#$(info DBG_CFLAGS: $(DBG_CFLAGS))
|
|
|
+_CFLAGS = -std=gnu11 -Wall -fPIC $(INCLUDE)
|
|
|
+ifneq ($(DEBUG), 0)
|
|
|
+CFLAGS = $(_CFLAGS) -Itest -O0 -ggdb -DDEBUG
|
|
|
+else
|
|
|
+CFLAGS = $(_CFLAGS) -O3
|
|
|
+endif
|
|
|
+$(info CFLAGS: $(CFLAGS))
|
|
|
# NOTE: -luuid is a Linux system library. Other OS's might need a different
|
|
|
# link or a non-system library built.
|
|
|
LDFLAGS := -L$(OUTDIR) -L$(libdir) -L. -llmdb -lxxhash -luuid
|
|
@@ -57,25 +74,28 @@ ALL_CODEC_REL_SRC := $(CODEC_REL_SRC) $(CODEC_REL_SRC:codec_%=parser_%) \
|
|
|
$(CODEC_REL_SRC:codec_%=grammar_%)
|
|
|
CODEC_SRC = $(ALL_CODEC_REL_SRC:%=$(CODEC_DIR)/%)
|
|
|
|
|
|
+ifneq ($(DEBUG), 0)
|
|
|
+CODEC_OBJ = $(patsubst $(CODEC_DIR)/%.c, $(BUILDDIR)/%_dbg.o, $(CODEC_SRC))
|
|
|
+else
|
|
|
CODEC_OBJ = $(patsubst $(CODEC_DIR)/%.c, $(BUILDDIR)/%.o, $(CODEC_SRC))
|
|
|
-CODEC_DBG_OBJ = $(CODEC_OBJ:.o=_dbg.o)
|
|
|
+endif
|
|
|
+
|
|
|
+ifneq ($(DEBUG), 0)
|
|
|
+STATIC_LIB = $(OUTDIR)/liblsuprdf_dbg.a
|
|
|
+LOCAL_OBJ = $(LSUP_SRC:src/%.c=$(BUILDDIR)/%_dbg.o)
|
|
|
+else
|
|
|
+STATIC_LIB = $(OUTDIR)/liblsuprdf.a
|
|
|
LOCAL_OBJ = $(LSUP_SRC:src/%.c=$(BUILDDIR)/%.o)
|
|
|
+endif
|
|
|
OBJ = $(EXT_OBJ) $(LOCAL_OBJ)
|
|
|
-DBG_OBJ = $(EXT_OBJ) $(LOCAL_OBJ:.o=_dbg.o)
|
|
|
-STATIC_LIB = $(OUTDIR)/liblsuprdf.a
|
|
|
DYN_LIB = $(STATIC_LIB:.a=.so)
|
|
|
-STATIC_DBG_LIB = $(STATIC_LIB:.a=_dbg.a)
|
|
|
-DYN_DBG_LIB = $(DYN_LIB:.so=_dbg.so)
|
|
|
|
|
|
LIBS = $(STATIC_LIB) $(DYN_LIB)
|
|
|
-DBG_LIBS = $(STATIC_DBG_LIB) $(DYN_DBG_LIB)
|
|
|
|
|
|
$(info EXT_SRC: $(EXT_SRC))
|
|
|
$(info EXT_OBJ: $(EXT_OBJ))
|
|
|
$(info OBJ: $(OBJ))
|
|
|
-$(info DBG_OBJ: $(DBG_OBJ))
|
|
|
-#$(info LIBS: $(LIBS))
|
|
|
-#$(info DBG_LIBS: $(DBG_LIBS))
|
|
|
+$(info LIBS: $(LIBS))
|
|
|
|
|
|
# LDD for Linux, otool -L for OSX.
|
|
|
ifeq (, $(shell which ldd))
|
|
@@ -112,10 +132,6 @@ help:
|
|
|
lib: codec $(LIBS) ## Compile main library (static and dynamic linking).
|
|
|
|
|
|
|
|
|
-.PHONY: debug
|
|
|
-debug: codec_dbg $(DBG_LIBS) ## Compile main library with debug symbols.
|
|
|
-
|
|
|
-
|
|
|
# Static library.
|
|
|
$(STATIC_LIB): $(OBJ)
|
|
|
$(AR) rs $@ $^ $(CODEC_OBJ)
|
|
@@ -126,16 +142,6 @@ $(DYN_LIB): $(OBJ)
|
|
|
$(CC) -shared $(LDFLAGS) -o $@ $^ $(CODEC_OBJ)
|
|
|
|
|
|
|
|
|
-# Static debug library.
|
|
|
-$(STATIC_DBG_LIB): $(DBG_OBJ)
|
|
|
- $(AR) rs $@ $^ $(CODEC_DBG_OBJ)
|
|
|
-
|
|
|
-
|
|
|
-# Dynamic debug library.
|
|
|
-$(DYN_DBG_LIB): $(DBG_OBJ)
|
|
|
- $(CC) -shared $(LDFLAGS) -o $@ $^ $(CODEC_DBG_OBJ)
|
|
|
-
|
|
|
-
|
|
|
# External libraries.
|
|
|
$(BUILDDIR)/ext/%.o: ext/%.c
|
|
|
mkdir -p $(dir $@)
|
|
@@ -149,7 +155,7 @@ $(BUILDDIR)/%.o: src/%.c
|
|
|
|
|
|
# Debug objects.
|
|
|
$(BUILDDIR)/%_dbg.o: src/%.c
|
|
|
- $(CC) $(DBG_CFLAGS) -c $^ -o $@
|
|
|
+ $(CC) $(CFLAGS) -c $^ -o $@
|
|
|
|
|
|
|
|
|
# Codecs in a subfolder.
|
|
@@ -157,12 +163,8 @@ $(BUILDDIR)/%_dbg.o: src/%.c
|
|
|
.PHONY: codec
|
|
|
codec: $(PARSER)
|
|
|
mkdir -p $(BUILDDIR) && \
|
|
|
- $(MAKE) -C $(CODEC_DIR) codec
|
|
|
+ $(MAKE) -C $(CODEC_DIR) codec DEBUG=$(DEBUG)
|
|
|
|
|
|
-.PHONY: codec_dbg
|
|
|
-codec_dbg: $(PARSER)
|
|
|
- mkdir -p $(BUILDDIR) && \
|
|
|
- $(MAKE) -C $(CODEC_DIR) debug
|
|
|
|
|
|
# Build the parser executable.
|
|
|
$(PARSER): $(LEMON_SRC)
|
|
@@ -178,16 +180,11 @@ install: lib ## Install library and dependencies to $PREFIX. May require sudo.
|
|
|
cp include/*.h $(INCLUDEDIR)
|
|
|
|
|
|
|
|
|
-debug_install: debug ## Install debug libraries.
|
|
|
- @echo "Installing debug library files in $(PREFIX)."
|
|
|
- cp $(DBG_LIBS) $(libdir)
|
|
|
-
|
|
|
-
|
|
|
.PHONY: clean
|
|
|
+clean: DEBUG = 0
|
|
|
clean: ## Clean up artifacts, including language parsers.
|
|
|
rm -rf $(BUILDDIR)
|
|
|
rm -f bin/*
|
|
|
- rm -f $(LIBS) $(DBG_LIBS)
|
|
|
rm -f include/codec/grammar_*.h
|
|
|
rm -f src/codec/grammar_*.c src/codec/parser_*.c
|
|
|
|
|
@@ -200,7 +197,8 @@ uninstall:
|
|
|
|
|
|
|
|
|
# For testing, use debug symbols.
|
|
|
-bin/test: debug $(TEST_SRC)
|
|
|
+bin/test: DEBUG = 1
|
|
|
+bin/test: lib $(TEST_SRC)
|
|
|
$(CC) $(DBG_CFLAGS) $(LDFLAGS) -llsuprdf_dbg \
|
|
|
test.c -o bin/test
|
|
|
|
|
@@ -239,12 +237,14 @@ memtest: bin/test memcheck ## Run a test suite using Valgrind. Output to separat
|
|
|
|
|
|
|
|
|
# Profiling application.
|
|
|
-bin/profile: debug profile.c
|
|
|
+bin/profile: DEBUG = 1
|
|
|
+bin/profile: lib profile.c
|
|
|
$(CC) $(CFLAGS) -g -DTESTING $(LDFLAGS) -llsuprdf_dbg \
|
|
|
profile.c -o bin/profile
|
|
|
|
|
|
|
|
|
# Performance test application. Essentially the profiling code without debug.
|
|
|
+bin/perftest: DEBUG = 0
|
|
|
bin/perftest: lib profile.c
|
|
|
$(CC) $(CFLAGS) -g $(LDFLAGS) -llsuprdf profile.c -o bin/perftest
|
|
|
|