summaryrefslogtreecommitdiffstats
path: root/Makefile
blob: ca4483c362441eef61dcf45cc09f6e369787cdf6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#------------------------------------------------------------------------------
# Makefile - builds the entire project with all subprojects
#------------------------------------------------------------------------------
# author: Manuel Bentele
# date  : 10.07.2019
#------------------------------------------------------------------------------

#------------------------------------------------------------------------------
# Global configuration (file paths and config)
#------------------------------------------------------------------------------
KERNEL_SRC_DIR    := $(shell pwd)/implementation/loop
KERNEL_MOD_PATH   := drivers/block/loop/
KERNEL_HDR_DIR    := /lib/modules/$(shell uname -r)/build
LOSETUP_SRC_DIR   := $(shell pwd)/implementation/losetup
KERNEL_MOD_CONFIG := $(shell pwd)/config/kernel-qcow2_x86-64_module.config
LOCAL_MOD_CONFIG  += CONFIG_BLK_DEV_LOOP=m
LOCAL_MOD_CONFIG  += CONFIG_BLK_DEV_LOOP_FILE_FMT_RAW=m
LOCAL_MOD_CONFIG  += CONFIG_BLK_DEV_LOOP_FILE_FMT_QCOW=m
LOCAL_MOD_CONFIG  += CONFIG_ZLIB_INFLATE=y
LOCAL_MOD_CONFIG  += CONFIG_ZLIB_DEFLATE=y

BUILD             ?= vanilla
KERNEL_DIR        ?= $(KERNEL_SRC_DIR)
CONFIG            ?= KCONFIG_CONFIG=$(KERNEL_MOD_CONFIG)
TARGET_PATH_PREFX ?= $(KERNEL_MOD_PATH)

ifeq ($(BUILD),out-of-tree)
PATCH              = patch
KERNEL_DIR         = $(KERNEL_HDR_DIR)
CONFIG             = $(LOCAL_MOD_CONFIG) M=$(KERNEL_SRC_DIR)/drivers/block/loop
TARGET_PATH_PREFX  = 
endif

#------------------------------------------------------------------------------
# Target definitions
#------------------------------------------------------------------------------
all: modules losetup
clean: clean_modules clean_losetup
modules: loop.ko loop_file_fmt_raw.ko loop_file_fmt_qcow.ko

clean_modules:
	$(call print_heading,"Clean all kernel modules")
	@$(MAKE) --no-print-directory -C $(KERNEL_DIR) $(CONFIG) clean

patch:
	$(call print_heading, "Patch kernel headers")
	@sudo cp -f $(KERNEL_SRC_DIR)/include/uapi/linux/loop.h \
		$(KERNEL_HDR_DIR)/include/uapi/linux/loop.h
	@sudo cp -f $(KERNEL_SRC_DIR)/drivers/block/Kconfig \
		$(KERNEL_HDR_DIR)/drivers/block/Kconfig
	@sudo mkdir -p $(KERNEL_HDR_DIR)/drivers/block/loop
	@sudo cp -f $(KERNEL_SRC_DIR)/drivers/block/loop/loop_main.h \
		$(KERNEL_HDR_DIR)/drivers/block/loop/loop_main.h
	@sudo cp -f $(KERNEL_SRC_DIR)/drivers/block/loop/loop_file_fmt.h \
		$(KERNEL_HDR_DIR)/drivers/block/loop/loop_file_fmt.h
	@sudo cp -f $(KERNEL_SRC_DIR)/drivers/block/loop/Kconfig \
		$(KERNEL_HDR_DIR)/drivers/block/loop/Kconfig

loop.ko:
loop_file_fmt_raw.ko:
loop_file_fmt_qcow.ko:

%.ko: $(PATCH)
	$(call print_heading,"Build $@ kernel module")
	@$(MAKE) --no-print-directory -C $(KERNEL_DIR) $(CONFIG) \
		$(TARGET_PATH_PREFX)$@

losetup:
	$(call print_heading,"Build $@ utility")
	@cd $(LOSETUP_SRC_DIR) && \
		./tools/config-gen all && \
		$(MAKE) --no-print-directory losetup

clean_losetup:
	$(call print_heading,"Clean $@ utility")
	@cd $(LOSETUP_SRC_DIR) && \
		$(MAKE) --no-print-directory clean

ifeq ($(BUILD),out-of-tree)
loop.load: loop.ko
loop_file_fmt_raw.load: loop_file_fmt_raw.ko loop.load
loop_file_fmt_qcow.load: loop_file_fmt_qcow.ko loop.load

loop.unload: loop_file_fmt_raw.unload loop_file_fmt_qcow.unload
loop_file_fmt_raw.unload:
loop_file_fmt_qcow.unload:

load_modules: loop.load loop_file_fmt_raw.load loop_file_fmt_qcow.load

unload_modules: loop_file_fmt_qcow.unload loop_file_fmt_raw.unload loop.unload

%.load:
	$(call print_heading,"Load kernel module $(basename $@)")
	sudo insmod $(KERNEL_SRC_DIR)/$(KERNEL_MOD_PATH)$(basename $@).ko

%.unload:
	$(call print_heading,"Unload kernel module $(basename $@)")
	sudo rmmod $(basename $@)
endif

#------------------------------------------------------------------------------
# Function definitions
#------------------------------------------------------------------------------
define print_heading
	@echo "#--------------------------------------------------------------"
	@echo "# [BUILD: $(BUILD)] $(1)"
	@echo "#--------------------------------------------------------------"
endef