pmake/src/js/cmdline.js

168 lines
4.5 KiB
JavaScript
Raw Normal View History

2026-05-09 03:16:12 +09:00
const PADDING = 24;
2026-05-08 05:18:35 +09:00
2026-05-08 05:35:07 +09:00
for(var i = 1; i < ARGV.length; i++) {
if(ARGV[i] == "--help") {
2026-05-08 19:07:45 +09:00
var keys;
2026-05-08 05:18:35 +09:00
console.log("PMake " + pmake.VERSION + " - Pyrite's build script generator");
console.log("");
2026-05-09 03:16:12 +09:00
console.log("Usage: " + ARGV[0] + " [options]");
2026-05-09 17:42:23 +09:00
keys = Object.keys(pmake.options_category);
2026-05-09 03:16:12 +09:00
for(var i = 0; i < keys.length; i++) {
console.log("");
console.log("OPTIONS - " + keys[i]);
2026-05-09 17:42:23 +09:00
var keys2 = Object.keys(pmake.options_category[keys[i]]);
2026-05-09 03:16:12 +09:00
for(var j = 0; j < keys2.length; j++) {
2026-05-09 17:42:23 +09:00
const opt = pmake.options_category[keys[i]][keys2[j]];
2026-05-09 03:16:12 +09:00
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("");
}
}
}
2026-05-08 05:18:35 +09:00
process.exit(0);
2026-05-08 05:35:07 +09:00
} else if(ARGV[i].startsWith("--")) {
2026-05-09 16:20:44 +09:00
var args = ARGV[i].split("=");
args[0] = args[0].substr(2);
if(pmake.options[args[0]]) {
var opts = pmake.options[args[0]].options;
2026-05-10 02:27:06 +09:00
var opt = pmake.options[args[0]].option;
2026-05-10 02:18:11 +09:00
2026-05-09 16:20:44 +09:00
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);
2026-05-10 02:27:06 +09:00
} else if(opts && !opts.includes(args[1])) {
2026-05-09 16:20:44 +09:00
console.log("Error: invalid value '" + args[1] + "' for option '" + args[0] + "'");
process.exit(1);
2026-05-10 02:27:06 +09:00
} else if(opts || opt) {
2026-05-09 16:20:44 +09:00
pmake.options[args[0]].action(args[1]);
} else {
pmake.options[args[0]].action();
}
} else {
console.log("Error: invalid option '" + args[0] + "'");
process.exit(1);
}
2026-05-08 05:18:35 +09:00
}
}
2026-05-08 19:07:45 +09:00
2026-05-10 01:33:16 +09:00
if(!this.main) {
console.log("No main function was defined!");
process.exit(1);
}
2026-05-09 17:40:43 +09:00
main();
2026-05-09 03:16:20 +09:00
(function() {
2026-05-10 00:22:00 +09:00
function makefile(target) {
return target.base + "/" + target.target + ".make";
}
2026-05-09 03:16:20 +09:00
function make(output) {
2026-05-09 16:20:44 +09:00
const targets = pmake.resolveProjects(pmake.projects);
function target_map(x) {
return x.target;
}
2026-05-09 03:16:12 +09:00
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");
2026-05-09 16:20:44 +09:00
mk.write("RM = rm -f\n");
2026-05-09 03:16:12 +09:00
mk.write("\n");
2026-05-09 16:20:44 +09:00
mk.write(".PHONY: all clean\n");
2026-05-09 03:16:12 +09:00
2026-05-09 03:16:20 +09:00
if(output == "Makefile") {
2026-05-09 16:57:33 +09:00
mk.write(".PHONY: " + targets.map(target_map).join(" ") + " distclean\n");
2026-05-09 16:20:44 +09:00
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("\n");
2026-05-09 03:16:20 +09:00
for(var i = 0; i < targets.length; i++) {
2026-05-09 16:20:44 +09:00
mk.write(targets[i].target + ": " + pmake.resolveProjects(targets[i].libraries).map(target_map).join(" ") + "\n");
2026-05-10 01:10:59 +09:00
mk.write(" @cd " + targets[i].base + " ; $(MAKE) $(MAKEARGS) -f " + targets[i].target + ".make\n");
2026-05-09 03:16:12 +09:00
mk.write("\n");
}
2026-05-09 16:20:44 +09:00
mk.write("clean:\n");
for(var i = 0; i < targets.length; i++) {
2026-05-10 01:10:59 +09:00
mk.write(" @cd " + targets[i].base + " ; $(MAKE) $(MAKEARGS) -f " + targets[i].target + ".make clean\n");
2026-05-09 16:20:44 +09:00
}
2026-05-09 16:57:33 +09:00
mk.write("\n");
mk.write("distclean: clean\n");
2026-05-10 00:22:00 +09:00
mk.write(" $(SILENT)rm -f Makefile\n");
for(var i = 0; i < targets.length; i++) {
mk.write(" $(SILENT)rm -f " + makefile(targets[i]) + "\n");
}
2026-05-09 03:16:20 +09:00
} else {
2026-05-09 16:20:44 +09:00
function target_filter(x) {
2026-05-10 00:22:00 +09:00
const p = output.replace(/\.make$/, "").split("/");
return x.target == p[p.length - 1];
2026-05-09 16:20:44 +09:00
}
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("\n");
mk.write(pmake.compiler.output(self) + ": " + objs.join(" ") + "\n");
2026-05-09 17:40:43 +09:00
if(!(self instanceof pmake.InterfaceProject)) {
mk.write(" @echo LINK " + pmake.compiler.output(self) + "\n");
mk.write(" $(SILENT)" + pmake.compiler.link(self, objs) + "\n");
}
2026-05-09 16:20:44 +09:00
mk.write("\n");
for(var i = 0; i < objs.length; i++) {
mk.write(objs[i] + ": " + self.sources[i] + "\n");
2026-05-09 16:39:35 +09:00
mk.write(" @echo CC/CXX " + self.sources[i] + "\n");
mk.write(" $(SILENT)" + pmake.compiler.compile(self, objs[i], self.sources[i]) + "\n");
2026-05-09 16:20:44 +09:00
mk.write("\n");
}
mk.write("clean: \n");
2026-05-09 16:39:35 +09:00
mk.write(" $(SILENT)$(RM) " + pmake.compiler.output(self) + " " + objs.join(" ") + "\n");
2026-05-09 03:16:12 +09:00
}
mk.close();
}
make("Makefile");
2026-05-09 16:20:44 +09:00
const targets = pmake.resolveProjects(pmake.projects);
2026-05-09 03:16:20 +09:00
for(var i = 0; i < targets.length; i++) {
2026-05-10 00:22:00 +09:00
make(makefile(targets[i]));
2026-05-08 19:07:45 +09:00
}
2026-05-09 03:16:12 +09:00
})();