https://github.com/ermine-language/ermine-legacy/blob/d576a7b97/build.sbt#L39-L59
https://github.com/ermine-language/ermine-legacy/blob/d576a7b97/project/Build.scala#L42-L61
自分が発明したものではなく、たまたま見つけたもの。残念ながら、sbtに直接そういう仕組みが存在するわけではなく、色々頑張る感じです。
試してないけれど、応用すれば別にコンパイラの警告以外でもなんでも制御できそう?logManagerというKeyに対して、独自に作ったLogManagerを設定すればいいらしい。実装は、AtomicInteger使ってたり、文字列比較してたり、結構頑張ってて大変そうだった。
こういうの、頑張ろうとすればいくらでも制御できて色々とsbtは奥が深い?けど、ドキュメントには*1何も書いてないし、そんなに手軽でもないので、色々あれですね。
「コンパイラの警告抑制」ということに目的特化をすれば、ある程度汎用的で便利な感じにできるのだろうか?
念のため(?)、該当箇所そのまま引用もしておく。
// We're still using scala-iterv; we know, so stop telling us. logManager in Compile ~= {coreLogMgr => filterLogs(coreLogMgr){coreLog => val suppWarnTails = Seq("in package scalaz is deprecated: Scalaz 6 compatibility. Migrate to scalaz.iteratee.", // -unchecked always on in 2.10.2 compiler I think "is unchecked since it is eliminated by erasure") val suppress = new java.util.concurrent.atomic.AtomicInteger(0) def zero(n:Int) = suppress.compareAndSet(n, 0) (level, message) => { suppress.decrementAndGet() match { case n if suppWarnTails exists message.endsWith => suppress.compareAndSet(n, 2) case 1 if level == Level.Warn => () case 0 if level == Level.Warn && (message endsWith "^") => () case n if coreLog atLevel level => zero(n) coreLog.log(level, message) case n => zero(n) } } } }
/** Filter messages sent through loggers produced by `coreLogMgr`. * * @param logf Invoke for each acquired logger; invoke its result * for each log message that comes in. */ def filterLogs(coreLogMgr: LogManager )(logf: AbstractLogger => (Level.Value, => String) => Unit): LogManager = new LogManager { def apply(data: Settings[Scope], state: State, task: ScopedKey[_], writer: java.io.PrintWriter): Logger = { coreLogMgr(data, state, task, writer) match { case coreLog: AbstractLogger => new MultiLogger(List(coreLog)) { private val logfn = logf(coreLog) override def log(level: Level.Value, message: => String) = logfn(level, message) } case log => log } } }