automatic dependency generation
authorJonathan L Long <jonlong@cs.berkeley.edu>
Mon, 24 Nov 2014 21:37:06 +0000 (13:37 -0800)
committerJonathan L Long <jonlong@cs.berkeley.edu>
Mon, 29 Dec 2014 00:04:13 +0000 (16:04 -0800)
Makefile

index 54d5636..75619c0 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -30,8 +30,6 @@ DYNAMIC_NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).so
 ##############################
 # CXX_SRCS are the source files excluding the test ones.
 CXX_SRCS := $(shell find src/$(PROJECT) ! -name "test_*.cpp" -name "*.cpp")
-# HXX_SRCS are the header files
-HXX_SRCS := $(shell find include/$(PROJECT) ! -name "test_*.hpp" -name "*.hpp")
 # CU_SRCS are the cuda source files
 CU_SRCS := $(shell find src/$(PROJECT) ! -name "test_*.cu" -name "*.cu")
 # TEST_SRCS are the test source files
@@ -40,8 +38,6 @@ TEST_SRCS := $(shell find src/$(PROJECT) -name "test_*.cpp")
 TEST_SRCS := $(filter-out $(TEST_MAIN_SRC), $(TEST_SRCS))
 TEST_CU_SRCS := $(shell find src/$(PROJECT) -name "test_*.cu")
 GTEST_SRC := src/gtest/gtest-all.cpp
-# TEST_HXX_SRCS are the test header files
-TEST_HXX_SRCS := $(shell find include/$(PROJECT) -name "test_*.hpp")
 # TOOL_SRCS are the source files for the tool binaries
 TOOL_SRCS := $(shell find tools -name "*.cpp")
 # EXAMPLE_SRCS are the source files for the example binaries
@@ -90,7 +86,6 @@ PROTO_GEN_HEADER_SRCS := $(addprefix $(PROTO_BUILD_DIR)/, \
                $(notdir ${PROTO_SRCS:.proto=.pb.h}))
 PROTO_GEN_HEADER := $(addprefix $(PROTO_BUILD_INCLUDE_DIR)/, \
                $(notdir ${PROTO_SRCS:.proto=.pb.h}))
-HXX_SRCS += $(PROTO_GEN_HEADER)
 PROTO_GEN_CC := $(addprefix $(BUILD_DIR)/, ${PROTO_SRCS:.proto=.pb.cc})
 PY_PROTO_BUILD_DIR := python/$(PROJECT)/proto
 PY_PROTO_INIT := python/$(PROJECT)/proto/__init__.py
@@ -113,6 +108,9 @@ TEST_CU_OBJS := $(addprefix $(BUILD_DIR)/cuda/, ${TEST_CU_SRCS:.cu=.o})
 TEST_OBJS := $(TEST_CXX_OBJS) $(TEST_CU_OBJS)
 GTEST_OBJ := $(addprefix $(BUILD_DIR)/, ${GTEST_SRC:.cpp=.o})
 EXAMPLE_OBJS := $(addprefix $(BUILD_DIR)/, ${EXAMPLE_SRCS:.cpp=.o})
+# Output files for automatic dependency generation
+DEPS := ${CXX_OBJS:.o=.d} ${CU_OBJS:.o=.d} ${TEST_CXX_OBJS:.o=.d} \
+       ${TEST_CU_OBJS:.o=.d}
 # tool, example, and test bins
 TOOL_BINS := ${TOOL_OBJS:.o=.bin}
 EXAMPLE_BINS := ${EXAMPLE_OBJS:.o=.bin}
@@ -316,6 +314,9 @@ LIBRARY_DIRS += $(BLAS_LIB)
 
 LIBRARY_DIRS += $(LIB_BUILD_DIR)
 
+# Automatic dependency generation (nvcc is handled separately)
+CXXFLAGS += -MMD -MP
+
 # Complete build flags.
 COMMON_FLAGS += $(foreach includedir,$(INCLUDE_DIRS),-I$(includedir))
 CXXFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS)
@@ -464,7 +465,7 @@ $(STATIC_NAME): $(OBJS) | $(LIB_BUILD_DIR)
        ar rcs $@ $(OBJS)
        @ echo
 
-$(BUILD_DIR)/%.o: %.cpp $(HXX_SRCS) | $(ALL_BUILD_DIRS)
+$(BUILD_DIR)/%.o: %.cpp | $(ALL_BUILD_DIRS)
        $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \
                || (cat $@.$(WARNS_EXT); exit 1)
        @ cat $@.$(WARNS_EXT)
@@ -477,7 +478,9 @@ $(PROTO_BUILD_DIR)/%.pb.o: $(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_GEN_HEADER) \
        @ cat $@.$(WARNS_EXT)
        @ echo
 
-$(BUILD_DIR)/%.cuo: %.cu $(HXX_SRCS) | $(ALL_BUILD_DIRS)
+$(BUILD_DIR)/cuda/%.o: %.cu | $(ALL_BUILD_DIRS)
+       $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -M $< -o ${@:.o=.d} \
+               -odir $(@D)
        $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) \
                || (cat $@.$(WARNS_EXT); exit 1)
        @ cat $@.$(WARNS_EXT)
@@ -564,7 +567,7 @@ superclean: clean supercleanfiles
 
 $(DIST_ALIASES): $(DISTRIBUTE_DIR)
 
-$(DISTRIBUTE_DIR): all py $(HXX_SRCS) | $(DISTRIBUTE_SUBDIRS)
+$(DISTRIBUTE_DIR): all py | $(DISTRIBUTE_SUBDIRS)
        # add include
        cp -r include $(DISTRIBUTE_DIR)/
        mkdir -p $(DISTRIBUTE_DIR)/include/caffe/proto
@@ -577,3 +580,5 @@ $(DISTRIBUTE_DIR): all py $(HXX_SRCS) | $(DISTRIBUTE_SUBDIRS)
        cp $(DYNAMIC_NAME) $(DISTRIBUTE_DIR)/lib
        # add python - it's not the standard way, indeed...
        cp -r python $(DISTRIBUTE_DIR)/python
+
+-include $(DEPS)