Linux 커널 makefile은 Kbuild 프레임 워크를 사용합니다. 이것들은 GNU make로 해석되지만 Kbuild는 고유 한 사용 규칙을 가진 큰 매크로 세트로 구성되므로 일반적인 makefile 지침은 적용되지 않습니다. Kbuild의 좋은 점은 작업의 복잡성을 고려할 때 상용구가 거의 필요 없다는 것입니다.
Kbuild는의 커널 소스에 설명되어 Documentation/kbuild
있습니다. 모듈 라이터로서, 특히 읽어야합니다 modules.txt
(적어도 다른 것을 훑어 보십시오 ).
변수를 사용할 $(shell pwd)
때 확장되어 현재 수행중인 작업이 작동하지 않습니다 EXTRA_CFLAGS
. makefile은 모듈의 디렉토리가 아닌 커널 소스 트리에서 실행되므로 (이것은 Kbuild의 많은 명백하지 않은 측면 중 하나입니다) 잘못된 디렉토리를 선택합니다.
트리 외부 모듈에 포함 디렉토리를 지정하는 공식 관용구는의 5.3에 modules.txt
있습니다. src
변수는 모듈의 최상위 디렉토리로 설정됩니다. 따라서:
EXTRA_CFLAGS := -I$(src)/src/inc
이 선언은 Kbuild
모듈 트리의 루트 에있는 파일에 있어야합니다 . ( src
디렉토리를 모듈 트리의 루트 로 간주 할 수 있습니다 . 그렇다면 디렉토리를 넣고 Kbuild
위의 값을로 바꾸십시오 -I$(src)/inc
). 그것들을에 넣는 것도 가능 Makefile
하지만 (커널 모듈을 빌드 할 때만 적용되는 한)이 정의는 조건부 지시문 내에 있어야한다는 것을 명심하십시오 ifeq ($(KERNELRELEASE),)
. 의 §4.1을 참조하십시오 modules.txt
.
Kbuild
아직 파일 이없고 파일로 전환하려면의 §4.1을 읽으십시오 modules.txt
. 별도의 Kbuild
파일 을 갖는 것이 약간 더 명확합니다. 호출 규칙 이외의 기본 makefile에 커널에 적용되는 것은 넣지 마십시오 make -C $(KERNELDIR) M=$(pwd)
. 에서 Kbuild
필요한 최소한은 빌드하려는 모듈 목록 (종종 하나만)과 모듈에 포함 할 파일 목록 및 종속성 선언입니다.
EXTRA_CFLAGS := -I$(src)/inc
obj-m := mymod.o
mymod-y := $(src)/mod/mymod.o
$(src)/mod/mymod.o: $(src)/inc/mymod.h