Compilação do módulo do kernel e KBUILD_NOPEDANTIC

Eu notei que kernels recentes (a partir de 2.16.24?) Não gostam se CFLAGS é alterado no arquivo Kbuild do módulo externo. Se CFLAGS for alterado, será emitido o seguinte erro pelo sistema Kbuild do kernel Linux:

scripts/Makefile.build:46: *** CFLAGS was changed in "/some/path". Fix it to use EXTRA_CFLAGS.  Stop.

De aqui :

Módulos externos em alguns casos modificaram a opção gcc       modificando CFLAGS. Isso nunca foi documentado e       foi uma má prática.

E-mail adicional do LKML.

Por que é má ideia? O que é racional?

13
adicionado editado
Visualizações: 1

2 Respostas

Primeiro de tudo, vale a pena mencionar que o EXTRA_CFLAGS foi obsoleto há algum tempo e é substituído por ccflags-y . Você pode ler sobre a intenção de ccflags-y em Documentation/kbuild/makefiles.txt , seção 3.7.

Basicamente, essa variável permite anexar configurações ao conjunto de sinalizadores de compilação C, dentro do escopo do arquivo onde ele está designado apenas. Você não deve alterar os sinalizadores globais, porque isso pode ter um impacto global além de seu próprio makefile, o que é considerado uma prática ruim. A verificação que você menciona verifica se, de fato, os sinalizadores globais não foram alterados pelos arquivos make incluídos.

É interessante verificar como ccflags-y , anteriormente conhecido como EXTRA_CFLAGS , acaba sendo usado no processo de compilação. Traçando alguns pontos relevantes (mas não todos, porque isso é deixado como um exercício para o leitor ;-)) mostra o seguinte:

EXTRA_CFLAGS can still be used, according to scripts/Makefile.lib

1 # Backward compatibility
2 asflags-y  += $(EXTRA_AFLAGS)
3 ccflags-y  += $(EXTRA_CFLAGS)

The same file shows how ccflags-y ends up in the C compilation flags (and also shows you that you have another variable at your disposal, called CFLAGS_.o):

104 orig_c_flags   = $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(KBUILD_SUBDIR_CCFLAGS) \
105                  $(ccflags-y) $(CFLAGS_$(basetarget).o)
106 _c_flags       = $(filter-out $(CFLAGS_REMOVE_$(basetarget).o), $(orig_c_flags))
...
133 __c_flags       = $(_c_flags)
...
147 c_flags        = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE)     \
148                  $(__c_flags) $(modkern_cflags)                           \
149                  -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags)

Então, em scripts/Makefile.build , a regra de compilação é definida:

234 cmd_cc_o_c = $(CC) $(c_flags) -c -o [email protected] $<

Note que estas são todas as variáveis ​​expandidas recursivamente, usando = e não : = , o que significa que seu próprio valor de ccflags-y é inserido em os sinalizadores C quando você defini-lo em seu próprio makefile.

Finally about KBUILD_NOPEDANTIC, which you mention in the title but not in the actual question. This test for changed value of CFLAGS can be disabled by giving KBUILD_NOPEDANTIC any value -- see scripts/Makefile.build

47 ifeq ($(KBUILD_NOPEDANTIC),)
48         ifneq ("$(save-cflags)","$(CFLAGS)")
49                 $(error CFLAGS was changed in "$(kbuild-file)". Fix it to use ccflags-y)
50         endif
51 endif

Os arquivos mencionados nesta resposta foram todos recuperados hoje.

Agora ... não sendo um especialista nesta área e olhando mais para os makefiles depois de escrever toda esta história, há uma coisa que eu não entendo também. Parece-me que CFLAGS não é usado no sistema de compilação (não implicitamente, nem explicitamente), mas KBUILD_CFLAGS é. Então, pergunto-me se essa verificação de alterações em CFLAGS deve, na verdade, ser uma verificação de alterações em KBUILD_CFLAGS .

9
adicionado

Makefiles do Linux constroem CFLAGS de uma maneira apropriada para o kernel.
Sobrescrevendo CFLAGS significa que você adiciona alguns sinalizadores e pode remover alguns sinalizadores. Algumas das bandeiras removidas podem ser importantes para a compilação correta.

1
adicionado
Se eu entendi CFLAGS são sinalizadores todo o kernel é compilado com e, portanto, não deve ser alterado. Isso significa que o sistema KBuild do kernel irá compilar meu módulo externo com CFLAGS + EXTRA_CFLAGS. Corrigir?
adicionado o autor dimba, fonte
Eu acho que sim.
adicionado o autor ugoren, fonte