Skip to content

Ninja windows#32

Open
cedrik-fuoco-adsk wants to merge 6 commits into
mainfrom
ninja-windows
Open

Ninja windows#32
cedrik-fuoco-adsk wants to merge 6 commits into
mainfrom
ninja-windows

Conversation

@cedrik-fuoco-adsk

Copy link
Copy Markdown
Owner

Linked issues

Summarize your change.

Describe the reason for the change.

Describe what you have tested and on which operating system.

Add a list of changes, and note any that might need special attention during the review.

If possible, provide screenshots.

@cedrik-fuoco-adsk cedrik-fuoco-adsk force-pushed the ninja-windows branch 3 times, most recently from 5a8db38 to f03bdd3 Compare February 23, 2026 16:10
- Change CY2024 configure step from "Visual Studio 17 2022" to "Ninja"
  with explicit -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl -DCMAKE_MT=mt
- Use 'inherit' path-type for MSYS2 on CY2024 so Ninja can find MSVC tools;
  keep 'minimal' for CY2023 to avoid "input line too long" from vcvarsall.bat
- Dynamically resolve MSVC and Windows SDK bin dirs via cygpath to put them
  before MSYS2 /usr/bin (avoids GNU link.exe shadowing MSVC link.exe)
- Use pythonLocation env var from setup-python instead of hardcoded Python path
- Disable sccache steps temporarily (to be re-enabled once Ninja build is stable)
- Comment out repository_owner guard to allow CI on fork during development
Ninja requires explicit OUTPUT declarations on custom commands and all
ExternalProject byproducts to be declared in BUILD_BYPRODUCTS.

- Convert POST_BUILD/TARGET custom commands to OUTPUT/DEPENDS form
  in rv_copy_lib_bin_folders macro and individual dependency files
- Add missing import library (.lib) byproducts for Windows builds
- Fix pre-existing bug in openjpeg IMPORTED_IMPLIB path
- Fix tiff and imgui byproducts to include import libs after Windows overrides
- Merge openssl staging commands into a single custom command
- Disable /MP (multi-process compilation) when using Ninja, as Ninja already
  parallelizes builds and the combination causes PDB write contention (C1041)
- Replace /Zi with /Z7 in debug/relwithdebinfo flags for Ninja builds;
  /Z7 embeds debug info in each .obj file avoiding shared PDB contention
- Keep /Zi + /FS for Visual Studio generator where shared PDB is expected
Meson does not understand CMAKE_C_COMPILER_LAUNCHER and picks up
"sccache cl" as the compiler string, causing configure failures.
Explicitly set CC=cl and CXX=cl via cmake -E env wrapper on Windows.
Change GET_FILENAME_COMPONENT from NAME_WE to NAME_WLE when deriving
the import library name from the DLL name. NAME_WE strips from the
first dot (openjph.0.18.dll -> openjph), producing the wrong import
lib name. NAME_WLE strips only the last extension (openjph.0.18.dll ->
openjph.0.18), matching the actual file on disk.

Remove the manual workaround in openjph.cmake and debug MESSAGE lines
that are no longer needed.
PCRE2 was configured with autotools (autogen.sh/configure/make) but
actually built with CMake/MSVC on Windows, producing MSVC-style library
names (pcre2-8.dll, pcre2-8.lib) with debug postfix "d" in Debug builds.

The cmake file hardcoded MinGW-style names (libpcre2-8-0.dll,
libpcre2-8.dll.a) which never matched the actual build output, causing
LNK1104 errors when linking TwkUtil and other targets.

Fix by:
- Using CMake as the explicit build system (matching actual behavior)
- Using correct MSVC-style library and import lib names
- Handling the debug "d" postfix for Debug builds
- Removing the unused autotools path (PCRE2 is Windows-only)
- Staging import libs to RV_STAGE_LIB_DIR
cedrik-fuoco-adsk pushed a commit that referenced this pull request Feb 25, 2026
…ftwareFoundation#1122)

