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