Переменная PWD
устанавливается оболочкой , поэтому ваш Makefile полагается на make
вызов, выполняемый из оболочки, как мы обычно делаем, когда набираем make
в терминале.
Но sudo make
выполняет make
из простой пользовательской среды. В этой среде отсутствует для переменной PWD
, поэтому ваш Makefile ведет себя некорректно. Это может быть найдено из вашего вывода:
make -C /lib/modules/5.3.0-28-generic/build M= modules
Используйте взамен $(shell pwd)
выражение, это более надежно:
obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean
В качестве альтернативы, вы можете позвонить make
с root привилегии, использующие этот способ:
sudo /bin/sh -c make
Таким образом, make
выполняется не из простой среды root, а в промежуточной оболочке. Эта оболочка устанавливает переменную PWD
.
Обновление
Как отметил @Ian Abbott в комментариях, еще одна альтернатива для $(PWD)
- $(CURDIR)
. Переменная CURDIR
устанавливается самой make
(точнее, GNU Make). См. Также этот вопрос: bash: В чем разница между PWD и CURDIR? .