ソースファイル、実行ファイルのディレクトリを指定したmakefileを書く

ゴールデンウィーク誤差逆伝播法のコーディングに捧げたんですが、今もコーディングを続けてます。

https://github.com/crakaC/back_propagation

それで、今までmakefileはソースファイルと同じディレクトリに突っ込んでたけど、SublimeTextでmakeするときうまく行かなかった。
srcディレクトリを開けばSublimeTextからmakeできるんだけど、それだと.gitignoreとかREADME.mdを編集できないので、プロジェクトのルートにmakefileを移して、色々参考にして書き直した。

CC=g++
CFLAGS=-Wall -O3
.SUFFIXES = .cpp
SRC_DIR = src
BUILD_DIR = bin
SRCS:=$(wildcard $(SRC_DIR)/*.cpp)
OBJS:=$(SRCS:.cpp=.o)
TARGET = backpropagation

.PHONY: all clean

all: $(BUILD_DIR) $(patsubst %,$(BUILD_DIR)/%,$(TARGET))

$(BUILD_DIR):
	mkdir $(BUILD_DIR)

$(BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp
	$(CC) -c $(CFLAGS) -o $@ $&^;

$(BUILD_DIR)/$(TARGET): $(patsubst $(SRC_DIR)/%,$(BUILD_DIR)/%,$(OBJS))
	$(CC) $(CFLAGS) -o $@ $^

clean:
	$(RM) -r $(BUILD_DIR)

#依存関係(5/15再編集)
$(BUILD_DIR)/mylib.o: $(patsubst $(SRC_DIR)/%,$(BUILD_DIR)/%, mylib.hpp struct.hpp Net.hpp)
$(BUILD_DIR)/Net.o: $(patsubst $(SRC_DIR)/%,$(BUILD_DIR)/%, Net.hpp struct.hpp)
$(BUILD_DIR)/Net_setter_and_getter.o: $(patsubst $(SRC_DIR)/%, $(BUILD_DIR)/%, Net.hpp struct.hpp )
$(BUILD_DIR)/struct.o: $(patsubst $(SRC_DIR)/%,$(BUILD_DIR)/%, struct.hpp)

今時makefile書いてmakeするくらいだったらVisualStudioでさくっと作れよって話。
でもSublimeText軽いし便利だしXubuntuならgitでバージョン管理も楽だし便利だしなかなかむずい。

参考