[cfe-dev] RFC: allow modules found via -fmodule-map-file to shadow implicitly discovered modules

Vassil Vassilev via cfe-dev cfe-dev at lists.llvm.org
Wed Nov 18 09:52:14 PST 2015


Hi Ben,
   Thanks for the work! We will definitely need such a concept, too.
Vassil
On 18/11/15 17:04, Ben Langmuir via cfe-dev wrote:
> Having heard of no disagreement with the overall idea, I’m moving 
> ahead.  An updated patch is on cfe-commits.  Thanks!
>
>> On Nov 10, 2015, at 3:39 PM, Ben Langmuir <blangmuir at apple.com 
>> <mailto:blangmuir at apple.com>> wrote:
>>
>> Hey all,
>> *
>> *
>> *Background*
>>
>> Suppose you’re developing a system library FancyLib that installs a 
>> module map file into a default search path, and you’re using implicit 
>> module maps.  When you’re developing locally, you will likely end up 
>> with multiple versions of your module that are reachable in your 
>> search paths:
>> * The system version /usr/include/FancyLib/module.modulemap
>> * The local development version 
>> ~/…/Build/Products/Debug/FancyLib/module.modulemap
>>
>> You generally want to use the local version, and ignore the one from 
>> the system.  Unfortunately, this currently causes module-redefinition 
>> errors if both module map files are ever parsed.  For framework 
>> modules, we have been getting away with this because the compiler 
>> almost never looks into a framework directory if it has previously 
>> looked into a framework directory of the same name.  Sadly the same 
>> is not true of non-frameworks.
>>
>>
>> *Proposed change for users*
>>
>> Users developing non-framework system modules would add:
>> -fmodule-map-file=path/to/local/copy/of/module.modulemap
>>
>> Typically, the “local copy” of the module map file would be to 
>> somewhere inside their build products.
>>
>> *
>> *
>> *Proposed clang changes*
>>
>> The flag -fmodule-map-file already exists in clang, and it causes 
>> clang to explicitly parse the specified module map, making any 
>> modules defined in that file available for @import (or via 
>> auto-import from a #import).
>>
>> I propose we extend -fmodule-map-file so that modules found by this 
>> mechanism are allowed to shadow modules that we found implicitly in 
>> header search paths.  When searching for a module by name, we will 
>> not consider the shadowed module at all. It will be an error for 
>> header search to find a header that is considered part of a shadowed 
>> module.
>>
>> If two modules with the same name are *both* found in the contents of 
>> -fmodule-map-file arguments, then it is a redefinition error.  Since 
>> these flags are ordered, we could theoretically allow shadowing 
>> between them, but I cannot think of a good use-case for this and 
>> suspect it would usually be unexpected to users.
>>
>> If there are two modules with the same name and *neither* of them 
>> comes from -fmodule-map-file, then it is a redefinition error just 
>> like it is today.
>>
>> *Why not use header search path order to do shadowing?*
>>
>> I originally thought we should just allow modules that come from 
>> earlier search paths to shadow modules from later ones.  This would 
>> avoid having to use an extra flag -fmodule-map-file, and let us infer 
>> the module configuration “for free”, since users are already 
>> accustomed to setting up their header search paths.  However, there 
>> are a number of problems with this approach:
>>
>> * Module map files from “later” search paths are often parsed ahead 
>> of module map files from “earlier” paths.  We would either need to 
>> eagerly parse module map files from all search paths in order (slow), 
>> or we would need to be able to retroactively make a module shadowed 
>> (brittle).
>> * Module map lookup does not know about search paths, so when 
>> searching for a module map file by umbrella directory we don't know 
>> when we cross search path boundaries
>> * We would need to lock down the HeaderSearch interface to prevent 
>> modifying search path order in the middle of a build (although that 
>> might be a generally good thing…)
>>
>>
>> My patch implementing this is attached for reference.
>>
>> <fmodule-map-file-shadow.patch>
>>
>> Ben
>>
>>
>>
>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20151118/291ceb1e/attachment.html>


More information about the cfe-dev mailing list