From mboxrd@z Thu Jan 1 00:00:00 1970 From: "John David Anglin" To: gcc@gcc.gnu.org Cc: jgarzik@mandrakesoft.com Subject: Re: gcc 3.2's cpp breaks configure scripts Date: Sun, 11 Aug 2002 10:27:00 -0000 Message-id: <200208111727.g7BHR6Ml023343@hiauly1.hia.nrc.ca> X-SW-Source: 2002-08/msg00632.html Jeff, > cpp is spitting out a warning about changing the search order of include > directories, and this is breaking a _ton_ of configure scripts. I found > this when I started rebuilding Mandrake with gcc-3.2 branch. You might try the patch below and see if it fixes your problem. It is a variant for gcc-3.2 branch of the patch proposed in this message for the main: < http://gcc.gnu.org/ml/gcc-patches/2002-08/msg00708.html >. Dave -- J. David Anglin dave.anglin@nrc.ca National Research Council of Canada (613) 990-0752 (FAX: 952-6605) Index: cppinit.c =================================================================== RCS file: /cvsroot/gcc/gcc/gcc/cppinit.c,v retrieving revision 1.202.2.5 diff -u -3 -p -r1.202.2.5 cppinit.c --- cppinit.c 24 May 2002 09:26:48 -0000 1.202.2.5 +++ cppinit.c 10 Aug 2002 04:27:07 -0000 @@ -103,9 +103,13 @@ static void mark_named_operators PARAMS static void append_include_chain PARAMS ((cpp_reader *, char *, int, int)); static struct search_path * remove_dup_dir PARAMS ((cpp_reader *, + struct search_path *, + struct search_path **)); +static struct search_path * remove_dup_nonsys_dirs PARAMS ((cpp_reader *, + struct search_path **, struct search_path *)); static struct search_path * remove_dup_dirs PARAMS ((cpp_reader *, - struct search_path *)); + struct search_path **)); static void merge_include_chains PARAMS ((cpp_reader *)); static bool push_include PARAMS ((cpp_reader *, struct pending_option *)); @@ -272,55 +276,86 @@ append_include_chain (pfile, dir, path, } /* Handle a duplicated include path. PREV is the link in the chain - before the duplicate. The duplicate is removed from the chain and - freed. Returns PREV. */ + before the duplicate, or NULL if the duplicate is at the head of + the chain. The duplicate is removed from the chain and freed. + Returns PREV. */ static struct search_path * -remove_dup_dir (pfile, prev) +remove_dup_dir (pfile, prev, head_ptr) cpp_reader *pfile; struct search_path *prev; + struct search_path **head_ptr; { - struct search_path *cur = prev->next; + struct search_path *cur; + + if (prev != NULL) + { + cur = prev->next; + prev->next = cur->next; + } + else + { + cur = *head_ptr; + *head_ptr = cur->next; + } if (CPP_OPTION (pfile, verbose)) fprintf (stderr, _("ignoring duplicate directory \"%s\"\n"), cur->name); - prev->next = cur->next; free ((PTR) cur->name); free (cur); return prev; } +/* Remove duplicate non-system directories for which there is an equivalent + system directory latter in the chain. The range for removal is between + *HEAD_PTR and END. Returns the directory before END, or NULL if none. + This algorithm is quadratic in the number of -I switches, which is + acceptable since there aren't usually that many of them. */ +static struct search_path * +remove_dup_nonsys_dirs (pfile, head_ptr, end) + cpp_reader *pfile; + struct search_path **head_ptr; + struct search_path *end; +{ + struct search_path *prev = NULL, *cur, *other; + + for (cur = *head_ptr; cur != end; cur = cur ? cur->next : *head_ptr) + { + if (!cur->sysp) + { + for (other = cur->next; other; other = other->next) + if (INO_T_EQ (cur->ino, other->ino) + && cur->dev == other->dev + && other->sysp) + { + cur = remove_dup_dir (pfile, prev, head_ptr); + break; + } + } + prev = cur; + } + + return prev; +} + /* Remove duplicate directories from a chain. Returns the tail of the chain, or NULL if the chain is empty. This algorithm is quadratic in the number of -I switches, which is acceptable since there aren't usually that many of them. */ static struct search_path * -remove_dup_dirs (pfile, head) +remove_dup_dirs (pfile, head_ptr) cpp_reader *pfile; - struct search_path *head; + struct search_path **head_ptr; { struct search_path *prev = NULL, *cur, *other; - for (cur = head; cur; cur = cur->next) + for (cur = *head_ptr; cur; cur = cur->next) { - for (other = head; other != cur; other = other->next) - if (INO_T_EQ (cur->ino, other->ino) && cur->dev == other->dev) + for (other = *head_ptr; other != cur; other = other->next) + if (INO_T_EQ (cur->ino, other->ino) && cur->dev == other->dev) { - if (cur->sysp && !other->sysp) - { - cpp_warning (pfile, - "changing search order for system directory \"%s\"", - cur->name); - if (strcmp (cur->name, other->name)) - cpp_warning (pfile, - " as it is the same as non-system directory \"%s\"", - other->name); - else - cpp_warning (pfile, - " as it has already been specified as a non-system directory"); - } - cur = remove_dup_dir (pfile, prev); + cur = remove_dup_dir (pfile, prev, head_ptr); break; } prev = cur; @@ -358,28 +393,33 @@ merge_include_chains (pfile) else brack = systm; - /* This is a bit tricky. First we drop dupes from the quote-include - list. Then we drop dupes from the bracket-include list. - Finally, if qtail and brack are the same directory, we cut out - brack and move brack up to point to qtail. + /* This is a bit tricky. First we drop non-system dupes of system + directories from the merged bracket-include list. Next we drop + dupes from the bracket and quote include lists. Then we drop + non-system dupes from the merged quote-include list. Finally, + if qtail and brack are the same directory, we cut out brack and + move brack up to point to qtail. We can't just merge the lists and then uniquify them because then we may lose directories from the <> search path that should - be there; consider -Ifoo -Ibar -I- -Ifoo -Iquux. It is however + be there; consider -Ifoo -Ibar -I- -Ifoo -Iquux. It is however safe to treat -Ibar -Ifoo -I- -Ifoo -Iquux as if written -Ibar -I- -Ifoo -Iquux. */ - remove_dup_dirs (pfile, brack); - qtail = remove_dup_dirs (pfile, quote); + remove_dup_nonsys_dirs (pfile, &brack, NULL); + remove_dup_dirs (pfile, &brack); if (quote) { + qtail = remove_dup_dirs (pfile, "e); qtail->next = brack; + qtail = remove_dup_nonsys_dirs (pfile, "e, brack); + /* If brack == qtail, remove brack as it's simpler. */ - if (brack && INO_T_EQ (qtail->ino, brack->ino) + if (qtail && brack && INO_T_EQ (qtail->ino, brack->ino) && qtail->dev == brack->dev) - brack = remove_dup_dir (pfile, qtail); + brack = remove_dup_dir (pfile, qtail, "e); } else quote = brack; Index: doc/install.texi =================================================================== RCS file: /cvsroot/gcc/gcc/gcc/doc/install.texi,v retrieving revision 1.92.2.29 diff -u -3 -p -r1.92.2.29 install.texi --- doc/install.texi 27 Jun 2002 19:11:31 -0000 1.92.2.29 +++ doc/install.texi 10 Aug 2002 04:27:09 -0000 @@ -464,6 +464,43 @@ any in that directory---are not part of programs---perhaps many others. (GCC installs its own header files in another directory which is based on the @option{--prefix} value.) +Both the local-prefix include directory and the GCC-prefix include +directory are part of GCC's "system include" directories. Although these +two directories are not fixed, they need to be searched in the proper +order for the correct processing of the include_next directive. The +local-prefix include directory is searched before the GCC-prefix +include directory. Another characteristic of system include directories +is that pedantic warnings are turned off for headers in these directories. + +Some autoconf macros add @option{-I @var{directory}} options to the +compiler command line, to ensure that directories containing installed +packages' headers are searched. When @var{directory} is one of GCC's +system include directories, GCC will ignore the option so that system +directories are continued to be processed in the correct order. This +may result in a search order different from what was specified but the +directory will still be searched. + +GCC automatically searches for ordinary libraries using +@env{GCC_EXEC_PREFIX}. Thus, when the same installation prefix is +used for both GCC and packages, GCC will automatically search for +both headers and libraries. This provides a configuration that is +easy to use. GCC behaves in a manner similar to that when it is +installed as a system compiler in @file{/usr}. + +Sites that need to install multiple versions of GCC may not want to +use the above simple configuration. It is possible to use the +@option{--program-prefix}, @option{--program-suffix} and +@option{--program-transform-name} options to install multiple versions +into a single directory, but it may be simpler to use different prefixes +and the @option{--with-local-prefix} option to specify the location of the +site-specific files for each version. It will then be necessary for +users to specify explicitly the location of local site libraries +(e.g., with @env{LIBRARY_PATH}). + +The same value can be used for both @option{--with-local-prefix} and +@option{--prefix} provided it is not @file{/usr}. This can be used +to avoid the default search of @file{/usr/local/include}. + @strong{Do not} specify @file{/usr} as the @option{--with-local-prefix}! The directory you use for @option{--with-local-prefix} @strong{must not} contain any of the system's standard header files. If it did contain