-
Notifications
You must be signed in to change notification settings - Fork 79
/
justfile
209 lines (165 loc) · 9.42 KB
/
justfile
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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#!/usr/bin/env just --justfile
# ^ A shebang isn't required, but allows a justfile to be executed
# like a script, with `./justfile test`, for example.
set shell := ["bash", "-c"]
# Keep this in sync with `android/gradle/lib/build.gradle`
export NIGHTLY_TOOLCHAIN := "nightly-2024-07-22"
# Keep this in sync with `rust-toolchain.toml` and `Cargo.toml`.
# Make sure the above is newer than this.
export STABLE_TOOLCHAIN := "1.79"
export CARGO_TERM_COLOR := "always"
export RUST_BACKTRACE := "1"
stable-toolchain:
rustup toolchain install $STABLE_TOOLCHAIN
stable-override-toolchain: stable-toolchain
rustup override set $STABLE_TOOLCHAIN
stable-targets *FLAGS: stable-toolchain
rustup toolchain install $STABLE_TOOLCHAIN --target {{ FLAGS }}
stable-install-clippy: stable-toolchain
rustup component add clippy --toolchain $STABLE_TOOLCHAIN
nightly-toolchain:
rustup toolchain install $NIGHTLY_TOOLCHAIN
nightly-override-toolchain: nightly-toolchain
rustup override set $NIGHTLY_TOOLCHAIN
nightly-targets *FLAGS: nightly-toolchain
rustup toolchain install $NIGHTLY_TOOLCHAIN --target {{ FLAGS }}
# We sometimes build the stdlib with nightly
rustup component add rust-src --toolchain $NIGHTLY_TOOLCHAIN
nightly-install-rustfmt: nightly-toolchain
rustup component add rustfmt --toolchain $NIGHTLY_TOOLCHAIN
nightly-install-clippy: stable-toolchain
rustup component add clippy --toolchain $NIGHTLY_TOOLCHAIN
fixup: nightly-toolchain
cargo clippy --allow-dirty --no-deps -p maplibre --fix
cargo clippy --allow-dirty --no-deps -p maplibre-winit --fix
cargo clippy --allow-dirty --no-deps -p maplibre-demo --fix
cargo clippy --allow-dirty --no-deps -p benchmarks --fix
# Web
RUSTUP_TOOLCHAIN=$NIGHTLY_TOOLCHAIN cargo clippy --allow-dirty --no-deps -p web --target wasm32-unknown-unknown --fix
RUSTUP_TOOLCHAIN=$NIGHTLY_TOOLCHAIN RUSTFLAGS='-C target-feature=+atomics,+bulk-memory,+mutable-globals --cfg=web_sys_unstable_apis' cargo clippy --allow-dirty --no-deps -p web --target wasm32-unknown-unknown --fix -Z build-std=std,panic_abort
RUSTUP_TOOLCHAIN=$NIGHTLY_TOOLCHAIN cargo clippy --allow-dirty --no-deps -p maplibre --target wasm32-unknown-unknown --fix
RUSTUP_TOOLCHAIN=$NIGHTLY_TOOLCHAIN cargo clippy --allow-dirty --no-deps -p maplibre-winit --target wasm32-unknown-unknown --fix
# Android
env "AR_x86_64-linux-android=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar" "CC_x86_64-linux-android=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android30-clang" RUSTUP_TOOLCHAIN=$NIGHTLY_TOOLCHAIN cargo clippy --allow-dirty --no-deps -p maplibre --target x86_64-linux-android --fix
env "AR_x86_64-linux-android=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar" "CC_x86_64-linux-android=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android30-clang" RUSTUP_TOOLCHAIN=$NIGHTLY_TOOLCHAIN cargo clippy --allow-dirty --no-deps -p maplibre-winit --target x86_64-linux-android --fix
env "AR_x86_64-linux-android=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar" "CC_x86_64-linux-android=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android30-clang" RUSTUP_TOOLCHAIN=$NIGHTLY_TOOLCHAIN cargo clippy --allow-dirty --no-deps -p maplibre-android --target x86_64-linux-android --fix
# macOS/iOS
RUSTFLAGS="--cfg no_pendantic_os_check" cargo clippy --allow-dirty --no-deps -p apple --fix
# TODO check maplibre and maplibre-winit for apple targets
check PROJECT ARCH: stable-install-clippy
cargo clippy --no-deps -p {{ PROJECT }} --target {{ ARCH }}
nightly-check PROJECT ARCH FEATURES: nightly-toolchain nightly-install-clippy
export RUSTUP_TOOLCHAIN=$NIGHTLY_TOOLCHAIN && cargo clippy --no-deps -p {{ PROJECT }} --features "{{ FEATURES }}" --target {{ ARCH }}
test PROJECT ARCH:
cargo test -p {{ PROJECT }} --target {{ ARCH }}
# language=bash
benchmark:
#!/usr/bin/env bash
set -euxo pipefail
if ! command -v cargo-criterion &> /dev/null; then
echo "cargo criterion could not be found. Install it with 'cargo install cargo-criterion'"
exit 1
fi
cargo criterion -p benchmarks
fmt: nightly-install-rustfmt
export RUSTUP_TOOLCHAIN=$NIGHTLY_TOOLCHAIN && cargo fmt
{{ just_executable() }} --fmt --unstable
fmt-check: nightly-install-rustfmt
export RUSTUP_TOOLCHAIN=$NIGHTLY_TOOLCHAIN && cargo fmt -- --check
web-install PROJECT:
cd web/{{ PROJECT }} && npm install
# Example: just web-lib build
# Example: just web-lib build-webgl
# Example: just web-lib watch
# Example: just web-lib watch-webgl
web-lib TARGET *FLAGS: nightly-toolchain (nightly-targets "wasm32-unknown-unknown") (web-install "lib")
export RUSTUP_TOOLCHAIN=$NIGHTLY_TOOLCHAIN && cd web/lib && npm run {{ TARGET }} -- {{ FLAGS }}
# Examples: just web-demo start or just web-demo build
web-demo TARGET *FLAGS: (web-install "demo")
cd web/demo && npm run {{ TARGET }} -- {{ FLAGS }}
web-test FEATURES: nightly-toolchain (nightly-targets "wasm32-unknown-unknown")
export RUSTUP_TOOLCHAIN=$NIGHTLY_TOOLCHAIN && cargo test -p web --features "{{ FEATURES }}" --target wasm32-unknown-unknown
#profile-bench:
# cargo flamegraph --bench render -- --bench
build-android: build-android-lib build-android-demo
ensure-android-toolchain: nightly-toolchain (nightly-targets "x86_64-linux-android" "aarch64-linux-android" "i686-linux-android")
build-android-lib: ensure-android-toolchain print-android-env
cd android/gradle && ./gradlew :lib:assembleDebug
build-android-demo: ensure-android-toolchain print-android-env
cd android/gradle && ./gradlew :demo:assembleDebug
install-android-demo: ensure-android-toolchain print-android-env
cd android/gradle && ./gradlew :demo:installDebug
test-android TARGET: nightly-toolchain print-android-env
export RUSTUP_TOOLCHAIN=$NIGHTLY_TOOLCHAIN && cargo test -p maplibre-android --target {{ TARGET }} -Z build-std=std,panic_abort
# language=bash
print-android-env:
#!/usr/bin/env bash
set -euxo pipefail
echo "ANDROID_HOME: $ANDROID_HOME"
echo "ANDROID_SDK_ROOT: $ANDROID_SDK_ROOT"
echo "ANDROID_NDK_ROOT: $ANDROID_NDK_ROOT"
INNER_FRAMEWORK_PATH := "Products/Library/Frameworks/maplibre_rs.framework"
XC_FRAMEWORK_DIRECTORY := "./apple/MapLibreRs/"
export XC_FRAMEWORK_PATH := "./apple/MapLibreRs/MapLibreRs.xcframework"
PROJECT_DIR := "./apple/xcode/maplibre-rs.xcodeproj"
BINARY_NAME := "maplibre_rs"
BUILD_DIR := "./apple/build"
ensure-apple-toolchain: stable-toolchain (stable-targets "aarch64-apple-darwin" "x86_64-apple-darwin" "aarch64-apple-ios" "aarch64-apple-ios-sim")
xcodebuild-archive ARCH PLATFORM: ensure-apple-toolchain
xcodebuild ARCHS="{{ ARCH }}" archive -project "{{ PROJECT_DIR }}" \
-scheme "maplibre-rs" \
-destination "generic/platform={{ PLATFORM }}" \
-archivePath "{{ BUILD_DIR }}/{{ ARCH }}-apple-{{ PLATFORM }}"
# language=bash
xcodebuild-archive-fat EXISTING_ARCH EXISTING_PLATFORM ARCH: (xcodebuild-archive ARCH EXISTING_PLATFORM)
#!/usr/bin/env bash
set -euxo pipefail
archive="{{ BUILD_DIR }}/{{ ARCH }}-apple-{{ EXISTING_PLATFORM }}.xcarchive"
existing_archive="{{ BUILD_DIR }}/{{ EXISTING_ARCH }}-apple-{{ EXISTING_PLATFORM }}.xcarchive"
fat_archive="{{ BUILD_DIR }}/{{ EXISTING_ARCH }}-{{ ARCH }}-apple-{{ EXISTING_PLATFORM }}.xcarchive"
cp -R "$existing_archive" "$fat_archive"
inner="$archive/{{ INNER_FRAMEWORK_PATH }}"
existing_inner="$existing_archive/{{ INNER_FRAMEWORK_PATH }}"
fat_inner="$fat_archive/{{ INNER_FRAMEWORK_PATH }}"
target_binary="$fat_inner/$(readlink -n "$fat_inner/{{ BINARY_NAME }}")"
lipo -create "$existing_inner/{{ BINARY_NAME }}" \
"$inner/{{ BINARY_NAME }}" \
-output "$target_binary"
cp -R $inner/Modules/{{ BINARY_NAME }}.swiftmodule/* \
"$fat_inner/Modules/{{ BINARY_NAME }}.swiftmodule/"
xcodebuild-clean:
rm -rf {{ BUILD_DIR }}/*.xcarchive
rm -rf {{ XC_FRAMEWORK_DIRECTORY }}/*.xcframework
# language=bash
xcodebuild-xcframework:
#!/usr/bin/env bash
set -euxo pipefail
tuples=(
"arm64,iOS"
"arm64,iOS Simulator"
"arm64-x86_64,macOS"
)
framework_args=$(for i in "${tuples[@]}"; do IFS=","; set -- $i; echo -n "-framework \"{{ BUILD_DIR }}/$1-apple-$2.xcarchive/{{ INNER_FRAMEWORK_PATH }}\" "; done)
echo "framework_args: $framework_args"
echo "XC_FRAMEWORK_PATH: $XC_FRAMEWORK_PATH"
echo "$framework_args" | xargs xcodebuild -create-xcframework -output "$XC_FRAMEWORK_PATH"
cat "$XC_FRAMEWORK_PATH/Info.plist"
book-serve:
cd docs && ./generate-summary.sh && mdbook serve
# language=bash
extract-tiles:
#!/usr/bin/env bash
set -euxo pipefail
if ! command -v tilelive-copy &> /dev/null; then
echo "tilelive-copy could not be found. Install it with 'yarn global add @mapbox/tilelive @mapbox/mbtiles'"
exit 1
fi
# Bounds copied from https://boundingbox.klokantech.com/
tilelive-copy \
--minzoom=12 --maxzoom=12 \
--bounds="11.395769,48.083436,11.618242,48.220866" \
test-data/europe_germany-2020-02-13-openmaptiles-v3.12.1.mbtiles test-data/munich-12.mbtiles
tilelive-copy \
--minzoom=15 --maxzoom=15 \
--bounds="11.395769,48.083436,11.618242,48.220866" \
test-data/europe_germany-2020-02-13-openmaptiles-v3.12.1.mbtiles test-data/munich-15.mbtiles