-
Notifications
You must be signed in to change notification settings - Fork 9
/
Makefile
177 lines (151 loc) · 4.97 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
# Source files
SRC := \
src/app \
src/backdrop \
src/camera \
src/draw \
src/icosphere \
src/instance \
src/loader \
src/log \
src/mat \
src/model \
src/shader \
src/shaded \
src/theme \
src/version \
src/vset \
src/window \
src/wireframe \
src/worker \
vendor/glew/glew \
# end of source files
################################################################################
# Generated files
# (listed separately so that 'make clean' deletes them)
VERSION_FILE := src/version.c
LOG_ALIGN_FILE := inc/log_align.h
GEN := $(VERSION_FILE) $(LOG_ALIGN_FILE)
################################################################################
# File generation for version and log alignment
GIT_REV := $(shell git log --pretty=format:'%h' -n 1)
GIT_DIFF := $(shell git diff --quiet --exit-code || echo +)
GIT_TAG := $(shell git describe --exact-match --tags 2> /dev/null || echo "")
GIT_BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
VERSION := const char* GIT_REV="$(GIT_REV)$(GIT_DIFF)";\
const char* GIT_TAG="$(GIT_TAG)";\
const char* GIT_BRANCH="$(GIT_BRANCH)";
PREV_VERSION := $(shell cat $(VERSION_FILE) 2> /dev/null || echo "")
ifneq ($(VERSION), $(PREV_VERSION))
# Hilarious string escaping shenanigans
VERSION := $(subst =,=\",$(VERSION))
VERSION := $(subst ;,\";,$(VERSION))
$(shell echo "$(VERSION)" > $(VERSION_FILE))
endif
LONGEST=$(shell wc -l src/*.c|grep -v total|sed "s/ //g"|awk '{print length}'|sort|tail -1)
LOG_ALIGN=\#define LOG_ALIGN (1 + $(LONGEST))
PREV_LOG_ALIGN := $(shell cat $(LOG_ALIGN_FILE) 2> /dev/null || echo "")
ifneq ($(LOG_ALIGN), $(PREV_LOG_ALIGN))
$(shell echo "$(LOG_ALIGN)" > $(LOG_ALIGN_FILE))
endif
################################################################################
# Platform detection
ifndef TARGET
UNAME := $(shell uname)
ifeq ($(UNAME), Darwin)
TARGET := darwin
else ifeq ($(UNAME), Linux)
TARGET := linux
endif
endif
CFLAGS := -Wall -Werror -g -O3 -pedantic -Iinc -Ivendor -Ivendor/glfw/include -Ivendor/glew
LDFLAGS = -Lvendor/glfw/build-$(TARGET)/src -lglfw3
# Build with Clang's undefined behavior sanitizer:
# make clean; env UBSAN=1 make
ifeq ($(UBSAN),1)
CFLAGS += -fsanitize=undefined
LDFLAGS += -lstdc++ -lc++abi
endif
# Build with Clang's address sanitizer:
# make clean; env ASAN=1 make
ifeq ($(ASAN),1)
CFLAGS += -fsanitize=address
endif
ifeq ($(TARGET), linux)
SRC += platform/linux platform/posix
LDFLAGS = -lglfw -lGL -lpthread -lm
PLATFORM := -DPLATFORM_LINUX
endif
ifeq ($(TARGET), darwin)
SRC += platform/darwin platform/posix
LDFLAGS := -framework Foundation \
-framework Cocoa \
-framework IOKit \
-framework CoreVideo \
-framework OpenGL \
-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk \
-dead_strip \
$(LDFLAGS)
PLATFORM := -DPLATFORM_DARWIN
endif
ifeq ($(TARGET), win32-cross)
CC := x86_64-w64-mingw32-gcc
SRC += platform/win32
CFLAGS += -mwindows -DGLEW_STATIC
PLATFORM := -DPLATFORM_WIN32
LDFLAGS += -lopengl32
ERIZO_APP := erizo.exe
ERIZO_TEST := erizo-test.exe
else
ERIZO_APP := erizo
ERIZO_TEST := erizo-test
endif
################################################################################
BUILD_DIR := build-$(TARGET)
all: $(GEN) $(ERIZO_APP) $(ERIZO_TEST)
OBJ := $(addprefix $(BUILD_DIR)/,$(SRC:=.o))
DEP := $(OBJ:.o=.d)
ifeq ($(TARGET), win32-cross)
$(BUILD_DIR)/erizo.coff: deploy/win32/erizo.rc
x86_64-w64-mingw32-windres $? $@
OBJ += $(BUILD_DIR)/erizo.coff
endif
$(ERIZO_APP): $(BUILD_DIR)/src/main.o $(OBJ)
$(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
$(ERIZO_TEST): $(BUILD_DIR)/src/test.o $(OBJ)
$(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
$(BUILD_DIR)/%.o: %.c | $(BUILD_DIR)
$(CC) $(CFLAGS) $(PLATFORM) -c -o $@ -std=c99 $<
$(BUILD_DIR)/%.o: %.mm | $(BUILD_DIR)
$(CC) $(CFLAGS) $(PLATFORM) -c -o $@ -std=c++11 $<
ifneq ($(MAKECMDGOALS),clean)
-include $(DEP)
$(BUILD_DIR)/%.d: %.c | $(BUILD_DIR) $(GEN)
$(CC) $< $(PLATFORM) $(CFLAGS) -MM -MT $(@:.d=.o) > $@
$(BUILD_DIR)/%.d: %.mm | $(BUILD_DIR) $(GEN)
$(CC) $< $(PLATFORM) -Iinc -MM -MT $(@:.d=.o) > $@
endif
$(BUILD_DIR):
mkdir -p $(sort $(dir $(OBJ)))
.PHONY: clean
clean:
rm -rf $(BUILD_DIR)
rm -rf $(GEN)
rm -f $(ERIZO_APP)
rm -f $(ERIZO_TEST)
################################################################################
# Building vendored GLFW
glfw:
cd vendor/glfw && mkdir -p build-$(TARGET)
ifeq ($(TARGET), win32-cross)
cd vendor/glfw/build-$(TARGET) && cmake \
-DCMAKE_TOOLCHAIN_FILE=../CMake/x86_64-w64-mingw32.cmake \
-DGLFW_BUILD_EXAMPLES=OFF -DGLFW_BUILD_DOCS=OFF \
-DGLFW_BUILD_TESTS=OFF .. && \
make
else
cd vendor/glfw/build-$(TARGET) && cmake \
-DGLFW_BUILD_EXAMPLES=OFF -DGLFW_BUILD_DOCS=OFF \
-DGLFW_BUILD_TESTS=OFF .. && \
make
endif