target_informations.lua 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. -- imports
  2. import("core.project.config")
  3. import("core.project.project")
  4. import("core.base.json")
  5. import("private.action.run.runenvs", {try = true})
  6. if not runenvs then
  7. import("private.action.run.make_runenvs")
  8. end
  9. -- recursively target add env
  10. function _add_target_pkgenvs(target, envs, targets_added)
  11. if targets_added[target:name()] then
  12. return
  13. end
  14. targets_added[target:name()] = true
  15. local pkgenvs = target:pkgenvs()
  16. if pkgenvs then
  17. os.addenvs(pkgenvs)
  18. for _, name in ipairs(table.keys(pkgenvs)) do
  19. envs[name] = os.getenv(name)
  20. end
  21. end
  22. for _, dep in ipairs(target:orderdeps()) do
  23. _add_target_pkgenvs(dep, envs, targets_added)
  24. end
  25. end
  26. function _get_path(target)
  27. if target then
  28. return path.join(os.projectdir(), target:targetfile())
  29. end
  30. end
  31. function _get_rundir(target)
  32. if target then
  33. return path.absolute(target:rundir())
  34. end
  35. end
  36. function _get_name(target)
  37. if target then
  38. return target:name()
  39. end
  40. end
  41. function _get_envs(target)
  42. local envs = {}
  43. if target then
  44. local oldenvs = os.getenvs()
  45. _add_target_pkgenvs(target, envs, {})
  46. local addrunenvs, setrunenvs = runenvs and runenvs.make(target) or make_runenvs(target)
  47. for name, values in pairs(addrunenvs) do
  48. os.addenv(name, table.unpack(table.wrap(values)))
  49. envs[name] = os.getenv(name)
  50. end
  51. for name, value in pairs(setrunenvs) do
  52. os.setenv(name, table.unpack(table.wrap(value)))
  53. envs[name] = os.getenv(name)
  54. end
  55. os.setenvs(oldenvs)
  56. return envs
  57. end
  58. return {}
  59. end
  60. -- main entry
  61. function main(targetname)
  62. -- load config
  63. config.load()
  64. if not os.isfile(os.projectfile()) then
  65. return
  66. end
  67. -- get target
  68. local target = nil
  69. if targetname then
  70. target = project.target(targetname)
  71. end
  72. if not target then
  73. for _, t in pairs(project.targets()) do
  74. local default = t:get("default")
  75. if (default == nil or default == true) and t:get("kind") == "binary" then
  76. target = t
  77. break
  78. end
  79. end
  80. end
  81. local infos = {}
  82. infos["rundir"] = _get_rundir(target)
  83. infos["envs"] = _get_envs(target)
  84. infos["path"] = _get_path(target)
  85. infos["name"] = _get_name(target)
  86. -- denote the start of vscode information to ignore anything logging to stdout before this point
  87. print("__begin__")
  88. print(json.encode(infos))
  89. -- print end tag to ignore other deprecated/warnings infos
  90. print("__end__")
  91. end