From dbfbd3aa2c1fb6293defcb1ad16099bb8aa4a0cb Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 16 May 2024 21:43:20 -0400 Subject: c-family: add -fsearch-include-path The C++ modules code has a -fmodule-header (or -x c++-{user,system}-header) option to specify looking up headers to compile to header units on the usual include paths. I'd like to have the same functionality for full C++20 modules such as module std, which I proposed to live on the include path at bits/std.cc. But this behavior doesn't seem necessarily connected to modules, so I'm proposing a general C/C++ option to specify the behavior of looking in the include path for the input files specified on the command line. Other ideas for the name of the option are very welcome. The libcpp change is to allow -fsearch-include-path{,=user} to find files in the current working directory, like -include. This can be handy for a quick compile of both std.cc and a file that imports it, e.g. g++ -std=c++20 -fmodules -fsearch-include-path bits/std.cc importer.cc gcc/ChangeLog: * doc/cppopts.texi: Document -fsearch-include-path. * doc/invoke.texi: Mention it for modules. gcc/c-family/ChangeLog: * c.opt: Add -fsearch-include-path. * c-opts.cc (c_common_post_options): Handle it. gcc/cp/ChangeLog: * module.cc (module_preprocess_options): Don't override it. libcpp/ChangeLog: * internal.h (search_path_head): Declare. * files.cc (search_path_head): No longer static. * init.cc (cpp_read_main_file): Use it. --- gcc/c-family/c-opts.cc | 13 +++++++++++++ gcc/c-family/c.opt | 7 +++++++ gcc/cp/module.cc | 3 ++- gcc/doc/cppopts.texi | 15 +++++++++++++++ gcc/doc/invoke.texi | 5 +++++ 5 files changed, 42 insertions(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/c-family/c-opts.cc b/gcc/c-family/c-opts.cc index 3f2cabf..f66a0a0 100644 --- a/gcc/c-family/c-opts.cc +++ b/gcc/c-family/c-opts.cc @@ -770,6 +770,19 @@ c_common_handle_option (size_t scode, const char *arg, HOST_WIDE_INT value, cpp_opts->traditional = 1; break; + case OPT_fsearch_include_path: + cpp_opts->main_search = CMS_user; + break; + + case OPT_fsearch_include_path_: + if (!strcmp (arg, "user")) + cpp_opts->main_search = CMS_user; + else if (!strcmp (arg, "system")) + cpp_opts->main_search = CMS_system; + else + error ("invalid argument %qs to %<-fsearch-include-path%>", arg); + break; + case OPT_v: verbose = true; break; diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index 61cfe33..8224c82 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -2280,6 +2280,13 @@ frtti C++ ObjC++ Optimization Var(flag_rtti) Init(1) Generate run time type descriptor information. +fsearch-include-path +C ObjC C++ ObjC++ +Look for the main source file on the include path. + +fsearch-include-path= +C++ ObjC++ Joined RejectNegative Undocumented + fshort-enums C ObjC C++ ObjC++ LTO Optimization Var(flag_short_enums) Use the narrowest integer type possible for enumeration types. diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index fe9cdd9..27eb39b 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -21224,7 +21224,8 @@ module_preprocess_options (cpp_reader *reader) } auto *opt = cpp_get_options (reader); opt->module_directives = true; - opt->main_search = cpp_main_search (flag_header_unit); + if (opt->main_search == CMS_none) + opt->main_search = cpp_main_search (flag_header_unit); } } diff --git a/gcc/doc/cppopts.texi b/gcc/doc/cppopts.texi index 5b5b084..748db5e 100644 --- a/gcc/doc/cppopts.texi +++ b/gcc/doc/cppopts.texi @@ -270,6 +270,21 @@ When preprocessing, do not shorten system header paths with canonicalization. @item -fmax-include-depth=@var{depth} Set the maximum depth of the nested #include. The default is 200. +@opindex fsearch-include-path +@item -fsearch-include-path@r{[}=@var{kind}@r{]} +Look for input files on the #include path, not just the current +directory. This is particularly useful with C++20 modules, for which +both header units and module interface units need to be compiled +directly: + +@smallexample +g++ -c -std=c++20 -fmodules -fsearch-include-path bits/stdc++.h bits/std.cc +@end smallexample + +@var{kind} defaults to @samp{user}, which looks on the @code{#include +"@dots{}"} search path; you can also explicitly specify @samp{system} +for the @code{#include <@dots{}>} search path. + @opindex ftabstop @item -ftabstop=@var{width} Set the distance between tab stops. This helps the preprocessor report diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 929feaf..8aeccb1 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -38001,6 +38001,11 @@ installed. Specifying the language as one of these variants also inhibits output of the object file, as header files have no associated object file. +Alternately, or for a module interface unit in an installed location, +you can use @option{-fsearch-include-path} to specify that the main +source file should be found on the include path rather than the +current directory. + Header units can be used in much the same way as precompiled headers (@pxref{Precompiled Headers}), but with fewer restrictions: an #include that is translated to a header unit import can appear at any -- cgit v1.1