diff --git a/Makefile b/Makefile index 844d085..fbee9ab 100644 --- a/Makefile +++ b/Makefile @@ -1,41 +1,76 @@ -# Declaration of variables -C = clang -COMMON_FLAGS = -Wall -MMD -C_FLAGS = $(COMMON_FLAGS) -CC = clang++ -CC_FLAGS = $(COMMON_FLAGS) -std=c++17 # -funsafe-math-optimizations -LD_FLAGS = -INCLUDES = +CXX ?= g++ -# File names -EXEC = run -CSOURCES = $(wildcard *.c) -COBJECTS = $(CSOURCES:.c=.o) -SOURCES = $(wildcard *.cpp) -OBJECTS = $(SOURCES:.cpp=.o) +# path # +SRC_PATH = src +BUILD_PATH = build +BIN_PATH = $(BUILD_PATH)/bin -# Main target -$(EXEC): $(COBJECTS) $(OBJECTS) - $(CC) $(COBJECTS) $(OBJECTS) -o $(EXEC) $(LD_FLAGS) +# executable # +BIN_NAME = CppQuickStart -# To obtain C++ object files -%.o: %.cpp - $(CC) $(INCLUDES) $(CC_FLAGS) -o $@ -c $< +# extensions # +SRC_EXT = cpp -# To obtain C object files -%.o: %.c - $(C) $(INCLUDES) $(C_FLAGS) -o $@ -c $< +# code lists # +# Find all source files in the source directory, sorted by +# most recently modified +SOURCES = $(shell find $(SRC_PATH) -name '*.$(SRC_EXT)' | sort -k 1nr | cut -f2-) +# Set the object file names, with the source directory stripped +# from the path, and the build path prepended in its place +OBJECTS = $(SOURCES:$(SRC_PATH)/%.$(SRC_EXT)=$(BUILD_PATH)/%.o) +# Set the dependency files that will be used to add header dependencies +DEPS = $(OBJECTS:.o=.d) --include $(SOURCES:%.cpp=%.d) --include $(CSOURCES:%.c=%.d) +# flags # +COMPILE_FLAGS = -std=c++17 -Wall -Wextra -g # -O3 -funsafe-math-optimizations +INCLUDES = -I include/ -I /usr/local/include +# Space-separated pkg-config libraries used by this project +LIBS = -# To generate the documentation +.PHONY: default_target +default_target: release + +.PHONY: release +release: export CXXFLAGS := $(CXXFLAGS) $(COMPILE_FLAGS) +release: dirs + @$(MAKE) all + +.PHONY: dirs +dirs: + @echo "Creating directories" + @mkdir -p $(dir $(OBJECTS)) + @mkdir -p $(BIN_PATH) + +.PHONY: clean +clean: + @echo "Deleting $(BIN_NAME) symlink" + @$(RM) $(BIN_NAME) + @echo "Deleting directories" + @$(RM) -r $(BUILD_PATH) + @$(RM) -r $(BIN_PATH) + +# checks the executable and symlinks to the output +.PHONY: all +all: $(BIN_PATH)/$(BIN_NAME) + @echo "Making symlink: $(BIN_NAME) -> $<" + @$(RM) $(BIN_NAME) + @ln -s $(BIN_PATH)/$(BIN_NAME) $(BIN_NAME) + +.PHONY: doc doc: doxygen Doxyfile -# To remove generated files -clean: - rm -f $(COBJECTS) $(OBJECTS) $(SOURCES:%.cpp=%.d) $(CSOURCES:%.c=%.d) +# Creation of the executable +$(BIN_PATH)/$(BIN_NAME): $(OBJECTS) + @echo "Linking: $@" + $(CXX) $(OBJECTS) -o $@ ${LIBS} -cleaner: clean - rm -f $(EXEC) +# Add dependency files, if they exist +-include $(DEPS) + +# Source file rules +# After the first compilation they will be joined with the rules from the +# dependency files to provide header dependencies +$(BUILD_PATH)/%.o: $(SRC_PATH)/%.$(SRC_EXT) + @echo "Compiling: $< -> $@" + $(CXX) $(CXXFLAGS) $(INCLUDES) -MP -MMD -c $< -o $@ diff --git a/TestClass.hpp b/include/TestClass.hpp similarity index 100% rename from TestClass.hpp rename to include/TestClass.hpp diff --git a/test_c_lib.h b/include/test_c_lib.h similarity index 100% rename from test_c_lib.h rename to include/test_c_lib.h diff --git a/utils.hpp b/include/utils.hpp similarity index 100% rename from utils.hpp rename to include/utils.hpp diff --git a/TestClass.cpp b/src/TestClass.cpp similarity index 100% rename from TestClass.cpp rename to src/TestClass.cpp diff --git a/main.cpp b/src/main.cpp similarity index 100% rename from main.cpp rename to src/main.cpp diff --git a/test_c_lib.c b/src/test_c_lib.c similarity index 100% rename from test_c_lib.c rename to src/test_c_lib.c