flymakable autotoolize

flymakeとautotoolsを組み合わせるときみんなどうやってるの?という話.

autotoolsは言語によっては使わないけど,flymakeは無いとコード書けないって人は多いと思う.で,いきなり本題だが,これらを組み合わせて使おうとすると割とすぐにブチ当たる問題がある.

  • automakeからの脳直Makefile生成だとcheck-syntaxターゲット無いので上手くflymakeが刺さらない.
  • Makefileがあっても無視してg++ -Wall -Wextra -pedantic -fsyntax-onlyでflymakeだと,今度はconfigureからのincludeパスが刺さらない.
  • Makefileがあるときは単なるmakeでflymakeすると,余計なもののビルドまで走って鬱陶しいというかemacsがなにやら重苦しくなることがある.

と,こんな理由で完全においしいカンジにはならず,とりあえず,(特にclean後の)重さはともかく望ましい挙動はする3番目になるように.emacsを傾けていたりする.

このへんの問題を解消するなら,やはりcheck-syntaxターゲットをMakefile.amに適切に入れてあげたほうがよさげだ.たとえば,configure.acのヨコとかに

# flymakable.am
check-syntax:
    @case "$${CHK_SOURCES}" in \
      *.c)   $(COMPILE)    -fsyntax-only $(CHK_SOURCES) ;; \
      *.cpp) $(CXXCOMPILE) -fsyntax-only $(CHK_SOURCES) ;; \
      *)     exit 1 ;; \
    esac

.PHONY: check-syntax

とか用意しておいて,ビルドが発生するようなMakefile.amに対し

include $(top_srcdir)/flymakable.am

のように,そっと一行添えてあげると,全体に効かせる(AM_)C(XX)FLAGSとかの指定は刺さった上でcheck-syntaxできるようになる.

でも,上記のようなflymakable.amでは全然足りてなくい.プログラム(とかライブラリ)個別にC(XX)FLAGS指定するような場合だと,そのincludeパスがまだ刺さらない.つまり,こんなMakefile.amの場合.

include $(top_srcdir)/flymakable.am

noinst_LTLIBRARIES=libhoge.la
libhoge_la_SOURCES=hoge.cpp
# ax_boost_base.m4 で適切にconfigureされたboostのフラグとか
libhoge_la_CPPFLAGS=@BOOST_CPPFLAGS@

望ましいflymakable.amは,flymakeが渡すCHK_SOURCESに関連するCPPFLAGS/C(XX)FLAGSを収集しなければならずとってもメンドクサイ.とりあえず,そのファイルのビルドだけすればいいとか思っても,libtoolize済みだとターゲットの名前を決めるのも同じくらい手間い.上記の例でいうと恐らくmake libhoge_la-hoge.loせねばならない.しかもこの場合既にモノがあるなら消す必要がある.

何かシンプルな解法は無いだろうか?