
커널 모듈 프로그래밍을 시작하고 싶지만 이해가 안 되므로 아래에 제공된 간단한 makefile을 설명할 수 있는 사람이 있습니까?
obj−m += hello−1.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
답변1
실제로 두 가지 목표( all
및 clean
)가 있습니다. make all
콘솔에서 또는 폴더에 있을 때 호출할 수 있습니다 make clean
. 첫 번째 대상은 항상 기본 대상입니다( make
결과는 make all
).
들여쓰기레시피지적됐다. 이것은 make가 타겟을 빌드하기 위해 실행하는 코드입니다. 그래서 부르면 make
부르게 된다
make −C /lib/modules/$(shell uname −r)/build M=$(PWD) modules
물론 쉘은 uname
명령과 M
환경 변수를 확장합니다. 그런 다음 make
지정된 폴더( ) /lib/modules/$(shell uname −r)/build
의 대상을 사용하여 호출합니다 modules
. 이 대상(자식 프로세스)의 역할은 분명히 이 파일에 지정되어 있지 않습니다. 이는 /lib/modules/$(shell uname −r)/build
또 다른 Makefile
정의 된 목표가 있음을 의미합니다 modules
. 위에 나열된 명령은 modules
에 있습니다 /lib/modules/$(shell uname −r)/build/Makefile
.
목표도 마찬가지입니다 clean
. 그러면 clean
대상이 지정된 폴더에 있는 하위 프로세스가 생성됩니다 .
이 두 가지 목표 뒤에 있는 아이디어는 두 가지 구별되는 특성을 갖는 것입니다. 첫 번째( all
)는 무언가(아마도 모듈)를 구축하는 것입니다. 또 다른 방법은 clean
컴파일이 잘못되어 소스가 아닌 파일을 삭제하려는 경우를 대비해 작업 내용을 정리( )하는 것입니다 . 그러나 목표에 대한 이러한 해석은 명목상일 뿐입니다. 구현에 따라 다릅니다. 원한다면 이름을 t1
, t2
, 로 지정할 수 있습니다. 그러나 t3
, 및보다 가독성이 훨씬 떨어집니다.all
clean
install
hello−1.o
첫 번째 줄은 available 에 문자열을 추가합니다 obj−m
. 이 변수는 이전에 비어 있었으므로(외부 환경 변수를 통해 설정하지 않은 경우) 해당 값으로 설정하면 됩니다. 그러나 값은 export
편집되지 않으므로 로컬에서만 볼 수 있습니다. 따라서 하위 프로세스에는 영향을 미치지 않습니다(참조:이 링크).
한 가지 추가 사항: 제가 틀렸습니다. obj-m
효과가 없습니다. Makefile
커널에서 다시 읽고 . Makefile
로 시작하는 변수를 검색합니다 obj-
. 그런 다음 필요한 개체 파일을 컴파일하는 데 사용됩니다. 원천:https://stackoverflow.com/a/21140538/882756