mirror of
https://github.com/buserror/mii_emu.git
synced 2024-11-28 10:52:35 +00:00
58 lines
1.2 KiB
Bash
58 lines
1.2 KiB
Bash
|
#!/bin/bash
|
||
|
# Generate a JSON file compatible with clangd for indexing. Parses
|
||
|
# the output of the make process, extract gcc lines, and convert to JSON
|
||
|
# using (gnu) AWK
|
||
|
# Join lines that finish by \ -- then split the large command lines around
|
||
|
# && and ||, then look for gcc, then split and look for a .c argument.
|
||
|
# when found, populate the compile_commands.json file
|
||
|
gawk -v dir="$(pwd)" '
|
||
|
BEGIN {
|
||
|
acc="";line=0;
|
||
|
print "[";
|
||
|
}
|
||
|
END {
|
||
|
print "]";
|
||
|
}
|
||
|
/\\ *$/ {
|
||
|
$0 = gensub(/\\ *$/, "", "g", $0);
|
||
|
acc = acc $0
|
||
|
next;
|
||
|
}
|
||
|
/\|\| *$/ {
|
||
|
acc = acc $0
|
||
|
next;
|
||
|
}
|
||
|
/^g?make\[([0-9]+)]/ {
|
||
|
if ($2 != "Entering")
|
||
|
next;
|
||
|
dir = gensub(/'\''/, "", "g", $4)
|
||
|
next;
|
||
|
}
|
||
|
{
|
||
|
acc = acc $0
|
||
|
acc = gensub(/([^\\])"/, "\\1\\\\\"", "g", acc);
|
||
|
acc = gensub(/ +/, " ", "g", acc);
|
||
|
cnt = split(acc, e, / *\|\| *| *&& */);
|
||
|
acc = "";
|
||
|
for (cmd in e) {
|
||
|
e[cmd] = gensub(/[ |\t]+$/, "", "g", e[cmd]);
|
||
|
split(e[cmd], arg, / +/);
|
||
|
if (!match(arg[1], /g?cc$/))
|
||
|
continue;
|
||
|
c_file=""
|
||
|
for (ai in arg) {
|
||
|
if (match(arg[ai], /\.c$/)) {
|
||
|
c_file = arg[ai];
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if (c_file != "") {
|
||
|
if (line > 0) printf ",";
|
||
|
line++;
|
||
|
printf "{\"directory\":\"%s\",\"file\":\"%s\",\"command\":\"%s\"}\n",
|
||
|
dir, c_file, e[cmd];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
'
|