lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame^] | 1 | @node Maintenance, Platform, Installation, Top |
| 2 | @c %MENU% How to enhance and port the GNU C Library |
| 3 | @appendix Library Maintenance |
| 4 | |
| 5 | @menu |
| 6 | * Source Layout:: How to add new functions or header files |
| 7 | to the GNU C Library. |
| 8 | * Porting:: How to port the GNU C Library to |
| 9 | a new machine or operating system. |
| 10 | @end menu |
| 11 | |
| 12 | @node Source Layout |
| 13 | @appendixsec Adding New Functions |
| 14 | |
| 15 | The process of building the library is driven by the makefiles, which |
| 16 | make heavy use of special features of GNU @code{make}. The makefiles |
| 17 | are very complex, and you probably don't want to try to understand them. |
| 18 | But what they do is fairly straightforward, and only requires that you |
| 19 | define a few variables in the right places. |
| 20 | |
| 21 | The library sources are divided into subdirectories, grouped by topic. |
| 22 | |
| 23 | The @file{string} subdirectory has all the string-manipulation |
| 24 | functions, @file{math} has all the mathematical functions, etc. |
| 25 | |
| 26 | Each subdirectory contains a simple makefile, called @file{Makefile}, |
| 27 | which defines a few @code{make} variables and then includes the global |
| 28 | makefile @file{Rules} with a line like: |
| 29 | |
| 30 | @smallexample |
| 31 | include ../Rules |
| 32 | @end smallexample |
| 33 | |
| 34 | @noindent |
| 35 | The basic variables that a subdirectory makefile defines are: |
| 36 | |
| 37 | @table @code |
| 38 | @item subdir |
| 39 | The name of the subdirectory, for example @file{stdio}. |
| 40 | This variable @strong{must} be defined. |
| 41 | |
| 42 | @item headers |
| 43 | The names of the header files in this section of the library, |
| 44 | such as @file{stdio.h}. |
| 45 | |
| 46 | @item routines |
| 47 | @itemx aux |
| 48 | The names of the modules (source files) in this section of the library. |
| 49 | These should be simple names, such as @samp{strlen} (rather than |
| 50 | complete file names, such as @file{strlen.c}). Use @code{routines} for |
| 51 | modules that define functions in the library, and @code{aux} for |
| 52 | auxiliary modules containing things like data definitions. But the |
| 53 | values of @code{routines} and @code{aux} are just concatenated, so there |
| 54 | really is no practical difference.@refill |
| 55 | |
| 56 | @item tests |
| 57 | The names of test programs for this section of the library. These |
| 58 | should be simple names, such as @samp{tester} (rather than complete file |
| 59 | names, such as @file{tester.c}). @w{@samp{make tests}} will build and |
| 60 | run all the test programs. If a test program needs input, put the test |
| 61 | data in a file called @file{@var{test-program}.input}; it will be given to |
| 62 | the test program on its standard input. If a test program wants to be |
| 63 | run with arguments, put the arguments (all on a single line) in a file |
| 64 | called @file{@var{test-program}.args}. Test programs should exit with |
| 65 | zero status when the test passes, and nonzero status when the test |
| 66 | indicates a bug in the library or error in building. |
| 67 | |
| 68 | @item others |
| 69 | The names of ``other'' programs associated with this section of the |
| 70 | library. These are programs which are not tests per se, but are other |
| 71 | small programs included with the library. They are built by |
| 72 | @w{@samp{make others}}.@refill |
| 73 | |
| 74 | @item install-lib |
| 75 | @itemx install-data |
| 76 | @itemx install |
| 77 | Files to be installed by @w{@samp{make install}}. Files listed in |
| 78 | @samp{install-lib} are installed in the directory specified by |
| 79 | @samp{libdir} in @file{configparms} or @file{Makeconfig} |
| 80 | (@pxref{Installation}). Files listed in @code{install-data} are |
| 81 | installed in the directory specified by @samp{datadir} in |
| 82 | @file{configparms} or @file{Makeconfig}. Files listed in @code{install} |
| 83 | are installed in the directory specified by @samp{bindir} in |
| 84 | @file{configparms} or @file{Makeconfig}.@refill |
| 85 | |
| 86 | @item distribute |
| 87 | Other files from this subdirectory which should be put into a |
| 88 | distribution tar file. You need not list here the makefile itself or |
| 89 | the source and header files listed in the other standard variables. |
| 90 | Only define @code{distribute} if there are files used in an unusual way |
| 91 | that should go into the distribution. |
| 92 | |
| 93 | @item generated |
| 94 | Files which are generated by @file{Makefile} in this subdirectory. |
| 95 | These files will be removed by @w{@samp{make clean}}, and they will |
| 96 | never go into a distribution. |
| 97 | |
| 98 | @item extra-objs |
| 99 | Extra object files which are built by @file{Makefile} in this |
| 100 | subdirectory. This should be a list of file names like @file{foo.o}; |
| 101 | the files will actually be found in whatever directory object files are |
| 102 | being built in. These files will be removed by @w{@samp{make clean}}. |
| 103 | This variable is used for secondary object files needed to build |
| 104 | @code{others} or @code{tests}. |
| 105 | @end table |
| 106 | |
| 107 | @menu |
| 108 | * Platform: Adding Platform-specific. Adding platform-specific |
| 109 | features. |
| 110 | @end menu |
| 111 | |
| 112 | @node Adding Platform-specific |
| 113 | @appendixsubsec Platform-specific types, macros and functions |
| 114 | |
| 115 | It's sometimes necessary to provide nonstandard, platform-specific |
| 116 | features to developers. The C library is traditionally the |
| 117 | lowest library layer, so it makes sense for it to provide these |
| 118 | low-level features. However, including these features in the C |
| 119 | library may be a disadvantage if another package provides them |
| 120 | as well as there will be two conflicting versions of them. Also, |
| 121 | the features won't be available to projects that do not use |
| 122 | @theglibc{} but use other GNU tools, like GCC. |
| 123 | |
| 124 | The current guidelines are: |
| 125 | @itemize @bullet |
| 126 | @item |
| 127 | If the header file provides features that only make sense on a particular |
| 128 | machine architecture and have nothing to do with an operating system, then |
| 129 | the features should ultimately be provided as GCC built-in functions. Until |
| 130 | then, @theglibc{} may provide them in the header file. When the GCC built-in |
| 131 | functions become available, those provided in the header file should be made |
| 132 | conditionally available prior to the GCC version in which the built-in |
| 133 | function was made available. |
| 134 | |
| 135 | @item |
| 136 | If the header file provides features that are specific to an operating system, |
| 137 | both GCC and @theglibc{} could provide it, but @theglibc{} is preferred |
| 138 | as it already has a lot of information about the operating system. |
| 139 | |
| 140 | @item |
| 141 | If the header file provides features that are specific to an operating system |
| 142 | but used by @theglibc{}, then @theglibc{} should provide them. |
| 143 | @end itemize |
| 144 | |
| 145 | The general solution for providing low-level features is to export them as |
| 146 | follows: |
| 147 | |
| 148 | @itemize @bullet |
| 149 | @item |
| 150 | A nonstandard, low-level header file that defines macros and inline |
| 151 | functions should be called @file{sys/platform/@var{name}.h}. |
| 152 | |
| 153 | @item |
| 154 | Each header file's name should include the platform name, to avoid |
| 155 | users thinking there is anything in common between different the |
| 156 | header files for different platforms. For example, a |
| 157 | @file{sys/platform/@var{arch}.h} name such as |
| 158 | @file{sys/platform/ppc.h} is better than @file{sys/platform.h}. |
| 159 | |
| 160 | @item |
| 161 | A platform-specific header file provided by @theglibc{} should coordinate |
| 162 | with GCC such that compiler built-in versions of the functions and macros are |
| 163 | preferred if available. This means that user programs will only ever need to |
| 164 | include @file{sys/platform/@var{arch}.h}, keeping the same names of types, |
| 165 | macros, and functions for convenience and portability. |
| 166 | |
| 167 | @item |
| 168 | Each included symbol must have the prefix @code{__@var{arch}_}, such as |
| 169 | @code{__ppc_get_timebase}. |
| 170 | @end itemize |
| 171 | |
| 172 | |
| 173 | The easiest way to provide a header file is to add it to the |
| 174 | @code{sysdep_headers} variable. For example, the combination of |
| 175 | Linux-specific header files on PowerPC could be provided like this: |
| 176 | |
| 177 | @smallexample |
| 178 | sysdep_headers += sys/platform/ppc.h |
| 179 | @end smallexample |
| 180 | |
| 181 | Then ensure that you have added a @file{sys/platform/ppc.h} |
| 182 | header file in the machine-specific directory, e.g., |
| 183 | @file{sysdeps/powerpc/sys/platform/ppc.h}. |
| 184 | |
| 185 | |
| 186 | @node Porting |
| 187 | @appendixsec Porting @theglibc{} |
| 188 | |
| 189 | @Theglibc{} is written to be easily portable to a variety of |
| 190 | machines and operating systems. Machine- and operating system-dependent |
| 191 | functions are well separated to make it easy to add implementations for |
| 192 | new machines or operating systems. This section describes the layout of |
| 193 | the library source tree and explains the mechanisms used to select |
| 194 | machine-dependent code to use. |
| 195 | |
| 196 | All the machine-dependent and operating system-dependent files in the |
| 197 | library are in the subdirectory @file{sysdeps} under the top-level |
| 198 | library source directory. This directory contains a hierarchy of |
| 199 | subdirectories (@pxref{Hierarchy Conventions}). |
| 200 | |
| 201 | Each subdirectory of @file{sysdeps} contains source files for a |
| 202 | particular machine or operating system, or for a class of machine or |
| 203 | operating system (for example, systems by a particular vendor, or all |
| 204 | machines that use IEEE 754 floating-point format). A configuration |
| 205 | specifies an ordered list of these subdirectories. Each subdirectory |
| 206 | implicitly appends its parent directory to the list. For example, |
| 207 | specifying the list @file{unix/bsd/vax} is equivalent to specifying the |
| 208 | list @file{unix/bsd/vax unix/bsd unix}. A subdirectory can also specify |
| 209 | that it implies other subdirectories which are not directly above it in |
| 210 | the directory hierarchy. If the file @file{Implies} exists in a |
| 211 | subdirectory, it lists other subdirectories of @file{sysdeps} which are |
| 212 | appended to the list, appearing after the subdirectory containing the |
| 213 | @file{Implies} file. Lines in an @file{Implies} file that begin with a |
| 214 | @samp{#} character are ignored as comments. For example, |
| 215 | @file{unix/bsd/Implies} contains:@refill |
| 216 | @smallexample |
| 217 | # BSD has Internet-related things. |
| 218 | unix/inet |
| 219 | @end smallexample |
| 220 | @noindent |
| 221 | and @file{unix/Implies} contains: |
| 222 | @need 300 |
| 223 | @smallexample |
| 224 | posix |
| 225 | @end smallexample |
| 226 | |
| 227 | @noindent |
| 228 | So the final list is @file{unix/bsd/vax unix/bsd unix/inet unix posix}. |
| 229 | |
| 230 | @file{sysdeps} has a ``special'' subdirectory called @file{generic}. It |
| 231 | is always implicitly appended to the list of subdirectories, so you |
| 232 | needn't put it in an @file{Implies} file, and you should not create any |
| 233 | subdirectories under it intended to be new specific categories. |
| 234 | @file{generic} serves two purposes. First, the makefiles do not bother |
| 235 | to look for a system-dependent version of a file that's not in |
| 236 | @file{generic}. This means that any system-dependent source file must |
| 237 | have an analogue in @file{generic}, even if the routines defined by that |
| 238 | file are not implemented on other platforms. Second, the @file{generic} |
| 239 | version of a system-dependent file is used if the makefiles do not find |
| 240 | a version specific to the system you're compiling for. |
| 241 | |
| 242 | If it is possible to implement the routines in a @file{generic} file in |
| 243 | machine-independent C, using only other machine-independent functions in |
| 244 | the C library, then you should do so. Otherwise, make them stubs. A |
| 245 | @dfn{stub} function is a function which cannot be implemented on a |
| 246 | particular machine or operating system. Stub functions always return an |
| 247 | error, and set @code{errno} to @code{ENOSYS} (Function not implemented). |
| 248 | @xref{Error Reporting}. If you define a stub function, you must place |
| 249 | the statement @code{stub_warning(@var{function})}, where @var{function} |
| 250 | is the name of your function, after its definition. This causes the |
| 251 | function to be listed in the installed @code{<gnu/stubs.h>}, and |
| 252 | makes GNU ld warn when the function is used. |
| 253 | |
| 254 | Some rare functions are only useful on specific systems and aren't |
| 255 | defined at all on others; these do not appear anywhere in the |
| 256 | system-independent source code or makefiles (including the |
| 257 | @file{generic} directory), only in the system-dependent @file{Makefile} |
| 258 | in the specific system's subdirectory. |
| 259 | |
| 260 | If you come across a file that is in one of the main source directories |
| 261 | (@file{string}, @file{stdio}, etc.), and you want to write a machine- or |
| 262 | operating system-dependent version of it, move the file into |
| 263 | @file{sysdeps/generic} and write your new implementation in the |
| 264 | appropriate system-specific subdirectory. Note that if a file is to be |
| 265 | system-dependent, it @strong{must not} appear in one of the main source |
| 266 | directories.@refill |
| 267 | |
| 268 | There are a few special files that may exist in each subdirectory of |
| 269 | @file{sysdeps}: |
| 270 | |
| 271 | @comment Blank lines after items make the table look better. |
| 272 | @table @file |
| 273 | @item Makefile |
| 274 | |
| 275 | A makefile for this machine or operating system, or class of machine or |
| 276 | operating system. This file is included by the library makefile |
| 277 | @file{Makerules}, which is used by the top-level makefile and the |
| 278 | subdirectory makefiles. It can change the variables set in the |
| 279 | including makefile or add new rules. It can use GNU @code{make} |
| 280 | conditional directives based on the variable @samp{subdir} (see above) to |
| 281 | select different sets of variables and rules for different sections of |
| 282 | the library. It can also set the @code{make} variable |
| 283 | @samp{sysdep-routines}, to specify extra modules to be included in the |
| 284 | library. You should use @samp{sysdep-routines} rather than adding |
| 285 | modules to @samp{routines} because the latter is used in determining |
| 286 | what to distribute for each subdirectory of the main source tree.@refill |
| 287 | |
| 288 | Each makefile in a subdirectory in the ordered list of subdirectories to |
| 289 | be searched is included in order. Since several system-dependent |
| 290 | makefiles may be included, each should append to @samp{sysdep-routines} |
| 291 | rather than simply setting it: |
| 292 | |
| 293 | @smallexample |
| 294 | sysdep-routines := $(sysdep-routines) foo bar |
| 295 | @end smallexample |
| 296 | |
| 297 | @need 1000 |
| 298 | @item Subdirs |
| 299 | |
| 300 | This file contains the names of new whole subdirectories under the |
| 301 | top-level library source tree that should be included for this system. |
| 302 | These subdirectories are treated just like the system-independent |
| 303 | subdirectories in the library source tree, such as @file{stdio} and |
| 304 | @file{math}. |
| 305 | |
| 306 | Use this when there are completely new sets of functions and header |
| 307 | files that should go into the library for the system this subdirectory |
| 308 | of @file{sysdeps} implements. For example, |
| 309 | @file{sysdeps/unix/inet/Subdirs} contains @file{inet}; the @file{inet} |
| 310 | directory contains various network-oriented operations which only make |
| 311 | sense to put in the library on systems that support the Internet.@refill |
| 312 | |
| 313 | @item configure |
| 314 | |
| 315 | This file is a shell script fragment to be run at configuration time. |
| 316 | The top-level @file{configure} script uses the shell @code{.} command to |
| 317 | read the @file{configure} file in each system-dependent directory |
| 318 | chosen, in order. The @file{configure} files are often generated from |
| 319 | @file{configure.ac} files using Autoconf. |
| 320 | |
| 321 | A system-dependent @file{configure} script will usually add things to |
| 322 | the shell variables @samp{DEFS} and @samp{config_vars}; see the |
| 323 | top-level @file{configure} script for details. The script can check for |
| 324 | @w{@samp{--with-@var{package}}} options that were passed to the |
| 325 | top-level @file{configure}. For an option |
| 326 | @w{@samp{--with-@var{package}=@var{value}}} @file{configure} sets the |
| 327 | shell variable @w{@samp{with_@var{package}}} (with any dashes in |
| 328 | @var{package} converted to underscores) to @var{value}; if the option is |
| 329 | just @w{@samp{--with-@var{package}}} (no argument), then it sets |
| 330 | @w{@samp{with_@var{package}}} to @samp{yes}. |
| 331 | |
| 332 | @item configure.ac |
| 333 | |
| 334 | This file is an Autoconf input fragment to be processed into the file |
| 335 | @file{configure} in this subdirectory. @xref{Introduction,,, |
| 336 | autoconf.info, Autoconf: Generating Automatic Configuration Scripts}, |
| 337 | for a description of Autoconf. You should write either @file{configure} |
| 338 | or @file{configure.ac}, but not both. The first line of |
| 339 | @file{configure.ac} should invoke the @code{m4} macro |
| 340 | @samp{GLIBC_PROVIDES}. This macro does several @code{AC_PROVIDE} calls |
| 341 | for Autoconf macros which are used by the top-level @file{configure} |
| 342 | script; without this, those macros might be invoked again unnecessarily |
| 343 | by Autoconf. |
| 344 | @end table |
| 345 | |
| 346 | That is the general system for how system-dependencies are isolated. |
| 347 | @iftex |
| 348 | The next section explains how to decide what directories in |
| 349 | @file{sysdeps} to use. @ref{Porting to Unix}, has some tips on porting |
| 350 | the library to Unix variants. |
| 351 | @end iftex |
| 352 | |
| 353 | @menu |
| 354 | * Hierarchy Conventions:: The layout of the @file{sysdeps} hierarchy. |
| 355 | * Porting to Unix:: Porting the library to an average |
| 356 | Unix-like system. |
| 357 | @end menu |
| 358 | |
| 359 | @node Hierarchy Conventions |
| 360 | @appendixsubsec Layout of the @file{sysdeps} Directory Hierarchy |
| 361 | |
| 362 | A GNU configuration name has three parts: the CPU type, the |
| 363 | manufacturer's name, and the operating system. @file{configure} uses |
| 364 | these to pick the list of system-dependent directories to look for. If |
| 365 | the @samp{--nfp} option is @emph{not} passed to @file{configure}, the |
| 366 | directory @file{@var{machine}/fpu} is also used. The operating system |
| 367 | often has a @dfn{base operating system}; for example, if the operating |
| 368 | system is @samp{Linux}, the base operating system is @samp{unix/sysv}. |
| 369 | The algorithm used to pick the list of directories is simple: |
| 370 | @file{configure} makes a list of the base operating system, |
| 371 | manufacturer, CPU type, and operating system, in that order. It then |
| 372 | concatenates all these together with slashes in between, to produce a |
| 373 | directory name; for example, the configuration @w{@samp{i686-linux-gnu}} |
| 374 | results in @file{unix/sysv/linux/i386/i686}. @file{configure} then |
| 375 | tries removing each element of the list in turn, so |
| 376 | @file{unix/sysv/linux} and @file{unix/sysv} are also tried, among others. |
| 377 | Since the precise version number of the operating system is often not |
| 378 | important, and it would be very inconvenient, for example, to have |
| 379 | identical @file{irix6.2} and @file{irix6.3} directories, |
| 380 | @file{configure} tries successively less specific operating system names |
| 381 | by removing trailing suffixes starting with a period. |
| 382 | |
| 383 | As an example, here is the complete list of directories that would be |
| 384 | tried for the configuration @w{@samp{i686-linux-gnu}} (with the |
| 385 | @file{crypt} and @file{linuxthreads} add-on): |
| 386 | |
| 387 | @smallexample |
| 388 | sysdeps/i386/elf |
| 389 | crypt/sysdeps/unix |
| 390 | linuxthreads/sysdeps/unix/sysv/linux |
| 391 | linuxthreads/sysdeps/pthread |
| 392 | linuxthreads/sysdeps/unix/sysv |
| 393 | linuxthreads/sysdeps/unix |
| 394 | linuxthreads/sysdeps/i386/i686 |
| 395 | linuxthreads/sysdeps/i386 |
| 396 | linuxthreads/sysdeps/pthread/no-cmpxchg |
| 397 | sysdeps/unix/sysv/linux/i386 |
| 398 | sysdeps/unix/sysv/linux |
| 399 | sysdeps/gnu |
| 400 | sysdeps/unix/common |
| 401 | sysdeps/unix/mman |
| 402 | sysdeps/unix/inet |
| 403 | sysdeps/unix/sysv/i386/i686 |
| 404 | sysdeps/unix/sysv/i386 |
| 405 | sysdeps/unix/sysv |
| 406 | sysdeps/unix/i386 |
| 407 | sysdeps/unix |
| 408 | sysdeps/posix |
| 409 | sysdeps/i386/i686 |
| 410 | sysdeps/i386/i486 |
| 411 | sysdeps/libm-i387/i686 |
| 412 | sysdeps/i386/fpu |
| 413 | sysdeps/libm-i387 |
| 414 | sysdeps/i386 |
| 415 | sysdeps/wordsize-32 |
| 416 | sysdeps/ieee754 |
| 417 | sysdeps/libm-ieee754 |
| 418 | sysdeps/generic |
| 419 | @end smallexample |
| 420 | |
| 421 | Different machine architectures are conventionally subdirectories at the |
| 422 | top level of the @file{sysdeps} directory tree. For example, |
| 423 | @w{@file{sysdeps/sparc}} and @w{@file{sysdeps/m68k}}. These contain |
| 424 | files specific to those machine architectures, but not specific to any |
| 425 | particular operating system. There might be subdirectories for |
| 426 | specializations of those architectures, such as |
| 427 | @w{@file{sysdeps/m68k/68020}}. Code which is specific to the |
| 428 | floating-point coprocessor used with a particular machine should go in |
| 429 | @w{@file{sysdeps/@var{machine}/fpu}}. |
| 430 | |
| 431 | There are a few directories at the top level of the @file{sysdeps} |
| 432 | hierarchy that are not for particular machine architectures. |
| 433 | |
| 434 | @table @file |
| 435 | @item generic |
| 436 | As described above (@pxref{Porting}), this is the subdirectory |
| 437 | that every configuration implicitly uses after all others. |
| 438 | |
| 439 | @item ieee754 |
| 440 | This directory is for code using the IEEE 754 floating-point format, |
| 441 | where the C type @code{float} is IEEE 754 single-precision format, and |
| 442 | @code{double} is IEEE 754 double-precision format. Usually this |
| 443 | directory is referred to in the @file{Implies} file in a machine |
| 444 | architecture-specific directory, such as @file{m68k/Implies}. |
| 445 | |
| 446 | @item libm-ieee754 |
| 447 | This directory contains an implementation of a mathematical library |
| 448 | usable on platforms which use @w{IEEE 754} conformant floating-point |
| 449 | arithmetic. |
| 450 | |
| 451 | @item libm-i387 |
| 452 | This is a special case. Ideally the code should be in |
| 453 | @file{sysdeps/i386/fpu} but for various reasons it is kept aside. |
| 454 | |
| 455 | @item posix |
| 456 | This directory contains implementations of things in the library in |
| 457 | terms of @sc{POSIX.1} functions. This includes some of the @sc{POSIX.1} |
| 458 | functions themselves. Of course, @sc{POSIX.1} cannot be completely |
| 459 | implemented in terms of itself, so a configuration using just |
| 460 | @file{posix} cannot be complete. |
| 461 | |
| 462 | @item unix |
| 463 | This is the directory for Unix-like things. @xref{Porting to Unix}. |
| 464 | @file{unix} implies @file{posix}. There are some special-purpose |
| 465 | subdirectories of @file{unix}: |
| 466 | |
| 467 | @table @file |
| 468 | @item unix/common |
| 469 | This directory is for things common to both BSD and System V release 4. |
| 470 | Both @file{unix/bsd} and @file{unix/sysv/sysv4} imply @file{unix/common}. |
| 471 | |
| 472 | @item unix/inet |
| 473 | This directory is for @code{socket} and related functions on Unix systems. |
| 474 | @file{unix/inet/Subdirs} enables the @file{inet} top-level subdirectory. |
| 475 | @file{unix/common} implies @file{unix/inet}. |
| 476 | @end table |
| 477 | |
| 478 | @item mach |
| 479 | This is the directory for things based on the Mach microkernel from CMU |
| 480 | (including @gnuhurdsystems{}). Other basic operating systems |
| 481 | (VMS, for example) would have their own directories at the top level of |
| 482 | the @file{sysdeps} hierarchy, parallel to @file{unix} and @file{mach}. |
| 483 | @end table |
| 484 | |
| 485 | @node Porting to Unix |
| 486 | @appendixsubsec Porting @theglibc{} to Unix Systems |
| 487 | |
| 488 | Most Unix systems are fundamentally very similar. There are variations |
| 489 | between different machines, and variations in what facilities are |
| 490 | provided by the kernel. But the interface to the operating system |
| 491 | facilities is, for the most part, pretty uniform and simple. |
| 492 | |
| 493 | The code for Unix systems is in the directory @file{unix}, at the top |
| 494 | level of the @file{sysdeps} hierarchy. This directory contains |
| 495 | subdirectories (and subdirectory trees) for various Unix variants. |
| 496 | |
| 497 | The functions which are system calls in most Unix systems are |
| 498 | implemented in assembly code, which is generated automatically from |
| 499 | specifications in files named @file{syscalls.list}. There are several |
| 500 | such files, one in @file{sysdeps/unix} and others in its subdirectories. |
| 501 | Some special system calls are implemented in files that are named with a |
| 502 | suffix of @samp{.S}; for example, @file{_exit.S}. Files ending in |
| 503 | @samp{.S} are run through the C preprocessor before being fed to the |
| 504 | assembler. |
| 505 | |
| 506 | These files all use a set of macros that should be defined in |
| 507 | @file{sysdep.h}. The @file{sysdep.h} file in @file{sysdeps/unix} |
| 508 | partially defines them; a @file{sysdep.h} file in another directory must |
| 509 | finish defining them for the particular machine and operating system |
| 510 | variant. See @file{sysdeps/unix/sysdep.h} and the machine-specific |
| 511 | @file{sysdep.h} implementations to see what these macros are and what |
| 512 | they should do.@refill |
| 513 | |
| 514 | The system-specific makefile for the @file{unix} directory |
| 515 | (@file{sysdeps/unix/Makefile}) gives rules to generate several files |
| 516 | from the Unix system you are building the library on (which is assumed |
| 517 | to be the target system you are building the library @emph{for}). All |
| 518 | the generated files are put in the directory where the object files are |
| 519 | kept; they should not affect the source tree itself. The files |
| 520 | generated are @file{ioctls.h}, @file{errnos.h}, @file{sys/param.h}, and |
| 521 | @file{errlist.c} (for the @file{stdio} section of the library). |
| 522 | |
| 523 | @ignore |
| 524 | @c This section might be a good idea if it is finished, |
| 525 | @c but there's no point including it as it stands. --rms |
| 526 | @c @appendixsec Compatibility with Traditional C |
| 527 | |
| 528 | @c ??? This section is really short now. Want to keep it? --roland |
| 529 | |
| 530 | @c It's not anymore true. glibc 2.1 cannot be used with K&R compilers. |
| 531 | @c --drepper |
| 532 | |
| 533 | Although @theglibc{} implements the @w{ISO C} library facilities, you |
| 534 | @emph{can} use @theglibc{} with traditional, ``pre-ISO'' C |
| 535 | compilers. However, you need to be careful because the content and |
| 536 | organization of the @glibcadj{} header files differs from that of |
| 537 | traditional C implementations. This means you may need to make changes |
| 538 | to your program in order to get it to compile. |
| 539 | @end ignore |