File: Makefile.include

package info (click to toggle)
kpatch 0.9.11-1.1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,796 kB
  • sloc: ansic: 9,950; sh: 2,677; makefile: 260; asm: 35
file content (73 lines) | stat: -rw-r--r-- 2,488 bytes parent folder | download | duplicates (2)
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
EXT_ORIG        ?= ORIG.o
EXT_PATCHED     ?= PATCHED.o
EXT_FAIL        ?= PATCHED.FAIL.o
EXT_TEST        ?= test
EXT_OUTPUT      ?= OUTPUT.o
EXT_TEST_OUTPUT ?= test.out
EXT_SYMTAB      ?= symtab
EXT_SYMVERS     ?= symvers
EXT_ENV         ?= env
TNAME            = $(@:.$(EXT_OUTPUT)=)

ifndef VERBOSE
MUTE_PASS := >/dev/null
MUTE_FAIL := >/dev/null 2>&1
.SILENT: $(TARGETS) $(TEST_TARGETS)
endif

SRC_PATH        ?= $(realpath ../../../../)
CDO             ?= $(SRC_PATH)/kpatch-build/create-diff-object
TEST_LIBRARY    ?= $(SRC_PATH)/test/test-functions.sh

TEST_ENV = KPATCH_TEST_LIBRARY=$(TEST_LIBRARY)

TARGETS      = $(patsubst %.$(EXT_ORIG),%.$(EXT_OUTPUT),$(wildcard *.$(EXT_ORIG)))
TEST_TARGETS = $(patsubst %.$(EXT_TEST),%.$(EXT_TEST_OUTPUT),$(wildcard *.$(EXT_TEST)))

SYMVERS_FILE = $(if $(wildcard $(TNAME).$(EXT_SYMVERS)),$(TNAME).$(EXT_SYMVERS),/dev/null)

define check_stripped =
	$(if $(shell readelf --debug-dump $(1)),
		$(error $(1) is not properly stripped, use 'strip --strip-debug --keep-file-symbols --remove-section=.eh_frame $(1)' to fix this),
	)
endef

define check_all =
	$(if $(findstring NOSTRIP,$(1)), , $(call check_stripped,$(1)))
endef

.DELETE_ON_ERROR: %.$(EXT_OUTPUT)

all: $(TARGETS) $(TEST_TARGETS)

clean:
	rm -f *.$(EXT_TEST_OUTPUT) *.$(EXT_OUTPUT)

%.$(EXT_SYMTAB):
	readelf -s --wide $(patsubst %.$(EXT_SYMTAB),%.$(EXT_ORIG),$(@)) | \
		sed -r 's/\s+\[<localentry>: 8\]//' >$@

%.$(EXT_TEST_OUTPUT): %.$(EXT_OUTPUT) %.$(EXT_TEST) $(TEST_LIBRARY)
	@echo "TEST $(@:.$(EXT_TEST_OUTPUT)=)"
	$(TEST_ENV) bash $(@:.$(EXT_TEST_OUTPUT)=.$(EXT_TEST)) $<
# Don't rely on script creating this
	@touch $@

%.$(EXT_OUTPUT): %.$(EXT_ORIG) %.$(EXT_PATCHED) %.$(EXT_SYMTAB) $(CDO)
	@echo "BUILD $(TNAME)"
	$(call check_all,$(TNAME).$(EXT_ORIG))
	$(call check_all,$(TNAME).$(EXT_PATCHED))
	$(CDO_ENV) $(shell cat $(TNAME).$(EXT_ENV) 2>/dev/null) $(CDO) $(TNAME).$(EXT_ORIG) $(TNAME).$(EXT_PATCHED) \
		vmlinux $(TNAME).$(EXT_SYMTAB) $(SYMVERS_FILE) \
		test_$(TNAME) $@ $(MUTE_PASS)

%.$(EXT_OUTPUT): %.$(EXT_ORIG) %.$(EXT_FAIL) %.$(EXT_SYMTAB) $(CDO)
	@echo "BUILD $(TNAME)-FAIL"
	$(call check_all,$(TNAME).$(EXT_ORIG))
	$(call check_all,$(TNAME).$(EXT_FAIL))
	! $(CDO_ENV) $(shell cat $(TNAME).$(EXT_ENV) 2>/dev/null) $(CDO) $(TNAME).$(EXT_ORIG) $(TNAME).$(EXT_FAIL) \
		vmlinux $(TNAME).$(EXT_SYMTAB) $(SYMVERS_FILE) \
		test_$(TNAME) $@ $(MUTE_FAIL)
# Expecting to fail, thus create output file manually so we won't rerun the
# test without clean
	@touch $@