-
Notifications
You must be signed in to change notification settings - Fork 536
/
Makefile
140 lines (114 loc) · 4.37 KB
/
Makefile
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
ifneq ($(wildcard .gitversion),)
# building a snapshot version
V4L2LOOPBACK_SNAPSHOT_VERSION=$(patsubst v%,%,$(shell git describe --always --dirty 2>/dev/null || shell git describe --always 2>/dev/null || echo snapshot))
override KCPPFLAGS += -DSNAPSHOT_VERSION='"$(V4L2LOOPBACK_SNAPSHOT_VERSION)"'
endif
include Kbuild
ifeq ($(KBUILD_MODULES),)
KERNELRELEASE ?= `uname -r`
KERNEL_DIR ?= /lib/modules/$(KERNELRELEASE)/build
PWD := $(shell pwd)
PREFIX ?= /usr/local
BINDIR = $(PREFIX)/bin
INCLUDEDIR = $(PREFIX)/include
MANDIR = $(PREFIX)/share/man
MAN1DIR = $(MANDIR)/man1
INSTALL = install
INSTALL_PROGRAM = $(INSTALL) -p -m 755
INSTALL_DIR = $(INSTALL) -p -m 755 -d
INSTALL_DATA = $(INSTALL) -m 644
MODULE_OPTIONS = devices=2
##########################################
# note on build targets
#
# module-assistant makes some assumptions about targets, namely
# <modulename>: must be present and build the module <modulename>
# <modulename>.ko is not enough
# install: must be present (and should only install the module)
#
# we therefore make <modulename> a .PHONY alias to <modulename>.ko
# and remove utils-installation from 'install'
# call 'make install-all' if you want to install everything
##########################################
.PHONY: all install clean distclean
.PHONY: install-all install-extra install-utils install-man install-headers
.PHONY: modprobe v4l2loopback
# we don't control the .ko file dependencies, as it is done by kernel
# makefiles. therefore v4l2loopback.ko is a phony target actually
.PHONY: v4l2loopback.ko utils
all: v4l2loopback.ko utils
v4l2loopback: v4l2loopback.ko
v4l2loopback.ko:
@echo "Building v4l2-loopback driver..."
$(MAKE) -C $(KERNEL_DIR) M=$(PWD) KCPPFLAGS="$(KCPPFLAGS)" modules
install-all: install install-extra
install:
$(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules_install
@echo ""
@echo "SUCCESS (if you got 'SSL errors' above, you can safely ignore them)"
@echo ""
install-extra: install-utils install-man install-headers
install-utils: utils/v4l2loopback-ctl
$(INSTALL_DIR) "$(DESTDIR)$(BINDIR)"
$(INSTALL_PROGRAM) $< "$(DESTDIR)$(BINDIR)"
install-man: man/v4l2loopback-ctl.1
$(INSTALL_DIR) "$(DESTDIR)$(MAN1DIR)"
$(INSTALL_DATA) $< "$(DESTDIR)$(MAN1DIR)"
install-headers: v4l2loopback.h
$(INSTALL_DIR) "$(DESTDIR)$(INCLUDEDIR)/linux"
$(INSTALL_DATA) $< "$(DESTDIR)$(INCLUDEDIR)/linux"
clean:
rm -f *~
rm -f Module.symvers Module.markers modules.order
$(MAKE) -C $(KERNEL_DIR) M=$(PWD) clean
-$(MAKE) -C utils clean
distclean: clean
rm -f man/v4l2loopback-ctl.1
modprobe: v4l2loopback.ko
-sudo chmod a+r $<
-sudo modprobe videodev
-sudo rmmod $<
sudo insmod ./$< $(MODULE_OPTIONS)
man/v4l2loopback-ctl.1: utils/v4l2loopback-ctl
help2man -N --name "control v4l2 loopback devices" \
--no-discard-stderr --help-option=-h --version-option=-v \
$^ > $@
utils: utils/v4l2loopback-ctl
utils/v4l2loopback-ctl: utils/v4l2loopback-ctl.c v4l2loopback.h
$(MAKE) -C utils V4L2LOOPBACK_SNAPSHOT_VERSION=$(V4L2LOOPBACK_SNAPSHOT_VERSION)
.clang-format:
curl "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/.clang-format" > $@
.PHONY: clang-format
clang-format: .clang-format
clang-format -i *.c *.h utils/*.c
.PHONY: sign
# try to read the default certificate/key from the dkms config
dkms_framework=/etc/dkms/framework.conf
-include $(dkms_framework)
KBUILD_SIGN_KEY=$(mok_signing_key)
KBUILD_SIGN_CERT=$(mok_certificate)
ifeq ($(KBUILD_SIGN_PIN),)
define usage_kbuildsignpin
$(info )
$(info ++++++ If your certificate requires a password, pass it via the KBUILD_SIGN_PIN env-var!)
$(info ++++++ E.g. using 'export KBUILD_SIGN_PIN; read -s -p "Passphrase for signing key $(KBUILD_SIGN_KEY): " KBUILD_SIGN_PIN; sudo --preserve-env=KBUILD_SIGN_PIN make sign')
$(info )
endef
endif
define usage_kbuildsign
sign: v4l2loopback.ko
$(info )
$(info ++++++ To sign the $< module, you must set KBUILD_SIGN_KEY/KBUILD_SIGN_CERT to point to the signing key/certificate!)
$(info ++++++ For your convenience, we try to read these variables as 'mok_signing_key' resp. 'mok_certificate' from $(dkms_framework))
$(call usage_kbuildsignpin)
endef
ifeq ($(wildcard $(KBUILD_SIGN_KEY)),)
$(call usage_kbuildsign)
else ifeq ($(wildcard $(KBUILD_SIGN_CERT)),)
$(call usage_kbuildsign)
else
sign: v4l2loopback.ko
$(call usage_kbuildsignpin)
"$(KERNEL_DIR)"/scripts/sign-file sha256 $(KBUILD_SIGN_KEY) $(KBUILD_SIGN_CERT) $<
endif
endif # !kbuild