パス名の不一致を引き起こすいくつかのスペースが見つかるまで、カーネルモジュールのソースコードをコンパイルしようとしました。私が見つけたディレクトリは次のとおりです。
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
答え1
あなたはできません。 Makefile構文は、単語を区別するためにスペースに大きく依存します。ファイル名にスペースが含まれている場合、動作するメイクファイルを作成するのは難しく、ほとんどのメイクファイルと同様に、Linuxカーネルメイクファイルは試していません。
makefileのコマンドでファイル名を使用すると、ファイル名を正しく引用することは困難であり、ほとんどのmakefileはこれを試みません。したがって、スペースだけでなくシェル関連の文字も使用しないでください!"#$&'()*;<=>?[]\`{|}
。
回避策は、パスに特殊文字が含まれていないシンボリックリンクを使用することです。私はこれがLinuxカーネルmakefileに適用されると思います。 GNU make機能を使用するmakefileでは機能しませんが、realpath
カーネル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
…