diff options
-rw-r--r-- | gcc/testsuite/g++.dg/modules/dep-4.H | 7 | ||||
-rw-r--r-- | libcpp/files.cc | 7 | ||||
-rw-r--r-- | libcpp/internal.h | 1 | ||||
-rw-r--r-- | libcpp/mkdeps.cc | 16 |
4 files changed, 31 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/modules/dep-4.H b/gcc/testsuite/g++.dg/modules/dep-4.H new file mode 100644 index 0000000..070fa5a --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/dep-4.H @@ -0,0 +1,7 @@ +// { dg-do preprocess } +// { dg-additional-options "-fmodules -M" } + +inline void f() { } + +// { dg-final { scan-file dep-4.i {dep-4\.H\.c\+\+-header-unit:} } } +// { dg-final { scan-file-not dep-4.i {inline} } } diff --git a/libcpp/files.cc b/libcpp/files.cc index 840dffc..1cbce49 100644 --- a/libcpp/files.cc +++ b/libcpp/files.cc @@ -2336,6 +2336,13 @@ _cpp_get_file_stat (_cpp_file *file) return &file->st; } +/* Return the directory where FILE was found. */ +struct cpp_dir * +_cpp_get_file_dir (_cpp_file *file) +{ + return file->dir; +} + /* Set the include chain for "" to QUOTE, for <> to BRACKET. If QUOTE_IGNORES_SOURCE_DIR, then "" includes do not look in the directory of the including file. diff --git a/libcpp/internal.h b/libcpp/internal.h index d91acd6..ad4e590 100644 --- a/libcpp/internal.h +++ b/libcpp/internal.h @@ -786,6 +786,7 @@ extern bool _cpp_save_file_entries (cpp_reader *pfile, FILE *f); extern bool _cpp_read_file_entries (cpp_reader *, FILE *); extern const char *_cpp_get_file_name (_cpp_file *); extern struct stat *_cpp_get_file_stat (_cpp_file *); +extern struct cpp_dir *_cpp_get_file_dir (_cpp_file *); extern bool _cpp_has_header (cpp_reader *, const char *, int, enum include_type); diff --git a/libcpp/mkdeps.cc b/libcpp/mkdeps.cc index a31890a..b37d330 100644 --- a/libcpp/mkdeps.cc +++ b/libcpp/mkdeps.cc @@ -463,6 +463,19 @@ make_write (const cpp_reader *pfile, FILE *fp, unsigned int colmax) /* module-name : cmi-name */ column = make_write_name (d->module_name, fp, 0, colmax, true, ".c++-module"); + const char *module_basename = nullptr; + if (d->is_header_unit) + { + /* Also emit a target for the include name, so for #include + <iostream> you'd make iostream.c++-header-unit, regardless of + what actual directory iostream lives in. We reconstruct the + include name by skipping the directory where we found it. */ + auto *dir = _cpp_get_file_dir (pfile->main_file); + gcc_assert (!strncmp (d->module_name, dir->name, dir->len)); + module_basename = (d->module_name + dir->len + 1); + column = make_write_name (module_basename, fp, column, colmax, + true, ".c++-header-unit"); + } fputs (":", fp); column++; column = make_write_name (d->cmi_name, fp, column, colmax); @@ -471,6 +484,9 @@ make_write (const cpp_reader *pfile, FILE *fp, unsigned int colmax) column = fprintf (fp, ".PHONY:"); column = make_write_name (d->module_name, fp, column, colmax, true, ".c++-module"); + if (module_basename) + column = make_write_name (module_basename, fp, column, colmax, + true, ".c++-header-unit"); fputs ("\n", fp); } |