import glob import os import platform import torch from setuptools import find_packages, setup from torch.utils.cpp_extension import ( CUDA_HOME, BuildExtension, CppExtension, CUDAExtension, ) library_name = "texture_baker" def get_extensions(): debug_mode = os.getenv("DEBUG", "0") == "1" use_cuda = os.getenv("USE_CUDA", "1" if torch.cuda.is_available() else "0") == "1" use_metal = ( os.getenv("USE_METAL", "1" if torch.backends.mps.is_available() else "0") == "1" ) use_native_arch = os.getenv("USE_NATIVE_ARCH", "1") == "1" if debug_mode: print("Compiling in debug mode") use_cuda = use_cuda and CUDA_HOME is not None extension = CUDAExtension if use_cuda else CppExtension extra_link_args = [] extra_compile_args = { "cxx": [ "-O3" if not debug_mode else "-O0", "-fdiagnostics-color=always", "-fopenmp", ] + ["-march=native"] if use_native_arch else [], "nvcc": [ "-O3" if not debug_mode else "-O0", ], } if debug_mode: extra_compile_args["cxx"].append("-g") if platform.system() == "Windows": extra_compile_args["cxx"].append("/Z7") extra_compile_args["cxx"].append("/Od") extra_link_args.extend(["/DEBUG"]) extra_compile_args["cxx"].append("-UNDEBUG") extra_compile_args["nvcc"].append("-UNDEBUG") extra_compile_args["nvcc"].append("-g") extra_link_args.extend(["-O0", "-g"]) define_macros = [] extensions = [] libraries = [] this_dir = os.path.dirname(os.path.curdir) sources = glob.glob( os.path.join(this_dir, library_name, "csrc", "**", "*.cpp"), recursive=True ) if len(sources) == 0: print("No source files found for extension, skipping extension compilation") return None if use_cuda: define_macros += [ ("THRUST_IGNORE_CUB_VERSION_CHECK", None), ] sources += glob.glob( os.path.join(this_dir, library_name, "csrc", "**", "*.cu"), recursive=True ) libraries += ["cudart", "c10_cuda"] if use_metal: define_macros += [ ("WITH_MPS", None), ] sources += glob.glob( os.path.join(this_dir, library_name, "csrc", "**", "*.mm"), recursive=True ) extra_compile_args.update({"cxx": ["-O3", "-arch", "arm64"]}) extra_link_args += ["-arch", "arm64"] extensions.append( extension( name=f"{library_name}._C", sources=sources, define_macros=define_macros, extra_compile_args=extra_compile_args, extra_link_args=extra_link_args, libraries=libraries + [ "c10", "torch", "torch_cpu", "torch_python", ], ) ) for ext in extensions: ext.libraries = ["cudart_static" if x == "cudart" else x for x in ext.libraries] print(extensions) return extensions setup( name=library_name, version="0.0.1", packages=find_packages(where="."), package_dir={"": "."}, ext_modules=get_extensions(), install_requires=[], package_data={ library_name: [os.path.join("csrc", "*.h"), os.path.join("csrc", "*.metal")], }, description="Small texture baker which rasterizes barycentric coordinates to a tensor.", long_description=open("README.md").read(), long_description_content_type="text/markdown", url="https://github.com/Stability-AI/texture_baker", cmdclass={"build_ext": BuildExtension}, )