sconsmodular.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import os
  2. import posixpath
  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. if module in env.get("SKIP_MODULES", []):
  21. continue
  22. build_res = env.BuildModule(module)
  23. # print("module ", module, build_res)
  24. if build_res is None:
  25. continue
  26. result.append(build_res)
  27. return result
  28. def PhonyTarget(env, name, action, source=None, **kw):
  29. if not source:
  30. source = []
  31. phony_name = "phony_" + name
  32. env.Pseudo(phony_name)
  33. command = env.Command(phony_name, source, action, **kw)
  34. env.AlwaysBuild(env.Alias(name, command))
  35. return command
  36. def ChangeFileExtension(env, fnode, ext):
  37. return env.File(f"#{os.path.splitext(fnode.path)[0]}{ext}")
  38. def generate(env):
  39. env.AddMethod(BuildModule)
  40. env.AddMethod(BuildModules)
  41. env.AddMethod(PhonyTarget)
  42. env.AddMethod(ChangeFileExtension)
  43. def exists(env):
  44. return True