On 12/4/23 12:43 PM, Ran Regev wrote:


On Mon, Dec 4, 2023, 19:31 Tom Honermann via SG15 <sg15@lists.isocpp.org> wrote:

If this can be done without too much difficulty, great.

However, would you expect this to work for both -stdlib=libc++ and -stdlib=libstdc++? How about when Clang is used with Microsoft's standard library (for which there is no corresponding -stdlib option)?


I think defaults should be used when no value is supplied. Like, -O0 is the default in all compilers unless otherwise specified.

The same for default std lib and any other parameter.

The target is to enable portable:
# std-tool -o hello hello.cpp 

Even when hello.cpp has import std; directive inside it.

Sure, but the default for Clang differs based on platform. So support for Clang in general would require support for -std=libc++ (the default on Apple), -stdlib=libstdc++ (the default on Linux), and the MSVC standard library (the default for the *-windows-msvc target triples). Thus, Clang (or a wrapper) would presumably need to be taught how to build the BMIs for each (supported) version of each implementation. A wrapper tool would need to know how to identify which standard library implementation (and version) the compiler expects (preferably via some form of compiler introspection).

Tom.



Ran.

Tom.

On 12/4/23 1:00 AM, Chuanqi Xu via SG15 wrote:
Hi Guys,
    
    This post is mainly about some random thoughts about teachability of std modules. Also [P2412R0: Minimal module support for the standard library] (https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2412r0.pdf) mentions that the std module is important for educations and beginners. If there are more interests, I can try to summarize them into a paper.

     When I start to learn C++, I only need to copy a hello world example and run:
```
clang++ hello.cpp -o hello
```

    However, with the current direction of std modules, the beginner need to install the build systems and try to  copy the build scripts that them can hardly understand. Possibly some simpler form of https://libcxx.llvm.org/Modules.html. But it still seems scaring to beginners.

    And I am wondering if we can simplify the process. For example, the beginners can compile a hello world example with std module:
```
import std;
int main() { std::cout << "Hello modular world\n"; }
```
   with a single command line:
```
clang++ -std=c++23 hello.cpp -o hello
```

The compiler may achieve that when:
- the std module is required but not provided.
- the path to std module's BMI is not specified. (implied that the invocation doesn't from build systems)
- the final output is an executable.
- the std module's source exists in the installed path (being discussed in https://github.com/llvm/llvm-project/issues/73089).

then the compiler can try to compile the std module's source to BMI and object file. Then we can import the BMI and link the object file. There are some details. e.g., where should we put the BMI? Should we try to reuse the BMIs? Can we extend the process to other modules? They are open questions and my answers are:
- By default, they should be in `/tmp` and if `-save-temps` is specified, they'll be in the same directory with the temporaries.
- The compiler shouldn't try to reuse the BMIs. That is the job of the build systems.
- No, we can't. It is possible for std module since we'll try to standardize the locations of std modules sources. So that the tools are able to find the source of std modules. But it is not the case for other generalized modules. Also I think this is the job of build systems too.

The motivation is primarily for beginners and educations. How do you feel about the idea?

Thanks,
Chuanqi


_______________________________________________
SG15 mailing list
SG15@lists.isocpp.org
https://lists.isocpp.org/mailman/listinfo.cgi/sg15
_______________________________________________
SG15 mailing list
SG15@lists.isocpp.org
https://lists.isocpp.org/mailman/listinfo.cgi/sg15