const PADDING = 24; for(var i = 1; i < ARGV.length; i++) { if(ARGV[i] == "--help") { var keys; console.log("PMake " + pmake.VERSION + " - Pyrite's build script generator"); console.log(""); console.log("Usage: " + ARGV[0] + " [options]"); keys = Object.keys(pmake.options_category); for(var i = 0; i < keys.length; i++) { console.log(""); console.log("OPTIONS - " + keys[i]); var keys2 = Object.keys(pmake.options_category[keys[i]]); for(var j = 0; j < keys2.length; j++) { const opt = pmake.options_category[keys[i]][keys2[j]]; var arg = ""; var opts = []; if(opt.option) { arg = "=" + opt.option; } console.log(" --" + keys2[j] + arg + " ".repeat(PADDING - keys2[j].length - 2 - arg.length) + opt.description); if(!opt.options) { } else if((typeof opt.options) == "function") { opts = opt.options(); } else { opts = opt.options; } if(opts.length > 0) { for(var k = 0; k < opts.length; k++) { console.log(" " + opts[k]); } console.log(""); } } } process.exit(0); } else if(ARGV[i].startsWith("--")) { var args = ARGV[i].split("="); args[0] = args[0].substr(2); if(pmake.options[args[0]]) { var opts = pmake.options[args[0]].options; var opt = pmake.options[args[0]].option; if(opts) { if((typeof opts) == "function") opts = opts(); } if(opts && !args[1]) { console.log("Error: no value specified for option '" + args[0] + "'"); process.exit(1); } else if(opts && !opts.includes(args[1])) { console.log("Error: invalid value '" + args[1] + "' for option '" + args[0] + "'"); process.exit(1); } else if(opts || opt) { pmake.options[args[0]].action(args[1].replace(/^~(\/?)/, fs.home + "$1")); } else { pmake.options[args[0]].action(); } } else { console.log("Error: invalid option '" + args[0] + "'"); process.exit(1); } } } if(!this.main) { console.log("No main function was defined!"); process.exit(1); } main(); (function() { function makefile(target) { return target.base + "/" + target.target + ".make"; } function make(output) { const targets = pmake.resolveProjects(pmake.projects); function target_map(x) { return x.target; } var mk = new pmake.File(output, "w"); mk.write("# This file was auto-generated. Do not edit manually!\n"); mk.write("\n"); mk.write("SILENT = @\n"); if(WIN32) { mk.write("RM = del /q\n"); mk.write("NOP = cd .\n"); } else { mk.write("RM = rm -f\n"); mk.write("NOP = :\n"); } mk.write("\n"); mk.write(".PHONY: all clean\n"); if(output == "Makefile") { mk.write(".PHONY: " + targets.map(target_map).join(" ") + " distclean\n"); mk.write("\n"); mk.write("MAKEARGS$(.TARGET) = --no-print-directory"); mk.write("\n"); mk.write("all: " + pmake.projects.map(target_map).join(" ") + "\n"); mk.write(" @$(NOP)\n"); mk.write("\n"); for(var i = 0; i < targets.length; i++) { mk.write(targets[i].target + ": " + pmake.resolveProjects(targets[i].libraries).map(target_map).join(" ") + "\n"); mk.write(" @cd " + targets[i].base + " && $(MAKE) $(MAKEARGS) -f " + targets[i].target + ".make\n"); mk.write("\n"); } mk.write("clean:\n"); for(var i = 0; i < targets.length; i++) { mk.write(" @cd " + targets[i].base + " && $(MAKE) $(MAKEARGS) -f " + targets[i].target + ".make clean\n"); } mk.write("\n"); mk.write("distclean: clean\n"); mk.write(" $(SILENT)$(RM) Makefile\n"); for(var i = 0; i < targets.length; i++) { mk.write(" $(SILENT)$(RM) " + makefile(targets[i]) + "\n"); } } else { function target_filter(x) { const p = output.replace(/\.make$/, "").split("/"); return x.target == p[p.length - 1]; } const self = targets.filter(target_filter)[0]; const objs = self.sources.map(pmake.compiler.output); mk.write("\n"); mk.write("all: " + pmake.compiler.output(self) + "\n"); mk.write(" @$(NOP)\n"); mk.write("\n"); mk.write(pmake.compiler.output(self) + ": " + objs.join(" ") + "\n"); if(!(self instanceof pmake.InterfaceProject)) { var usage = ""; if(self instanceof pmake.LibraryProject) { usage = "LIB"; } else { usage = "LINK"; } mk.write(" @echo " + usage + " " + pmake.compiler.output(self) + "\n"); mk.write(" $(SILENT)" + pmake.compiler.link(self, objs) + "\n"); } mk.write("\n"); for(var i = 0; i < objs.length; i++) { var usage = ""; if(pmake.isCxx(self.sources[i])) { usage = "CXX"; } else { usage = "CC"; } mk.write(objs[i] + ": " + self.sources[i] + "\n"); mk.write(" @echo " + usage + " " + self.sources[i] + "\n"); mk.write(" $(SILENT)" + pmake.compiler.compile(self, objs[i], self.sources[i]) + "\n"); mk.write("\n"); } mk.write("clean: \n"); mk.write(" $(SILENT)$(RM) " + pmake.compiler.output(self) + " " + objs.join(" ") + "\n"); } mk.close(); } make("Makefile"); const targets = pmake.resolveProjects(pmake.projects); for(var i = 0; i < targets.length; i++) { make(makefile(targets[i])); } })();