Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

50 linhas
1.5KB

  1. import os
  2. import shutil
  3. import itertools
  4. import tempfile
  5. from contextlib import contextmanager
  6. from pathlib import Path
  7. from typing import Iterator, Optional
  8. # The root directory of the dds project
  9. PROJECT_ROOT = Path(__file__).absolute().parent.parent.parent
  10. #: The <repo>/tools directory
  11. TOOLS_DIR = PROJECT_ROOT / 'tools'
  12. #: The default build directory
  13. BUILD_DIR = PROJECT_ROOT / '_build'
  14. #: The directory were w prebuild/bootstrapped results will go, and scratch space for the build
  15. PREBUILT_DIR = PROJECT_ROOT / '_prebuilt'
  16. #: THe suffix of executable files on this system
  17. EXE_SUFFIX = '.exe' if os.name == 'nt' else ''
  18. #: The path to the prebuilt 'dds' executable
  19. PREBUILT_DDS = (PREBUILT_DIR / 'dds').with_suffix(EXE_SUFFIX)
  20. #: The path to the main built 'dds' executable
  21. CUR_BUILT_DDS = (BUILD_DIR / 'dds').with_suffix(EXE_SUFFIX)
  22. @contextmanager
  23. def new_tempdir() -> Iterator[Path]:
  24. """
  25. Create and yield a new temporary directory, which will be destroyed on
  26. context-manager exit
  27. """
  28. tdir = Path(tempfile.mkdtemp())
  29. try:
  30. yield tdir
  31. finally:
  32. shutil.rmtree(tdir)
  33. def find_exe(name: str) -> Optional[Path]:
  34. """
  35. Find a file on the system by searching through the PATH environment variable.
  36. """
  37. sep = ';' if os.name == 'nt' else ':'
  38. paths = os.environ['PATH'].split(sep)
  39. exts = os.environ['PATHEXT'].split(';') if os.name == 'nt' else ['']
  40. for dirpath, ext in itertools.product(paths, exts):
  41. cand = Path(dirpath) / (name + ext)
  42. if cand.is_file():
  43. return cand
  44. return None