FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
makehuman/.github/workflows/ci.yml at master · SeedeXR/makehuman · GitHub
SeedeXR
/
makehuman
Public
forked from
makehumancommunity/makehuman
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
makehuman
/
.github
/
workflows
/
ci.yml
Copy path
View runs
More file actions
More file actions
Latest commit
History
History
History
408 lines (367 loc) · 18.9 KB
Breadcrumbs
makehuman
/
.github
/
workflows
/
ci.yml
Copy path
File metadata and controls
408 lines (367 loc) · 18.9 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
#
SPDX-License-Identifier: AGPL-3.0-or-later
#
Gates from memory/instruction.md section 10 and memory/test.md.
name
:
CI
on
:
push
:
branches
:
[master]
pull_request
:
workflow_dispatch
:
concurrency
:
group
:
${{ github.workflow }}-${{ github.ref }}
cancel-in-progress
:
true
jobs
:
format
:
name
:
clang-format
runs-on
:
macos-15
steps
:
-
uses
:
actions/checkout@v4
-
name
:
Check formatting
run
:
|
CF=$(xcrun -f clang-format)
"$CF" --version
find src include tests benchmarks \( -name '*.cpp' -o -name '*.h' \) -print0 \
| xargs -0 "$CF" --style=file --dry-run --Werror
build-test
:
name
:
build + test (${{ matrix.preset }})
runs-on
:
macos-15
strategy
:
fail-fast
:
false
matrix
:
preset
:
[macos-arm64-debug, macos-arm64-release, macos-arm64-asan, macos-arm64-tsan]
steps
:
-
uses
:
actions/checkout@v4
#
Qt is needed or MH_HAVE_RENDER stays FALSE and the whole render/ui/app
#
tree is silently skipped -- CI was green for weeks without ever
#
compiling a line of it.
#
`draco` because `tests/golden/test_draco.cpp` has never run anywhere
#
but a developer machine: `find_package(draco QUIET)` simply failed
#
here, `MH_HAVE_DRACO` stayed undefined, and 13 test cases quietly did
#
not exist. It is a bottled formula, so the install is a download.
#
#
Deliberately in the MATRIX job, so draco is covered by asan and tsan
#
too. That was MEASURED rather than assumed before being turned on:
#
locally `mh_tests "[draco]"` passes 96 assertions in 13 cases under
#
BOTH sanitisers, with zero ThreadSanitizer warnings. The libktx note
#
in memory/todo.md had advised keeping such libraries out of the
#
sanitiser builds; that advice was worth checking rather than obeying.
-
name
:
Install dependencies
run
:
brew install ninja assimp qt draco
-
name
:
Configure
run
:
>-
cmake --preset ${{ matrix.preset }}
-DCMAKE_PREFIX_PATH="$(brew --prefix qt)"
-DMH_REQUIRE_RENDER=ON
#
-Werror is on for our targets, so any new warning fails here.
-
name
:
Build
run
:
cmake --build --preset ${{ matrix.preset }} -j
-
name
:
Test
run
:
ctest --preset ${{ matrix.preset }} --output-on-failure
#
The macos-15 runner ships Xcode 16.4, whose libc++ has NO floating-point
#
from_chars/to_chars -- the float call resolves to the deleted bool overload
#
and every build here failed while local builds on Apple clang 21 passed.
#
foundation/Chars.h falls back to a C-locale path when the library lacks
#
them. Newer runner images will make the fallback the UNUSED branch, so this
#
job pins it open: without it the fallback rots silently until the next
#
machine that needs it.
charconv-fallback
:
name
:
build + test (forced charconv fallback)
runs-on
:
macos-15
steps
:
-
uses
:
actions/checkout@v4
-
name
:
Install dependencies
run
:
brew install ninja assimp
-
name
:
Configure with the fallback forced on
run
:
>
cmake -S . -B build/fallback -G Ninja
-DCMAKE_BUILD_TYPE=Debug
-DMH_HAVE_FP_CHARCONV=OFF
-
name
:
Build
run
:
cmake --build build/fallback -j
-
name
:
Test
run
:
ctest --test-dir build/fallback --output-on-failure
ktx2
:
name
:
build + test (libktx / KTX2)
runs-on
:
macos-15
steps
:
-
uses
:
actions/checkout@v4
#
basis_universal supplies the `basisu` CLI, which is the EXTERNAL
#
decoder the KTX2 gates read our encoder's output back with.
#
`qt` as well: `mh_ktx2_encode` links Qt6::Gui for QImage, so without it
#
the encoder gates are skipped rather than run and this job proves only
#
the licence boundary. The whole point of the job is to run them.
-
name
:
Install dependencies
run
:
brew install ninja assimp basis_universal qt
#
The only configuration in which libktx is built at all. MH_WITH_KTX2
#
defaults OFF, so without this job every KTX2 gate -- including the
#
licence one -- runs on a contributor's laptop and nowhere else. This
#
repository has already shipped that mistake once (see the commit
#
"The gate that only worked on my screen").
-
name
:
Configure with libktx on
run
:
>
cmake -S . -B build/ktx2 -G Ninja
-DCMAKE_BUILD_TYPE=Debug
-DMH_WITH_KTX2=ON
-
name
:
Build
run
:
cmake --build build/ktx2 -j
#
The FULL suite, not just -R ktx. The KTX2 gates are the point, but
#
linking a new library into mh_io can break things that have nothing
#
to do with textures, and the charconv job sets the same precedent.
-
name
:
Test
run
:
ctest --test-dir build/ktx2 --output-on-failure
benchmark
:
name
:
benchmark vs python baseline
runs-on
:
macos-15
steps
:
-
uses
:
actions/checkout@v4
-
run
:
brew install ninja assimp
-
run
:
cmake --preset macos-arm64-release
-
run
:
cmake --build --preset macos-arm64-release -j
-
name
:
Run benchmarks
run
:
./build/macos-arm64-release/benchmarks/mh_bench | tee bench.txt
-
uses
:
actions/upload-artifact@v4
with
:
name
:
benchmark-results
path
:
bench.txt
licence
:
name
:
licence inventory
runs-on
:
macos-15
steps
:
-
uses
:
actions/checkout@v4
#
Every source file must declare an SPDX identifier, and it must be one
#
of the two the project uses. See LICENSING.md section 4.
-
name
:
SPDX headers present and valid
run
:
|
fail=0
while IFS= read -r -d '' f; do
line=$(head -3 "$f" | grep -o 'SPDX-License-Identifier: .*' || true)
if [ -z "$line" ]; then
echo "::error file=$f::missing SPDX-License-Identifier"; fail=1; continue
fi
id=${line#SPDX-License-Identifier: }
case "$id" in
AGPL-3.0-or-later|Apache-2.0) ;;
# BSD-3-Clause is admitted for ports of third-party BSD code that
# MakeHuman vendored -- currently only the transformations.py
# port (C. Gohlke). Those files must retain the upstream notice.
# See LICENSING.md 4.1.
BSD-3-Clause) ;;
*) echo "::error file=$f::unexpected licence '$id'"; fail=1 ;;
esac
done < <(find src include tests benchmarks \( -name '*.cpp' -o -name '*.h' \) -print0)
exit $fail
#
A dependency that is not recorded in LICENSING.md section 5.1 fails CI
#
(memory/instruction.md section 7), and one section 5.2 forbids fails
#
with a different message, because the fix is a different one.
#
#
This was twelve lines of inline shell that grepped the WHOLE file for
#
each name. That held only while LICENSING.md never named a library it
#
had turned down. The moment it recorded four refusals BY NAME, adding
#
`find_package(FFTW)` passed -- matching the very row that forbids it.
#
Measured before the rewrite, not theorised.
#
#
Now a script, for the same reason the other audits are: it can be run
#
and mutation-tested locally, and it is a ctest as well.
-
name
:
Dependencies are recorded in LICENSING.md
run
:
python3 tools/audit_dependencies.py
#
The Python-era tree is kept as a reference oracle only. If the C++
#
build ever reaches into it, the port has a hidden dependency on code
#
that is meant to be deleted at the end.
#
Comments are stripped first. Every module's CMakeLists explains WHICH
#
legacy/ file it ports -- that is provenance we want to keep, and it is
#
not a build dependency. This gate matched that prose three separate
#
times before the stripping was made uniform; a gate that greps for a
#
forbidden string will always match the document forbidding it.
-
name
:
Legacy tree is not part of the build
run
:
|
fail=0
while IFS= read -r -d '' f; do
if sed 's/#.*//' "$f" | grep -qn "legacy/"; then
echo "::error file=$f::the build references legacy/"; fail=1
fi
done < <(find CMakeLists.txt cmake src include tests benchmarks \
\( -name CMakeLists.txt -o -name '*.cmake' \) -print0 2>/dev/null)
exit $fail
#
A BSD-3-Clause file must carry the upstream copyright notice, or we
#
are redistributing it in breach of the one condition BSD imposes.
-
name
:
BSD-licensed files retain their upstream notice
run
:
|
fail=0
while IFS= read -r -d '' f; do
# Parse the SPDX FIELD and compare it. Grepping the file for the
# string "BSD-3-Clause" matches any prose mentioning it -- SceneIO.h
# says assimp is BSD-3-Clause in its second comment line and was
# flagged despite being Apache-2.0. Fourth time a gate here has
# matched a document instead of a violation; see
# memory/instruction.md.
line=$(head -3 "$f" | grep -o 'SPDX-License-Identifier: .*' || true)
id=${line#SPDX-License-Identifier: }
if [ "$id" = "BSD-3-Clause" ]; then
grep -q 'Copyright (c)' "$f" || {
echo "::error file=$f::BSD-3-Clause file without a copyright notice"
fail=1
}
fi
done < <(find src include \( -name '*.cpp' -o -name '*.h' \) -print0)
exit $fail
#
The licence boundary, enforced rather than documented.
#
#
LICENSING.md 4: an Apache-2.0 module may be depended ON by an AGPL one,
#
never the reverse. mh_io violated that for months -- it was stamped
#
Apache-2.0 while PUBLIC-linking mh::core (AGPL) and calling
#
RenderMesh::build, a port of module3d.py. Its Apache stamp bought
#
nobody anything: linking io pulled in AGPL regardless.
#
#
The SPDX gate above cannot catch this. It checks that each file
#
DECLARES a licence, not that the dependency direction is legal.
-
name
:
Apache-2.0 modules do not depend on AGPL ones
run
:
|
fail=0
# Every Apache-2.0 module, not a subset. `ui` was Apache-2.0 and
# ungated for months -- the rule was being enforced by review, which
# is exactly what this gate exists to replace. Keep this list equal to
# the set of modules whose CMakeLists declares Apache-2.0.
for permissive in io foundation render ui; do
# Strip comments first: this file EXPLAINS why it must not link
# mh::core, and a naive grep flags that explanation. Same trap as
# the FBX gate below.
if sed 's/#.*//' "src/$permissive/CMakeLists.txt" \
| grep -qE 'mh::core|mh_core'; then
echo "::error::src/$permissive links mh::core (AGPL); it is Apache-2.0"
fail=1
fi
[ -d "src/$permissive" ] || continue
hits=$(grep -rln 'makehuman/core/' "src/$permissive" "include/makehuman/$permissive" \
2>/dev/null || true)
if [ -n "$hits" ]; then
echo "::error::Apache-2.0 module includes an AGPL header:"; echo "$hits"
fail=1
fi
done
exit $fail
#
<charconv> is confined to mh_foundation. Floating-point from_chars and
#
to_chars do not exist in every libc++ we build on (the macos-15
#
runner's Xcode 16.4 lacks them), so a direct call compiles locally and
#
fails in CI. That reached CI TWICE: once because five call sites each
#
had their own parser, and again because a sixth used a different helper
#
name and was missed by a hand audit.
#
#
"Don't call std::from_chars on a float" cannot be checked. This can.
-
name
:
charconv is confined to foundation
run
:
|
# Match the INCLUDE, not the word: several files explain in prose why
# they must not use <charconv> directly.
hits=$(grep -rlnE '^[[:space:]]*#[[:space:]]*include[[:space:]]*<charconv>' \
src include --include='*.cpp' --include='*.h' \
| grep -v '/foundation/' || true)
if [ -n "$hits" ]; then
echo "::error::<charconv> outside mh_foundation:"; echo "$hits"
echo "Use mh::foundation::parseFloat / parseInteger / format* instead."
exit 1
fi
exit 0
-
name
:
Forbidden dependencies absent
run
:
|
# LICENSING.md section 5.2. The FBX SDK's licence is incompatible with
# AGPL redistribution; MetaHuman content is EULA-restricted.
# Match actual USE -- an include, a link, or a CMake target -- not
# the explanatory comments in SceneIO.h and LICENSING.md that say why
# the Autodesk SDK is not used.
if grep -rnE '#include *[<"]fbxsdk|-lfbxsdk|target_link_libraries.*fbxsdk|find_package *\( *FBX' \
--include=CMakeLists.txt --include='*.cmake' --include='*.cpp' \
--include='*.h' src include tests benchmarks cmake CMakeLists.txt ; then
echo "::error::a forbidden dependency is actually linked"; exit 1
fi
exit 0
inventories
:
name
:
inventories (task views, Mixamo rig)
#
Pure Python -- no need for a macOS runner. Mostly stdlib; the eye-asset
#
check decodes a PNG and does array maths, so this job installs Pillow and
#
NumPy for that one step. They are the SAME libraries the tool uses locally
#
from .venv-mh, deliberately: a second implementation of the iris mask --
#
a stdlib PNG decoder written to keep the job dependency-free -- could
#
disagree with the one that generates the assets, and then the gate would
#
be checking the wrong thing.
runs-on
:
ubuntu-latest
steps
:
-
uses
:
actions/checkout@v4
#
An interpreter pip can install into. The runner's system Python can be
#
marked externally-managed (PEP 668), which turns `pip install` into a
#
hard error -- and this job now needs two wheels.
-
uses
:
actions/setup-python@v5
with
:
python-version
:
'
3.12
'
#
memory/taskviews.md carries counts taken from the reference. A stale
#
number there misdirects the roadmap, so it is re-derived, not trusted.
-
name
:
Task-view inventory matches the reference
run
:
python3 tools/audit_taskviews.py
#
The Mixamo mapping claims every Mixamo parent relationship survives onto
#
the MakeHuman skeleton. Checked, not trusted: a wrong-but-plausible
#
pairing is exactly the mistake a hand-written bone table makes.
-
name
:
Mixamo bone mapping is consistent
run
:
python3 tools/mixamo_mapping.py
#
LICENSING.md answers every licence question this project gets asked, and
#
its rows describe whole directories -- the easiest thing in the repo to
#
be quietly wrong about. It was: "GLSL shaders | AGPL-3.0" did not hold
#
for data/shaders/glsl/xray_*, which is MeshLab under GPL-2.0-or-later.
-
name
:
Bundled licences are all recorded
run
:
python3 tools/audit_licences.py
#
A .mhmat names a shader and this port ignores the name -- the viewport
#
picks its model from settings. Harmless while every stem in data/ is
#
accounted for; the moment an asset asks for one we do not have, it
#
renders as something else with nothing to explain it.
-
name
:
Shipped materials only ask for shading we have
run
:
python3 tools/audit_shading.py
#
MH_DATA_DIR and friends are absolute paths into the tree that COMPILED
#
the binary. A bundled copy carries its own assets, so any code reading
#
the macro directly ignores them -- which is how the DMG shipped an app
#
that only ran on the build machine.
-
name
:
Runtime asset paths are resolved, not compiled in
run
:
python3 tools/audit_runtime_paths.py
#
foundation, core, rig and io stay free of Qt, so the headless
#
parameters -> mesh path can be used without a GUI stack (M10).
-
name
:
The headless modules do not depend on Qt
run
:
python3 tools/audit_headless.py
#
The six eye colours are GENERATED from brown_eye.png by recolouring the
#
iris, and the tool rests on a measured assumption: every pixel with
#
saturation > 0.35 is inside one of the two iris discs, so the sclera's
#
blood vessels are untouched by construction. A future retouch of the
#
source could break that silently, and the recoloured assets could drift
#
from the generator that documents them. Both are checked here.
#
#
It was not in CI at all until 2026-09-07, for want of these two wheels.
-
name
:
Install Pillow and NumPy for the eye-asset check
run
:
python3 -m pip install --quiet pillow numpy
-
name
:
Generated eye colours match their generator
run
:
python3 tools/make_eyes.py --check
#
The helper-cage proxies (teeth, tongue) are derived from
#
`data/3dobjs/base.obj`'s own `helper-*` cages, and their matcaps from
#
`skinmat_caucasian.png`. Any of those sources could be retouched and the
#
committed proxies would go on describing the old geometry in silence, so
#
the derivation is re-run here and compared against what is committed.
-
name
:
Generated helper-cage proxies match their generator
run
:
python3 tools/make_helper_proxies.py --check
#
ONE product version, in /VERSION. CMake reads it, the generated
#
Version.h carries it, and the two files that cannot read it -- the
#
SonarQube properties among them -- are checked against it here. The
#
repository had three independent declarations, one of them dead and
#
contradicting the other two.
-
name
:
Product version declarations agree
run
:
python3 tools/audit_version.py
#
The superset skeleton is generated, not hand-edited. If someone edits it
#
directly, or changes the generator without regenerating, the committed
#
file and the tool disagree -- and the tool is the one the docs describe.
-
name
:
Superset skeleton is not stale
run
:
python3 tools/build_mixamo_superset.py --check
#
The retarget table is generated from the same proven mapping and checked
#
the same way. --check re-derives it and fails on any drift; the run also
#
re-validates ancestry against the 179-bone rig, so a plausible-looking
#
hand edit (a fingertip moved onto the wrong finger's chain) fails here
#
rather than showing up as a twisted hand in an animation.
-
name
:
Mixamo retarget table is not stale
run
:
python3 tools/mixamo_mapping.py --check
#
body-poseunits.json was authored against a richer, differently-named
#
skeleton than MakeHuman ships: only 29 of its 61 poses resolve fully and
#
8 resolve to nothing. Gated so a future pose-unit consumer cannot be
#
built on it in ignorance, and so the numbers move only upward.
-
name
:
Body pose-unit resolvability has not regressed
run
:
python3 tools/audit_poseunits.py
Back
|
FazBrowse Home
|
New Git URL