You were redirected here from marcelmoolenaar:thebsddebuggerwhiteboardsystem.

Compiler API

Here's the proposed compiler interface for the system and for people. FreeBSD will support compiling itself with different compilers, and may support having multiple compilers in the base system. FreeBSD will support using external compilers to build the base, even if they aren't in the base (eg, building FreeBSD with gcc 4.6 or with some chip vendor's special compiler).

Users control which compiler is used based on a few variables.

Variable Values Meaning
SYSTEM_COMPILER gcc or clang The class of compiler that is installed as ${CC}
GCC_VERSION 421 gcc 4.2.1 – The version of the gcc compiler being used
CLANG_VERSION 311 clang 3.1.1 – The version of the clang compiler installed
EXT_COMP armv6-freebsd- or /usr/local/fred/bin/ Used to specify the location of the compiler (but not what kind of compiler it actually is). If this is set, then the external compiler is used. Otherwise the bootstrap default system compiler is used. The external compiler is really the entire external toolchain.

Generally, the traditional names for the C compiler, etc are used for the defaults. The above variables would be used something like the following:

.if ${SYSTEM_COMPILER} == "gcc"
CFLAGS += -Wall
.endif
.if ${SYSTEM_COMPILER} == "clang"
CFLAGS += -Weverything
.endif
.if ${SYSTEM_COMPILER} == "gcc" && ${GCC_VERSION} < 421
CFLAGS += -Wno-turtle-graphics
.endif

Most of the yucky part of this will live in a file, bsd.compiler.mk, that will be used to keep things contained. Some individual makefiles might need tweaks, however, based on what they are compiling.

This file will hold all the common code for supporting different compilers. It is somewhat similar to bsd.cpu.mk which is compiler support for optimizing for specific CPUs, but more general. It may be possible to use bsd.cpu.mk for this, or rename it to bsd.compiler.mk.

For an external compiler to work, it needs to have the following binaries in its bin directory (optionally, it can install all its binaries with a unique prefix too, so where it says 'cc' 'as' etc below, you could have 'armv6-freebsd-cc' 'armv6-freebsd-as' etc.

Program Purpose
ar Archiver
as Assembler
c++ C++ Compiler
cc C Compiler
cpp C preprocessor stage
ld loader
nm symbol name reporter
objcopy copy binary sections around
ranlib Library indexing program
size Report the size of the different sections of the binary
strip Remove symbols from the binary

The following are optional…

Program Purpose
addr2line Convert an address to a line number
CC C++ Compiler – historically present
c++filt demangle C++ names. Not directly used in the FreeBSD build
g++ Gnu name for c++ compiler
gcpp Gnu name for c preprossor
gcov Coverage tool
gnu-ar Gnu interface ar
gnu-ranlib Gnu interface to ranlib the library indexing program
objdump examine the contents of binaries
readelf another binary manipulation program
strings extract any printable strings from the binary
  • warnerlosh/proposedcompilerapi.txt
  • Last modified: 2022/06/19 23:38
  • by KubilayKocak