diff --git a/cmake/test.cmake b/cmake/test.cmake index 2ece580db2..933faf57f2 100644 --- a/cmake/test.cmake +++ b/cmake/test.cmake @@ -22,6 +22,7 @@ endfunction() # PYTHON_SCRIPT - Python script file to execute; should exit with an # appropriate exitcode to indicate success or failure. # WORKING_DIRECTORY - Directory from which the test executable will be called. +# MODULE_PATH - Value of the MAYA_MODULE_PATH env var # COMMAND - Command line to execute as a test # NO_STANDALONE_INIT - Only allowable with PYTHON_MODULE or # PYTHON_COMMAND. With those modes, this @@ -65,9 +66,9 @@ function(mayaUsd_add_test test_name) # ----------------- cmake_parse_arguments(PREFIX - "NO_STANDALONE_INIT;INTERACTIVE" # options - "PYTHON_MODULE;PYTHON_COMMAND;PYTHON_SCRIPT;WORKING_DIRECTORY" # one_value keywords - "COMMAND;ENV" # multi_value keywords + "NO_STANDALONE_INIT;INTERACTIVE" # options + "PYTHON_MODULE;PYTHON_COMMAND;PYTHON_SCRIPT;WORKING_DIRECTORY;MODULE_PATH" # one_value keywords + "COMMAND;ENV" # multi_value keywords ${ARGN} ) @@ -186,226 +187,319 @@ finally: # ----------------- # 3) Set up environ # ----------------- + if (PREFIX_MODULE_PATH) + # With MAYA_MODULE_PATH: + # + # We expect the module path to do the bulk of the env setting. We might + # need a tweak or two to add local test paths and libs. + set(ALL_PATH_VARS + PYTHONPATH + ) - set(ALL_PATH_VARS - PYTHONPATH - MAYA_PLUG_IN_PATH - MAYA_SCRIPT_PATH - XBMLANGPATH - ${PXR_OVERRIDE_PLUGINPATH_NAME} - PXR_MTLX_STDLIB_SEARCH_PATHS - ) + if(IS_WINDOWS) + # Put path at the front of the list of env vars. + list(INSERT ALL_PATH_VARS 0 + PATH + ) + else() + list(APPEND ALL_PATH_VARS + LD_LIBRARY_PATH + ) + endif() - if(IS_WINDOWS) - # Put path at the front of the list of env vars. - list(INSERT ALL_PATH_VARS 0 - PATH - ) - list(APPEND ALL_PATH_VARS - PXR_USD_WINDOWS_DLL_PATH - ) - else() - list(APPEND ALL_PATH_VARS - LD_LIBRARY_PATH - ) - endif() + # Set initial empty values for all path vars + foreach(pathvar ${ALL_PATH_VARS}) + set(MAYAUSD_VARNAME_${pathvar}) + endforeach() - # Set initial empty values for all path vars - foreach(pathvar ${ALL_PATH_VARS}) - set(MAYAUSD_VARNAME_${pathvar}) - endforeach() + if(IS_WINDOWS) + list(APPEND MAYAUSD_VARNAME_PATH "${CMAKE_INSTALL_PREFIX}/lib/gtest") + list(APPEND MAYAUSD_VARNAME_PATH "${MAYA_LOCATION}/bin") + elseif(IS_LINUX) + if(PREFIX_COMMAND) + # Necessary for tests like DiffCore to find python lib since the test + # is an exectuable and running on its own (not with maya/mayapy). + # See DYLD_LIBRARY_PATH case below. + list(APPEND MAYAUSD_VARNAME_LD_LIBRARY_PATH "${MAYA_LOCATION}/lib") + endif() + endif() + + # NOTE - we prefix varnames with "MAYAUSD_VARNAME_" just to make collision + # with some existing var less likely - if(IS_WINDOWS) - list(APPEND MAYAUSD_VARNAME_PATH "${CMAKE_INSTALL_PREFIX}/lib/gtest") - list(APPEND MAYAUSD_VARNAME_PATH "${MAYA_LOCATION}/bin") - elseif(IS_LINUX) - if(PREFIX_COMMAND) - # Necessary for tests like DiffCore to find python lib since the test - # is an exectuable and running on its own (not with maya/mayapy). - # See DYLD_LIBRARY_PATH case below. - list(APPEND MAYAUSD_VARNAME_LD_LIBRARY_PATH "${MAYA_LOCATION}/lib") + if(IS_WINDOWS AND DEFINED ENV{PYTHONHOME}) + # If the environment contains a PYTHONHOME, also set the path to + # that folder so that we can find the python DLLs. + list(APPEND MAYAUSD_VARNAME_PATH $ENV{PYTHONHOME}) + if(IS_WINDOWS) + list(APPEND MAYAUSD_VARNAME_PXR_USD_WINDOWS_DLL_PATH $ENV{PXR_USD_WINDOWS_DLL_PATH}) + endif() endif() - endif() - # NOTE - we prefix varnames with "MAYAUSD_VARNAME_" just to make collision - # with some existing var less likely + # Adjust PYTHONPATH to include the path to our test utilities. + list(APPEND MAYAUSD_VARNAME_PYTHONPATH "${MAYA_USD_DIR}/test/testUtils") + + # Adjust PYTHONPATH to include the path to our test. + list(APPEND MAYAUSD_VARNAME_PYTHONPATH "${CMAKE_CURRENT_SOURCE_DIR}") - # Emulate what mayaUSD.mod would do + # convert the internally-processed envs from cmake list + foreach(pathvar ${ALL_PATH_VARS}) + separate_argument_list(MAYAUSD_VARNAME_${pathvar}) + endforeach() + + # prepend the passed-in ENV values - assume these are already + # separated + escaped + foreach(name_value_pair ${PREFIX_ENV}) + mayaUsd_split_head_tail("${name_value_pair}" "=" env_name env_value) + if(NOT env_name) + message(FATAL_ERROR "poorly formatted NAME=VALUE pair - name " + "missing: ${name_value_pair}") + endif() + + # now either prepend to existing list, or create new + if("${env_name}" IN_LIST ALL_PATH_VARS) + if(IS_WINDOWS) + set(MAYAUSD_VARNAME_${env_name} + "${env_value}\;${MAYAUSD_VARNAME_${env_name}}") + else() + set(MAYAUSD_VARNAME_${env_name} + "${env_value}:${MAYAUSD_VARNAME_${env_name}}") + endif() + else() + set("MAYAUSD_VARNAME_${env_name}" ${env_value}) + list(APPEND ALL_PATH_VARS "${env_name}") + endif() + endforeach() + + # We expect the module files to set all relevant env vars: + set_property(TEST ${test_name} APPEND PROPERTY ENVIRONMENT "MAYA_MODULE_PATH=${PREFIX_MODULE_PATH}") + + else() + # No MAYA_MODULE_PATH: + # + # Here we simulate what we think the module files are doing. This might + # have diverged a bit, but as long as the unit tests run correctly things + # will be fine. + set(ALL_PATH_VARS + PYTHONPATH + MAYA_PLUG_IN_PATH + MAYA_SCRIPT_PATH + XBMLANGPATH + ${PXR_OVERRIDE_PLUGINPATH_NAME} + PXR_MTLX_STDLIB_SEARCH_PATHS + ) - # MayaUsd core library - if (BUILD_MAYAUSD_LIBRARY) - list(APPEND MAYAUSD_VARNAME_PATH - "${CMAKE_INSTALL_PREFIX}/lib") if(IS_WINDOWS) - list(APPEND MAYAUSD_VARNAME_PXR_USD_WINDOWS_DLL_PATH - "${CMAKE_INSTALL_PREFIX}/lib") - endif() - list(APPEND MAYAUSD_VARNAME_PYTHONPATH - "${CMAKE_INSTALL_PREFIX}/lib/scripts") - list(APPEND MAYAUSD_VARNAME_MAYA_SCRIPT_PATH - "${CMAKE_INSTALL_PREFIX}/lib/scripts") - if (IS_LINUX) - # On Linux the paths in XBMLANGPATH need a /%B at the end. - list(APPEND MAYAUSD_VARNAME_XBMLANGPATH - "${CMAKE_INSTALL_PREFIX}/lib/icons/%B") + # Put path at the front of the list of env vars. + list(INSERT ALL_PATH_VARS 0 + PATH + ) + list(APPEND ALL_PATH_VARS + PXR_USD_WINDOWS_DLL_PATH + ) else() - list(APPEND MAYAUSD_VARNAME_XBMLANGPATH - "${CMAKE_INSTALL_PREFIX}/lib/icons") + list(APPEND ALL_PATH_VARS + LD_LIBRARY_PATH + ) endif() - list(APPEND MAYAUSD_VARNAME_PYTHONPATH - "${CMAKE_INSTALL_PREFIX}/lib/python") - list(APPEND MAYAUSD_VARNAME_${PXR_OVERRIDE_PLUGINPATH_NAME} - "${CMAKE_INSTALL_PREFIX}/lib/usd") - list(APPEND MAYAUSD_VARNAME_PXR_MTLX_STDLIB_SEARCH_PATHS - "${CMAKE_INSTALL_PREFIX}/libraries") - endif() - # adsk plugin - if (BUILD_ADSK_PLUGIN) - list(APPEND MAYAUSD_VARNAME_MAYA_PLUG_IN_PATH - "${CMAKE_INSTALL_PREFIX}/plugin/adsk/plugin") - list(APPEND MAYAUSD_VARNAME_PYTHONPATH - "${CMAKE_INSTALL_PREFIX}/plugin/adsk/scripts") - list(APPEND MAYAUSD_VARNAME_MAYA_SCRIPT_PATH - "${CMAKE_INSTALL_PREFIX}/plugin/adsk/scripts") - endif() + # Set initial empty values for all path vars + foreach(pathvar ${ALL_PATH_VARS}) + set(MAYAUSD_VARNAME_${pathvar}) + endforeach() - # pxr plugin - if (BUILD_PXR_PLUGIN) - list(APPEND MAYAUSD_VARNAME_PYTHONPATH - "${CMAKE_INSTALL_PREFIX}/plugin/pxr/lib/python") - list(APPEND MAYAUSD_VARNAME_PATH - "${CMAKE_INSTALL_PREFIX}/plugin/pxr/maya/lib") if(IS_WINDOWS) - list(APPEND MAYAUSD_VARNAME_PXR_USD_WINDOWS_DLL_PATH + list(APPEND MAYAUSD_VARNAME_PATH "${CMAKE_INSTALL_PREFIX}/lib/gtest") + list(APPEND MAYAUSD_VARNAME_PATH "${MAYA_LOCATION}/bin") + elseif(IS_LINUX) + if(PREFIX_COMMAND) + # Necessary for tests like DiffCore to find python lib since the test + # is an exectuable and running on its own (not with maya/mayapy). + # See DYLD_LIBRARY_PATH case below. + list(APPEND MAYAUSD_VARNAME_LD_LIBRARY_PATH "${MAYA_LOCATION}/lib") + endif() + endif() + + # NOTE - we prefix varnames with "MAYAUSD_VARNAME_" just to make collision + # with some existing var less likely + + # Emulate what mayaUSD.mod would do + + # MayaUsd core library + if (BUILD_MAYAUSD_LIBRARY) + list(APPEND MAYAUSD_VARNAME_PATH + "${CMAKE_INSTALL_PREFIX}/lib") + if(IS_WINDOWS) + list(APPEND MAYAUSD_VARNAME_PXR_USD_WINDOWS_DLL_PATH + "${CMAKE_INSTALL_PREFIX}/lib") + endif() + list(APPEND MAYAUSD_VARNAME_PYTHONPATH + "${CMAKE_INSTALL_PREFIX}/lib/scripts") + list(APPEND MAYAUSD_VARNAME_MAYA_SCRIPT_PATH + "${CMAKE_INSTALL_PREFIX}/lib/scripts") + if (IS_LINUX) + # On Linux the paths in XBMLANGPATH need a /%B at the end. + list(APPEND MAYAUSD_VARNAME_XBMLANGPATH + "${CMAKE_INSTALL_PREFIX}/lib/icons/%B") + else() + list(APPEND MAYAUSD_VARNAME_XBMLANGPATH + "${CMAKE_INSTALL_PREFIX}/lib/icons") + endif() + list(APPEND MAYAUSD_VARNAME_PYTHONPATH + "${CMAKE_INSTALL_PREFIX}/lib/python") + list(APPEND MAYAUSD_VARNAME_${PXR_OVERRIDE_PLUGINPATH_NAME} + "${CMAKE_INSTALL_PREFIX}/lib/usd") + list(APPEND MAYAUSD_VARNAME_PXR_MTLX_STDLIB_SEARCH_PATHS + "${CMAKE_INSTALL_PREFIX}/libraries") + endif() + + # adsk plugin + if (BUILD_ADSK_PLUGIN) + list(APPEND MAYAUSD_VARNAME_MAYA_PLUG_IN_PATH + "${CMAKE_INSTALL_PREFIX}/plugin/adsk/plugin") + list(APPEND MAYAUSD_VARNAME_PYTHONPATH + "${CMAKE_INSTALL_PREFIX}/plugin/adsk/scripts") + list(APPEND MAYAUSD_VARNAME_MAYA_SCRIPT_PATH + "${CMAKE_INSTALL_PREFIX}/plugin/adsk/scripts") + endif() + + # pxr plugin + if (BUILD_PXR_PLUGIN) + list(APPEND MAYAUSD_VARNAME_PYTHONPATH + "${CMAKE_INSTALL_PREFIX}/plugin/pxr/lib/python") + list(APPEND MAYAUSD_VARNAME_PATH "${CMAKE_INSTALL_PREFIX}/plugin/pxr/maya/lib") + if(IS_WINDOWS) + list(APPEND MAYAUSD_VARNAME_PXR_USD_WINDOWS_DLL_PATH + "${CMAKE_INSTALL_PREFIX}/plugin/pxr/maya/lib") + endif() + list(APPEND MAYAUSD_VARNAME_MAYA_SCRIPT_PATH + "${CMAKE_INSTALL_PREFIX}/plugin/pxr/maya/lib/usd/usdMaya/resources") + list(APPEND MAYAUSD_VARNAME_MAYA_PLUG_IN_PATH + "${CMAKE_INSTALL_PREFIX}/plugin/pxr/maya/plugin") + list(APPEND MAYAUSD_VARNAME_${PXR_OVERRIDE_PLUGINPATH_NAME} + "${CMAKE_INSTALL_PREFIX}/plugin/pxr/lib/usd") endif() - list(APPEND MAYAUSD_VARNAME_MAYA_SCRIPT_PATH - "${CMAKE_INSTALL_PREFIX}/plugin/pxr/maya/lib/usd/usdMaya/resources") - list(APPEND MAYAUSD_VARNAME_MAYA_PLUG_IN_PATH - "${CMAKE_INSTALL_PREFIX}/plugin/pxr/maya/plugin") - list(APPEND MAYAUSD_VARNAME_${PXR_OVERRIDE_PLUGINPATH_NAME} - "${CMAKE_INSTALL_PREFIX}/plugin/pxr/lib/usd") - endif() - # al plugin - if (BUILD_AL_PLUGIN) - list(APPEND MAYAUSD_VARNAME_PYTHONPATH - "${CMAKE_INSTALL_PREFIX}/plugin/al/lib/python") - list(APPEND MAYAUSD_VARNAME_PATH - "${CMAKE_INSTALL_PREFIX}/plugin/al/lib") - if(IS_WINDOWS) - list(APPEND MAYAUSD_VARNAME_PXR_USD_WINDOWS_DLL_PATH + # al plugin + if (BUILD_AL_PLUGIN) + list(APPEND MAYAUSD_VARNAME_PYTHONPATH + "${CMAKE_INSTALL_PREFIX}/plugin/al/lib/python") + list(APPEND MAYAUSD_VARNAME_PATH "${CMAKE_INSTALL_PREFIX}/plugin/al/lib") + if(IS_WINDOWS) + list(APPEND MAYAUSD_VARNAME_PXR_USD_WINDOWS_DLL_PATH + "${CMAKE_INSTALL_PREFIX}/plugin/al/lib") + endif() + list(APPEND MAYAUSD_VARNAME_MAYA_PLUG_IN_PATH + "${CMAKE_INSTALL_PREFIX}/plugin/al/plugin") + list(APPEND MAYAUSD_VARNAME_${PXR_OVERRIDE_PLUGINPATH_NAME} + "${CMAKE_INSTALL_PREFIX}/plugin/al/lib/usd") + list(APPEND MAYAUSD_VARNAME_${PXR_OVERRIDE_PLUGINPATH_NAME} + "${CMAKE_INSTALL_PREFIX}/plugin/al/plugin") endif() - list(APPEND MAYAUSD_VARNAME_MAYA_PLUG_IN_PATH - "${CMAKE_INSTALL_PREFIX}/plugin/al/plugin") - list(APPEND MAYAUSD_VARNAME_${PXR_OVERRIDE_PLUGINPATH_NAME} - "${CMAKE_INSTALL_PREFIX}/plugin/al/lib/usd") - list(APPEND MAYAUSD_VARNAME_${PXR_OVERRIDE_PLUGINPATH_NAME} - "${CMAKE_INSTALL_PREFIX}/plugin/al/plugin") - endif() - if(IS_WINDOWS AND DEFINED ENV{PYTHONHOME}) - # If the environment contains a PYTHONHOME, also set the path to - # that folder so that we can find the python DLLs. - list(APPEND MAYAUSD_VARNAME_PATH $ENV{PYTHONHOME}) - if(IS_WINDOWS) - list(APPEND MAYAUSD_VARNAME_PXR_USD_WINDOWS_DLL_PATH $ENV{PXR_USD_WINDOWS_DLL_PATH}) + if(IS_WINDOWS AND DEFINED ENV{PYTHONHOME}) + # If the environment contains a PYTHONHOME, also set the path to + # that folder so that we can find the python DLLs. + list(APPEND MAYAUSD_VARNAME_PATH $ENV{PYTHONHOME}) + if(IS_WINDOWS) + list(APPEND MAYAUSD_VARNAME_PXR_USD_WINDOWS_DLL_PATH $ENV{PXR_USD_WINDOWS_DLL_PATH}) + endif() endif() - endif() - # Adjust PYTHONPATH to include the path to our test utilities. - list(APPEND MAYAUSD_VARNAME_PYTHONPATH "${MAYA_USD_DIR}/test/testUtils") + # Adjust PYTHONPATH to include the path to our test utilities. + list(APPEND MAYAUSD_VARNAME_PYTHONPATH "${MAYA_USD_DIR}/test/testUtils") - # Adjust PYTHONPATH to include the path to our test. - list(APPEND MAYAUSD_VARNAME_PYTHONPATH "${CMAKE_CURRENT_SOURCE_DIR}") + # Adjust PYTHONPATH to include the path to our test. + list(APPEND MAYAUSD_VARNAME_PYTHONPATH "${CMAKE_CURRENT_SOURCE_DIR}") - # USD - # - # Adjust PATH and PYTHONPATH to include USD. - # These should come last (esp PYTHONPATH, in case another module is overriding - # with pkgutil) - if (DEFINED MAYAUSD_TO_USD_RELATIVE_PATH) - set(USD_INSTALL_LOCATION "${CMAKE_INSTALL_PREFIX}/${MAYAUSD_TO_USD_RELATIVE_PATH}") - else() - set(USD_INSTALL_LOCATION ${PXR_USD_LOCATION}) - endif() - # Inherit any existing PYTHONPATH, but keep it at the end. - list(APPEND MAYAUSD_VARNAME_PYTHONPATH - "${USD_INSTALL_LOCATION}/lib/python") - if(IS_WINDOWS) - list(APPEND MAYAUSD_VARNAME_PATH - "${USD_INSTALL_LOCATION}/bin") - list(APPEND MAYAUSD_VARNAME_PATH - "${USD_INSTALL_LOCATION}/lib") - list(APPEND MAYAUSD_VARNAME_PATH - "${USD_INSTALL_LOCATION}/plugin/usd") - - list(APPEND MAYAUSD_VARNAME_PXR_USD_WINDOWS_DLL_PATH - "${USD_INSTALL_LOCATION}/bin") - list(APPEND MAYAUSD_VARNAME_PXR_USD_WINDOWS_DLL_PATH - "${USD_INSTALL_LOCATION}/lib") - list(APPEND MAYAUSD_VARNAME_PXR_USD_WINDOWS_DLL_PATH - "${USD_INSTALL_LOCATION}/plugin/usd") - endif() - list(APPEND MAYAUSD_VARNAME_PXR_MTLX_STDLIB_SEARCH_PATHS - "${PXR_USD_LOCATION}/libraries") - - # NOTE: this should come after any setting of PATH/PYTHONPATH so - # that our entries will come first. - # Inherit any existing PATH/PYTHONPATH, but keep it at the end. - # This is needed (especially for PATH) because we will overwrite - # both with the values from our list and we need to keep any - # system entries. - list(APPEND MAYAUSD_VARNAME_PATH $ENV{PATH}) - list(APPEND MAYAUSD_VARNAME_PYTHONPATH $ENV{PYTHONPATH}) - - # Inherit any existing PXR_USD_WINDOWS_DLL_PATH. - if(IS_WINDOWS) - list(APPEND MAYAUSD_VARNAME_PXR_USD_WINDOWS_DLL_PATH - $ENV{PXR_USD_WINDOWS_DLL_PATH}) - endif() - - # convert the internally-processed envs from cmake list - foreach(pathvar ${ALL_PATH_VARS}) - separate_argument_list(MAYAUSD_VARNAME_${pathvar}) - endforeach() + # USD + # + # Adjust PATH and PYTHONPATH to include USD. + # These should come last (esp PYTHONPATH, in case another module is overriding + # with pkgutil) + if (DEFINED MAYAUSD_TO_USD_RELATIVE_PATH) + set(USD_INSTALL_LOCATION "${CMAKE_INSTALL_PREFIX}/${MAYAUSD_TO_USD_RELATIVE_PATH}") + else() + set(USD_INSTALL_LOCATION ${PXR_USD_LOCATION}) + endif() + # Inherit any existing PYTHONPATH, but keep it at the end. + list(APPEND MAYAUSD_VARNAME_PYTHONPATH + "${USD_INSTALL_LOCATION}/lib/python") + if(IS_WINDOWS) + list(APPEND MAYAUSD_VARNAME_PATH + "${USD_INSTALL_LOCATION}/bin") + list(APPEND MAYAUSD_VARNAME_PATH + "${USD_INSTALL_LOCATION}/lib") + list(APPEND MAYAUSD_VARNAME_PATH + "${USD_INSTALL_LOCATION}/plugin/usd") - # prepend the passed-in ENV values - assume these are already - # separated + escaped - foreach(name_value_pair ${PREFIX_ENV}) - mayaUsd_split_head_tail("${name_value_pair}" "=" env_name env_value) - if(NOT env_name) - message(FATAL_ERROR "poorly formatted NAME=VALUE pair - name " - "missing: ${name_value_pair}") + list(APPEND MAYAUSD_VARNAME_PXR_USD_WINDOWS_DLL_PATH + "${USD_INSTALL_LOCATION}/bin") + list(APPEND MAYAUSD_VARNAME_PXR_USD_WINDOWS_DLL_PATH + "${USD_INSTALL_LOCATION}/lib") + list(APPEND MAYAUSD_VARNAME_PXR_USD_WINDOWS_DLL_PATH + "${USD_INSTALL_LOCATION}/plugin/usd") + endif() + list(APPEND MAYAUSD_VARNAME_PXR_MTLX_STDLIB_SEARCH_PATHS + "${PXR_USD_LOCATION}/libraries") + + # NOTE: this should come after any setting of PATH/PYTHONPATH so + # that our entries will come first. + # Inherit any existing PATH/PYTHONPATH, but keep it at the end. + # This is needed (especially for PATH) because we will overwrite + # both with the values from our list and we need to keep any + # system entries. + list(APPEND MAYAUSD_VARNAME_PATH $ENV{PATH}) + list(APPEND MAYAUSD_VARNAME_PYTHONPATH $ENV{PYTHONPATH}) + + # Inherit any existing PXR_USD_WINDOWS_DLL_PATH. + if(IS_WINDOWS) + list(APPEND MAYAUSD_VARNAME_PXR_USD_WINDOWS_DLL_PATH + $ENV{PXR_USD_WINDOWS_DLL_PATH}) endif() - # now either prepend to existing list, or create new - if("${env_name}" IN_LIST ALL_PATH_VARS) - if(IS_WINDOWS) - set(MAYAUSD_VARNAME_${env_name} - "${env_value}\;${MAYAUSD_VARNAME_${env_name}}") + # convert the internally-processed envs from cmake list + foreach(pathvar ${ALL_PATH_VARS}) + separate_argument_list(MAYAUSD_VARNAME_${pathvar}) + endforeach() + + # prepend the passed-in ENV values - assume these are already + # separated + escaped + foreach(name_value_pair ${PREFIX_ENV}) + mayaUsd_split_head_tail("${name_value_pair}" "=" env_name env_value) + if(NOT env_name) + message(FATAL_ERROR "poorly formatted NAME=VALUE pair - name " + "missing: ${name_value_pair}") + endif() + + # now either prepend to existing list, or create new + if("${env_name}" IN_LIST ALL_PATH_VARS) + if(IS_WINDOWS) + set(MAYAUSD_VARNAME_${env_name} + "${env_value}\;${MAYAUSD_VARNAME_${env_name}}") + else() + set(MAYAUSD_VARNAME_${env_name} + "${env_value}:${MAYAUSD_VARNAME_${env_name}}") + endif() else() - set(MAYAUSD_VARNAME_${env_name} - "${env_value}:${MAYAUSD_VARNAME_${env_name}}") + set("MAYAUSD_VARNAME_${env_name}" ${env_value}) + list(APPEND ALL_PATH_VARS "${env_name}") endif() - else() - set("MAYAUSD_VARNAME_${env_name}" ${env_value}) - list(APPEND ALL_PATH_VARS "${env_name}") - endif() - endforeach() + endforeach() - # Unset any MAYA_MODULE_PATH as we set all the individual variables - # so we don't want to conflict with a MayaUsd module. - set_property(TEST ${test_name} APPEND PROPERTY ENVIRONMENT "MAYA_MODULE_PATH=") + # Unset any MAYA_MODULE_PATH as we set all the individual variables + # so we don't want to conflict with a MayaUsd module. + set_property(TEST ${test_name} APPEND PROPERTY ENVIRONMENT "MAYA_MODULE_PATH=") + endif() # set all env vars foreach(pathvar ${ALL_PATH_VARS}) set_property(TEST "${test_name}" APPEND PROPERTY ENVIRONMENT "${pathvar}=${MAYAUSD_VARNAME_${pathvar}}") endforeach() - + # Set a temporary folder path for the TMP,TEMP and MAYA_APP_DIR in which the # maya profile will be created. # Note: replace bad chars in test_name with _. diff --git a/modules/alUSD.mod.template b/modules/alUSD.mod.template index fa456f7a0d..f746a038bd 100644 --- a/modules/alUSD.mod.template +++ b/modules/alUSD.mod.template @@ -1,5 +1,6 @@ + AL_USDMaya ${AL_USDMAYA_VERSION} ${CMAKE_INSTALL_PREFIX}/plugin/al plug-ins: plugin PYTHONPATH+:=lib/python +MAYA_SCRIPT_PATH+:=lib/python ${PXR_OVERRIDE_PLUGINPATH_NAME}+:=lib/usd ${PXR_OVERRIDE_PLUGINPATH_NAME}+:=plugin diff --git a/modules/alUSD_Win.mod.template b/modules/alUSD_Win.mod.template index 6558e26dbf..7400b4a930 100644 --- a/modules/alUSD_Win.mod.template +++ b/modules/alUSD_Win.mod.template @@ -1,6 +1,7 @@ + AL_USDMaya ${AL_USDMAYA_VERSION} ${CMAKE_INSTALL_PREFIX}/plugin/al plug-ins: plugin PYTHONPATH+:=lib/python +MAYA_SCRIPT_PATH+:=lib/python PATH+:=lib PXR_USD_WINDOWS_DLL_PATH+:=lib ${PXR_OVERRIDE_PLUGINPATH_NAME}+:=lib/usd diff --git a/modules/mayaUSD.mod.template b/modules/mayaUSD.mod.template index 69f3ca99c8..7ac4a0ad5c 100644 --- a/modules/mayaUSD.mod.template +++ b/modules/mayaUSD.mod.template @@ -2,7 +2,7 @@ icons: plug-ins: presets: -scripts: +scripts: lib/python resources: PYTHONPATH+:=lib/python USD_LOCATION:= @@ -16,6 +16,7 @@ presets: scripts: lib/scripts resources: PYTHONPATH+:=lib/python +MAYA_SCRIPT_PATH+:=lib/python ${PXR_OVERRIDE_PLUGINPATH_NAME}+:=lib/usd MAYAUSD_VERSION=${MAYAUSD_VERSION} PXR_MTLX_STDLIB_SEARCH_PATHS+:=libraries diff --git a/modules/mayaUSD_Win.mod.template b/modules/mayaUSD_Win.mod.template index ed12ee0171..853d086be5 100644 --- a/modules/mayaUSD_Win.mod.template +++ b/modules/mayaUSD_Win.mod.template @@ -2,7 +2,7 @@ icons: plug-ins: presets: -scripts: +scripts: lib/python resources: PYTHONPATH+:=lib/python PATH+:=bin @@ -24,6 +24,7 @@ resources: PATH+:=lib PXR_USD_WINDOWS_DLL_PATH+:=lib PYTHONPATH+:=lib/python +MAYA_SCRIPT_PATH+:=lib/python ${PXR_OVERRIDE_PLUGINPATH_NAME}+:=lib/usd MAYAUSD_VERSION=${MAYAUSD_VERSION} PXR_MTLX_STDLIB_SEARCH_PATHS+:=libraries diff --git a/modules/pxrUSD.mod.template b/modules/pxrUSD.mod.template index 2ec4426637..779705ed3e 100644 --- a/modules/pxrUSD.mod.template +++ b/modules/pxrUSD.mod.template @@ -3,4 +3,5 @@ icons: maya/lib/usd/usdMaya/resources plug-ins: maya/plugin scripts: maya/lib/usd/usdMaya/resources PYTHONPATH+:=lib/python +MAYA_SCRIPT_PATH+:=lib/python ${PXR_OVERRIDE_PLUGINPATH_NAME}+:=lib/usd diff --git a/modules/pxrUSD_Win.mod.template b/modules/pxrUSD_Win.mod.template index bf72f67147..c8d9a0289d 100644 --- a/modules/pxrUSD_Win.mod.template +++ b/modules/pxrUSD_Win.mod.template @@ -3,6 +3,7 @@ icons: maya/lib/usd/usdMaya/resources plug-ins: maya/plugin scripts: maya/lib/usd/usdMaya/resources PYTHONPATH+:=lib/python +MAYA_SCRIPT_PATH+:=lib/python PATH+:=maya/lib PXR_USD_WINDOWS_DLL_PATH+:=maya/lib ${PXR_OVERRIDE_PLUGINPATH_NAME}+:=lib/usd diff --git a/test/lib/CMakeLists.txt b/test/lib/CMakeLists.txt index 209bada204..6075b6cdbf 100644 --- a/test/lib/CMakeLists.txt +++ b/test/lib/CMakeLists.txt @@ -2,7 +2,6 @@ set(TEST_SCRIPT_FILES testMayaUsdConverter.py testMayaUsdCreateStageCommands.py - testMayaUsdPythonImport.py testMayaUsdLayerEditorCommands.py testMayaUsdCacheId.py ) @@ -32,6 +31,21 @@ foreach(script ${TEST_SCRIPT_FILES}) set_property(TEST ${target} APPEND PROPERTY LABELS MayaUsd) endforeach() +# The testMayaUsdPythonImport now checks that we can import both the USD Python bindings +# and the MayaUSD Python bindings in a script node context. For this to be tested, we +# need to point to the updated module file and explicitly ask Maya to block execution of +# insecure scripts. +mayaUsd_get_unittest_target(target testMayaUsdPythonImport.py) +mayaUsd_add_test(${target} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + PYTHON_MODULE ${target} + MODULE_PATH ${CMAKE_INSTALL_PREFIX} + ENV + "LD_LIBRARY_PATH=${ADDITIONAL_LD_LIBRARY_PATH}" + "MAYA_SECURE_BATCH_ENABLE=1" +) +set_property(TEST ${target} APPEND PROPERTY LABELS MayaUsd) + foreach(script ${INTERACTIVE_TEST_SCRIPT_FILES}) mayaUsd_get_unittest_target(target ${script}) mayaUsd_add_test(${target} diff --git a/test/lib/testMayaUsdPythonImport.py b/test/lib/testMayaUsdPythonImport.py index 2eeff4b004..77d40a7f7a 100644 --- a/test/lib/testMayaUsdPythonImport.py +++ b/test/lib/testMayaUsdPythonImport.py @@ -17,6 +17,8 @@ # import unittest +import os +from maya import cmds class MayaUsdPythonImportTestCase(unittest.TestCase): @@ -34,3 +36,30 @@ def testImportModule(self): # not causing USD libraries to be loaded any other way. stageCache = mayaUsdLib.StageCache.Get(True, True) self.assertEqual(type(stageCache).__name__, 'StageCache') + + def testPixarModulesAreSafeForScripting(self): + """Test that a script node can import the + Pixar Python modules in a secure scripting + context""" + + node = cmds.createNode("script") + + # This Pixar import will fail and stop the script unless it was added to the secure import paths. + cmds.setAttr(node + ".b", "from maya import cmds\nfrom pxr import Sdr\ncmds.createNode('script')\n", type="string") + cmds.setAttr(node + ".st", 1) # Execute on Open call + cmds.setAttr(node + ".stp", 1) # Python script + + # Save and re-load the scene + testDir = os.path.join(os.path.abspath('.'), 'TestMayaUsdPythonImport') + try: + os.makedirs(testDir) + except OSError: + pass + tmpMayaFile = os.path.join(testDir, 'testPxrScriptNode.ma') + cmds.file(rename=tmpMayaFile) + cmds.file(save=True, type='mayaAscii') + cmds.file(new=True, force=True) + cmds.file(tmpMayaFile, open=True, force=True) + + # If the script was safe, we should have a second script node: + self.assertEqual(cmds.getAttr("script2.st"), 0)