每个目标的Makefile操作

时间:2014-12-12 01:31:31

标签: python c++ makefile swig

我想编写一个makefile来处理具有相同操作的多个目标。例如,对于一个名为“quick_sort”的目标,我的makefile按如下方式启动:

TARGET     = trapz
WRAPPER    = $(TARGET)_wrap.cxx
SRC        = $(TARGET).cc
MATRIXOBJ  = vector.o vector_wrap.o matrix.o matrix_wrap.o matrix3d.o matrix3d_wrap.o
OBJ        = $(SRC:.cc=.o) $(WRAPPER:.cxx=.o) $(MATRIXOBJ)
CXX        = g++
CXXFLAGS   = -O3 -fPIC
INTERFACE  = $(TARGET).i
SWIGOPT    =
SWIG       = swig
PYLIB      = -I/usr/include/python2.7

SO         = so

python_cpp: $(TARGET).i
            $(SWIG) -c++ -python $(INTERFACE)
            $(CXX) $(CXXFLAGS) -c $(SRC)
            $(CXX) $(CXXFLAGS) -c $(WRAPPER) $(PYLIB)
            $(CXX) -shared $(OBJ) -o _$(TARGET).$(SO)

python_clean:
        rm -f *_wrap* *.o *~ *$(SO) mypython *.pyc .~* core

但是如果我想添加多个目标:

TARGET     = quick_sort bubble_sort standard_sort
WRAPPER    = $(TARGET)_wrap.cxx
SRC        = $(TARGET).cc
MATRIXOBJ  = vector.o vector_wrap.o matrix.o matrix_wrap.o matrix3d.o matrix3d_wrap.o
OBJ        = $(SRC:.cc=.o) $(WRAPPER:.cxx=.o) $(MATRIXOBJ)

它不起作用。如何在不为每个目标创建makefile的情况下生成所有可执行文件?

1 个答案:

答案 0 :(得分:1)

TARGET     := quick_sort bubble_sort standard_sort
MATRIXOBJ  := vector.o vector_wrap.o matrix.o matrix_wrap.o matrix3d.o matrix3d_wrap.o
CXX        := g++
CXXFLAGS   := -O3 -fPIC


.PHONY: all $(TARGET)
all: $(TARGET)

$(TARGET): %: _%.so

_%.so: %_wrap.o %.o $(MATRIXOBJ) Makefile
    $(CXX) -shared $(filter %.o, $^) -o $@

%_wrap.cxx: %.i Makefile
    swig -c++ -python $<

%.o: %.cxx Makefile
    $(CXX) $(CXXFLAGS) -c $< -I/usr/include/python2.7

%.o: %.cc Makefile
    $(CXX) $(CXXFLAGS) -c $<

我在这里添加了一些好的做法。如果您想要一个良好实践的摘要,请阅读&#34;十诫&#34;在我的回答中:makefile enforce library dependency ordering