clang>>>>越えられない壁>>>>cil

d:id:xxxxxeeeee:20111220:1324352696に書いたcilだが、結局C++が読めないと意味が無いんだよぉぉぉおおおーーーッ!という訳でd:id:fjnl:20110311:1299798998サンプルソースをビルドすることに全力で注力した。その結果ビルドに成功し、次のことが分かった。

ビルド時のオプションありえなくめんどくさいんですけど?

まずLLVM絡みのビルドオプションはllvm-configで一掃できる。問題はlibclangのオプションで、これも他人には推し量れない依存の嵐で、結局clangのMakefileからリンク時の順番を読み取って何とかビルドできた。そうそう、gccのリンク時のオプションは依存してるほうが前、依存される方が後なんだよね。全体から探索すれば済む話なのに意地悪な話である(せめて解析するコマンドくらい欲しい、もしかしてある?)。

LLVMDIR=${HOME}/local/llvm

CXXFLAGS = -std=c++0x -Wall `$(LLVMDIR)/bin/llvm-config --cxxflags`
LDFLAGS = -lclangFrontendTool -lclangFrontend -lclangDriver             \
          -lclangSerialization -lclangCodeGen -lclangParse -lclangSema  \
          -lclangStaticAnalyzerFrontend -lclangStaticAnalyzerCheckers   \
          -lclangStaticAnalyzerCore                                     \
          -lclangAnalysis -lclangIndex -lclangARCMigrate -lclangRewrite \
          -lclangAST -lclangLex -lclangBasic                            \
          `$(LLVMDIR)/bin/llvm-config --libs`                           \
          `$(LLVMDIR)/bin/llvm-config --ldflags`

SRC = $(wildcard *.cpp)
TGT = $(basename $(SRC))

all: $(TGT)

%: %.cpp
	$(CXX) $(CXXFLAGS) -o $@ $< $(LDFLAGS)

ちょっとだけコードの修正が必要

バージョンが変わったからか、少しだけコードの修正が必要だった。

--- a/maintype.cpp
+++ b/maintype.cpp
@@ -51,7 +51,7 @@ int main(int argc, char** argv) {
   compiler.createPreprocessor();
   compiler.createASTContext();
   compiler.setASTConsumer(new ast_consumer);
-  compiler.createSema(false, NULL);
+  compiler.createSema(clang::TU_Complete, NULL);
 
   auto const n = compiler.getFrontendOpts().Inputs.size();
   if (n == 0) {

ほんの一行、これだけ。意味はよくわからないが、読み込んだ翻訳単位がまるっと全部なのかパーツに過ぎないのかということを指示しているんだと思う(不安)。

最後に

なんか今んとこC++11でテンプレートバリバリ使えば何とかなりそうでそもそも構文木をいじる機会が出るのか若干疑問…