-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
178 lines (133 loc) · 3.88 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
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# Makefile de ejemplo para C++
#
# Creado: jue abr 15 15:34:19 ART 2004
#
# Copyleft 2004 - Leandro Lucarella, Bajo licencia GPL [http://www.gnu.org/]
#
# CONFIGURACION
################
# Nombre del ejecutable.
target = tp02
# Extensión de los archivos a compilar (c para C, cpp o cc o cxx para C++).
extension = cpp
# Archivos con el código fuente que componen el ejecutable. Si no se especifica,
# toma todos los archivos con la extensión mencionada. Para especificar hay que
# descomentar la línea (quitarle el '#' del principio).
# NOTA: No poner cabeceras (.h).
#fuentes = entrada.cpp
# Si usa funciones de math.h, descomentá (quitale el '#' a) la siguiente línea.
#math = si
# Si usa pthreads, descomentá (quitale el '#' a) la siguiente línea.
pthreads = si
# Si usa gthreads, descomentá (quitale el '#' a) la siguiente línea.
#gthreads = si
# Si es un programa GTK+, descomentá (quitale el '#' a) la siguiente línea.
#gtk = si
# Si es un programa gtkmm, descomentá (quitale el '#' a) la siguiente línea.
#gtkmm = si
# Descomentar si se quiere ver como se invoca al compilador
#verbose = si
# Descomentar si se quiere linkear con ImageMagick
magick = si
# Descomentar para depurar iteradores de STL.
#debug_stl = si
# CONFIGURACION "AVANZADA"
###########################
# Opciones para el compilador C/C++ en modo ansi.
CFLAGS = -Wall -I.
# Para que explote lo mas posible
CFLAGS += -O2 -DNDEBUG -fno-gcse
# Para valgrind o debug
#CFLAGS += -ggdb -DDEBUG -fno-inline -O0
# Opciones del enlazador.
#LDFLAGS =
# Estandar de C a usar
CSTD = c99
# Estandar de C++ a usar
CXXSTD = c++98
# Si se quiere compilar estaticamente, descomentar la siguiente linea
#static = si
# VARIABLES CALCULADAS A PARTIR DE LA CONFIGURACION
####################################################
ifdef debug_stl
CFLAGS += -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC
endif
# Agrego flags y libs de ImageMagick
ifdef magick
CFLAGS += $(shell Magick++-config --cppflags)
LDFLAGS += $(shell Magick++-config --ldflags --libs)
CFLAGS += -Wno-long-long
endif
# Agrego flags y libs de GTK+ de ser necesario.
ifdef gtk
CFLAGS += $(shell pkg-config --cflags gtk+-2.0)
LDFLAGS += $(shell pkg-config --libs gtk+-2.0)
endif
# Agrego flags y libs de GTK+ de ser necesario.
ifdef gtkmm
CFLAGS += $(shell pkg-config --cflags gtkmm-2.4)
LDFLAGS += $(shell pkg-config --libs gtkmm-2.4)
endif
# Agrego flags y libs de gthreads de ser necesario.
ifdef gthreads
CFLAGS += $(shell pkg-config --cflags gthread-2.0)
LDFLAGS += $(shell pkg-config --libs gthread-2.0)
endif
# Linkeo con libm de ser necesario.
ifdef math
LDFLAGS += -lm
endif
# Linkeo con pthreads de ser necesario.
ifdef pthreads
LDFLAGS += -lpthread -pthread
endif
ifdef static
LDFLAGS += -static
endif
# Pongo flags de C para C++ también
CXXFLAGS += $(CFLAGS)
# Uso enlazador de c++ si es código no C.
ifeq ($(extension), c)
CFLAGS += -std=$(CSTD)
LD = $(CC)
else
CXXFLAGS += -std=$(CXXSTD)
LD = $(CXX)
endif
# Si no especifica archivos, tomo todos.
fuentes ?= $(wildcard *.$(extension)) $(wildcard lz/*.$(extension))
occ := $(CC)
ocxx := $(CXX)
orm := $(RM)
old := $(LD)
ifdef verbose
RM := $(RM) -v
else
CC = @echo " CC $@"; $(occ)
CXX = @echo " CXX $@"; $(ocxx)
RM = @echo " CLEAN"; $(orm)
LD = @echo " LD $@"; $(old)
endif
# REGLAS
#########
.PHONY: all clean
all: $(target)
o_files = $(patsubst %.$(extension),%.o,$(fuentes))
%.deps: %.$(extension)
@set -e; rm -f $@; \
$(old) -MM -MG -MP $(CXXFLAGS) $(CFLAGS) $< -MF $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
-include $(o_files:.o=.deps)
$(target): $(o_files)
@if [ -z "$(o_files)" ]; \
then \
echo "No hay archivos de entrada, recuerde que la extensión debe ser '.$(extension)'."; \
false; \
fi >&2
$(LD) $(LDFLAGS) $(o_files) $(LOADLIBS) $(LDLIBS) -o $(target)
clean:
$(RM) $(o_files) $(o_files:.o=.deps) $(target)
info:
echo $(o_files); \
echo $(o_files:.o=.deps);