diff --git a/Makefile b/Makefile index c8b25d935bf..74e4a944bc3 100644 --- a/Makefile +++ b/Makefile @@ -62,6 +62,9 @@ NONGEN_CXX_SRCS := $(shell find \ examples \ tools \ -name "*.cpp" -or -name "*.hpp" -or -name "*.cu" -or -name "*.cuh") +LINT_OUTPUT_DIR := $(BUILD_DIR)/lint +LINT_EXT := lint.txt +LINT_OUTPUTS := $(addsuffix .$(LINT_EXT), $(addprefix $(LINT_OUTPUT_DIR)/, ${NONGEN_CXX_SRCS})) LINT_REPORT := $(BUILD_DIR)/cpp_lint.log FAILED_LINT_REPORT := $(BUILD_DIR)/cpp_lint.error_log # PY$(PROJECT)_SRC is the python wrapper for $(PROJECT) @@ -123,6 +126,22 @@ TEST_CXX_BINS := $(addsuffix .testbin,$(addprefix $(TEST_BIN_DIR)/, \ TEST_BINS := $(TEST_CXX_BINS) $(TEST_CU_BINS) TEST_ALL_BIN := $(TEST_BIN_DIR)/test_all.testbin +############################## +# Derive compiler warning dump locations +############################## +WARNS_EXT := warnings.txt +CXX_WARNS := $(addprefix $(BUILD_DIR)/, ${CXX_SRCS:.cpp=.o.${WARNS_EXT}}) +CU_WARNS := $(addprefix $(BUILD_DIR)/, ${CU_SRCS:.cu=.cuo.${WARNS_EXT}}) +TOOL_WARNS := $(addprefix $(BUILD_DIR)/, ${TOOL_SRCS:.cpp=.o.${WARNS_EXT}}) +EXAMPLE_WARNS := $(addprefix $(BUILD_DIR)/, ${EXAMPLE_SRCS:.cpp=.o.${WARNS_EXT}}) +TEST_WARNS := $(addprefix $(BUILD_DIR)/, ${TEST_SRCS:.cpp=.o.${WARNS_EXT}}) +TEST_CU_WARNS := $(addprefix $(BUILD_DIR)/, ${TEST_CU_SRCS:.cu=.cuo.${WARNS_EXT}}) +ALL_CXX_WARNS := $(CXX_WARNS) $(TOOL_WARNS) $(EXAMPLE_WARNS) $(TEST_WARNS) +ALL_CU_WARNS := $(CU_WARNS) $(TEST_CU_WARNS) +ALL_WARNS := $(ALL_CXX_WARNS) $(ALL_CU_WARNS) + +ALL_WARNS_FILENAME := $(BUILD_DIR)/$(WARNS_EXT) + ############################## # Derive include and lib directories ############################## @@ -157,6 +176,7 @@ ALL_BUILD_DIRS := $(sort \ $(LAYER_BUILD_DIR) $(UTIL_BUILD_DIR) $(TOOL_BUILD_DIR) \ $(TEST_BUILD_DIR) $(TEST_BIN_DIR) $(GTEST_BUILD_DIR) \ $(EXAMPLE_BUILD_DIRS) \ + $(LINT_OUTPUT_DIR) \ $(PROTO_BUILD_DIR) $(PROTO_BUILD_INCLUDE_DIR) $(PY_PROTO_BUILD_DIR) \ $(DISTRIBUTE_SUBDIRS)) @@ -262,7 +282,7 @@ SUPERCLEAN_EXTS := .so .a .o .bin .testbin .pb.cc .pb.h _pb2.py .cuo ############################## .PHONY: all test clean linecount lint tools examples $(DIST_ALIASES) \ py mat py$(PROJECT) mat$(PROJECT) proto runtest \ - superclean supercleanlist supercleanfiles + superclean supercleanlist supercleanfiles warn all: $(NAME) $(STATIC_NAME) tools examples @@ -271,13 +291,22 @@ linecount: lint: $(LINT_REPORT) -$(LINT_REPORT): $(NONGEN_CXX_SRCS) | $(BUILD_DIR) - @ (python ./scripts/cpp_lint.py $(NONGEN_CXX_SRCS) > $(LINT_REPORT) 2>&1 \ - && ($(RM) $(FAILED_LINT_REPORT); echo "No lint errors!")) || ( \ - mv $(LINT_REPORT) $(FAILED_LINT_REPORT); \ - grep -v "^Done processing " $(FAILED_LINT_REPORT); \ - echo "Found 1 or more lint errors; see log at $(FAILED_LINT_REPORT)"; \ - exit 1) +$(LINT_REPORT): $(LINT_OUTPUTS) + @ cat $(LINT_OUTPUTS) > $@ + @ if [ -s "$@" ]; then \ + cat $@; mv $@ $(FAILED_LINT_REPORT); \ + else \ + echo "No lint errors!"; \ + fi + +$(LINT_OUTPUTS): $(LINT_OUTPUT_DIR)/%.lint.txt : % | $(LINT_OUTPUT_DIR) + @ mkdir -p $(dir $@) + @ python ./scripts/cpp_lint.py $< 2>&1 \ + | grep -v "^Done processing " \ + | grep -v "^Total errors found: 0" \ + > $@ \ + || true + @ if [ -s "$@" ]; then touch $<; cat $@; fi test: $(TEST_ALL_BIN) $(TEST_BINS) @@ -312,6 +341,23 @@ $(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(STATIC_NAME) runtest: $(TEST_ALL_BIN) $(TEST_ALL_BIN) $(TEST_GPUID) --gtest_shuffle +warn: $(ALL_WARNS_FILENAME) + +$(ALL_WARNS_FILENAME): $(ALL_WARNS) | $(BUILD_DIR) + @ touch $(ALL_WARNS) + @ cat $(ALL_WARNS) > $@ + @ # If the concatenated warning file is non-empty, touch all dependencies + @ # so that "make warn" always prints the error list and only says + @ # "nothing to be done" when there are no warnings. + @ if [ -s "$@" ]; then touch $(ALL_WARNS); else echo "No compiler warnings!"; fi + @ cat $@ + +$(ALL_CXX_WARNS): %.o.${WARNS_EXT} : %.o + @ cat $@ + +$(ALL_CU_WARNS): %.cuo.${WARNS_EXT} : %.cuo + @ cat $@ + $(BUILD_DIR_LINK): $(BUILD_DIR)/.linked # Create a target ".linked" in this BUILD_DIR to tell Make that the "build" link @@ -337,12 +383,14 @@ $(STATIC_NAME): $(PROTO_OBJS) $(OBJS) | $(LIB_BUILD_DIR) $(TEST_BUILD_DIR)/%.o: src/$(PROJECT)/test/%.cpp $(HXX_SRCS) $(TEST_HDRS) \ | $(TEST_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(TEST_BUILD_DIR)/%.cuo: src/$(PROJECT)/test/%.cu $(HXX_SRCS) $(TEST_HDRS) \ | $(TEST_BUILD_DIR) - $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ + $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(TEST_ALL_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_NAME) \ @@ -373,42 +421,51 @@ $(EXAMPLE_BINS): %.bin : %.o $(STATIC_NAME) $(LAYER_BUILD_DIR)/%.o: src/$(PROJECT)/layers/%.cpp $(HXX_SRCS) \ | $(LAYER_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(PROTO_BUILD_DIR)/%.pb.o: $(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_GEN_HEADER) \ | $(PROTO_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(UTIL_BUILD_DIR)/%.o: src/$(PROJECT)/util/%.cpp $(HXX_SRCS) | $(UTIL_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(GTEST_OBJ): $(GTEST_SRC) | $(GTEST_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(LAYER_BUILD_DIR)/%.cuo: src/$(PROJECT)/layers/%.cu $(HXX_SRCS) \ | $(LAYER_BUILD_DIR) - $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ + $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(UTIL_BUILD_DIR)/%.cuo: src/$(PROJECT)/util/%.cu | $(UTIL_BUILD_DIR) - $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ + $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(TOOL_BUILD_DIR)/%.o: tools/%.cpp $(PROTO_GEN_HEADER) | $(TOOL_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(EXAMPLE_BUILD_DIR)/%.o: examples/%.cpp $(PROTO_GEN_HEADER) \ | $(EXAMPLE_BUILD_DIRS) - $(CXX) $< $(CXXFLAGS) -c -o $@ + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(BUILD_DIR)/src/$(PROJECT)/%.o: src/$(PROJECT)/%.cpp $(HXX_SRCS) - $(CXX) $< $(CXXFLAGS) -c -o $@ + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo proto: $(PROTO_GEN_CC) $(PROTO_GEN_HEADER)