[u-boot-2018.11] make 도구의fixdep

13334 단어 u-boot

1. 개요


fixdep 도구의 원본 코드는scripts/basic/fixdep에 있습니다.c에서 코드 자체는 복잡하지 않지만 그 역할은 무엇입니까?어디에서 호출합니까?어떻게 호출합니까?아래를 보시고 하나하나 말씀해 주세요.

2. 어디서 호출


u-boot 소스 디렉토리에서 직접 검색하기
  :
      grep -rnw fixdep . --exclude-dir=basic
  :
      ./scripts/Makefile.build:270:	scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' >    \
      ./scripts/Kbuild.include:230:# if_changed_dep  - as if_changed, but uses fixdep to reveal dependencies
      ./scripts/Kbuild.include:267:	scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).tmp;\
      ./board/bosch/shc/README:30:  HOSTCC  scripts/basic/fixdep
               ./.git/index

grep 매개변수 설명:
-r, 재귀적 검색 디렉토리
- n, 일치하는 결과의 행 번호 표시
- w, 단어별 검색
--exclude-dir=basic,basic 하위 디렉터리를 무시하고 이 디렉터리는fixdep 원본 디렉터리입니다
총 5개의 일치 결과가 있는데, 1조만 있다./scripts/Makefile.build의 270줄과 제3조./scripts/Kbuild.include의 267줄에서fixdep를 호출했습니다. 다른 것은 상관없습니다.

2.1 제1조 일치 결과:./scripts/Makefile.build의 270줄


이 일치 결과에 대한 세부내용:
define rule_cc_o_c
	$(call echo-cmd,checksrc) $(cmd_checksrc)			  \
	$(call echo-cmd,cc_o_c) $(cmd_cc_o_c);				  \
	$(cmd_modversions)						  \
	$(call echo-cmd,record_mcount)					  \
	$(cmd_record_mcount)						  \
	scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' >    \
	                                              $(dot-target).tmp;  \
	rm -f $(depfile);						  \
	mv -f $(dot-target).tmp $(dot-target).cmd
endef

위에서 보듯이 사용자 정의 宏rulecc_o_c fixdep를 호출합니다.
rule 추가 검색cc_o_c 호출:
  :
      grep -rnw rule_cc_o_c .
  :
      ./scripts/Makefile.build:199:# (See cmd_cc_o_c + relevant part of rule_cc_o_c)
      ./scripts/Makefile.build:264:define rule_cc_o_c

그 결과 정의 이외에 rule 이 표시되지 않았습니다.cc_o_c 인용되다.그럼 다른 방식으로 cc 를 검색하세요o_c:
  :
      grep -rnw cc_o_c .
  :
      ./scripts/Makefile.build:266:	$(call echo-cmd,cc_o_c) $(cmd_cc_o_c);				  \
      ./scripts/Makefile.build:270:	scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' >    \
      ./scripts/Makefile.build:279:	$(call if_changed_rule,cc_o_c)
      ./scripts/Makefile.build:285:	$(call if_changed_rule,cc_o_c)
      ./scripts/Makefile.lib:393:	$(call if_changed_rule,cc_o_c)
      ./examples/api/Makefile:67:	$(call if_changed_rule,cc_o_c)

6개의 검색 결과를 얻었는데, 그 앞의 두 개는 실제로는 宏rulecc_o_c 정의 자체, 마지막 하나는 u-boot 예에서 호출된 것이고 무시할 수도 있습니다.중점은 가운데 세 가지다.
 3 :
# Built-in and composite module parts
$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
	$(call cmd,force_checksrc)
	$(call if_changed_rule,cc_o_c)

 4 :
# Single-part modules are special since we need to mark them in $(MODVERDIR)
$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
	$(call cmd,force_checksrc)
	$(call if_changed_rule,cc_o_c)
	@{ echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod)

 5 :
$(obj)/efi_reloc.o: $(srctree)/arch/$(ARCH)/lib/$(EFI_RELOC:.o=.c) $(recordmcount_source) FORCE
	$(call cmd,force_checksrc)
	$(call if_changed_rule,cc_o_c)

분명히 세 번째는 컴파일% 이다.c 생성%.o 시 사용하는 규칙;
4조의 $(simple-used-m) 규칙은 글자 그대로 생성에 사용된다.ko 파일(모듈 파일)의 경우 u-boot가 생성되지 않습니다.ko 파일 (모듈 파일) 을 컴파일하는 데 사용합니다.c 생성%.o의 규칙은 제3조에 나타난 그 규칙이다.
제5조의 규칙은 제3조의 규칙과 같다.

2.2 제3조 일치 결과:./scripts/Kbuild.포함 267 줄


