PassのMakefile
とりあえずのMakefile
#Makefile #OPTOBJS = $(wildcard ./*.ll) OPTOBJS = mem2.ll BASE = $(basename $(wildcard *.cpp)) OPTION = $(join -, $(BASE)) TARGET = $(join ./, $(BASE).so) CXX = g++ CXXFLAGS = -I/usr/local/llvm/include -std=c++11 `llvm-config --cflags --ldflags --libs` -fno-rtti -c -o LLFILE = $(basename $(wildcard *.c)) .SUFFIXES:.cpp .o .so .c .ll # all:$(TARGET) .o.so: $(CXX) -g -shared $< -o $@ .cpp.o: $(CXX) -g $< $(CXXFLAGS) $@ # prod:mem2.ll mem2.ll:$(LLFILE).ll opt -S -mem2reg $(LLFILE).ll -o mem2.ll .c.ll: clang -emit-llvm -S -o $(LLFILE).ll $(LLFILE).c run: $(TARGET) opt -load $(TARGET) $(OPTION) mem2.ll -S > /dev/null clean: rm -rf $(TARGET) *.ll
あんまMakefileを作ってきてないので関数とか, 内部マクロとかもっと使う方がスマートにかけるのかもしれないが,
いまは, そっちにばっか気を使うわけにも行かないので, 妥協する.
ちなみに使い方は
- make --------- cppファイルを探してきて, .soの共有ライブラリになる.
- make prod ----- Passに食わせたい, cファイルを.ll形式にしてくれる.
- make run ------ make prodで作ったファイルをPassに食わせる.
- make clean ------ 中間ファイルの削除としている.
これを書いているときに/dev/nullに気になって調べたら, 出力ストリームを捨てるときの常套手段らしい.
まだまだ, この世界には慣れてないことが多くて, こういう開発者のよく使う手段は覚えていきたい.