2012-06-18 4 views
13

외부 모듈 Kbuild 파일에서 CFLAGS이 변경되면 최근 커널 (2.16.24부터 시작)이 마음에 들지 않습니다. CFLAGS가 변경되면 리눅스 커널는 kbuild 시스템에 의해 다음과 같은 오류가 발행됩니다 :커널 모듈 컴파일 및 KBUILD_NOPEDANTIC

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

here에서 :

외부 모듈은 CFLAGS를 수정하여 GCC 옵션 을 변형 한 몇 가지 경우가 있습니다. 이것은 문서화 된 적이 없으며 은 나쁜 습관이었습니다.

추가 email LKML.

왜 좋지 않은가요? 이성적 무엇입니까?

답변

1

Linux 메이크 파일은 커널에 적합한 방식으로 CFLAGS을 빌드합니다.
CFLAGS을 재정의하면 일부 플래그를 추가하고 일부 플래그가 제거 될 수 있습니다. 제거 된 플래그 중 일부는 올바른 컴파일에 중요 할 수 있습니다.

+0

CFLAGS가 플래그라는 것을 이해한다면 커널 전체가 컴파일되므로 변경해서는 안됩니다. 이것은 커널 KBuild 시스템이 CFLAGS + EXTRA_CFLAGS로 외부 모듈을 컴파일한다는 것을 의미합니다. 옳은? – dimba

+0

나는 그렇게 생각한다. – ugoren

9

먼저 EXTRA_CFLAGS은 더 이상 사용되지 않으며 ccflags-y으로 대체됩니다. ccflags-y의 의도는 Documentation/kbuild/makefiles.txt, 3.7 절에서 읽을 수 있습니다.

기본적으로이 변수를 사용하면 할당 된 파일의 범위 내에서 C 컴파일 플래그 세트에 설정을 추가 할 수 있습니다. 은 자신의 메이크 파일을 넘어 글로벌 영향을 미칠 수 있기 때문에 글로벌 플래그를 변경하지 않아도됩니다. 이는 나쁜 습관으로 간주됩니다. 여러분이 언급 한 확인은 실제로 전역 플래그가 포함 된 makefile에 의해 변경되지 않았 음을 확인합니다.

ccflags-y (이전의 EXTRA_CFLAGS)이 빌드 프로세스에서 어떻게 사용되는지 확인하는 것은 흥미로운 일입니다. (즉,이 독자 ;-)에게 연습으로 남아 있기 때문에, 모두는 아니지만) 몇 가지 관련 사항을 추적하면 다음 보여줍니다

EXTRA_CFLAGS 여전히 사용할 수 있습니다

, scripts/Makefile.lib

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

같은 파일에 따라 , 약하게을 scripts/Makefile.build에서 다음

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) 

: ccflags-y이 (CFLAGS_<filename>.o라고, 또한 당신이 당신의 처리에 또 다른 변수가 있음을 보여줍니다)를 C 컴파일 플래그에 종료하는 방법을 보여줍니다 ilation 규칙은 정의 :이 모든 재귀 적으로 자신의 메이크 파일을 정의 할 때 ccflags-y의 자신의 값이 C 플래그에 삽입됩니다 것을 의미 =하지 :=를 사용하여, 변수를 확장됩니다

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

하는 것으로.

마지막으로 약 KBUILD_NOPEDANTIC입니다. 제목은 언급했지만 실제 질문은 아닙니다.CFLAGS의 변경된 값이 테스트는 KBUILD_NOPEDANTIC에게 어떤 가치를 제공하여 비활성화 할 수 있습니다 - 모든 오늘 검색된이 답변에서 참조 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 

파일을 참조하십시오.

지금이 분야의 전문가가 아니며이 전체 이야기를 작성한 후 메이크 파일을 자세히 살펴보면 내가 이해할 수없는 것이 있습니다. 빌드 시스템에서는 CFLAGS이 사용되지 않았으며 (암시 적으로도 명시 적으로도 사용되지는 않지만) KBUILD_CFLAGS입니다. 따라서 CFLAGS의 변경 사항 확인이 실제로 KBUILD_CFLAGS의 변경 사항 검사인지 확인해야합니다.