OSDN Git Service

Add another caveat
[pf3gnuchains/gcc-fork.git] / gcc / fixinc / README
index 29ef61b..06fe879 100644 (file)
@@ -2,26 +2,25 @@
 FIXINCLUDES OPERATION
 =====================
 
-See also:  http://autogen.linuxbox.com/fixincludes
+See also:  http://autogen.SourceForge.net/fixincludes
 
 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.linuxbox.com) uses these definitions to
-instantiate several different templates (gcc/fixinc/*.tpl) that then
+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 a script to drive the
-binary fixincl.sh).
+replacement binary program (fixincl.x).
 
 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.
+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.
 
 Regards,
-       Bruce <autogen@linuxbox.com>
+       Bruce <bkorb@gnu.org>
 
 
 
@@ -37,6 +36,9 @@ please, to me:  bkorb@gnu.org.
 
 Here are the rules for making fixes in the inclhack.def file:
 
+0.  If you are not the fixincludes maintainer, please send that
+    person email about any changes you may want to make.  Thanks!
+
 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.  :-)
@@ -67,7 +69,7 @@ Here are the rules for making fixes in the inclhack.def file:
     It is nice if:
 
     3.  The expression is as simple as possible to both
-        process and uderstand by people.  :-)
+        process and understand by people.  :-)
 
         Please take advantage of the fact AutoGen will glue
         together string fragments.  It helps.  Also take note
@@ -106,13 +108,7 @@ Here are the rules for making fixes in the inclhack.def file:
         of stdin in order to avoid pipe stalls.  They may choose to
         discard the input.
 
-    3.  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.
-
-    4.  Replacement text.  If the replacement is empty, then no
+    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
@@ -120,8 +116,95 @@ Here are the rules for making fixes in the inclhack.def file:
 
         Replacement text "fixes" must be first in this file!!
 
-    Examples of fixes:
-    ------------------
+    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 */
@@ -150,45 +233,23 @@ Here are the rules for making fixes in the inclhack.def file:
 
     ------------------
 
-      hackname = dec_intern_asm;
-      files    = c_asm.h;
-      sed = "/^[ \t]*float[ \t]*fasm/i\\\n#ifdef __DECC\n";
-      sed = "/^[ \t]*#[ \t]*pragma[ \t]*intrinsic([ \t]*dasm/a\\\n"
-            "#endif\n";
+        hackname  = hpux11_fabsf;
+        files     = math.h;
+        select    = "^[ \t]*#[ \t]*define[ \t]+fabsf\\(.*";
+        bypass    = "__cplusplus";
 
-    When this ``fix'' is invoked, sed will be run on the original
-    file with two "-e" arguments.  Since these arguments have double
-    quoted string values, the strings actually passed to ``sed''
-    will have been processed in the same fashion that the C compiler
-    processes its string specifications.  Including the concatenation
-    of the two pieces of the second sed "-e" argument.
+        c_fix     = format;
+        c_fix_arg = "#ifndef __cplusplus\n%0\n#endif";
 
-    ------------------
+        test_text =
+        "#  define fabsf(x) ((float)fabs((double)(float)(x)))\n";
 
-      hackname = m88k_multi_incl;
-      shell    =
-        "echo Fixing $file, to protect against multiple inclusion. >&2
-        cpp_wrapper=`echo $file | sed -e 's,\\.,_,g' -e 's,/,_,g'`
-        echo \"#ifndef __GCC_GOT_${cpp_wrapper}_\"
-        echo \"#define __GCC_GOT_${cpp_wrapper}_\"
-        cat
-        echo \"#endif /* ! __GCC_GOT_${cpp_wrapper}_ */\"";
-
-    This is a shell script fix.  Note the ``cat'' without any arguments.
-    This will drain stdin.  If the contents of the file were to be
-    discarded, you would have to have something like ``cat > /dev/null''
-    in the script.
+    This fix will ensure that the #define for fabs is wrapped
+    with C++ protection, providing the header is not already
+    C++ aware.
 
     ------------------
 
-      hackname = no_double_slash;
-      c_fix    = "no_double_slash";
-
-    This specifies a fix to be supplied via a hand coded internal
-    function named ``no_double_slash_fix()''.  See ``fixfixes.c''
-    for documentation on how to include new functions into that
-    module.
-
 5.  Testing fixes.
 
     The brute force method is, of course, to configure and build