__init__.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import os
  2. from .. import build
  3. from .. import dependencies
  4. from .. import mlog
  5. from ..mesonlib import MesonException
  6. from ..interpreterbase import permittedKwargs, noKwargs
  7. class permittedSnippetKwargs:
  8. def __init__(self, permitted):
  9. self.permitted = permitted
  10. def __call__(self, f):
  11. def wrapped(s, interpreter, state, args, kwargs):
  12. for k in kwargs:
  13. if k not in self.permitted:
  14. mlog.warning('Passed invalid keyword argument "%s". This will become a hard error in the future.' % k)
  15. return f(s, interpreter, state, args, kwargs)
  16. return wrapped
  17. _found_programs = {}
  18. class ExtensionModule:
  19. def __init__(self):
  20. self.snippets = set() # List of methods that operate only on the interpreter.
  21. def is_snippet(self, funcname):
  22. return funcname in self.snippets
  23. def find_program(program_name, target_name):
  24. if program_name in _found_programs:
  25. return _found_programs[program_name]
  26. program = dependencies.ExternalProgram(program_name)
  27. if not program.found():
  28. m = "Target {!r} can't be generated as {!r} could not be found"
  29. raise MesonException(m.format(target_name, program_name))
  30. _found_programs[program_name] = program
  31. return program
  32. def get_include_args(include_dirs, prefix='-I'):
  33. '''
  34. Expand include arguments to refer to the source and build dirs
  35. by using @SOURCE_ROOT@ and @BUILD_ROOT@ for later substitution
  36. '''
  37. if not include_dirs:
  38. return []
  39. dirs_str = []
  40. for incdirs in include_dirs:
  41. if hasattr(incdirs, "held_object"):
  42. dirs = incdirs.held_object
  43. else:
  44. dirs = incdirs
  45. if isinstance(dirs, str):
  46. dirs_str += ['%s%s' % (prefix, dirs)]
  47. continue
  48. # Should be build.IncludeDirs object.
  49. basedir = dirs.get_curdir()
  50. for d in dirs.get_incdirs():
  51. expdir = os.path.join(basedir, d)
  52. srctreedir = os.path.join('@SOURCE_ROOT@', expdir)
  53. buildtreedir = os.path.join('@BUILD_ROOT@', expdir)
  54. dirs_str += ['%s%s' % (prefix, buildtreedir),
  55. '%s%s' % (prefix, srctreedir)]
  56. for d in dirs.get_extra_build_dirs():
  57. dirs_str += ['%s%s' % (prefix, d)]
  58. return dirs_str
  59. class ModuleReturnValue:
  60. def __init__(self, return_value, new_objects):
  61. self.return_value = return_value
  62. assert(isinstance(new_objects, list))
  63. self.new_objects = new_objects
  64. class GResourceTarget(build.CustomTarget):
  65. def __init__(self, name, subdir, kwargs):
  66. super().__init__(name, subdir, kwargs)
  67. class GResourceHeaderTarget(build.CustomTarget):
  68. def __init__(self, name, subdir, kwargs):
  69. super().__init__(name, subdir, kwargs)
  70. class GirTarget(build.CustomTarget):
  71. def __init__(self, name, subdir, kwargs):
  72. super().__init__(name, subdir, kwargs)
  73. class TypelibTarget(build.CustomTarget):
  74. def __init__(self, name, subdir, kwargs):
  75. super().__init__(name, subdir, kwargs)
  76. class VapiTarget(build.CustomTarget):
  77. def __init__(self, name, subdir, kwargs):
  78. super().__init__(name, subdir, kwargs)