code: def run(self):
      global BUILD_DIR, BUILT_EXTENSIONS, EIGEN3_INCLUDE_DIR
      BUILD_DIR = os.path.abspath(self.build_dir)
      if EIGEN3_INCLUDE_DIR is None:
          EIGEN3_INCLUDE_DIR = os.path.join(BUILD_DIR, "eigen")
      EIGEN3_INCLUDE_DIR = os.path.abspath(EIGEN3_INCLUDE_DIR)
      log.info("CMAKE_PATH=%r" % CMAKE_PATH)
      log.info("MAKE_PATH=%r" % MAKE_PATH)
      log.info("MAKE_FLAGS=%r" % " ".join(MAKE_FLAGS))
      log.info("EIGEN3_INCLUDE_DIR=%r" % EIGEN3_INCLUDE_DIR)
      log.info("EIGEN3_DOWNLOAD_URL=%r" % EIGEN3_DOWNLOAD_URL)
      log.info("CC_PATH=%r" % CC_PATH)
      log.info("CXX_PATH=%r" % CXX_PATH)
      log.info("SCRIPT_DIR=%r" % SCRIPT_DIR)
      log.info("BUILD_DIR=%r" % BUILD_DIR)
      log.info("INSTALL_PREFIX=%r" % INSTALL_PREFIX)
      log.info("PYTHON=%r" % PYTHON)
      if CMAKE_PATH is not None:
          run_process([CMAKE_PATH, "--version"])
      if CXX_PATH is not None:
          run_process([CXX_PATH, "--version"])
  
      # This will generally be called by the pip install
      if not self.skip_build:
          if CMAKE_PATH is None:
              raise DistutilsSetupError(
                  "`cmake` not found, and `CMAKE` is not set."
              )
          if MAKE_PATH is None:
              raise DistutilsSetupError(
                  "`make` not found, and `MAKE` is not set."
              )
          if CC_PATH is None:
              raise DistutilsSetupError(
                  "`gcc` not found, and `CC` is not set."
              )
          if CXX_PATH is None:
              raise DistutilsSetupError(
                  "`g++` not found, and `CXX` is not set."
              )
  
          # Prepare folders
          if not os.path.isdir(BUILD_DIR):
              log.info("Creating build directory " + BUILD_DIR)
              os.makedirs(BUILD_DIR)
  
          os.chdir(BUILD_DIR)
          if os.path.isdir(EIGEN3_INCLUDE_DIR):
              log.info("Found eigen in " + EIGEN3_INCLUDE_DIR)
          else:
              try:
                  # Can use BZ2 or zip, right now using zip
                  # log.info("Fetching Eigen...")
                  # urlretrieve(EIGEN3_DOWNLOAD_URL, "eigen.tar.bz2")
                  # log.info("Unpacking Eigen...")
                  # tfile = tarfile.open("eigen.tar.bz2", 'r')
                  # tfile.extractall('eigen')
                  log.info("Fetching Eigen...")
                  urlretrieve(EIGEN3_DOWNLOAD_URL, "eigen.zip")
              except Exception as e:
                  raise DistutilsSetupError(
                      "Could not download Eigen from %r: %s"
                      % (EIGEN3_DOWNLOAD_URL, e)
                  )
              try:
                  log.info("Unpacking Eigen...")
                  os.mkdir(EIGEN3_INCLUDE_DIR)
                  with zipfile.ZipFile("eigen.zip") as zfile:
                      zfile.extractall(EIGEN3_INCLUDE_DIR)
              except Exception as e:
                  raise DistutilsSetupError(
                      "Could not extract Eigen to %r: %s"
                      % (EIGEN3_INCLUDE_DIR, e)
                  )
  
          os.environ["CXX"] = CXX_PATH
          os.environ["CC"] = CC_PATH
  
          # Build module
          cmake_cmd = [
              CMAKE_PATH,
              SCRIPT_DIR,
              "-DCMAKE_INSTALL_PREFIX=%r" % INSTALL_PREFIX,
              "-DEIGEN3_INCLUDE_DIR=%r" % EIGEN3_INCLUDE_DIR,
              "-DPYTHON=%r" % PYTHON,
          ]
          for env_var in (
              "BACKEND",
              "CUDNN_ROOT",
              "CUDA_TOOLKIT_ROOT_DIR",
          ):
              value = ENV.get(env_var)
              if value is not None:
                  cmake_cmd.append("-D" + env_var + "=%r" % value)
          log.info("Configuring...")
          if run_process(cmake_cmd) != 0:
              raise DistutilsSetupError(" ".join(cmake_cmd))
  
          make_cmd = [MAKE_PATH] + MAKE_FLAGS
          log.info("Compiling...")
          if run_process(make_cmd) != 0:
              raise DistutilsSetupError(" ".join(make_cmd))
  
          make_cmd = [MAKE_PATH, "install"]
          log.info("Installing...")
          if run_process(make_cmd) != 0:
              raise DistutilsSetupError(" ".join(make_cmd))
  
          if platform.system() == "Darwin":  # macOS
              for filename in DATA_FILES:
                  new_install_name = "@loader_path/" + os.path.basename(
                      filename
                  )
                  install_name_tool_cmd = [
                      "install_name_tool",
                      "-id",
                      new_install_name,
                      filename,
                  ]
                  log.info(
                      "fixing install_name for %s to %r"
                      % (filename, new_install_name)
                  )
                  if run_process(install_name_tool_cmd) != 0:
                      raise DistutilsSetupError(
                          " ".join(install_name_tool_cmd)
                      )
  
      # This will generally be called by the manual install
      elif not os.path.isdir(EIGEN3_INCLUDE_DIR):
          raise RuntimeError(
              "Could not find Eigen in EIGEN3_INCLUDE_DIR={}. If doing manual install, please set the EIGEN3_INCLUDE_DIR variable with the absolute path to Eigen manually. If doing install via pip, please file an issue on github.com/clab/dynet".format(
                  EIGEN3_INCLUDE_DIR
              )
          )
  
      BUILT_EXTENSIONS = True  # because make calls build_ext
      _build.run(self)
  
imports: import distutils.sysconfig
  import logging
  import platform
  import zipfile
  import sys
  from distutils.command.build import build
  from distutils.command.build_py import build_py
  from distutils.command.install_data import install_data
  from distutils.errors import DistutilsSetupError
  from distutils.spawn import find_executable
  from distutils.sysconfig import get_python_lib
  from multiprocessing import cpu_count
  from subprocess import Popen
  import os
  import re
  from Cython.Distutils import build_ext
  from setuptools import setup
  from setuptools.extension import Extension
  from shutil import rmtree, copytree, copy
  import urllib
label_desc: Use image node_id 3 for calling the build obj's underlying member method code with example usage: obj.run() without return types