diff options
-rw-r--r-- | clang/docs/Modules.rst | 3 | ||||
-rw-r--r-- | clang/include/clang/Driver/CC1Options.td | 7 | ||||
-rw-r--r-- | clang/include/clang/Lex/HeaderSearchOptions.h | 3 | ||||
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 3 | ||||
-rw-r--r-- | clang/lib/Lex/HeaderSearch.cpp | 36 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/modular_maps/modulea.map (renamed from clang/test/Modules/Inputs/modular_maps/module.map) | 0 | ||||
-rw-r--r-- | clang/test/Modules/modular_maps.cpp | 2 |
7 files changed, 44 insertions, 10 deletions
diff --git a/clang/docs/Modules.rst b/clang/docs/Modules.rst index 02393d7ba9f..912cdafc8c3 100644 --- a/clang/docs/Modules.rst +++ b/clang/docs/Modules.rst @@ -194,6 +194,9 @@ Command-line parameters ``-fmodule-name=module-id`` Consider a source file as a part of the given module. +``-fmodule-map-file=<file>`` + Load the given module map file if a header from its directory or one of its subdirectories is loaded. + Module Map Language =================== diff --git a/clang/include/clang/Driver/CC1Options.td b/clang/include/clang/Driver/CC1Options.td index d5a8b775d74..1b96ef38c10 100644 --- a/clang/include/clang/Driver/CC1Options.td +++ b/clang/include/clang/Driver/CC1Options.td @@ -483,9 +483,12 @@ def fno_deprecated_macro : Flag<["-"], "fno-deprecated-macro">, def nostdsysteminc : Flag<["-"], "nostdsysteminc">, HelpText<"Disable standard system #include directories">; -def fmodule_name : Joined<["-"], "fmodule-name=">, +def fmodule_name : Joined<["-"], "fmodule-name=">, MetaVarName<"<name>">, - HelpText<"Specify the name of the module to build">; + HelpText<"Specify the name of the module to build">; +def fmodule_map_file : Joined<["-"], "fmodule-map-file=">, + MetaVarName<"<file>">, + HelpText<"Load this module map file">; def fdisable_module_hash : Flag<["-"], "fdisable-module-hash">, HelpText<"Disable the module hash">; def c_isystem : JoinedOrSeparate<["-"], "c-isystem">, MetaVarName<"<directory>">, diff --git a/clang/include/clang/Lex/HeaderSearchOptions.h b/clang/include/clang/Lex/HeaderSearchOptions.h index 830f48dce8b..0b21c0dd349 100644 --- a/clang/include/clang/Lex/HeaderSearchOptions.h +++ b/clang/include/clang/Lex/HeaderSearchOptions.h @@ -120,6 +120,9 @@ public: /// of computing the module hash. llvm::SetVector<std::string> ModulesIgnoreMacros; + /// \brief The set of user-provided module-map-files. + llvm::SetVector<std::string> ModuleMapFiles; + /// Include the compiler builtin includes. unsigned UseBuiltinIncludes : 1; diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index c8c676899c5..afba109453d 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -896,6 +896,9 @@ static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) { StringRef MacroDef = (*it)->getValue(); Opts.ModulesIgnoreMacros.insert(MacroDef.split('=').first); } + std::vector<std::string> ModuleMapFiles = + Args.getAllArgValues(OPT_fmodule_map_file); + Opts.ModuleMapFiles.insert(ModuleMapFiles.begin(), ModuleMapFiles.end()); // Add -I..., -F..., and -index-header-map options in order. bool IsIndexHeaderMap = false; diff --git a/clang/lib/Lex/HeaderSearch.cpp b/clang/lib/Lex/HeaderSearch.cpp index ec84bb16d60..5bcc4ea0441 100644 --- a/clang/lib/Lex/HeaderSearch.cpp +++ b/clang/lib/Lex/HeaderSearch.cpp @@ -941,26 +941,48 @@ bool HeaderSearch::hasModuleMap(StringRef FileName, DirName = llvm::sys::path::parent_path(DirName); if (DirName.empty()) return false; - + // Determine whether this directory exists. const DirectoryEntry *Dir = FileMgr.getDirectory(DirName); if (!Dir) return false; - // Try to load the module map file in this directory. + // Load user-specified module map files in 'Dir'. + bool ModuleMapFound = false; + for (llvm::SetVector<std::string>::iterator + I = HSOpts->ModuleMapFiles.begin(), + E = HSOpts->ModuleMapFiles.end(); + I != E; ++I) { + StringRef ModuleMapFileDir = llvm::sys::path::parent_path(*I); + if (!llvm::sys::fs::equivalent(ModuleMapFileDir, DirName)) + continue; + + const FileEntry *File = FileMgr.getFile(*I); + if (!File) + continue; + + loadModuleMapFile(File, /*IsSystem=*/false); + ModuleMapFound = true; + } + + // Try to load the "module.map" file in this directory. switch (loadModuleMapFile(Dir, IsSystem)) { case LMM_NewlyLoaded: case LMM_AlreadyLoaded: + ModuleMapFound = true; + break; + + case LMM_NoDirectory: + case LMM_InvalidModuleMap: + break; + } + + if (ModuleMapFound) { // Success. All of the directories we stepped through inherit this module // map file. for (unsigned I = 0, N = FixUpDirectories.size(); I != N; ++I) DirectoryHasModuleMap[FixUpDirectories[I]] = true; - return true; - - case LMM_NoDirectory: - case LMM_InvalidModuleMap: - break; } // If we hit the top of our search, we're done. diff --git a/clang/test/Modules/Inputs/modular_maps/module.map b/clang/test/Modules/Inputs/modular_maps/modulea.map index 7018c413042..7018c413042 100644 --- a/clang/test/Modules/Inputs/modular_maps/module.map +++ b/clang/test/Modules/Inputs/modular_maps/modulea.map diff --git a/clang/test/Modules/modular_maps.cpp b/clang/test/Modules/modular_maps.cpp index c521fb28f72..5070f7d5bf9 100644 --- a/clang/test/Modules/modular_maps.cpp +++ b/clang/test/Modules/modular_maps.cpp @@ -1,5 +1,5 @@ // RUN: rm -rf %t -// RUN: %clang_cc1 -x objective-c++ -fmodules-cache-path=%t -fmodules -I %S/Inputs/modular_maps %s -verify +// RUN: %clang_cc1 -x objective-c++ -fmodules-cache-path=%t -fmodules -fmodule-map-file=%S/Inputs/modular_maps/modulea.map -I %S/Inputs/modular_maps %s -verify #include "a.h" #include "b.h" // expected-error {{private header}} |