Nathan Sidwell <nat...@acm.org> writes:

> The repo is providing a mechanism by which two processes can synchronize 
> on a fixed location in the file system that is not /.  You need such a 
> capability as the file system is the bulk transfer mechanism.
> 
> The alternatives are to always use absolute paths, or require the two 
> ends of the communication to have the same working directory [...]

Isn't the latter pretty much the norm for a build system that spawns
the compiler?


> The location of the repo is entirely under the mapper-server's control. 
> Set it to / if you want.

Except that now all my relative paths are relative to / and not CWD.

I find the current semantics heavily skewed towards the mapper operating
outside the build system (like the builtin mapper) while I expect most
non-toy/legacy build systems that wish to support C++ modules to have
an integrated mapper (build2 certainly does it this way). I think there
should at least be a way for the mapper to opt out of this repository
functionality.


Also, you mentioning synchronization reminded me of this part from
Invoking GCC/C++ Modules:

> When creating an output CMI any missing directory components are
> created in a manner that is safe for concurrent builds creating
> multiple, different, CMIs within a common subdirectory tree.
>
> CMI contents are written to a temporary file, which is then atomically
> renamed.  Observers will either see old contents (if there is an
> existing file), or complete new contents.  They will not observe the CMI
> during its creation.

This works atomically on POSIX but not on Windows. Also, from experience,
on Windows creating a temporary file and then renaming it often causes
more problems than creating it in the final destination from the outset.
That's because on Windows you cannot (re)move a file that is open by
another process. And there are various processes on Windows (anti-virus/
malware, indexers, IDEs, etc) that routinely scan the filesystem.

Reply via email to