170 lines
3.2 KiB
Makefile
170 lines
3.2 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
|
||
|
BIN_SRCS := \
|
||
|
cbd.c
|
||
|
KMOD_SRCS := \
|
||
|
dm-compress.c
|
||
|
|
||
|
# 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
|
||
|
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): $(KMOD_NAME)/$(KMOD_NAME).c
|
||
|
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: clean
|
||
|
clean:
|
||
|
rm -rf $(OUT)
|
||
|
make -C $(KDIR) M=$(TOP)/$(KMOD_NAME) clean
|