forked from mozilla/glean
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
197 lines (142 loc) · 6.15 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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
.PHONY: help
help:
@grep -E '^[0-9a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
sort | \
awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
GLEAN_PYENV := $(shell python3 -c "import sys; print('glean-core/python/.venv' + '.'.join(str(x) for x in sys.version_info[:2]))")
GLEAN_PYDEPS := ${GLEAN_PYDEPS}
# Read the `GLEAN_BUILD_VARIANT` variable, default to debug.
# If set it is passed as a flag to cargo, so we prefix it with `--`
ifeq ($(GLEAN_BUILD_VARIANT),)
GLEAN_BUILD_PROFILE :=
else ifeq ($(GLEAN_BUILD_VARIANT),debug)
# `--debug` is invalid and `--profile debug` is unstable.
GLEAN_BUILD_PROFILE :=
else
GLEAN_BUILD_PROFILE := --$(GLEAN_BUILD_VARIANT)
endif
# Setup environments
python-setup: $(GLEAN_PYENV)/bin/python3 ## Setup a Python virtual environment
@:
$(GLEAN_PYENV)/bin/python3:
python3 -m venv $(GLEAN_PYENV)
$(GLEAN_PYENV)/bin/pip install --upgrade pip
$(GLEAN_PYENV)/bin/pip install -r glean-core/python/requirements_dev.txt
bash -c "if [ \"$(GLEAN_PYDEPS)\" == \"min\" ]; then \
$(GLEAN_PYENV)/bin/pip install requirements-builder; \
$(GLEAN_PYENV)/bin/requirements-builder --level=min glean-core/python/setup.py > min_requirements.txt; \
$(GLEAN_PYENV)/bin/pip install -r min_requirements.txt; \
fi"
# All builds
build: build-rust
build-rust: ## Build all Rust code
cargo build --all $(GLEAN_BUILD_PROFILE)
build-kotlin: ## Build all Kotlin code
./gradlew build -x test
build-swift: ## Build all Swift code
bin/run-ios-build.sh
build-apk: build-kotlin ## Build an apk of the Glean sample app
./gradlew glean-sample-app:build
build-python: python-setup build-rust ## Build the Python bindings
$(GLEAN_PYENV)/bin/python3 glean-core/python/setup.py install
build-csharp: ## Build the C# bindings
dotnet build glean-core/csharp/csharp.sln
.PHONY: build build-rust build-kotlin build-swift build-apk build-csharp
# All tests
test: test-rust
test-rust: ## Run Rust tests for glean-core and glean-ffi
cargo test --all
test-rust-with-logs: ## Run all Rust tests with debug logging and single-threaded
RUST_LOG=glean_core=debug cargo test --all -- --nocapture --test-threads=1
test-kotlin: ## Run all Kotlin tests
./gradlew :glean:testDebugUnitTest
test-swift: ## Run all Swift tests
bin/run-ios-tests.sh
test-ios-sample: ## Run the iOS UI tests on the sample app
bin/run-ios-sample-app-test.sh
test-python: build-python ## Run all Python tests
$(GLEAN_PYENV)/bin/py.test glean-core/python/tests $(PYTEST_ARGS)
test-csharp: ## Run all C# tests
dotnet test glean-core/csharp/csharp.sln
.PHONY: test test-rust test-rust-with-logs test-kotlin test-swift test-ios-sample test-csharp
# Benchmarks
bench-rust: ## Run Rust benchmarks
cargo bench -p benchmark
.PHONY: bench-rust
# Linting
lint: clippy
clippy: ## Run cargo-clippy to lint Rust code
cargo clippy --all --all-targets --all-features -- -D warnings
ktlint: ## Run ktlint to lint Kotlin code
./gradlew ktlint detekt
swiftlint: ## Run swiftlint to lint Swift code
swiftlint --strict
yamllint: ## Run yamllint to lint YAML files
yamllint glean-core .circleci
shellcheck: ## Run shellcheck against important shell scripts
shellcheck glean-core/ios/sdk_generator.sh
pythonlint: python-setup ## Run flake8 and black to lint Python code
$(GLEAN_PYENV)/bin/python3 -m flake8 glean-core/python/glean glean-core/python/tests
$(GLEAN_PYENV)/bin/python3 -m black --check --exclude \(.venv\*\)\|\(.eggs\) glean-core/python
$(GLEAN_PYENV)/bin/python3 -m mypy glean-core/python/glean
.PHONY: lint clippy ktlint swiftlint yamllint
# Formatting
fmt: rustfmt
rustfmt: ## Format all Rust code
cargo fmt --all
swiftfmt: ## Format all Swift code
swiftformat glean-core/ios samples/ios --swiftversion 5 --verbose
pythonfmt: python-setup ## Run black to format Python code
$(GLEAN_PYENV)/bin/python3 -m black glean-core/python/glean glean-core/python/tests
.PHONY: fmt rustfmt swiftfmt
# Docs
docs: rust-docs kotlin-docs ## Build the Rust and Kotlin API documentation
rust-docs: ## Build the Rust documentation
bin/build-rust-docs.sh
kotlin-docs: ## Build the Kotlin documentation
./gradlew docs
swift-docs: ## Build the Swift documentation
bin/build-swift-docs.sh
python-docs: build-python ## Build the Python documentation
$(GLEAN_PYENV)/bin/python3 -m pdoc --html glean --force -o build/docs/python --config show_type_annotations=True
.PHONY: docs rust-docs kotlin-docs swift-docs
linkcheck: docs ## Run linkchecker on the generated docs
# Requires https://wummel.github.io/linkchecker/
linkchecker \
--ignore-url javadoc \
--ignore-url swift \
--ignore-url python \
--ignore-url docs/glean_core \
--ignore-url ErrorKind \
--ignore-url std.struct.Error \
build/docs
.PHONY: linkcheck
spellcheck: ## Spellcheck the docs
# Requires http://aspell.net/
bin/spellcheck.sh
# Utilities
android-emulator: ## Start the Android emulator with a predefined image
$(ANDROID_HOME)/emulator/emulator -avd Nexus_5X_API_P -netdelay none -netspeed full
.PHONY: android-emulator
cbindgen: ## Regenerate the FFI header file
RUSTUP_TOOLCHAIN=nightly \
cbindgen glean-core/ffi --lockfile Cargo.lock -o glean-core/ffi/glean.h
cp glean-core/ffi/glean.h glean-core/ios/Glean/GleanFfi.h
.PHONY: cbindgen
rust-coverage: export CARGO_INCREMENTAL=0
rust-coverage: export RUSTFLAGS=-Zprofile -Ccodegen-units=1 -Cinline-threshold=0 -Clink-dead-code -Coverflow-checks=off -Zno-landing-pads
rust-coverage: export RUSTUP_TOOLCHAIN=nightly
rust-coverage: ## Generate code coverage information for Rust code
# Expects a Rust nightly toolchain to be available.
# Expects grcov and genhtml to be available in $PATH.
cargo build --verbose
cargo test --verbose
zip -0 ccov.zip `find . \( -name "glean*.gc*" \) -print`
grcov ccov.zip -s . -t lcov --llvm --branch --ignore-not-existing --ignore "/*" --ignore "glean-core/ffi/*" -o lcov.info
genhtml -o report/ --show-details --highlight --ignore-errors source --legend lcov.info
.PHONY: rust-coverage
python-coverage: build-python ## Generate a code coverage report for Python
GLEAN_COVERAGE=1 $(GLEAN_PYENV)/bin/python3 -m coverage run --parallel-mode -m pytest
$(GLEAN_PYENV)/bin/python3 -m coverage combine
$(GLEAN_PYENV)/bin/python3 -m coverage html
.PHONY: python-coverage