Paths.vala 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. using Invercargill.Mapping;
  2. namespace Usm {
  3. public class Paths {
  4. public string destination { get; set; }
  5. public string prefix { get; set; }
  6. public string bin { get; set; }
  7. public string include { get; set; }
  8. public string data { get; set; }
  9. public string info { get; set; }
  10. public string lib { get; set; }
  11. public string canonlib { get; set; }
  12. public string man { get; set; }
  13. public string libexec { get; set; }
  14. public string locale { get; set; }
  15. public string local_state { get; set;}
  16. public string sbin { get; set; }
  17. public string shared_state { get; set; }
  18. public string sys_config { get; set; }
  19. public string tags { get; set; }
  20. public string usm_config_dir { get; set; }
  21. public void set_envs() {
  22. Environment.set_variable("DESTDIR", Paths.ensure_trailing_slash(destination), true);
  23. Environment.set_variable("PREFIX", Paths.ensure_trailing_slash(prefix), true);
  24. Environment.set_variable("BINDIR", add_prefix(bin), true);
  25. Environment.set_variable("INCLUDEDIR", add_prefix(include), true);
  26. Environment.set_variable("DATADIR", add_prefix(data), true);
  27. Environment.set_variable("INFODIR", add_prefix(info), true);
  28. Environment.set_variable("LIBDIR", add_prefix(lib), true);
  29. Environment.set_variable("CANONLIBDIR", add_prefix(canonlib), true);
  30. Environment.set_variable("MANDIR", add_prefix(man), true);
  31. Environment.set_variable("LIBEXECDIR", add_prefix(libexec), true);
  32. Environment.set_variable("LOCALEDIR", add_prefix(locale), true);
  33. Environment.set_variable("LOCALSTATEDIR", Paths.ensure_trailing_slash(local_state), true);
  34. Environment.set_variable("SBINDIR", add_prefix(sbin), true);
  35. Environment.set_variable("SHAREDSTATEDIR", Paths.ensure_trailing_slash(shared_state), true);
  36. Environment.set_variable("SYSCONFIGDIR", Paths.ensure_trailing_slash(sys_config), true);
  37. Environment.set_variable("TAGSDIR", add_prefix(tags), true);
  38. }
  39. public static string ensure_trailing_slash(string path) {
  40. if (path == null || path.length == 0) {
  41. return "/";
  42. }
  43. return path.has_suffix("/") ? path : path + "/";
  44. }
  45. public string add_prefix(string path) {
  46. return ensure_trailing_slash(Path.build_filename(prefix, path));
  47. }
  48. public string get_suggested_base_path_for_type(ResourceType type) {
  49. switch (type) {
  50. case ResourceType.ROOT_PATH:
  51. return destination;
  52. case ResourceType.PATH:
  53. return Path.build_filename(destination, prefix);
  54. case ResourceType.OPTIONAL:
  55. return Path.build_filename(destination, "opt");
  56. case Usm.ResourceType.RESOURCE:
  57. return Path.build_filename(destination, prefix, data);
  58. case ResourceType.CONFIGURATION:
  59. return Path.build_filename(destination, sys_config);
  60. case Usm.ResourceType.BINARY:
  61. return Path.build_filename(destination, prefix, bin);
  62. case Usm.ResourceType.SUPER_BINARY:
  63. return Path.build_filename(destination, prefix, sbin);
  64. case Usm.ResourceType.LIBRARY:
  65. case Usm.ResourceType.LIBRARY_RESOURCE:
  66. return Path.build_filename(destination, prefix, lib);
  67. case Usm.ResourceType.LIBRARY_EXECUTABLE:
  68. return Path.build_filename(destination, prefix, libexec);
  69. case Usm.ResourceType.CANONICAL_LIBRARY:
  70. case Usm.ResourceType.CANONICAL_LIBRARY_RESOURCE:
  71. return Path.build_filename(destination, prefix, canonlib);
  72. case Usm.ResourceType.INFO_PAGE:
  73. return Path.build_filename(destination, prefix, info);
  74. case Usm.ResourceType.MANUAL_PAGE:
  75. return Path.build_filename(destination, prefix, man);
  76. case Usm.ResourceType.LOCALE:
  77. return Path.build_filename(destination, prefix, locale);
  78. case Usm.ResourceType.APPLICATION:
  79. return Path.build_filename(destination, prefix, "share", "applications");
  80. case Usm.ResourceType.INCLUDE:
  81. return Path.build_filename(destination, prefix, include);
  82. case Usm.ResourceType.PKG_CONFIG:
  83. return Path.build_filename(destination, prefix, lib, "pkgconfig");
  84. case Usm.ResourceType.VALA_API:
  85. return Path.build_filename(destination, prefix, "share", "vala", "vapi");
  86. case Usm.ResourceType.GOBJECT_IR:
  87. return Path.build_filename(destination, prefix, "share", "gir-1.0");
  88. case Usm.ResourceType.TYPELIB:
  89. return Path.build_filename(destination, prefix, lib, "girepository-1.0");
  90. case Usm.ResourceType.GIO_MODULE:
  91. return Path.build_filename(destination, prefix, lib, "gio", "modules");
  92. case Usm.ResourceType.TAG:
  93. return Path.build_filename(destination, prefix, tags);
  94. default:
  95. assert_not_reached();
  96. }
  97. }
  98. public string get_suggested_path_for_resource(ResourceRef resource) {
  99. if (resource.resource_type == ResourceType.TAG) {
  100. return get_tag_file_path(resource.resource);
  101. }
  102. return Path.build_filename(get_suggested_base_path_for_type(resource.resource_type), resource.resource);
  103. }
  104. public string get_tag_file_path(string tag) {
  105. var tag_path = tag.replace(".", "/");
  106. tag_path += ".tag";
  107. return Path.build_filename(destination, prefix, tags, tag_path);
  108. }
  109. public string get_tag_dir_path(string tag) {
  110. var tag_path = tag.replace(".", "/");
  111. return Path.build_filename(destination, prefix, tags, tag_path);
  112. }
  113. public Paths.defaults() {
  114. destination = "/";
  115. prefix = "/usr";
  116. bin = "bin";
  117. include = "include";
  118. data = "share";
  119. info = "share/info";
  120. lib = "lib";
  121. canonlib = "lib";
  122. man = "share/man";
  123. libexec = "libexec";
  124. locale = "share/locale";
  125. local_state = "var";
  126. sbin = "sbin";
  127. shared_state = "com";
  128. sys_config = "etc";
  129. tags = "share/usm-tags";
  130. usm_config_dir = "/etc/usm";
  131. }
  132. public Paths.usm_environ(Paths? defaults = null) {
  133. var fallback = defaults ?? new Paths.defaults();
  134. override_from_environment(fallback);
  135. }
  136. private Paths.empty() {}
  137. public Paths() {
  138. var provisional_paths = new Paths.usm_environ();
  139. try {
  140. var config = new Configuration.from_paths(provisional_paths);
  141. override_from_environment(config.paths);
  142. }
  143. catch {
  144. override_from_environment(provisional_paths);
  145. }
  146. }
  147. public Paths clone() {
  148. return new Paths() {
  149. destination = destination,
  150. prefix = prefix,
  151. bin = bin,
  152. include = include,
  153. data = data,
  154. info = info,
  155. lib = lib,
  156. canonlib = canonlib,
  157. man = man,
  158. libexec = libexec,
  159. locale = locale,
  160. local_state = local_state,
  161. sbin = sbin,
  162. shared_state = shared_state,
  163. sys_config = sys_config,
  164. tags = tags,
  165. usm_config_dir = usm_config_dir,
  166. };
  167. }
  168. private void override_from_environment(Paths fallback) {
  169. destination = Environment.get_variable("USM_DESTDIR") ?? fallback.destination;
  170. prefix = Environment.get_variable("USM_PREFIX") ?? fallback.prefix;
  171. bin = Environment.get_variable("USM_BINDIR") ?? fallback.bin;
  172. include = Environment.get_variable("USM_INCLUDEDIR") ?? fallback.include;
  173. data = Environment.get_variable("USM_DATADIR") ?? fallback.data;
  174. info = Environment.get_variable("USM_INFODIR") ?? fallback.info;
  175. lib = Environment.get_variable("USM_LIBDIR") ?? fallback.lib;
  176. canonlib = Environment.get_variable("USM_CANONLIBDIR") ?? fallback.canonlib;
  177. man = Environment.get_variable("USM_MANDIR") ?? fallback.man;
  178. libexec = Environment.get_variable("USM_LIBEXECDIR") ?? fallback.libexec;
  179. locale = Environment.get_variable("USM_LOCALEDIR") ?? fallback.locale;
  180. local_state = Environment.get_variable("USM_LOCALSTATEDIR") ?? fallback.local_state;
  181. sbin = Environment.get_variable("USM_SBINDIR") ?? fallback.sbin;
  182. shared_state = Environment.get_variable("USM_SHAREDSTATEDIR") ?? fallback.shared_state;
  183. sys_config = Environment.get_variable("USM_SYSCONFIGDIR") ?? fallback.sys_config;
  184. tags = Environment.get_variable("USM_TAGSDIR") ?? fallback.tags;
  185. usm_config_dir = Environment.get_variable("USM_CONFIGDIR") ?? fallback.usm_config_dir;
  186. }
  187. public static PropertyMapper<Paths> get_mapper() {
  188. return new PropertyMapperBuilder<Paths>()
  189. .map<string?>("prefix", o => o.prefix, (o, v) => o.prefix = v)
  190. .when_undefined(o => o.prefix = o.prefix)
  191. .map<string?>("bin", o => o.bin, (o, v) => o.bin = v)
  192. .when_undefined(o => o.bin = o.bin)
  193. .map<string?>("include", o => o.include, (o, v) => o.include = v)
  194. .when_undefined(o => o.include = o.include)
  195. .map<string?>("data", o => o.data, (o, v) => o.data = v)
  196. .when_undefined(o => o.data = o.data)
  197. .map<string?>("info", o => o.info, (o, v) => o.info = v)
  198. .when_undefined(o => o.info = o.info)
  199. .map<string?>("lib", o => o.lib, (o, v) => o.lib = v)
  200. .when_undefined(o => o.lib = o.lib)
  201. .map<string?>("canonlib", o => o.canonlib, (o, v) => o.canonlib = v)
  202. .when_undefined(o => o.canonlib = o.canonlib)
  203. .map<string?>("man", o => o.man, (o, v) => o.man = v)
  204. .when_undefined(o => o.man = o.man)
  205. .map<string?>("libexec", o => o.libexec, (o, v) => o.libexec = v)
  206. .when_undefined(o => o.libexec = o.libexec)
  207. .map<string?>("locale", o => o.locale, (o, v) => o.locale = v)
  208. .when_undefined(o => o.locale = o.locale)
  209. .map<string?>("localState", o => o.local_state, (o, v) => o.local_state = v)
  210. .when_undefined(o => o.local_state = o.local_state)
  211. .map<string?>("sbin", o => o.sbin, (o, v) => o.sbin = v)
  212. .when_undefined(o => o.sbin = o.sbin)
  213. .map<string?>("sharedState", o => o.shared_state, (o, v) => o.shared_state = v)
  214. .when_undefined(o => o.shared_state = o.shared_state)
  215. .map<string?>("sysConfig", o => o.sys_config, (o, v) => o.sys_config = v)
  216. .when_undefined(o => o.sys_config = o.sys_config)
  217. .map<string?>("tags", o => o.tags, (o, v) => o.tags = v)
  218. .when_undefined(o => o.tags = o.tags)
  219. .set_constructor(() => new Paths.defaults())
  220. .build();
  221. }
  222. }
  223. }