| 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 |