# 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