diff '--color=auto' --unified --recursive --text mujoco-py-2.1.2.14.orig/mujoco_py/builder.py mujoco-py-2.1.2.14.new/mujoco_py/builder.py --- mujoco-py-2.1.2.14.orig/mujoco_py/builder.py 2022-03-24 00:41:08.622171029 -0400 +++ mujoco-py-2.1.2.14.new/mujoco_py/builder.py 2022-03-24 00:42:23.291497507 -0400 @@ -71,9 +71,7 @@ if sys.platform == 'darwin': Builder = MacExtensionBuilder elif sys.platform == 'linux': - _ensure_set_env_var("LD_LIBRARY_PATH", lib_path) if os.getenv('MUJOCO_PY_FORCE_CPU') is None and get_nvidia_lib_dir() is not None: - _ensure_set_env_var("LD_LIBRARY_PATH", get_nvidia_lib_dir()) Builder = LinuxGPUExtensionBuilder else: Builder = LinuxCPUExtensionBuilder @@ -89,6 +87,13 @@ builder = Builder(mujoco_path) cext_so_path = builder.get_so_file_path() + # Check if we have write access to the cext_so_path. + # If not, it's probably because mujoco-py has been installed and everything is + # read-only. Returning here is necessary because the lock creation will fail. + # It might be better to try-catch the lock but this minimizes the diff complexity. + if not os.access(os.path.dirname(cext_so_path), os.W_OK): + return load_dynamic_ext('cymj', cext_so_path) + lockpath = os.path.join(os.path.dirname(cext_so_path), 'mujocopy-buildlock') with fasteners.InterProcessLock(lockpath): @@ -177,8 +182,8 @@ # Fix the rpath of the generated library -- i lost the Stackoverflow # reference here - from_mujoco_path = '@executable_path/libmujoco210.dylib' - to_mujoco_path = '%s/libmujoco210.dylib' % mj_bin_path + from_mujoco_path = '@executable_path/libmujoco.dylib' + to_mujoco_path = '%s/libmujoco.dylib' % mj_bin_path subprocess.check_call(['install_name_tool', '-change', from_mujoco_path, @@ -210,11 +215,10 @@ sources=[join(self.CYMJ_DIR_PATH, "cymj.pyx")], include_dirs=[ self.CYMJ_DIR_PATH, - join(mujoco_path, 'include'), + "/usr/include/mujoco", np.get_include(), ], - libraries=['mujoco210'], - library_dirs=[join(mujoco_path, 'bin')], + libraries=['mujoco'], extra_compile_args=[ '-fopenmp', # needed for OpenMP '-w', # suppress numpy compilation warnings @@ -271,14 +275,13 @@ self.extension.sources.append( join(self.CYMJ_DIR_PATH, "gl", "osmesashim.c")) - self.extension.libraries.extend(['glewosmesa', 'OSMesa', 'GL']) - self.extension.runtime_library_dirs = [join(mujoco_path, 'bin')] + self.extension.libraries.extend(['GLEW', 'OSMesa', 'GL']) def _build_impl(self): so_file_path = super()._build_impl() # Removes absolute paths to libraries. Allows for dynamic loading. - fix_shared_library(so_file_path, 'libmujoco210.so', 'libmujoco210.so') - fix_shared_library(so_file_path, 'libglewosmesa.so', 'libglewosmesa.so') + fix_shared_library(so_file_path, 'libmujoco.so', 'libmujoco.so') + fix_shared_library(so_file_path, 'libGLEW.so', 'libGLEW.so') return so_file_path @@ -289,15 +292,14 @@ self.extension.sources.append(self.CYMJ_DIR_PATH + "/gl/eglshim.c") self.extension.include_dirs.append(self.CYMJ_DIR_PATH + '/vendor/egl') - self.extension.libraries.extend(['glewegl']) - self.extension.runtime_library_dirs = [join(mujoco_path, 'bin')] + self.extension.libraries.extend(['GLEW']) def _build_impl(self): so_file_path = super()._build_impl() fix_shared_library(so_file_path, 'libOpenGL.so', 'libOpenGL.so.0') fix_shared_library(so_file_path, 'libEGL.so', 'libEGL.so.1') - fix_shared_library(so_file_path, 'libmujoco210.so', 'libmujoco210.so') - fix_shared_library(so_file_path, 'libglewegl.so', 'libglewegl.so') + fix_shared_library(so_file_path, 'libmujoco.so', 'libmujoco.so') + fix_shared_library(so_file_path, 'libGLEW.so', 'libGLEW.so') return so_file_path @@ -481,9 +483,8 @@ source_string += '\nuintptr_t __fun = (uintptr_t) fun;' # Link against mujoco so we can call mujoco functions from within callback ffibuilder.set_source(name, source_string, - include_dirs=[join(mujoco_path, 'include')], - library_dirs=[join(mujoco_path, 'bin')], - libraries=['mujoco210']) + include_dirs=["/usr/include/mujoco"], + libraries=['mujoco']) # Catch compilation exceptions so we can cleanup partial files in that case try: library_path = ffibuilder.compile(verbose=True) diff '--color=auto' --unified --recursive --text mujoco-py-2.1.2.14.orig/mujoco_py/utils.py mujoco-py-2.1.2.14.new/mujoco_py/utils.py --- mujoco-py-2.1.2.14.orig/mujoco_py/utils.py 2022-03-24 00:41:08.625504331 -0400 +++ mujoco-py-2.1.2.14.new/mujoco_py/utils.py 2022-03-24 00:42:48.474603679 -0400 @@ -61,14 +61,15 @@ def discover_mujoco(): """ Discovers where MuJoCo is located in the file system. - Currently assumes path is in ~/.mujoco Returns: - mujoco_path (str): Path to MuJoCo 2.1 directory. """ mujoco_path = os.getenv('MUJOCO_PY_MUJOCO_PATH') if not mujoco_path: - mujoco_path = join(expanduser('~'), '.mujoco', 'mujoco210') + mujoco_path = join(expanduser('~'), '.mujoco', 'mujoco') + if not exists(mujoco_path): + mujoco_path = "/usr/include/mujoco" # We get lots of github issues that seem to be missing these # so check that mujoco is really there and raise errors if not.