OSDN Git Service

Add another caveat
[pf3gnuchains/gcc-fork.git] / gcc / fixinc / README
index bd5a801..06fe879 100644 (file)
 
-The fast-fixincludes system now, to the best of our collective belief,
-correctly implements exactly the same functionality as the previous
-fixincludes and fixinc.* shell scripts.  On systems where many fixes
-are required, this is accomplished by putting most of the
-functionality into a binary executable.  On systems that had dedicated
-fixinc.* shell scripts, those scripts are still used by default until
-they can be converted.
+FIXINCLUDES OPERATION
+=====================
 
-POSSIBLE PROBLEMS
+See also:  http://autogen.SourceForge.net/fixincludes
 
-There may be some systems on which the fixinc binary program appears
-to be functional, but fails to work.  Current thinking is that this
-is due to some new process limitations (fork() calls) on those
-systems.  If you are experiencing this problem, then copy the script
-${src}/gcc/fixinc/inclhack.sh into ${builddir}/gcc/fixinc.sh and run
-make again.
+The set of fixes required was distilled down to just the data required
+to specify what needed to happen for each fix.  Those data were edited
+into a file named gcc/fixinc/inclhack.def.  A program called
+AutoGen (http://autogen.SourceForge.net, ver 4.x) uses these definitions
+to instantiate several different templates (gcc/fixinc/*.tpl) that then
+produces a fixincludes replacement shell script (inclhack.sh), a
+replacement binary program (fixincl.x).
 
-And, *please* also report the problem with a description of
-the failure mode (symptoms) and the output from:
+If there is no special purpose script, then mkfixinc.sh will try to
+compile, link and execute the fixincl program.  Otherwise, it will
+install and use the current fixinc.* for that system instead.
+Also, on certain platforms (viz. those that do not have functional
+bidirectional pipes), the fixincl program is split into two.
+This should only concern you on DOS and BeOS.
 
-        egcs/config.guess
+Regards,
+       Bruce <bkorb@gnu.org>
 
-to me:  Bruce Korb <fixincludes@autogen.freeservers.com>
 
-TO DO
 
-* fixincl needs to be converted to use gcc's system.h, libiberty, and
-  other portability frameworks.
+GCC MAINTAINER INFORMATION
+==========================
 
+If you are having some problem with a system header that is either
+broken by the manufacturer, or is broken by the fixinclude process,
+then you will need to alter or add information to the include fix
+definitions file, ``inclhack.def''.  Please also send relevant
+information to gcc-bugs@gcc.gnu.org, gcc-patches@gcc.gnu.org and,
+please, to me:  bkorb@gnu.org.
 
-THEORY OF OPERATION
+Here are the rules for making fixes in the inclhack.def file:
 
-See also:  http://autogen.freeservers.com
+0.  If you are not the fixincludes maintainer, please send that
+    person email about any changes you may want to make.  Thanks!
 
-The set of fixes required was distilled down to just the data required
-to specify what needed to happen for each fix.  Those data were edited
-into a new file named gcc/fixinc/inclhack.def.  A program called
-AutoGen (http://autogen.freeservers.com) uses these definitions to
-instantiate several different templates (gcc/fixinc/*.tpl) that then
-produces a fixincludes replacement shell script (inclhack.sh), a
-replacement binary program (fixincl.x) and a script to drive the
-binary fixincl.sh).
+1.  Every fix must have a "hackname" that is compatible with C syntax
+    for variable names and is unique without regard to alphabetic case.
+    Please keep them alphabetical by this name.  :-)
 
-If there is no special purpose script, then mkfixinc.sh will try to
-compile, link and test execute the binary version.  If it cannot be
-successfully built, the shell version will be used instead.  If
-mkfixinc.sh determines that your system needs machine-specific fixes
-that have not yet been applied to inclhack.def, it will install and
-use the current fixinc.* for that system instead.
+2.  If the problem is known to exist only in certain files,
+    then name each such file with a "files = " entry.
 
-Usually, the mkfixinc.sh script will be able to detect when
-the binary is not runable.  If you do have problems, however,
-please see "POSSIBLE PROBLEMS" above.  Thank you.
+3.  It is relatively expensive to fire off a process to fix a source
+    file, therefore write apply tests to avoid unnecessary fix
+    processes.  The preferred apply tests are "select", "bypass" and
+    "c_test" because they are performed internally.  "test" sends
+    a command to a server shell that actually fires off one or more
+    processes to do the testing.  Avoid it, if you can, but it is
+    still more efficient than a fix process.  Also available is
+    "mach".  If the target machine matches any of the named
+    globbing-style patterns, then the machine name test will pass.
+    It is desired, however, to limit the use of this test.
 
-Regards,
-       Bruce <fixincludes@autogen.freeservers.com>
-       Robert <RobertLipe@usa.net>
-       Manfred <manfred@s-direktnet.de>
+    These tests are required to:
+
+    1.  Be positive for all header files that require the fix.
+
+    It is desireable to:
+
+    2.  Be negative as often as possible whenever the fix is not
+        required, avoiding the process overhead.
+
+    It is nice if:
+
+    3.  The expression is as simple as possible to both
+        process and understand by people.  :-)
+
+        Please take advantage of the fact AutoGen will glue
+        together string fragments.  It helps.  Also take note
+        that double quote strings and single quote strings have
+        different formation rules.  Double quote strings are a
+        tiny superset of ANSI-C string syntax.  Single quote
+        strings follow shell single quote string formation
+        rules, except that the backslash is processed before
+        '\\', '\'' and '#' characters (using C character syntax).
+
+    Examples of test specifications:
+
+      hackname = broken_assert_stdio;
+      files    = assert.h;
+      select   = stderr;
+      bypass   = "include.*stdio.h";
+
+    The ``broken_assert_stdio'' fix will be applied only to a file
+    named "assert.h" if it contains the string "stderr" _and_ it
+    does _not_ contain the expression "include.*stdio.h".
+
+      hackname = no_double_slash;
+      c_test   = "double_slash";
+
+    The ``no_double_slash'' fix will be applied if the
+    ``double_slash_test()'' function says to.  See ``fixtests.c''
+    for documentation on how to include new functions into that
+    module.
+
+4.  There are currently four methods of fixing a file:
+
+    1.  a series of sed expressions.  Each will be an individual
+        "-e" argument to a single invocation of sed.
+
+    2.  a shell script.  These scripts are _required_ to read all
+        of stdin in order to avoid pipe stalls.  They may choose to
+        discard the input.
+
+    3.  Replacement text.  If the replacement is empty, then no
+        fix is applied.  Otherwise, the replacement text is
+        written to the output file and no further fixes are
+        applied.  If you really want a no-op file, replace the
+        file with a comment.
+
+        Replacement text "fixes" must be first in this file!!
+
+    4.  A C language subroutine method for both tests and fixes.
+        See ``fixtests.c'' for instructions on writing C-language
+        applicability tests and ``fixfixes.c'' for C-language fixing.
+        These files also contain tables that describe the currently
+        implemented fixes and tests.
+
+    If at all possible, you should try to use one of the C language
+    fixes as it is far more efficient.  There are currently five
+    such fixes, three of which are very special purpose:
+
+    i) char_macro_def - This function repairs the definition of an
+        ioctl macro that presumes CPP macro substitution within
+        pairs of single quote characters.
+
+    ii) char_macro_use - This function repairs the usage of ioctl
+        macros that no longer can wrap an argument with single quotes.
+
+    iii) machine_name - This function will look at "#if", "#ifdef",
+        "#ifndef" and "#elif" directive lines and replace the first
+        occurrence of a non-reserved name that is traditionally
+        pre-defined by the native compiler.
+
+    The next two are for general use:
+
+    iv) wrap - wraps the entire file with "#ifndef", "#define" and
+        "#endif" self-exclusionary text.  It also, optionally, inserts
+        a prolog after the "#define" and an epilog just before the
+        "#endif".  You can use this for a fix as follows:
+
+            c_fix     = wrap;
+            c_fix_arg = "/* prolog text */";
+            c_fix_arg = "/* epilog text */";
+
+        If you want an epilog without a prolog, set the first "c_fix_arg"
+        to the empty string.  Both or the second "c_fix_arg"s may be
+        omitted and the file will still be wrapped.
+
+       THERE IS A SPECIAL EXCEPTION TO THIS, HOWEVER:
+
+       If the regular expression '#if.*__need' is found, then it is
+       assumed that the file needs to be read and interpreted more
+       than once.  However, the prolog and epilog text (if any) will
+       be inserted.
+
+    v) format - Replaces text selected with a regular expression with
+        a specialized formating string.  The formatting works as follows:
+        The format text is copied to the output until a '%' character
+        is found.  If the character after the '%' is another '%', then
+        one '%' is output and processing continues.  If the following
+        character is not a digit, then the '%' and that character are
+        copied and processing continues.  Finally, if the '%' *is*
+        followed by a digit, that digit is used as an index into the
+        regmatch_t array to replace the two characters with the matched
+        text.  i.e.: "%0" is replaced by the full matching text, "%1"
+        is the first matching sub-expression, etc.
+
+        This is used as follows:
+
+            c_fix     = format;
+            c_fix_arg = "#ifndef %1\n%0\n#endif";
+            c_fix_arg = "#define[ \t]+([A-Z][A-Z0-9a-z_]*).*";
+
+        This would wrap a traditional #define inside of a "#ifndef"/"#endif"
+        pair.  The second "c_fix_arg" may be omitted *IF* there is
+        a select clause and the first one matches the text you want
+        replaced.  You may delete text by supplying an empty string for
+        the format (the first "c_fix_arg").
+
+       Note: In general, a format c_fix may be used in place of one
+       sed expression.  However, it will need to be rewritten by
+       hand.  For example:
+
+       sed = 's@^#if __GNUC__ == 2 && __GNUC_MINOR__ >= 7$'
+              '@& || __GNUC__ >= 3@';
+
+       may be rewritten using a format c_fix as:
+
+       c_fix     = format;
+       c_fix_arg = '%0 || __GNUC__ >= 3';
+       c_fix_arg = '^#if __GNUC__ == 2 && __GNUC_MINOR__ >= 7$';
+
+       Multiple sed substitution expressions probably ought to remain sed
+       expressions in order to maintain clarity.  Also note that if the
+       second sed expression is the same as the first select expression,
+       then you may omit the second c_fix_arg.  The select expression will
+       be picked up and used in its absence.
+
+EXAMPLES OF FIXES:
+==================
+
+      hackname = AAA_ki_iface;
+      replace; /* empty replacement -> no fixing the file */
+
+    When this ``fix'' is invoked, it will prevent any fixes
+    from being applied.
+
+    ------------------
+
+      hackname = AAB_svr4_no_varargs;
+      replace  = "/* This file was generated by fixincludes.  */\n"
+                 "#ifndef _SYS_VARARGS_H\n"
+                 "#define _SYS_VARARGS_H\n\n"
+
+                 "#ifdef __STDC__\n"
+                 "#include <stdarg.h>\n"
+                 "#else\n"
+                 "#include <varargs.h>\n"
+                 "#endif\n\n"
+
+                 "#endif  /* _SYS_VARARGS_H */\n";
+
+    When this ``fix'' is invoked, the replacement text will be
+    emitted into the replacement include file.  No further fixes
+    will be applied.
+
+    ------------------
+
+        hackname  = hpux11_fabsf;
+        files     = math.h;
+        select    = "^[ \t]*#[ \t]*define[ \t]+fabsf\\(.*";
+        bypass    = "__cplusplus";
+
+        c_fix     = format;
+        c_fix_arg = "#ifndef __cplusplus\n%0\n#endif";
+
+        test_text =
+        "#  define fabsf(x) ((float)fabs((double)(float)(x)))\n";
+
+    This fix will ensure that the #define for fabs is wrapped
+    with C++ protection, providing the header is not already
+    C++ aware.
+
+    ------------------
+
+5.  Testing fixes.
+
+    The brute force method is, of course, to configure and build
+    GCC.  But you can also:
+
+        cd ${top_builddir}/gcc
+        rm -rf fixinc.sh include/ stmp-fixinc
+        make stmp-fixinc
+
+    I would really recommend, however:
+
+        cd ${top_builddir}/gcc/fixinc
+        make check
+
+    To do this, you *must* have autogen installed on your system.
+    The "check" step will proceed to construct a shell script that
+    will exercize all the fixes, using the sample test_text
+    provided with each fix.  Once done, the changes made will
+    be compared against the changes saved in the source directory.
+    If you are changing the tests or fixes, the change will likely
+    be highlighted.