it-source

make 명령의 m 옵션, makefile

criticalcode 2023. 10. 23. 21:56
반응형

make 명령의 m 옵션, makefile

make -C ~/kernel-2.6 M=`pwd` modules

위 줄에 있는 M='pwd'의 의미는 무엇입니까?

설명을 이해할 수 없었습니다.

M= 옵션을 사용하면 모듈 대상을 만들기 전에 파일을 모듈 소스 디렉토리로 다시 이동할 수 있습니다.

좀 더 확실하게 말씀해 주시겠습니까?

M에 대한 옵션이 아닙니다.make. 하이픈이 부족하다는 것을 주목하세요.M는 의 실행에 할당된 변수입니다.make.한다면make실행하다, 실행.Makefile스크립트, 이 스크립트는 변수를 읽을 수 있습니다.M그 내용물을 사용합니다.

당신이 제공하는 예에서,make읽을 것입니다Makefile인에~/kernel-2.6현재 작업 디렉토리를 변수에 할당합니다.M. 일반적으로, 이것은 다음을 허용할 것입니다.make처리 후 현재 디렉토리로 돌아가기Makefile.

저도 비슷한 퀴즈를 냈습니다.

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

여기서 make는 내 프로젝트의 디렉토리 내에서 호출됩니다.-Cis make option:

-Cdir, --directory= makefile을 읽거나 다른 작업을 하기 전에 디렉토리 dir로 dir합니다.여러 개의 -C 옵션이 지정된 경우 각각은 이전 옵션과 상대적으로 해석됩니다. -C / -C 등은 -C / 등과 같습니다.이것은 일반적으로 make의 재귀적 호출과 함께 사용됩니다.

Mmake option이 아니라 인수가 전달됩니다.부터-C변경사항은 우리가 알고 있는 디렉토리를 만듭니다. 그 디렉토리에서 make 파일을 읽을 것입니다.그 디렉토리에 있는 make file을 검사함으로써 나는 그것이 무엇을 하고 있는지를 발견했습니다.M:

From make file (Makefile) 가 가리키는 디렉토리의 Make file (이름은 Makefile)-C(커널 빌드 디렉토리라고 btw함):

# Use make M=dir to specify directory of external module to build
# Old syntax make ... SUBDIRS=$PWD is still supported
# Setting the environment variable KBUILD_EXTMOD takes precedence
ifdef SUBDIRS
  KBUILD_EXTMOD ?= $(SUBDIRS)
endif

Linux Device Drivers, 3rd Edition, Jonathan Corbet 등의 설명:

이 명령은 디렉터리를 -C 옵션이 제공된 디렉터리(즉, 커널 소스 디렉터리)로 변경하는 것으로 시작합니다.거기서 커널의 최상위 makefile을 찾습니다.M= 옵션을 사용하면 모듈 대상을 만들기 전에 파일을 모듈 소스 디렉토리로 다시 이동할 수 있습니다.

다음에 대한 설명서를 읽습니다.make:

-C dir, --directory=dir
            Change to directory dir before reading the makefiles or doing anything else.

호출하면 디렉토리가 다음으로 변경됩니다.~/kernel그리고 효과적으로 전화를 걸었습니다.make그곳, 즉 읽기.Makefile그 디렉토리에서.위드 더M변수, makefile은 실제 프로젝트 파일이 어디에 있는지 알고 그 위치로 다시 변경할 수 있습니다.

요점은 당신이 직접 makefile을 작성하는 것이 아니라, 한 번에 한 번뿐인 버전을 사용한다는 것입니다.

다른 답들은 대부분 맞지만, 저는 여러분에게 그것을 배우는 방법을 알려주고 싶습니다.

  1. M옵션이 아닙니다.
  2. M가 의 변수입니다.Makefile
  3. 그래서 우리는 그것을 읽어야 합니다.Makefile전화번호부에make -C로 바뀝니다.

만들기 파일을 읽어 보십시오. 댓글이 몇 개 없습니다.

# Use make M=dir to specify directory of external module to build
# Old syntax make ... SUBDIRS=$PWD is still supported
# Setting the environment variable KBUILD_EXTMOD take precedence
ifdef SUBDIRS
  KBUILD_EXTMOD ?= $(SUBDIRS)
endif

ifeq ("$(origin M)", "command line")
  KBUILD_EXTMOD := $(M)
endif

검색할 수 있습니다.KBUILD_EXTMOD:

VPATH       := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
module-dirs := $(addprefix _module_,$(KBUILD_EXTMOD))

그 알맹이는 그런 식입니다.Makefile나무 밖의 소스를 구축할 수 있습니다.

외부 모듈을 만드는 명령은 다음과 같습니다.

    $ make -C <path_to_kernel_src> M=$PWD

kbuild 시스템은 명령에 주어진 "M=" 옵션으로 인해 외부 모듈이 제작되고 있음을 알고 있습니다.

실행 중인 커널에 기반하여 빌드하려면 다음을 사용합니다.

    $ make -C /lib/modules/`uname -r`/build M=$PWD

유닉스 셸에서 쓰기`foobar`명령의 중간에는 "명령을 실행하라"는 의미가 있습니다.foobar여기에 출력물을 대체합니다."

포함해서M=`pwd`make명령은 "run the"를 의미합니다.pwd명령어는 현재 작업 디렉토리를 인쇄하고 설정합니다.M그 값에 대한 변수."

언급URL : https://stackoverflow.com/questions/20301591/m-option-in-make-command-makefile

반응형