[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에서 의존 파일을 생성합니다.
예를 들면 다음과 같습니다.
$(host-csingle): $(obj)/%: $(src)/%.c FORCE
$(call if_changed_dep,host-csingle)
이 규칙은%입니다.c 컴파일 출력은 실행 가능한 파일% 입니다.
$(obj)/%.o: $(src)/%.S FORCE
$(call if_changed_dep,as_o_S)
이 규칙은%입니다.S컴파일 출력이%입니다.o.
$(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를 호출하여 처리할 것이다.
3. 어떻게 호출
fixdep.c 의 usage () 함수,fixdep 사용법을 볼 수 있습니다:
Usage: fixdep
fixdep는 다음 세 가지 매개 변수를 수신합니다.
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 명령을 호출하는 매개 변수는 다음과 같습니다.
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은 두 곳에서 호출됩니다:
fixdep에서 출력한.*. 보기를 통해cmd 파일은 대응하는 목표*가 어떻게 생성되었는지 알 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
u-boot-2016.05 이식: (7), u-boot에서 파일 시스템 쓰기 지원u-boot 자체는 jffs2 포맷 파일 시스템에 대한 nand 명령을 지원하지만 yaffs2 포맷을 지원하지 않기 때문에 우리는 yaffs2 포맷 파일 시스템 명령을 지원하도록 수정하여 u-boot에서 검색.yaf...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.