code: def get_extensions():
      no_extension = os.getenv("PYTORCH3D_NO_EXTENSION", "0") == "1"
      if no_extension:
          msg = "SKIPPING EXTENSION BUILD. PYTORCH3D WILL NOT WORK!"
          print(msg, file=sys.stderr)
          warnings.warn(msg)
          return []
  
      this_dir = os.path.dirname(os.path.abspath(__file__))
      extensions_dir = os.path.join(this_dir, "pytorch3d", "csrc")
      sources = glob.glob(
          os.path.join(extensions_dir, "**", "*.cpp"), recursive=True
      )
      source_cuda = glob.glob(
          os.path.join(extensions_dir, "**", "*.cu"), recursive=True
      )
      extension = CppExtension
  
      extra_compile_args = {"cxx": ["-std=c++17"]}
      define_macros = []
      include_dirs = [extensions_dir]
  
      force_cuda = os.getenv("FORCE_CUDA", "0") == "1"
      force_no_cuda = os.getenv("PYTORCH3D_FORCE_NO_CUDA", "0") == "1"
      if (
          not force_no_cuda
          and torch.cuda.is_available()
          and CUDA_HOME is not None
      ) or force_cuda:
          extension = CUDAExtension
          sources += source_cuda
          define_macros += [("WITH_CUDA", None)]
          # Thrust is only used for its tuple objects.
          # With CUDA 11.0 we can't use the cudatoolkit's version of cub.
          # We take the risk that CUB and Thrust are incompatible, because
          # we aren't using parts of Thrust which actually use CUB.
          define_macros += [("THRUST_IGNORE_CUB_VERSION_CHECK", None)]
          cub_home = os.environ.get("CUB_HOME", None)
          nvcc_args = [
              "-DCUDA_HAS_FP16=1",
              "-D__CUDA_NO_HALF_OPERATORS__",
              "-D__CUDA_NO_HALF_CONVERSIONS__",
              "-D__CUDA_NO_HALF2_OPERATORS__",
          ]
          if os.name != "nt":
              nvcc_args.append("-std=c++17")
          if cub_home is None:
              prefix = os.environ.get("CONDA_PREFIX", None)
              if prefix is not None and os.path.isdir(
                  prefix + "/include/cub"
              ):
                  cub_home = prefix + "/include"
  
          if cub_home is None:
              warnings.warn(
                  "The environment variable `CUB_HOME` was not found. "
                  "NVIDIA CUB is required for compilation and can be downloaded "
                  "from `https://github.com/NVIDIA/cub/releases`. You can unpack "
                  "it to a location of your choice and set the environment variable "
                  "`CUB_HOME` to the folder containing the `CMakeListst.txt` file."
              )
          else:
              include_dirs.append(
                  os.path.realpath(cub_home).replace("\\ ", " ")
              )
          nvcc_flags_env = os.getenv("NVCC_FLAGS", "")
          if nvcc_flags_env != "":
              nvcc_args.extend(nvcc_flags_env.split(" "))
  
          # This is needed for pytorch 1.6 and earlier. See e.g.
          # https://github.com/facebookresearch/pytorch3d/issues/436
          # It is harmless after https://github.com/pytorch/pytorch/pull/47404 .
          # But it can be problematic in torch 1.7.0 and 1.7.1
          if torch.__version__[:4] != "1.7.":
              CC = os.environ.get("CC", None)
              if CC is not None:
                  existing_CC = get_existing_ccbin(nvcc_args)
                  if existing_CC is None:
                      CC_arg = "-ccbin={}".format(CC)
                      nvcc_args.append(CC_arg)
                  elif existing_CC != CC:
                      msg = (
                          f"Inconsistent ccbins: {CC} and {existing_CC}"
                      )
                      raise ValueError(msg)
  
          extra_compile_args["nvcc"] = nvcc_args
  
      sources = [os.path.join(extensions_dir, s) for s in sources]
  
      ext_modules = [
          extension(
              "pytorch3d._C",
              sources,
              include_dirs=include_dirs,
              define_macros=define_macros,
              extra_compile_args=extra_compile_args,
          )
      ]
  
      return ext_modules
  
file_path: pytorch3d/setup.py
imports: import glob
  import os
  import runpy
  import sys
  import warnings
  from typing import List, Optional
  import torch
  from setuptools import find_packages, setup
  from torch.utils.cpp_extension import CppExtension, CUDA_HOME, CUDAExtension
label_desc: Use image node_id 2 for calling a global function with example usage: get_extensions() and returns: ext_modules, list