Rakefileの雛形

C++用のRakefileの雛形を書いてみた。(gcc専用)

require 'rake/clean'
require 'rake/loaders/makefile'

CC = 'g++'
CFLAGS = '-Wall'
LDFLAGS = ''
SRCS = FileList['*.cpp']
OBJS = SRCS.ext('o')
LIBS = FileList[]
TARGET = 'sample'

CLEAN.include(OBJS)
CLOBBER.include(TARGET)

task 'default' => TARGET

file TARGET => OBJS do |t| 
  sh "#{CC} #{LDFLAGS} -o #{t.name} #{t.prerequisites.join(' ')} #{LIBS.map{|s|'-l'+s}}"
end

rule '.o' => '.cpp' do |t| 
  sh "#{CC} #{CFLAGS} -o #{t.name} -c #{t.source}"
end

# generate dependency information
SRCS.each do |src|
  depfile = ".#{src}.mf"
  file depfile => src do |t| 
    sh "#{CC} #{CFLAGS} -MM #{t.prerequisites.join(' ')} > #{t.name}"
  end 
  import depfile
  CLEAN.include(depfile)
end
  • 同じディレクトリにあるC++ファイル(拡張子cpp)をすべてコンパイルしてリンクする。
  • ソースファイルの依存関係はgccに自動的に出力させる。(aaa.cpp というファイルがあるとき aaa.cpp の依存情報は .aaa.mf .aaa.cpp.mf に出力される)
  • rake clean で中間出力ファイルを削除する。rake clobber で中間出力ファイル及び実行ファイルを削除する。

参考URL

[追記]
depfileのファイル名を変えた。もとの拡張子を含む方がいいと思ったので。