The following is a simple example of building MaterialX from within Python. It assumes each step will be run once for cloning, and the build step done as many times as needed. A test of the build is done by running a MaterialX executable.
Note that this is example is written for a Windows build. Suitable build setup can be done for Linux and Mac as well.
Use OS and subprocess to run commands. Cache the root directory so we can return to it as needed
import os
import subprocess
import sys
rootdir = os.getcwd()
print('Root folder: ', rootdir)
Root folder: d:\Work\materialx\buildMaterialX
def printLog(logfile):
f = open(logfile, 'r')
print(f.read())
f.close()
This will clone the ASWF repo into a subfolder called MaterialX:
print('Cloning MaterialX...')
os.chdir(rootdir)
result = os.system('git clone https://github.com/AcademySoftwareFoundation/MaterialX.git > clone.log 2>&1')
print('Finished clone: %s' % ('Success' if result == 0 else 'Failed'))
if result != 0:
printLog('clone.log')
Cloning MaterialX... Finished clone: Failed fatal: destination path 'MaterialX' already exists and is not an empty directory.
Go to the MaterialX folder and get the submodules
os.chdir(rootdir)
os.chdir('MaterialX')
print('Get submodules...')
result = os.system('git submodule update --init --recursive > submodule.log 2>&1')
print('Finished getting submodules:', result)
if result != 0:
printLog('submodule.log')
Get submodules... Finished getting submodules: 0
os.chdir(rootdir)
os.chdir('MaterialX')
if not os.path.exists('build'):
os.mkdir('build')
os.chdir('build')
print('Build folder is: ', os.getcwd())
Build folder is: d:\Work\materialx\buildMaterialX\MaterialX\build
# Pre-build setup for Linux
if sys.platform == 'linux':
os.system('sudo apt-get update')
os.system('sudo apt-get install xorg-dev mesa-utils')
Go to the build folder and run CMake to set up build configuration.
os.chdir(rootdir)
os.chdir('MaterialX')
os.chdir('build')
# Build setup
buildSetupCmd = 'cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DMATERIALX_BUILD_VIEWER=ON -DMATERIALX_BUILD_GRAPH_EDITOR=ON -DMATERIALX_BUILD_PYTHON=ON -DMATERIALX_WARNINGS_AS_ERRORS=ON'
# Check the current OS for build setup options
osOptions = ''
if sys.platform == 'win32':
osOptions = ' -G "Visual Studio 16 2019" -A "x64" -DCMAKE_BUILD_TYPE=RelWithDebInfo '
# else check if linux
elif sys.platform == 'linux':
osOptions = ''
else:
osOptions = ''
result = os.system(buildSetupCmd + osOptions + ' -S .. > buildsetup.log 2>&1')
print('Finished build setup: %s' % ('Success' if result == 0 else 'Failed'))
printLog('buildsetup.log')
Finished build setup: Success -- Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.19045. -- Setting namespace to 'MaterialX_v1_38_9' -- NanoGUI v0.2.0 -- NanoGUI: using OpenGL backend. -- NanoGUI: building static library. -- Using Win32 for window creation -- NanoGUI: not building the Python plugin. CMake Deprecation Warning at source/MaterialXGraphEditor/External/Glfw/CMakeLists.txt:1 (cmake_minimum_required): Compatibility with CMake < 3.5 will be removed from a future version of CMake. Update the VERSION argument <min> value or use a ...<max> suffix to tell CMake that the project does not need compatibility with older versions. -- Using Win32 for window creation CMake Deprecation Warning at source/PyMaterialX/External/PyBind11/CMakeLists.txt:8 (cmake_minimum_required): Compatibility with CMake < 3.5 will be removed from a future version of CMake. Update the VERSION argument <min> value or use a ...<max> suffix to tell CMake that the project does not need compatibility with older versions. -- pybind11 v2.10.4 CMake Warning (dev) at source/PyMaterialX/External/PyBind11/tools/FindPythonLibsNew.cmake:98 (find_package): Policy CMP0148 is not set: The FindPythonInterp and FindPythonLibs modules are removed. Run "cmake --help-policy CMP0148" for policy details. Use the cmake_policy command to set the policy and suppress this warning. Call Stack (most recent call first): source/PyMaterialX/External/PyBind11/tools/pybind11Tools.cmake:50 (find_package) source/PyMaterialX/External/PyBind11/tools/pybind11Common.cmake:180 (include) source/PyMaterialX/External/PyBind11/CMakeLists.txt:208 (include) This warning is for project developers. Use -Wno-dev to suppress it. -- Configuring done (0.5s) -- Generating done (2.1s) -- Build files have been written to: D:/Work/materialx/buildMaterialX/MaterialX/build
os.chdir(rootdir)
os.chdir('MaterialX')
os.chdir('build')
result = os.system('cmake --build . --target install --config RelWithDebInfo > build.log 2>&1')
print('Finished build: %s' % ('Success' if result == 0 else 'Failed'))
printLog('build.log')
Finished build: Success
Microsoft (R) Build Engine version 16.11.2+f32259642 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.
glfw_objects.vcxproj -> D:\Work\materialx\buildMaterialX\MaterialX\build\source\MaterialXView\external\NanoGUI\ext\glfw\src\glfw_objects.dir\RelWithDebInfo\glfw_objects.lib
MaterialXCore.vcxproj -> D:\Work\materialx\buildMaterialX\MaterialX\build\lib\RelWithDebInfo\MaterialXCore.lib
MaterialXFormat.vcxproj -> D:\Work\materialx\buildMaterialX\MaterialX\build\lib\RelWithDebInfo\MaterialXFormat.lib
MaterialXGenShader.vcxproj -> D:\Work\materialx\buildMaterialX\MaterialX\build\lib\RelWithDebInfo\MaterialXGenShader.lib
...
PyMaterialXGenMsl.vcxproj -> D:\Work\materialx\buildMaterialX\MaterialX\build\bin\RelWithDebInfo\PyMaterialXGenMsl.cp310-win_amd64.pyd
PyMaterialXGenOsl.vcxproj -> D:\Work\materialx\buildMaterialX\MaterialX\build\bin\RelWithDebInfo\PyMaterialXGenOsl.cp310-win_amd64.pyd
PyMaterialXRender.vcxproj -> D:\Work\materialx\buildMaterialX\MaterialX\build\bin\RelWithDebInfo\PyMaterialXRender.cp310-win_amd64.pyd
PyMaterialXRenderGlsl.vcxproj -> D:\Work\materialx\buildMaterialX\MaterialX\build\bin\RelWithDebInfo\PyMaterialXRenderGlsl.cp310-win_amd64.pyd
PyMaterialXRenderOsl.vcxproj -> D:\Work\materialx\buildMaterialX\MaterialX\build\bin\RelWithDebInfo\PyMaterialXRenderOsl.cp310-win_amd64.pyd
1>
-- Install configuration: "RelWithDebInfo"
-- Up-to-date: D:/Work/materialx/buildMaterialX/MaterialX/build/installed/./LICENSE
-- Up-to-date: D:/Work/materialx/buildMaterialX/MaterialX/build/installed/./CHANGELOG.md
-- Up-to-date: D:/Work/materialx/buildMaterialX/MaterialX/build/installed/./README.md
...
-- Up-to-date: D:/Work/materialx/buildMaterialX/MaterialX/build/installed/python/MaterialX/PyMaterialXRenderOsl.lib
-- Up-to-date: D:/Work/materialx/buildMaterialX/MaterialX/build/installed/python/MaterialX/PyMaterialXRenderOsl.cp310-win_amd64.pyd
running install
D:\Work\materialx\buildMaterialX\.venv\lib\site-packages\setuptools\command\install.py:34: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.
warnings.warn(
D:\Work\materialx\buildMaterialX\.venv\lib\site-packages\setuptools\command\easy_install.py:144: EasyInstallDeprecationWarning: easy_install command is deprecated. Use build and pip and other standards-based tools.
warnings.warn(
running bdist_egg
running egg_info
writing MaterialX.egg-info\PKG-INFO
writing dependency_links to MaterialX.egg-info\dependency_links.txt
writing top-level names to MaterialX.egg-info\top_level.txt
reading manifest file 'MaterialX.egg-info\SOURCES.txt'
writing manifest file 'MaterialX.egg-info\SOURCES.txt'
installing library code to build\bdist.win-amd64\egg
running install_lib
running build_py
creating build
creating build\lib
creating build\lib\MaterialX
copying MaterialX\colorspace.py -> build\lib\MaterialX
copying MaterialX\datatype.py -> build\lib\MaterialX
copying MaterialX\main.py -> build\lib\MaterialX
copying MaterialX\__init__.py -> build\lib\MaterialX
copying MaterialX\MANIFEST.in -> build\lib\MaterialX
copying MaterialX\PyMaterialXCore.cp310-win_amd64.pyd -> build\lib\MaterialX
copying MaterialX\PyMaterialXCore.lib -> build\lib\MaterialX
copying MaterialX\PyMaterialXFormat.cp310-win_amd64.pyd -> build\lib\MaterialX
copying MaterialX\PyMaterialXFormat.lib -> build\lib\MaterialX
copying MaterialX\PyMaterialXGenGlsl.cp310-win_amd64.pyd -> build\lib\MaterialX
copying MaterialX\PyMaterialXGenGlsl.lib -> build\lib\MaterialX
...
copying build\lib\MaterialX\PyMaterialXRenderOsl.cp310-win_amd64.pyd -> build\bdist.win-amd64\egg\MaterialX
copying build\lib\MaterialX\PyMaterialXRenderOsl.lib -> build\bdist.win-amd64\egg\MaterialX
creating build\bdist.win-amd64\egg\MaterialX\_scripts
copying build\lib\MaterialX\_scripts\README.md -> build\bdist.win-amd64\egg\MaterialX\_scripts
copying build\lib\MaterialX\_scripts\__init__.py -> build\bdist.win-amd64\egg\MaterialX\_scripts
copying build\lib\MaterialX\__init__.py -> build\bdist.win-amd64\egg\MaterialX
byte-compiling build\bdist.win-amd64\egg\MaterialX\colorspace.py to colorspace.cpython-310.pyc
byte-compiling build\bdist.win-amd64\egg\MaterialX\datatype.py to datatype.cpython-310.pyc
byte-compiling build\bdist.win-amd64\egg\MaterialX\main.py to main.cpython-310.pyc
byte-compiling build\bdist.win-amd64\egg\MaterialX\_scripts\__init__.py to __init__.cpython-310.pyc
byte-compiling build\bdist.win-amd64\egg\MaterialX\__init__.py to __init__.cpython-310.pyc
creating build\bdist.win-amd64\egg\EGG-INFO
copying MaterialX.egg-info\PKG-INFO -> build\bdist.win-amd64\egg\EGG-INFO
copying MaterialX.egg-info\SOURCES.txt -> build\bdist.win-amd64\egg\EGG-INFO
copying MaterialX.egg-info\dependency_links.txt -> build\bdist.win-amd64\egg\EGG-INFO
copying MaterialX.egg-info\not-zip-safe -> build\bdist.win-amd64\egg\EGG-INFO
copying MaterialX.egg-info\top_level.txt -> build\bdist.win-amd64\egg\EGG-INFO
writing build\bdist.win-amd64\egg\EGG-INFO\native_libs.txt
creating 'dist\MaterialX-1.38.9-py3.10.egg' and adding 'build\bdist.win-amd64\egg' to it
removing 'build\bdist.win-amd64\egg' (and everything under it)
Processing MaterialX-1.38.9-py3.10.egg
removing 'd:\work\materialx\buildmaterialx\.venv\lib\site-packages\MaterialX-1.38.9-py3.10.egg' (and everything under it)
creating d:\work\materialx\buildmaterialx\.venv\lib\site-packages\MaterialX-1.38.9-py3.10.egg
Extracting MaterialX-1.38.9-py3.10.egg to d:\work\materialx\buildmaterialx\.venv\lib\site-packages
MaterialX 1.38.9 is already the active version in easy-install.pth
Installed d:\work\materialx\buildmaterialx\.venv\lib\site-packages\materialx-1.38.9-py3.10.egg
Processing dependencies for MaterialX==1.38.9
Finished processing dependencies for MaterialX==1.38.9
running clean
removing 'build\lib' (and everything under it)
removing 'build\bdist.win-amd64' (and everything under it)
'build\scripts-3.10' does not exist -- can't clean it
removing 'build'
Run a few tests to check that the build was successful:
# Runr the generateshader.py script on one of the example materials
os.chdir(rootdir)
os.chdir('MaterialX')
result = os.system('python python/Scripts/generateShader.py resources/Materials/Examples/StandardSurface/standard_surface_glass_tinted.mtlx > genshader.log 2>&1')
printLog('genshader.log')
---------- Generate code for file: resources/Materials/Examples/StandardSurface/standard_surface_glass_tinted.mtlx -------------------- - Set up CMS ... - Set up Units ... - Shader output path: d:\Work\materialx\buildMaterialX\MaterialX\resources\Materials\Examples\StandardSurface -- Generate code for node: GlassTinted --- Wrote pixel shader to: d:\Work\materialx\buildMaterialX\MaterialX\resources\Materials\Examples\StandardSurface/GlassTinted.glsl.frag --- Wrote vertex shader to: d:\Work\materialx\buildMaterialX\MaterialX\resources\Materials\Examples\StandardSurface/GlassTinted.glsl.vert --- Validation passed for node: GlassTinted
# Run the MaterialX Editor from the install location
os.chdir(rootdir)
cmd = 'MaterialX/build/installed/bin/MaterialXGraphEditor.exe'
if os.path.exists(cmd):
result = subprocess.Popen([cmd, '-c 1'], stdout = subprocess.PIPE)
else:
print('MaterialXGraphEditor.exe not found')