### Fix crash calling sourcesAtFrame at session clear.

### Summarize your change.

If sourcesAtFrame is called in an event from which the graph is cleared
(`graph-node-inputs-changed` in my case, but it could be anything that
clears the graph), RV will crash with a stack resembling the below:
```
* thread #1, name = 'RV Main', queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x793bcc0f30f4744a)
  * frame #0: 0x00000001003e8688 RV`IPCore::AdaptorIPNode::metaEvaluate(this=0x0000000a96080780, c=0x000000016fdf6290, visitor=0x000000016fdf6c40) at AdaptorIPNode.cpp:92:31
    frame #1: 0x000000010027b920 RV`IPCore::IPNode::metaEvaluate(this=0x0000000a96080a00, context=0x000000016fdf6290, visitor=0x000000016fdf6c40) at IPNode.cpp:408:23
    frame #2: 0x000000010027b920 RV`IPCore::IPNode::metaEvaluate(this=0x0000000a96074000, context=0x000000016fdf6290, visitor=0x000000016fdf6c40) at IPNode.cpp:408:23
    frame #3: 0x00000001007d5eb0 RV`IPCore::RetimeIPNode::metaEvaluate(this=0x0000000a96074000, context=0x000000016fdf6378, visitor=0x000000016fdf6c40) at RetimeIPNode.cpp:661:17
    frame #4: 0x00000001007e1790 RV`IPCore::StackIPNode::metaEvaluate(this=0x0000000a94a2f100, context=0x000000016fdf67f0, visitor=0x000000016fdf6c40) at StackIPNode.cpp:791:25
    frame #5: 0x000000010027b920 RV`IPCore::IPNode::metaEvaluate(this=0x0000000a9320d500, context=0x000000016fdf67f0, visitor=0x000000016fdf6c40) at IPNode.cpp:408:23
    frame #6: 0x000000010040cefc RV`IPCore::GroupIPNode::metaEvaluate(this=0x0000000a95bf2080, c=0x000000016fdf67f0, visitor=0x000000016fdf6c40) at GroupIPNode.cpp:114:25
    frame #7: 0x00000001003e8690 RV`IPCore::AdaptorIPNode::metaEvaluate(this=0x0000000a94774a00, c=0x000000016fdf67f0, visitor=0x000000016fdf6c40) at AdaptorIPNode.cpp:92:31
    frame #8: 0x00000001003e8690 RV`IPCore::AdaptorIPNode::metaEvaluate(this=0x0000000a94cf8c80, c=0x000000016fdf67f0, visitor=0x000000016fdf6c40) at AdaptorIPNode.cpp:92:31
    frame #9: 0x000000010040cefc RV`IPCore::GroupIPNode::metaEvaluate(this=0x0000000a95bf0500, c=0x000000016fdf67f0, visitor=0x000000016fdf6c40) at GroupIPNode.cpp:114:25
    frame #10: 0x000000010027b920 RV`IPCore::IPNode::metaEvaluate(this=0x0000000a8cd01500, context=0x000000016fdf67f0, visitor=0x000000016fdf6c40) at IPNode.cpp:408:23
    frame #11: 0x000000010027b920 RV`IPCore::IPNode::metaEvaluate(this=0x0000000a95bf0280, context=0x000000016fdf67f0, visitor=0x000000016fdf6c40) at IPNode.cpp:408:23
    frame #12: 0x000000010040cefc RV`IPCore::GroupIPNode::metaEvaluate(this=0x0000000a95bf0a00, c=0x000000016fdf67f0, visitor=0x000000016fdf6c40) at GroupIPNode.cpp:114:25
    frame #13: 0x00000001003e8690 RV`IPCore::AdaptorIPNode::metaEvaluate(this=0x0000000a94cf8780, c=0x000000016fdf67f0, visitor=0x000000016fdf6c40) at AdaptorIPNode.cpp:92:31
    frame #14: 0x00000001003f4a40 RV`IPCore::DisplayStereoIPNode::metaEvaluate(this=0x0000000a95437480, context=0x000000016fdf69d0, visitor=0x000000016fdf6c40) at DisplayStereoIPNode.cpp:393:20
    frame #15: 0x00000001003e8690 RV`IPCore::AdaptorIPNode::metaEvaluate(this=0x0000000a947bd180, c=0x000000016fdf69d0, visitor=0x000000016fdf6c40) at AdaptorIPNode.cpp:92:31
    frame #16: 0x000000010027b920 RV`IPCore::IPNode::metaEvaluate(this=0x0000000a95b96800, context=0x000000016fdf69d0, visitor=0x000000016fdf6c40) at IPNode.cpp:408:23
    frame #17: 0x000000010040cefc RV`IPCore::GroupIPNode::metaEvaluate(this=0x0000000a95bf0f00, c=0x000000016fdf69d0, visitor=0x000000016fdf6c40) at GroupIPNode.cpp:114:25
    frame #18: 0x00000001003ee27c RV`IPCore::DisplayGroupIPNode::metaEvaluate(this=0x0000000a93e41500, context=0x000000016fdf6bb8, visitor=0x000000016fdf6c40) at DisplayGroupIPNode.cpp:425:21
    frame #19: 0x000000010027b920 RV`IPCore::IPNode::metaEvaluate(this=0x0000000a94774780, context=0x000000016fdf6bb8, visitor=0x000000016fdf6c40) at IPNode.cpp:408:23
    frame #20: 0x00000001006ce2b4 RV`IPMu::sourcesAtFrame(node_=0x000000013a849440, thread_=0x0000000117748e00) at CommandsModule.cpp:1937:28
    frame #21: 0x0000000100e7a890 RV`Mu::DynamicArrayType::nodeEval(this=0x00000001176fcdc0, n=0x000000013a849440, thread=0x0000000117748e00) const at DynamicArrayType.cpp:78:90
    frame #22: 0x0000000100076e80 RV`Mu::Node::eval(this=0x000000013a849440, t=0x0000000117748e00) const at Node.cpp:142:62
    frame #23: 0x00000001000a92ac RV`Mu::Thread::call(this=0x0000000117748e00, f=0x0000000117e86d20, args=size=1, returnArguments=false) at Thread.cpp:422:23
    frame #24: 0x00000001001d2e2c RV`TwkApp::MuSymbol_call(_self=0x000000011b52a7f0, args=0x000000030a0d8bb0, kwds=0x0000000000000000) at PyMuSymbolType.cpp:389:48
    frame #25: 0x0000000108d17350 libpython3.11.dylib`_PyObject_MakeTpCall(tstate=0x00000001090a3c30, callable=0x000000011b52a7f0, args=<unavailable>, nargs=<unavailable>, keywords=0x0000000000000000) at call.c:214:18 [opt]
    frame #26: 0x0000000108d17850 libpython3.11.dylib`PyObject_Vectorcall [inlined] _PyObject_VectorcallTstate(tstate=<unavailable>, callable=<unavailable>, args=<unavailable>, nargsf=<unavailable>, kwnames=<unavailable>) at pycore_call.h:90:16 [opt] [artificial]
    frame #27: 0x0000000108df4dc0 libpython3.11.dylib`_PyEval_EvalFrameDefault(tstate=<unavailable>, frame=0x000000010a6f01d8, throwflag=<unavailable>) at ceval.c:0 [opt]
    frame #28: 0x0000000108df05fc libpython3.11.dylib`_PyEval_Vector [inlined] _PyEval_EvalFrame(tstate=0x00000001090a3c30, frame=0x000000010a6f01d8, throwflag=0) at pycore_ceval.h:73:16 [opt]
    frame #29: 0x0000000108df05ec libpython3.11.dylib`_PyEval_Vector(tstate=0x00000001090a3c30, func=<unavailable>, locals=<unavailable>, args=<unavailable>, argcount=<unavailable>, kwnames=<unavailable>) at ceval.c:6434:24 [opt]
    frame #30: 0x0000000108d19f24 libpython3.11.dylib`method_vectorcall [inlined] _PyObject_VectorcallTstate(tstate=0x00000001090a3c30, callable=0x000000013792e7a0, args=0x000000016fdf7ab0, nargsf=<unavailable>, kwnames=0x0000000000000000) at pycore_call.h:92:11 [opt]
    frame #31: 0x0000000108d19efc libpython3.11.dylib`method_vectorcall(method=<unavailable>, args=0x000000030a0d8268, nargsf=<unavailable>, kwnames=0x0000000000000000) at classobject.c:89:18 [opt]
    frame #32: 0x00000001001cf9d4 RV`TwkApp::PyFunctionAction::execute(this=0x0000000a8fade490, d=0x0000000a912c6000, event=0x000000016fdf7f28) const at PyFunctionAction.cpp:58:17
    frame #33: 0x00000001006612a8 RV`TwkApp::Document::executeAction(this=0x0000000a912c6000, event=0x000000016fdf7f28) at Document.cpp:486:20
    frame #34: 0x0000000100661b7c RV`TwkApp::Document::receiveEvent(this=0x0000000a912c6000, event=0x000000016fdf7f28) at Document.cpp:613:9
    frame #35: 0x000000010066fc38 RV`TwkApp::EventNode::propagateEvent(this=0x0000000a912c6000, event=0x000000016fdf7f28) at EventNode.cpp:71:13
    frame #36: 0x00000001001ecd94 RV`IPCore::Session::propagateEvent(this=0x0000000a912c6000, event=0x000000016fdf7f28) at Session.cpp:4644:43
    frame #37: 0x000000010066fca8 RV`TwkApp::EventNode::propagateEvent(this=0x0000000a909c9800, event=0x000000016fdf7f28) at EventNode.cpp:82:24
    frame #38: 0x000000010066fc00 RV`TwkApp::EventNode::sendEvent(this=0x0000000a909c9800, event=0x000000016fdf7f28) at EventNode.cpp:60:16
    frame #39: 0x000000010038b604 RV`IPCore::IPGraph::inputsChanged(this=0x0000000a909c9800, n=0x0000000a8d8b2800) at IPGraph.cpp:3449:13
    frame #40: 0x000000010027af8c RV`IPCore::IPNode::setInputs(this=0x0000000a8d8b2800, nodes=size=0) at IPNode.cpp:303:26
    frame #41: 0x0000000100279c4c RV`IPCore::IPNode::removeInput(this=0x0000000a8d8b2800, n=0x0000000a94a30500) at IPNode.cpp:166:13
    frame #42: 0x000000010027984c RV`IPCore::IPNode::~IPNode(this=0x0000000a94a30500) at IPNode.cpp:57:32
    frame #43: 0x000000010040c900 RV`IPCore::GroupIPNode::~GroupIPNode(this=0x0000000a94a30500) at GroupIPNode.cpp:48:5
    frame #44: 0x0000000100807490 RV`IPCore::SwitchGroupIPNode::~SwitchGroupIPNode(this=0x0000000a94a30500) at SwitchGroupIPNode.cpp:42:5
```
Notice the destructors are triggering a sourcesAtFrame call, which then
tries to access those same objects being destroyed resulting in a
use-after-free crash.

To fix this, we'll set a guard when the graph is being cleared, and if
sourcesAtFrame is called when the guard is set, we'll return an empty
array. This is the as what would happen if you called sourcesAtFrame
when there were no sources (ie after the graph was cleared). So we'll
just return the eventual result early, which is likely what the users
want anyway, and this will protect python events from crashing RV.

### Describe the reason for the change.

Prevent crashes

### Describe what you have tested and on which operating system.

Mac OS 26.2

---------

Signed-off-by: Roger Nelson <roger.nelson@autodesk.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant