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
|
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 /etc/dkms/framework.conf.d/*.conf
KBUILD_SIGN_KEY=$(patsubst mok_signing_key=%,%,$(lastword $(shell grep -h -E "^[[:space:]]*mok_signing_key=" $(dkms_framework))))
KBUILD_SIGN_CERT=$(patsubst mok_certificate=%,%,$(lastword $(shell grep -h -E "^[[:space:]]*mok_certificate=" $(dkms_framework))))
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
|