-
-
Save ecnerwala/a3c6332ac626bc448165 to your computer and use it in GitHub Desktop.
| # +--------------------+ | |
| # | | | |
| # | GENERAL CONFIG | | |
| # | | | |
| # +--------------------+ | |
| PROBLEM_NAME := problem_name | |
| DEBUG := true | |
| LANG := cpp | |
| ifeq ($(LANG),cpp) | |
| TARGET := $(PROBLEM_NAME) | |
| EXECUTE := ./$(TARGET) | |
| CLEAN_TARGETS := $(TARGET) | |
| else ifeq ($(LANG),python) | |
| TARGET := $(PROBLEM_NAME).py | |
| EXECUTE := python3 ./$(TARGET) | |
| CLEAN_TARGETS := | |
| else | |
| $(error "Unknown language; please set TARGET, EXECUTE, and CLEAN_TARGETS manually") | |
| endif | |
| CXX := g++ | |
| CXXFLAGS := -std=c++17 -O2 -Wall -Wextra -pedantic -Wshadow -Wformat=2 -Wfloat-equal -Wconversion -Wlogical-op -Wshift-overflow=2 -Wduplicated-cond -Wcast-qual -Wcast-align -Wno-unused-result -Wno-sign-conversion | |
| DEBUG_CXXFLAGS := -fsanitize=address -fsanitize=undefined -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fno-sanitize-recover=all -fstack-protector-all -D_FORTIFY_SOURCE=2 | |
| DEBUG_CXXFLAGS += -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC | |
| PRECOMPILE_HEADERS := bits/stdc++.h | |
| #PRECOMPILE_HEADERS := bits/extc++.h | |
| # +-------------------+ | |
| # | | | |
| # | GENERAL RULES | | |
| # | | | |
| # +-------------------+ | |
| all: $(TARGET) | |
| .PHONY: all | |
| clean: | |
| -rm -rf $(CLEAN_TARGETS) | |
| .PHONY: clean | |
| veryclean: | |
| -rm -rf $(CLEAN_TARGETS) *.res | |
| .PHONY: veryclean | |
| rebuild: clean all | |
| .PHONY: rebuild | |
| # +---------------------+ | |
| # | | | |
| # | C++ COMPILATION | | |
| # | | | |
| # +---------------------+ | |
| ifeq ($(DEBUG),true) | |
| CXXFLAGS += $(DEBUG_CXXFLAGS) | |
| endif | |
| PCH := .precompiled_headers | |
| CLEAN_TARGETS += $(PCH) | |
| $(PCH)/%.gch: | |
| rm -f $@ | |
| mkdir -p $(dir $@) | |
| $(LINK.cpp) -x c++-header "$$(echo '#include<$*>' | $(LINK.cpp) -H -E -x c++ - 2>&1 >/dev/null | head -1 | cut -d ' ' -f2)" -o $@ | |
| .PRECIOUS: $(PCH)/%.gch | |
| %: %.cpp # Cancel the builtin rule | |
| %: %.cpp $(patsubst %,$(PCH)/%.gch,$(PRECOMPILE_HEADERS)) | |
| $(LINK.cpp) -isystem $(PCH) $< $(LOADLIBES) $(LDLIBS) -o $@ | |
| .PRECIOUS: % | |
| # +-----------------------+ | |
| # | | | |
| # | RUNNING / TESTING | | |
| # | | | |
| # +-----------------------+ | |
| export TIME=\n real\t%es\n user\t%Us\n sys\t%Ss\n mem\t%MKB | |
| run: $(TARGET) | |
| \time $(EXECUTE) | |
| ifeq ($(DEBUG),true) | |
| @echo "Built with DEBUG flags enabled, code may be slower than normal" | |
| endif | |
| .PHONY: run | |
| %.res: $(TARGET) %.in | |
| \time $(EXECUTE) < $*.in > $*.res | |
| ifeq ($(DEBUG),true) | |
| @echo "Built with DEBUG flags enabled, code may be slower than normal" | |
| endif | |
| .PRECIOUS: %.res | |
| %.out: % # Cancel the builtin rule | |
| __test_%: %.res %.out | |
| diff $*.res $*.out | |
| .PHONY: __test_% | |
| CASES := $(sort $(basename $(wildcard *.in))) | |
| TESTS := $(sort $(basename $(wildcard *.out))) | |
| runs: $(patsubst %,%.res,$(CASES)) | |
| .PHONY: run | |
| solve: runs | |
| .PHONY: solve | |
| test: $(patsubst %,__test_%,$(TESTS)) | |
| .PHONY: test |
Hi, I recently noticed that my codeforces directory was of 10GB, and that most of my contest subdirectories are ~100MB or more, because each of them has a .precompiled_headers directory. My guess is that this directory has been created as a result of compiling all my codes with this Makefile.
I am not very good at Makefiles, hence I wish to ask, what is the best way to fix this problem? Ideally, I would want to reuse a single ~/codeforces/.precompiled_headers directory in all my contest subdirectories (~/codeforces/1515/A/A.cpp file, for example).
Feel free to try to modify the makefile to use a shared header folder; it'll be a little tricky because make isn't designed for global systemwide stuff.
Personally, I just delete the precompiled header folder after contests (when compile time doesn't matter much anymore). I have a little script to automate that, you can do that too.
@ecnerwala Can you share the automation script too?
For future readers: if you're trying to integrate this Makefile with
make_prob.sh, linked above by @ecnerwala, you'll have to modify line 7 to read