-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmakefile
More file actions
151 lines (125 loc) · 4.66 KB
/
makefile
File metadata and controls
151 lines (125 loc) · 4.66 KB
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
.PHONY: run
CXX=g++
GCC=gcc
CXXFLAG:=-std=c++20 -Wall
LINGC=-lgmp -lm
CFLAG:=-Wall
APP=./gsp
APPTEST:=./test/$(APP)_test
## Vemos si bash_version esta definida, si lo esta
## entonces compilamos para linux, sino para windows.
OS_SYSTEM:=$(if $(shell uname),$(shell uname),Windows)
SRC=./src
SRC_OPERATOR=$(SRC)/operators
INCLUDE=$(SRC)/header
BASE=./build
BIN_O=$(BASE)/obj
BIN_OPT=$(BIN_O)/operator
LOG_APP=$(BASE)/log
AUTO_DIRS=$(BASE) $(BIN_O) $(BIN_O)/operator $(BIN_O)/test $(LOG_APP) $(LOG_APP)/operator $(LOG_APP)/test
MAKE=make
#Main:
MAIN_O=$(BIN_O)/main.o
MAIN_SRC=$(SRC)/main.c
#*.c
C_FILES:= $(filter-out $(SRC)/main.c,$(foreach dir,$(SRC),$(wildcard $(dir)/*.c)))
C_OPERATOR:=$(SRC_OPERATOR)/operators.c
MAIN_OPT=$(BIN_OPT)/operators.o
C_OPERATORS:=$(wildcard $(SRC_OPERATOR)/**/*.c)
#*.o
O_OPERATOR:=$(foreach file,$(C_OPERATORS),$(BIN_OPT)/$(notdir $(file:.c=.o)))
O_FILES :=$(foreach file,$(C_FILES),$(BIN_O)/$(notdir $(file:.c=.o))) $(MAIN_OPT) $(O_OPERATOR)
#*.h
FILE_H:=$(foreach file,$(C_FILES),$(INCLUDE)/$(notdir $(file:.c=.h)))
# If anything is modified, all files will be affected.
ALL_DEPENDENCIES=$(INCLUDE)/define.h
# If windows then BIN_EXT=.exe
BIN_EXT=
SET_LOG=$(LOG_APP)/$(patsubst %.o,%,$(patsubst %.c,%,$(notdir $@))).log
SET_LOG_OPT=$(LOG_APP)/operator/$(patsubst %.o,%,$(patsubst %.c,%,$(notdir $@))).log
SHOW_LOG=|| ("$(VIEW_LOG)" "$(SET_LOG)" && exit 1)
SHOW_LOG_OPT=|| ("$(VIEW_LOG)" "$(SET_LOG_OPT)" && exit 1)
DELETE_FUNC=DELETE
# Mostrar los logs.
VIEW_LOG_C=./tools/view_log.c
VIEW_LOG=$(BIN_O)/view_log
DELETE_V_LOG_C=./tools/delete_void_logs.c
DELETE_V_LOG=$(BIN_O)/delete_void_logs
CLEAR_BUILD_C=./tools/clear_build.c
CLEAR_BUILD=$(BIN_O)/clear_build
ifeq ($(DEBUG),1)
CXXFLAG:=-D DEBUG $(CXXFLAG) -g
CFLAG:=-D DEBUG $(CFLAG) -g
O_FILES:=$(O_FILES) $(BIN_O)/memory.o
FILE_H:=$(FILE_H) ./test/header/memory.h
endif
ifeq ($(OS_SYSTEM),Windows)
APP:=$(APP).exe
BIN_EXT=.exe
MAKE=Mingw32-make
VIEW_LOG:=$(VIEW_LOG).exe
DELETE_V_LOG:=$(DELETE_V_LOG).exe
CLEAR_BUILD:=$(CLEAR_BUILD).exe
SET_LOG=$(LOG_APP)/$(patsubst %$(BIN_EXT),%,$(patsubst %.o,%,$(patsubst %.c,%,$(notdir $@)))).log
SHOW_LOG=|| ("$(VIEW_LOG)" "$(SET_LOG)" && exit /b 1)
# Es necesario para mkdir de windows:
AUTO_DIRS:=$(subst $e/,\,$(AUTO_DIRS))
WIN_START=@start
endif
ifneq ($(TEST),1)
all: $(BIN_O) $(LOG_APP) $(VIEW_LOG) $(DELETE_V_LOG) $(CLEAR_BUILD) $(APP)
else
all: $(BIN_O) $(LOG_APP) $(VIEW_LOG) $(DELETE_V_LOG) $(CLEAR_BUILD) $(APPTEST) $(STACK_TEST)
CXXFLAG:=$(CXXFLAG) -g "-D TEST_=1" "-D __MAIN__=1" -static-libgcc -static-libstdc++ -ggdb
CFLAG:=$(CFLAG) -g "-D TEST_=1" "-D __MAIN__=1" -static-libgcc -static-libstdc++ -ggdb
BIN_O:=$(BIN_O)/test
LOG_APP:=$(LOG_APP)/test
O_FILES :=$(foreach file,$(C_FILES),$(BIN_O)/$(notdir $(file:.c=.o)))
STACK_TEST=stack.exe
include ./test/makefile.mk
endif
$(BIN_O):
-@mkdir $(AUTO_DIRS)
$(LOG_APP):
-@mkdir $(AUTO_DIRS)
$(VIEW_LOG): $(VIEW_LOG_C)
@echo Compilando herramienta de logs...
@$(GCC) -g -o $(VIEW_LOG) $(VIEW_LOG_C) 2>$(SET_LOG)
$(DELETE_V_LOG): $(DELETE_V_LOG_C) $(VIEW_LOG_C)
@echo Compilando herramienta para limpiar logs...
@$(GCC) -g -o $(DELETE_V_LOG) $(DELETE_V_LOG_C) 2>$(SET_LOG)
$(CLEAR_BUILD): $(CLEAR_BUILD_C) $(VIEW_LOG_C)
@echo Compilando herramienta para limpiar logs...
@$(GCC) -g -o $(CLEAR_BUILD) $(CLEAR_BUILD_C) 2>$(SET_LOG)
$(APP): $(O_FILES) $(MAIN_O)
@echo Uniendo los archivos compilados en "$(APP)"...
@$(GCC) $(CFLAG) $(MAIN_O) $(O_FILES) -o $(APP) $(LINGC) 2>$(SET_LOG) $(SHOW_LOG)
@$(DELETE_V_LOG) $(SET_LOG)
$(MAIN_O): $(MAIN_SRC) $(FILE_H)
@echo "Compilando el archivo objeto de main."
@$(GCC) -c $(CFLAG) $< -o $@ 2>$(SET_LOG) $(SHOW_LOG)
@$(DELETE_V_LOG) $(SET_LOG)
$(BIN_O)/%.o: $(SRC)/%.c $(ALL_DEPENDENCIES)
@echo Compilando el archivo objeto de $<...
@$(GCC) -c $(CFLAG) $< -o $@ $(LINGC) 2>$(SET_LOG) $(SHOW_LOG)
@$(DELETE_V_LOG) $(SET_LOG)
$(MAIN_OPT): $(C_OPERATOR) $(ALL_DEPENDENCIES)
@echo Compilando el operador principal: $<...
@$(GCC) -c $(CFLAG) $(C_OPERATOR) -o $(MAIN_OPT) $(LINGC) 2>$(SET_LOG_OPT) $(SHOW_LOG_OPT)
@$(DELETE_V_LOG) $(SET_LOG_OPT)
# Solo funciona en linux
include ./src/operators/makefile.mk
$(BIN_O)/memory.o:./test/memory.c
@$(GCC) -c $(CFLAG) $< -o $@ $(LINGC) -DMAIN=1 2>$(SET_LOG) $(SHOW_LOG)
@$(DELETE_V_LOG) $(SET_LOG)
clean: $(CLEAR_BUILD)
@echo "Eliminando archivos..."
$(WIN_START)$(CLEAR_BUILD) "$(LOG_APP)" "$(LOG_APP)/test"
$(WIN_START)$(CLEAR_BUILD) "$(BIN_O)" "$(BIN_O)/test" "$(BIN_OPT)"
$(WIN_START)$(CLEAR_BUILD) "$(APP)"
gdb:
@echo Abriendo GDB
@gdb $(APP)
run:
@echo Ejecutando $(APP)
@$(APP)