山本です。

ちょっとした TIPS を見つけたので、流してみます。特に ext/tk は
.ext に大量のコピーが発生してどうにかならないかと思っていたのですが、
下のようなパッチを当てた上で、

Index: Makefile.sub
===================================================================
RCS file: /src/ruby/bcc32/Makefile.sub,v
retrieving revision 1.84
diff -u -w -b -p -r1.84 Makefile.sub
--- Makefile.sub	25 Oct 2005 16:59:17 -0000	1.84
+++ Makefile.sub	7 Nov 2005 07:56:52 -0000
@@ -340,7 +340,7 @@ s,@AR@,$(AR),;t t
 s,@ARFLAGS@,$(ARFLAGS) ,;t t
 s,@LN_S@,$(LN_S),;t t
 s,@SET_MAKE@,$(SET_MAKE),;t t
-s,@CP@,copy > nul,;t t
+s,@CP@,hardlink,;t t
 s,@INSTALL@,copy > nul,;t t
 s,@INSTALL_PROG@,$$(INSTALL),;t t
 s,@INSTALL_DATA@,$$(INSTALL),;t t

第一引数に元のファイルパス、第二引数にコピー先のディレクトリを受け取り
ハードリンクを生成するようなプログラムを用意すれば、HDD の負荷が低減します。
とりあえず私はこんなのを使っています。(Windows専用)

# ろくにテストしてないので、自己責任でお願いします。

#include <iostream>
#include <string>
#include <windows.h>
#include <sys/stat.h>

std::string strip(const std::string& path)
{
    std::string::size_type i = path.find_last_not_of('\\');

    if (i == std::string::npos)
    {
        return path;
    }
    else if (path[i] == ':') // root directory
    {
        return path.substr(0, i + 2);
    }
    else
    {
        return path.substr(0, i + 1);
    }
}

bool is_directory(const std::string& path)
{
    struct stat st;

    if (0 == stat(path.c_str(), &st))
    {
        return st.st_mode & S_IFDIR;
    }
    else
    {
        return false;
    }
}

std::string basename(const std::string& path)
{
    std::string::size_type i = path.rfind('\\');

    if (i == std::string::npos)
    {
        return path;
    }
    else
    {
        return path.substr(i + 1);
    }
}

std::string join(const std::string& dir, const std::string& name)
{
    if (dir.size() >= 1 && dir[dir.size() - 1] == '\\')
    {
        return dir + name;
    }
    else
    {
        return dir + "\\" + name;
    }
}

int main(int argc, char* argv[])
{
    if (argc != 3)
    {
        std::cerr << "usage: hardlink src dst" << std::endl;

        return -1;
    }

    std::string src = strip(argv[1]);
    std::string dst = strip(argv[2]);

    if (is_directory(dst))
    {
        dst = join(dst, basename(src));
    }

    CreateHardLink(dst.c_str(), src.c_str(), NULL);

    return 0;
}