2012-07-05 3 views
1

일부 함수 func_a가있는 소스 파일 a.c가 있다고 가정 해보십시오. 일부 기능 정의를 기반으로 func_a를 호출하고 이상적인 동일한 기능 정의를 기반으로 모듈에 포함될 a.c를 선호합니다. $ (CONFIG_SAMPLE) - (main.c의 말) 내가 조건부 소스 포함 kbuild

OBJ

같은 모듈 뭔가

#ifdef FEATURE_A 
func_a(); 
#endif 

같은과는 kbuild에있을 수 있었다 항상 존재 내 모듈 소스 너무

+ = sample.o 샘플 OBJS = main.o를 utils.o FEATURE_A가 정의 된 경우에만

샘플 모듈

에 AC 포함? ??

하나는 전 처리기 지시문이고 다른 하나는 컴파일러/링커/빌드 지시문이므로 이해가되지 않을 수 있습니다. 아마도 전처리 기 지시문이 kbuild에 정의 된 플래그를 사용하는 다른 방법이 더 효과적일까요? 이것을 달성 할 수있는 방법이 있습니까?

감사합니다.

답변

1

나는 조건부로 NFS 모듈에 포함하는 방법을 sysctl을 지원 지적하여 질문에 대답합니다 (I 다른 사례가 있습니다 확신 해요,하지만 내가 잘 알고 있어요 것입니다) :

  • fs/nfs/Makefile
  • 는 노출 "/ 리눅스/autoconf.h 포함"당신의 구성 옵션을 C 사전 처리기 매크로로 사용합니다. 따라서 위에 나열된 파일은 sysctl 지원을 구성했는지 여부에 따라 다르게 컴파일됩니다.

    sysctl을 지원이 사용되는 경우 헤더는 매크로 CONFIG_SYSCTL을 확인하고 C 함수 nfs_register_sysctl() 선언 "/ 리눅스/nfs_fs.h 포함". 이 함수는 "fs/nfs/super.c"에서 호출됩니다. Makefile (nfs-y += sysctl.o 참조)은 빌드 시스템이 파일 "fs/nfs/sysctl.c"에서 nfs_register_sysctl()을 정의하는 모듈로 컴파일되도록 지시합니다.

    sysctl 지원이 비활성화 된 경우 : 헤더 "include/linux/nfs_fs.h "는 매크로 CONFIG_SYSCTL을 확인하고 0 인 전 처리기 매크로 0을 선언합니다.이 매크로는"fs/nfs/super.c "에서 일부 (dead) 오류 처리 코드를 우회하는 데 사용됩니다 .. Makefile (see nfs-n += sysctl.o) 또는 "fs/nfs/sysctl.c"링크.

    1

    3.7 Compilation flags을 읽으십시오.

    제가 이해하는 것처럼, Kconfig 옵션과 전처리 된 매크로 사이에는 느슨한 재연성이 있으며 컴파일하는 동안 전달됩니다. 컴파일하는 동안 사용할 전처리 기 플래그를 정의하는 것은 커널 개발자의 몫입니다. 예를 들어

    net/rds/Makefile에 : 당신이 kconfig를 옵션 CONFIG_RDS_DEBUG로 구성된 커널 경우

    ccflags-$(CONFIG_RDS_DEBUG) :=  -DDEBUG 
    

    여기에 프리 프로세서 플래그 DEBUG이 전달됩니다.

    관련 문제