-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathMakefile
More file actions
79 lines (61 loc) · 2.45 KB
/
Copy pathMakefile
File metadata and controls
79 lines (61 loc) · 2.45 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
PRIV_DIR := $(MIX_APP_PATH)/priv
NIF_SO := $(PRIV_DIR)/libemily.so
MLX_STAGE_DIR := $(PRIV_DIR)/mlx/lib
BUILD_DIR := $(EMILY_CACHE_DIR)/build-$(EMILY_VERSION)
# Sources — include ops/* and any other subdirs under c_src.
SOURCES := $(shell find c_src -name '*.cpp')
HEADERS := $(shell find c_src \( -name '*.h' -o -name '*.hpp' \))
OBJECTS := $(patsubst c_src/%.cpp,$(BUILD_DIR)/%.o,$(SOURCES))
# Flags
CXXFLAGS := -std=c++17 -O3 -fPIC -fvisibility=hidden -Wall -Wextra
CXXFLAGS += -I$(ERTS_INCLUDE_DIR) -Ic_src
# Third-party headers: use -isystem so warnings inside them (e.g. MLX's
# -Wdeprecated-copy on _MLX_BFloat16) don't clutter our builds or trip
# -Werror.
CXXFLAGS += -isystem $(FINE_INCLUDE_DIR) -isystem $(MLX_INCLUDE_DIR)
LDFLAGS := -L$(MLX_LIB_DIR) -lmlx -shared
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Darwin)
LDFLAGS += -undefined dynamic_lookup -flat_namespace -rpath @loader_path/mlx/lib
JOBS := $(shell sysctl -n hw.ncpu)
else
LDFLAGS += -Wl,-rpath,'$$ORIGIN/mlx/lib'
JOBS := $(shell nproc)
endif
MAKE_JOBS ?= $(JOBS)
.PHONY: all clean bench-native
all: $(NIF_SO)
# ------------------------------------------------------------------
# bench-native: standalone C++ microbenchmarks under bench/native/.
#
# Invoked by `mix bench.native` (which sets the same env elixir_make
# uses for the NIF build). Links against the vendored libmlx via the
# same rpath the NIF does, so the binary finds its own shared library
# without relying on global DYLD/LD paths.
# ------------------------------------------------------------------
BENCH_NATIVE_SRC := bench/native/compile_microbench.cpp
BENCH_NATIVE_BIN := $(BUILD_DIR)/compile_microbench
$(BENCH_NATIVE_BIN): $(BENCH_NATIVE_SRC) | $(BUILD_DIR)
$(CXX) -std=c++17 -O3 -Wall -Wextra \
-isystem $(MLX_INCLUDE_DIR) \
$(BENCH_NATIVE_SRC) \
-L$(MLX_LIB_DIR) -lmlx \
-Wl,-rpath,$(MLX_LIB_DIR) \
-o $(BENCH_NATIVE_BIN)
bench-native: $(BENCH_NATIVE_BIN)
@echo "Running $(BENCH_NATIVE_BIN)"
@$(BENCH_NATIVE_BIN) $(BENCH_NATIVE_ARGS)
$(BUILD_DIR):
@mkdir -p $(BUILD_DIR)
$(PRIV_DIR):
@mkdir -p $(PRIV_DIR)
$(BUILD_DIR)/%.o: c_src/%.cpp $(HEADERS) | $(BUILD_DIR)
@mkdir -p $(dir $@)
$(CXX) $(CXXFLAGS) -c $< -o $@
$(MLX_STAGE_DIR): | $(PRIV_DIR)
@mkdir -p $(MLX_STAGE_DIR)
@cp -a $(MLX_LIB_DIR)/. $(MLX_STAGE_DIR)/
$(NIF_SO): $(OBJECTS) $(MLX_STAGE_DIR) | $(PRIV_DIR)
$(CXX) $(OBJECTS) -o $(NIF_SO) $(LDFLAGS)
clean:
rm -rf $(BUILD_DIR) $(NIF_SO) $(PRIV_DIR)/mlx