CXX = g++
BIN = bin
LIB = lib
LIB_NAME = autodiff
OBJS_GRADIENT_DESCENT = root/obj/node.o root/obj/graph.o examples/obj/gradient_descent.o
OBJS_ANN = root/obj/node.o root/obj/graph.o examples/obj/ann.o
OBJS_GRADIENT = root/obj/node.o root/obj/graph.o examples/obj/gradient.o
OBJS_SPEED = root/obj/node.o root/obj/graph.o examples/obj/speed.o
OBJS_SIMPLE = root/obj/node.o root/obj/graph.o examples/obj/simple.o

all : gradient_descent ann gradient speed simple

gradient_descent : $(BIN) root/include/vectmath.h root/include/mor.h root/include/dor.h root/include/por.h
  $(MAKE) -C examples obj obj/gradient_descent.o
  $(MAKE) -C root obj obj/node.o obj/graph.o
  $(CXX) -o $(BIN)/gradient_descent $(OBJS_GRADIENT_DESCENT) $(LIBS)

ann : $(BIN) root/include/vectmath.h root/include/mor.h root/include/dor.h root/include/por.h
  $(MAKE) -C examples obj obj/ann.o
  $(MAKE) -C root obj obj/node.o obj/graph.o
  $(CXX) -o $(BIN)/ann $(OBJS_ANN) $(LIBS)

gradient : $(BIN) root/include/vectmath.h root/include/mor.h root/include/dor.h root/include/por.h
  $(MAKE) -C examples obj obj/gradient.o
  $(MAKE) -C root obj obj/node.o obj/graph.o
  $(CXX) -o $(BIN)/gradient $(OBJS_GRADIENT) $(LIBS)

speed : $(BIN) root/include/vectmath.h root/include/mor.h root/include/dor.h root/include/por.h
  $(MAKE) -C examples obj obj/speed.o
  $(MAKE) -C root obj obj/node.o obj/graph.o
  $(CXX) -o $(BIN)/speed $(OBJS_SPEED) $(LIBS)

simple : $(BIN) root/include/mor.h root/include/dor.h root/include/por.h
  $(MAKE) -C examples obj obj/simple.o
  $(MAKE) -C root obj obj/node.o obj/graph.o
  $(CXX) -o $(BIN)/simple $(OBJS_SIMPLE) $(LIBS)

$(BIN) :
  if [ ! -d $(BIN) ]; then mkdir $(BIN); fi

$(LIB) :
  if [ ! -d $(LIB) ]; then mkdir $(LIB); fi

clean :
  $(MAKE) -C root clean
  $(MAKE) -C examples clean
  if [ -d $(BIN) ]; then rm $(BIN) -r; fi

install : $(LIB)
  ar rcs $(LIB)/lib$(LIB_NAME).a root/obj/graph.o root/obj/node.o
  if [ ! -d /usr/local/include/$(LIB_NAME) ]; then sudo mkdir /usr/local/include/$(LIB_NAME); fi
  sudo cp $(LIB)/lib$(LIB_NAME).a /usr/local/lib
  sudo cp root/include/*.h /usr/local/include/$(LIB_NAME)

.PHONY : all
.PHONY : gradient_descent
.PHONY : ann
.PHONY : gradient
.PHONY : speed
.PHONY : simple
.PHONY : clean
.PHONY : install

 

  • CXX 变量表示用于编译 C++ 代码的编译器命令(g++)。
  • BIN 变量表示生成的可执行文件的存放目录(bin)。
  • LIB 变量表示生成的库文件的存放目录(lib)。
  • LIB_NAME 变量表示生成的库文件的名称(autodiff)。
  • OBJS_GRADIENT_DESCENT、OBJS_ANN、OBJS_GRADIENT、OBJS_SPEED 和 OBJS_SIMPLE 这五个变量分别表示五个可执行文件所需的 .o 文件的集合。
  • all 目标是一个模式目标,依赖于五个其他目标(gradient_descent、ann、gradient、speed 和 simple)。
  • gradient_descent、ann、gradient、speed 和 simple 这五个目标分别用于生成五个可执行文件。每个目标都有一些前置条件,在这些条件满足时才会被执行。每个目标的执行过程都包括调用 命令来生成必要的文件,然后使用(MAKE)命令来生成必要的.o文件,然后使用(CXX) 命令来将 .o 文件链接成可执行文件。
  • $(BIN) 目标是一个伪目标,用于创建 BIN 变量所表示的目录。
  • $(LIB) 目标是一个伪目标,用于创建 LIB 变量所表示的目录。
  • clean 目标用于清除已生成的文件。它调用 $(MAKE) 命令清