Skip to content

Commit 40c9d61

Browse files
committed
adding basic build system infrastructure
Signed-off-by: Steven Noonan <[email protected]>
1 parent fc45e05 commit 40c9d61

5 files changed

+257
-227
lines changed

Makefile

+69-227
Original file line numberDiff line numberDiff line change
@@ -1,254 +1,96 @@
1-
MAKEFLAGS+=-r -j
2-
3-
config=debug
4-
files=demo/pirate.obj
5-
6-
BUILD=build/$(config)
7-
8-
LIBRARY_SOURCES=$(wildcard src/*.cpp)
9-
LIBRARY_OBJECTS=$(LIBRARY_SOURCES:%=$(BUILD)/%.o)
10-
11-
DEMO_SOURCES=$(wildcard demo/*.c demo/*.cpp) tools/objloader.cpp
12-
DEMO_OBJECTS=$(DEMO_SOURCES:%=$(BUILD)/%.o)
13-
14-
GLTFPACK_SOURCES=$(wildcard gltf/*.cpp)
15-
GLTFPACK_OBJECTS=$(GLTFPACK_SOURCES:%=$(BUILD)/%.o)
16-
17-
OBJECTS=$(LIBRARY_OBJECTS) $(DEMO_OBJECTS) $(GLTFPACK_OBJECTS)
18-
19-
LIBRARY=$(BUILD)/libmeshoptimizer.a
20-
DEMO=$(BUILD)/meshoptimizer
21-
22-
CFLAGS=-g -Wall -Wextra -std=c89
23-
CXXFLAGS=-g -Wall -Wextra -Wshadow -Wno-missing-field-initializers -std=gnu++98
24-
LDFLAGS=
25-
26-
$(GLTFPACK_OBJECTS): CXXFLAGS+=-std=c++11
27-
28-
ifdef BASISU
29-
$(GLTFPACK_OBJECTS): CXXFLAGS+=-DWITH_BASISU
30-
$(BUILD)/gltf/basis%.cpp.o: CXXFLAGS+=-I$(BASISU)
31-
gltfpack: LDFLAGS+=-lpthread
32-
33-
ifeq ($(HOSTTYPE),x86_64)
34-
$(BUILD)/gltf/basislib.cpp.o: CXXFLAGS+=-msse4.1
35-
endif
36-
endif
37-
38-
WASI_SDK?=/opt/wasi-sdk
39-
WASMCC?=$(WASI_SDK)/bin/clang++
40-
WASIROOT?=$(WASI_SDK)/share/wasi-sysroot
41-
42-
WASM_FLAGS=--target=wasm32-wasi --sysroot=$(WASIROOT)
43-
WASM_FLAGS+=-Wall -Wextra
44-
WASM_FLAGS+=-O3 -DNDEBUG -nostartfiles -nostdlib -Wl,--no-entry -Wl,-s
45-
WASM_FLAGS+=-mcpu=mvp # make sure clang doesn't use post-MVP features like sign extension
46-
WASM_FLAGS+=-fno-slp-vectorize -fno-vectorize -fno-unroll-loops
47-
WASM_FLAGS+=-Wl,-z -Wl,stack-size=36864 -Wl,--initial-memory=65536
48-
WASM_EXPORT_PREFIX=-Wl,--export
49-
50-
WASM_DECODER_SOURCES=src/vertexcodec.cpp src/indexcodec.cpp src/vertexfilter.cpp tools/wasmstubs.cpp
51-
WASM_DECODER_EXPORTS=meshopt_decodeVertexBuffer meshopt_decodeIndexBuffer meshopt_decodeIndexSequence meshopt_decodeFilterOct meshopt_decodeFilterQuat meshopt_decodeFilterExp sbrk __wasm_call_ctors
52-
53-
WASM_ENCODER_SOURCES=src/vertexcodec.cpp src/indexcodec.cpp src/vertexfilter.cpp src/vcacheoptimizer.cpp src/vfetchoptimizer.cpp src/spatialorder.cpp tools/wasmstubs.cpp
54-
WASM_ENCODER_EXPORTS=meshopt_encodeVertexBuffer meshopt_encodeVertexBufferBound meshopt_encodeVertexBufferLevel meshopt_encodeIndexBuffer meshopt_encodeIndexBufferBound meshopt_encodeIndexSequence meshopt_encodeIndexSequenceBound meshopt_encodeVertexVersion meshopt_encodeIndexVersion meshopt_encodeFilterOct meshopt_encodeFilterQuat meshopt_encodeFilterExp meshopt_optimizeVertexCache meshopt_optimizeVertexCacheStrip meshopt_optimizeVertexFetchRemap meshopt_spatialSortRemap sbrk __wasm_call_ctors
55-
56-
WASM_SIMPLIFIER_SOURCES=src/simplifier.cpp src/vfetchoptimizer.cpp tools/wasmstubs.cpp
57-
WASM_SIMPLIFIER_EXPORTS=meshopt_simplify meshopt_simplifyWithAttributes meshopt_simplifyScale meshopt_simplifyPoints meshopt_optimizeVertexFetchRemap sbrk __wasm_call_ctors
58-
59-
WASM_CLUSTERIZER_SOURCES=src/clusterizer.cpp tools/wasmstubs.cpp
60-
WASM_CLUSTERIZER_EXPORTS=meshopt_buildMeshletsBound meshopt_buildMeshlets meshopt_computeClusterBounds meshopt_computeMeshletBounds meshopt_optimizeMeshlet sbrk __wasm_call_ctors
61-
62-
ifneq ($(werror),)
63-
CFLAGS+=-Werror
64-
CXXFLAGS+=-Werror
1+
# -*- Makefile -*- for meshoptimizer
2+
3+
.SECONDEXPANSION:
4+
.SUFFIXES:
5+
6+
ifneq ($(findstring $(MAKEFLAGS),s),s)
7+
ifndef V
8+
QUIET = @
9+
QUIET_CXX = @echo ' ' CXX $<;
10+
QUIET_AR = @echo ' ' AR $@;
11+
QUIET_RANLIB = @echo ' ' RANLIB $@;
12+
QUIET_INSTALL = @echo ' ' INSTALL $<;
13+
export V
6514
endif
66-
67-
ifeq ($(config),iphone)
68-
IPHONESDK=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk
69-
CFLAGS+=-arch armv7 -arch arm64 -isysroot $(IPHONESDK)
70-
CXXFLAGS+=-arch armv7 -arch arm64 -isysroot $(IPHONESDK) -stdlib=libc++
71-
LDFLAGS+=-arch armv7 -arch arm64 -isysroot $(IPHONESDK) -L $(IPHONESDK)/usr/lib -mios-version-min=7.0
7215
endif
7316

74-
ifeq ($(config),trace)
75-
CXXFLAGS+=-DTRACE=1
76-
endif
17+
LIB = libmeshoptimizer.a
18+
AR ?= ar
19+
ARFLAGS ?= rc
20+
CXX ?= g++
21+
RANLIB ?= ranlib
22+
RM ?= rm -f
7723

78-
ifeq ($(config),tracev)
79-
CXXFLAGS+=-DTRACE=2
80-
endif
24+
BUILD_DIR := build
25+
BUILD_ID ?= default-build-id
26+
OBJ_DIR := $(BUILD_DIR)/$(BUILD_ID)
8127

82-
ifeq ($(config),release)
83-
CXXFLAGS+=-O3 -DNDEBUG
28+
ifeq (,$(BUILD_ID))
29+
$(error BUILD_ID cannot be an empty string)
8430
endif
8531

86-
ifeq ($(config),coverage)
87-
CXXFLAGS+=-coverage
88-
LDFLAGS+=-coverage
89-
endif
32+
prefix ?= /usr/local
33+
libdir := $(prefix)/lib
34+
includedir := $(prefix)/include
9035

91-
ifeq ($(config),release-avx512)
92-
CXXFLAGS+=-O3 -DNDEBUG -mavx512vl -mavx512vbmi -mavx512vbmi2
93-
endif
36+
CXXFLAGS ?= -O2
37+
CXXFLAGS += -I$(includedir)
9438

95-
ifeq ($(config),release-scalar)
96-
CXXFLAGS+=-O3 -DNDEBUG -DMESHOPTIMIZER_NO_SIMD
97-
endif
39+
HEADERS = \
40+
src/meshoptimizer.h \
9841

99-
ifeq ($(config),coverage-scalar)
100-
CXXFLAGS+=-coverage -DMESHOPTIMIZER_NO_SIMD
101-
LDFLAGS+=-coverage
102-
endif
42+
SOURCES = \
43+
src/*.cpp \
10344

104-
ifeq ($(config),sanitize)
105-
CXXFLAGS+=-fsanitize=address,undefined -fsanitize-undefined-trap-on-error
106-
LDFLAGS+=-fsanitize=address,undefined
107-
endif
45+
SOURCES := $(wildcard $(SOURCES))
10846

109-
ifeq ($(config),analyze)
110-
CXXFLAGS+=--analyze
111-
endif
112-
113-
ifeq ($(config),fuzz)
114-
CXXFLAGS+=-O1 -fsanitize=address,fuzzer
115-
LDFLAGS+=-fsanitize=address,fuzzer
47+
HEADERS_INST := $(patsubst src/%,$(includedir)/%,$(HEADERS))
48+
OBJECTS := $(patsubst %.cpp,$(OBJ_DIR)/%.o,$(SOURCES))
11649

117-
$(GLTFPACK_OBJECTS): CXXFLAGS+=-DGLTFFUZZ
118-
endif
50+
.PHONY: install
11951

120-
all: $(DEMO)
52+
all: $(OBJ_DIR)/$(LIB)
12153

122-
test: $(DEMO)
123-
$(DEMO) $(files)
54+
$(includedir)/%.h: src/%.h
55+
-@if [ ! -d $(includedir) ]; then mkdir -p $(includedir); fi
56+
$(QUIET_INSTALL)cp $< $@
57+
@chmod 0644 $@
12458

125-
check: $(DEMO)
126-
$(DEMO)
59+
$(libdir)/%.a: $(OBJ_DIR)/%.a
60+
-@if [ ! -d $(libdir) ]; then mkdir -p $(libdir); fi
61+
$(QUIET_INSTALL)cp $< $@
62+
@chmod 0644 $@
12763

128-
dev: $(DEMO)
129-
$(DEMO) -d $(files)
64+
install: $(HEADERS_INST) $(libdir)/$(LIB)
13065

131-
nanite: $(DEMO)
132-
$(DEMO) -n $(files)
133-
134-
format:
135-
clang-format -i src/*.h src/*.cpp demo/*.cpp gltf/*.h gltf/*.cpp
136-
137-
formatjs:
138-
prettier -w js/*.js gltf/*.js demo/*.html js/*.ts
139-
140-
js: js/meshopt_decoder.js js/meshopt_decoder.module.js js/meshopt_encoder.js js/meshopt_encoder.module.js js/meshopt_simplifier.js js/meshopt_simplifier.module.js js/meshopt_clusterizer.js js/meshopt_clusterizer.module.js
141-
142-
symbols: $(BUILD)/amalgamated.so
143-
nm $< -U -g
144-
145-
gltfpack: $(BUILD)/gltfpack
146-
ln -fs $^ $@
147-
148-
ifeq ($(config),fuzz)
149-
gltffuzz: $(BUILD)/gltfpack
150-
cp $^ $@
151-
mkdir -p /tmp/gltffuzz
152-
cp gltf/fuzz.glb /tmp/gltffuzz/
153-
./gltffuzz /tmp/gltffuzz -fork=16 -dict=gltf/fuzz.dict -ignore_crashes=1 -max_len=32768
154-
endif
155-
156-
$(BUILD)/gltfpack: $(GLTFPACK_OBJECTS) $(LIBRARY)
157-
$(CXX) $^ $(LDFLAGS) -o $@
158-
159-
gltfpack.wasm: gltf/library.wasm
160-
161-
gltf/library.wasm: $(LIBRARY_SOURCES) $(GLTFPACK_SOURCES)
162-
$(WASMCC) $^ -o $@ -Wall -Os -DNDEBUG --target=wasm32-wasi --sysroot=$(WASIROOT) -nostartfiles -Wl,--no-entry -Wl,--export=pack -Wl,--export=malloc -Wl,--export=free -Wl,--export=__wasm_call_ctors -Wl,-s -Wl,--allow-undefined-file=gltf/wasistubs.txt
163-
164-
build/decoder_base.wasm: $(WASM_DECODER_SOURCES)
165-
@mkdir -p build
166-
$(WASMCC) $^ $(WASM_FLAGS) $(patsubst %,$(WASM_EXPORT_PREFIX)=%,$(WASM_DECODER_EXPORTS)) -o $@
167-
168-
build/decoder_simd.wasm: $(WASM_DECODER_SOURCES)
169-
@mkdir -p build
170-
$(WASMCC) $^ $(WASM_FLAGS) $(patsubst %,$(WASM_EXPORT_PREFIX)=%,$(WASM_DECODER_EXPORTS)) -o $@ -msimd128 -mbulk-memory
171-
172-
build/encoder.wasm: $(WASM_ENCODER_SOURCES)
173-
@mkdir -p build
174-
$(WASMCC) $^ $(WASM_FLAGS) $(patsubst %,$(WASM_EXPORT_PREFIX)=%,$(WASM_ENCODER_EXPORTS)) -lc -o $@
175-
176-
build/simplifier.wasm: $(WASM_SIMPLIFIER_SOURCES)
177-
@mkdir -p build
178-
$(WASMCC) $^ $(WASM_FLAGS) $(patsubst %,$(WASM_EXPORT_PREFIX)=%,$(WASM_SIMPLIFIER_EXPORTS)) -lc -o $@
179-
180-
build/clusterizer.wasm: $(WASM_CLUSTERIZER_SOURCES)
181-
@mkdir -p build
182-
$(WASMCC) $^ $(WASM_FLAGS) $(patsubst %,$(WASM_EXPORT_PREFIX)=%,$(WASM_CLUSTERIZER_EXPORTS)) -lc -o $@
183-
184-
js/meshopt_decoder.js: build/decoder_base.wasm build/decoder_simd.wasm tools/wasmpack.py
185-
sed -i "s#Built with clang.*#Built with $$($(WASMCC) --version | head -n 1 | sed 's/\s\+(.*//')#" $@
186-
sed -i "s#Built from meshoptimizer .*#Built from meshoptimizer $$(cat src/meshoptimizer.h | grep -Po '(?<=version )[0-9.]+')#" $@
187-
sed -i "s#\([\"']\).*\(;\s*//\s*embed! base\)#\\1$$(cat build/decoder_base.wasm | python3 tools/wasmpack.py)\\1\\2#" $@
188-
sed -i "s#\([\"']\).*\(;\s*//\s*embed! simd\)#\\1$$(cat build/decoder_simd.wasm | python3 tools/wasmpack.py)\\1\\2#" $@
189-
190-
js/meshopt_encoder.js: build/encoder.wasm tools/wasmpack.py
191-
js/meshopt_simplifier.js: build/simplifier.wasm tools/wasmpack.py
192-
js/meshopt_clusterizer.js: build/clusterizer.wasm tools/wasmpack.py
193-
194-
js/meshopt_encoder.js js/meshopt_simplifier.js js/meshopt_clusterizer.js:
195-
sed -i "s#Built with clang.*#Built with $$($(WASMCC) --version | head -n 1 | sed 's/\s\+(.*//')#" $@
196-
sed -i "s#Built from meshoptimizer .*#Built from meshoptimizer $$(cat src/meshoptimizer.h | grep -Po '(?<=version )[0-9.]+')#" $@
197-
sed -i "s#\([\"']\).*\(;\s*//\s*embed! wasm\)#\\1$$(cat $< | python3 tools/wasmpack.py)\\1\\2#" $@
198-
199-
js/%.module.js: js/%.js
200-
sed '\#// export!#q' <$< >$@
201-
sed -i "/use strict.;/d" $@
202-
sed -i "s#// export! \(.*\)#export { \\1 };#" $@
203-
204-
$(DEMO): $(DEMO_OBJECTS) $(LIBRARY)
205-
$(CXX) $^ $(LDFLAGS) -o $@
206-
207-
vcachetuner: tools/vcachetuner.cpp tools/objloader.cpp $(LIBRARY)
208-
$(CXX) $^ -fopenmp $(CXXFLAGS) -std=c++11 $(LDFLAGS) -o $@
209-
210-
codecbench: tools/codecbench.cpp $(LIBRARY)
211-
$(CXX) $^ $(CXXFLAGS) $(LDFLAGS) -o $@
212-
213-
codecbench.js: tools/codecbench.cpp $(LIBRARY_SOURCES)
214-
emcc $^ -O3 -g -DNDEBUG -s TOTAL_MEMORY=268435456 -s SINGLE_FILE=1 -o $@
215-
216-
codecbench-simd.js: tools/codecbench.cpp $(LIBRARY_SOURCES)
217-
emcc $^ -O3 -g -DNDEBUG -s TOTAL_MEMORY=268435456 -s SINGLE_FILE=1 -msimd128 -o $@
218-
219-
codecbench.wasm: tools/codecbench.cpp $(LIBRARY_SOURCES)
220-
$(WASMCC) $^ -fno-exceptions --target=wasm32-wasi --sysroot=$(WASIROOT) -lc++ -lc++abi -O3 -g -DNDEBUG -o $@
221-
222-
codecbench-simd.wasm: tools/codecbench.cpp $(LIBRARY_SOURCES)
223-
$(WASMCC) $^ -fno-exceptions --target=wasm32-wasi --sysroot=$(WASIROOT) -lc++ -lc++abi -O3 -g -DNDEBUG -msimd128 -o $@
224-
225-
codectest: tools/codectest.cpp $(LIBRARY)
226-
$(CXX) $^ $(CXXFLAGS) $(LDFLAGS) -o $@
66+
clean:
67+
$(RM) -r $(OBJ_DIR)
22768

228-
codecfuzz: tools/codecfuzz.cpp src/vertexcodec.cpp src/indexcodec.cpp
229-
$(CXX) $^ -fsanitize=fuzzer,address,undefined -O1 -g -o $@
69+
distclean:
70+
$(RM) -r $(BUILD_DIR)
23071

231-
simplifyfuzz: tools/simplifyfuzz.cpp src/simplifier.cpp
232-
$(CXX) $^ -fsanitize=fuzzer,address,undefined -O1 -g -o $@
72+
$(OBJ_DIR)/$(LIB): $(OBJECTS)
73+
$(QUIET_AR)$(AR) $(ARFLAGS) $@ $^
74+
$(QUIET_RANLIB)$(RANLIB) $@
23375

234-
$(LIBRARY): $(LIBRARY_OBJECTS)
235-
ar rcs $@ $^
76+
$(OBJ_DIR)/%.o: %.cpp $(OBJ_DIR)/.cflags | $$(@D)/.
77+
$(QUIET_CXX)$(CXX) $(CXXFLAGS) -o $@ -c $<
23678

237-
$(BUILD)/amalgamated.so: $(LIBRARY_SOURCES)
238-
@mkdir -p $(dir $@)
239-
cat $^ | $(CXX) $(CXXFLAGS) -x c++ - -I src/ -o $@ -shared -fPIC
79+
.PRECIOUS: $(OBJ_DIR)/. $(OBJ_DIR)%/.
24080

241-
$(BUILD)/%.cpp.o: %.cpp
242-
@mkdir -p $(dir $@)
243-
$(CXX) $< $(CXXFLAGS) -c -MMD -MP -o $@
81+
$(OBJ_DIR)/.:
82+
$(QUIET)mkdir -p $@
24483

245-
$(BUILD)/%.c.o: %.c
246-
@mkdir -p $(dir $@)
247-
$(CC) $< $(CFLAGS) -c -MMD -MP -o $@
84+
$(OBJ_DIR)%/.:
85+
$(QUIET)mkdir -p $@
24886

249-
-include $(OBJECTS:.o=.d)
87+
TRACK_CFLAGS = $(subst ','\'',$(CXX) $(CXXFLAGS))
25088

251-
clean:
252-
rm -rf $(BUILD)
89+
$(OBJ_DIR)/.cflags: .force-cflags | $$(@D)/.
90+
@FLAGS='$(TRACK_CFLAGS)'; \
91+
if test x"$$FLAGS" != x"`cat $(OBJ_DIR)/.cflags 2>/dev/null`" ; then \
92+
echo " * rebuilding meshoptimizer: new build flags or prefix"; \
93+
echo "$$FLAGS" > $(OBJ_DIR)/.cflags; \
94+
fi
25395

254-
.PHONY: all clean format js
96+
.PHONY: .force-cflags

meson.build

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
project('meshoptimizer', 'cpp', version: '0.16')
2+
3+
incdirs = ['src']
4+
5+
sources = [
6+
'src/allocator.cpp',
7+
'src/clusterizer.cpp',
8+
'src/indexcodec.cpp',
9+
'src/indexgenerator.cpp',
10+
'src/overdrawanalyzer.cpp',
11+
'src/overdrawoptimizer.cpp',
12+
'src/quantization.cpp',
13+
'src/simplifier.cpp',
14+
'src/spatialorder.cpp',
15+
'src/stripifier.cpp',
16+
'src/vcacheanalyzer.cpp',
17+
'src/vcacheoptimizer.cpp',
18+
'src/vertexcodec.cpp',
19+
'src/vertexfilter.cpp',
20+
'src/vfetchanalyzer.cpp',
21+
'src/vfetchoptimizer.cpp',
22+
]
23+
24+
incdirs = include_directories(incdirs)
25+
26+
lib = static_library(
27+
'meshoptimizer',
28+
sources,
29+
include_directories: incdirs,
30+
)
31+
32+
meshoptimizer_dep = declare_dependency(
33+
include_directories: incdirs,
34+
link_with: lib,
35+
version: meson.project_version()
36+
)
37+
38+
meson.override_dependency('meshoptimizer', meshoptimizer_dep)
39+
40+
# vim: set ts=4 sts=4 sw=4 et:

0 commit comments

Comments
 (0)