Make

如何在以下 makefile 下的空格分隔目錄中編譯 Linux 核心模組?

  • June 11, 2018

我試圖編譯核心模組原始碼,直到我注意到一些空格導致路徑名不匹配。我發現自己的目錄是:

axor@vacuum:~/software/CS 8803/Operating System Concepts/Chapter 2/ch2$ ls
Makefile  simple.c

我發生的錯誤:

axor@vacuum:~/software/CS 8803/Operating System Concepts/Chapter 2/ch2$ make
make -C /lib/modules/4.9.0-3-amd64/build M="/home/none/software/CS 8803/Operating System Concepts/Chapter 2/ch2" modules
make[1]: Entering directory '/usr/src/linux-headers-4.9.0-3-amd64'
/usr/src/linux-headers-4.9.0-3-common/scripts/Makefile.build:44: /home/none/software/CS/Makefile: No such file or directory
make[4]: *** No rule to make target '/home/none/software/CS/Makefile'.  Stop.
make[3]: *** [/usr/src/linux-headers-4.9.0-3-common/Makefile:1507: _module_/home/none/software/CS] Error 2
make[2]: *** [Makefile:150: sub-make] Error 2
make[1]: *** [Makefile:8: all] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.9.0-3-amd64'
make: *** [Makefile:4: all] Error 2

現在,我很清楚目錄名稱中的空格導致了問題。我將感興趣的目錄樹重命名為~/software/CS-8803/Operating-System-Concepts/Chapter-2/ch2,所有這些都有效。

問題:即使在包含空格的目錄名稱下,我如何才能使以下 makefile 正常工作?

obj-m += simple.o

all:
       make -C /lib/modules/$(shell uname -r)/build M="$(PWD)" modules

clean:
       make -C /lib/modules/$(shell uname -r)/build M="$(PWD)" clean

你不能。makefile 語法嚴重依賴空格來分隔單詞。當文件名包含空格時,很難編寫可以正常工作的 makefile,並且 Linux 核心 makefile 和大多數 makefile 一樣,不要嘗試。

在 makefile 的命令中使用文件名時,也很難正確地安排文件名的引用,而且大多數 makefile 都不會嘗試。所以避免所有對 shell 特殊的字元:不僅是空格,還有!"#$&'()*;<=>?[]\{|}`.

在您的情況下,一種解決方法是使用其路徑不包含任何特殊字元的符號連結。我認為這適用於 Linux 核心 makefile。它在使用 GNU makerealpath函式的 makefile 中不起作用,但核心 makefile 不在外部驅動程序的路徑上使用它。

axor@vacuum:~/software/CS 8803/Operating System Concepts/Chapter 2/ch2$ ln -s "$PWD" /tmp/ch2
axor@vacuum:~/software/CS 8803/Operating System Concepts/Chapter 2/ch2$ cd !$
axor@vacuum:/tmp/ch2$ make
make -C /lib/modules/4.9.0-3-amd64/build M="/tmp/ch2" modules
…

引用自:https://unix.stackexchange.com/questions/448913