sconsmodular.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import posixpath
  2. import os
  3. from SCons.Errors import UserError
  4. def BuildModule(env, module):
  5. src_dir = str(env.Dir(".").srcdir or os.getcwd())
  6. module_sconscript = posixpath.join(src_dir, module, "SConscript")
  7. if not os.path.exists(module_sconscript):
  8. module_sconscript = posixpath.join(src_dir, f"{module}.scons")
  9. if not os.path.exists(module_sconscript):
  10. raise UserError(f"Cannot build module {module}: scons file not found")
  11. env.Append(PY_LINT_SOURCES=[module_sconscript])
  12. return env.SConscript(
  13. module_sconscript,
  14. variant_dir=posixpath.join(env.subst("$BUILD_DIR"), module),
  15. duplicate=0,
  16. )
  17. def BuildModules(env, modules):
  18. result = []
  19. for module in modules:
  20. build_res = env.BuildModule(module)
  21. # print("module ", module, build_res)
  22. if build_res is None:
  23. continue
  24. result.append(build_res)
  25. return result
  26. def PhonyTarget(env, name, action, source=None, **kw):
  27. if not source:
  28. source = []
  29. phony_name = "phony_" + name
  30. env.Pseudo(phony_name)
  31. command = env.Command(phony_name, source, action, **kw)
  32. env.AlwaysBuild(env.Alias(name, command))
  33. return command
  34. def ChangeFileExtension(env, fnode, ext):
  35. return env.File(f"#{os.path.splitext(fnode.path)[0]}{ext}")
  36. def generate(env):
  37. env.AddMethod(BuildModule)
  38. env.AddMethod(BuildModules)
  39. env.AddMethod(PhonyTarget)
  40. env.AddMethod(ChangeFileExtension)
  41. def exists(env):
  42. return True