fixdep.c分析

7609 ワード

gcc-MDを使用してターゲットを生成すると、依存ファイルが生成されます.たとえば、main.cを新規作成します.
#include 
int main()
{
	printf("Hello World !");
	return 0;
}

gcc -MD main.c -o main.oを実行し、2つのファイルmain.o,main.d,main.dを生成します.main.dは、依存ファイルの出力内容です.
main.o: main.c /usr/include/stdc-predef.h /usr/include/stdio.h \
 /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \
 /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \
 /usr/include/x86_64-linux-gnu/bits/wordsize.h \
 /usr/include/x86_64-linux-gnu/bits/long-double.h \
 /usr/include/x86_64-linux-gnu/gnu/stubs.h \
 /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
 /usr/lib/gcc/x86_64-linux-gnu/7/include/stddef.h \
 /usr/include/x86_64-linux-gnu/bits/types.h \
 /usr/include/x86_64-linux-gnu/bits/typesizes.h \
 /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \
 /usr/include/x86_64-linux-gnu/bits/types/FILE.h \
 /usr/include/x86_64-linux-gnu/bits/libio.h \
 /usr/include/x86_64-linux-gnu/bits/_G_config.h \
 /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \
 /usr/lib/gcc/x86_64-linux-gnu/7/include/stdarg.h \
 /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
 /usr/include/x86_64-linux-gnu/bits/sys_errlist.h

main.o依存はmain.cや一部のライブラリファイルとこの機能を使用しており、makeツールを支援してターゲットの再生成が必要かどうかを判断することができますが、カーネルではほとんどのファイルが構成時に生成されたautoconf.hなどのヘッダファイルに依存しています.これは、コンパイルプロファイルを再構成するたびに、すべてのファイルを再コンパイルする必要があることを意味します.1行だけ変更しても、非常に友好的ではありません.fixdepツールは、すべてのファイルの再編成を回避し、コンパイルターゲットのファイルと命令fixdepの使用方法を記録することを主な目的としています.
Usage: fixdep   
		depfile : gcc -MD        
		target  :        
		cmdline :        

main.cの場合、次のコマンドを実行できます.
./fixdep main.d main.o  "gcc -MD main.c -o main.o"

しゅつりょく
cmd_main.o := gcc -MD main.c -o main.o

source_main.o := main.c

deps_main.o := \
  /usr/include/stdc-predef.h \
  /usr/include/stdio.h \
  /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \
  /usr/include/features.h \
  /usr/include/x86_64-linux-gnu/sys/cdefs.h \
  /usr/include/x86_64-linux-gnu/bits/wordsize.h \
  /usr/include/x86_64-linux-gnu/bits/long-double.h \
  /usr/include/x86_64-linux-gnu/gnu/stubs.h \
  /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
  /usr/lib/gcc/x86_64-linux-gnu/7/include/stddef.h \
  /usr/include/x86_64-linux-gnu/bits/types.h \
  /usr/include/x86_64-linux-gnu/bits/typesizes.h \
  /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \
  /usr/include/x86_64-linux-gnu/bits/types/FILE.h \
  /usr/include/x86_64-linux-gnu/bits/libio.h \
  /usr/include/x86_64-linux-gnu/bits/_G_config.h \

  /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \
  /usr/lib/gcc/x86_64-linux-gnu/7/include/stdarg.h \
  /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
  /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \

main.o: $(deps_main.o)

$(deps_main.o):


ターゲットを生成する命令,依存,makefileの依存フォーマットが記録されていることがわかる.
注目すべきは、依存ファイルに行が複数あることです.
    $(wildcard include/config/h.h) \

これがfixdepの仕事の鍵で、fixdepは依存します
			if (strrcmp(s, "include/generated/autoconf.h") &&
			    strrcmp(s, "arch/um/include/uml-config.h") &&
			    strrcmp(s, "include/linux/kconfig.h") &&
			    strrcmp(s, ".ver")) {

このファイルはフィルタリングされ、ソースファイルのCONFIG_XXX,include/config/XXX.hに変換しmain.cを
#include 
int main()
{
#ifdef CONFIG_XPC
#endif
	printf("Hello World !");
	return 0;
}

実行
gcc -MD main.c -o main.o
./fixdep main.d main.o  "gcc -MD main.c -o main.o"

出力は
cmd_main.o := gcc -MD main.c -o main.o

source_main.o := main.c

deps_main.o := \
    $(wildcard include/config/xpc.h) \
  /usr/include/stdc-predef.h \
  /usr/include/stdio.h \
  /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \
  /usr/include/features.h \
  /usr/include/x86_64-linux-gnu/sys/cdefs.h \
  /usr/include/x86_64-linux-gnu/bits/wordsize.h \
  /usr/include/x86_64-linux-gnu/bits/long-double.h \
  /usr/include/x86_64-linux-gnu/gnu/stubs.h \
  /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
  /usr/lib/gcc/x86_64-linux-gnu/7/include/stddef.h \
  /usr/include/x86_64-linux-gnu/bits/types.h \
  /usr/include/x86_64-linux-gnu/bits/typesizes.h \
  /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \
  /usr/include/x86_64-linux-gnu/bits/types/FILE.h \
  /usr/include/x86_64-linux-gnu/bits/libio.h \
  /usr/include/x86_64-linux-gnu/bits/_G_config.h \
    $(wildcard include/config/h.h) \
  /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \
  /usr/lib/gcc/x86_64-linux-gnu/7/include/stdarg.h \
  /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
  /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \

main.o: $(deps_main.o)


行$(wildcard include/config/xpc.h)が1行増えた場合、依存にプロファイルがある場合はフィルタリングされ、ソースファイルのCONFIG_先頭のマクロは、include/configの下のヘッダファイルに依存します.これらのヘッダファイルは、プロファイルに基づいて生成された空のファイル、またはフォルダです.プロファイル内の対応するマクロが変更されると、これらのファイルは構成時に更新されます.これにより、すべてのファイルをコンパイルする必要がなくなり、構成が変更されると