이 일치 결과에 대한 세부내용:
# Execute the command and also postprocess generated .d dependencies file.
if_changed_dep = $(if $(strip $(any-prereq) $(arg-check) ),                  \
	@set -e;                                                             \
	$(echo-cmd) $(cmd_$(1));                                             \
	scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).tmp;\
	rm -f $(depfile);                                                    \
	mv -f $(dot-target).tmp $(dot-target).cmd)

위에서 볼 수 있는 사용자 정의 함수ifchanged_dep에서 fixdep를 호출했습니다.
if 추가 검색changed_dep 호출:
  :
      grep -rnw if_changed_dep .
  :
      ./scripts/Makefile.host:97:	$(call if_changed_dep,host-csingle)
      ./scripts/Makefile.host:114:	$(call if_changed_dep,host-cobjs)
      ./scripts/Makefile.host:131:	$(call if_changed_dep,host-cxxobjs)
      ./scripts/Makefile.build:173:	$(call if_changed_dep,cc_s_c)
      ./scripts/Makefile.build:179:	$(call if_changed_dep,cc_i_c)
      ./scripts/Makefile.build:294:	$(call if_changed_dep,cc_lst_c)
      ./scripts/Makefile.build:308:	$(call if_changed_dep,as_s_S)
      ./scripts/Makefile.build:314:	$(call if_changed_dep,as_o_S)
      ./scripts/Makefile.build:326:	$(call if_changed_dep,cpp_lds_S)
      ./scripts/Makefile.lib:310:	$(call if_changed_dep,dtc)
      ./scripts/Makefile.lib:330:	$(call if_changed_dep,dtco)
      ./scripts/Makefile.lib:389:	$(call if_changed_dep,as_o_S)
      ./scripts/Makefile.spl:377:	$(call if_changed_dep,cpp_lds)
      ./scripts/Kbuild.include:230:# if_changed_dep  - as if_changed, but uses fixdep to reveal dependencies
      ./scripts/Kbuild.include:264:if_changed_dep = $(if $(strip $(any-prereq) $(arg-check) ),                  \
      ./Kbuild:44:	$(call if_changed_dep,cc_s_c)
      ./Kbuild:65:	$(call if_changed_dep,cc_s_c)
      ./dts/Makefile:53:	$(call if_changed_dep,as_o_S)
      ./examples/api/Makefile:71:	$(call if_changed_dep,as_o_S)
      ./arch/sandbox/cpu/Makefile:20:	$(call if_changed_dep,cc_os.o)
      ./arch/sandbox/cpu/Makefile:22:	$(call if_changed_dep,cc_os.o)
      ./arch/sandbox/cpu/Makefile:31:	$(call if_changed_dep,cc_eth-raw-os.o)
      ./arch/arm/mach-imx/Makefile:82:	$(call if_changed_dep,as_o_S)
      ./arch/arm/mach-imx/Makefile:102:	$(call if_changed_dep,cpp_cfg)
      ./Makefile:1294:	$(call if_changed_dep,cpp_lds)
      ./Makefile:1532:	$(call if_changed_dep,cpp_lds)

위의 모든 쌍 if 확인changed_dep가 호출되는 곳마다 공통점이 있습니다: 목표를 새로 생성할 때if 를 호출합니다changed_dep에서 의존 파일을 생성합니다.
예를 들면 다음과 같습니다.
  • ./scripts/Makefile.host:97:    $(call if_changed_dep,host-csingle)
  • $(host-csingle): $(obj)/%: $(src)/%.c FORCE
    	$(call if_changed_dep,host-csingle)

    이 규칙은%입니다.c 컴파일 출력은 실행 가능한 파일% 입니다.
  • ./scripts/Makefile.build:314:    $(call if_changed_dep,as_o_S)
  • $(obj)/%.o: $(src)/%.S FORCE
    	$(call if_changed_dep,as_o_S)

    이 규칙은%입니다.S컴파일 출력이%입니다.o.
  • ./scripts/Makefile.lib:310:    $(call if_changed_dep,dtc)
  • $(obj)/%.dtb: $(src)/%.dts FORCE
    	$(call if_changed_dep,dtc)

    이 규칙은%입니다.dts 컴파일 출력이% 입니다.dtb.
    이상 모든 ifchanged_dep가 호출되는 곳은 또 다른 공통점이 있다.if 라고 할 수 있다.changed_dep의 호출에도 또 다른 특별한 점이 있습니다.Makefile을 제외하고는.host에서 if 호출changed_dep,%.c 컴파일 출력은%입니다.o 이외에 컴파일% 에 사용할 다른 호출이 없습니다.c 파일의
    참고: Makefile.host는 Kbuild 시스템에서 u-boot 자체 파일을 컴파일하는 대신 호스트에서 실행되는 프로그램을 컴파일합니다.

    2.3 fixdep 호출 결론


    이전 두 절의 분석을 보면 다음과 같은 경우fixdep를 호출하여 처리할 것이다.
  • u-boot의%.c 컴파일 출력은%입니다.o 는 rule 을 호출합니다cc_o_c,rule_cc_o_c 또fixdep 생성% 를 호출합니다.o 종속 파일.%.cmd;
  • 목표를 새로 생성할 때if 호출changed_dep에서 종속 파일을 감지하고 업데이트합니다. 여기서 ifchanged_dep는 의존 파일을 처리하기 위해fixdep를 호출하지만 u-boot의% 를 생성하는 데 사용됩니다.c 파일 컴파일 출력은%입니다.o의 규칙은 제외한다.

  • 3. 어떻게 호출


    fixdep.c 의 usage () 함수,fixdep 사용법을 볼 수 있습니다:
    Usage: fixdep   

    fixdep는 다음 세 가지 매개 변수를 수신합니다.
  • : 컴파일된 의존 파일*.d
  • : 컴파일 생성 목표
  • : 컴파일된 명령
  • 4. 가져오기 및 내보내기


    우선 호출 if 를 보도록 하겠습니다.changed_dep의 인스턴스:
    if 수정changed_dep, fixdep를 호출하는 명령을 인쇄하고 기존 의존 파일을 보존합니다.
    # Execute the command and also postprocess generated .d dependencies file.
    if_changed_dep = $(if $(strip $(any-prereq) $(arg-check) ),                  \
    	@set -e;                                                             \
    	$(echo-cmd) $(cmd_$(1));                                             \
    	echo 'call fixdep: scripts/basic/fixdep $(depfile) $@ "$(make-cmd)"';\
    	scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).tmp;\
    	mv -f $(dot-target).tmp $(dot-target).cmd)

    make pangu 다시 실행basic_defconfig, log:
    wei@wei-PC:~/stm32mp/uboot/u-boot-st$ make pangu_basic_defconfig
      HOSTCC  scripts/basic/fixdep
    call fixdep: scripts/basic/fixdep scripts/basic/.fixdep.d scripts/basic/fixdep "cc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer  -std=gnu11     -o scripts/basic/fixdep scripts/basic/fixdep.c  "
      HOSTCC  scripts/kconfig/conf.o
    call fixdep: scripts/basic/fixdep scripts/kconfig/.conf.o.d scripts/kconfig/conf.o "cc -Wp,-MD,scripts/kconfig/.conf.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer  -std=gnu11   -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DCURSES_LOC="" -DNCURSES_WIDECHAR=1 -DLOCALE   -c -o scripts/kconfig/conf.o scripts/kconfig/conf.c"
      YACC    scripts/kconfig/zconf.tab.c
      LEX     scripts/kconfig/zconf.lex.c
      HOSTCC  scripts/kconfig/zconf.tab.o
    call fixdep: scripts/basic/fixdep scripts/kconfig/.zconf.tab.o.d scripts/kconfig/zconf.tab.o "cc -Wp,-MD,scripts/kconfig/.zconf.tab.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer  -std=gnu11   -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DCURSES_LOC="" -DNCURSES_WIDECHAR=1 -DLOCALE  -Iscripts/kconfig -c -o scripts/kconfig/zconf.tab.o scripts/kconfig/zconf.tab.c"
      HOSTLD  scripts/kconfig/conf
    #
    # configuration written to .config
    #
    

    log에서 보듯이make pangu 실행basic_defconfig는scripts/basic/.fixdep.d 의 경우 fixdep 명령을 호출하는 매개 변수는 다음과 같습니다.
  • depfile  =  scripts/basic/.fixdep.d
  • target  =  scripts/basic/fixdep
  • cmdline  =  cc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer  -std=gnu11     -o scripts/basic/fixdep scripts/basic/fixdep.c  

  • 4.1 입력 및 출력


    컴파일 과정에서 생성된 의존 파일입니다.fixdep.d는 입력으로 처리되어 있습니다.fixdep.cmd 파일, 변경 내용 비교:
    원래의 의존 파일입니다.fixdep.d:
    fixdep.o: scripts/basic/fixdep.c /usr/include/stdc-predef.h \
     ... ... /*       */
     /usr/include/x86_64-linux-gnu/bits/in.h
    

    새로 생성된 의존 파일입니다.fixdep.cmd:
    cmd_scripts/basic/fixdep := cc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer  -std=gnu11     -o scripts/basic/fixdep scripts/basic/fixdep.c  
    
    source_scripts/basic/fixdep := scripts/basic/fixdep.c
    
    deps_scripts/basic/fixdep := \
        $(wildcard include/config/his/driver.h) \
        $(wildcard include/config/my/option.h) \
        $(wildcard include/config/.h) \
        $(wildcard include/config/foo.h) \
        $(wildcard include/config/boom.h) \
        $(wildcard include/config/....h) \
        $(wildcard include/config/is.h) \
      /usr/include/stdc-predef.h \
      ... ... /*       */
      /usr/include/x86_64-linux-gnu/bits/in.h \
    
    scripts/basic/fixdep: $(deps_scripts/basic/fixdep)
    
    $(deps_scripts/basic/fixdep):
    

    원래의.fixdep.d에 비해 새로 생성된 것이다.fixdep.cmd 대상과 관련된 변수 증가 cmdxxx、source_xxx、deps_xxx 및 대상 xxx 대 depxxx의 의존 규칙.

    4.2 .*.cmd 참조


    최상위 Makefile에서는 이렇게 참조됩니다.*.cmd:
    # read all saved command lines
    
    targets := $(wildcard $(sort $(targets)))
    cmd_files := $(wildcard .*.cmd $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))
    
    ifneq ($(cmd_files),)
      $(cmd_files): ;	# Do not try to update included dependency files
      include $(cmd_files)
    endif

    생성 대상 targets에 따라 cmd 생성lines 목록, 그리고include 명령으로 모든.*.cmd 파일.
    생성된arch/arm/cpu/armv7/.start.o.cmd의 경우 파일에 다음이 포함됩니다.
    cmd_arch/arm/cpu/armv7/start.o := arm-openstlinux_eglfs-linux-gnueabi-gcc ... -c -o arch/arm/cpu/armv7/start.o arch/arm/cpu/armv7/start.S
    
    source_arch/arm/cpu/armv7/start.o := arch/arm/cpu/armv7/start.S
    
    deps_arch/arm/cpu/armv7/start.o := \
        $(wildcard include/config/armv7/lpae.h) \
        $(wildcard include/config/omap44xx.h) \
        ... ...
    
    arch/arm/cpu/armv7/start.o: $(deps_arch/arm/cpu/armv7/start.o)
    
    $(deps_arch/arm/cpu/armv7/start.o):
    

    실제로는 종속 규칙에만 사용됩니다.
    deps_arch/arm/cpu/armv7/start.o := \
        $(wildcard include/config/armv7/lpae.h) \
        $(wildcard include/config/omap44xx.h) \
        ... ...
    
    arch/arm/cpu/armv7/start.o: $(deps_arch/arm/cpu/armv7/start.o)
    
    $(deps_arch/arm/cpu/armv7/start.o):

    cmdarch/arm/cpu/armv7/start.o 및 소스arch/arm/cpu/armv7/start.o, u-boot를 컴파일할 때 사용하지 않았습니다.
    cmdxxx 및 소스xxx, 생각할 수 있는 용도는 컴파일된 정보를 저장하는 것이다. 예를 들어 cmdxxx는 생성에 사용되는 명령을 나타냅니다.sourcexxx는 목표를 생성하는source 코드를 표시합니다. 어떤 파일이 어떻게 생성되는지 보고 싶으면.*.cmd 파일이면 됩니다.사실 이것도 꽤 쓸모가 있다.
    예를 들어, u-boot.bin이 어떻게 생성되었는지 직접 찾아보세요.u-boo.bin.cmd, 일목요연:
    cmd_u-boot.bin := cp u-boot-dtb.bin u-boot.bin

    아이고, u-boot.빈이가 바로 cp u-boot이라니.dtb.빈이가 왔어.

    5. 요약


    위 섹션에서는 전체 분석 프로세스에 대해 설명하고 다음을 요약합니다.
    컴파일할 때 컴파일러는 옵션-MD에 따라 종속 파일을 자동으로 생성합니다.*.d,fixdep로 업데이트.*.d 파일이 새 종속 파일을 생성합니다.*.cmd.
    fixdep은 두 곳에서 호출됩니다:
  • rule_cc_o_c: u-boot 자체의% 를 컴파일합니다.c 파일의 경우 rulecc_o_c 생성된% 를fixdep로 업데이트합니다.c의 종속 파일.%.cmd.
  • if_changed_dep: 상기 rule 제외cc_o_c 이외의 다른 목표는 파일의 생성에 의존한다. 예를 들어 호스트에서 실행하는 프로그램 생성, dts 파일 처리, 어셈블리 파일 생성 처리 *.o (또는 *.s, *.lst) 등을 생성합니다.

  • fixdep에서 출력한.*. 보기를 통해cmd 파일은 대응하는 목표*가 어떻게 생성되었는지 알 수 있습니다.

    좋은 웹페이지 즐겨찾기