我想编写一个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的情况下生成所有可执行文件?
答案 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