distccソース研究三

1780 ワード

作者:朱金燦
ソース:http://blog.csdn.net/clever101
 
distccの研究を継続する.今日、分散型コンパイルシステム自体はコンパイラではなく、本質はコンパイル要求の開始者と実行者であり、つまりコンパイルプロセスを作成しなければならないが、コンパイルプロセスを作成するには、コンパイラを見つける必要がある.具体的にはdistcc、すなわちgccコンパイラである.分散コンパイルされたクライアントがコンパイラパラメータに移行したり、自分でコンパイラを探したりします.
 
今日はコードを読むことで、私の推測を確認しました.Distccクライアント・プログラムは、ヘルプ情報を表示するためにhelp、バージョン情報を表示するためにversionなどのコマンド・ライン・パラメータを持つコンソール・プログラムです.今日、これらの詳細を捨てて、distccがどのようにgccコンパイラを作成し、どのようにコンパイルプロセスを作成するかを見てみましょう.
 
すぐにdcc_という関数を見つけましたfind_compiler.この関数はコンパイラを探すために使われているようです.事実がそうであるかどうかを見てみましょう.
intdcc_find_compiler(char **argv, char ***out_argv)

{

    int ret;

    if (argv[1][0] == '-'

        || dcc_is_source(argv[1])

        || dcc_is_object(argv[1])) {

        if ((ret = dcc_copy_argv(argv,out_argv, 0)) != 0) {

            return ret;

        }

 

        /* change "distcc cc -cfoo.c" -> "cc -c foo.c" */

        free((*out_argv)[0]);

        (*out_argv)[0] =strdup("cc");

        if ((*out_argv)[0] == NULL) {

          return EXIT_OUT_OF_MEMORY;

        }

        return 0;

    } else {

        /* skip "distcc", point to"gcc -c foo.c"  */

        return dcc_copy_argv(argv + 1,out_argv, 0);

    }

}

この関数は確かにコンパイラを検索しているのを見ました.distccが実際に2つのコンパイラをサポートしているのも見ました.1つはcc(SUNが発売したC++コンパイラのようです)で、もう1つはgccです.見つかったコンパイラとそのコンパイルファイルパラメータはout_に保存されます.argv変数です.
 
コンパイラが見つかった以上、次はコンパイルプロセスを作成する必要があります.main関数でdcc_を呼び出し完了find_compiler関数は次にdcc_を呼び出すtrim_path関数は,システムにgccやccがインストールされていることを確認しているようで,いずれにしてもコンパイルプロセスを作成するものではないので,しばらく無視する.下を見続けます.
 
いくつかの副次的な関数をスキップして、私はついに1つの重要な関数を見つけました:dcc_build_somewhere_timed.今後の歳月の中で私たちはこの関数を重点的に分析します.これはここまでにしましょう.