| ---
README (11436B)
---
1 Compiling
2 =========
3
4 SCC is a portable toolchain that can be compiled on any UNIX system out
5 of the box. Compiling the project is so simple like:
6
7 $ make
8
9 It will build scc selecting the more appropiate options for the host
10 system. In some situations (like for example when cross compiling),
11 can be desirable to select custom options for the build and use:
12
13 $ make config
14 $ make
15
16 and pass the required options the the config target. For example
17 if we want to cross compile scc for aarch64-linux-musl target
18 from a amd64-linux-gnu host system:
19
20 $ make CROSS_COMPILE=aarch64-linux-musl- CONF=arm64-linux config
21 $ make
22
23 The build system of scc supports parallel builds that will reduce
24 dramatically the build time.
25
26 After a successful install the following programs are installed:
27
28 - gcc-scc: A wrapper shell script to use system cc and ld
29 with the scc libc.
30
31 - scc: A wrapper shell script that allows the execution
32 of any scc tool from any directory independently of the
33 PREFIX used in the build. The tool can be selected as
34 the first parameter (like for example `scc as` or `scc ar`)
35 and by default is cc.
36
37 - scc-addr2line: A work in progress to implement a tool
38 that is able to translate a hexadecimal address into
39 a symbol.
40
41 - scc-ar: An archiver commonly used for static libraries.
42 It is binary format agnostic, and it does not create an
43 index independently of the objects stored in it. Both,
44 coff and elf specify that an index should be created
45 when the archive is created, but as this is not done
46 by scc-ar, if you need an index you have to call
47 directly to scc-ranlib.
48
49 - scc-cc: Driver of the compiler. It uses the compile
50 time option PREFIX to locate helper programs and
51 library files. This value can be overriden by the
52 `SCCPREFIX` environment variable.
53
54 - scc-cpp: A wrapper shell script that uses scc-cc
55 to preprocess a file without compiling it.
56
57 - scc-ld: A work in progress to implement a linker for
58 the scc toolchain.
59
60 - scc-make: An implementation of POSIX make as defined
61 in POSIX 2018. No POSIX 2024 support is planned in a
62 near future.
63
64 - scc-nm: An implementation of POSIX nm.
65
66 - scc-objcopy: A work in progress of a GNU objcopy alike
67 program.
68
69 - scc-objdump: A work in progress of a GNU objdump alike
70 program.
71
72 - scc-ranlib: An implementation of a classical UNIX ranlib.
73 While ranlib is not specified in current POSIX standards
74 it is implemented in almost all the UNIX alike systems.
75 In the case of scc, the ar implementation does not add
76 index files by default, such a tool like ranlib is
77 required.
78
79 - scc-size: An implementation of POSIX size.
80
81 - scc-strip: An implementation of POSIX strip.
82
83 The toolchain has a good support for COFF files, and a basic support
84 for ELF files.
85
86 config.mk
87 ---------
88
89 This file is generated when the config target is built. Once it is
90 generated it is used by any Makefile in the build system, and it is not
91 modified by the build system, allowing to the user doing any modifications
92 as required. This file incules the following options that can be overriden
93 in the command line of `make config`:
94
95 - TOOL: Specify the toolchain type to be used. Possible
96 supported values are:
97
98 - clang
99 - gcov
100 - gnu
101 - pcc
102 - plan9
103 - unix
104
105 - HOST: Specify the host system to be used. Possible supported
106 values are:
107
108 - bsd
109 - linux
110 - obsd
111 - plan9
112 - posix
113
114 - CONF: Specify the build configuration used. It determines
115 the default values for the architecture, ABI, system and
116 binary format for the cross compiler. It also determines
117 what versions of the libc are built (at this moment scc
118 depends of external tools to build the libc and it limits
119 the versions of the libc that can be built to the ones
120 supported by the toolchain used to build scc itself).
121
122 - amd64-darwin
123 - amd64-dragonfly
124 - amd64-freebsd
125 - amd64-linux
126 - amd64-netbsd
127 - amd64-openbsd
128 - amd64-plan9
129 - arm32-linux
130 - arm64-linux
131 - ppc32-linux
132
133 - CROSS_COMPILE: Specify a prefix name for the tools called by the
134 Makefile.
135
136 - DESTDIR: Temporary directory prepend to PREFIX used in the
137 install path. It is mainly intended to help package maintainers
138 to install in a specific directory used as base for the package
139 generation.
140
141 - PREFIX: Prefix of the path where scc toolchain is going
142 to be installed. /usr/local by default.
143
144 - LIBPREFIX: Prefix of the path where scc searchs for
145 headers and libraries when scc is executed. $PREFIX
146 by default.
147
148 - LIBPROFILE: The profile used to configure the libc used by the
149 target compiler.
150
151 - scc: The scc libc.
152 - scc_clang: The scc libc, but using the clang assembler
153 and linker.
154 - musl: The linux musl libc.
155
156 - STD: What version of the C standard is used in the target
157 compiler and libc.
158
159 - c89: ANSI or C90 ISO standard.
160 - c99: C99 ISO standard.
161
162 Not all the configurations have the same level of support in
163 the libc and in some cases the support is minimal.
164
165 The main targets of the Makefile are:
166
167 - all:
168 Compile the toolchain and the libc. It compiles the libc
169 for all the available configurations based in the host
170 architecture.
171
172 - dep:
173 Generate inclusion dependencies, very useful while
174 modifying the code. Beware that it creates files with
175 the name `makefile` and changes to `Makefile` files
176 are not reflected in the build proces until a `make distclean`
177 or a `make dep` is executed again.
178
179 - config:
180 Generate config.mk and the headers `include/bits/scc/sys.h`,
181 `include/bits/scc/std.h` and `include/bits/scc/config.h`.
182 These files are not modified by any other target of the
183 Makefile, and they can be customized as required after being
184 generated. They are removed by the `distclean` target.
185
186 - install:
187 Installs scc in PREFIX.
188
189 - uninstall:
190 Uninstall scc from PREFIX.
191
192 - clean:
193 Remove all the generated files except the one supposed to be edited
194 by the user.
195
196 - distclean
197 Remove all the generated files, including the files generated by the
198 config target that are not removed by the clean target.
199
200 Toolchain configuration
201 =======================
202 At this moment scc is still using some external tools to generate
203 the final binaries. The toolchain execution is configured in the
204 file `include/bits/scc/sys.h` and it included basically 5 elements:
205
206 - LDBIN: macro with the name of the linker binary.
207
208 - ASBIN: macro with the name of the assembler binary.
209
210 - sysincludes: It is a list of diretories used to locate
211 the system headers
212
213 - ldcmd: It describes how the linker command line is built.
214
215 - ascmd: It describes how the assembler command line is built.
216
217 The definition of sysincludes, ldcmd and ascmd can include wildcards
218 represented by % followed by a single letter:
219
220 - %c: It expands to the full list of input object files of the linker
221 - %a: It expands to the architecture name
222 - %s: It expands to the system name
223 - %p: It expands to the library prefix
224 - %b: It expands too the ABI name
225 - %o: It expands to the output file of the current tool
226
227 Scc includes 3 configuration templates that can be used as base for the
228 configuration of the toolchain:
229
230 - scc: It uses GNU assembler and linker with the scc libc.
231 - scc_clang: It uses clang assembler and linker with the scc libc.
232 - musl: It uses GNU assembler and linker with the musl libc.
233
234 The file `include/bits/scc/sys.h` is automatically created from the scc
235 toolchain configuration with the default make target. The target config
236 can be used to only create the file based on the value of the variable
237 `LIBPROFILE` allowing the user to customize that file as needed. It is
238 important to highlight that the file is not removed by `make clean`
239 because it can contain local user modifications. You should use
240 `make distclean` to remove it.
241
242 Runtime dependencies
243 ====================
244
245 Some configurations of scc require having the QBE [1] executable in the PATH,
246 whose version must support common storage which was incorporated to it after
247 the commit 8ded7a5, but it is not part of a stable release of QBE yet.
248
249 [1] https://c9x.me/compile/
250
251 Musl libc support
252 =================
253 The scc libc is a C99 library and cannot be used to compile POSIX compliant
254 programs. Scc includes a template that can be used to use a musl libc
255 compiled by gcc, and to make easier to get the correct values it also
256 provides a specific target to configure scc for a correct support for musl:
257
258 $ make LIBPREFIX=/usr/local/musl config-musl
259 $ make
260 $ make install
261
262 or
263
264 $ scc-cc hello.c
265 $ make LIBPREFIX=/usr/local/musl config-musl
266 $ make
267 $ SCCLIBPREFIX=/usr/local/musl scc hello.c
268
269 where `LIBPREFIX` points to the prefix used by your musl libc
270 installation. If the helper scc shell script is used instead of scc-cc
271 then the environment variable SCCLIBPREFIX must be set. The target
272 config-musl uses the output of gcc -v to get a working sys.h with the
273 correct paths (it basically extracts the correct value for the macro
274 GCCLIBPATH used to locate the gcc crt object files). If you are not
275 able to use scc with musl after these steps, please take a look to
276 include/bits/scc/sys.h to see if it fits your system setup.
277
278
279 Deviations from standard C
280 ===========================
281 This compiler aims to be fully compatible with the C99 standard, but
282 it has some differences at this moment:
283
284 - Type qualifiers are accepted but partially ignored.
285 --------------------------------------------------
286
287 The semantic behind them is not fully implemented, specially in the
288 case of volatile. Be aware that some programs can miswork for this
289 reason.
290
291 - Function type names
292 -------------------
293
294 C99 allows you to define type names of function types and write something
295 like:
296
297 int f(int (int));
298
299 Accepting function types in type names (or abstract declarators) makes the
300 grammar ambiguous because it is impossible to differentiate between:
301
302 (int (f)) -> function returning int with one parameter of type f
303 (int (f)) -> integer variable f
304
305 If you don't believe me try this code:
306
307 int
308 f(int g())
309 {
310 return g();
311 }
312
313 Function type names seem unnecesary , because they are used as
314 an alias of the function pointer types, but it is weird that something
315 like sizeof(int (int)) is not allowed (because here it should be
316 understood as the size of a function), but f(int (int)) is allowed
317 because it is understood as a parameter of function pointer type.
318
319 - Definition of variables with incomplete type
320 ---------------------------------------------
321
322 C89 allows the definition of variables with incomplete type that
323 have external linkage and file scope. The type of the variable is the
324 composition of all the definitions found in the file. The exact rules
325 are a bit complex (ANSI 3.7.2, or ISO C99 6.2.5p22) so SCC ignores them
326 at this moment by simply not allowing any definition of variables with
327 incomplete type.
328
329 If you don't believe me try this code:
330
331 struct foo x;
332
333 struct foo {
334 int i;
335 };
336
337 - Variadic function alike macros
338 ------------------------------
339
340 The standard (C99 6.10.3 c 4) forces passing more parameters than
341 the number of parameters present in the variadic argument list
342 (excluding ...). SCC accepts a parameter list with the same number
343 of arguments.
344
345 #define P(a, ...) a
346
347 P(1)
348
349 C99 libc
350 ========
351
352 The C99 libc only supports the C locale using UTF-8 for multibyte
353 sequences. It also assumes that the wide character set includes
354 ASCII as a subset. |