diff options
author | Jason Merrill <jason@redhat.com> | 2024-06-04 21:15:02 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2024-11-18 09:18:17 +0100 |
commit | 7b8b96a327f2201531c0a2b32db490532db4aa39 (patch) | |
tree | 230f7a30b0642864aa8b2c2fd764b50b50327447 /libcpp | |
parent | 0dc389f21bfd4ee49d57bcfaa1d1936456c55e48 (diff) | |
download | gcc-7b8b96a327f2201531c0a2b32db490532db4aa39.zip gcc-7b8b96a327f2201531c0a2b32db490532db4aa39.tar.gz gcc-7b8b96a327f2201531c0a2b32db490532db4aa39.tar.bz2 |
libcpp: add .c++-header-unit target
The dependency output for header unit modules is based on the absolute
pathname of the header file, but that's not something that a makefile can
portably refer to. This patch adds a .c++-header-unit target based on the
header name relative to an element of the include path.
libcpp/ChangeLog:
* internal.h (_cpp_get_file_dir): Declare.
* files.cc (_cpp_get_file_dir): New fn.
* mkdeps.cc (make_write): Use it.
gcc/testsuite/ChangeLog:
* g++.dg/modules/dep-4.H: New test.
Diffstat (limited to 'libcpp')
-rw-r--r-- | libcpp/files.cc | 7 | ||||
-rw-r--r-- | libcpp/internal.h | 1 | ||||
-rw-r--r-- | libcpp/mkdeps.cc | 16 |
3 files changed, 24 insertions, 0 deletions
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); } |