cbd/Makefile

189 lines
3.6 KiB
Makefile

# Makefile for cbd
TOP := $(shell pwd)
# Tunables
VERSION := 1.0
WITH_DEBUG ?= true
# Default rule
.PHONY: all
all: all-targets
# Turn off default suffix rules
.SUFFIXES:
# Turn off RCS/SCCS rules
%: RCS/%,v
%: RCS/%
%: %,v
%: s.%
%: SCCS/s.%
# Always delete target when a rule fails
.DELETE_ON_ERROR:
# Kernel stuff
KVER ?= $(shell uname -r)
KDIR ?= /lib/modules/$(KVER)/build
# Build tools
CPP := $(CROSS_COMPILE)cpp
CC := $(CROSS_COMPILE)gcc
AR := $(CROSS_COMPILE)ar
LD := $(CROSS_COMPILE)gcc
STRIP := $(CROSS_COMPILE)strip
# Paths
OUT := out
OUT_OBJ := $(OUT)/obj
OUT_LIB := $(OUT)/lib
OUT_BIN := $(OUT)/bin
OUT_KMOD := $(OUT)/kmod
# Install locations
PREFIX ?= /usr/local
BINDIR ?= $(PREFIX)/bin
LIBDIR ?= $(PREFIX)/lib
MANDIR ?= $(PREFIX)/share/man
KMODDIR ?= /lib/modules/$(KVER)/misc
# Platform extensions
OBJ_EXT := .o
LIB_EXT := .a
SHLIB_EXT := .so
EXE_EXT :=
KMOD_EXT := .ko
# Build flags
ifeq ($(WITH_DEBUG),true)
DEBUG_CFLAGS := -g
DEBUG_LDFLAGS := -g
else
DEBUG_CFLAGS := -DNDEBUG
DEBUG_LDFLAGS :=
endif
CPPFLAGS :=
CFLAGS := $(DEBUG_CFLAGS) -Wall -Werror -Iinclude
LDFLAGS := $(DEBUG_LDFLAGS)
# Targets
LIB_NAME := libcbd
BIN_NAME := cbd
KMOD_NAME := dm-compress
# Sources
LIB_SRCS := \
check.c \
close.c \
format.c \
open.c \
resize.c \
stats.c \
info.c \
tune.c \
util.c
BIN_SRCS := \
cbd.c
KMOD_SRCS := \
util.c \
pbat.c \
lbatpblk.c \
lbatview.c \
lbd.c \
compress.c
KMOD_HDRS := \
dm-compress.h
# Intermediates
LIB_OBJDIR := $(OUT_OBJ)/$(LIB_NAME)
LIB_OBJS := $(addprefix $(LIB_OBJDIR)/,$(LIB_SRCS:.c=$(OBJ_EXT)))
BIN_OBJDIR := $(OUT_OBJ)/$(BIN_NAME)
BIN_OBJS := $(addprefix $(BIN_OBJDIR)/,$(BIN_SRCS:.c=$(OBJ_EXT)))
EXE_LIBS := -ldevmapper -llz4 -lz
KMOD_OBJDIR := $(OUT_OBJ)/$(KMOD_NAME)
# Transforms
define copy-file
@mkdir -p $(@D)
cp $< $@
endef
define compile-c
@mkdir -p $(@D)
$(CC) $(CPPFLAGS) $(CFLAGS) -MD -MP -MF $(@D)/.$(@F:$(OBJ_EXT)=.d) -c -o $@ $<
endef
define make-static-lib
@mkdir -p $(@D)
@rm -f $@
$(AR) r $@ $^
endef
define make-shared-lib
@mkdir -p $(@D)
$(LD) -shared -o $@ $^
endef
define link-executable
@mkdir -p $(@D)
$(LD) $(LDFLAGS) -o $@ $^ $(EXE_LIBS)
endef
# Version
ifeq (,$(wildcard .git))
GIT_REV := none
else
GIT_REV := $(shell git rev-parse --short HEAD)
ifeq (,$(shell git diff-index --name-only HEAD))
GIT_REV := $(GIT_REV)-clean
else
GIT_REV := $(GIT_REV)-dirty
endif
endif
VERSION := $(VERSION)-$(GIT_REV)
version.h:
@echo "/* Autogenerated file. Do not edit. */" > .$@.tmp && \
echo "#ifndef VERSION_H" >> .$@.tmp && \
echo "#define VERSION_H" >> .$@.tmp && \
echo "#endif" >> .$@.tmp && \
rm -f $@ && \
mv -f .$@.tmp $@
# Rules
$(LIB_OBJS): $(LIB_OBJDIR)/%.o: $(LIB_NAME)/%.c
$(compile-c)
$(OUT_LIB)/$(LIB_NAME)$(LIB_EXT): $(LIB_OBJS)
$(make-static-lib)
$(BIN_OBJS): $(BIN_OBJDIR)/%.o: $(BIN_NAME)/%.c
$(compile-c)
$(OUT_BIN)/$(BIN_NAME)$(EXE_EXT): $(BIN_OBJS) $(OUT_LIB)/$(LIB_NAME)$(LIB_EXT)
$(link-executable)
$(KMOD_NAME)/$(KMOD_NAME)$(KMOD_EXT): \
$(addprefix $(KMOD_NAME)/,$(KMOD_SRCS)) \
$(addprefix include/linux/,$(KMOD_HDRS))
$(MAKE) -C $(KDIR) M=$(TOP)/$(KMOD_NAME) modules
$(OUT_KMOD)/$(KMOD_NAME)$(KMOD_EXT): $(KMOD_NAME)/$(KMOD_NAME)$(KMOD_EXT)
$(copy-file)
.PHONY: all-targets
all-targets: \
$(OUT_LIB)/$(LIB_NAME)$(LIB_EXT) \
$(OUT_BIN)/$(BIN_NAME)$(EXE_EXT) \
$(OUT_KMOD)/$(KMOD_NAME)$(KMOD_EXT)
.PHONY: install
install: all-targets
mkdir -p $(BINDIR)
cp -f $(OUT_BIN)/$(BIN_NAME)$(EXE_EXT) $(BINDIR)
$(MAKE) -C $(KDIR) M=$(TOP)/$(KMOD_NAME) modules_install 2>/dev/null
depmod -a
.PHONY: clean
clean:
rm -rf $(OUT)
$(MAKE) -C $(KDIR) M=$(TOP)/$(KMOD_NAME) clean