다음 makefile 아래의 공백으로 구분된 디렉터리에서 Linux 커널 모듈을 컴파일하는 방법은 무엇입니까?

다음 makefile 아래의 공백으로 구분된 디렉터리에서 Linux 커널 모듈을 컴파일하는 방법은 무엇입니까?

경로 이름 불일치를 일으키는 일부 공백을 발견할 때까지 커널 모듈 소스 코드를 컴파일하려고 했습니다. 내가 찾은 디렉토리는 다음과 같습니다.

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

관련 정보