public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* cargo-gccrs - GSoC Progress report
@ 2021-07-02 14:14 cohenarthur.dev
  0 siblings, 0 replies; only message in thread
From: cohenarthur.dev @ 2021-07-02 14:14 UTC (permalink / raw)
  To: gcc

# Overview

The goal of `cargo-gccrs` is to allow rust's building system, cargo [1]
to use `gccrs` as an alternative compiler to `rustc`.

In order to allow the rust language to target more of the current architecture ecosystem,
as well as help in resolving the bootstrapping problem, rust support for the GNU Compiler
Collection is currently being developed. The compiler is getting more and more usable
for rust code in general, and could definitely benefit from more usage from the community.
Adding support for `gccrs` to the `cargo` build system would be a stepping stone in having
more of rust users test the compiler and use it.

# Progress Report

## Achieved functionality

Work on `cargo-gccrs` started at the beginning of the month of June. In that time, we have
managed to allow the compilation of simple projects, in order to generate correct binaries
in the formats of an executable, a shared library or a static library.

We have designed an option parser that is able to translate `rustc` options into valid
`gccrs` options. The program then spawns a `gccrs` command with valid arguments in order
to compile the given rust project.

We added a few basic projects to the repository, that are compilable using `gccrs`
(this means only one file, no rust macros, etc). We also worked on incorporating a testing
framework to make sure that `cargo-gccrs` can compile those basic projects as it is being
tweaked and worked on.

If your project is simple enough, you are now able to use `cargo-gccrs` for building and
running it. Simply use `cargo gccrs build` or `cargo gccrs run`.

## Problems encountered

    `gcc` cannot produce multiple binaries with one command:

The rust compiler is often invoked by cargo with the goal of generating a binary, a static
library and a shared library. This is achieved by passing multiple instances of the `--crate-type`
argument, which `gcc` does not have an equivalent for. Therefore, `cargo-gccrs` might have
to resort to spawning multiple `gccrs` commands in order to reproduce the behavior of `rustc`.

    `gcc` cannot directly produce static libraries:

`rustc` can directly create archive files containing multiple object files. On Unix, this
corresponds to the `.a` file format, and these archives are created using the `ar`
command. `gcc` does not have any means to do that, and `cargo-gccrs` has to spawn a secondary
command using the `ar` program, whose aim is to package a previously created compilation unit
generated using `gccrs`.

    `gccrs` cannot generate the expected filenames of binaries:

When displaying the compiler's configuration, `rustc` can print the expected output filenames
of different binaries. For example, on Unix systems, a shared library shall be called
`lib<name>.so`. A binary can simply be called `<name>`, and a static library will usually
be called `lib<name>.a`. This being displayed is one of the requirements for `cargo` to
work with the compiler. As this isn't implemented yet, an issue has been opened
here [2] to discuss it.

This work was achieved thanks to the thoughtful reviews and contributions from
@philberty (Philip Herron) [3], @flip1995 [4] and @bjorn3 [5]. Thanks a lot for your implication!

# Goals for this GSoC

The goals for this GSoC were as follow:

- Create a barebones rust project as a cargo subcommand
- Get familar with `gccrs` internals
- Build initial `cargo-gccrs` with basic functionality
- Investigate `cargo` in depth in order to replicate `rustc`'s behavior as closely
as possible
- Allow for users to compile all sorts of binaries
- Add abstractions around testing in order for the project to benefit from the large
amount of rust code already written
- Report any kind of issue with the compiler to the main `gccrs` repository
- If time is left, work on fixing those issues directly in the compiler.

The project is progressing nicely. We are on track to having most of the functionality
implemented, cleaned-up and well tested. A lot of work still remains, and a lot of issues
are yet to be discovered. I should have some time to dedicate to contributing directly to
`gccrs` in order for `cargo-gccrs` to be even more useful. I think that I am on track to
complete a minimum viable product for this GSoC project, which could then be easily
maintained and improved upon as the compiler progresses.

# Status Table

|Category    | Last Month | This Month | Delta|
|------------|------------|------------|------|
|Todo        |   0        |   17       | +17  |
|In Progress |   0        |   3        | +3   |
|Completed   |   0        |   6        | +6   |
|Blocked     |   0        |   0        | 0    |

# Risks

The `gccrs` compiler does not implement all of the functionality that the `rustc` compiler
provides. For example, a lot of rust projects use multiple files, which are not handled
yet. This reduces the usability of the tool as it is not yet able to compile multiple
projects. In the same vein, macros and procedural macros are not supported yet: Which means
that implementing `cargo gccrs test` is still a long way off, as `rustc` relies on the
`libtest` rust library for testing, which relies heavily on those macros
(`#[test]`, `#[test_runner]`, `assert!`, etc).

Please feel free to tell me about any wrongful assumption I might have made about `gcc`.
And do not hesitate to contact me or reply if you have any questions about the project.

Thanks everyone,

[1] https://github.com/rust-lang/cargo
[2] https://github.com/rust-GCC/gccrs/issues/490
[3] https://github.com/philberty
[4] https://github.com/flip1995
[5] https://github.com/bjorn3

-- 
Arthur Cohen

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-07-02 14:14 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-02 14:14 cargo-gccrs - GSoC Progress report cohenarthur.dev

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).