Generator.hx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. class Generator {
  2. static function compile() {
  3. var errored = [];
  4. Sys.setCwd("build");
  5. var cwd = Sys.getCwd();
  6. var installedLibs = new Map<String,Bool>();
  7. function hasLib( l ) {
  8. if( installedLibs.exists(l) )
  9. return installedLibs.get(l);
  10. var ok = new sys.io.Process("haxelib",["path",l]).exitCode() == 0;
  11. installedLibs.set(l,ok);
  12. return ok;
  13. }
  14. for( f in sys.FileSystem.readDirectory(".") ) {
  15. if( !sys.FileSystem.isDirectory(f) )
  16. continue;
  17. var dir = cwd+"/"+f;
  18. Sys.setCwd(dir);
  19. for( d in sys.FileSystem.readDirectory(dir) ) {
  20. if( !StringTools.endsWith(d,".hxml") ) continue;
  21. var name = d.substr(0,-5);
  22. if( f != name ) name = f+"/"+name;
  23. var pass = false;
  24. Sys.println(name);
  25. var hxml = sys.io.File.getContent(d);
  26. var r_libs = ~/\-lib ([A-Za-z0-9_]+)/;
  27. var skip = false;
  28. while( r_libs.match(hxml) ) {
  29. var lib = r_libs.matched(1);
  30. if( !hasLib(lib) ) {
  31. skip = true;
  32. Sys.println(lib+" not found, skip");
  33. break;
  34. }
  35. hxml = r_libs.matchedRight();
  36. }
  37. if( skip ) continue;
  38. if( StringTools.endsWith(name,"_hl") )
  39. d = "-lib hlsdl "+d;
  40. try {
  41. if( Sys.command("haxe "+d) == 0 ) pass = true;
  42. } catch( e : Dynamic ) {
  43. Sys.println(e);
  44. }
  45. if( !pass ) errored.push(name);
  46. }
  47. Sys.setCwd(cwd);
  48. }
  49. if( errored.length > 0 ) {
  50. Sys.println(errored.length+" ERRORED : "+errored);
  51. Sys.exit(1);
  52. }
  53. Sys.println("DONE");
  54. }
  55. #if hscript
  56. static function generateProjects() {
  57. var templates = [];
  58. function getRec(path) {
  59. for( f in sys.FileSystem.readDirectory(path) ) {
  60. var file = path+"/"+f;
  61. if( sys.FileSystem.isDirectory(file) ) {
  62. getRec(file);
  63. continue;
  64. }
  65. templates.push({ file : file.substr(10), data : sys.io.File.getContent(file) });
  66. }
  67. }
  68. getRec("templates");
  69. try sys.FileSystem.createDirectory("build") catch( e : Dynamic ) {};
  70. sys.io.File.saveContent("build/README.txt","This directory is automatically generated by samples/Script.hx using samples/templates");
  71. for( f in sys.FileSystem.readDirectory(".") ) {
  72. if( sys.FileSystem.isDirectory(f) || !StringTools.endsWith(f,".hx") )
  73. continue;
  74. var title = f.split(".").shift();
  75. if( title == "Generator" || title == "SampleApp" ) continue;
  76. var name = title.charAt(0).toLowerCase() + title.substr(1);
  77. var params = [];
  78. if( sys.FileSystem.exists(name+"_res") )
  79. params.push("-D resourcesPath=../../"+name+"_res");
  80. var content = sys.io.File.getContent(f);
  81. ~/\/\/PARAM=(.*)/g.map(content,function(r) { params.push(StringTools.trim(r.matched(1))); return ""; });
  82. var context = {
  83. main : title,
  84. name : name,
  85. params : params.join("\n"),
  86. StringTools : StringTools,
  87. };
  88. try sys.FileSystem.createDirectory("build/"+name) catch( e : Dynamic ) {};
  89. #if !silent
  90. Sys.println(name);
  91. #end
  92. sys.io.File.saveContent('build/$name/$f', sys.io.File.getContent(f));
  93. var interp = new hscript.Interp();
  94. for( f in Reflect.fields(context) )
  95. interp.variables.set(f, Reflect.field(context, f));
  96. for( t in templates ) {
  97. var data = ~/::([^:]+)::/g.map(t.data, function(r) {
  98. var script = r.matched(1);
  99. var expr = new hscript.Parser().parseString(script);
  100. return "" + interp.execute(expr);
  101. });
  102. var file = t.file.split("__name").join(name);
  103. var dir = file.split("/");
  104. dir.pop();
  105. try sys.FileSystem.createDirectory("build/" + name + "/" + dir.join("/")) catch( e : Dynamic ) {};
  106. sys.io.File.saveContent("build/" + name + "/" + file, data);
  107. }
  108. }
  109. }
  110. #end
  111. }