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に気になって調べたら, 出力ストリームを捨てるときの常套手段らしい.
まだまだ, この世界には慣れてないことが多くて, こういう開発者のよく使う手段は覚えていきたい.