mirror of https://github.com/rui314/chibicc
Add -M option
This commit is contained in:
parent
f6944133d2
commit
d0c4667b6b
28
main.c
28
main.c
|
@ -10,6 +10,7 @@ bool opt_fcommon = true;
|
|||
static FileType opt_x;
|
||||
static StringArray opt_include;
|
||||
static bool opt_E;
|
||||
static bool opt_M;
|
||||
static bool opt_S;
|
||||
static bool opt_c;
|
||||
static bool opt_cc1;
|
||||
|
@ -176,6 +177,11 @@ static void parse_args(int argc, char **argv) {
|
|||
continue;
|
||||
}
|
||||
|
||||
if (!strcmp(argv[i], "-M")) {
|
||||
opt_M = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!strcmp(argv[i], "-cc1-input")) {
|
||||
base_file = argv[++i];
|
||||
continue;
|
||||
|
@ -326,6 +332,20 @@ static void print_tokens(Token *tok) {
|
|||
fprintf(out, "\n");
|
||||
}
|
||||
|
||||
// If -M options is given, the compiler write a list of input files to
|
||||
// stdout in a format that "make" command can read. This feature is
|
||||
// used to automate file dependency management.
|
||||
static void print_dependencies(void) {
|
||||
FILE *out = open_file(opt_o ? opt_o : "-");
|
||||
fprintf(out, "%s:", replace_extn(base_file, ".o"));
|
||||
|
||||
File **files = get_input_files();
|
||||
|
||||
for (int i = 0; files[i]; i++)
|
||||
fprintf(out, " \\\n %s", files[i]->name);
|
||||
fprintf(out, "\n\n");
|
||||
}
|
||||
|
||||
static Token *must_tokenize_file(char *path) {
|
||||
Token *tok = tokenize_file(path);
|
||||
if (!tok)
|
||||
|
@ -369,6 +389,12 @@ static void cc1(void) {
|
|||
tok = append_tokens(tok, tok2);
|
||||
tok = preprocess(tok);
|
||||
|
||||
// If -M is given, print file dependencies.
|
||||
if (opt_M) {
|
||||
print_dependencies();
|
||||
return;
|
||||
}
|
||||
|
||||
// If -E is given, print out preprocessed C code as a result.
|
||||
if (opt_E) {
|
||||
print_tokens(tok);
|
||||
|
@ -551,7 +577,7 @@ int main(int argc, char **argv) {
|
|||
assert(type == FILE_C);
|
||||
|
||||
// Just preprocess
|
||||
if (opt_E) {
|
||||
if (opt_E || opt_M) {
|
||||
run_cc1(argc, argv, input, NULL);
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -221,4 +221,11 @@ check '.so'
|
|||
$chibicc -hashmap-test
|
||||
check 'hashmap'
|
||||
|
||||
# -M
|
||||
echo '#include "out2.h"' > $tmp/out.c
|
||||
echo '#include "out3.h"' >> $tmp/out.c
|
||||
touch $tmp/out2.h $tmp/out3.h
|
||||
$chibicc -M -I$tmp $tmp/out.c | grep -q -z '^out.o: .*/out\.c .*/out2\.h .*/out3\.h'
|
||||
check -M
|
||||
|
||||
echo OK
|
||||
|
|
Loading…
Reference in New Issue