C, C++ のヘッダファイルの依存関係を rake で扱う

  • 9
    Like
  • 3
    Comment
More than 1 year has passed since last update.

rake + gcc で C や C++ のオブジェクトファイルとヘッダファイルの間の依存関係を扱うにはどうしたら良いかなーと試行錯誤して、 一つの解答にたどり着きました。オブジェクトファイルを生成するときに MMD オプションで依存関係を *.d ファイルに吐いたおき、 2回目以降のコンパイルでは、それを rake から読み込んで利用します。

Rakefile
def get_headers(file)
  if File.exists?(file)
    File.read(file).gsub("\\\n ", "").scan(/^\S+: (.+)$/)
        .flatten.map {|s| s.split(' ') }.flatten
  else
    []
  end
end

# rule の場合は proc を通して
rule '.o' => ['%X.cpp',
              proc {|file| get_headers(file.pathmap('%X.d')) }] do |t|
  sh "#{GXX} #{CFLAGS} -c -o #{t.name} -MMD #{t.prerequisites[0]}"
end

# file の場合は直接
file 'myapp.o' => ['myapp.cpp', *get_headers('myapp.d')] do |t|
  sh "#{GXX} #{CFLAGS} -c -o #{t.name} -MMD #{t.prerequisites[0]}"
end