setup.py (71 lines of code) (raw):
import multiprocessing
import os
import sys
import subprocess
from distutils import sysconfig
from distutils.command.build import build as DistutilsBuild
from setuptools import setup
def build_common(dynamic_library_extension, cmake_arg_list=None):
# On OSX CMake's FindPythonLibs is flaky; we need to supply lib and include
# dirs otherwise it sometimes fails to pull up the correct versions (see
# https://cmake.org/Bug/view.php?id=14809)
def find_python_library():
for var in ['LIBPL', 'LIBDIR']:
python_library = os.path.join(sysconfig.get_config_var(var), 'libpython{}.{}'.format(sysconfig.get_python_version(), dynamic_library_extension))
if os.path.exists(python_library):
return python_library
cores_to_use = max(1, multiprocessing.cpu_count() - 1)
cmake_arg_list = cmake_arg_list if cmake_arg_list is not None else []
python_library = find_python_library()
python_include = sysconfig.get_python_inc()
if python_library is not None:
cmake_arg_list.append('-DPYTHON_LIBRARY={}'.format(python_library))
cmake_arg_list.append('-DPYTHON_INCLUDE_DIR={}'.format(python_include))
subprocess.check_call(['cmake', '-DCMAKE_BUILD_TYPE=Release', '-DBUILD_PYTHON=ON', '-DBUILD_JAVA=OFF', '-DPYTHON_EXECUTABLE:FILEPATH={}'.format(sys.executable)] + cmake_arg_list, cwd='doom_py')
subprocess.check_call(['make', '-j', str(cores_to_use)], cwd='doom_py')
subprocess.check_call(['rm', '-f', 'vizdoom.so'], cwd='doom_py')
subprocess.check_call(['ln', '-s', 'bin/python/vizdoom.so', 'vizdoom.so'], cwd='doom_py')
def build_osx():
build_common('dylib', cmake_arg_list=['-DOSX_COCOA_BACKEND=OFF'])
# Symlink to the correct vizdoom binary
subprocess.check_call(['rm', '-f', 'bin/vizdoom'], cwd='doom_py')
subprocess.check_call(['ln', '-s', 'vizdoom.app/Contents/MacOS/vizdoom', 'bin/vizdoom'], cwd='doom_py')
def build_linux():
build_common('so')
def build_windows():
# THIS IS UNTESTED
build_common('dll')
if sys.platform.startswith("darwin"):
platname = "osx"
build_func = build_osx
elif sys.platform.startswith("linux"):
platname = "linux"
build_func = build_linux
elif sys.platform.startswith("win"):
platname = "win"
build_func = build_windows
else:
raise RuntimeError("Unrecognized platform: {}".format(sys.platform))
# For building Doom
class BuildDoom(DistutilsBuild):
def run(self):
try:
build_func()
except subprocess.CalledProcessError as e:
if platname == 'osx':
library_str = "doom_py requires boost, boost-python, sdl2 on OSX (installable via 'brew install boost boost-python sdl2')"
elif platname == 'linux':
library_str = "Try running 'apt-get install -y python-numpy cmake zlib1g-dev libjpeg-dev libboost-all-dev gcc libsdl2-dev wget unzip'"
else:
library_str = ''
sys.stderr.write("\033[1m" + "\nCould not build doom-py: %s. (HINT: are you sure cmake is installed? You might also be missing a library. %s\n\n" % (e, library_str) + "\033[0m")
raise
DistutilsBuild.run(self)
setup(name='doom-py',
version='0.0.14',
description='Python bindings to ViZDoom',
url='https://github.com/openai/doom-py',
author='OpenAI Community',
author_email='gym@openai.com',
packages=['doom_py'],
cmdclass={'build': BuildDoom},
setup_requires=['numpy'],
install_requires=['numpy'],
tests_require=['nose2'],
classifiers=['License :: OSI Approved :: MIT License'],
include_package_data=True,
)