diff --git a/CMakeLists.txt b/CMakeLists.txt index a9b83bd7..7c718068 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,6 +82,32 @@ add_subdirectory(moonray) add_subdirectory(rats) add_subdirectory(scripts) +if(IsDarwinPlatform) + install(CODE [[ + set(_omr_codesign_root "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}") + execute_process( + COMMAND /bin/bash -c " + set -e + root=\"$1\" + command -v codesign >/dev/null 2>&1 || exit 0 + for dir in \"$root/bin\" \"$root/lib\" \"$root/plugin\"; do + [ -d \"$dir\" ] || continue + find \"$dir\" -type f \\( -perm -111 -o -name '*.dylib' -o -name '*.so' \\) -print0 + done | while IFS= read -r -d '' file; do + if /usr/bin/file \"$file\" | /usr/bin/grep -q 'Mach-O'; then + /usr/bin/codesign --force --sign - \"$file\" + fi + done + " + _ "${_omr_codesign_root}" + RESULT_VARIABLE _omr_codesign_result + ) + if(NOT _omr_codesign_result EQUAL 0) + message(FATAL_ERROR "macOS ad-hoc codesign of installed OpenMoonRay runtime failed") + endif() + ]]) +endif() + if(GLD STREQUAL "$ENV{STUDIO}") install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/SDKScript DESTINATION . @@ -90,4 +116,3 @@ if(GLD STREQUAL "$ENV{STUDIO}") GROUP_READ GROUP_WRITE WORLD_READ) endif() - diff --git a/CMakeMacOSPresets.json b/CMakeMacOSPresets.json index f13d05ef..384e9e41 100644 --- a/CMakeMacOSPresets.json +++ b/CMakeMacOSPresets.json @@ -5,9 +5,10 @@ "name": "macos-environment", "hidden": true, "environment": { - "DEPS_ROOT" : "${sourceParentDir}/installs", - "BUILD_DIR" : "${sourceParentDir}/build", + "DEPS_ROOT" : "/Applications/MoonRay/installs", + "BUILD_DIR" : "/Applications/MoonRay/build", "Boost_ROOT" : "$env{DEPS_ROOT}", + "TBB_ROOT": "$env{DEPS_ROOT}", "Libuuid_ROOT" : "$env{DEPS_ROOT}", "CppUnit_ROOT" : "$env{DEPS_ROOT}", "ISPC" : "$env{DEPS_ROOT}/bin/ispc", @@ -22,7 +23,7 @@ "PXR_INCLUDE_DIRS" : "$env{DEPS_ROOT}/include", "Random123_ROOT" : "$env{DEPS_ROOT}", "ZLIB_ROOT" : "$env{DEPS_ROOT}", - "OIIO_PYTHON" : "$env{DEPS_ROOT}/lib/python3.9/site-packages" + "OIIO_PYTHON" : "$env{DEPS_ROOT}/lib/python3.11/site-packages" }, "cacheVariables": { "CMAKE_PREFIX_PATH": "$env{DEPS_ROOT}" @@ -33,16 +34,17 @@ "hidden": true, "inherits": "macos-environment", "environment": { - "PREFIX_PXR" : "${sourceParentDir}/building/macOS/pxr-houdini", - "HOUDINI_INSTALL_DIR" : "/Applications/Houdini/Houdini20.0.751", + "PREFIX_PXR" : "/Applications/MoonRay/building/macOS/pxr-houdini", + "HOUDINI_INSTALL_DIR" : "/Applications/Houdini/Houdini20.5.684", "PXR_LIB_PREFIX" : "$env{HOUDINI_INSTALL_DIR}/Frameworks/Houdini.framework/Versions/Current/Libraries", "PXR_INCLUDE_PREFIX" : "$env{HOUDINI_INSTALL_DIR}/Frameworks/Houdini.framework/Versions/Current/Resources/toolkit/include", "PXR_DEPS_PREFIX" : "$env{DEPS_ROOT}", - "PXR_BOOST_PYTHON_LIB" : "$env{HOUDINI_INSTALL_DIR}/Frameworks/Houdini.framework/Versions/Current/Libraries/libhboost_python39-mt-a64.dylib" + "PXR_BOOST_PYTHON_LIB" : "$env{HOUDINI_INSTALL_DIR}/Frameworks/Houdini.framework/Versions/Current/Libraries/libhboost_python311.dylib" }, "cacheVariables": { "CMAKE_PREFIX_PATH": "$env{DEPS_ROOT};$env{PREFIX_PXR}", - "MOONRAY_USE_HOUDINI": "TRUE" + "MOONRAY_USE_HOUDINI": "TRUE", + "BOOST_PYTHON_COMPONENT_NAME": "python311" } }, { @@ -52,7 +54,7 @@ "binaryDir": "$env{BUILD_DIR}", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release", - "CMAKE_INSTALL_PREFIX": "${sourceParentDir}/installs/openmoonray" + "CMAKE_INSTALL_PREFIX": "/Applications/MoonRay/installs/openmoonray" }, "generator": "Xcode" }, @@ -63,7 +65,7 @@ "binaryDir": "$env{BUILD_DIR}", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release", - "CMAKE_INSTALL_PREFIX": "${sourceParentDir}/installs/openmoonray" + "CMAKE_INSTALL_PREFIX": "/Applications/MoonRay/installs/openmoonray" }, "generator": "Xcode" } diff --git a/building/Rocky9/CMakeLists.txt b/building/Rocky9/CMakeLists.txt index ed551a42..ab8a52bc 100644 --- a/building/Rocky9/CMakeLists.txt +++ b/building/Rocky9/CMakeLists.txt @@ -92,7 +92,7 @@ set(CHAIN embree) ExternalProject_Add(OpenColorIO GIT_REPOSITORY https://github.com/AcademySoftwareFoundation/OpenColorIO - GIT_TAG d1ef24cbf8021f642e42f45f50c2cd4cc77141ce # v2.2.1 + GIT_TAG b35fb73b8674176098d3084deaa9da3d111d72d1 # v2.3.0 INSTALL_DIR ${InstallRoot} CMAKE_ARGS -DOCIO_BUILD_APPS=OFF @@ -205,4 +205,3 @@ ExternalProject_Add(OptiXHeaders DEPENDS ${CHAIN} ) set(CHAIN OptiXHeaders) - diff --git a/building/macOS/CMakeLists.txt b/building/macOS/CMakeLists.txt index 12ef7ce3..030063da 100644 --- a/building/macOS/CMakeLists.txt +++ b/building/macOS/CMakeLists.txt @@ -23,8 +23,17 @@ set(THIS_DIR ${CMAKE_CURRENT_SOURCE_DIR}) # User configurable settings set(InstallRoot ${rootSrcDir}/../../../../installs CACHE FILEPATH "Install root for dependencies") -set(PythonVer 3.9.6 CACHE STRING "Python version (n.m), e.g. 3.6") +set(PythonVer 3.11 CACHE STRING "Python version (n.m), e.g. 3.6") set(PythonRoot /usr CACHE FILEPATH "Location of Python install") +if(DEFINED ENV{HOUDINI_INSTALL_DIR}) + set(_defaultHoudiniInstallDir "$ENV{HOUDINI_INSTALL_DIR}") +elseif(DEFINED ENV{HFS}) + file(REAL_PATH "$ENV{HFS}/../../../../.." _defaultHoudiniInstallDir) +else() + set(_defaultHoudiniInstallDir "/Applications/Houdini/Houdini20.5.684") +endif() +set(HOUDINI_INSTALL_DIR "${_defaultHoudiniInstallDir}" CACHE PATH "Houdini install root") +set(HoudiniPythonRoot "${HOUDINI_INSTALL_DIR}/Frameworks/Python.framework/Versions/${PythonVer}") ExternalProject_Add(Blosc GIT_REPOSITORY https://github.com/Blosc/c-blosc @@ -39,11 +48,11 @@ ExternalProject_Add(Blosc set(CHAIN Blosc) ExternalProject_Add(Boost - URL https://sourceforge.net/projects/boost/files/boost/1.78.0/boost_1_78_0.tar.gz + URL https://sourceforge.net/projects/boost/files/boost/1.82.0/boost_1_82_0.tar.gz UPDATE_COMMAND ./bootstrap.sh --prefix=${InstallRoot} --with-toolset=clang linkflags="-arch ${BOOST_ARCH}" CONFIGURE_COMMAND "" - PATCH_COMMAND patch -p3 -N < ${THIS_DIR}/Boost.patch - BUILD_COMMAND ./b2 install ${JOBS_ARG} --user-config=${THIS_DIR}/user-config.jam --with_python variant=release link=shared threading=multi define=BOOST_UNORDERED_HAVE_PIECEWISE_CONSTRUCT=0 + PATCH_COMMAND patch -p3 -N < ${THIS_DIR}/Boost.patch || true + BUILD_COMMAND ./b2 install ${JOBS_ARG} --user-config=${THIS_DIR}/user-config.jam --with-python python=${PythonVer} variant=release link=shared threading=multi architecture=arm address-model=64 define=BOOST_UNORDERED_HAVE_PIECEWISE_CONSTRUCT=0 BUILD_IN_SOURCE 1 INSTALL_COMMAND "" DEPENDS ${CHAIN} @@ -146,9 +155,10 @@ ExternalProject_Add(OpenVDB set(CHAIN OpenVDB) ExternalProject_Add(Log4CPlus - GIT_REPOSITORY https://github.com/log4cplus/log4cplus - GIT_TAG REL_2_0_5 + URL https://github.com/log4cplus/log4cplus/releases/download/REL_2_0_5/log4cplus-2.0.5.tar.xz PATCH_COMMAND patch -p1 -N < ${THIS_DIR}/log4plus-limit-threads.patch || true + COMMAND find . -name "Makefile.in" -exec touch {} + + COMMAND touch aclocal.m4 configure config.h.in BUILD_IN_SOURCE 1 CONFIGURE_COMMAND ./configure --prefix ${InstallRoot} BUILD_COMMAND make @@ -215,7 +225,7 @@ set(CHAIN embree) ExternalProject_Add(OpenColorIO GIT_REPOSITORY https://github.com/AcademySoftwareFoundation/OpenColorIO - GIT_TAG 056b7b0cb0d087961e9dba75104820e44faf52a1 # v2.0.2 + GIT_TAG b35fb73b8674176098d3084deaa9da3d111d72d1 # v2.3.0 BUILD_COMMAND make ${JOBS_ARG} CMAKE_ARGS -DCMAKE_PREFIX_PATH:PATH=${InstallRoot} @@ -332,11 +342,11 @@ if(NOT NO_USD) -DPXR_ENABLE_PYTHON_SUPPORT=ON -DPXR_USE_PYTHON_3=ON -DPXR_USE_DEBUG_PYTHON=OFF - -DPYTHON_EXECUTABLE=/usr/bin/python3 - -DPYTHON_LIBRARY=/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/lib/libpython3.9.dylib - -DPYTHON_INCLUDE_DIR=/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/Headers + -DPYTHON_EXECUTABLE=${HoudiniPythonRoot}/bin/python${PythonVer} + -DPYTHON_LIBRARY=${HoudiniPythonRoot}/lib/libpython${PythonVer}.dylib + -DPYTHON_INCLUDE_DIR=${HoudiniPythonRoot}/include/python${PythonVer} -DPYTHON_VERSION_MAJOR=3 - -DPYTHON_VERSION_MINOR=9 + -DPYTHON_VERSION_MINOR=11 -DTBB_USE_DEBUG_BUILD=OFF -DPXR_BUILD_TESTS=OFF -DPXR_BUILD_EXAMPLES=OFF @@ -421,4 +431,3 @@ ExternalProject_Add(GLFW DEPENDS ${CHAIN} ) set(CHAIN GLFW) - diff --git a/building/macOS/pxr-houdini/pxrConfig.cmake b/building/macOS/pxr-houdini/pxrConfig.cmake index 28237a87..a639b2d7 100644 --- a/building/macOS/pxr-houdini/pxrConfig.cmake +++ b/building/macOS/pxr-houdini/pxrConfig.cmake @@ -2,7 +2,7 @@ # Modified to use the version of USD with headers in $env{PXR_INCLUDE_PREFIX} # and libs in $env{PXR_LIB_PREFIX}, with dependencies installed to $env{PXR_DEPS_PREFIX} # $env{PXR_BOOST_PYTHON_LIB} must be set to the location of the boost_python so used by USD -# (Houdini names it libhboost_python39...) +# (Houdini names it libhboost_python311...) # Defines the following variables: # PXR_MAJOR_VERSION - Major version number. @@ -17,9 +17,9 @@ get_filename_component(PXR_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) set(PXR_MAJOR_VERSION "0") -set(PXR_MINOR_VERSION "22") +set(PXR_MINOR_VERSION "25") set(PXR_PATCH_VERSION "5") -set(PXR_VERSION "2205") +set(PXR_VERSION "2505") include("${PXR_CMAKE_DIR}/pxrTargets.cmake") set(libs "arch;tf;gf;js;trace;work;plug;vt;ar;kind;sdf;ndr;sdr;pcp;usd;usdGeom;usdVol;usdMedia;usdShade;usdLux;usdRender;usdHydra;usdRi;usdSkel;usdUI;usdUtils;usdPhysics;garch;hf;hio;cameraUtil;pxOsd;glf;hgi;hgiGL;hgiInterop;hd;hdSt;hdx;usdImaging;usdImagingGL;usdRiImaging;usdSkelImaging;usdVolImaging;usdAppUtils;usdviewq") diff --git a/building/macOS/pxr-houdini/pxrTargets-release.cmake b/building/macOS/pxr-houdini/pxrTargets-release.cmake index ae3a89da..485bf292 100644 --- a/building/macOS/pxr-houdini/pxrTargets-release.cmake +++ b/building/macOS/pxr-houdini/pxrTargets-release.cmake @@ -421,12 +421,12 @@ list(APPEND _IMPORT_CHECK_FILES_FOR_usdImagingGL "${_LIB_PREFIX}/libpxr_usdImagi # Import target "usdRiImaging" for configuration "Release" set_property(TARGET usdRiImaging APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) set_target_properties(usdRiImaging PROPERTIES - IMPORTED_LOCATION_RELEASE "${_LIB_PREFIX}/libpxr_usdRiImaging.dylib" - IMPORTED_SONAME_RELEASE "libpxr_usdRiImaging.dylib" + IMPORTED_LOCATION_RELEASE "${_LIB_PREFIX}/libpxr_usdRiPxrImaging.dylib" + IMPORTED_SONAME_RELEASE "libpxr_usdRiPxrImaging.dylib" ) list(APPEND _IMPORT_CHECK_TARGETS usdRiImaging ) -list(APPEND _IMPORT_CHECK_FILES_FOR_usdRiImaging "${_LIB_PREFIX}/libpxr_usdRiImaging.dylib" ) +list(APPEND _IMPORT_CHECK_FILES_FOR_usdRiImaging "${_LIB_PREFIX}/libpxr_usdRiPxrImaging.dylib" ) # Import target "usdSkelImaging" for configuration "Release" set_property(TARGET usdSkelImaging APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) diff --git a/building/macOS/pxr-houdini/pxrTargets.cmake b/building/macOS/pxr-houdini/pxrTargets.cmake index f3cd6feb..af4b3d45 100644 --- a/building/macOS/pxr-houdini/pxrTargets.cmake +++ b/building/macOS/pxr-houdini/pxrTargets.cmake @@ -3,7 +3,7 @@ # Modified to use the version of USD with headers in $env{PXR_INCLUDE_PREFIX} # and libs in $env{PXR_LIB_PREFIX}, with dependencies installed to $env{PXR_DEPS_PREFIX} # $env{PXR_BOOST_PYTHON_LIB} must be set to the location of the boost_python so used by USD -# (Houdini names it libhboost_python39...) +# (Houdini names it libhboost_python311...) if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.6) message(FATAL_ERROR "CMake >= 2.6.0 required") @@ -17,8 +17,8 @@ cmake_policy(VERSION 2.6...3.21) # Commands may need to know the format version. set(CMAKE_IMPORT_FILE_VERSION 1) -SET(HPYTHONLIB $ENV{HOUDINI_INSTALL_DIR}/Frameworks/Python.framework/Versions/3.9/lib/libpython3.9.dylib) -SET(HPYTHONINC $ENV{HOUDINI_INSTALL_DIR}/Frameworks/Python.framework/Versions/3.9/include/python3.9) +SET(HPYTHONLIB $ENV{HOUDINI_INSTALL_DIR}/Frameworks/Python.framework/Versions/3.11/lib/libpython3.11.dylib) +SET(HPYTHONINC $ENV{HOUDINI_INSTALL_DIR}/Frameworks/Python.framework/Versions/3.11/include/python3.11) # Protect against multiple inclusion, which would fail when already imported targets are added once more. set(_targetsDefined) diff --git a/building/macOS/user-config.jam b/building/macOS/user-config.jam index f163655e..84ef0904 100644 --- a/building/macOS/user-config.jam +++ b/building/macOS/user-config.jam @@ -1,6 +1,6 @@ -using python : 3.9 - : "/usr/bin/python3" - : "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/Headers" - : "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/lib" +using python : 3.11 + : "/Applications/Houdini/Houdini20.5.684/Frameworks/Houdini.framework/Versions/Current/Resources/bin/hython" + : "/Applications/Houdini/Houdini20.5.684/Frameworks/Python.framework/Versions/3.11/include/python3.11" + : "/Applications/Houdini/Houdini20.5.684/Frameworks/Python.framework/Versions/3.11/lib" ; using clang : : : -"arch arm64" "-arch arm64" ; diff --git a/docs/Houdini21_macOS_PR_notes.md b/docs/Houdini21_macOS_PR_notes.md new file mode 100644 index 00000000..cbd184f8 --- /dev/null +++ b/docs/Houdini21_macOS_PR_notes.md @@ -0,0 +1,42 @@ +# PR Notes: Houdini 21 macOS Compatibility + +## Reviewer Summary +Adds macOS/Houdini 21 compatibility updates required to build and install OpenMoonRay against Houdini 21 using Houdini-provided USD/PXR and Python 3.11. This includes Boost 1.82 alignment, dependency fetch/build fixes, Houdini USD library naming compatibility, and source-driven Houdini plugin payload installation. This branch validates build/install/selectability in Solaris, but does not resolve native DWA material authoring/render behavior in Houdini 21. + +## Scope +- Build/dependency/install compatibility for Houdini 21 on macOS. +- No intended look/scene/rendering behavior change claim. +- No claim that native DWA Solaris authoring is fixed. + +## Validated vs Not Resolved +| Area | Status | Notes | +|---|---|---| +| Dependency build | Validated | Build path completes with current compatibility adjustments. | +| Main configure/build | Validated | Houdini-target integration build path succeeds. | +| Install | Validated | Install path completes and plugin payload is install-driven. | +| Solaris renderer selectability | Validated | MoonRay selectable in Solaris viewport. | +| Native DWA material influence in Material Library / mtlx subnet | Not resolved | Native DWA nodes do not reliably drive visible render changes in simple test. | +| Light live-update behavior (`spread` example) | Not resolved | Manual IPR update required in observed tests. | +| Dome light with texture | Not resolved | Not working in current tested branch state. | + +## Temporary Dependency Note +This branch may temporarily depend on a `moonray_dcc_plugins` fork/branch for Houdini 21 Python 3.11 payload alignment. +Current local kickoff pointer: +- branch: `houdini21-py311-kickoff` +- base commit: `eda4e57` (before additional fork commits) + +Current intent for that fork is minimal: +- install-driven `python3.11libs` payload support +- required Houdini plugin payload continuity (`otls`, `soho`, `toolbar`, integration files) +- no broad OTL/authoring semantic rewrite + +This fork kickoff is not fully stable as a native DWA workflow fix. Native DWA material behavior remains unresolved. + +## Runtime Observation Captured During Simple DWA Test +- `{dispatcherExit} Message Dispatcher [libcomputation_progmcrt.dylib] : exiting : reason is 'socket was disconnected'` +- `{clientSocketError} SocketPeer::receive: Bad file descriptor` +- `signal ... 15` + +## Reviewer Guidance +- Evaluate this PR primarily as compatibility/build/install integration work. +- Treat native DWA Solaris authoring/runtime issues as follow-up work outside this PR closure. diff --git a/docs/Houdini21_macOS_changes.md b/docs/Houdini21_macOS_changes.md new file mode 100644 index 00000000..2f3254f0 --- /dev/null +++ b/docs/Houdini21_macOS_changes.md @@ -0,0 +1,78 @@ +# Houdini 21 macOS Compatibility Changes + +## Summary +Adds macOS/Houdini 21 compatibility updates required to build and install OpenMoonRay against Houdini 21 using Houdini-provided USD/PXR and Python 3.11. This includes Boost 1.82 alignment, dependency fetch/build fixes, Houdini USD library naming compatibility, and source-driven Houdini plugin payload installation. This branch validates build/install/selectability in Solaris, but does not resolve native DWA material authoring/render behavior in Houdini 21. + +Compatibility and integration improved in this branch. Native DWA authoring/runtime behavior in Solaris remains unresolved. + +## Tested Environment +- macOS Tahoe +- Xcode 26.0.1 class toolchain flow +- Houdini 21 series validation target: +- `21.0.680` (original PR target) +- `21.0.671` (current local validation path) + +## Build/Dependency Changes +- Boost dependency alignment moved to `1.82.0`. +- Boost patch command made tolerant of already-applied state (`patch ... || true`). +- `log4cplus` dependency fetch moved from git tag checkout to release tarball: +- `https://github.com/log4cplus/log4cplus/releases/download/REL_2_0_5/log4cplus-2.0.5.tar.xz` +- `log4cplus` reproducible build workaround added before configure: +- `touch Makefile.in` +- `touch aclocal.m4 configure config.h.in` + +These are build reproducibility fixes, not renderer/material behavior fixes. + +## Python 3.11 Alignment +- Houdini 21 Python 3.11 include/lib/executable alignment was applied for USD/PXR integration in this branch. +- `building/macOS/user-config.jam` was moved from Python 3.9 config to Python 3.11 config for this compatibility track. +- Current pathing is validated for local Houdini 21 installs and should be parameterized before upstream hardening. + +## Houdini USD/PXR Pathing +- Houdini USD integration uses Houdini-provided PXR paths and library resolution. +- Compatibility mapping included: +- `libpxr_usdRiImaging.dylib` -> `libpxr_usdRiPxrImaging.dylib` +- PXR metadata compatibility updates for Houdini 21 USD packaging were applied in `pxr-houdini` CMake metadata. + +## Install Payload Changes +Source-driven install path includes Houdini plugin payload required for this branch validation: +- `otls` +- `soho` +- `python3.11libs` +- `toolbar` (where present in plugin payload layout) +- integration files under Houdini plugin tree + +Manual post-install copying is not the intended validation path for this branch. + +## Validation Results +- Dependency build: pass +- Main configure/build: pass +- Install: pass +- MoonRay renderer selectable in Solaris viewport: pass + +## DWA Material Test Status +Status: unresolved in current build. + +Observed behavior in Solaris Material Library / mtlx subnet: +- Native DWA nodes are visible/creatable, but do not reliably drive visible render changes in the simple test. +- Control path through `mtlxstandard_surface` can influence render, but this is not a native DWA workflow fix. + +Observed runtime/disconnect signal during simple DWA tests: +- `{dispatcherExit} Message Dispatcher [libcomputation_progmcrt.dylib] : exiting : reason is 'socket was disconnected'` +- `{clientSocketError} SocketPeer::receive: Bad file descriptor` +- `signal ... 15` + +## Known Unresolved Issues +- Native DWA material authoring/render influence in Solaris remains unresolved for this branch. +- Some light parameter edits (for example `spread`) require manual IPR refresh and do not always live-update automatically. +- Dome light textured workflow is currently not working in this tested branch state. + +## Notes For Reviewers +- This branch should be reviewed as a Houdini 21 macOS build/install compatibility update. +- Do not treat native DWA node visibility/selectability as evidence that native DWA material workflow is fixed. +- No claim is made that MaterialX/native DWA Solaris authoring is production-ready in this branch. + +## Future Cleanup / Upstreaming Notes +- Parameterize local Houdini/Python paths before upstream merge hardening. +- Keep compatibility/build fixes separated from shader authoring/runtime behavior work. +- Track native DWA Solaris authoring/runtime closure as a follow-up effort. diff --git a/moonray/hydra/hdMoonray b/moonray/hydra/hdMoonray index 6366b993..f371e9ad 160000 --- a/moonray/hydra/hdMoonray +++ b/moonray/hydra/hdMoonray @@ -1 +1 @@ -Subproject commit 6366b993e276708ee4289e236fccef47f3b89d30 +Subproject commit f371e9ad9d5cd2285438d54ae659e5c41a834c2f diff --git a/moonray/hydra/moonray_sdr_plugins b/moonray/hydra/moonray_sdr_plugins index 77a0ed6d..3c7f9b65 160000 --- a/moonray/hydra/moonray_sdr_plugins +++ b/moonray/hydra/moonray_sdr_plugins @@ -1 +1 @@ -Subproject commit 77a0ed6dd3ff9389d46d0ca9e3471a56335b875a +Subproject commit 3c7f9b65df9fb8f05f037e2a9cb2aa625e434113 diff --git a/moonray/moonray b/moonray/moonray index 2343dde0..e403e802 160000 --- a/moonray/moonray +++ b/moonray/moonray @@ -1 +1 @@ -Subproject commit 2343dde0bae2f70141b1004371282405e2d82215 +Subproject commit e403e8021ca760580d09a9a648a1fd9731a27de2 diff --git a/moonray/moonray_dcc_plugins b/moonray/moonray_dcc_plugins index eda4e578..a8648253 160000 --- a/moonray/moonray_dcc_plugins +++ b/moonray/moonray_dcc_plugins @@ -1 +1 @@ -Subproject commit eda4e578a2adee2cd7478035e927e4b69c4f91bd +Subproject commit a86482535ddd6ba955462b1b0017bc2ed84e38c4 diff --git a/moonray/moonshine b/moonray/moonshine index 32a6e649..5bec7a4b 160000 --- a/moonray/moonshine +++ b/moonray/moonshine @@ -1 +1 @@ -Subproject commit 32a6e64967677008bddf05ea2fc5fe5533c0f47b +Subproject commit 5bec7a4be722894ba70f22760d194c862eb67280 diff --git a/moonray/moonshine_usd b/moonray/moonshine_usd index d3452328..495000e6 160000 --- a/moonray/moonshine_usd +++ b/moonray/moonshine_usd @@ -1 +1 @@ -Subproject commit d3452328c52fa60d891b4d5d7fbd18a14d9ba632 +Subproject commit 495000e6fe8e90084c9eb622c7a054958ddf9be2 diff --git a/moonray/render_profile_viewer b/moonray/render_profile_viewer index 2e68fc1a..5b183d40 160000 --- a/moonray/render_profile_viewer +++ b/moonray/render_profile_viewer @@ -1 +1 @@ -Subproject commit 2e68fc1aa618b545646ac7efb091fff38f347e1f +Subproject commit 5b183d40e45ca111092398b65114a045ae26e3b7 diff --git a/moonray/scene_rdl2 b/moonray/scene_rdl2 index b1309584..b7aa377e 160000 --- a/moonray/scene_rdl2 +++ b/moonray/scene_rdl2 @@ -1 +1 @@ -Subproject commit b1309584b7340bc665fdbf0c2519e69b41b3a9f3 +Subproject commit b7aa377ee59b6743806f9d3ba88f4e93cd91f317 diff --git a/scripts/Rocky9/setupHoudini.sh b/scripts/Rocky9/setupHoudini.sh index c5b09444..0e959bea 100644 --- a/scripts/Rocky9/setupHoudini.sh +++ b/scripts/Rocky9/setupHoudini.sh @@ -1,6 +1,6 @@ omr_install_dir=/opt/MoonRay/installs/openmoonray -# save/restore PYTHONPATH, since Houdini seems to reject python3.9 +# save/restore PYTHONPATH, since Houdini runtime can be sensitive to non-Houdini site-packages OLDPP=${PYTHONPATH} source ${omr_install_dir}/scripts/setup.sh export PYTHONPATH=${OLDPP} diff --git a/scripts/macOS/setupHoudini.sh b/scripts/macOS/setupHoudini.sh index 68ac25fb..8db1be0d 100644 --- a/scripts/macOS/setupHoudini.sh +++ b/scripts/macOS/setupHoudini.sh @@ -1,14 +1,112 @@ omr_install_dir=/Applications/MoonRay/installs/openmoonray +houdini_install_dir=${HOUDINI_INSTALL_DIR:-/Applications/Houdini/Houdini20.5.584} +houdini_fallback="${houdini_install_dir}/Frameworks/Houdini.framework/Versions/Current/Resources/houdini" -# save/restore PYTHONPATH, since Houdini seems to reject python3.9 +# save/restore PYTHONPATH, since Houdini runtime can be sensitive to non-Houdini site-packages OLDPP=${PYTHONPATH} -source ${omr_install_dir}/scripts/setup.sh +if [ -f "${omr_install_dir}/scripts/setup.sh" ]; then + source "${omr_install_dir}/scripts/setup.sh" +fi export PYTHONPATH=${OLDPP} -export REL=${omr_install_dir} -export RDL2_DSO_PATH=${omr_install_dir}/rdl2dso.proxy:${omr_install_dir}/rdl2dso -export MOONRAY_CLASS_PATH=${omr_install_dir}/shader_json -export ARRAS_SESSION_PATH=${omr_install_dir}/sessions -PXR_PLUGINPATH_NAME=${omr_install_dir}/plugin/pxr -#export HOUDINI_DSO_ERROR=5 -export HOUDINI_PATH=/Applications/Houdini/Houdini20.0.751/Frameworks/Houdini.framework/Versions/Current/Resources/houdini:${omr_install_dir}/houdini/:${omr_install_dir}/plugin/houdini +export REL="${omr_install_dir}" +export RDL2_DSO_PATH="${omr_install_dir}/rdl2dso.proxy:${omr_install_dir}/rdl2dso" +export MOONRAY_CLASS_PATH="${omr_install_dir}/shader_json" +export ARRAS_SESSION_PATH="${omr_install_dir}/sessions" + +prepend_unique_path() { + local add_path="$1" + local current="${2:-}" + case ":${current}:" in + *":${add_path}:"*) echo "${current}" ;; + *) + if [ -n "${current}" ]; then + echo "${add_path}:${current}" + else + echo "${add_path}" + fi + ;; + esac +} + +prepend_existing_path() { + local add_path="$1" + local current="${2:-}" + if [ -d "${add_path}" ]; then + prepend_unique_path "${add_path}" "${current}" + else + echo "${current}" + fi +} + +resolve_ocio_package_value() { + local raw_value="$1" + local value="${raw_value}" + + case "${value}" in + \${OCIO-*}) + value="${value#\$\{OCIO-}" + value="${value%\}}" + ;; + esac + + value="${value//\$HOME/${HOME}}" + case "${value}" in + "~/"*) value="${HOME}/${value#~/}" ;; + esac + echo "${value}" +} + +set_ocio_from_houdini_packages() { + if [ -n "${OCIO:-}" ]; then + return + fi + + local package_dirs="${HOUDINI_PACKAGE_DIR:-${HOME}/Library/Preferences/houdini/20.5/packages:${houdini_install_dir}/Frameworks/Houdini.framework/Versions/Current/Resources/packages}" + local package_dir + while IFS= read -r package_dir; do + if [ ! -d "${package_dir}" ]; then + continue + fi + local package_file + while IFS= read -r package_file; do + if [ ! -f "${package_file}" ] || ! grep -q '"OCIO"' "${package_file}"; then + continue + fi + local raw_value + raw_value="$(sed -nE 's/.*"OCIO"[[:space:]]*:[[:space:]]*"([^"]+)".*/\1/p' "${package_file}" | head -1)" + if [ -z "${raw_value}" ]; then + continue + fi + local candidate + candidate="$(resolve_ocio_package_value "${raw_value}")" + if [ -f "${candidate}" ]; then + export OCIO="$(realpath "${candidate}")" + return + fi + done < <(find "${package_dir}" -maxdepth 1 -type f -name '*.json' 2>/dev/null) + done < <(printf '%s\n' "${package_dirs}" | tr ':' '\n') +} + +# Houdini loads package files itself, but standalone MoonRay tools launched from +# this shell do not. Mirror a package-authored OCIO default without overriding an +# explicitly supplied OCIO so husk/hd_usd2rdl use the same color config as Houdini. +set_ocio_from_houdini_packages + +# Preserve any existing USD plugin search path while guaranteeing MoonRay plugin location is present. +export PXR_PLUGINPATH_NAME="$(prepend_unique_path "${omr_install_dir}/plugin/pxr" "${PXR_PLUGINPATH_NAME}")" +export PXR_PLUGIN_PATH="$(prepend_unique_path "${omr_install_dir}/plugin/pxr" "${PXR_PLUGIN_PATH}")" +export PXR_PLUGINPATH_NAME="${PXR_PLUGINPATH_NAME%:}" +export PXR_PLUGIN_PATH="${PXR_PLUGIN_PATH%:}" +export PYTHONPATH="$(prepend_existing_path "${omr_install_dir}/lib/python" "${PYTHONPATH}")" + +# Prefer layering MoonRay onto an existing Houdini env (from houdini_setup). +# If that wasn't sourced yet, fall back to the configured Houdini resources path. +if [ -n "${HOUDINI_PATH}" ]; then + export HOUDINI_PATH="$(prepend_existing_path "${omr_install_dir}/plugin/houdini" "${HOUDINI_PATH}")" + export HOUDINI_PATH="$(prepend_existing_path "${omr_install_dir}/houdini" "${HOUDINI_PATH}")" +else + export HOUDINI_PATH="${houdini_fallback}:&" + export HOUDINI_PATH="$(prepend_existing_path "${omr_install_dir}/plugin/houdini" "${HOUDINI_PATH}")" + export HOUDINI_PATH="$(prepend_existing_path "${omr_install_dir}/houdini" "${HOUDINI_PATH}")" +fi diff --git a/scripts/setup.sh b/scripts/setup.sh index 999594db..d1124efe 100644 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -8,10 +8,19 @@ omr_root="$(realpath ${sourcedir}/..)" # Walk up to find the top-level install dir where the dependencies are installed install_root=${omr_root} -while [ "$(basename ${install_root})" != "installs" ] +while [ "$(basename ${install_root})" != "installs" ] && [ "${install_root}" != "/" ] do install_root=$(dirname ${install_root}) done +if [ "$(basename ${install_root})" != "installs" ]; then + sibling_installs="$(dirname "$(dirname "${omr_root}")")/installs" + if [ -d "${sibling_installs}" ]; then + install_root="$(realpath "${sibling_installs}")" + else + echo "Warning: could not find parent installs directory for ${omr_root}; using ${omr_root}" + install_root=${omr_root} + fi +fi echo "Found install root at ${install_root}" echo "Setting up release in ${omr_root}" @@ -19,8 +28,35 @@ echo "Setting up release in ${omr_root}" # NB required for Arras to function (it needs to find execComp) export PATH=${omr_root}/bin:${PATH} -# need python modules for the USD interface and for the RATS tests -export PYTHONPATH=${install_root}/lib/python:/usr/local/lib/python:${install_root}/lib64/python3.9/site-packages/:${PYTHONPATH} +prepend_unique_path() { + add_path="$1" + current="${2:-}" + case ":${current}:" in + *":${add_path}:"*) echo "${current}" ;; + *) + if [ -n "${current}" ]; then + echo "${add_path}:${current}" + else + echo "${add_path}" + fi + ;; + esac +} + +prepend_existing_path() { + add_path="$1" + current="${2:-}" + if [ -d "${add_path}" ]; then + prepend_unique_path "${add_path}" "${current}" + else + echo "${current}" + fi +} + +# Need Python modules for the USD interface and for the RATS tests. Only add +# paths that exist so source-tree setup does not inject stale system locations. +export PYTHONPATH="$(prepend_existing_path "${omr_root}/lib/python" "${PYTHONPATH}")" +export PYTHONPATH="$(prepend_existing_path "${omr_root}/lib64/python3.11/site-packages" "${PYTHONPATH}")" # tell moonray where to find dsos @@ -43,7 +79,11 @@ export PXR_PLUGIN_PATH=${omr_root}/plugin/pxr:${PXR_PLUGIN_PATH} # for legacy DW # create shader descriptions if they don't exist if [ ! -d "${omr_root}/shader_json" ] then - echo "Building shader descriptions..." - ${omr_root}/bin/rdl2_json_exporter --out ${omr_root}/shader_json/ --sparse - echo "...done" + if [ -x "${omr_root}/bin/rdl2_json_exporter" ]; then + echo "Building shader descriptions..." + ${omr_root}/bin/rdl2_json_exporter --out ${omr_root}/shader_json/ --sparse + echo "...done" + else + echo "Warning: ${omr_root}/bin/rdl2_json_exporter not found; shader descriptions were not generated" + fi fi