cproc (original) (raw)

(mirrored on GitHub and Codeberg)

builds.sr.ht status

cproc is a C compiler using QBE as a backend, released under theISC license. It implements most of C11 as well as many C23features. Additionally, it implements a few GNU C extensions.

It is currently able to build a lot of C software, though occasionally requires small patches to fix C conformance issues.

It was inspired by several other small C compilers including 8cc,c, lacc, and scc.

Goals

cproc aims to closely follow the C standard, but also to be a practical tool able compile many real-world software packages. Sometimes, these goals can be at ends with each other, since there is a lot of non-conforming C code out there.

The main philosophy regarding C extensions is this:

By following these guidelines, hopefully cproc can help shrink the gap between what's required to implement the C specification and what's required to compile real C software.

cproc does not implement multiple versions of C. Instead, code affected by breaking changes in new C versions (such as the new keywords introduced in C23) must be updated or patched to be compatible with the new version.

Requirements

The compiler itself is written in standard C99 and can be built with any conforming C99 compiler.

The POSIX driver depends on POSIX.1-2008 interfaces, and the Makefilerequires a POSIX-compatible make(1).

At runtime, you will need QBE, an assembler, and a linker for the target system. Since the preprocessor is not fully implemented, an external one is currently required as well.

Supported targets

All architectures supported by QBE should work (currently x86_64, aarch64, and riscv64).

The following targets are tested by the continuous build and known to bootstrap and pass all tests:

Building

Run ./configure to create a config.h and config.mk appropriate for your system. If your system is not supported by the configure script, you can create these files manually. config.h should define several string arrays (static char *[]):

You may also want to customize your environment or config.mk with the appropriate CC, CFLAGS and LDFLAGS.

Once this is done, you can build with

make

Bootstrap

The Makefile includes several other targets that can be used for bootstrapping. These targets require the ability to run the tools specified in config.h.

What's missing

C11

C23

See C23 for a detailed breakdown of the language-level changes from C11 to C23 as well as their current status. Notably, the following are not yet implemented:

GNU C extensions

Mailing list

There is a mailing list at ~mcf/cproc@lists.sr.ht. Feel free to use it for general discussion, questions, patches, or bug reports (if you don't have an sr.ht account).

If you don't hear a response, please don't hesitate to bump your thread.

Issue tracker

Please report any issues to ~mcf/cproc@todo.sr.ht.

Contributing

Patches are greatly appreciated. Send them to the mailing list (preferred), or as pull-requests on the Codeberg mirror.