-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
105 lines (76 loc) · 3.15 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
PROJECT_NAME = $(shell basename $(CURDIR))
CC_BUILD = g++
SRC_EXTN = cpp
CC_FLAGS = -c -Wall -std=c++11 \
-Wno-char-subscripts \
-Wno-deprecated-declarations \
-Iinclude -I/usr/local/include -O3
LD_FLAGS = -L/usr/local/lib -lglut -framework OpenGL -lm -lGLEW
rwildcard = $(wildcard $1$2) $(foreach d, $(wildcard $1*), $(call rwildcard,$d/,$2))
SRC_FILES = $(call rwildcard,src/,*.$(SRC_EXTN))
OBJ_FILES = $(addprefix .bin/,$(SRC_FILES:.$(SRC_EXTN)=.o))
all: header $(SRC_FILES) $(PROJECT_NAME)
LIBRARY= lib$(PROJECT_NAME).a
EXECUTABLE= $(PROJECT_NAME)
$(PROJECT_NAME): $(OBJ_FILES)
@echo "[link]"
@$(CC_BUILD) $(OBJ_FILES) $(LD_FLAGS) -o $@
@echo "[done] $(EXECUTABLE): Compilation finished!"
$(OBJ_FILES): $(SRC_FILES)
@echo "[make] $(subst .bin/,,$*.$(SRC_EXTN)) -> $@"
@mkdir -p $(dir $@)
@$(CC_BUILD) $(CC_FLAGS) $(subst .bin/,,$*.$(SRC_EXTN)) -o $@
lib:
ar rcs $(LIBRARY) $(OBJ_FILES)
@echo "[make] $(LIBRARY): Compilation finished!"
clean:
@echo "[make] clean: Deleting object files"
@rm -r .bin/*
@echo "[make] clean: Deleting builds"
@rm -f $(EXECUTABLE)
rebuild: clean all
destroy:
@rm -f $(EXECUTABLE)
@rm -rf .bin/ include/ .proj/ src/
project:
@mkdir -p .proj
@touch .proj/$(PROJECT_NAME).sublime-project
@echo "{\n\t\"folders\":\n\t[\n\t\t{\"path\": \"$(CURDIR)\"\n\t\t,\"file_exclude_patterns\": [\"$(PROJECT_NAME)\"],\"folder_exclude_patterns\": [\".proj\", \".bin\"]\n\t\t}\n\t]\n}" > .proj/$(PROJECT_NAME).sublime-project
dummy:
@echo "[make] creating template main.cpp"
@mkdir src
@touch src/main.cpp
@echo "#include <iostream>\n\nint main(int argc, char** argv)\n{\n\tstd::cout << \"Hello World!\";\n\tstd::cout << std::endl;\n}\n" > src/main.cpp
create: header project dummy
@echo "[make] creating project folders."
@mkdir .bin
@mkdir include
@echo "[done] $(PROJECT_NAME) project ready! use 'make sublime' to open project."
sublime:
@open /Applications/Sublime\ Text\ 2.app .proj/$(PROJECT_NAME).sublime-project
run: all
@clear
@./$(PROJECT_NAME)
info:
@echo ""
@echo "Project Information ($(PROJECT_NAME))"
@echo "--------------------------------------------------"
@echo ""
@echo "Lines of Code: $(shell wc -l `find include -name '*.h' -print && find src -name '*.cpp' -print` | grep total)"
@echo ""
@wc -l `find include -name '*.h' -print && find src -name '*.cpp' -print` | sort --reverse | grep -v total
header:
@echo "--------------------------------------------------------------------------------"
@echo "\n\n\n\n\n\n\n\n\n\n\n"
@echo " MAKE"
@echo " Project : $(PROJECT_NAME)"
@echo " Author : Denis Coady"
@echo ""
@echo " Location : $(shell pwd)"
@echo "\n\n\n\n\n\n\n\n\n\n\n"
@echo "--------------------------------------------------------------------------------"
class:
@touch include/$(name).h
@touch src/$(name).cpp
@echo "#ifndef INCLUDE_$(shell echo $(name) | tr a-z A-Z)_H\n#define INCLUDE_$(shell echo $(name) | tr a-z A-Z)_H\n\nclass $(name) {\n\tprivate:\n\n\tpublic:\n\t\t$(name) ();\n\t\t~$(name) ();\n};\n\n\n#endif" > include/$(name).h
@echo "#include <$(name).h>\n\n$(name)::$(name) ()\n{\n}\n\n$(name)::~$(name) ()\n{\n}" > src/$(name).cpp