Last active
July 26, 2021 10:30
-
-
Save BoYanZh/6ee60b76f0fc70389c9ac0988fd16885 to your computer and use it in GitHub Desktop.
Sample Makefile with JOJ-Submitter
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Modified from https://gist.github.com/maxtruxa/4b3929e118914ccef057f8a05c614b0f | |
# output binary | |
BIN := p4 | |
# source files | |
SRCS := \ | |
main.cpp | |
JOJ_URL := https://joj.sjtu.edu.cn/d/ve281_summer_2021_hongyi/homework/60ed8820597d590006d91e44/60ed869b597d590006d91dad | |
# files included in the tarball generated by 'make dist' (e.g. add LICENSE file) | |
DISTFILES := $(BIN) | |
# filename of the tar archive generated by 'make dist' | |
DISTOUTPUT := $(BIN).tar.gz | |
# filename of the tar archive generated by 'make src' | |
SRCOUTPUT := $(BIN)-src.tar.gz | |
# intermediate directory for generated object files | |
OBJDIR := .o | |
# intermediate directory for generated dependency files | |
DEPDIR := .d | |
# object files, auto generated from source files | |
OBJS := $(patsubst %,$(OBJDIR)/%.o,$(basename $(SRCS))) | |
# dependency files, auto generated from source files | |
DEPS := $(patsubst %,$(DEPDIR)/%.d,$(basename $(SRCS))) | |
# compilers (at least gcc and clang) don't create the subdirectories automatically | |
$(shell mkdir -p $(dir $(OBJS)) >/dev/null) | |
$(shell mkdir -p $(dir $(DEPS)) >/dev/null) | |
# C compiler | |
CC := clang | |
# C++ compiler | |
CXX := clang++ | |
# linker | |
LD := clang++ | |
# tar | |
TAR := tar | |
# C flags | |
CFLAGS := -std=c17 | |
# C++ flags | |
CXXFLAGS := -std=c++17 | |
# C/C++ flags | |
CPPFLAGS := -g -Wall -Werror -Wextra -Wpedantic -Wconversion -Wvla | |
# linker flags | |
LDFLAGS := | |
# linker flags: libraries to link (e.g. -lfoo) | |
LDLIBS := | |
# flags required for dependency generation; passed to compilers | |
DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.Td | |
# compile C source files | |
COMPILE.c = $(CC) $(DEPFLAGS) $(CFLAGS) $(CPPFLAGS) -c -o $@ | |
# compile C++ source files | |
COMPILE.cc = $(CXX) $(DEPFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -o $@ | |
# link object files to binary | |
LINK.o = $(LD) $(LDFLAGS) $(LDLIBS) -o $@ | |
# precompile step | |
PRECOMPILE = | |
# postcompile step | |
POSTCOMPILE = mv -f $(DEPDIR)/$*.Td $(DEPDIR)/$*.d | |
all: $(BIN) | |
run: $(BIN) | |
./$(BIN) | |
src: $(SRCS) | |
$(TAR) -cvzf $(SRCOUTPUT) $^ | |
joj: $(SRCS) | |
joj-submit $(JOJ_URL) $(SRCOUTPUT) cc | |
dist: $(DISTFILES) | |
$(TAR) -cvzf $(DISTOUTPUT) $^ | |
.PHONY: clean | |
clean: | |
$(RM) -r $(OBJDIR) $(DEPDIR) | |
.PHONY: srcclean | |
srcclean: clean | |
$(RM) $(BIN) $(SRCOUTPUT) | |
.PHONY: distclean | |
distclean: clean | |
$(RM) $(BIN) $(DISTOUTPUT) | |
.PHONY: install | |
install: | |
@echo no install tasks configured | |
.PHONY: uninstall | |
uninstall: | |
@echo no uninstall tasks configured | |
.PHONY: check | |
check: | |
@echo no tests configured | |
.PHONY: help | |
help: | |
@echo available targets: all run src dist clean srcclean distclean install uninstall check | |
$(BIN): $(OBJS) | |
$(LINK.o) $^ | |
$(OBJDIR)/%.o: %.c | |
$(OBJDIR)/%.o: %.c $(DEPDIR)/%.d | |
$(PRECOMPILE) | |
$(COMPILE.c) $< | |
$(POSTCOMPILE) | |
$(OBJDIR)/%.o: %.cpp | |
$(OBJDIR)/%.o: %.cpp $(DEPDIR)/%.d | |
$(PRECOMPILE) | |
$(COMPILE.cc) $< | |
$(POSTCOMPILE) | |
$(OBJDIR)/%.o: %.cc | |
$(OBJDIR)/%.o: %.cc $(DEPDIR)/%.d | |
$(PRECOMPILE) | |
$(COMPILE.cc) $< | |
$(POSTCOMPILE) | |
$(OBJDIR)/%.o: %.cxx | |
$(OBJDIR)/%.o: %.cxx $(DEPDIR)/%.d | |
$(PRECOMPILE) | |
$(COMPILE.cc) $< | |
$(POSTCOMPILE) | |
.PRECIOUS: $(DEPDIR)/%.d | |
$(DEPDIR)/%.d: ; | |
-include $(DEPS) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment