target_runenvs.lua 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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. -- config target
  10. function _config_target(target)
  11. local oldenvs = os.addenvs(target:pkgenvs())
  12. for _, rule in ipairs(target:orderules()) do
  13. local on_config = rule:script("config")
  14. if on_config then
  15. on_config(target)
  16. end
  17. end
  18. local on_config = target:script("config")
  19. if on_config then
  20. on_config(target)
  21. end
  22. if oldenvs then
  23. os.setenvs(oldenvs)
  24. end
  25. end
  26. -- config targets
  27. function _config_targets()
  28. for _, target in ipairs(project.ordertargets()) do
  29. if target:is_enabled() then
  30. _config_target(target)
  31. end
  32. end
  33. end
  34. -- recursively target add env
  35. function _add_target_pkgenvs(target, envs, targets_added)
  36. if targets_added[target:name()] then
  37. return
  38. end
  39. targets_added[target:name()] = true
  40. local pkgenvs = target:pkgenvs()
  41. if pkgenvs then
  42. os.addenvs(pkgenvs)
  43. for _, name in ipairs(table.keys(pkgenvs)) do
  44. envs[name] = os.getenv(name)
  45. end
  46. end
  47. for _, dep in ipairs(target:orderdeps()) do
  48. _add_target_pkgenvs(dep, envs, targets_added)
  49. end
  50. end
  51. -- main entry
  52. function main (targetname)
  53. -- load config
  54. config.load()
  55. if not os.isfile(os.projectfile()) then
  56. return
  57. end
  58. _config_targets()
  59. -- get target
  60. local target = nil
  61. if targetname then
  62. target = project.target(targetname)
  63. end
  64. if not target then
  65. for _, t in pairs(project.targets()) do
  66. local default = t:get("default")
  67. if (default == nil or default == true) and t:get("kind") == "binary" then
  68. target = t
  69. break
  70. end
  71. end
  72. end
  73. -- get run envs
  74. local envs = {}
  75. if target then
  76. local oldenvs = os.getenvs()
  77. _add_target_pkgenvs(target, envs, {})
  78. local addrunenvs, setrunenvs = runenvs and runenvs.make(target) or make_runenvs(target)
  79. for name, values in pairs(addrunenvs) do
  80. os.addenv(name, table.unpack(table.wrap(values)))
  81. envs[name] = os.getenv(name)
  82. end
  83. for name, value in pairs(setrunenvs) do
  84. os.setenv(name, table.unpack(table.wrap(value)))
  85. envs[name] = os.getenv(name)
  86. end
  87. os.setenvs(oldenvs)
  88. end
  89. -- convert to envirnoments for vscode
  90. local empty = true
  91. local envirnoments = {}
  92. for k, v in pairs(envs) do
  93. table.insert(envirnoments, {name = k, value = v})
  94. empty = false
  95. end
  96. if json.mark_as_array then
  97. json.mark_as_array(envirnoments)
  98. end
  99. -- denote the start of vscode information to ignore anything logging to stdout before this point
  100. print("__begin__")
  101. if not empty then
  102. print(json.encode(envirnoments))
  103. else
  104. print("[]")
  105. end
  106. -- print end tag to ignore other deprecated/warnings infos
  107. print("__end__")
  108. end