Como compilar módulos do kernel do Linux dentro de diretórios separados por espaços em branco sob o seguinte makefile?

6

Eu estava tentando compilar um código-fonte do módulo do kernel, até notar que alguns espaços em branco estavam causando nomes de caminho incompatíveis. O diretório em que me encontrei foi:

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

O erro em que incorrei:

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

Agora, ficou claro para mim que os espaços em branco nos nomes dos diretórios estavam causando o problema. Renomeiei a árvore de diretórios interessados para ~/software/CS-8803/Operating-System-Concepts/Chapter-2/ch2 e tudo funcionou.

Pergunta: como posso obter o makefile a seguir para funcionar corretamente, mesmo sob nomes de diretórios contendo espaços em branco?

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
    
por Acsor 10.06.2018 / 11:06

1 resposta

8

Você não pode. A sintaxe makefile depende muito do espaço em branco para separar palavras. É difícil escrever makefiles que funcionem corretamente quando os nomes dos arquivos contêm espaços, e os makefiles do kernel Linux, como a maioria dos makefiles, não tentam.

Também é difícil organizar os nomes dos arquivos corretamente quando eles são usados em um comando em um makefile, e também a maioria dos makefiles não tenta. Portanto, evite todos os caracteres que são especiais para o shell: não apenas espaço em branco, mas também !"#$&'()*;<=>?[]\'{|} .

Uma solução alternativa no seu caso seria usar um link simbólico cujo caminho não contenha caracteres especiais. Eu acho que isso funciona com makefiles do kernel Linux. Ele não funciona em makefiles que usam o GNU make realpath function, mas os makefiles do kernel não o usam em caminhos para drivers externos.

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
…
    
por 10.06.2018 / 13:21